vimエディタを呼び出して出力をbashにパイプする方法

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スクリプトを学びたいと思います。エディタを開き、エディタが閉じたときにエディタの出力を標準出力にパイプするコマンドを作成して、プロセスをより簡単にしたいと思います。その後、コマンドを実行できます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

私がすぐに直面した問題は、vimのような作業をするときにすべてのquickedit | command出力がパイプに制限されているため、vim自体がエディタとして使用できないことです。

関数の出力をパイプするための回避策があるかどうか疑問に思いますquickedit。次善策は、サブライムテキストのような別のエディタを実行することですが、私は本当に端末に滞在したいと思います。

答え1

vipeパイプを編集するプログラムです。

command1 | vipe | command2

完全な出力を含むエディタが提供され、終了すると、コンテンツはそのエディタにパイプされますcommand1command2

この場合、次のようにすることcommand1ができます。

: | vipe | pandoc -o foo.pdf

または:

vipe <&- | pandoc -o foo.pdf

vipeVimを開くために使用できる変数をEDITOR取得します。VISUAL

まだインストールしていない場合は、パッケージまたはあなたの好みに合ったパッケージにありますvipemoreutilssudo apt-get install moreutils

答え2

Vimでは、次のことができます。

:w !pandoc -o file.pdf

あるいは、複雑なパイプにバッファを作成することもできます。

:w !grep pattern | somecommand > file.txt

その後、保存せずにVimを終了できます。

:q!

viただし、特定のユースケースに応じて、コマンドラインエディタを使用するより良いソリューションがあるかもしれません。以下を使用するとしますbash

set -o vi

これにより、キーバインディングがに設定されますvi。したがって、主キーバインディングを使用して、コマンドラインからのようなコマンドを直接vi入力してコマンドを<Esc>編集できます。 (を押すと挿入モードに戻ります。)vixcwi

この質問にはより良く、関連性が高くなります。Vimを開き、コマンドラインコンテンツを自分で作成できます。 ただ入力すると空の<Esc>vVimバッファが得られます。保存して終了すると、はいコマンドラインにコマンドを入力すると、すぐに実行されます。必要に応じて完全なミニスクリプトを作成できるため、コマンドラインで直接編集するよりもはるかに柔軟です。


たとえば、トリッキーなテキストを作成してすぐにpandocにリンクするには、次のように入力します。

<Esc>v

次に、次の内容が表示されるまでVimバッファを編集します。

cat <<EOF | pandoc -o file.pdf
stuff for pandoc
more stuff for pandoc
EOF

その後、保存して終了すると(使用:x)、プロセス全体がシェルコマンドとして実行されます。

これはシェルのコマンド履歴にもあります。

答え3

パイプラインで実行

努力する:

quickedit() (  trap 'rm ~/temp$$' exit; vim ~/temp$$ >/dev/tty; cat ~/temp$$ )

要点は、vim正常に動作するためにvimstdoutが端末として必要であることです。ここでは、リダイレクトを通じてこれを達成します>/dev/tty

安全のために、一時ファイルをユーザーのホームディレクトリに配置しました。これについて詳しくは、次をご覧ください。GregのFAQ質問062。これにより、あいまいなファイル名は必要ありません。

例:

一度開いてファイルをvim入力して保存しました。This function succeeded.画面の結果は次のとおりです。

$ quickedit | grep succeeded
This function succeeded.

quickedit出力がパイプにリダイレクトされてもvim直接アクセスを許可したため、引き続き機能します/dev/tty

vimでプログラムを実行する

コメントで述べたように、vimはファイルをコマンドにパイプすることができます。たとえば、vimでコマンドを実行します:w !pandoc -o file.pdf(注:wと!の間のスペースは重要です)。

答え4

vim、vi、vile、emacsはすべて、バッファとさらにはバッファの断片(行の選択など)をフィルタとコマンドにパイプすることをサポートします。これは非常に強力で、ファイルを編集するのに役立ちます(クラシックユーティリティは編集ヘルパーになります)、エディタで作業を実行し、テキストファイルを使用してカーソルの選択や移動などによって実行されるコマンド全体を覚えます。この!キャラクターは古典的なトリガーです。 viのマニュアルを読んでこの項目を見つけてください。ポータブルカスタム構成では、これらのエディタは、悪いネットワークやグラフィック機能にもかかわらず使用でき、時間の経過とともに(寿命)安定性を維持する便利なオフロードツールキットになります。彼らは深く勉強する価値があり、そのうちの1人があなたの親友になることができます。

関連情報