シェルでワンライナーを入力するときに悩まされるのがクオート問題です。
スペースを含む文字列を引数で渡す場合はクオートするか、スペースをエスケープする必要があります。
bashやzshだとシングルクォートの中にシングルクォートを書けませんが、fishだとシングルクォートをエスケープできます。
実際に操作してみればわかりますが、これがあるのとないのとでは雲泥の差です。
そこで、interactive関数 quoted_insert を示します。
これを使えば文字列をそのまま入力するだけで、適切にクォート・エスケープされた文字列をコマンドラインに入力された状態になります。
キーに割り当てることでfishのコマンドラインを快適にする関数を
本サイトにおいては便宜的にinteractive関数と呼んでいます。
関数
~/.config/fish/functions/quoted_insert.fish に以下の内容を書きます。
function quoted_insert read -l -p 'echo "quoted_insert> "' str commandline -i "'"(string replace -ar "['\\\\]" '\\\\\\\\\\${0}' "$str")"'" end
キー割り当て方法
fishにおいて自分用のinteractive関数をキーに割り当てるには、
fish_user_key_bindings関数を定義して、そこでbindコマンドを使います。
fish_user_key_bindings 関数は ~/.config/fish/config.fish あるいは
~/.config/fish/functions/fish_user_key_bindings.fish に書きます。
ここではCtrl+Qにquoted_insertコマンドを割り当てます。
function fish_user_key_bindings # ... bind \cq quoted_insert end
実行例
$ ruby -e ★ここでCtrl+Qを押す quoted_insert> puts 'ok' ★このように入力してEnterを押すと $ ruby -e 'puts \'ok\'' ★クオート・エスケープされた状態で入力される ok ★ネスティングも可能 $ fish -c ★ここでCtrl+Qを押す quoted_insert> fish -c ★ここでCtrl+Qを押す quoted_insert> echo 'ok' quoted_insert> fish -c 'echo \'ok\'' $ fish -c 'fish -c \'echo \\\'ok\\\'\'' ok
最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。