動機
物心ついたときからtcsh
を使い続けて二十余年、キーバインドを頭でなく指が覚えている。そのため、永らく他のシェルに関しては「食わず嫌い」であったが、昨今の軽量化の流れの中でシステムデフォルトでないシェルをインストールするのが憚られる風潮になってきたので、tcsh
育ちの者がうける違和感を和らげる設定を試みることにした。似たような記事はいくつか存在するようだが、いずれも断片的な情報が多いので、自分用に情報を順次整理していくことにした。
参考資料
- 便利な shell いろいろ: かなり古典的な資料だが、3つのシェルの直接比較がとても参考になった。
違和感その1: コマンドプロンプト行末のCtrl-D
で補完候補表示
tcsh
では、Ctrl-D
は、「行末では補完候補を表示、それ以外では一文字削除」となっている。bash
で真っ先に感じる違和感は、行末のCtrl-D
で補完候補が表示されないことであろう。tcsh
では行の途中で補完候補を表示するのにEsc,Ctrl-D
を叩くが、bash
ではこれも動作が違うので違和感が最高潮に達する。
-
bash
の場合には、~/.inputrc
に下記の記載をして、readline
の変数でキーバインドを設定する模様。
# tcsh-like key binding
"\C-d": delete-char-or-list
"\M-\C-d": possible-completions
"\e\C-d": possible-completions
-
zsh
の場合には、デフォルトでtcsh
と同じ挙動の模様。なにも足さない。なにも引かない。
違和感その2: Esc-p
,Esc-n
でのヒストリ補完
tcsh
では、コマンドを途中まで打ったところでEsc-p
を叩くと、同じ文字列を含むコマンド履歴を辿って表示してくれる。オプション引数がたくさんついた長〜いコマンドを何回も叩く場合に多用する機能だが、bash
ではキーバインドが違う。
-
bash
: これに関しては設定例の記事があったのでそのまま使わせていただく。
# tcsh-like key binding
"\M-p": history-search-backward
"\M-n": history-search-forward
"\ep": history-search-backward
"\en": history-search-forward
-
zsh
の場合には、デフォルトでtcsh
と同じ挙動の模様。なにも足さない。なにも引かない。
違和感その3: 補完候補が多い場合に表示するか聞かれる。さらにページ毎に表示。
tcsh
では補完候補の表示は非常にシンプルであるが、bash
,zsh
の場合には、補完候補の数が多い場合にDisplay all nnn possibilities? (y or n)
などと言ってお伺いをたててくれるが煩わしい。余計なキー入力、タイムラグなく表示して欲しい。
-
bash
の場合には、~/.inputrc
に下記の2行を追加する。
# Disable prompt for long completion list
set completion-query-items -1
set page-completions off
-
zsh
の場合: 2つある補完機能のうちcompsys
を選んで設定する必要があるようだ。(compctl
でのやり方は不明). ただし不完全。効果があったりなかったり...orz- Pipe zsh auto completion list to file or lessとマニュアルを参考にした。
# Disable prompt for long completion list
zstyle -d ':completion:*' list-prompt
unset LISTPROMPT
LISTMAX=-1
autoload -Uz compinit
compinit
違和感その4: 文字列のコピー/カット/ペーストのキーバインド
tcsh
では、Ctrl-@
とともにCtrl-SPACE
でマークをつけられる。bash
では、``ESC-wでペーストされない。
zsh`の場合には、`Ctrl-w`に単語の消去(`backward-kill-word`)が割り当てられていて、`tcsh`(リージョンの消去)と挙動が違う。
-
bash
の場合には、~/.inputrc
に下記の3行を追加する。
# tcsh-like copy & paste
"\M-w": copy-region-as-kill
"\ew": copy-region-as-kill
"\C-w": kill-region
-
zsh
の場合には、~/.zshrc
に下記の1行を追加する。
# tcsh-like copy & paste
bindkey '^w' kill-region