启动选择以取代Emacs的前向词

时间:2013-04-16 10:13:26

标签: emacs elisp

我想替换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编程非常非常了解,我只是在这里猜测。我希望得到一些帮助。感谢...

2 个答案:

答案 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