コマンドライン操作やターミナル上でのエディタで使う修飾キーとしては基本的にControlボタンが多いですが、 メタキーを使ったショートカットも色々とあって知ってると結構便利だったりします。
メタキーと言うものは現在の通常のキーボードには殆どないわけですが、 Escキーを押してから文字キーを押す、と言う操作で代替されています。 もっと一般的にはAltキーやMacのCommandキーがメタキーの代わりに使えたりします。
が、MacのターミナルアプリやiTermなどでは通常これらのキーがターミナルへのメタキー信号として 送られません。
そこでその辺を使うための設定について。
iTermでのメタキー設定
iTermでは通常Commandキーを使ったショートカットは メニューにある操作(⌘-Nで新しいWindowを作ったり⌘-Vで貼り付けたり) に当てられ、Commandキー自体がメタキーとして送られることはありません。
メタキーを使うためには、Preferencesで Profilesにある使っているProfileに行き、 中にあるKeysのオプションの Left option (⌥) key acts as:にある項目で +Escを選びます。
これによってOptionキー(symbol)がメタキーとして使える様になります。
左と右のオプションがあるのでそれぞれ使いたいものを。
Normalだと通常のオプションキーになりますが、ターミナルでの入力では 特殊文字が入力できたりしますが普通は使わないと思うので両方潰してもかまわないと思います。
Metaと言う項目があって、これが本来のメタキーの様な役割ではあるのですが、 これを選択すると、
You have chosen to have an option key act as Meta. This option is useful for backward compatibility with older systems. The “+Esc” option is recommended for most users.
と言うWarningが出ます。
実際どの様な信号をそれぞれで出してるかきちんと理解してないですが、 通常のメタキー操作として使いたい場合には最後の”+Esc”を選択するべきです。 Metaを選んで入力してみると文字化けしたものが入力される様な状態でした。
というわけで、”+Esc”を選べばOptionキーがメタキーとして使えるわけですが、 ボタン操作的にやはりCommandキーのところでメタキーを使いたいので、 その場合はPreferencesにある全体のKeysの項目に行き、 Remap Modifier KeysでOptionとCommandキーの入れ替えの設定をします。
これでEmacsやコマンドラインで⌘-Fで一単語進む、的な 操作が出来る様になります。
一方、ペーストや新規Windowを作ったりの作業は⌥-Vなどで 代用することになります。
ペーストなど一部のCommandキー操作だけはCommandをそのまま使いたい、ということであれば、 ProfilesのKeysでキー毎の設定が出来るので、ここで Keyboard Shortcutに⌥-Nに ActionとしてNew Window with Profile…を選んだりすれば メタキーを送らずに本来のCommandキー操作の動作に戻すことが出来ます。
自分設定ではこのNと、⌥-Vに Pasteを割り当てています。
逆にメタキーで使いたいものの方が少ない、と言う場合には 全体のKeysでのSwapはしないで、 必要なキーだけ⌘-Fに ActionでSend Escape Sequenceを選んで送るキーにFを選択する 等の設定をすることも出来ます。
追記: 2018/04/17
iTermが新しくなって(3.1.5かそれより前から)EditメニューにEmoji & Symbolsという項目が ⌃⌘Spaceに割り振られる様になりました。
これが自分の使ってるIMEの設定とconflictしてしまうのでこの方法はやめて 下にあるKarabinerを使う方法をKarabiner-Elementsで実装して 使うようにしています。
その方が直接手でいじるものも少なくなって良いかと。
追記ここまで
ターミナル.appでのメタキー設定
ターミナル.appでも環境設定からプロファイル、キーボードに進むと メタキーとしてOptionキーを使用という項目があります。
これを選択するとiTermで”+Esc”を選んだときと同様メタキーが使える様になります。
こちらは左右が選べないので同時に変更するしかないのと、 他に修飾キーの変換方法が無いのでターミナル.appだけだと Commandキーでメタキーを送ることは出来ずにOptionキーを使うしかありません。
以前までやっていたこと
一番最初はiTermでキー毎の設定をしていたんですが、 数が多いと設定が結構面倒なので最終的には Karabinerを使って必要なキーをEsc+Keyとして送る様に設定していました。
これだとターミナル.appでも同時に設定できるので。 この中でもN、V、W以外は設定していて量が多いですが 書くだけならすぐ書けるので1
なんですが、macOS SierraにアップグレードしてKarabinerが使えなくなったため この設定が効かなくなってしまったのでiTermの設定の中で再設定しました。
同じような設定をBetterTouchToolでも出来るかな、と思ったんですが どうもシグナルを捉えるレベルの違いからかBetterTouchToolからだと 変更が思った通りには効きませんでした。
メタキーを使ったショートカットですが、 .inputrcファイルに設定を書いておくことでコマンドラインで自分で設定することも出来ます。 コントロールキーを使ったショートカットは殆どがデフォルトの操作で埋まっていて 潰したくないものが多いため 何かショートカットを追加したい場合にはメタキーに付けると便利です。 デフォルトでの機能が付いてるキーもありますが、 機能を知っても使わなそうなものも多いので使えるキーは結構あると思います。
色々設定してますが、一番のお勧めは、
"\eu":"\C-ucd ../;ls\C-m"
で、これは⌘-Uで一つ上のディレクトリに移動します。
その後ls
で内容表示してますがこれは好みで。
後、メタキーではないですが、よく使うものとして、
# grep prefix
"\C-g": ""
# grep -r "" ./ # and avoid svn/git
"\C-g\C-r": "\C-ugrep -I -r \"\" ./|grep -v \"\\.svn\"|grep -v \"\\.git\"\C-a\ef\ef\ef\C-f\C-f"
"\C-gr": "\C-ugrep -I -r \"\" ./|grep -v \"\\.svn\"|grep -v \"\\.git\"\C-a\ef\ef\ef\C-f\C-f"
# find ./
"\C-g\C-f": "\C-ufind ./ -name \"**\" 2>/dev/null|grep -v \"\\.svn\"|grep -v \"\\.git\"\C-a\ef\ef\C-f\C-f\C-f"
"\C-gf": "\C-ufind ./ -name \"**\" 2>/dev/null|grep -v \"\\.svn\"|grep -v \"\\.git\"\C-a\ef\ef\C-f\C-f\C-f"
こんな設定を書いておくと、 ⌃-R Rと打つと、
$ grep -I -r "" ./|grep -v "\.svn"|grep -v "\.git"
と入力され、カーソルキーが最初の""
の位置に行きます。
これは現在のディレクトリ以下にあるファイルの中身をgrep
で検索するコマンドです。
SVNやGitのディレクトリでもよく使って、これらの設定ディレクトリは外したいので外すような設定を入れています。
find
のは現在の居るディレクトリ以下から指定の文字列を含んだファイル、ディレクトリを検索します。
こんな感じで複数の組み合わせのショートカットも出来るので色々便利。
長いコマンドを関数やエイリアスとして設定する方法もありますが、 こういったショートカットに割り当てておくとより簡単に呼び出せて便利だったりもします。
-
(⌘-Wはウィンドウを閉じる、ですが、その後 ターミナルとかでは間違って閉じたく無いので他で無効化してたので、 実はここで抜かなければよかっただけだったり。 ↩