我通过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>
答案 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]