開発時にマイナーモード定義をどのように更新しますか?


13

いくつかのキーバインドを提供するために、マイナーモードのコーディングを開始しました。私の最初の試みにはタイプミスがありました:

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

bキーを使用するつもりでしたが、すぐにの"b"代わりに使用する必要があることに気付きました[b]。そこで、マイナーモードを再定義しました。

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

ただし、これは機能しませんでした。これにより、キーをバインドするさまざまな方法(つまり、(kbd ...)、[...]など)を使った野生のガチョウの追跡が始まりました。最後に、(define-minor-mode ...)フォームを再評価するだけでは何も変わらず、元の壊れたキーマップに固執していることに気付きました。その後、キーマップを直接経由して変更しようとしましたが(define-key borked-mode-map ...)、まだ修正されたキーマップをロードできませんでした。最後にEmacsを再起動し、マイナーモードが正しくロードされました。

私の質問は、マイナーモード定義を開発する際にどのように更新しますか?壊れた定義をフラッシュする方法はありますか、または壊れたビットを取り除くためにemacsを再起動する必要がありますか?

回答:


11

初めて評価するdefine-minor-modeときは、borked-mode-map指定したキーバインドで変数を定義します。ただし、そのシンボルが定義されると、再評価してdefine-minor-modeも変更されません。

を使用してさまざまなborked-mode-xxxシンボルを削除し、uninternコードを再評価できます。試してください:

(unintern 'borked-mode-map)

define-minor-modeマクロを展開して、実際に何をしているかを確認することに興味があるかもしれません。最後にポイントを置き、を呼び出しますM-x pp-macroexpand-last-sexp。これにより、展開されたマクロを示す新しいバッファーが開きます。そこにはdefvar、モード変数の設定に使用される呼び出しが表示されます。ヘルプを読むと、defvar定義されているシンボルが無効である場合にのみ初期値が使用されることがわかります。一度存在すると、以降のdefvar呼び出しでその値は変更されません。


13

私があなたに与えることができる最善の答えは、の「インラインキーバインディング機能」から離れることだと思いますdefine-minor-mode。使用する

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

代わりに。次に、C-M-xこれらの定義を再評価するために使用できます。


1
defvar後に再度の価値を評価しませんC-M-x:)あなたは、必要があると思いますdefparameterか、別setf
wvxvw

@wvxvwが指摘しているように、これは実際には問題に対処していません。サンプルコードは、define-minor-modeマクロが行うのと同じこと、つまりdefvarマップを定義するための呼び出しを行っています。そのdefvarをもう一度評価しても効果はありません。
グルーカス

7
@wvxvw C-M-xeval-defun)を使用して再評価するdefvarと、変数が更新されます。これは特殊なケースeval-defunです; 呼び出したeval-buffer場合eval-region、または既存の値は変更されません。
ジル「SO-悪であるのをやめる」

ああ-それが重要なポイントのようです。
グルーカス

1
フォームではモードマップ変数自体のみを更新することC-M-xに注意してくださいdefvar。また、変更されたマップを「インストール」してマイナーモードにするにはC-M-xdefine-minor-modeフォーム上で行う必要があります。マクロを展開することで理由を解明しようとしましたが、それは私を超えています。
タイラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.