ターミナル使用時のキーバインドの問題


30

私は次の行を持っていますinit.el

(global-set-key [(control \;)] 'comment-region)

GUIウィンドウでは非常にうまく機能しemacsますが、-nwオプションで呼び出された場合、C-;領域をコメント化せず、;文字を挿入するだけです。M-x comment-region RETただし、正常に動作します。

私は同様の問題でこの答えに従うことを試みましたC-q C-;が、ちょうど戻り;、私は明らかにむき出しにしたくありません;

望ましい効果を達成する方法


4
ご使用の端末(ところで、何を使用していますか)がそのコマンドシーケンスを認識しない可能性があります。使用してみてC-;コンボをしてから使用しM-x view-lossageてもEmacsのになってきたかどうかを確認します。
ダン

私が使用しているgnome-terminal、とM-x view-lossageリターン:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
WeSenseASoulInSearchOfAnswers

3
ターミナルの問題のように見えます:そのキーの組み合わせがEmacsに届くとしたら、それはC-;むしろc ;(または、少なくとも、私は得ますC-;)のように見えます。
ダン

@ダン:それを答えとしてあげていただけますか?これにより、質問に回答済みのマークが付けられ、解決策が見やすくなります。これは、同じ問題を抱えている他の人にとっては良いことです。ありがとう!
ティコンジャービス14年

要約し、さらに読むための追加リンクとともに投稿します。また、質問のタイトルを編集して、より一般的なものにします。
ダン

回答:


17

まず、より一般的な問題:端末エミュレーターは、送信できる制御およびエスケープシーケンスが制限されることがよくあります。そのため、端末が特殊文字をEmacsに到達する前に飲み込むことがあります。一般的な診断として、キーの組み合わせがEmacsに含まれるかどうかを確認C-h l(またはM-x view-lossage)できます。

この問題の詳細については、このStack Overflowスレッドとその中のリンクをご覧ください。

コメントの前後をまとめると、あなたの特定の問題は、問題はEmacsではなく端末であることを示唆しています。あなたが試みてC-;、それからM-x view-lossage、あなたは得ましたblah blah blah c ; ESC v i e w - l o s s a g e RET。これは最終的な問題のように見えます。キーの組み合わせがEmacsに到達している場合、そのc ;部分はのようになりC-;ます。


33

シフトアップ+端子にEmacsが認識されないアプリケーションや端末に送信する文字との間のインターフェース(むしろまたはバイト)ので、私はキー、端末はエスケープシーケンスに最もファンクションキーを変換する方法を説明しません。いくつかの修飾子と文字の組み合わせのみが独自の文字を持っています。

  • Ctrlプラス文字または@[\]^_バイト0〜31(ASCII 制御文字)に変わる1つ。
  • 多くの場合、Ctrl+ ?はバイト127になり、Ctrl+ SpaceCtrl+ @(バイト0)と同等です。
  • 一部のファンクションキーは、制御文字と同等です:Tab= Ctrl+ IReturn= Ctrl+ MEsc= Ctrl+ [
  • そして、構成に応じてBackspace= Ctrl+ HまたはCtrl+ ?Ctrl+ ?はヘルプなので、Ctrl+ HはEmacsにとってより便利です。
  • Meta+ characterEsc文字の後に送信されます

では、Ctrl+ ;Ctrl+ Shift+ などの他の組み合わせはどうletterでしょうか?対応する文字がないため、端末は文字を再利用するか、エスケープシーケンスを送信する必要があります。多くの端末は、対応する文字がない場合に修飾子を無視します。そのため、Ctrl+ ;送信;Ctrl+ Shift+にletter相当するCtrl+ letterなどになります。

ターミナルベンダーは長い間シンプルなことを続けていました。自己永続的なエスケープシーケンスの標準はありませんでした。ターミナルベンダーはそれを実装せず、アプリケーションはそれをサポートせず、ユーザーはそれを期待していません。ターミナルエミュレータの中には、任意のエスケープシーケンスを送信するように構成できるものがあります。したがって、可能であれば、Emacsにエスケープシーケンスを構成して宣言できます(これについては後で説明します)。

エスケープシーケンスを標準化するための2つの提案があったため、最近状況は変化しています。1つは、構文を使用したLeoNerdのlibtermkeyです。もう1つは、構文を使用したThomas Dickeyのxtermです。リソースを設定することにより、xtermの現在のバージョン(216以上)をどちらの構文にも構成できます。を0以外の値に設定して、機能をアクティブにする必要があります。ESC [ codepoint ; modifier uESC [ 2 7 ; modifier ; codepoint ~formatOtherKeysmodifyOtherKeys

端末エミュレータがこれらの構文をサポートしていないが、構成できる場合は、どちらかを選択します。

Emacs 24.4以降modifyOtherKeys、端末がxtermバージョン≥216であることを検出すると、Emacsは自動的に機能をオンにします。Emacsのキーをエンコードするエスケープシーケンスの検出は、変数を介して機能しますlocal-function-key-map。Emacs 24.4の時点では、すべてのエスケープシーケンスがサポートされているわけではありません。initファイルで次のコードを使用して、ジョブを完了することができます。

;; xterm with the resource ?.VT100.modifyOtherKeys: 1
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
  "Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
  (if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
                                                (and (<= ?a c) (<= c ?z)))
                                            (logand c ?\x1f)
                                          (logior (lsh 1 26) c))))
  (if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
  (if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
  (vector c))
(defun my-eval-after-load-xterm ()
  (when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
    (let ((c 32))
      (while (<= c 126)
        (mapc (lambda (x)
                (define-key xterm-function-map (format (car x) c)
                  (apply 'character-apply-modifiers c (cdr x))))
              '(;; with ?.VT100.formatOtherKeys: 0
                ("\e\[27;3;%d~" meta)
                ("\e\[27;5;%d~" control)
                ("\e\[27;6;%d~" control shift)
                ("\e\[27;7;%d~" control meta)
                ("\e\[27;8;%d~" control meta shift)
                ;; with ?.VT100.formatOtherKeys: 1
                ("\e\[%d;3u" meta)
                ("\e\[%d;5u" control)
                ("\e\[%d;6u" control shift)
                ("\e\[%d;7u" control meta)
                ("\e\[%d;8u" control meta shift)))
        (setq c (1+ c))))))
(eval-after-load "xterm" '(my-eval-after-load-xterm))

TERM環境変数がに設定されていない場合、xtermまたはなどのバリアントではxterm-256color、Emacsはこれらのシーケンスをアクティブにしません。Emacsがの値を既にサポートしている場合、名前がの値であるLispファイルをロードしたTERM後に実行される上記のような関数を定義することにより、サポートを追加できますTERM。Emacsにそのようなサポートがない場合は、のtermどこかにサブディレクトリload-pathを作成し、term/$TERM.elwhere $TERMの値がのLispファイルを作成し、TERMという関数を定義することで追加できますterminal-init-$TERM

私が書いているように、これらのエスケープシーケンスを採用しているxterm以外の端末エミュレータはほとんどないようです。OSXでは、キーの組み合わせごとにエスケープシーケンスを1つずつ選択することにより、iTerm2を構成できます。


2
このテーマに関するあなたの答えは常に素晴らしいです、Gilles。とても有難い。
phils

すばらしいです!。これらのシーケンスを送信するurxvtの作成方法を見つけるのは非常に困難ですが。手を貸してもらえますか?)
Amos

@Amos私はrxvtを使用しません。UnixおよびLinuxでは、urxvtがmodifyOtherKeysを使用してxtermと同じエスケープシーケンスを送信する方法を尋ねる必要があります。
ジル 'SO-悪であるのをやめる'

macOS xterm-256colorでは機能しません。M-C-%認識されるESC 5
LoranceChen

@LoranceChenこれmodifyOtherKeysは、機能がアクティブでない場合に予想される動作です。xtermの最近の十分なバージョンでのみサポートされており、Emacs 24.4以降で自動的にアクティブ化されることに注意してください。OSXに最新バージョンが付属しているかどうかはわかりません。うまくいかず、うまくいかない場合は、新しい質問をすることをお勧めします。使用しているバージョンに言及してください。
ジル 'SO-悪であるのをやめる'

2

Gillesの答えは次のように述べています:On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one. 私はそこに着くのに少し苦労したので、ここにあなたが私のように混乱している場合の詳細な説明があります。

Emacsをターミナル(MacのデフォルトのTerminal.appなど)でC-x C-;実行comment-lineしているときに、その機能が必要な場合は、iTerm2(Terminal.appには機能がありません)に切り替えて、キーマッピングを作成する必要があります次のようにプロファイル...キーの下で:

^;     ^[[59;5u

これは+、「キーボードショートカット」と呼ばれる小さなウィンドウを表示するボタンをクリックすることで実現されます。このウィンドウには最初に2つのフィールドがあります。上部の値は「クリックして設定」、下部の値は「無視」です。上のボタンをクリックして、を入力しC-;ます。これにより、アクションとコードを実行するキーの組み合わせが設定されます。下部のフィールド「アクション」をクリックして、「エスケープシーケンスの送信」を見つけてクリックします。クリックすると、「Esc +」という3番目のフィールドが表示されます。このフィールド内で、次を入力します。

[59;5u

59カンマの小数点以下のASCIIコードである、と5のコードですCtrl。次に、「OK」を押して終了します。正しいキーコンボとキーシーケンスがiTerm2の設定に含まれるようになりました。iTermでEmacsを起動すると、C-x C-;機能にアクセスできるようになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.