我想在 Vim 中使用键盘快捷键将整个函数从 Powershell 文件复制到 Windows 剪贴板。这是它的命令:
1) va{Vok"*y
- 视觉模式,选择 {} block ,视觉线模式,转到选择顶部,包括标题行,复制到 Windows 剪贴板。
但它仅适用于没有内部 {} block 的函数。这是一个有效的解决方法:
2) va{a{a{a{a{a{a{Vok"*y
) - 与 (1) 相同,但选择 {} block 会进行多次 - 可以工作适用于具有 7 个内部大括号的代码块。
但问题是 - (1) 命令在从 vim 函数调用时工作正常,但 (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 中做错了什么? 当直接在 vim 中执行时,(2) 命令按预期工作。
更新:
我注意到:
- 如果有更多的a{,则函数中包含的 block
- 那么 vim 就不会执行 V
看起来 vim 在这里处理错误的方式不同。额外的 a{ 会产生一些错误,常规命令执行会忽略它。但是通过 :normal 从 withing 函数执行失败并且不会调用 V (或者可能是错误后的任何命令)。
有什么解决办法吗?
最佳答案
试试这个功能
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
这会执行一个执行命令来选择 block ,直到无法选择更大的 block 为止。 ([count]aB
选择 [count]
block )似乎当选择失败时,我们最终会进入可视模式。所以我们可以使用 mode()
来检查这一点。
当此功能退出时,您应该处于正常模式,并且光标应该恢复到开始的位置。该函数将位于 *
寄存器中。
关于function - Vim 函数将代码函数复制到剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17582602/