Answers:
您可以使用kill-whole-line
杀死整个线路上的点。点的位置无关紧要。C-S-DEL默认情况下绑定此命令。
您还可以通过将变量设置为非值来指示kill-line
(绑定到C-k)杀死整行: kill-whole-line
nil
(setq kill-whole-line t)
请注意,此点必须在行的开头才能生效。
然后有两个宝石(通过emacs-fu):
(defadvice kill-region (before slick-cut activate compile)
"When called interactively with no active region, kill a single line instead."
(interactive
(if mark-active
(list (region-beginning) (region-end))
(list (line-beginning-position) (line-beginning-position 2)))))
(defadvice kill-ring-save (before slick-copy activate compile)
"When called interactively with no active region, copy a single line instead."
(interactive
(if mark-active
(list (region-beginning) (region-end))
(message "Copied line")
(list (line-beginning-position) (line-beginning-position 2)))))
通过这些操作,您可以通过一次击键杀死或复制线点:
注意,如果有一个活动区,kill-region
并kill-ring-save
会继续做他们通常做的:杀死或复制。
slick-cut
和slick-copy
新的建议系统Emacs 24.4引入了新的建议系统。尽管defadvice
仍然可以使用,但有可能在Emacs的未来版本中不赞成使用该新系统。要为做准备,你可能想使用的更新版本slick-cut
和slick-copy
:
(defun slick-cut (beg end)
(interactive
(if mark-active
(list (region-beginning) (region-end))
(list (line-beginning-position) (line-beginning-position 2)))))
(advice-add 'kill-region :before #'slick-cut)
(defun slick-copy (beg end)
(interactive
(if mark-active
(list (region-beginning) (region-end))
(message "Copied line")
(list (line-beginning-position) (line-beginning-position 2)))))
(advice-add 'kill-ring-save :before #'slick-copy)
kill-region
并kill-ring-save
仍然工作,即使该地区不是“积极的”。这将覆盖该行为。我会不时使用这种行为,但是如果您不习惯以这种方式使用它们,那么您可能不会注意到其中的区别。
kill-region
时等是可用的/有用mark-active
的nil
。
C-SPC
两次以激活然后取消激活该标记。将光标移动到文件中的其他位置并运行kill-region
,即使标记未处于活动状态,它也会杀死点和标记之间的区域。设置(但不激活)标记的命令的一些示例是yank
和isearch
。执行完这些排序命令后,即使该标记未处于活动状态,我也知道该标记在哪里,并且许多命令(包括kill-region
)将允许我使用该标记而无需显式激活它。
我为自己找到的解决方案是使用前缀参数。
对我来说,杀死半条线是一个有用的功能,但是我也希望有一种更简单的方法来杀死整条线。因此,我做到了这一点,以至于kill-line
在给定前缀参数时,
它会杀死所有可见的东西。
(defmacro bol-with-prefix (function)
"Define a new function which calls FUNCTION.
Except it moves to beginning of line before calling FUNCTION when
called with a prefix argument. The FUNCTION still receives the
prefix argument."
(let ((name (intern (format "endless/%s-BOL" function))))
`(progn
(defun ,name (p)
,(format
"Call `%s', but move to BOL when called with a prefix argument."
function)
(interactive "P")
(when p
(forward-line 0))
(call-interactively ',function))
',name)))
(global-set-key [remap paredit-kill] (bol-with-prefix paredit-kill))
(global-set-key [remap org-kill-line] (bol-with-prefix org-kill-line))
(global-set-key [remap kill-line] (bol-with-prefix kill-line))
(global-set-key "\C-k" (bol-with-prefix kill-line))
有了这个小宏,它C-k
仍然是致命的,但是
C-3 C-k
吞下了整整三行。作为奖励,我们
kill-whole-line
通过做得到行为C-1 C-k
。
kill-ring-save
不接受前缀参数...
kill-visual-line
必定会与C-k
。我会解决的。再次感谢。
有一个名为的软件包whole-line-or-region
,它建议各种内置命令,以便在没有活动区域的情况下它们可作用于当前行,因此M-w
将复制当前行C-w
并将其杀死。我已经使用了多年了,发现它是必不可少的。
此外,此软件包可以使数字前缀指示要作用的行数,因此M-2 M-w
可以复制两行。这里的其他答案不提供该方便的功能。
当作者停止维护它并变得无响应时,我用我的github帐户接管了该程序包的维护。
whole-line-or-region
还提供了将这种行为添加到其他命令的功能,如果需要的话。
除了@itsjeyd答案,我可以建议这两个功能吗?
(defun xah-copy-line-or-region ()
"Copy current line, or text selection.
When `universal-argument' is called first, copy whole buffer (but respect `narrow-to-region')."
(interactive)
(let (p1 p2)
(if (null current-prefix-arg)
(progn (if (use-region-p)
(progn (setq p1 (region-beginning))
(setq p2 (region-end)))
(progn (setq p1 (line-beginning-position))
(setq p2 (line-end-position)))))
(progn (setq p1 (point-min))
(setq p2 (point-max))))
(kill-ring-save p1 p2)))
(defun xah-cut-line-or-region ()
"Cut current line, or text selection.
When `universal-argument' is called first, cut whole buffer (but respect `narrow-to-region')."
(interactive)
(let (p1 p2)
(if (null current-prefix-arg)
(progn (if (use-region-p)
(progn (setq p1 (region-beginning))
(setq p2 (region-end)))
(progn (setq p1 (line-beginning-position))
(setq p2 (line-beginning-position 2)))))
(progn (setq p1 (point-min))
(setq p2 (point-max))))
(kill-region p1 p2)))
然后,输入关键定义(您可能需要调整它们):
(global-set-key (kbd "<f2>") 'xah-cut-line-or-region) ; cut
(global-set-key (kbd "<f3>") 'xah-copy-line-or-region) ; copy
(global-set-key (kbd "<f4>") 'yank) ; paste
作为上述@itsjeyd答案的扩展,我有以下内容。(逻辑可能会稍作清理,当我移植到新的建议系统时,我会把它扩展到sexp
/,paragraph
如果再次重复的话)。
初始C-w
/ M-w
将抓住只在点的字,而称其为第二次将抓住整行。
;; *** Copy word/line without selecting
(defadvice kill-ring-save (before slick-copy-line activate compile)
"When called interactively with no region, copy the word or line
Calling it once without a region will copy the current word.
Calling it a second time will copy the current line."
(interactive
(if mark-active (list (region-beginning) (region-end))
(if (eq last-command 'kill-ring-save)
(progn
;; Uncomment to only keep the line in the kill ring
;; (kill-new "" t)
(message "Copied line")
(list (line-beginning-position)
(line-beginning-position 2)))
(save-excursion
(forward-char)
(backward-word)
(mark-word)
(message "Copied word")
(list (mark) (point)))))))
;; *** Kill word/line without selecting
(defadvice kill-region (before slick-cut-line first activate compile)
"When called interactively kill the current word or line.
Calling it once without a region will kill the current word.
Calling it a second time will kill the current line."
(interactive
(if mark-active (list (region-beginning) (region-end))
(if (eq last-command 'kill-region)
(progn
;; Return the previous kill to rebuild the line
(yank)
;; Add a blank kill, otherwise the word gets appended.
;; Change to (kill-new "" t) to remove the word and only
;; keep the whole line.
(kill-new "")
(message "Killed Line")
(list (line-beginning-position)
(line-beginning-position 2)))
(save-excursion
(forward-char)
(backward-word)
(mark-word)
(message "Killed Word")
(list (mark) (point)))))))
由于您希望用最少的按键来完成此操作,因此可以使用David Andersson出色的按键和弦包。“和弦”是同时按下两个键,或者一次按下两次。
您可以将任何和弦绑定到这些功能。
(require 'key-chord)
(key-chord-mode 1)
(key-chord-define-global "dd" 'kill-whole-line)
(key-chord-define-global "cc" 'yank-whole-line)
一种不太特别的方法是定义mark-whole-line
,Emacs确实应该为其提供默认命令。
(defun mark-whole-line ()
"Combinition of C-a, mark, C-e"
(interactive)
(move-beginning-of-line nil)
(set-mark-command nil)
(move-end-of-line nil)
)
(global-set-key (kbd "C-2") 'mark-whole-line) ; 2 is near w
然后C-2 C-w
将完成工作。
它还使事情变得更容易,例如注释当前的整行。
这是其最高答案的修改,它是目前投票率最高的答案,也是我多年来使用的答案。但是,它存在一些问题:建议的版本kill-ring-save
有时会因为未设置标记而失败(通常在新缓冲区中),即使该标记确实起作用,使用该函数复制一行后光标也会发生奇怪的舞动。经过一番挖掘后,我想到发生这种情况是因为在完成工作后kill-ring-save
调用indicate-copied-region
,但由于点和标记与复制的区域不匹配,因此indicate-copied-region
标记了错误的区域。
说够了。这是解决此问题的解决方案:
(define-advice kill-ring-save
(:before-while (beg end &optional region) slick)
(or mark-active
(not (called-interactively-p 'interactive))
(prog1 nil
(copy-region-as-kill
(line-beginning-position) (line-beginning-position 2))
(message "Copied current line"))))
耶德的建议并没有错kill-region
。无论如何,这是它的一种变体,在样式上与上面的描述更加一致:
(define-advice kill-region
(:around (kill-region beg end &optional region) slick)
(if (or mark-active (not region))
(funcall kill-region beg end region)
(funcall kill-region
(line-beginning-position) (line-beginning-position 2))
(message "Killed current line")))
请注意,如果transient-mark-mode
未打开,则这些建议不会执行任何操作。
whole-line-or-region
。请参阅@sanityinc的答案。
我使用了一个名为composable.el的软件包。关于该软件包的整洁之处在于它修改了Mw和Cw(复制并杀死命令),使其更像Vim,不同之处在于它接受了传统的emacs命令。因此C-w l
杀死了整条线。但是您也可以执行一些操作,例如C-w M->
终止文件结尾。标记区域时,这两个命令都像正常一样。
kill-whole-line
。:)