首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vim使用Python获取可视选择范围之间的字符串

Vim使用Python获取可视选择范围之间的字符串
EN

Stack Overflow用户
提问于 2013-08-10 20:17:37
回答 3查看 2K关注 0票数 7
代码语言:javascript
复制
Here is some text
here is line two of text

我在Vim中直观地从is选择到is:(括号表示视觉选择[ ])

代码语言:javascript
复制
Here [is some text
here is] line two of text

使用Python,我可以获得所选内容的范围元组:

代码语言:javascript
复制
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. 然后用更新/操作的字符串替换这个选定的范围。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-11 02:09:32

试试这个:

代码语言:javascript
复制
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值。

票数 8
EN

Stack Overflow用户

发布于 2013-08-10 20:46:17

如果您使用纯vimscript,这可能会奏效。

代码语言:javascript
复制
function! GetRange()
    let @" = substitute(@", '\n', '\\n', 'g')
endfunction

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

这将将可视选择中的所有换行符转换为\n,并将选择替换为该字符串。

此映射将所选内容插入"寄存器。调用该函数(因为它只有一个命令,所以并不是真正必要的)。然后使用gv重新选择视觉选择,然后将引号寄存器粘贴回选定区域。

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

票数 4
EN

Stack Overflow用户

发布于 2015-01-14 06:08:39

这是康纳回答的另一个版本。我采纳了qed的建议,并在选择完全在一行的情况下添加了一个补丁。

代码语言:javascript
复制
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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18165973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档