キーバインディングを定義するにはどうしたらいいですか?

vimにはキーバインディングを定義するための非常に優れた機能があります。

vim docs から:

:cno[remap] {lhs} {rhs}     |mapmode-c| *:cno* *:cnoremap*
            Map the key sequence {lhs} to {rhs} for the modes
            where the map command applies.  Disallow mapping of
            {rhs}, to avoid nested and recursive mappings.  Often
            used to redefine a command.

基本的に:cnoremap コマンドはキーバインドを作成しますが、それ以上の再定義は禁じられています。これはvimのキーバインドをいつも簡単に定義できるようにしました。しかし、emacsではそのようなコマンドはわかりません - 現在、私はキーバインディングを定義するために(global-set-key [f8] 'my/copy-to-clipboard)のようなコマンドを使用します。残念ながら、これは本当に痛みです。なぜなら、他のパッケージが(私の場合、 evil パッケージ)簡単に再マッピングできるからです。

emacsでキーバインディングを定義するにはどうしたらいいですか?設定されると変更できません。


Important edit: I don't want to restrict what can be done to lhs - I want just prevent a redefinition/modification of rhs.

0
@wasamasa:(1) は禁止されていません。しかし、これは通常、ユーザーのために予約されています(あなたが言うように)。 (2)OPはユーザであり、ここでの使用はユーザ(「私のキーバインディングを定義する」)である可能性があります。 に予約されていることをライブラリの作者に思い出させるのは良いことですが、ちょうど1つの意見。
追加された 著者 Ryan Eastabrook,
@philsそのリンクをありがとう、私はそれを試してみましょう。 (Btw。私は実際に使用するキーバインドを追加しました。前者はこのサイトの別の質問からコピーされたものです)。
追加された 著者 Alex Rigos,
@VanLaserはあなたの第二の質問の結果であるあなたの最初の質問ではありませんか?しかし、あなたの質問に答えるために、私はそれを定義したのとまったく同じように、特定の関数を実行するために F8 (または他のキーやキーシーケンス)を定義したいと思います。 (そして、私にとって、これは誰も/パッケージがないと私がそれをやり遂げるのを妨げることを意味します。つまり、私のキーバインディングは、他のパッケージで定義されたすべてのキーバインドを上書きする必要があります)
追加された 著者 Alex Rigos,
@wasamasaああ、これは私が持っている別の問題を説明すると思う - ありがとう:D(しかし、私は別のコメントで言ったように、私の質問は C-c m
追加された 著者 Alex Rigos,
@VanLaserああ、そう。基本的には、意図しない rhs の再定義を防ぐ方法を探していました。 lhs で最初にやってみたいことは考えていませんでしたが、今は lhs の変更/再定義を制限しないようにしました。良い点、私は私の質問でそれを説明します。
追加された 著者 Alex Rigos,
FYIでは、F5とF9の間のキーがユーザー用に予約されているため、F8の再マッピングは禁止されています。
追加された 著者 ICodeForCoffee,
問題は混乱しています(私にとっては) - あなたは、 rhs の部分が "そのまま"そのままの状態であると言いますが、誰でも別のリマップを作成して lhs < code>(つまり、あなたが作成したコマンド)。だから、 F8 が特定のシーケンス、特定の/固定の意味を持つシーケンス、または他の誰も F8 ?これらは私が見ているように、2つの異なるものです。
追加された 著者 Menoa Tree,
@ googley - あなたが引用したvimの助けを借りて、誰かがあなたの lhs 他のコマンドに再マッピングすることを止めません。あなたはXを望んでいますが、Yを引用し、 は混乱しています。基本的に F8 は別のコマンドを実行することができますが、 F8 が呼び出しているコマンドを単純に書き直すこともできます(同じ名前だが、何か他のもの) - それは第2の問題であり、第1に関係なく、オリジナルのvim help quote(!)に近い。
追加された 著者 Menoa Tree,
私はあなたができないと確信しています。あなたができることは、他のほとんどのキーマップより高い優先度を持つキーマップを使うことです。多くのユースケースについては、 stackoverflow.com/q/683425 が良い解決策です。 helm-find-files-map のような特定のキーマップの場合、元のキーマップを継承するカスタムキーマップをhelmで使用することが期待されます。他のコードでは元の名前に変更されますが、常に新しいマップにカスタムバインディングを定義することができます。
追加された 著者 Mark Ireland,

1 答え

@phils(特にこのstackoverflowの答え)のコメントのおかげで、私は今解決策を見つけました:

(defvar my-keys-minor-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map [f8] 'my/copy-to-clipboard)
    (define-key map  [C-x b] 'helm-mini)
    map)
  "my-keys-minor-mode keymap.")

(define-minor-mode my-keys-minor-mode
  "A minor mode so that my key settings override annoying major modes."
  :init-value t
  :lighter " my-keys")

残念ながら、(define-key map(kbd "Cx b") 'helm-mini)を使用したキーバインディングスタイルは機能しませんでした。ミニ)と同じです。 ( C-x b はevilコマンドにバインドされる前です)

ありがとう!

0
追加された
おそらくあなたが望むのは [C-x?b] です。これは、 b という文字であり、擬似ファンクションキー ではありません。
追加された 著者 Ryan Eastabrook,
ハァッ? Cx というラベルの付いた存在しないファンクションキー)にバインドされます。 [Cx b] b )。かなり確かな(kbd "C-x b")が正しいです。
追加された 著者 alastairs,
まあ、私は少し混乱しています。 [Cx?b] で同じ動作を再現することもできます。だから私はどこかでエラーを再現する際にエラーを作りました。しかし、残念ながら、私は間違いが何であったかを知る時間がありません。
追加された 著者 Alex Rigos,