导出变量或注册到文件

时间:2015-09-16 13:39:54

标签: vim

我试图将变量导出到文件中:

为了简化我现在正在做的事情,我使用包含当前寄存器内容的变量@"

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 @"(因为如果存在'单引号,命令就会失败),但是,我不确定它是否是最好的将变量导出到文件的方法。

我该如何保证它可以用于任何输入(带引号,多行和其他特殊字符)?

我知道你可以使用系统剪贴板,但这不是我想要在这里实现的。

3 个答案:

答案 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命令。