選択したテキストをシェルコマンドにパイプし、このシェルコマンドからの1行の出力をvim情報/コマンドラインで受け取りたいですか?
私が実際にやろうとしていること:選択したテキストをPastebinタイプのシェルコマンドにパイプし、シェルcmd(Pastebinへのhttpリンク)の出力を受け取りたい。これは可能ですか?
私はそれをこのようにします:
この関数を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
注::<','>
は範囲セレクターです。これらを生成するには、ビジュアルモードで関連する行を選択し、コマンドモードに移動します(コロンキーを押す)。
複数行バージョンの場合、テキストを選択した後にこれを実行できます。
:'<,'>:w !command<CR>
次のようなシンプルなビジュアルモードショートカットにマッピングできます。
xnoremap <leader>c <esc>:'<,'>:w !command<CR>
ビジュアルモードでリーダーキー+ cを押して、選択したテキストをコマンドの標準入力に送信します。コマンドのstdoutはvimのステータスバーの下に表示されます。
CoffeeScriptを使用した実際の例:
https://github.com/epeli/vimconfig/commit/4047839c4e1c294ec7e15682f68563a0dbf0ee6d
視覚的な行選択shift-vを使用して行を強調表示するだけで、ヒット:!コマンドを送信したいコマンドを入力します。結果の出力は、選択したテキストを置き換えます。
コマンドを入力すると、下部に次のように表示されます。
:'<,'>!somecmd
'<、'>は、視覚的に選択した範囲が!の後に指定されたコマンドに渡されることを示しています。
多分あなたは何かを使うべきです
:echo system('echo '.shellescape(@").' | YourCommand')
いくつかのvim-7.4バージョンから始めて使用する方が良いです
:echo system('YourCommand', getreg('"', 1, 1))
。これは基本的に、NULバイトがファイルに存在する場合にそれらを変更しないでおく唯一の方法です。合格@"
いずれかの方法でNULバイトをNL(改行)に変換します。
@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()
別の答え:
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 '関数と同じように使用してください。