web-dev-qa-db-ja.com

Macターミナルで実行されているEmacsでC-M-%を使用してquery-replace-regexpを実行する

OS X10.6.2を実行しているMacBookProのターミナルプログラムで実行しているEmacsで正規表現の検索と置換を実行しようとしています。私の知る限り、これはC-M-%を押すことで実行できます(これはCtrl + Alt + Shift + 5を意味すると思います。Emacsを学び始めたばかりなので、間違っている場合は訂正してください)。しかし、私がそうすると、それは機能しません。

Mx query-replace-regexpと入力すると実行できます。実行すると、画面の下部にCM-%でも実行できるというリマインダーが表示されますが、CM-%を試しても何も起こりません。 。

編集:「メタキーとしてオプションを使用する」ターミナルオプションが有効になっていることを追加したいと思いますが、正常に動作しているようです。たとえば、alt-Bとalt-Fを使用して、bashとEmacsで一度に1つの単語を前後に移動できます。

編集2:端末タイプをデフォルトの「xterm-color」ではなく「xterm」として宣言するように端末を設定していることにも言及したいと思います。私はこの質問とは関係のない理由でそれを行いました(reverse-i-searchをキャンセルした後に色付きのプロンプトがおかしくなるのを防ぐため)。しかし、私は「xterm」と「xterm-color」を使ってEmacsで実験しましたが、どちらの方法でもC-M-%で同じ問題が発生します。

どうすればこれを機能させることができますか?

6
Elias Zamaria

GUIベースのアプリとは異なり、ターミナルベースのアプリ(内部で実行するほとんどすべてのアプリのようにTerminal Windows)は、感知できるキーの組み合わせに制限があります。端末が実際のハードウェアであったとき(Terminalxtermなどのプログラムでエミュレートされただけではありません)、DECのVT-100などの端末には Control キーですが、 他の特定のキーとの組み合わせでのみ機能します 。ほとんどの端末エミュレーションプログラムはVT-100(およびVT-102とVT-220を含むその後継プログラム)をエミュレートするため、実際に送信する方法はありません。 Control-Shift-5 (またはキーボードにあるC-%)を端末ベースのプログラムに変換します。

query-replace-regexpを、実際に何かを送信するキー(組み合わせ)にマッピングする方が幸運です。 「Fキー」は(通常)VT-220スタイルでマップされ、xterm-color termcap/terminfoエントリは解析方法を知っています(ただし、F1-F4/F5はVT-100スタイルである可能性があります!)。必要に応じて、Terminalを構成して、termcap/terminfoが期待するコードを送信できます(少なくとも、10.4 Terminalで送信できます)。裸のFキーまたは単一の修飾子(Shift、Control、またはOption)を使用してFキーにコードを割り当てることができます。修飾子は(ターミナルを介して)Emacs自体に渡されることはありませんが、それらの組み合わせの一部を、より高いファンクションキー(F14〜F20)のターミナルキーコードにマップできます(組み合わせがシステムショートカットによって取得されない限り)フルキーボードアクセス」、公開、およびスペース(?))。

(global-set-key (kbd "<f13>") 'query-replace-regexp) ; I have a full-sized keyboard with an F13 on it.

Terminalおよびemacsの設定によっては、F1-F4が正しく動作しない場合があることに注意してください。たとえば、私のシステム(10.4)では、Terminalは「[〜#〜] esc [〜#〜] OP」(VT-100キーコード)で構成されています。 F1の場合、ただしemacsは「[〜#〜] esc [〜#〜] [11〜」(「古い」xtermシーケンス)を予期します。 Terminal(⌘I;キーボード)またはemacs(以下を参照)のいずれかを再構成すると、キーはemacsで正常に機能します。

; Expect VT-100 key codes for F1-F4
(define-key function-key-map "\eOP" [f1])
(define-key function-key-map "\eOQ" [f2])
(define-key function-key-map "\eOR" [f3])
(define-key function-key-map "\eOS" [f4])
2
Chris Johnsen

function-key-mapC-h v function-key-map)をざっと見てみると、C-x @ cevent-apply-control-modifierにバインドされていることがわかりました。これは機能するように見えますが、ターミナル「メタキーとしてオプションを使用」オプションを使用してメタキーを送信する方法との相互作用が不十分です(通常の文字の前にESC文字を送信します)。

入力すると Control-x@cOption-Shift-5emacsC-x @ c ESC %を参照します。ただし、末尾のESC %M-%に変換する代わりに、人工的なControl修飾子をEscapeキーにバインドします。したがって、最終的にはC-ESC %として解釈されます。 2番目の人工修飾子シーケンスの最初のC-xが最初の人工修飾子を吸収するため、これらの人工制御修飾子とメタ修飾子をスタックしようとしても失敗します。

しかし、それは可能性を示しています:

; cargo cult adaptation of event-apply-control-modifier
(defun event-apply-control-meta-modifiers (ignore-Prompt)
  (vector
   (event-apply-modifier
    (event-apply-modifier (read-event)
                          'control 26 "C-")
    'meta 27 "M-")))
(define-key function-key-map (kbd "C-x @ %") 'event-apply-control-meta-modifiers)

今、あなたはタイプすることができます Control-x@Shift-5Shift-5emacsC-x @ % %を参照し、それをC-M-%として解釈し、最後にquery-replace-regexpを実行します。

1
Chris Johnsen

ターミナルで組み込みのemacsを実行しているMacBookPro2017のOSXSierraでのクエリ置換には、

<esc> % 

順番通りに。必要に応じて(キーボードレイアウトによって異なります)、同時<Shift>キーを使用して%記号にアクセスします。

<esc> C-%を試しましたか?わたしにはできる。

エスケープキーはメタにマップされることがよくあります(そしてalt(Macのオプション)はnot常にメタにマップされます)。唯一のことは、シフトキーのように押し続けるのではなく、押すだけです。

ところで-メタとしてaltを使用することに慣れている場合、次の質問は「Macターミナルでaltをメタにマップするにはどうすればよいですか?」です。ずっと前にStackOverflowで質問されたと思います: MacintoshのLispBoxのメタキーとしてのオプションまたはコマンドキー は、.emacsファイルに(setq mac-command-modifier 'meta)を入れることを提案しています。

私はちょうど解決策を見つけました(私は私のmacbookproのiterm2でemacsを実行しています)。

まず、C-h bを実行して、emacsの現在のキーバインディングを確認します。 (たとえば、C-sコマンドを使用して)C-M-%を検索すると、いくつかのエスケープシーケンスが実際にC-M-%にマップされていることがわかります。 iTerm2では、マップすることができます Control+Option+Shift+5 [設定]> [プロファイル]> [キー]( 画像 )のそのようなエスケープシーケンスの1つに移動します。次に、EmacsはそのエスケープシーケンスをC-M-%に変換します。これは、query-replace-regexpにバインドされています。今押す Control+Option+Shift+5 あなたがそれを望むように動作します。

両方を使用する同様の組み合わせの再マッピング Control そして Shift C- +なども同じ方法で実行できます。これがデフォルトの端末で可能かどうかはわかりません。

詳細については、 この質問 を参照してください。

1
Tanner