Vim函数将代码函数复制到剪贴板

时间:2013-07-10 23:23:29

标签: function vim block

我想在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不会执行V

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

对此有何解决方法?

2 个答案:

答案 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