ときどき、テキストを記述して、そのテキストを別のコマンドにパイプする必要があります。私の通常のワークフローは次のようになります。
vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example
rm file.txt
私はこれが扱いにくく、bashスクリプトを学習しようとしていると思います。エディターを起動するコマンドを記述し、エディターがパイプのエディターの出力をstdoutに閉じると、プロセスをより簡単にしたいと思います。その後、quickedit | pandoc -o file.pdf
としてコマンドを実行できます。
これがどのように機能するかはわかりません。私はすでに、上記の正確なワークフローといくつかの追加に従ってこれを自動化する関数を作成しました。ファイル名として機能するランダムな文字列を生成し、関数が呼び出されたときにそれをvimに渡します。ユーザーがファイルを保存してvimを終了すると、関数はファイルをコンソールに出力してから、ファイルを削除します。
function quickedit {
filename="$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32)"
vim $filename
cat $filename
rm $filename
}
# The problem:
# => Vim: Warning: Output is not to a terminal
私がすぐに遭遇した問題は、quickedit | command
のようなことをすると、すべての出力がパイプに制約されるため、vim自体をエディターとして使用できないことです。
quickedit
関数の出力をパイプ処理できるように、これに回避策があるかどうか疑問に思っています。次善の代替策は、崇高なテキストなどの別のエディターを起動することですが、私は本当にターミナルにとどまりたいです。
vipe
は、パイプラインを編集するためのプログラムです。
command1 | vipe | command2
command1
の完全な出力を含むエディターが表示され、終了すると、内容がパイプを介してcommand2
に渡されます。
この場合、command1
はありません。だから、あなたは行うことができます:
: | vipe | pandoc -o foo.pdf
または:
vipe <&- | pandoc -o foo.pdf
vipe
はEDITOR
およびVISUAL
変数を取得するので、それらを使用してVimを開くことができます。
インストールされていない場合は、vipe
がmoreutils
パッケージで利用可能です。 Sudo apt-get install moreutils
、またはフレーバーに相当するものは何でも。
これはVim内から実行できます。
:w !pandoc -o file.pdf
または、バッファを複雑なパイプラインに書き込みます。
:w !grep pattern | somecommand > file.txt
そして保存せずにVimを終了できます:
:q!
ただし、特定のユースケースを考慮すると、vi
をコマンドラインエディターとして使用することにより、より優れた解決策がおそらく存在します。 bash
を使用すると仮定します。
set -o vi
これにより、キーバインドがvi
に設定されます。したがって、<Esc>
を押してvi
、vi
などのx
コマンドを入力することにより、コマンドラインで基本的なcw
キーバインドを使用してコマンドを編集できます(i
を押すと、挿入モードに戻ることができます)。
Vimを開いてコマンドラインコンテンツを直接作成できます。<Esc>v
と入力するだけで、空のVimバッファーが取得されます。保存して終了すると、そのがコマンドラインのコマンドであり、すぐに実行されます。これは、必要に応じて全体のミニスクリプトを記述できるため、コマンドラインで直接編集するよりもはるかに柔軟です。
したがって、たとえば、トリッキーなテキストを書いてすぐにpandocにパイプしたい場合は、次のように入力します。
<Esc>v
次に、以下のようになるまでVimバッファーを編集します。
cat <<EOF | pandoc -o file.pdf
stuff for pandoc
more stuff for pandoc
EOF
次に、保存して終了し(:x
を使用)、全体がシェルコマンドとして実行されます。
シェルのコマンド履歴でも利用できます。
試してください:
quickedit() ( trap 'rm ~/temp$$' exit; vim ~/temp$$ >/dev/tty; cat ~/temp$$ )
重要なのは、vim
を正常に使用できるようにするには、vim
が端末であるstdoutを必要とすることです。ここでは、リダイレクト>/dev/tty
を使用してこれを実現します。
セキュリティのために、一時ファイルをユーザーのホームディレクトリに配置しました。詳細については、 Greg's FAQ Question 062 を参照してください。これにより、あいまいなファイル名を使用する必要がなくなります。
vim
が開いたら、This function succeeded.
と入力してファイルを保存します。画面の結果は次のようになります。
$ quickedit | grep succeeded
This function succeeded.
quickedit
の出力はパイプラインにリダイレクトされますが、/dev/tty
への直接アクセスを許可しているため、vim
は引き続き正常に機能します。
コメントで述べたように、vimはファイルをコマンドにパイプできます。たとえば、vim内からコマンド:w !pandoc -o file.pdf
を発行します(注:wと!の間のスペースは必須です)。
vim
がデフォルトのエディタとして設定されていることを確認してください(例:export EDITOR=vim
あなたの.bash_profile
または.bashrc
。次に、任意のプロンプトで、次のように入力できます Ctrl-X に続く Ctrl-E。これにより、構成されたエディターで現在のコマンドラインが開きます(例:vim
)。編集を行い、保存して終了すると、パイプラインなどを含むコマンドラインで入力した場合と同じようにコマンドが実行されます。