バッファ固有のキーバインディング


13

バッファに固有のキー割り当てを設定することは可能ですか?

組織ファイルの1つに次のものが含まれています。

# Local Variables:
# eval: (local-set-key (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
# End:

ただし、このバインディングは他の組織モードファイルでも持続します。別のメジャーモードでファイルを開くと、デフォルトのキーバインディングが起動します。

local-set-keyバッファ固有ではなく、メジャーモード固有のバインディングを設定しているようです。

特定のバッファーでのみアクティブになるバインディングをどのようにして持つことができますか?


2
「バインディングは現在のバッファーのローカルマップに移動します。ほとんどの場合、これは同じメジャーモードの他のすべてのバッファーと共有されます。」私はそれを知りませんでした。
shosti 2014

考えてみたところ、セクションの前に実行された場合、local-unset-keyフックは機能するorg-mode-hook可能性Local Variables:があります。
Kaushal Modi 2014

それとも、半疎なキーマップでマイナーモードを作成し、使用してそれを切り替えることができLocal Variables:
Vamsi

@Vamsiありがとう!これはエレガントなソリューションです!ソリューションを更新しました。
Kaushal Modi 2014

回答:


17

閉鎖のために、これは私のコメントを拡張する答えです。必要なキーバインドを使用してマイナーモードを定義し、ファイルローカル変数を使用して、必要なバッファーでそれを切り替えます。

  (define-minor-mode my-org-buffer-local-mode
    "Minor mode to simulate buffer local keybindings."
    :init-value nil)
  (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)

次のようにファイルの最後にあるローカル変数セクションを設定することにより、必要なファイルでそれを切り替えることができます。ここでキーバインドを変更または追加することもできます。同じキーシーケンスを異なるコマンドにマップするバッファーごとに、異なるマイナーモードを定義する必要があります。

 # Local Variables:
 # my-org-buffer-local-mode: t
 # eval:(define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-other-custom-defun-specific-to-this-buffer)
 # End:

@kaushalmodi:より完全なため、編集内容を別の回答に分割することができます。また、バッファ固有の名前を使用しない限り、同じキーシーケンスを2つの異なる関数に同時にマップすることはできません。
Vamsi

私はこのエラーを取得する:eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-map私はこれを実行しようとすると(define-minor-mode my-org-buffer-local-mode "Minor mode to simulate buffer local keybindings." :init-value nil) (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
incandescentman

私も同じエラーが出ます。何か案が?
zeltak 2017

@incandescentman call(make-keymap)with :keymapkeyword、check nullprogram.com/blog/2013/02/06
nichijou

5

バッファ固有のキーバインディングを設定する一般的な方法を次に示します。

  • 以下にスニペット保存(一時的なマイナーモードを作成temp-mode.elし、requireそれはあなたにinit.el
  • そのtemp-modeマイナーモードを有効にし、必要なバッファーのみでそのマイナーモードのキーマップを定義します。

以下のLocal Variablesスニペットを、カスタムキーバインディングが必要なバッファーに配置します。以下はorg-modeファイルの例です。

バッファONE内

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-ONE)
# End:

他のバッファが同じキーバインディングを使用して再定義する場合、

バッファー2

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-TWO)
# End:

次に、新しいバインディングが実行時に有効になりM-x revert-bufferます。

これは、これら2つのバッファーを頻繁に切り替える必要がありF10、両方でバインディングを使用する必要がある場合に行うことです。

  • バッファー1で作業しC-x C-s(保存)、バッファー2に切り替えます
  • revert-buffer(バインディングを更新)、バッファー2で作業し、C-x C-sバッファーONEに切り替えます
  • revert-buffer(バインディングを更新する)、バッファーONEで作業し、C-x C-sバッファーTWOに切り替える

しかし、私はむしろ、さまざまなバッファ固有のコマンドをさまざまなキーにバインドします。


一時的なマイナーモード

;; temp-mode.el
;; Temporary minor mode
;; Main use is to enable it only in specific buffers to achieve the goal of
;; buffer-specific keymaps

(defvar temp-mode-map (make-sparse-keymap)
  "Keymap while temp-mode is active.")

;;;###autoload
(define-minor-mode temp-mode
  "A temporary minor mode to be activated only specific to a buffer."
  nil
  :lighter " Temp"
  temp-mode-map)

(provide 'temp-mode)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.