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
。
我是 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
。