VimはPythonで視覚的な選択範囲の間の文字列を取得します

Source python vim

Here is some text
here is line two of text

Vimでisから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
いいでしょう:
  • 将来の操作のためにこの文字列を取得します
  • 次に、
  • は、この選択された範囲を更新/操作された文字列
  • に置き換えます。
    推奨答え
    これを試して:
    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.evalを使用して、vim関数と変数のPython値を取得できます。
    その他答え 1
    純粋なvimscriptを使用した場合、これはおそらく機能します
    function! GetRange()
        let @" = substitute(@", '\n', '\\n', 'g')
    endfunction
    
    vnoremap ,r y:call GetRange()<CR>gvp
    

    これにより、ビジュアルセレクションですべての改行が\nに変換され、セレクションがその文字列に置き換えられます。

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

    注:vimscriptでは、すべてのユーザー定義関数は大文字で始まる必要があります。
    その他答え 2
    コナーの答えに基づいた別のバージョンがあります。私は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)
    

    関連記事

    Mysql日時形式は10分を追加します
    ジェネレータのthrowメソッドを使用している場合ではなく、例外TypeError警告が表示される場合があります
    ジェネレータのthrowメソッドを使用している場合ではなく、例外TypeError警告が表示される場合があります
    Tastypie移行エラー
    Pythonで、可変長の組み合わせまたは順列を作成するにはどうすればよいですか?