Küçük mod tanımını geliştirirken nasıl güncellersiniz?


13

Bazı tuş bağlamaları sağlamak için küçük bir mod kodlamaya başladım. Benim ilk denemem bir yazım hatası vardı:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(([b] . 'previous-line)))

bAnahtarı kullanmayı planlamıştım ve hemen "b"yerine kullanmam gerektiğini fark ettim [b]. Bu yüzden küçük modu yeniden tanımladım:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(("b" . 'previous-line)))

Ancak, bu işe yaramadı. Bu beni tüm vahşi anahtar kovaları (yani, (kbd ...), [...], vb) çeşitli vahşi kovalamaca yola çıkardı. Sonunda, (define-minor-mode ...)formu yeniden değerlendirmenin hiçbir şeyi değiştirmediğini fark ettim , orijinal, kırık anahtar haritaya sıkıştım. Daha sonra doğrudan üzerinden tuş eşlemesini değiştirmeyi denedim (define-key borked-mode-map ...)ve düzeltilmiş tuş eşlemesini yükleyemedim. Sonunda Emacs'ı yeniden başlattım ve küçük modum doğru şekilde yüklendi.

Sorum şu: küçük mod tanımını geliştirirken nasıl güncellersiniz? Bozuk bir tanımı temizlemenin bir yolu var mı veya bozuk bitleri temizlemek için emacs'ı yeniden başlatmanız mı gerekiyor?

Yanıtlar:


11

Bunu ilk değerlendirdiğinizde, define-minor-modebelirttiğiniz borked-mode-mapanahtar bağları olan bir değişken tanımlar . Bununla birlikte, bu sembol tanımlandıktan sonra, tekrar değerlendirdiğinizde sembol define-minor-modedeğiştirilmez.

Kodunuzu borked-mode-xxxkullanarak çeşitli simgeleri silebilir uninternve daha sonra yeniden değerlendirebilirsiniz. Deneyin:

(unintern 'borked-mode-map)

Gerçekte define-minor-modene yaptığını görmek için makroyu genişletmek isteyebilirsiniz . Sonuna nokta koy ve ara M-x pp-macroexpand-last-sexp. Bu, genişletilmiş makroyu gösteren yeni bir arabellek açacaktır. Orada defvarmod değişkenlerinizi ayarlamak için kullanılan çağrıları göreceksiniz . Yardımı okursanız, defvarbaşlangıç ​​değerinin yalnızca tanımlanan sembol geçersizse kullanıldığını görürsünüz - bir kez var olduğunda, sonraki defvararamalar değerini değiştirmez.


13

Sana verebileceğim en iyi cevabın "satır içi tuş bağlama özelliğinden" uzak durmak olduğunu düşünüyorum define-minor-mode. kullanım

(defvar borked-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map [b] 'previous-line)
    ...
    map))

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  :global nil
  ...)

Yerine. Sonra C-M-xbu tanımları yeniden değerlendirmek için kullanabilirsiniz .


1
defvarsonra tekrar değerini değerlendirmez C-M-x:) İhtiyacınız defparameterveya ayrı setf.
wvxvw

@Wvxvw'nin belirttiği gibi, bu aslında sorunu ele almaz. Örnek kodunuz define-minor-modemakronun yaptığı ile aynıdır : defvarharitayı tanımlamak için çağrı . Defvar'ın ikinci kez değerlendirilmesinin bir etkisi yoktur.
glucas

7
@wvxvw Yeniden değerlendirmek için C-M-x( eval-defun) kullanırsanız defvardeğişken güncellenir. Bu özel bir durumdur eval-defun; ararsanız eval-bufferveya eval-regionmevcut değer değiştirilmezse.
Gilles 'SO- kötü olmayı kes

Ah - bu kilit nokta gibi görünüyor.
glucas

1
Not C-M-xüzerinde defvarformda sadece mod-haritası değişken kendisini günceller. Ayrıca zorunda C-M-xüzerinde define-minor-modeminör moduna 'yüklü' Değiştirilen harita almak için formu. Neden makroları genişleterek anlamaya çalıştım, ama bu benim dışımda.
Tyler

0

Mod haritanızı şu şekilde tanımlayabilirsiniz:

(defvar dnd-mode-map
  (let ((map (make-sparse-keymap)))
    (prog1 map
      (define-key map "q" 'dnd-quit)
      (when (eq this-command 'eval-defun)
        (let ((mmap (assq 'dnd-mode minor-mode-map-alist)))
          (when mmap
            (setcdr mmap map)))))))

Artık kullanarak harita tanımını yeniden değerlendirebilirsiniz ve içindeki haritayı eval-defunotomatik olarak güncelleyecektir minor-mode-map-alist.

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.