2012-02-20 8 views
2

私は私の.vimrcに命令を次ていますのVim - 地図シェルコマンド

map t :!../tt <C-R><C-W> <CR><CR> 

それはかなり正常に動作します:Vimはファイルから単語を取得し、../t wordを実行します。しかし、一つの厄介なことは、コマンドが実行されるときです。vimはしばらくシェルに戻り、その後ファイルに戻ります。私はコマンド出力を見る必要がないので、この厄介なフラッシュを回避することは可能ですか?

+0

'$ ../t word'とは何ですか?出力は何ですか?それをバッファに入れたいですか? – romainl

+5

なぜあなたは 't'を再マップしますか?これは便利な移動コマンドです... – hochl

+1

そして私は 't'について同意します。 – romainl

答えて

0

これはうまくいくと思います。

map <silent> t :silent!../tt <C-R><C-W> <CR><CR> 

しかし私はあなたのttアプリを持っていないので、stderrとstdoutとの対比はテストできませんでした。それらがvimにあるのかどうかわかりません。

+0

いいえ動作しません。 ttは単純なbashスクリプトです。これはソースコードです: '#!/ bin/bash' ' FILE_OF_EX =〜/ tmp/to_trans' 'echo $ 1> $ FILE_OF_EX' – ghi

2

あなたは

nnoremap <silent> t :<C-u>silent !../tt <C-r>=shellescape(expand('<cword>'), 1)<CR><CR><C-l> 

または

nnoremap <silent> t :<C-u>call system('../tt '.shellescape(expand('<cword>')))<CR> 

あるいは

nnoremap <expr> <silent> t system('../tt '.shellescape(expand('<cword>')))[-1] 

のいずれかを試すことができます。いくつかのことを注意してください:あなたは特別な理由がない限り、

  1. nnoreなし)mapを使用しないでください。私はあなたが視覚的および操作者保留中のモードのためにこのマッピングを必要としないと信じています(nは通常モードへのマッピングのみを制限します)。また、このマッピングを再適用可能にしたくないと思います。
  2. 必要があると分からない限り、時々入力することができるカウントを破棄するには、<C-u>を使用します(第3のバージョンでは、副作用でノーオペレーションにマッピングされ、<C-u>は不要です)。
  3. シェル引数をエスケープすることを決して忘れないでください。
  4. silent !のバージョン(silentの後のスペースを忘れないでください、これが@David Popeの答えが機能しない理由です)は最後に<C-l>です。これは、!を使用するとが常にになり、コマンドが実行された後に再描画が必要になるためです。
  5. 改行を含む引数を追加すると、system()のバージョンは動作しません。これは文書化されたバグです。それをしたくない場合は(expand('<cword>')は改行を追加しません)絶対に安全です。
  6. tは非常に便利な動作です。それを使用して何かに再マップすることを学ぶ方が良いです。私は,tをlhsとして提案します。