我试图将变量导出到文件中:
为了简化我现在正在做的事情,我使用包含当前寄存器内容的变量@"
:
function! CopyVar()
call system("printf '%s' '".@"."' > /tmp/varfile")
endfunction
nnoremap <Leader>y :call CopyVar()<cr>
这样可以正常工作,但如果变量包含单引号,则无法正常工作。
如果输入是例如" hi '
,则命令将失败并显示E484: Can't open file /tmp/v7IzDCI/74
我想我可以escape
@"
(因为如果存在'
单引号,命令就会失败),但是,我不确定它是否是最好的将变量导出到文件的方法。
我该如何保证它可以用于任何输入(带引号,多行和其他特殊字符)?
我知道你可以使用系统剪贴板,但这不是我想要在这里实现的。
答案 0 :(得分:3)
这就是shellescape()
的用途。 BTW为了更好的引用,我会写这样的函数:
function! CopyVar()
let cmd="printf '%s'". shellescape(@") . " > /tmp/varfile"
call system(cmd)
endfunction
nnoremap <Leader>y :call CopyVar()<cr>
但是,通过在复杂的VimL引用中添加一些shell引用,您的解决方案看起来过于复杂。这不是必需的。我宁愿做不同的事情:
:redir! > /tmp/varfile | sil exe 'echo @"' |redir end
这会在开头添加一个额外的前导空行,但您可以使用sed或其他内容删除它。
甚至更好,使用writefile()
功能:
nnoremap <Leader>y :call writefile(split(@", '\n'), '/tmp/varfile')
答案 1 :(得分:0)
@"
是一个寄存器,而不是变量。
您可以使用替换来清理文字:
let foo = substitute(getreg('"'), "'", "\"", "g")
在&#34;写&#34;之前步骤
我会让你弄清楚你需要清理哪些模式。
答案 2 :(得分:0)
使用redir可能是最强大的解决方案
function! CopyVar()
redir! > /tmp/varfile | sil exe 'echo @"' |redir end
call system ("sed '1d' /tmp/varfile > /tmp/tmpvarfile; mv /tmp/tmpvarfile /tmp/varfile")
endfunction
nnoremap <Leader>y :call CopyVar()<cr>
适用于任何角色。第二部分是必需的,因为重定向将添加一个不需要的额外换行符,因此是sed命令。