5

他にもたくさんの質問やelファイルを調べて、自分のニーズに合わせて変更できるものを探しましたが、問題が発生したため、専門家のところに行きました。

とにかく、カーソルが行のどこにあるかによってキーの動作が異なるようにすることはできますか?

具体的には、行の途中にいる場合はタブキーを行末に移動するようにマップしますが、カーソルが行の先頭にある場合は通常どおりタブとして機能します。

これまでのところ、C ++ / Javaなどの場合、中括弧と引用符を使用してカーソルを自動ペアリングし、カーソルをその中に再配置します。たとえば、関数に引数がない場合は、タブキーを使用して行を終了します。 。

4

2 に答える 2

3

ポイントが行のどこにあるかによって異なる動作をするのは簡単です((if (looking-back "^") ...)コードを参照)。「通常はタブとして機能する」というのは、状況に応じて難しいことです。

これが1つのアプローチですが、後で、より堅牢な方法は、TABの独自のバインディングを使用してマイナーモードを定義し、その関数にフォールバックバインディングを動的に検索させることだと考えていました。最後のビットを実行する方法がわかりませんでしたが、ここに解決策があります:

Emacsキーバインディングフォールバック

(defvar my-major-mode-tab-function-alist nil)

(defmacro make-my-tab-function ()
  "Return a major mode-specific function suitable for binding to TAB.
Performs the original TAB behaviour when point is at the beginning of
a line, and moves point to the end of the line otherwise."
  ;; If we have already defined a custom function for this mode,
  ;; return that (otherwise that would be our fall-back function).
  (or (cdr (assq major-mode my-major-mode-tab-function-alist))
      ;; Otherwise find the current binding for this mode, and
      ;; specify it as the fall-back for our custom function.
      (let ((original-tab-function (key-binding (kbd "TAB") t)))
        `(let ((new-tab-function
                (lambda ()
                  (interactive)
                  (if (looking-back "^") ;; point is at bol
                      (,original-tab-function)
                    (move-end-of-line nil)))))
           (add-to-list 'my-major-mode-tab-function-alist
                        (cons ',major-mode new-tab-function))
           new-tab-function))))

(add-hook
 'java-mode-hook
 (lambda () (local-set-key (kbd "TAB") (make-my-tab-function)))
 t) ;; Append, so that we run after the other hooks.
于 2011-09-10T12:03:44.957 に答える
1

Emacs Wikiのこのページには、コンテキストに応じてTABに異なることをさせるいくつかのパッケージ(smarttabなど)がリストされています。あなたはおそらくあなたが望むことをするためにそれらの1つを修正することができます。

于 2011-09-10T05:38:05.427 に答える