私はマイナーモードを定義しようとしていますが、それを模倣していますisearch-mode
(これは一種のインタラクティブな検索と置換ツールであるため、良い出発点になると思いました)。私のコマンドは(グローバルキーバインディングでテストされて)うまく機能しますが、ローカルで(マイナーモードマップで)いくつかのキー、つまりTABとRETにバインドすることに深刻な問題があります。私はこのようなことをしています:
(defvar my-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\s" 'my-command)
(define-key map "\t" 'another-one)
(define-key map "\r" 'yet-another)
map))
(もちろん、キーマップをマイナーモードマップアリストに入れました。)
スペースバウンドコマンドは正常に機能しますが、TABとRETはどういうわけか機能しません。たとえば、「\t」を「[f11]」に変更すると、正常に機能します。「ベクトル表記」([?\ t])を使用してみたところ、同じ結果が得られました(Ch Cvを実行した後、キーマップを作成しても驚くことではありませんでした)。何が起こっているのでしょうか?
編集:問題を明確にするために、私はそれを分離しようとしました、そして私は次のコードを思いつきました。tabbang
Tabキーで感嘆符を挿入する、人工的な、かなり最小限のマイナーモードが必要だとします。私はこれをやっています:
(defvar tabbang-mode)
(add-to-list 'minor-mode-alist '(tabbang-mode tabbang-mode) t)
(defvar tabbang-mode-map
(let ((map (make-sparse-keymap)))
(define-key map [?\t] 'tabbang-insert-bang)
(define-key map [?\C-\t] 'tabbang-insert-bang)
(define-key map [f11] 'tabbang-insert-bang)
(define-key map [?\r] 'tabbang-done)
(define-key map [t] 'tabbang-other-char)
map))
(add-to-list 'minor-mode-map-alist `(tabbang-mode . ,tabbang-mode-map) t)
(defun tabbang-insert-bang ()
(interactive)
(insert "!"))
(defun tabbang-mode ()
(interactive)
(setq tabbang-mode " tabbang"))
(defun tabbang-other-char ()
(interactive)
(tabbang-done)
(setq unread-command-events
(append (listify-key-sequence (this-command-keys))
unread-command-events)))
(defun tabbang-done ()
(interactive)
(setq tabbang-mode nil))
私のtabbang-mode
場合、「その他」のキーは正しくモードを終了して自分自身を挿入しますが、f11はバングを挿入し(正しい)、TABはモードを終了しません(正しい)が、何も挿入しません(間違っています)、C-TABは「未定義のキー」エラーを生成します(間違いなく間違っています)、RETはモードを終了します(正しい)が、改行を挿入します(間違っています)。そして、他のコードが介入しないように(site-fileと.emacsをロードせずに)「新鮮な」emacsを試してみました(yasnippetがTABなどをキャプチャするのを恐れていました)。