7
Here is some text
here is line two of text

Vimでistoを視覚的に選択します: (括弧は視覚的な選択を表します)is[ ]

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

Python を使用して、選択範囲のタプルを取得できます。

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

このファイルをソースします: :so %、テキストを視覚的に選択し、実行:<,'>call GetRange()して

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

is some text\nhere is

次のことをお勧めします:

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

3 に答える 3

8

これを試して:

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.evalvim 関数と変数の python 値を取得するために使用できます。

于 2013-08-11T02:09:32.553 に答える
4

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

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

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

これにより、すべての改行がビジュアル選択に変換さ\nれ、選択がその文字列に置き換えられます。

このマッピングは、選択を"レジスターにヤンクします。関数を呼び出します (コマンドは 1 つしかないため、実際には必要ありません)。次に、 を使用gvしてビジュアル選択を再選択し、クオート レジスタを選択した領域に貼り付けます。

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

于 2013-08-10T20:46:17.327 に答える