質問

質問:

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

これが私がこれまでに持っているものです。 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を使用したいときに呼び出すことができるマイナーモードを作成したいと思います。

デフォルトでは、私のnum-padのキーは未定義です。私が使う <kp-0><kp-9> NumpadキーのKeybindingsを定義します。

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

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

役に立ちましたか?

解決

短い答え

問題行:

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

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

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

長い答え

Minor-Modeを定義します Macroを使用すると、マイナーモードを比較的簡単に(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)

そして、マイナーモード定義では、アリストの代わりに、キーマップの変数名を簡単にリストします

(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

すべてがどのように機能するか

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

コマンド名の直後に、引用符でマイナーモードのドキュメント文字列をリストします。これはあなたが望む限りかなり長くすることができます。

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

  1. マイナーモード変数の開始値。 nil デフォルトでモードがオフになります。以外の何か nil デフォルトでそれをオンにします。

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

  3. キーマップ。キーマップは、変数またはアリスト(関連付けリスト)として定義できます。を使用してから リスト よりシンプルで短いです、それが私が例で使用したものです。アリストは形になるはずです (key-sequence . definition).

キーマップをアリストとして定義する場合、特にグローバルなキーバインディングの定義に慣れている場合は、注意すべきことがいくつかあります。まず、コマンド名は引用されていません。第二に、マクロを使用する場合、 必ず 評価するように強制します (そしてそうです). 。これは、バッククオート(単一の引用ではなく)とコンマの組み合わせで行われます。 KBDマクロの例でこれがどのように行われるかを見ることができます。 KBDマクロを使用しない場合は、キーストローク定義も含めました。キーマップで文字列を引用するだけで、定義されたキーの組み合わせが押されたときに印刷されます(グローバルキーバインディングを定義するのと同じように)。

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

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

最後に、フォームのキーワードアルグを使用して追加のオプションを追加できます :blah. 。私が使用した例で :global. 。キーワードARGSでモード全体を定義することもできましたが、init値、軽量、キーマップを正しい順序でリストするだけが短くなります。

他のヒント

マイナーモードの定義でこのようなコードを使用する必要があります。

(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 参考のために。

これを見てください(Keybindingsに関する情報のためだけに):

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/Recrame_KeyBindings.html:

よく書かれた主要なモードは、最後にフックを実行します。したがって、フックを使用してキーバインディングを定義できます。マイナーモードには通常、フックがありません。その場合、最初に「(マイナーモード機能シンボルを必要とする)」を呼び出すことができます。次にキーバインディングを定義します。

また、あなたは次のように見ているかもしれません:http://www.cs.utah.edu/dept/old/texinfo/emacs19/emacs_35.html#sec347

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top