2

我正在通过 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() 函数通过 cr[0] 一次读取 1 行文本。我需要做的是将分割线存储在矩阵中,计算所需的长度/列并将它们打印到缓冲区中。

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>
4

1 回答 1

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]
于 2012-12-29T12:27:13.947 回答