VimL:如何将行发送到剪贴板?

VimL: How to send lines to clipboard?

我是 vim 脚本的新手。我已经搜索了帮助页面,但可能没有搜索到正确的关键字。

我写了一个小函数来获取两个特定的行号:

let l:pattern  = '^#%%'
let l:start    = search(l:pattern, 'Wb')
let l:end      = search(l:pattern,'W')
if l:end == 0
    let l:end = line('$')
end
let lines = getline(start,end)

我想将范围[start, end] 中的行写入剪贴板。 如何做到这一点?

假设你的 Vim 内置了剪贴板支持 (:echo has('clipboard') returns 1),那么你可以将文本放入任一寄存器 * (selection/right-click) 或者注册 + (Ctrl+C/Ctrl+V) :

let @+ = 'foo'
let @* = 'foo'

不过,在 vimscript 设置中,最好使用 :help setreg(),因为它可以让您更好地控制寄存器中的内容以及它的使用方式。在您的情况下,使用以下命令:

call setreg('+', lines, 'l')

应该用 lines 的内容填充剪贴板寄存器并将其标记为 "linewise"。

或者你可以做不那么优雅但更简单的推理:

execute l:start . ',' . l:end . 'y +'

参见 :help :yank:help :range

如果您不支持剪贴板,则必须将这些行提供给外部工具,例如 Linux 上的 xclip 或 MacOS 上的 pbcopy

execute l:start . ',' . l:end . 'w !pbcopy'

参见 :help :w_c