3

vim を使用して、単一の C 言語関数を非対話的にファイルに書き込みます。最初に、tagsctags でファイルが作成されます。main()関数をファイルに書き込むには、func.c次に使用します

vim -R -U NONE -u NONE -c ":ta main" -c ":.,/^}/w!func.c" -c :q

つまり、これは 3 つの vim コマンドを非対話的に実行します。

  1. :ta mainmain() にジャンプする
  2. :.,/^}/w!func.c現在の行から次の終了行までを行頭にカーリーで書き込む
  3. :qやめること

-U NONE -u NONEユーザーまたはシステムの起動ファイルの読み取りに時間を浪費せず ( )、.swp ファイルの作成を回避する ( )ことで、これを効率的にしようとしました-R

私が取り除くことができなかった2つの問題が残っています:

  1. これがパイプの一部として実行されると、Vim: Warning: Output is not to a terminal警告と (明らかに) 1 秒の遅延が発生します。
  2. このコマンドの stdout を保存すると、多くのターミナル エスケープ シーケンスが使用されたり、メッセージ"func.c" 58 lines, 1707 characters writtenが生成されたりします。

これらをそれぞれ回避する方法はありますか?

4

1 に答える 1

8

これは、サイレント バッチ モード( :help -s-ex) がユース ケースに適しているように思えます。それ以外の場合は、完全な自動化を回避することはできません (説明したいくつかの欠点があります)。

サイレントバッチモード

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

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

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

# Unix
vim -T dumb --noplugin -n -i NONE -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.
-i NONE           Ignore the |viminfo| file (to avoid disturbing the
                user's settings).
-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.
于 2015-01-09T13:10:48.947 に答える