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

标签 function vim block

我想在 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/

相关文章:

vim - vimrc中将tab设置为2个空格,但编辑python文件时仍设置为4个空格

c++ - 是否可以将 std::deque 的成员函数作为参数传递?

python - 在 python 中,有没有办法在调用函数之前检查函数是否为 "generator function"?

vim - Fortran 77 注释的语法高亮显示在 vim 中不起作用

javascript - 在 node.js 中编写一个 git post-commit 文件

ruby - 我应该在 def 中指定 &block 参数吗?

ios - Swift 如何关闭 Facebook 图 block

json - Nifi - 忽略(或删除)JSON 的第一个数字

swift - 看起来返回键对我的方法不起作用

Swift,如何在 block 中添加函数