キーシーケンスが実際に行うことを確認する方法


14

テキストを編集するときに、予期しない動作を時々観察します。私の最初の手段は、通常C-h k、特定のキーシーケンスによって呼び出されている関数を見つけるために使用することです。ただし、ドキュメントが観察された動作と矛盾する場合があります。これらの場合、私は通常、他のパッケージがその関数またはキーシーケンスにフックし、その動作を変更していると想定します。

キーシーケンスにどの 関数がフックしているかを調べるにはどうすればよいですか?

最近出会った一例は、"キーを押して、アクティブ領域の最初と最後に引用符が挿入されたことです。これはデフォルトのEmacsの動作ではないのではないかと疑われたため、C-h k "実際にどの関数が呼び出されているのかを調べていました。

describe-keyドキュメントには、関数があることを私に言ったself-insert-command、組み込みの関数である、と呼ばれていました。長い話を短くするために、ある程度の試行錯誤の後、私は行動がによって引き起こされたと判断することができましたelectric-pair-mode。将来、疑わしいパッケージを一度に1つずつオフにして犯人を見つけるよりも、この結論に達するより速い方法がありますか?


electric-pair-modeいくつかのメジャーモードでのみアクティブ化された可能性はありますか?あなたはまだご覧くださいself-insert-commandのために"あなたが行うときC-h kながらelectric-pair-modeアクティブになっていますか?
カウシャルモディ14

@kaushalmodi:キーバインドを変更するのではなく、にelectric-pair-modeフックすることで機能することがわかりましたpost-self-insert-hook
nispio 14

C-h kキープレスで何が起こるかを正確に伝えます。のドキュメントを見ると、コマンドの終了後に実行されるself-insert-commandことが非常に明確に示されてpost-self-insert-hookいます。
shosti 14

@shosti:この簡単な例では、はい。しかし、拡張機能がafter-change-functionsJordonのように使用しているとしたらどうでしょうか?関数のドキュメントでは、おそらくそのフックについて具体的に言及していませんか?
nispio 14

申し訳ありませんが、私はもっと具体的にすべきでした。C-h k+標準フック==完全な動作(多かれ少なかれ)。もちろん、それは多くの可能性を残しますが、それは私が知っている他の複雑なソフトウェアシステムよりもはるかに透明です。
shosti 14

回答:


13

キーを1回押すだけで何ができるかを正確に知る簡単な方法はありません。

追加の動作が見られる場合は、常に共通のフックを確認してください。こちらのリストをご覧くださいhttp : //www.gnu.org/software/emacs/manual/html_node/elisp/Standard-Hooks.html

ほとんどの場合、重要なものは次のとおりです。

  • 変更後の機能
  • 変更前の機能
  • 最初の変更フック
  • ポストコマンドフック
  • プリコマンドフック
  • 自己挿入フック後

これらのフックを調べ、含まれている関数を調べて、どのフックが動作を変更しているかを確認する必要があります。

これらのフックの関数が、観察された動作を完全に説明していない場合は、のドキュメントに表示されるアドバイスの関数を確認してくださいdescribe-function


編集:私はより良い機能を1つずつを行くよりもフックを記述するのに役立ついくつかの機能を書いている:https://gist.github.com/jordonbiondo/bad03e44bb053db0f1eb あなたが使用できるdescribe-hook他の機能について説明のようにそこに定義されました。出力のサンプルを次に示します。

そして、要点が消えた場合のすべてのコードは次のとおりです。

(defun guess-all-hooks ()
  "Return a list of all variables that are probably hook lists."
  (let ((syms '()))
    (mapatoms
     (lambda (sym)
       (if (ignore-errors (symbol-value sym))
           (let ((name (symbol-name sym)))
             (when (string-match "-\\(hook[s]?\\|functions\\)$" name)
               (push sym syms))))))
    syms))

(defun face-it (str face)
  "Apply FACE to STR and return."
  (propertize str 'face face))

(defun describe-hook (hook)
  "Display documentation about a hook variable and the
functions it contains."
  (interactive
   (list (completing-read
          "Hook: " (mapcar (lambda (x) (cons x nil)) (guess-all-hooks)))))
  (let* ((sym (intern hook))
         (sym-doc (documentation-property sym 'variable-documentation))
         (hook-docs (mapcar
                     (lambda (func)
                       (cons func (ignore-errors (documentation func))))
                     (symbol-value sym))))
    (switch-to-buffer
     (with-current-buffer (get-buffer-create "*describe-hook*")
       (let ((inhibit-read-only t))
         (delete-region (point-min) (point-max))
         (insert (face-it "Hook: " 'font-lock-constant-face) "\n\n")
         (insert (face-it (concat "`" hook "'") 'font-lock-variable-name-face))
         (replace-string "\n" "\n\t" nil
                         (point)
                         (save-excursion
                           (insert "\n" sym-doc "\n\n")
                           (1- (point))))
         (goto-char (point-max))
         (insert (face-it "Hook Functions: " 'font-lock-constant-face) "\n\n")
         (dolist (hd hook-docs)
           (insert (face-it (concat "`" (symbol-name (car hd)) "'")
                            'font-lock-function-name-face)
                   ": \n\t")
           (replace-string "\n" "\n\t" nil
                           (point)
                           (save-excursion
                             (insert (or (cdr hd) "No Documentation") "\n\n")
                             (1- (point))))
           (goto-char (point-max))))
       (help-mode)
       (help-make-xrefs)
       (read-only-mode t)
       (setq truncate-lines nil)
       (current-buffer)))))

それは、機能がアドバイスされると、ドキュメントが変更を反映するように自動的に更新されるということですか?
nispio 14

実際のプロパティが更新されるかどうかはわかりませんが、によって返される値documentationは更新されて反映されます。
ジョーダンビオンド14

1
@nispioはい、そうです。
マラバルバ14

1
私の意見では、gist.github.com / jordonbiondo / bad03e44bb053db0f1ebのコード/関数を 答えに含める必要があります。SEの回答には30,000文字の制限があると思います。
Faheem Mitha

4

おそらくあなたの質問に対する完全な答えではないかもしれませんが、パッケージ helm-descbindsはショートカットのASCII表現からすべての定義されたキーボードバインディングを検索するのに役立ちます。ヒットするたびに、キーボードショートカットに関連付けられたインタラクティブな機能helm-descbindsが表示れ、それを説明するように依頼したり、検索結果から直接実行したりできます。

ここに画像の説明を入力してください

GitHubサイトのパッケージの説明は次のとおりです。

Helm Descbindsは、現在アクティブなキーバインディングをhelmでインタラクティブに検索できるようにする、emacsの記述バインディングへのインターフェイスを提供します。

さらに、次のアクションがあります

  • コマンドを実行する
  • コマンドを説明する
  • コマンドを見つける

またC-z、現在のコマンドの永続的な説明が表示されます。


2
これは素晴らしい。私は間違いなくこれをバインドしC-h bます。私の唯一の願いは、私が実際のキーシーケンスを入力する代わりに出て次のように入力して、リスト上の項目にジャンプできることであるC - c _ C - p
nispio
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.