新時代だし、対話シェルキーバインドの棚卸しにCtrl+A〜Zの挙動に思いを馳せてみた

2019.05.02

はじめに

こんにちは、平野です。

ついに令和になりましたね。 私なんかはつい「令和最初のブログは何にしよう?」とか考えてしまいます。 そういうのに惑わされずに淡々とブログを書けるようになりたいです。

さて、連休中にターミナルのキーバインドを棚卸ししたいな、と思って色々考えていました。 私は極力デフォルト動作を崩したくないという思いがかなり強いので、 ctrl+アルファベットのキー操作のデフォルト挙動を整理して、 どのキーなら潰して他の機能にしても良いかを改めて考えてみました。

もちろんキーバインドは各人それぞれが自由に設定すべきなので強制するような意思は全くないです。 ただの読み物として読んで頂ければと思います。

キーバインドを考える方針

デフォルト操作を上書きして変更する(「潰す」と表現)場合の指針として主に以下のことを考慮します。

  • 手が覚えて無意識に行うような操作は変更しない
    • カーソルの操作や文字列の削除など、慣れたらほぼ無意識に行うようなものは極力変更しない
    • これはデフォルト環境を操作する際のスピード&安定性アップにもなりますので、非常に重要だと思います。
  • デフォルト操作の環境を触る時に、誤爆する危険性を考慮する
    • 自分の環境をゴリゴリにカスタマイズした上でデフォルトの環境を触ると非常に使いづらいだけでなく、 普段気軽に押せるキーを押したら予期しない動作をする、というような誤爆の恐れがあります。 よって、誤爆の危険性が高いものはあまり潰したくないです。
  • 他人が自分のターミナルを触る時に違和感を少なく
    • これは機会としては多くないので、それほど重視はしませんが、 あまりにも突飛なキーバインドは結果として自分を苦しめるので、それをしないための戒めとして想定します。
    • また、実は便利な機能があるのに知らずに潰していた、というのを指摘されるのは恥ずかしいです。
  • 矢印キーはよりOS寄りのレイヤーでマッピングする
    • Macではkarabiner、WindowsではAutoHotKeyを使って、英数(スペースの左隣)+hjklを矢印に割り当てています。
    • 矢印キーまで指を持っていくことで思考が分断されるなんて言語道断です。
    • 以下で「矢印キーで代用」のような表現がありますが、それは物理的な「矢印キー」を押すのではなく、 ホームポジションを崩さないようなマッピングを採用した上での話です。
  • Controlaの左隣に
    • 当然です。
    • 他人のコンピュータを触ったらCapsLockだった、という場合には、 Controlというキーは存在しないものと考え、ひたすら矢印とかで頑張った方が結果的に早い気がします。

想定する環境

私は普段zshを使っていますが、zshはデフォルトではbashとほとんど差異はないので、 多分bashのデフォルトの話になっていると思います。 手元のMacでのbashの動きを基本として書いているので、当然別環境では別の動きというものもありますがご容赦ください。

