2013-08-10 11 views
6
Here is some text 
here is line two of text 

I視覚的選択を視覚的な選択範囲との文字列を取得:Pythonの使用VimはVimの中<code>is</code>に<code>is</code>からのPythonと

Here [is some text 
here is] line two of text 

、Iは範囲タプルを得ることができる(括弧は、視覚的な選択[]を表します)選択:R、:so %、視覚的にテキストを選択:

function! GetRange() 
python << EOF 

import vim 

buf = vim.current.buffer # the buffer 
start = buf.mark('<')  # start selection tuple: (1,5) 
end = buf.mark('>')  # end selection tuple: (2,7) 

EOF 
endfunction 

私は、このファイルをソースun :<,'>call GetRange()

私は(1,5)(2,7)を持っています。 Pythonでは、どのように私は、次のされた文字列をコンパイルすることができます

is some text\nhere is

はにいいだろう:

  1. 将来の操作のために、この文字列
  2. を取得し、その後で、この選択範囲を置き換えます更新された/操作された文字列
+1

これはPythonで行う必要がありますか?私は以下のvimscriptのみの回答を残しました。質問を読み返すこれがあなたに受け入れられるかどうかはわかりませんが、私は今のところそれを残すつもりです。 – FDinoff

+1

Vimスクリプトの[VimScriptで視覚的に選択されたテキストを取得する方法](http://stackoverflow.com/q/1533565)の多くの有益な答え。 – glts

答えて

7

はこれを試してみてください:

fun! GetRange() 
python << EOF 

import vim 

buf = vim.current.buffer 
(lnum1, col1) = buf.mark('<') 
(lnum2, col2) = buf.mark('>') 
lines = vim.eval('getline({}, {})'.format(lnum1, lnum2)) 
lines[0] = lines[0][col1:] 
lines[-1] = lines[-1][:col2] 
print "\n".join(lines) 

EOF 
endfun 

あなたはvimの関数と変数のPythonの値を取得するためにvim.evalを使用することができます。

+2

私は 'line [-1] [:col2 + 1]'がもっと便利だと思います。 – qed

4

純粋なvimscriptを使用した場合、これはおそらく動作します

function! GetRange() 
    let @" = substitute(@", '\n', '\\n', 'g') 
endfunction 

vnoremap ,r y:call GetRange()<CR>gvp 

これは、ビジュアル選択ですべての改行を\nに変換し、その文字列で置き換えます。

このマッピングは、選択を"レジスタにヤンクします。関数を呼び出します(その唯一のコマンドから実際には必要ではありません)。その後、gvを使用してビジュアル選択を再選択し、引用レジスターを選択した領域にペーストします。

注:vimscriptでは、すべてのユーザー定義関数は大文字で始まる必要があります。

1

Connerの回答に基づく別のバージョンです。私はqedの提案を受け取り、その選択が完全に1行内にあるときの修正を追加しました。

import vim 

def GetRange(): 
    buf = vim.current.buffer 
    (lnum1, col1) = buf.mark('<') 
    (lnum2, col2) = buf.mark('>') 
    lines = vim.eval('getline({}, {})'.format(lnum1, lnum2)) 
    if len(lines) == 1: 
     lines[0] = lines[0][col1:col2 + 1] 
    else: 
     lines[0] = lines[0][col1:] 
     lines[-1] = lines[-1][:col2 + 1] 
    return "\n".join(lines) 
+0

**ビジュアルブロック**モードでテキストを選択するとどうなりますか?この関数は正しいとは思われません。 – Meow

+0

私のためにうまくいくと思われます。あなたのために何をしていますか? –

関連する問題