如何在通过Ctrl-v选择的一堆行上调用函数?

时间:2012-12-29 12:01:20

标签: python vim

我通过Ctrl-v(可视模式)选择一些文本。然后我输入 \ s来对齐这些行并对它们进行排序:

"Strip trailing space
 :map <Leader>S :1,$ s/\s\+$//g<CR>
:imap <Leader>S :1,$ s/\s\+$//g<CR>

如何将所有选定的行传递给Sort()。我以为 vim.current.range 对象可能会这样做,但是没有成功。 目前,Sort()函数一次读取文本1行 CR [0]。我需要做的是将分割线存储在一个矩阵中, 计算所需的长度/列并将其打印到 缓冲液中。

function! Sort()
python << EOF
import vim
cr = vim.current.range
line = cr[0]
line = line.split()
fmt_str = ['%8s' for word in line]
fmt_str = ' '.join(fmt_str)

line = tuple([word for word in line])
print(fmt_str)
cr[0]= fmt_str % line
EOF
endfunction

"Sort and align
:map <Leader>s :call Sort()<CR>

1 个答案:

答案 0 :(得分:2)

如果希望映射处理视觉选择,则需要使用:vnoremap。然后,Ex命令(如:call)将自动具有前置视觉范围'<,'>。然后每行调用一次普通函数,但是您可以定义一种特殊类型的函数(cp。:help function-range-example)来处理范围本身。

由于您似乎想要使用Python,我只需通过<C-u>删除前置范围并通过<>标记访问选区的边界,然后访问和修改这些行通过vim.current.buffer[lnum]

:vnoremap <Leader>s :<C-u>call Sort()<CR>
function! Sort()
    ...
    start = vim.current.buffer.mark('<')[0]
    end = vim.current.buffer.mark('>')[0]