7
Here is some text
here is line two of text

我在 Vim 中直观地选择 from 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.eval获取 vim 函数和变量的 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为可视选择,并用该字符串替换选择。

此映射将选择拉入"寄存器。调用函数(实际上没有必要,因为它只有一个命令)。然后用于gv重新选择视觉选择,然后将引用寄存器粘贴回所选区域。

注意:在 vimscript 中,所有用户定义的函数都必须以大写字母开头。

于 2013-08-10T20:46:17.327 回答
3

这是基于康纳回答的另一个版本。我接受了 qed 的建议,还为选择完全在一行内时添加了修复。

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)
于 2015-01-14T06:08:39.563 回答