Anahtarlarınızı henüz yüklenmemiş olan tuş haritalarına nasıl bağlarsınız?


9

Kullandığım use-packageve yüklü paketleri yönetmek bind-keyhoşuma konusu özel anahtarlarına atama eylemlere.

Varsayılan Emacs tuş bağlama çoğunu geçersiz kılar (örneğin C-nolur M-k, C-polur M-i), ama benim tuş bağlama şemasını geçersiz kılan diğer modları ile Tamam. Ancak bazen tuş bağlamamın devam etmesini istiyorum. M-kVarsayılan Gnus veya Helm'dan başka bir şey demek istiyorum .

Ancak, hepsi Emacs başlangıcında birbiriyle çakışır, çünkü bir tuş eşlemesine bağlama ekleyemem, eğer yoksa ( use-packagebazen bir paketin yüklenmesini bozar). Örneğin, aşağıdaki komutlar hata verir (örn. (void-variable helm-map)), Çünkü Helm ve Gnus henüz tam olarak yüklenmemiştir.

(bind-key "M-Y" 'helm-end-of-buffer helm-map)
(bind-key "M-k" 'helm-next-line helm-find-files-map)
(bind-key "M-s" 'other-window gnus-summary-mode-map)

Tüm use-packageçağrılarımı bir dosyada ve bind-keybaşka bir dosyada özel tuş bağlamaları için kullanıyorum. Bağlamaları use-packageçağrılara koymak istemiyorum , çünkü belki de özel tuş bağlama planımı bağımsız bir paket olarak yayınlamak istiyorum. Şemamı yükleyen birisinin Helm ve Gnus yerel tuş bağlantılarının da geçersiz kılınmasını istersem ne olur?

Mod-yerel tuş bağlarını kullanarak bind-keypaketleri nasıl yönetebilirim , böylece paketler son zamanlarda yüklenmiş olsa bile tüm anahtarlar ayarlanır ve tüm anahtar ayarları tek bir dosyada bulunur?

Yanıtlar:


20

with-eval-after-loadBelirli bir modül yüklenene kadar (ve böylece anahtar haritası tanımlanana kadar) anahtar bağlamayı ertelemek için kullanabilirsiniz :

(with-eval-after-load "helm"
  (bind-key "M-Y" #'helm-end-of-buffer helm-map))

C-h v helm-mapTuş haritasının hangi modülde tanımlandığını ve böylece ilk satıra dizeye ne konacağını bulmak için kullanın .


with-eval-after-loadEmacs 24.4'te tanıtıldı. Daha önceki bir Emacs sürümünüz varsa, eval-after-loadbunun yerine kullanmanız ve bind-keyçağrının önüne tek bir alıntı yapmanız gerekir :

(eval-after-load "helm"
  '(bind-key "M-Y" #'helm-end-of-buffer helm-map))

bind-keyBu forma birkaç çağrı koymak istiyorsanız , with-eval-after-loadsadece birbiri ardına koyun, ancak hepsini bir eval-after-loada'ya sarmanız gerekir progn:

(eval-after-load "helm"
  '(progn
     (bind-key "M-Y" #'helm-end-of-buffer helm-map)
     (bind-key "M-k" #'helm-next-line helm-find-files-map)))

9

Çözüm

Belirli bir paket yüklendikten sonra eşyalarını çalıştırmak için, sen bundan sonra koymak gerekir :configde use-package.

Sorunuzda snippet'i kullanan bir örnek:

Snippet # 1

(use-package helm
  :config
  (progn
    (bind-key "M-Y" #'helm-end-of-buffer helm-map)
    (bind-key "M-k" #'helm-next-line helm-find-files-map)))

(use-package gnus
  :config
  (bind-key "M-s" #'other-window gnus-summary-mode-map))

açıklama

Emacs'ınızdaki farklı yerlerde init.elveya yüklenen / gerekli iç içe dosyaların herhangi birinde aşağıdaki 2 parçacığın olması sorun yaratmaz .

Snippet # 2

(use-package gnus)

Snippet # 3

(use-package gnus
  :config
  (bind-key "M-s" #'other-window gnus-summary-mode-map))

Bunun nedeni, yukarıdaki 2 snippet'ten hangisinin önce yürütüldüğü önemli değildir.

İşte bu yüzden .. aşağıda Snippet # 3 genişlemektedir.

M-x pp-macroexpand-last-sexpNokta (imleç) bu snippet'in son kapanış parantezinden sonra olduğunda aşağıdakileri yaparsınız .

Snippet # 4

(if (not (require 'gnus nil t))
    (ignore (message (format "Could not load %s" 'gnus)))
  (condition-case-unless-debug err
      (bind-key "M-s" #'other-window gnus-summary-mode-map)
    (error
     (ignore
      (display-warning 'use-package
                       (format "%s %s: %s" "gnus" ":config"
                               (error-message-string err))
                       :error))))
  t)

Yukarıdaki pasaj, temel olarak

  • gnusönce gereklidir ve daha sonra bind-keyform yürütülür.
  • Bulunmazsa gnus, * Mesajlar * arabelleğinde bu paketin yüklenemediğini belirten bir mesaj göreceksiniz.
  • Yürütmede herhangi bir sorun varsa hata atar (bind-key "M-s" #'other-window gnus-summary-mode-map)

Ayrıca gnus, yukarıdaki Snippet # 2 tarafından zaten gerekliyse ve Snippet # 3 tarafından tekrar gerekliyse , önemli değildir, çünkü requirezaten yüklenmişse bir paketi tekrar yüklemez.


Referans

Gönderen use-packagetemelleri onun üzerinde github,

:configbir paket yüklendikten sonra kodu yürütmek için kullanılabilir. Yüklemenin tembel olarak yapıldığı durumlarda (aşağıdaki otomatik yükleme hakkında daha fazla bilgi edinin), bu yürütme otomatik yükleme gerçekleşene kadar ertelenir:

Snippet # 5

(use-package foo
  :init
  (setq foo-variable t)
  :config
  (foo-mode 1))

Yukarıdaki paket yüklenmeden önce:init bölümü ( (setq foo-variable t)) yürütür . Ama içinde bölümde yürütülür sonra yüklenir. foo(foo-mode 1):config foo


3

Diğer cevapların tersine, bunun için her zaman kanca kullandım:

(defun my-company-maps()
  (define-key company-active-map "\C-x\M-h" 'company-show-doc-buffer)
  (define-key company-active-map "\C-n" 'company-select-next)
  (define-key company-active-map "\C-p" 'company-select-previous)
  (define-key company-active-map "\C-h" 'delete-backward-char))

(add-hook 'company-mode-hook 'my-company-maps)

Ben de bunu yapmanın tercih edilen yolu olduğunu düşündüm.
Anlamlı Kullanıcı Adı

2

Halihazırda bind anahtarını kullandığınızdan, doğrudan aşağıdakilerin belgelenmesinden bind-key.el:

Tuş bağlamanın aynı anahtarı da bağlayabilecek tüm küçük modları geçersiz kılmasını istiyorsanız, `bind-key * 'formunu kullanın:

(bind-key* "<C-return>" 'other-window)

Bir tuş eşlemesindeki bir anahtarı ayırmak için (örneğin, en sevdiğiniz ana modun her yerde geçersiz kılmak istemediğiniz bir bağlayıcıyı değiştirmesini durdurmak için) unbind-key kullanın:

(unbind-key "C-c x" some-other-mode-map)

Tanımlama dosyası some-other-mode-maphenüz yüklenmediğinden , tuş haritası şu anda tanımsızsa son form bozulur . Yani bir bu koyabilirsiniz use-packageiçin some-other-mode(tanımlayan pakete some-other-mode-map) veya kullanma with-eval-after-load:

(with-eval-after-load 'some-other-mode
  (unbind-key "C-c x" some-other-mode-map))

Diğer bir alternatif, büyük modlar tarafından geçersiz kılınmaması gereken tüm bağlantıları içeren kendi küçük modunuzu tanımlamak olacaktır:

(defvar my-very-own-keymap (make-keymap) "my very own keymap.")

(define-key my-very-own-keymap (kbd "M-i") 'my-foo)

(define-minor-mode my-very-own-keys-minor-mode
  "Minor mode with my very own keybindings."
  t " my-own-keys" my-very-own-keymap)
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.