Bir tampona özgü anahtar bağlamaları


14

Arabelleğe özel anahtar bağlantıları ayarlamak mümkün müdür?

Kuruluş dosyalarımdan birinde aşağıdakiler var:

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

Ancak bu bağlama diğer kuruluş modu dosyaları için de devam eder. Farklı bir ana modda bir dosya açarsam, varsayılan anahtar bağlantım devreye girer.

local-set-keyArabelleğe özgü olmayan majör moda özgü bağlamalar ayarlamak gibi görünüyor .

Yalnızca belirli bir arabellekte etkinleştirilen bağlamaları nasıl alabilirim?


2
Oh vay canına, haklısın: "Bağlanma, geçerli arabellek yerel haritasında gerçekleşir ve çoğu durumda aynı ana moddaki diğer tüm arabelleklerle paylaşılır." Bunu hiç bilmiyordum.
shosti

Şimdi düşününce, local-unset-keykanca org-mode-hookönce Local Variables:bölüm önce yürütülürse işe yarayabilir .
Kaushal Modi

Ya da yarı seyrek bir tuş eşlemeli küçük bir mod yapabilir ve kullanarak geçiş yapabilirsinizLocal Variables:
Vamsi

@Vamsi Teşekkürler! Bu zarif bir çözüm! Çözümünüzü güncelledim.
Kaushal Modi

Yanıtlar:


17

Kapanış için, benim yorumum üzerine genişleyen bir cevap. Ben gerekli tuş bağlama ile küçük bir mod tanımlamak ve dosya yerel değişkenleri kullanarak gerekli arabellek geçiş.

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

Dosyanın sonundaki yerel değişkenler bölümünü aşağıdaki gibi ayarlayarak gerekli dosyalarda geçiş yapabilirsiniz. Ayrıca burada tuş takımını değiştirebilir veya ekleyebilirsiniz. Yine de, aynı anahtar dizisini farklı komutlarla eşleyen her arabellek için farklı küçük modlar tanımlamanız gerekecektir.

 # 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: Düzenlemelerinizi daha eksiksiz olduğu için ayrı bir cevaba dönüştürmek isteyebilirsiniz. Ayrıca, ara belleğe özgü bir ad kullanmadığınız sürece aynı anahtar dizisini aynı anda iki farklı işleve eşleyemezsiniz.
Vamsi

Bu hatayı alıyorum: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapbunu çalıştırmaya çalıştığımda(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

Aynı hatayı alıyorum. Herhangi bir fikir?
zeltak

@incandescentman call (make-keymap) :keymapanahtar kelimesi ile nullprogram.com/blog/2013/02/06
nichijou

5

Arabelleğe özgü anahtar bağlarını ayarlamanın genel bir yolu.

  • Geçici bir küçük mod oluşturun (aşağıdaki kod parçasını temp-mode.elve cihazınıza requirekaydedin init.el.
  • Bu temp-modeküçük modu etkinleştirin ve küçük modun tuş haritasını yalnızca ihtiyacınız olan arabelleklerde tanımlayın.

Aşağıdaki Local Variableskod parçasını, özel anahtar bağlamasını istediğiniz ara belleğe koyun . Aşağıda org-modedosya örnekleri verilmiştir .

Tampon ONE'da

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

Başka bir arabellek aynı anahtar bağlayıcıyı kullanarak yeniden tanımlarsa,

Tampon İKİ

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

sonra yeni bağlanma etkili olur M-x revert-buffer.

Bu iki arabellek arasında çok sık geçiş gerekirse F10ve her ikisinde de bağlayıcı kullanmak zorunda kalırsanız ne yapardı :

  • Tampon ONE içinde çalışın, C-x C-s(kaydedin) ve TWO arabelleğe geçin
  • revert-buffer(bağlamaları yenile), İKİ tamponda çalışın C-x C-sve BİR numaralı araca geçin
  • revert-buffer(ciltleri yenile), ONE arabelleğinde çalış C-x C-sve TWO arabelleğine geç

Ancak farklı arabelleklere özgü komutları farklı tuşlara bağlamayı tercih ederim.


Geçici küçük mod

;; 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.