Linuxでemacs -nwでSuperを使用する


15

私は答えに対する簡単で直接的な質問を見つけるのに苦労してきたので、ここで質問することにしました。

Q: Linuxのターミナルで起動されたEmacsでSuperを使用する方法はありますか?

PS:私は多くの情報を読みましたがxmodmap、重要なことは、ターミナルエミュレータがスーパーキーを表すことができないことです。しかし、(kbd "s-SPC")何かを返すので、の翻訳機能を使用することを考えていました.Xdefaults/X。私は正しい道にいますか?の結果を考えると、kbdXTerm.VT100.translationsとして何を入れる必要がありますか?

回答:


21

X11 Emacsでは、端末のエンコードとデコードを行わずにキーボード入力を受信し、テキストを表示できます。テキストモードエディタを使用する主な理由は、リモートマシンの画面またはtmux内で実行することですが、Trampのおかげで、通常はローカルEmacsでリモートファイルを編集する方が簡単です。そうは言っても、Xtermの場合、ターミナルエミュレーターが協力している限り、必要なことを行うことができます。

端末でキーまたはキーの組み合わせを押すと、1つ以上の文字のシーケンスとして端末で実行されているアプリケーションに送信されます。たとえば、を押すaと、アプリケーションはを受け取りaます。を押すEnterと、アプリケーションは文字CR(別名^M(「control-emm」と発音)、別名文字番号13、別名\rまたは\015)を受け取ります。関係するキーの組み合わせAltは、通常、文字ESC(a.ka. ^[aka \eまたは\033)として送信され、その後にキーのシーケンスまたはキーなしのキーの組み合わせが続きAltます。ファンクションキーと他のキーの組み合わせは、\e[またはで始まるエスケープシーケンスとして送信され\eOます。

エスケープシーケンスは完全に標準化されておらず、端末は通常、特定のキーの特定の属性を無視します。たとえば、hyperおよびsuper修飾子は通常無視されます。シェルプロンプトでCtrl+ を押しVてからそのキーの組み合わせを押すC-qか、またはC-h cEmacsでキーの組み合わせを押すと、キーの組み合わせに対して端末が送信する内容を確認できます。

Xtermでは、Xリソースを介して各キーのエスケープシーケンスを設定できます。ほとんどのセットアップは~/.Xresources、Xの起動時からリソースを読み取りますxrdb -merge ~/.Xresources。ファイルを手動でロードするには、を使用します。

XTerm.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <Key> Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <Key> percent: string("\033[37;6~")

一般的な規則ではESC [ number1 ; number2 ~、修飾子付きのファンクションキーにフォームのエスケープシーケンスを使用します。number1(ファンクションキーを示し1524するためF5F12-歴史的な理由のために、F1を介してF4異なるエスケープシーケンスを有する)number2修飾子を示す(2ためShift5ためCtrl3ためMeta8のためCtrl+ Meta、及び+に1を追加Shift-いいえ、それは非常に一貫していないが)。

あなたはと、その数によってハイパーやスーパー修飾子を指定する必要がありますMod1Mod5。実行xmodmap -pmして、keysymsの修飾子へのマッピングを確認します。たとえば、Super_LがMod5にバインドされている場合、次の行(この正確なケースを使用)はSuper+のバインドを定義しますSpace

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

Emacsは、エスケープシーケンスを、input-decode-mapまたはlocal-function-key-mapfunction-key-mapEmacs 23より前)を介して内部キー表現に変換します。

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

この投稿は、80%のリサイクル素材で構成されています。すべてのキーの組み合わせを処理できるLinux端末はありますか?


これは素晴らしい答えであり、私が見つけたすべての知識を網羅しています。ただ一つの質問:どこで見つけましたか、どのように32; 16〜を選びましたか?そして、なぜそれが以下のemacsバインディングと一致しないのですか?私は数字の起源を理解するが、私はあなたのためのマッピングテーブルのどこかにリンクできるかどうかをお聞きしたいの数値1数値2
アンドレアリチャーディ14

@AndreaRichiardiスペースキャラクターのASCII / Unicode値である32と、標準バインディングではCtrl、Meta、およびShiftに最大8の値を使用するため、32を選択しました。次の33はタイプミスでした。他のキーと競合しない限り、何でも選択できます。
ジル 'SO-悪であるのをやめる' 14

シーケンスを関数にバインドする必要があったため、で一時的に解決しました(global-set-key "\033[32;16~" 'set-rectangular-region-anchor)。しかし、完全にするために、define-key上記を試してみましたが、トリガーできませんでした(global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor)。バッファに; 16〜だけを印刷していました。キーシーケンスをバインドし、他のコマンドに再割り当てできるように、そのシーケンスを(kbd "s-SPC")にバインドすると便利でした。
アンドレアリチャーディ14

C-h ls-SPCを押すと、次のようになります: ESC [ 3 2 ; 1 6 ~しかし、emacsはまだ文句を言っていますM-[ 32 is undefined
アンドレアリチャーディ14

@AndreaRichiardi xterm部分のタイプミスを修正した後(Emacsが意図した文字シーケンスを受け取ってから修正したようです)、それは私のために働きます。のfunction-key-map代わりに使用すると動作しlocal-function-key-mapますか?local-function-key-map端末に依存するため、いつ設定するかが問題になる場合があります。
ジル 'SO-悪であるのをやめる' 14

0

Emacsパッケージをインストールして端末を設定する場合は、Emacsと端末にすべてのPCキーボードキーと修飾キーの組み合わせを正しく認識する方法を教えることができるEmacsパッケージを作成しました。

https://github.com/Cyber​​Shadow/term-keys

スーパー修飾子のエンコードはデフォルトでは有効になっていませんが、パッケージはカスタマイズ可能であり、どの修飾子キーの組み合わせをエンコードするかを構成できます。Super修飾子を含むエンコードキーの組み合わせを有効にするには、when が非nil term-keys/want-key-p-funcを返す関数に設定します(説明については、デフォルトの実装を参照してください)。t(elt mods 3)


0

initファイルに次のものがあります。

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

これにより、ファンクションキーを使用してスーパーキーとハイパーキーを送信できます。


-1

短い答え:を使用しますKonsole

説明:

  • Emacs 'にlocal-function-key-mapはにエントリマッピングC-x @ sがありevent-apply-super-modifierます。
  • KonsoleSuper(Windowsロゴキー)をエスケープシーケンスにマップします(^X@sどこにも文書化されていないようですが、偶然発見しました)。Konsoleたとえば、を開いて押すと、これを試すことができCtrl-v Win-oます。

答えてくれてありがとう、しかし用語を変えることは私が探している解決策ではない。
アンドレアリチャーディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.