您如何在通过CTRL-V选择的一堆行上调用功能



我正在通过ctrl-v(Visual Mode)选择一些文本。然后我输入 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]。我需要做的是将拆分线存储在矩阵中,计算所需的长度/列,然后将其打印到缓冲区。

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>

当您希望映射在视觉选择上使用时,需要使用:vnoremap。然后,EX命令(例如:call)将自动具有Visual范围'<,'>预先备份。然后,每行一次调用一个普通函数,但是您可以定义一种处理范围本身的特殊功能(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]

最新更新