同じ行に複数のコマンド


187

* nixシステムまたは&Windows でセミコロンを使用してコマンドを区切るのと同じように、Vimの同じ行で複数のコマンドを実行できるものを探しています。これを行う方法はありますか?


2
うわー、私はあなたの質問(私がした)からvimについて学ぼうとしていて、Unixシェルコマンドを分離する;代わりに使用できることがわかりました&&

8
@ebyrob私はそれ&&が「ブール値」であり、シェルコマンドであることに注意することが重要であると感じているので、を持っている場合command1 && command2、正常にcommand2実行command1された場合にのみ実行されます。で;あなただけ手動でその行の終わりを指定し、新しいものを始めています。これは、シェルスクリプトで別の行に各コマンドを記述するのと同じです。
ウィル

...およびcommand1 || command2、command2は、command1が失敗した場合にのみ実行されます。これは、コンピュータロジックでは|| と&&はビット単位であり、 "&&"はcommand1とcommand2の両方が評価されることを意味しますが、command1が失敗した場合、cmd2を評価する必要はありません。 0)、0 && 1はゼロのままです。同様に、command1 = trueの場合、OR評価でcommand 2の理由はありません。なぜなら、その時点ではすでにtrue(1)だからです。1|| 0は1であり、それが0、0 || 1(まだ1である)が必要
14

@osirisgothraは、短絡/短絡評価として知られています。
スピーキング

回答:


241

バーで|これを行うことができます。から:help :bar

'|'コマンドを区切るために使用できるため、複数のコマンドを1行で指定できます。'|'引数で使用する場合は、その前にを付け'\'ます。

例:

:echo "hello" | echo "goodbye"

出力:

hello
goodbye

NB:あなたはあなたのことがあり~/.vimrcマッピングをサポートしていない|、または\|。このような場合は、<bar>代わりに使用してみてください。


8
で動作しないいくつかのコマンドに注意してください|
phpが多すぎます

31
mapステートメントで複数のコマンドを使用したい場合(そして、私を信じてください)、チェックしてください:help map_bar
ビル・オドム

8
それは本当だ。数か月前にスーパーユーザーにその質問をしました。私.vimrc\|マッピング用のエスケープバー()をサポートしていません。私は実際にタイプしなければならないことを学びました<bar>
michaelmichael 2010

実用的なソリューションをありがとう!:help barただし、motion.txtが表示され、複数のコマンドについては何も表示されません。
geekQ 2012

1
@geekQは:help <bar>
Sri Kadimisetty

90

<CR>コマンドの前後に(キャリッジリターン/エンター)を置きます。例えば:

map <F5> :w<CR>:!make && ./run<CR>

次の|理由で使用しないでください。

  • 一部のコマンドは|、その後に使用すると問題が発生します

  • | 構成ファイルで一貫して機能しない、を参照 :help map_bar


42

コマンドを実行する関数を定義できます。

function Func()
     :command
     :command2 
endfunction

そして、これを、たとえば、vimrcに配置します。関数を実行して

exec Func()

1
きれいな溶液。2つ以上のコマンドや長いコマンドの場合に間違いなく便利でしょう。
elimirks 2013年

1
try / catchでエラーを処理する機能にも非常に役立ちます。
Immanuel Weihnachten

2
何かを意味する:call Func()ので、使用するのがより一般:execute Func()的です。関数の戻り値をコマンドとして実行することを意味します。ここで説明する関数には通常、で始まるコマンドがない:returnため、戻り値はゼロになります。これをコマンドとして実行すると、カーソルが現在のバッファーの最初の行に移動しますが、これは常に想定していたことではありません。
minopret 2018年


16

私は常に+ 、+を^J押して複数のコマンドを区切るのに使用してきました。CtrlvCtrlj


これが実際に機能する唯一のソリューションのようです。文字列で使用したい場合、誰を指定すればよいですか?
DerWeh 2017年

^J文字列を終了するNULL文字を挿入するため、文字列のコマンドセパレーターとして使用することはできません。ただし、<CR> = "\ n"を使用できます。
Tinmarino 2017

exe "echo 'foo' \n echo 'bar'"
Tinmarino 2017

exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
Tinmarino 2017

map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
Tinmarino 2017

11

これは誰かがチェーンで置換を行おうとするのを助けるかもしれないが、1つは失敗すると思った

コメントから

% s/word/newword/ge | % s/word2/newword2/ge

e文字列が見つからない場合、フラグを使用してエラーを無視できます。


2

新しいファイルを作成し、その上にコマンドを書き込むことができます。次に:so %、ソースの現在のファイルを意味します。

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