我想在Vim中使用键盘快捷键将整个功能从Powershell文件复制到Windows剪贴板。这是命令:
1)va{Vok"*y
- 视觉模式,选择{}块,视线模式,转到选择顶部,包含标题行,猛拉到Windows剪贴板。
但它只适用于没有内部{}块的函数。这是一个有效的解决方法:
2)va{a{a{a{a{a{a{Vok"*y
- 与(1)相同,但选择{}块多次完成 - 适用于具有7个内部{}括号的代码块。
但问题是 - 从vim函数调用时,(1)命令工作正常,但是(2)从vim函数调用时行为错误并选择了错误的代码块:
function! CopyCodeBlockToClipboard ()
let cursor_pos = getpos('.')
execute "normal" 'va{a{a{a{a{a{a{Vok"*y'
call setpos('.', cursor_pos)
endfunction
" Copy code block to clipboard
map <C-q> :call CopyCodeBlockToClipboard()<CR>
我在CopyCodeBlockToClipboard中做错了什么? (2)命令在vim中直接执行时按预期工作。
更新:
我注意到了:
看起来vim在这里处理错误的方式不同。额外的{产生一些错误和常规命令执行只是忽略它。但是通过以下函数执行执行:normal会失败并且不会调用V(或者可能是任何跟在错误之后的命令)。
对此有何解决方法?
答案 0 :(得分:1)
尝试此功能
function! CopyCodeBlockToClipboard()
let cursor_pos = getpos('.')
let i = 1
let done = 0
while !done
call setpos('.', cursor_pos)
execute "normal" 'v' . i . 'aBVok"*y'
if mode() =~ "^[vV]"
let done = 1
else
let i = i + 1
endif
endwhile
execute "normal \<ESC>"
call setpos('.', cursor_pos)
endfunction
这预先形成执行命令以选择块,直到它无法选择块较大的块。 ([count]aB
选择[count]
块)当选择失败时,我们最终会以可视模式结束。所以我们可以使用mode()
来检查这一点。
当此功能退出时,您应该处于正常模式,并且光标应该恢复到您开始的位置。该函数将在*
寄存器中。
答案 1 :(得分:1)
这个宏应该接近你想要达到的目标:
?Function<CR> jump to first Function before the cursor position
v enter visual mode
/{<CR> extend it to next {
% extend it to the closing }
"*y yank into the system clipboard