5

我对“backward-word”和“backward-kill-word”命令的工作方式有一个小问题。当我在只有空格的行(例如,缩进行的第一个字符)上点击“backward-kill-word”时,该命令将杀死所有空格以及最后一个单词上一行。

这种行为对我来说完全不直观。我更喜欢它在 Eclipse 中的工作方式,例如,它会在第一次按下“backward-kill-word”时将空白字符杀死到行首,将移动到上一行的末尾在下一次命中时,才会开始从行尾开始杀死单词。

我很确定这种行为是大多数应用程序中的默认行为(因为它似乎更直观,这可能是因为我习惯了,但我不确定),所以我想知道是否有一种将 Emacs 配置为也具有此行为的方法。不幸的是,谷歌上的一些搜索结果一无所获。

谢谢

编辑:

感谢所有人的回答(包括我所要求的 elisp 代码)。

显然,使用 forward-kill-word 和移动命令也会出现同样的问题,我希望 emacs 中只有一些可配置的标志来改变行为,但看起来我只是要使用这些 elisp 函数并为这些重新绑定默认的移动和杀死命令。

4

6 回答 6

5

这个怎么样:

(defun my-backward-kill-word ()
  "Kill words backward my way."
  (interactive)
  (if (bolp)
      (backward-delete-char 1)
    (if (string-match "^\\s-+$" (buffer-substring (point-at-bol) (point)))
        (kill-region (point-at-bol) (point))
      (backward-kill-word 1))))
于 2009-01-17T12:54:10.967 回答
1

在这种情况下,您可能想尝试 M-\ (delete-horizo​​ntal-space),它会在第一次按键时执行您想要的操作。如果你真的需要一个将两者结合起来的函数,那么编写一个检查光标之前的当前行中是否有任何非空格字符并基于此调用一个或另一个的函数应该不会太难。

于 2009-01-17T10:12:25.193 回答
1

这是一个很大的问题。您将不得不研究 emacs lisp 编程并学习一些有关它的东西。我建议从这里开始:响尾蛇 emacs 教程,然后按照自己的方式进行操作。

仅供参考,查看我的 TAGS 文件告诉我,backward-word 是在 simple.el 中定义的,具有以下形式:

(defun 后向词 (&optional arg)

“向后移动直到遇到单词的开头。有论据,多次这样做。”

(交互式“p”)

(前向词(-(或 arg 1))))

所以下一步是在这个调用中添加一个 if 。

于 2009-01-17T10:21:21.540 回答
1

这应该这样做:

(defun eclipse-kill-word (repeat)
  "Redefine `backward-kill-word' to work as Eclipse does.

Now stops at the beginning of the line, deleting only whitespace."
  (interactive "p")
  (let (cnt)
    (dotimes (cnt repeat)
      (if (= (point) (save-excursion (beginning-of-line) (point)))
          (kill-region (point) (save-excursion (backward-word) (point)))
        (kill-region (point)
                     (max (save-excursion (beginning-of-line) (point))
                          (save-excursion (backward-word) (point))))))))

具有使用前缀键 (Ctrl-U) 可重复的额外好处。

于 2009-01-17T14:21:55.987 回答
0

请注意,在cc-mode中,有一个饥饿删除选项,您可以像这样启用它:

(add-hook 'c-mode-common-hook (lambda () (c-toggle-auto-hungry-state 1)))

显然这只适用于 C,C++,Java,... 文件,并适用于退格键(不删除单词)。

于 2009-04-15T20:10:02.443 回答
0

您可以重用 viper 的一些功能以获得所需的行为:

(setq viper-mode nil)
(require 'viper)

(defun viper-delete-word (arg)
  "Delete word."
  (interactive "p")
  (save-excursion
    (push-mark nil t)
    (viper-forward-word arg)
    (delete-region (point) (mark t))
    (pop-mark)))

(defun viper-delete-backward-word (arg)
  "Delete previous word."
  (interactive "p")
  (save-excursion
    (push-mark nil t)
    (viper-backward-word arg)
    (delete-region (point) (mark t))
    (pop-mark)))

(global-set-key [C-left] 'viper-backward-word)
(global-set-key [C-right] 'viper-forward-word)
(global-set-key [C-delete] 'viper-delete-word)
(global-set-key [C-backspace] 'viper-delete-backward-word)
于 2014-08-28T21:54:50.883 回答