1

我想替换 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 编程知之甚少,我只是在这里猜测我的方式。我将不胜感激。谢谢...

4

2 回答 2

2

要开始shift-select-mode工作,您需要使用(interactive "^"). 试试C-h f interactive RET

顺便说一句,你可以大大简化你的代码:向前移动,只是(re-search-forward ".\\(\\_<\\|\\_>\\)" nil t)向后移动,使用(re-search-backward "\\(\\_<\\|\\_>\\)." nil t).

于 2013-04-16T13:47:03.243 回答
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
于 2013-04-16T17:31:37.673 回答