web-dev-qa-db-ja.com

コマンドプロンプトから一連のvimコマンドを実行する方法

4つのテキストファイルA.txt、B.txt、C.txt、D.txtがあり、これらすべてのファイルで一連のvim編集を実行する必要があります。現在私がやっているのは、各ファイルを開いて同じvimコマンドを1つずつ実行することです。

コマンドプロンプトから実行できるスクリプトファイルを作成することは可能ですか?つまり、vim編集のために実際のファイルを開く必要はありません。

たとえば、vimエディターでA.txtファイルを開いた後に以下のvimコマンドを実行する必要がある場合:

:g/^\s*$/d
:%s/^/[/
:%s/\(.*\)\(\s\+\)\(.*\)/\3\2\1
:%s/$/]/
:%s/design/test/

スクリプトファイルを作成し、gvim A.txt(ファイルの最初のコマンド)を含むこれらすべてのコマンドを配置することは可能ですか?編集し、コマンドプロンプトからスクリプトファイルを実行します。

可能であれば、それを行う方法を教えてください、また、一度に単一のファイルと一度に複数のファイルでできることを教えてください?

38
imbichie
vim -c <command> Execute <command> after loading the first file

あなたが説明したことを行いますが、一度に1ファイルずつ行う必要があります。

だから、Windowsシェルで...

for %a in (A,B,C,D) do vim -c ":g/^\s*$/d" -c "<another command>" %a.txt

POSIXシェルも似ていますが、現時点では目の前にマシンがありません。

すべてのファイルを一度にロードして実行できると思いますが、ファイルごとにvimコマンドラインでコマンドを繰り返す必要があります。

vim -c "<command>" -c "<command>" -c ":n" (repeat the previous -c commands for each file.)  <filenames go here>

編集:2014年6月8日:参考までに、私はこれを数分前に発見しました。

vimには、エディターにロードされた各バッファー(ファイル)を処理するコマンドbufdoがあります。 bufdoコマンドのドキュメントをご覧ください。 vimでは、:help bufdo

29
JimR

「script.vim」など、スクリプトに保存された各ファイルで実行するすべてのコマンドを使用すると、次のように1つのファイルでそのスクリプトを実行できます(他の人が述べたように)。

vim -c "source script.vim" A.txt

これをさらに一歩進めると、スクリプトの最後にファイルを保存できます。:wコマンドをスクリプト自体の内部で実行するか、コマンドラインから渡します。

vim -c "source script.vim | w" A.txt

これで、argdoコマンドを使用して、Vimで複数のファイルに対して任意のコマンドを実行できます。したがって、コマンドは次のようになります。

vim -c "argdo source script.vim | w" A.txt B.txt C.txt D.txt

最後に、すべてのファイルでスクリプトを実行した後にVimを終了する場合は、別のコマンドを追加して終了します。

vim -c "argdo source script.vim | w" -c "qa" A.txt B.txt C.txt D.txt
18
Ben

コマンドラインでVimに直接渡される-cコマンドの量は10に制限されており、これはあまり読みやすくありません。または、コマンドを別のスクリプトに入れてVimに渡すこともできます。方法は次のとおりです。

サイレントバッチモード

非常に単純なテキスト処理(つまり、拡張された 'sed'または 'awk'のようにVimを使用し、:substituteコマンドの拡張された正規表現の恩恵を受ける場合)には、Ex-modeを使用します。

REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"

注:サイレントバッチモード(:help -s-ex)はWindowsコンソールを混乱させるため、Vimの実行後にclsを実行してクリーンアップする必要がある場合があります。

# Unix
vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"

重要:"commands.ex"ファイルが存在しない場合、Vimは入力を待機してハングします。事前にその存在を確認してください!または、Vimはstdinからコマンドを読み取ることができます。 -引数を使用すると、stdinから読み取ったテキストを新しいバッファーに入れたり、stderrからコマンドを読み取ったりすることもできます。

完全自動化

複数のウィンドウを含むより高度な処理、およびVimの実際の自動化(ユーザーと対話するか、Vimを実行したままにして、ユーザーが引き継ぐ場合)には、次を使用します。

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"

使用される引数の概要は次のとおりです。

-T dumb           Avoids errors in case the terminal detection goes wrong.
-N -u NONE        Do not load vimrc and plugins, alternatively:
--noplugin        Do not load plugins.
-n                No swapfile.
-es               Ex mode + silent batch mode -s-ex
                Attention: Must be given in that order!
-S ...            Source script.
-c 'set nomore'   Suppress the more-Prompt when the screen is filled
                with messages or output to avoid blocking.
18
Ingo Karkat

次の構文を試してください。

ex foo.txt <<-EOF
  g/^\s*$/d
  %s/^/[/
  %s/\(.*\)\(\s\+\)\(.*\)/\3\2\1
  %s/$/]/
  %s/design/test/
  wq " Update changes and quit.
EOF

exコマンドはvim -Eと同等です。冗長出力用に-V1を追加します。

別の1行構文は次のとおりです。

ex +"g/^\s*$/d" +"%s/^/[/" +"%s/design/test/" -cwq foo.txt

ファイルからコマンドをロードするには、-s cmds.vimを使用します。

Shebang for Vimを使用して、引数からファイルを解析する を使用することもできます。

その他の例については、以下を参照してください。

6
kenorb

JimRとIngoは、ユースケースに対して優れた回答を提供しました。

ただし、もう1つの方法を追加するために、vimrunnerプラグインを使用して、Rubyでの対話をスクリプト化できます: https://github.com/AndrewRadev/vimrunner

例:

vim = Vimrunner.start

vim.edit "file.txt"
vim.insert "Hello"
vim.write

vim.kill

これは、プログラミング言語の能力を最大限に活用できるため、より複雑な対話に役立ちます。

2
Andrew Radev