web-dev-qa-db-ja.com

シェルからVimコマンドを実行する方法は?

これはばかげた質問かもしれませんが、我慢してください。

新しい作業環境をセットアップするときに行う通常の作業の一部を自動化しており、Vimコマンド:BundleInstall(すべてのVimプラグインをインストールするため)を自動化したいと考えています。

これをシェルから実行することは可能ですか?

または、スクリプトでVimを実行し、:BundleInstallを実行し、終了するまで待って終了することはできますか?

ありがとう。

12
imiric

vim(1)のマニュアルページから:

+ {コマンド}

-c {コマンド}

{コマンド}は、最初のファイルが読み取られた後に実行されます。 {コマンド}はExコマンドとして解釈されます。 {コマンド}にスペースが含まれている場合は、二重引用符で囲む必要があります(これは使用するシェルによって異なります)。例:Vim "+ set si" main.c

注:最大10個の「+」または「-c」コマンドを使用できます。

次のようにコマンドを実行できます。

vim -E -c BundleInstall -c q

これにより、ターミナルでVimウィンドウが開かなくなります。

注:私の最初の答えには、別のアプリケーションに必要だった-sオプションが含まれていましたが、BundleInstallコマンドを定義するプラグインの調達を含むVimの初期化の多くが妨げられたため、ここでは正しくありませんでした。

4
garyjohn

上記のvim固有のレシピはそれを行う正しい方法ですが、 autoexpect のようなより一般的なアプローチをいつでも使用できます。

2
AnonymousLurker

手動で開始したかのようにvimを完全にロードする必要がある状況では、これは機能します。

vim -c "autocmd! CursorHold * <commands to run>"

たとえば、:mapの出力をシェルからのファイルにリダイレクトしたかったのですが、 vim-airline がタブラインを表示した後にのみ作成するマッピングをキャプチャしたかったのです。 topは、開いているすべてのバッファ名を示しています。)これは非同期で行われるように見えるため、ファイルへの-cリダイレクトを実行するだけでは、マッピングを行う時間がありませんでした。より良い方法があるかもしれませんが、これは私にとってはうまくいきます。特に、updatetime100(0.1秒)に設定されているため、CursorHoldイベントが発生するまでの時間に影響します。 。デフォルトでは、vimはそれを4秒に設定します。

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
0
user1902689