我想替换 Emacs 的默认正向词和反向词以更像 Visual Studio 的操作 - 我发现它更适合 Perl 编程。我首先尝试破解语法表,但没有达到我想要的效果。然后我想出了以下内容:
(defconst perl-movement-stop-chars "a-zA-Z$@%_0-9'")
(defconst perl-movement-stop-pattern (concat "[" perl-movement-stop-chars "]"))
(defconst non-perl-movement-stop-pattern (concat "[^" perl-movement-stop-chars "]"))
(defun perl-forward-word ()
(interactive)
(if (looking-at perl-movement-stop-pattern)
(progn
(if (re-search-forward non-perl-movement-stop-pattern nil t)
(backward-char)))
(if (re-search-forward perl-movement-stop-pattern nil t)
(backward-char))))
(defun perl-backward-word ()
(interactive)
(backward-char)
(if (looking-at perl-movement-stop-pattern)
(progn
(if (re-search-backward non-perl-movement-stop-pattern nil t)
(forward-char)))
(if (re-search-backward perl-movement-stop-pattern nil t)
(forward-char))))
(add-hook 'cperl-mode-hook
(lambda()
(local-set-key [C-right] 'perl-forward-word)
(local-set-key [C-left] 'perl-backward-word)
linum-mode))
这就是我想要的 - 几乎:当从缓冲区的第一个单词内向后移动时,我仍然必须处理这种情况。但这不是我的问题。
这样做的问题是,当我键入 CS-right 时,选择没有开始,因为我的钩子没有安装(或在其他模式下)。如果我启动选择(例如通过点击第一个 S-right),我的功能会扩展它。
我对 elisp 编程知之甚少,我只是在这里猜测我的方式。我将不胜感激。谢谢...