今思えば知らずに損してたコマンドラインのあれこれ

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

今でこそ iTerm2 を全面に表示して、 tmux でセッション、ウィンドウ、ペインごとに分けて、 ターミナル内の Vim であれこれやってるわけですが、 始めたての頃はコマンドラインに慣れるまで大変でした。

今振り返って、これを知ってから or 使うようになってから、 劇的に変わったなあと思うようなものがあるので、 それらをメモ代わりに残しておきます。

今年からターミナルを使いこなしたい! と思っている方におすすめします。

Emacs, Vi 両方のキーバインドを最低限知っておく

これはエディタの話ではなく、コマンドラインであれこれやるにあたって 両方のキーバインドを最低限知っておく必要があった という意味です。

僕の環境設定の考え方の話になるのですが、 なんでもかんでも自分の使いやすいように変えていくのではなく、 よくある標準の設定をベースにしつつ、より良い設定を邪魔せず上乗せしていく形 を取りたいといつも思っています。

コマンドラインを使っていくに従って、 標準の設定というのがとても良く考えられていることに段々気づいていく と思います。

当然なのですが、その標準の設定を考えた人というのがいるわけで、 すべてのことには理由があるので、 仮にその理由を知らなかったとしても その標準の設定に合わせることで 自然とそのメリットを享受できる ことも出てきます。

シェルスクリプトはもともと Emacs 風

bash や zsh などのシェルでは、キーバインドのモードを切り替える設定が用意されています。

# bash
set -o vi

# zsh
bindkey -v

上記はともに Vi モードに切り替える設定なのですが、 設定を変更しない場合、 標準で Emacs 風 になっています。

ここで仮に Ctrl-a で行頭に移動、 Ctrl-e で行末に移動、 Ctrl-w で1単語分の削除、 などの Emacs 上での操作を知っていると、 何も設定していないターミナル上で Emacs 風キーバインドで操作できる ことになります。

コマンドライン使いたての頃、比較的長めのコマンドを打って実行したらミスが見つかったけど、 その直したい箇所が入力の頭の方で、 左キーを連打しまくってるけど時間がかかってしょうがない、みたいなケース、 よくある話ではないでしょうか?

特に何も設定されていないサーバなどに始めてアクセスする際には、 こういったキーバインドを知っていることが効率に直結することもあると思います。

未知の端末をなんとなく扱えるメリットも

Windows の方はメリットを享受できないのですが、 Mac の方は command キーと control キーに分かれているため、 上記の Ctrl-a, Ctrl-e などのキーバインドが他アプリケーションで使えたりします。

例えば 各種 Web ブラウザの URL バー などはすでにそういった想定がされています。 長い URL を入力しているとき、http じゃなくて https だったとなったときに マウスに手を伸ばす必要はありません。 Ctrl-a を押しましょう。

Windows だと全選択が Ctrl-a などで重複してしまっており、Emacs 風のものは割り当てられていないようですね。

マニュアルを読むときは Vi 風

一方でマニュアルを読む際は 最低限の Vi のキーバインド を知っておく必要があります。 こちらもエディタとして使えるようになる必要はなく、 上下の移動、検索あたりができれば必要十分 だと思います。

そもそも、

man foobar

foobar --help

といったマニュアルを読む際は、 Ctrl-f(forward), Ctrl-d(down) で下スクロール、 Ctrl-b(back), Ctrl-u(up) で上スクロールでき、 / キーのあとにキーワードを入力して Enter キーを押せば検索できます。

これらのキーバインドは Vi から来ています。

インターフェースとしての Emacs, Vi

インターフェース という言葉が一番しっくりきます。

エディタの操作方法としてではなく、 インターフェースとして最低限知っておくだけで ターミナル上のコマンドライン操作はだいぶ変わってくると思います。

自分が UI 実装する側になったときに、キーボード入力が想定されるのであれば、 こういったところにも配慮すると、より使いやすくなるかもしれません。

コマンド履歴を使う

そもそも最初はコマンド履歴を知らなかったので、 上キーを押すことで過去に押したコマンドが表示されることも知りませんでした。

それを知ってるかどうかだけでも少し変わってくるのですが、 インクリメンタルサーチをきちんと使いこなす だけで大きく効率が変わってきます。

これ知ったのつい2年前ほどだったのですが、 http://girigiribauer.com/archives/1873/ それまで知らなかった自分に愕然としましたね。

特にサブコマンドやオプションの多い長いコマンドを、ある程度断続的に入力するケースの場合、 インクリメンタルサーチはおすすめです。

こちらも設定なしで、 Ctrl-r が割り当てられています。

一度入力する前に任意のコマンドを入力しておきます。(なんでもいいです)

% sudo service httpd restart

何も入力していない状態で、Ctrl-r を押すと、

%
bck-i-search: _

入力箇所の下に bck-i-search という表示が出ます。 後ろ方向のインクリメンタルサーチ のことです。

ここで http と順に打つと、 他に候補がない時点で先ほど入力したコマンドが表示されます。

% sudo service httpd restart
bck-i-search: httpd\_

もし候補が出たけどもっと過去の履歴が欲しい!となったときは、 後ろ方向のインクリメンタルサーチなので、何回か Ctrl-r を押しましょう。 その都度、履歴を過去方向に検索してくれます。

ちなみに遡りすぎた場合は、 前方向のインクリメンタルサーチである Ctrl-s も用意されています。 そちらで今度は過去方向から未来方向へインクリメンタルサーチしましょう。

%
fwd-i-search: _

オプション付きの長いコマンドを何回かおきに入力するケースなどに有効

最近だと Docker を使ったりする方も増えてきていると思います。

docker run -d -p 80 -v "$(pwd)/public:/usr/share/nginx/html" --name test nginx

まだこれくらいならかわいいもので、追加でボリュームを紐付けたり、環境変数を設定したりすると、 2行3行と長くなってきます。

毎回同じコマンドを入力するだけなら、上キーだけで十分なのですが、 間に別のコマンドを何度か入力したりして、間がどんどん開いてくると、 上キーだけで遡るのは厳しくなってきます。

上記の例であれば、例えば Ctrl-r を押した後に docker と入力した方が直感的だし速い です。 場合によっては docker 全部入力せずに d だけで事足りるかもしれません。(インクリメンタルサーチなので)

僕の場合ですが、 tmux を利用して画面を分割してコマンド入力を色々行っており、 こっちの画面で過去に入力したコマンドを、今度はあっちの画面で入力したい、 みたいなケースがけっこう出て来ます。 そういったケースに対応するために、 .zshrc に履歴の共有を行う設定を入れています。

Tab キーによるコマンド補完を使う

あとは当然知ってる話だと思うのでおまけ程度ですが、 コマンド打つときは Tab キーで補完できる ことは知っておきましょう。

さすがに自分はなかったですが、 たまに律儀に毎回全部入力している人を見ると「うーん・・・」という気分になります。

まとめ

標準の設定をインターフェースとして捉えることで、 様々なメリットが享受できると思います。 あまりあれこれ設定をいじりすぎずに、標準の設定に慣れるということも一定大事 だと思います。

慣れるまでは大変だと思いますが、 GUI ではカバーしきれないところをコマンドラインで出来ることも多いので、 頑張って慣れていくと良いと思います。

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

もし記事内に誤りなどございましたら、 @girigiribauer @girigiribauer.com までご一報いただけると助かります。

Related articles