改变反向词和反向杀词的行为

时间:2009-01-17 09:28:18

标签: eclipse emacs elisp

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

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

我很确定这种行为在大多数应用程序中是默认的(因为它看起来确实更直观,这可能是因为我已经习惯了,但我不确定),所以我想知道如果有办法配置Emacs也有这种行为。不幸的是,Google上的一些搜索结果一无所获。

由于

编辑:

感谢大家的答案(包括我所要求的elisp代码)。

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

6 个答案:

答案 0 :(得分: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))))

答案 1 :(得分:1)

在这种情况下,你可能想尝试M- \(删除水平空间),它可以为第一个按键执行所需的操作。如果你真的需要一个结合了两者的函数,那么编写一个检查光标前当前行中是否存在任何非空格字符的函数应该不会太难,并根据它调用其中一个或另一个。

答案 2 :(得分:1)

这是一个非常大的问题。你将不得不研究emacs lisp编程并学习一些关于它的东西。我建议从这里开始:rattlesnake emacs tutorial,然后继续努力。

仅仅是为了您的信息,查看我的TAGS文件告诉我,后向词在simple.el中定义并具有以下形式:

(defun backward-word(& optional arg)

“向后移动直到遇到一个单词的开头。通过参数,多次这样做。”

(互动“p”)

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

所以下一步就是在这个电话中添加一个if。

答案 3 :(得分: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)具有可重复性的附加好处。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分: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)