如何在Emacs中删除(或杀死)当前单词?

16
例如,我的光标(指针)位于单词“cursor”中的任意一个字母上。 我想删除(kill)该单词,并将其复制到kill-ring中。

我不确定这是否适合在StackOverflow上发布。你可能会在Unix或Programmers上获得更好的答案。 - Tripp Kinetics
2
你在"光标"的哪里看到了任何"x"? - choroba
2
@TrippKinetics:甚至可以使用http://emacs.stackexchange.com/。 - choroba
@choroba 啊,我不知道那个。谢谢。 - Tripp Kinetics
是的,“x”字母可以代表任何字母。 - Jianglong Chen
3个回答

25

使用Emacs删除单词的方法是先按下M-backspace,再按下M-d。这将删除光标所在位置的单词并将其保存到kill ring中(作为一个单元)。

如果光标在单词的开头或结尾之后,只需要按其中一个键组合即可。Emacs用户通常会使用像forward-word(M-f)和backward-word(M-b)这样的命令在单词之间移动,因此他们最初就处于单词边界,因此很少需要从内部删除单词。


这可能会删除前一个单词和当前单词(尽管人们可以合理地期望用户避免这样做,只要他们分别调用命令)。 - phils
1
@phils 很好的观点,我现在已经更新了答案并明确说明了。另外,这个答案的重点是解释一个有经验的Emacs用户如何去做,与其他直接提供代码的答案不同。我想到一个初学者可能不知道M-d,或者将单词分成两个操作仍然会导致未拆分的单词出现在kill ring中。 - user4815162342
对于像我这样不知道M代表什么的人,“M代表元键,你可以通过按Esc键在大多数键盘上模拟它”。来源在这里 - jumping_monkey
1
@jumping_monkey 如果您在GUI窗口中使用emacs,也可以使用Alt键。 - user4815162342
@user4815162342,我不知道,谢谢! - jumping_monkey
1
@Paul 在Emacs中并非如此。在像bash这样的流行shell中,C-w是运行backward-kill-word命令,但M-w始终是kill-ring-save命令。 - undefined

10

您可以将此作为在指定位置消灭各种物体的框架:

(defun my-kill-thing-at-point (thing)
  "Kill the `thing-at-point' for the specified kind of THING."
  (let ((bounds (bounds-of-thing-at-point thing)))
    (if bounds
        (kill-region (car bounds) (cdr bounds))
      (error "No %s at point" thing))))

(defun my-kill-word-at-point ()
  "Kill the word at point."
  (interactive)
  (my-kill-thing-at-point 'word))

(global-set-key (kbd "s-k w") 'my-kill-word-at-point)

s-k 代表哪个键绑定? - alper
1
小写字母s是“超级”修改键。显然,人们可以在自己的系统上使用任何方便/可用的键绑定。 - phils

6

您可以通过使用M-b将光标移动到单词开头(如果光标不在那里的话),然后使用M-d删除它。然后,您可以按C-y将其放回。如果您想自动化此过程,则可以创建一个简短的elisp函数并将其分配给一个键:

(global-set-key [24 C-backspace] ; C-x C-backspace
                (lambda () (interactive)
                  (save-excursion
                    (backward-word)
                    (kill-word 1)
                    (yank))))

2
可能会删除前面的单词。 - phils
2
<kbd>M-d</kbd> 正是我正在寻找的,谢谢。 - galois

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接