2

我想在 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 中直接执行时按预期工作。

更新:

我注意到:

  • 如果有更多 a{ 则函数中包含的块
  • 那么 vim 不会执行 V

看起来 vim 在这里处理错误的方式不同。额外的 a{ 会产生一些错误,并且常规命令执行会忽略它。但是通过 :normal 使用函数执行失败并且不会调用 V (或者可能是错误之后的任何命令)。

有什么解决方法吗?

4

2 回答 2

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]aBselects [count]blocks) It seems when the selection fails we end up in visual mode. 所以我们可以用mode()这个来检查。

当此功能退出时,您应该处于正常模式,并且光标应该恢复到您开始的位置。该功能将在*寄存器中。

于 2013-07-11T02:11:52.843 回答
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
于 2013-07-11T08:18:44.150 回答