場合によっては、テキストを作成し、そのテキストを別のコマンドでリンクする必要があります。私の一般的なワークフローは次のとおりです。
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
完全な出力を含むエディタが提供され、終了すると、コンテンツはそのエディタにパイプされますcommand1
。command2
この場合、次のようにすることcommand1
ができます。
: | vipe | pandoc -o foo.pdf
または:
vipe <&- | pandoc -o foo.pdf
vipe
Vimを開くために使用できる変数をEDITOR
取得します。VISUAL
まだインストールしていない場合は、パッケージまたはあなたの好みに合ったパッケージにありますvipe
。moreutils
sudo 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>
編集できます。 (を押すと挿入モードに戻ります。)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
)、プロセス全体がシェルコマンドとして実行されます。
これはシェルのコマンド履歴にもあります。
答え3
パイプラインで実行
努力する:
quickedit() ( trap 'rm ~/temp$$' exit; vim ~/temp$$ >/dev/tty; cat ~/temp$$ )
要点は、vim
正常に動作するためにvim
stdoutが端末として必要であることです。ここでは、リダイレクトを通じてこれを達成します>/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人があなたの親友になることができます。