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 右を押すことによって)、私の関数はそれを拡張します。

私は elisp プログラミングについてほとんど知らないので、ここで自分のやり方を推測しているだけです。少し助けていただければ幸いです。ありがとう...

4

2 に答える 2

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 に答える
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 に答える