各キー操作

  • ctrl+a
    • カーソルを先頭に。絶対必要。コマンドラインでは一番先頭に起動アプリケーションを指定するため、そこをすぐに修正できるコマンドが非常に重要。GNU Screenのデフォルトプレフィックスであるが、多くの人がまず最初にプレフィックスを変える必要に迫られるくらい重要。
  • ctrl+b
    • カーソルを左に。非常に基本的なコマンドなので潰してはいけない。矢印キーで代用できるが、他人が触った時にこのキーを潰していることがバレると長いお説教が始まるかもしれない。tmuxのデフォルトプレフィックスなので、こちらもまずはプレフィックスの変更が必要。
  • ctrl+c
    • コマンドを中断。重要。超重要。最重要。絶対に潰してはいけない。というか、普通にキーバインドを設定するだけでは潰せない。
  • ctrl+d
    • EOFを送出。間違って押して泣きを見るキー。コマンドラインがカラの時押すとセッションが切断される。これを無効にする設定をしている人は少なくないはず。文字が入った状態で押すと1文字削除されるがちょっと怖くて常用は厳しそうなので、潰して別のキーバインドに割り当てるのに適したキー。ただし、デフォルト設定の他環境を操作する場合に誤爆するとかなり痛い。
  • ctrl+e
    • カーソルを末尾に。ctrl+aと並んで重要。後ろにコマンドを付け加えて入力する機会は多いため、潰してはいけない。
  • ctrl+f
    • カーソルを右に。ctrl+bと同様。fbよりも左にあり、キーの配置と動作が逆転してしまっているので、個人的には矢印キーを使ってしまうことが多い印象。
  • ctrl+g
    • コマンドライン入力を中断。入力を中断して次のプロンプトへ移るが、ctrl+cとは違いプロセスの中止は起こらない。ctrl+cではなくctrl+gを使わないといけないという場面を私は知らない。誤爆の被害もあまり大きくはないので積極的に潰していきたいキー。
  • ctrl+h
    • BackSpace。BackSpaceキーがホームポジションから遠いためctrl+hを好んで使う勢は一定数いる。しかしそんな人でもターミナルを離れれば(矢印キーと違って)BackSpaceキーを押すことを受け入れている人がほとんどなので、さっさと潰して別の・・・、おや、誰か来たようだ。
  • ctrl+i
    • タブ。ctrl+mと同様、多くの場合タブキーを押すことと区別がされないため、ctrl+iに操作を割り当てるとタブキーも潰される。したがって決して潰してはいけない。補完is大事。
  • ctrl+j
    • コマンドの実行。基本的にエンターキーを押した場合と同様の動作をする。エンターで代用可能であり、かつ非常に押しやすいポジションにあるため、潰して別のキーバインドを割り当てるのにかなり適している。しかしデフォルト環境で誤爆した場合の被害が大きくなりがちなのでよく考えた方が良いかもしれない。
  • ctrl+k
    • カーソルから末尾まで削除。使用頻度は高め。範囲選択とctrl+eを組み合わせることで代替可能だが、コマンドライン操作のかなり基本的な操作なので潰さない方が無難だと思う。
  • ctrl+l
    • 画面のクリア。clearコマンドで代用可能だが、ctrl+lなら現在のバッファに影響を与えず使用できる。見た目だけの問題であり動作に影響がないので、不要な人にとっては非常に潰しがいのあるキー。誤爆してもこけおどし爆弾なので安心。
  • ctrl+m
    • エンターキー。ctrl+iと同様、エンターキーと区別されない。これを潰して、コマンドの実行はctrl+jctrl+oにするという選択肢もないわけではないが、利点が思いつかない。。
  • ctrl+n
    • 次の履歴へ。履歴はコマンドラインの要の一つ。ctrl+pに比べると重要度はかなり落ちると言わざるを得ないが、やはり一方通行のコマンドというのは気持ちが悪い。ctrl+cで一度ご破算してからctrl+pというのもアリだが、潰す優先度は低い。
  • ctrl+o
    • コマンドの実行。ctrl+jと同じ(内部の挙動的には違いがあったはずだが忘れた)。場所的にも押しやすいので潰すのに向いている。やはり誤爆に注意。
  • ctrl+p
    • 前の履歴へ。矢印キーで代用可能だが、デフォルト環境で使えないと即死なので潰すのは現実的でない。
  • ctrl+q
    • 画面ロック解除。ctrl+sで画面ロックしたのを解除できるが、ロックを無効にしている人にとっては真っ先に別キーバインドを割り当てる候補に。ちょっと押しにくいのが玉に瑕。
  • ctrl+r
    • 履歴検索(前へ)。履歴を検索できる唯一の機能なので潰してはいけない。ただインタフェース的にあまり使いやすいものではないので、別の履歴検索アプリなどに割り当てるのはアリだと思う。
  • ctrl+s
    • 画面ロック、履歴検索(次へ)。初心者をパニックに陥れる恐怖のキー。突然キー入力を受け付けなくなったかと思って慌てて色々やった末、元に戻せてもロック中の入力が反映されているという卑劣な罠。無効にされることが多い。なお無効にした場合、隠れていたctrl+rの逆順という機能が顔を出す。ctrl+rで行きすぎた際に戻れるのは便利だが使用頻度は低いので潰しても良い。
  • ctrl+t
    • 文字の入れ替え。abbaにするという処理にキーバインドがあることを知っている人が何人いるだろうか?活躍できる場面が少なく何とでも代用が効くため、原理主義者以外はまず潰して良い。アプリケーションのデフォルトキーバインドになっているケースも見られる。{,_}で一時的に名前を変更したファイルを戻す時、{_,}にするのにたまーに使う。
  • ctrl+u
    • カーソルから先頭まで削除。ctrl+kと同様使用頻度と認知度の面から潰さない方がよさそう。
  • ctrl+v
    • 特殊文字の入力。^[(エスケープ)や^M(エンター)などの特殊文字を入力するのに必要。初めは不要と思っても、ターミナルの沼に足を踏み入れると必要なことも多い。他に代替できる方法もないので残しておくこと。
  • ctrl+w
    • カーソル左の単語を削除。コマンドライン編集に必須な機能。潰してはならぬ。むしろzleでさらに拡張を試みるのじゃ・・・。
  • ctrl+x
    • 様々な機能のプレフィックス。ctrl+xだけでは特に動作せず、別のキーを後置することで色々な機能が使える。私の場合ctrl+x+uのUndoが9割、ctrl+x+fのvimのf(次に押す文字に飛ぶ)が1割、というくらいしか使っていないので実質的にはUndoに割り当ててもいいのだけれど、他の組み合わせを殺したくはないのでそのままが良さげ。
  • ctrl+y
    • 貼り付け。ctrl+wなどで一気に削除された部分を貼り付けられる。範囲選択と絡めて使えれば便利かも、と思いつつ私はまだ活用できず。時々思い出したように使うが、マウスやtmuxのコピーモードで代用できるので潰す優先度は高い。
  • ctrl+z
    • プロセスのSuspend。インタラクティブシェルのコア機能なので潰してはいけない。ctrl+zしてkillしたり、disownしたりとか、なかったら困る。

私の例

なんか私のターミナルを見た人から魔改造とか言われることがあるので、なんとなく反論。 私が(zshの)デフォルトから動作を変更しているのは以下だけです。

  • ctrl+d
    • ディレクトリ操作系コマンドのプレフィックス
    • ^d^uで一つ上のディレクトリに移動など
    • 後続キーの入力がなければデフォルトのctrl+d(セッション切断は無効化)
  • ctrl+g
    • git系コマンドのプレフィックス
    • ^g^sgit statusに相当するものを表示など
    • 後続キーの入力がなければデフォルトのctrl+g
  • ctrl+r
    • fzfを使った自作履歴アプリケーション
  • ctrl+s
    • ロックも逆順検索も要らないので持て余している
    • 素晴らしい機能に割り当てたいと思いつつ、ずっとデバッグ用コマンドになっているw
  • ctrl+w
    • コマンドとしては変更なし
    • WORDCHARSから/を抜いて、/の直前まで削除するようにしているだけ

bashのデフォルト環境でもあまり違和感がないように、 ほとんど手を入れていないんですよ? (そのぶんctrl+数字ctrl+記号の方はちょっと魔境・・・?)

おわりに

ここまで色々書いてきましたが、正直、どんなキー操作も結局は慣れの問題です。 ただ、どうせ慣れるならできるだけデフォルト操作に慣れておくとメリットは多いかなと。

以上、令和記念の駄文でした。