我想替换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))
这就是我想要的 - 差不多:当从缓冲区中的第一个单词内部向后移动时,我仍然需要处理这个案例。但这不是我的问题。
这个问题是当我输入C-S-right时没有开始选择,就像没有安装我的钩子时(或者在其他模式下)。如果我启动选择(例如,通过首先敲击S-right),我的函数会扩展它。
我对elisp编程非常非常了解,我只是在这里猜测。我希望得到一些帮助。感谢...
答案 0 :(得分:2)
要让shift-select-mode
正常工作,您需要使用(interactive "^")
。试试C-h f interactive RET
。
顺便说一句,您可以大大简化代码:向前移动,只需(re-search-forward ".\\(\\_<\\|\\_>\\)" nil t)
,向后移动,使用(re-search-backward "\\(\\_<\\|\\_>\\)." nil t)
。
答案 1 :(得分:2)
我不确定你想要什么,但我想我会提供这个。我有一个名为syntax-subword的软件包(在Melpa中可用)。它使得单词运动更细粒度,达到我几乎不会被角色移动的程度,并使用像isearch这样的其他解决方案来移动更远的距离。
来自评论:
;; This package provides `syntax-subword' minor mode, which extends
;; `subword-mode' to make word editing and motion more fine-grained.
;; Basically, it makes syntax changes, CamelCaseWords, and the normal
;; word boundaries the boundaries for word operations. Here's an
;; example of where the cursor stops using `forward-word' in
;; `emacs-lisp-mode':
;;
;; (defun FooBar (arg) "doc string"
;; | | | | | | standard
;; | | | | | | | subword-mode
;; || || | ||| |||| || || syntax-subword-mode
;; || | || | || | | vim