Binding kunci khusus untuk buffer

13

Apakah mungkin untuk mengatur binding kunci spesifik ke buffer?

Saya memiliki yang berikut ini di salah satu file org saya:

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

Namun pengikatan ini juga berlaku untuk file mode-org lainnya. Jika saya membuka file dengan mode utama berbeda, maka kunci default saya mengikat.

Sepertinya local-set-keypengaturan binding khusus untuk mode-utama tidak spesifik untuk buffer.

Bagaimana saya bisa memiliki binding yang hanya aktif di buffer tertentu?

Kaushal Modi
sumber
2
Oh wow, Anda benar: "Pengikatan dilakukan di peta lokal buffer saat ini, yang dalam kebanyakan kasus dibagikan dengan semua buffer lainnya dalam mode utama yang sama." Saya tidak pernah tahu itu.
shosti
Sekarang saya berpikir tentang hal itu, local-unset-keyterhubung dengan org-mode-hookmungkin berfungsi jika itu dieksekusi sebelum Local Variables:bagian tersebut.
Kaushal Modi
Atau Anda bisa membuat mode minor dengan keymap semi-jarang dan beralih menggunakanLocal Variables:
Vamsi
@Vamsi Terima kasih! Ini adalah solusi yang elegan! Saya telah memperbarui solusi Anda.
Kaushal Modi

Jawaban:

17

Untuk penutupan, inilah jawaban yang mengembang atas komentar saya. Saya mendefinisikan mode minor dengan keybinding yang diperlukan dan beralih di buffer yang diperlukan menggunakan variabel file lokal.

  (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)

Anda dapat mengaktifkannya di file yang diperlukan dengan mengatur bagian variabel lokal di akhir file sebagai berikut. Anda juga dapat mengubah atau menambahkan ikatan tombol di sini. Anda masih perlu mendefinisikan mode minor yang berbeda untuk setiap buffer yang memetakan urutan kunci yang sama untuk perintah yang berbeda.

 # 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:
Vamsi
sumber
@kaushalmodi: Anda mungkin ingin mengubah editan menjadi jawaban yang terpisah karena lebih lengkap. Selain itu, Anda tidak akan dapat memetakan urutan tombol yang sama untuk dua fungsi berbeda secara bersamaan kecuali jika Anda menggunakan nama spesifik buffer.
Vamsi
Saya mendapatkan kesalahan ini: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapketika saya mencoba menjalankan ini(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)
pijar
Saya juga mendapatkan kesalahan yang sama. ada ide?
zeltak
@incandescentman call (make-keymap) dengan :keymapkata kunci, periksa nullprogram.com/blog/2013/02/06
nichijou
5

Berikut adalah cara umum untuk mengatur binding kunci spesifik buffer.

  • Buat mode minor sementara (simpan cuplikan di bawah temp-mode.eldan requiredi dalam init.el.
  • Aktifkan temp-modemode minor itu dan tentukan keymap mode-minor itu hanya di buffer yang Anda butuhkan.

Letakkan Local Variablescuplikan di bawah di buffer tempat Anda ingin pengikatan kunci khusus. Di bawah ini adalah contoh org-modefile.

Dalam buffer ONE

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

Jika beberapa buffer lain mendefinisikan ulang menggunakan pengikatan kunci yang sama,

Dalam buffer DUA

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

maka pengikatan baru menjadi efektif dalam melakukan M-x revert-buffer.

Inilah yang akan saya lakukan jika saya harus sering beralih di antara dua buffer ini dan jika saya harus menggunakan F10penjilidan di keduanya:

  • Bekerja di buffer ONE, C-x C-s(simpan) dan beralih ke buffer TWO
  • revert-buffer(menyegarkan binding), bekerja di buffer DUA, C-x C-sdan beralih ke buffer ONE
  • revert-buffer(menyegarkan binding), bekerja di buffer ONE, C-x C-sdan beralih ke buffer TWO

Tetapi saya lebih suka mengikat perintah buffer-specific yang berbeda ke kunci yang berbeda.


Mode minor sementara

;; 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)
Kaushal Modi
sumber