13

質問:

マイナーモードのカスタムキーバインディングを作成するにはどうすればよいですか?このようなもの

これが私がこれまでに持っているものです。カスタムキーバインディングを1つだけ機能させようとしています。

(define-minor-mode num-mode
       "Toggle the Num pad keys.
     With no argument, this command toggles the mode.
     Non-null prefix argument turns on the mode.
     Null prefix argument turns off the mode.

     When Num mode is enabled, the num pad inserts the
     keys you see on the pad. This may over ried existing
     definitions, and is probably only usefule if you aref
     running Emacs through a terminal."
      ;; The initial value.
      nil
      ;; The indicator for the mode line.
      " NumPad"
      ;; The minor mode bindings.
      ;; This doesn't work right now!!!!
       '(((kbd "<kp-1>") . "a"))
      :global 1
)

カスタムマイナーモード「num-mode」を呼び出してミニバッファでオンになっていることを確認した後、numパッドで「1」を押すと、エラーが発生します<kp-1> is undefined。私がしたいaのは、を押したときにポインタがどこにあるかが出力されること<kp-1>です。(単なるテスト)

コンテクスト:

したがって、私は通常、numパッドを使用してバッファ間を移動します(矢印キーで適切な方向に移動します)。これはグローバルに設定されます。数字を入力するだけの数字パッドを使用したいときに呼び出すことができるマイナーモードを作成したいと思います。

デフォルトでは、num-padのキーは未定義です。テンキーのキーバインドを定義するために使用<kp-0>します。<kp-9>

呼び出すことができるマイナーモードを作成することはできますが、キーバインディングをアタッチすることはできません。これは、他のどこにも定義されていないものを含め、すべてのキーバインディングに当てはまります。

助けてくれてありがとう!

4

3 に答える 3

21

短い答え

問題の行:

'(((kbd "<kp-1>") . "a"))

解決策(マクロの評価を強制する):

;; Single quote changed to back-quote and added a comma
`((,(kbd "<kp-1>") . "a"))

長い答え

define-minor-modeマクロを使用すると、(Emacsに関しては)比較的簡単にマイナーモードを作成できます。

最初にそれがどのように行われるかを示し、次にそれがどのように機能するかを説明します。

一般的な形式:

(define-minor-mode NAME-mode
  "DOCUMENTATION"
  INIT-VALUE
  "LIGHTER"
  ;; keymap
  '(
    (KEY-SEQUENCE . DEFINITION)
    (KEY-SEQUENCE . DEFINITION)
    ... ETC ...
   )
  ;; other options
  :KEYWORD-ARG VALUE
  :KEYWORD-ARG VALUE
  ... ETC ...       
)

アリスト内のマクロの強制評価を使用した特定の例:

;; Custom Minor Mode
(define-minor-mode custom-mode
  "Doc description, yada yada yada."
  ;; The initial value - Set to 1 to enable by default
  nil
  ;; The indicator for the mode line.
  " CustomMode"
  ;; The minor mode keymap
  `(
    (,(kbd "C-c C-a") . some-command)
    (,(kbd "C-c C-b") . other-command)
    ("\C-c\C-c" . "This works too")
   )
   ;; Make mode global rather than buffer local
   :global 1
)

別の方法として、キーマップに変数を使用する場合は、マイナーモード宣言の前にキーマップ変数とキーマップを次のように定義します。

(defvar custom-mode-keymap (make-keymap) "num-mode keymap.")
(define-key custom-mode-keymap (kbd "C-c C-a") 'some-command)

次に、マイナーモードの定義で、alistの代わりに、キーマップの変数名を単純にリストします。

(define-key custom-mode-keymap (kbd "C-c C-b") 'other-command)
;; Num pad enable
(define-minor-mode custom-mode
...

      ;; The minor mode bindings.
      custom-mode-keymap

すべての仕組み

上から下へ、define-minor-modeの直後に、マイナーモードを切り替えるコマンド名を定義します。custom-modeこの場合(M-x custom-modeモードを切り替えるため)。これは、同じ名前の変数も定義します。

コマンド名の直後に、マイナーモードのドキュメント文字列を引用符で囲んでリストします。これは、必要なだけ長くすることができます。

次に、いくつかの選択肢があります。最も簡単な選択は、3つのものをリストしてから、追加のオプションをリストすることです。3つのものを以下の順序でリストする必要があります。これらの3つのことは次のとおりです。

  1. マイナーモード変数の初期化値。nilデフォルトではモードがオフになります。それ以外のものnilはデフォルトでオンになります。

  2. ライター。ライターは、マイナーモードがオンのときに下部のモードラインに表示されるものです。これは短くする必要があり、フォーマットの観点から、スペースで始めると役立つことがよくあります。

  3. キーマップ。キーマップは、変数またはリスト(関連付けリスト)として定義できます。アリストの使用はより単純で短いので、それが例で使用したものです。アリストはの形式である必要があります(key-sequence . definition)

キーマップをリストとして定義する場合、特にグローバルキーバインディングの定義に慣れている場合は、注意すべき点がいくつかあります。まず、コマンド名は引用符で囲まれていません。次に、マクロを使用する場合は、マクロ強制的に評価する必要があります(およびSOで。これは、バッククォート(一重引用符ではない)とコンマの組み合わせで行われます。kbdマクロを使用した例で、これがどのように行われるかを確認できます。kbdマクロを使用しない場合は、キーストロークの定義も含めました。キーマップで文字列を引用するだけの場合、定義されたキーの組み合わせが押されたときに出力されます(グローバルキーバインディングを定義する場合と同様)。

逆引用符とコンマの組み合わせを使用してkbdマクロの評価を強制しない場合、キーマップはkbdマクロでは機能しません。このような:

`((,(kbd "C-c C-a") . some-command))

最後に、フォームのkeyword-argsを使用してオプションを追加できます:blah。例では、を使用し:globalました。キーワード引数を使用してモード全体を定義することもできますが、init値、ライター、キーマップを正しい順序でリストする方が短いです。

于 2010-06-25T07:52:22.447 に答える
3

マイナーモード定義には、次のようなコードが必要です。

(defvar your-mode-map
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map parent-mode-shared-map)
    (define-key map "\C-c\C-a" 'some-defun)
    (define-key map "\C-c\C-b" 'some-other-sexp)
    map)

(use-local-map your-mode-map)

EmacsWikiで利用可能な多くのモードを参照してください。

于 2010-06-25T05:40:52.143 に答える
2

これを見てください(キーバインディングに関する情報のためだけに):

http://www.gnu.org/software/emacs/manual/html_node/emacs/Key-Bindings.html#Key-Bindings

http://www.gnu.org/software/emacs/manual/html_node/emacs/Local-Keymaps.html#Local-Keymaps

http://xahlee.org/emacs/reclaim_keybindings.htmlから:

よく書かれたメジャーモードは最後にフックを実行します。したがって、フックを使用してキーバインドを定義できます。マイナーモードには通常、フックがありません。その場合、最初に「(‹マイナーモード機能シンボル›)」を呼び出してから、キーバインドを定義できます。

また、あなたは見るかもしれません: http ://www.cs.utah.edu/dept/old/texinfo/emacs19/emacs_35.html#SEC347

たぶん、ここで受け入れられた答えもあなたを助けます。

于 2010-06-25T06:08:04.503 に答える