vimにvimコマンドをパイプすることは可能ですか?


18

次のシェルを実行したい。

wea-this is the end of the second word | vim j
exit 0

キーストロークをパイプしてw(単語を進めて)、e(単語の終わり)、a(追加)、-this is the end of the second word(テキスト)を、j既に単語が含まれている名前の付いたVimドキュメントにパイプすることを期待していました。

シェルスクリプトを実行すると、次のエラーが発生しました。

/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal

Ubuntu 14.04を実行しています。2つのタイプの回答があります:

  1. この望ましい結果を達成するための配管の使用方法。
  2. 「Vimコマンド」(edコマンドまたはsedコマンドではない)を使用して、シェルスクリプトからテキストドキュメントを編集できる別の方法。

1
|文字パイプを別のコマンドの出力。wea-thisコマンドではありません。配管を使用して、目的の処理を実行することもできません。Vimの標準入力がキーボードではなく、左側のアプリケーションになります。vimのバッファーにstdinを取得する場合は、ファイル名のマイナス記号で開始しますecho Hello, world! | vim -
ダッシュトムバン

回答:


15

"hello"ファイルの最初の行に文字列を挿入するにjは、シェルに次のコマンドを入力します。

vim +"1 | put! ='hello'" j

  • :1 カーソルをバッファの最初の行に移動します
  • :put! ='hello' 文字列「hello」を現在の行の上に貼り付けます

文字列を挿入し"hello"、ファイルを保存して終了するには:

vim +"1 | put! ='hello' | x" j

前と同じように、:x保存して終了するExコマンドを追加しました。

より一般的には、次のように、対話型シェルまたはbashスクリプトから、ファイルに対してExコマンドのシーケンスを実行できます。

vim +'Ex command1 | Ex command2 | ...' file

Exコマンドがたくさんある場合は、それらをすべて専用ファイル(たとえばmyExCommands.vim)に記述し、1行に1つのコマンドを記述し、シェルまたはスクリプトからそれをソースにすることができます(Exコマンド:sourceまたは短いバージョンで):so) このような:

vim +'so myExCommands.vim' file

編集

質問を編集しました。
Exコマンド:normalとを使用してExモードから通常のコマンドを実行できるため、前の答えはまだ当てはまると思います:execute

たとえば、次のようなことをしたいとしましょう:

  • バッファの最初の行にカーソルを移動します(1G
  • 行(_)の最初の非空白文字にカーソルを移動します
  • カーソルを1単語進めます(w
  • カーソルを新しい単語の最後に移動します(e
  • カーソルの下の文字の後に挿入モードに入ります(a
  • 文字列を挿入する hello
  • 保存して終了(:x

ファイルjでこれを行うには、シェルから次のように入力します。

vim +"execute 'normal! 1G_weahello' | x" j

詳細については、以下を参照してください。

:help +cmd
:help :normal
:help :execute

目標を完全に明確にすることができませんでした。wなどのvimsコマンドを使用して、単語などを前方に移動できるようにします。質問を修正して修正します。
ジェイソンバサニーズ

@JasonBasanese私は答えを編集し、Exコマンド:normal:execute実行し、あなたが望むことをしますか?
サギノー

9

これは、exコマンドだけでなく、通常モードのコマンドを使用して、stdinからVimに提示されるストリームを編集する方法です。これはあまり有用な例ではありませんが、関連するテクニックを示しています。シェルがbashであると想定しています。

echo "The brown fox jumped." | vim -s <(printf 'wcwred\e:wq! foo\n') -

-最後には、標準入力からテキストを(コマンドではない)読むためにVimを伝えます。-s指定されたファイルからキーストロークを実行するためにVimを伝えます。この場合、ファイルはbashプロセス置換の出力です。<(...)名前付きパイプの名前に置き換えられます。パイプの出力は、括弧内のコマンドの出力です。wcwred\e次の単語にすることを一つの単語との変更により、カーソルを移動red:wq! foo\n結果をファイルに保存しfoo、そのファイルがすでに存在する場合でも。最終結果はfoo、テキストを含む名前のファイルですThe red fox jumped.

これらのトピックの一部について詳しくは、を参照してください

:help -file
:help -s

manページのProcess Substitutionセクションも参照してbash(1)ください。


〜/ .zshrcに追加:vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }。今私はできvimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat fooます。きちんとした!
レナードパウリ

4

サブシェルからリダイレクトされたプログラムの出力を非常に簡単に取得する方法を見つけました。

vim <( program )

例:

 vim <( grep -nH  hello  myFile.cpp )
 vim <( find . -name '*.cpp' -exec grep -nH code_expr {} \+ )

4

私はあなたとまったく同じ欲望を持っていました。通常のvimコマンドを書き、それらにパイプラインストリームを編集させたかったのです。デフォルトのvimオプションで提供されているように、この方法で通常のvimを使用するのが難しい(非常に多くのフラグ!)ことに失望しました。

そのため、vimにhttps://github.com/MilesCranmer/vim-stream/の小さなラッパーを作成しました。という名前vimsです。

ラッパーの中心は次のコマンドです。

vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2

これを使用して、コマンドを生成すると、非常に簡潔になり、vimはモーダルエディターであるためvims、モーダルストリームエディターを作成しました。パイプライン編集の考え方に役立つ3つの主なモードがあります。

[-t|--turn-off-mode] - (Default mode)
                       Every string is a vim command line, e.g., '%g/foo/d' deletes
                       all lines with foo.
[-e|--exe-mode] -      Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] -   Like exe-mode, but runs on 1st line only

これを見て:

$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World

したがって、eの最後に移動してから、追加Helloa開始します。

exeモードで、を含む行をコメントアウトしmy_bad_var、前の行を削除するための、より洗練されたもの

cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'

どちらに変換vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'- I行の先頭に挿入を開始するコマンドであること、および//コメントの配列です。 \<esc>kddエスケープキーを押して、行を上に移動してから行を削除します。

リポジトリには合計11の例がありますので、ぜひチェックしてみてください。繰り返しになりますが、これはvimの上で実行されます。これは、vimをストリーム入力用のsedに近づける方法にすぎません(ただし、すべての最愛のvimマクロを保持します!)


3

これはかなり古い質問ですが、特定のdistro / OSがにアクセスmoreutilsできる場合、それをインストールして、単にvipe標準の追加として使用できることは貢献する価値があると感じましたvim

echo foo | vipe # Now you can edit "foo" to be "bar"!

moreutils他のツールにも非常に便利です。もしあなたが真剣なコマンドラインユーザーならそれらを強くお勧めします!:)詳細については、著者の紹介(前のリンク)をご覧ください。

moreutilsパッケージマネージャーとMacのHomebrewを介して、ほとんどの* nixのようなディストリビューションで一般的に利用できるはずです。例えば...

# Arch Linux and MSYS2 (more below) as part of the `community` repo
pacman -Sy moreutils


# Mac OS and Homebrew
brew install moreutils

moreutilsまた、MSYS2パッケージリポジトリの一部であるため、Windowsでも技術的に使用できます。:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.