web-dev-qa-db-ja.com

vimエディターを起動してbashにパイプ出力する方法

ときどき、テキストを記述して、そのテキストを別のコマンドにパイプする必要があります。私の通常のワークフローは次のようになります。

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関数の出力をパイプ処理できるように、これに回避策があるかどうか疑問に思っています。次善の代替策は、崇高なテキストなどの別のエディターを起動することですが、私は本当にターミナルにとどまりたいです。

34
theideasmith

vipe は、パイプラインを編集するためのプログラムです。

command1 | vipe | command2

command1の完全な出力を含むエディターが表示され、終了すると、内容がパイプを介してcommand2に渡されます。

この場合、command1はありません。だから、あなたは行うことができます:

: | vipe | pandoc -o foo.pdf

または:

vipe <&- | pandoc -o foo.pdf

vipeEDITORおよびVISUAL変数を取得するので、それらを使用してVimを開くことができます。

インストールされていない場合は、vipemoreutilsパッケージで利用可能です。 Sudo apt-get install moreutils、またはフレーバーに相当するものは何でも。

43
muru

これはVim内から実行できます。

:w !pandoc -o file.pdf

または、バッファを複雑なパイプラインに書き込みます。

:w !grep pattern | somecommand > file.txt

そして保存せずにVimを終了できます:

:q!

ただし、特定のユースケースを考慮すると、viをコマンドラインエディターとして使用することにより、より優れた解決策がおそらく存在します。 bashを使用すると仮定します。

set -o vi

これにより、キーバインドがviに設定されます。したがって、<Esc>を押してviviなどの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を使用)、全体がシェルコマンドとして実行されます。

シェルのコマンド履歴でも利用できます。

20
Wildcard

パイプラインで実行

試してください:

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はファイルをコマンドにパイプできます。たとえば、vim内からコマンド:w !pandoc -o file.pdfを発行します(注:wと!の間のスペースは必須です)。

18
John1024

vimがデフォルトのエディタとして設定されていることを確認してください(例:export EDITOR=vimあなたの.bash_profileまたは.bashrc。次に、任意のプロンプトで、次のように入力できます Ctrl-X に続く Ctrl-E。これにより、構成されたエディターで現在のコマンドラインが開きます(例:vim)。編集を行い、保存して終了すると、パイプラインなどを含むコマンドラインで入力した場合と同じようにコマンドが実行されます。

6
DopeGhoti