Emacs 如果选择区域,如何将C-k绑定到kill区域;else压井管线

Emacs 如果选择区域,如何将C-k绑定到kill区域;else压井管线,emacs,Emacs,在emacs中,如果选择了区域,我想将C-k绑定到kill区域;否则,按正常方式关闭管线。 如何配置它?将其放在.emacs中 (defun kill-line-or-region () "kill region if active only or kill line normally" (interactive) (if (region-active-p) (call-interactively 'kill-region) (call-interactively

在emacs中,如果选择了区域,我想将C-k绑定到kill区域;否则,按正常方式关闭管线。
如何配置它?

将其放在.emacs中

(defun kill-line-or-region () 
 "kill region if active only or kill line normally"
  (interactive)
  (if (region-active-p)
      (call-interactively 'kill-region)
    (call-interactively 'kill-line)))

  (global-set-key (kbd "C-k") 'kill-line-or-region)

这听起来像是一份寻求建议的工作

(defadvice kill-line (around kill-region-if-active activate)
  (if (and (called-interactively-p) (region-active-p))
      (kill-region (region-beginning) (region-end))
    ad-do-it))

编辑:添加了
called-interactively-p
check.

这不是一个直接的答案,而是一些提示


您可以使用
(删除选择模式1)
启用。然后,如果标记了某个区域,当您开始键入某些文本时,该区域将被删除。但是在您的情况下,您可以简单地使用C-w来切割当前区域,这将把该区域添加到压井环中,但是
压井线
也会这样做。

Woooo!别动<代码>终止行是许多包在内部使用的函数,这将以非常微妙的方式改变它们的行为。我会把我的钱投在@kindahero解决方案上,因为它会做你要求的事情,而不会产生令人讨厌的副作用。好吧,那么,如果我像上面添加的那样添加一个互动性检查,怎么样?它会好得多,因为它降低了副作用的风险。然而,我认为,
defadvice
不是这项工作的合适工具。多年来,我经常使用它,但我只在绝对必要的时候才尝试使用它。@Lindydancer,当我读到你的第二条评论时,1)假设emacs提供的所有钩子都是为了某种方式来避免通知函数,这对吗?2) 建议对调试有影响吗?@kindahero,钩子是自然放置的,用户或其他包可以以受控方式插入额外代码。你可以说同样的事情也可以通过使用
defadvice
来完成,但我认为这会导致一种疯狂的西部局势。调试并没有真正受到影响,您可以单步执行原始函数和建议的代码,但是您必须手动插入这两个函数以进行调试。如果您首先打开一个文件并且从未设置标记,则这不起作用。好的,解决方案是不使用
(交互式“r”)
,而只使用
(交互式)
。我会编辑你的答案。