web-dev-qa-db-ja.com

Vim:選択したテキストをシェルコマンドにパイプし、vim情報/コマンドラインで出力を受け取ります

選択したテキストをシェルコマンドにパイプし、このシェルコマンドからの1行の出力をvim情報/コマンドラインで受け取りたいですか?

私が実際にやろうとしていること:選択したテキストをPastebinタイプのシェルコマンドにパイプし、シェルcmd(Pastebinへのhttpリンク)の出力を受け取りたい。これは可能ですか?

54
ikwyl6

私はそれをこのようにします:

この関数をvimrcに配置します。

function Test() range
  echo system('echo '.shellescape(join(getline(a:firstline, a:lastline), "\n")).'| pbcopy')
endfunction

これにより、次のようにしてこの関数を呼び出すことができます。

:'<,'>call Test()

次に、これを次のようにマッピングすることもできます(vimrcの関数宣言のすぐ下):

com -range=% -nargs=0 Test :<line1>,<line2>call Test()

したがって、これを行う関数を呼び出すことができます。

:'<,'>Test

注::<','>は範囲セレクターです。これらを生成するには、ビジュアルモードで関連する行を選択し、コマンドモードに移動します(コロンキーを押す)。

17
matias

複数行バージョンの場合、テキストを選択した後にこれを実行できます。

:'<,'>:w !command<CR>

次のようなシンプルなビジュアルモードショートカットにマッピングできます。

xnoremap <leader>c <esc>:'<,'>:w !command<CR>

ビジュアルモードでリーダーキー+ cを押して、選択したテキストをコマンドの標準入力に送信します。コマンドのstdoutはvimのステータスバーの下に表示されます。

CoffeeScriptを使用した実際の例:

https://github.com/epeli/vimconfig/commit/4047839c4e1c294ec7e15682f68563a0dbf0ee6d

100
Epeli

視覚的な行選択shift-vを使用して行を強調表示するだけで、ヒット:!コマンドを送信したいコマンドを入力します。結果の出力は、選択したテキストを置き換えます。

コマンドを入力すると、下部に次のように表示されます。

:'<,'>!somecmd

'<、'>は、視覚的に選択した範囲が!の後に指定されたコマンドに渡されることを示しています。

30
Neg_EV

多分あなたは何かを使うべきです

:echo system('echo '.shellescape(@").' | YourCommand')

いくつかのvim-7.4バージョンから始めて使用する方が良いです

:echo system('YourCommand', getreg('"', 1, 1))

。これは基本的に、NULバイトがファイルに存在する場合にそれらを変更しないでおく唯一の方法です。合格@"いずれかの方法でNULバイトをNL(改行)に変換します。

4
ZyX

@matiasのソリューションは、shellescapeが各行に\を追加するように見えるので、私にはうまくいきません。

だから私はsedを使ってこれを達成し、それはうまくいきます!

"dump selected lines
function! DumpLines() range
  echo system('sed -n '.a:firstline.','.a:lastline.'p '.expand('%'))
endfunction

com! -range=% -nargs=0 Dump :<line1>,<line2>call DumpLines()
2
Harry Lee

別の答え:

function Pastebin() range
    let savedreg=@"
    silent execute a:firstline.",".a:lastline."yank"
    python import vim, subprocess
    python p=subprocess.Popen(["Pastebin"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    python p.stdin.write(vim.eval('@"'))
    let @"=savedreg
    python p.stdin.close()
    python retstatus=p.poll()
    python print p.stdout.read()
endfunction

pythonサポートが必要です。matias '関数と同じように使用してください。

1
ZyX