【问题标题】:Vim function to copy a code function to clipboardVim 函数将代码函数复制到剪贴板
【发布时间】:2013-07-10 23:23:28
【问题描述】:

我想在 Vim 中使用键盘快捷键将整个函数从 Powershell 文件复制到 Windows 剪贴板。这是它的命令:

1) va{Vok"*y - 可视模式,选择 {} 块,可视行模式,转到选择顶部,包括标题行,拉到 Windows 剪贴板。

但它只适用于没有内部 {} 块的函数。这是一个有效的解决方法:

2) va{a{a{a{a{a{a{Vok"*y - 与 (1) 相同,但多次选择 {} 块 - 适用于具有 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 中做错了什么? (2) 命令在 vim 中直接执行时按预期工作。

更新:

我注意到了:

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

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

有什么解决方法吗?

【问题讨论】:

  • 从外观上看,您想从函数中的任意位置执行此操作。这是正确的吗?
  • 是的。函数中使用 {} 大括号表示代码块并始终使用一行作为函数标题的函数中的任何位置。

标签: function vim block


【解决方案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 selects [count] blocks) It seems when the selection fails we end up in visual mode.所以我们可以使用mode() 来检查这一点。

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

【讨论】:

    【解决方案2】:

    这个宏应该接近你想要实现的目标:

    ?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
    

    【讨论】:

    • 我知道如何通过q​​录制这个宏。但我不知道如何把它放在一个函数中。 ':normal ?FunctionCR' 显然不起作用。我也可以将此类宏保存为 bin 形式,但这不会保留当前光标位置。
    • 这是我想出的。但它不起作用,我的 vim 知识不足以找出问题所在:function! CopyCodeBlockToClipboard()let cursor_pos = getpos('.')let @q = '?function\|filter&lt;CR&gt;v/{&lt;CR&gt;%"*y'execute 'normal @q'call setpos('.', cursor_pos)endfunction
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2017-09-10
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多