Bash から <C-x><C-e> で呼べるプログラム「のみ」の設定
Bash からは Ctrl-x Ctrl-e の操作で $VISUAL
, $EDITOR
にあるプログラムを呼んで,コマンドの編集をすることができます. man bash
より
edit-and-execute-command (C-xC-e) Invoke an editor on the current command line, and execute the result as shell commands. Bash attempts to invoke $VISUAL, $EDITOR, and emacs as the editor, in that order.
ところが,僕の理解が正しければ $VISUAL
や $EDITOR
は sudoedit
を始め他のプログラム/コマンドの挙動にも影響を及ぼしてしまいます.これを回避して, C-x C-e
で起動されるプログラムのみを別に設定することはできるでしょうか? 今使っているのは Bash の 4.3.11 です.
- edit-and-execute-command 自体のカスタマイズ
- edit-and-execute-command をエミュレートしたような別のコマンド(編集 -> chmod -> 実行 -> rm)を作ってショートカットを登録
- シェルスクリプトを書いて
$EDITOR
に登録.このシェルスクリプトは edit-and-execute-command 経由で呼ばれたかどうかを調べて,それに応じて適切なコマンドを呼んでくる
などを考えたのですが, 1 と 3 については方法がわからず,2 については echo $0
の挙動がことなるなどどうもきちんと代替になるものをつくれませんでした.
EDIT :
まず1. については自前ビルドは想定していません(…がこれも有用な答えだと思います). 2. はだいたい次のようなことを試しました(雑ですね)
#!/bin/bash
# edit_and_exec_bash
tmpName="/tmp/bash-fc-`date +%s`"
myeditorcommand $tmpName
chmod u+x $tmpName
$tmpName # このようなことをやっているので echo $0 は正しく動作しなかった
rm $tmpName
これを PATH の通ったところにおいて ~/.bashrc
:
bind -x '"\C-x\C-e":edit_and_exec_bash'
上記の通り一時ファイルに書き込んでそれを実行しているだけなので $0
などはそのような値になります.
モチベーション(なぜこんなことをしたいのか): ふだんエディタは vim を使っており, edit-and-execute-command でももちろん vim を使いたいのですが, これで起動した vim はほぼ確実にシェルスクリプトの一時ファイルのみを扱い,他のバッファはひとつも開かずに終了することになるため,僕が .vimrc
に書いている設定のほとんどは必要なく(どちらかというと vim -u NONE -N
+ ほんのちょっと,くらいでつかいたい),逆に身軽さは重要になってきます.そこで C-x C-e
では「この時専用のごく身軽な vim」を使えたらなー,という発想です. Vim 側からでも色々やればそれなりにできるでしょうが,普段使いの設定ファイルの中にこういう設定を埋め込むよりは,起動側で選べたほうが嬉しいです.