21

タイトルが言うように、emacsのフォワードワード関数の振る舞いをどのように変えるのでしょうか?たとえば、[]がカーソルであるとします。それで:

my $abs_target_path[]= abs_path($target);
<M-f>
my $abs_target_path = abs[_]path($target);

Mf Mbを使用できることはわかっていますが、私に関する限り、それは必要ないはずなので、変更したいと思います。特に、私は2つのことを望んでいます。

  1. Mfを押すと、ポイントが単語内、スペースのグループ内、またはその他の場所にあるかどうかに関係なく、次の単語の最初の文字に移動したいと思います。
  2. モードごとに単語文字をカスタマイズします。結局のところ、CPerlモードでの移動は、たとえばTeXモードとは異なります。

したがって、上記の例では、項目1は、Mfを押した後、カーソルを「a」(およびその左側のポイント)に移動します。項目2では、アンダースコアとシジルを単語文字として定義できます。

4

4 に答える 4

34

試す:

(require 'misc)

次に、使用M-x forward-to-wordして、それが希望どおりに機能するかどうかを確認します。その後、再バインドM-fなどを行うことができます。

CおよびC++モードで単語の区切り文字では_ない(つまり、単語の構成要素にする)には、次のようにします。

(modify-syntax-entry ?_ "w" c-mode-syntax-table)
(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

構文テーブルの詳細については、このwikiページを参照してください。構文テーブルは通常、およびのように名前が付けられtex-mode-syntax-tableますcperl-mode-syntax-table

于 2009-11-20T18:23:25.413 に答える
3

forward-same-syntax関数も参照してください。おそらくこれはあなたがベースにする必要があるものです。

于 2010-04-02T09:40:10.880 に答える
2

構文の変更(およびCamelCaseSubwords)を操作するために単語ベースのコマンドを変更するマイナーモードがあります。好みによっては少しきめが細かいかもしれませんが、基本的にはもう一文字の動きを使うようになりました。

https://bitbucket.org/jpkotta/syntax-subword

于 2012-11-26T16:41:50.253 に答える
0

以前のエディターの動作をコピーしたかったので、もう少し制御が必要だったので、これが私の見解です。

(defun my-syntax-class (char)
  "Return ?s, ?w or ?p depending or whether CHAR is a white-space, word or punctuation character."
  (pcase (char-syntax char)
      (`?\s ?s)
      (`?w ?w)
      (`?_ ?w)
      (_ ?p)))

(defun my-forward-word (&optional arg)
  "Move point forward a word (simulate behavior of Far Manager's editor).
With prefix argument ARG, do it ARG times if positive, or move backwards ARG times if negative."
  (interactive "^p")
  (or arg (setq arg 1))
  (let* ((backward (< arg 0))
         (count (abs arg))
         (char-next
          (if backward 'char-before 'char-after))
         (skip-syntax
          (if backward 'skip-syntax-backward 'skip-syntax-forward))
         (skip-char
          (if backward 'backward-char 'forward-char))
         prev-char next-char)
    (while (> count 0)
      (setq next-char (funcall char-next))
      (loop
       (if (or                          ; skip one char at a time for whitespace,
            (eql next-char ?\n)         ; in order to stop on newlines
            (eql (char-syntax next-char) ?\s))
           (funcall skip-char)
         (funcall skip-syntax (char-to-string (char-syntax next-char))))
       (setq prev-char next-char)
       (setq next-char (funcall char-next))
       ;; (message (format "Prev: %c %c %c Next: %c %c %c"
       ;;                   prev-char (char-syntax prev-char) (my-syntax-class prev-char)
       ;;                   next-char (char-syntax next-char) (my-syntax-class next-char)))
       (when
           (or
            (eql prev-char ?\n)         ; stop on newlines
            (eql next-char ?\n)
            (and                        ; stop on word -> punctuation
             (eql (my-syntax-class prev-char) ?w)
             (eql (my-syntax-class next-char) ?p))
            (and                        ; stop on word -> whitespace
             this-command-keys-shift-translated ; when selecting
             (eql (my-syntax-class prev-char) ?w)
             (eql (my-syntax-class next-char) ?s))
            (and                        ; stop on whitespace -> non-whitespace
             (not backward)             ; when going forward
             (not this-command-keys-shift-translated) ; and not selecting
             (eql (my-syntax-class prev-char) ?s)
             (not (eql (my-syntax-class next-char) ?s)))
            (and                        ; stop on non-whitespace -> whitespace
             backward                   ; when going backward
             (not this-command-keys-shift-translated) ; and not selecting
             (not (eql (my-syntax-class prev-char) ?s))
             (eql (my-syntax-class next-char) ?s))
            )
         (return))
       )
      (setq count (1- count)))))

(defun delete-word (&optional arg)
  "Delete characters forward until encountering the end of a word.
With argument ARG, do this that many times."
  (interactive "p")
  (delete-region (point) (progn (my-forward-word arg) (point))))

(defun backward-delete-word (arg)
  "Delete characters backward until encountering the beginning of a word.
With argument ARG, do this that many times."
  (interactive "p")
  (delete-word (- arg)))

(defun my-backward-word (&optional arg)
  (interactive "^p")
  (or arg (setq arg 1))
  (my-forward-word (- arg)))

(global-set-key (kbd "C-<left>") 'my-backward-word)
(global-set-key (kbd "C-<right>") 'my-forward-word)
(global-set-key (kbd "C-<delete>") 'delete-word)
(global-set-key (kbd "C-<backspace>") 'backward-delete-word)
于 2016-02-23T20:52:55.560 に答える