Vim 将变量或寄存器导出到文件

Vim 将变量或寄存器导出到文件,vim,Vim,我正在尝试将变量导出到文件: 为了简化我现在正在做的事情,我使用变量@“,它包含当前寄存器的内容: function! CopyVar() call system("printf '%s' '".@"."' > /tmp/varfile") endfunction nnoremap <Leader>y :call CopyVar()<cr> function!CopyVar() 调用系统(“printf'%s'”@“>/tmp/varfile”) 端功能 nn

我正在尝试将变量导出到文件:

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

function! CopyVar()
  call system("printf '%s' '".@"."' > /tmp/varfile")
endfunction
nnoremap <Leader>y :call CopyVar()<cr>
function!CopyVar()
调用系统(“printf'%s'”@“>/tmp/varfile”)
端功能
nnoremap y:调用CopyVar()
这可以很好地工作,但如果变量包含单引号(例如),则不起作用

例如,如果输入是
“hi”
,则命令失败,出现
E484:cannotopenfile/tmp/v7IzDCI/74

我想我可以
转义
@“
(因为如果
存在单引号,命令将失败),但是,我不确定这是将变量导出到文件的最佳方法

我如何才能保证它能与任何输入(带引号、多行和其他特殊字符)一起工作


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

@“
是一个寄存器,而不是一个变量

您可以使用替换来清理文本:

let foo = substitute(getreg('"'), "'", "\"", "g")
在“写入”步骤之前


我会让您找出需要清理的模式。

这就是
shellescape()
的目的。顺便说一句,为了更好地引用,我会这样编写您的函数:

function! CopyVar()
  let cmd="printf '%s'". shellescape(@") . " > /tmp/varfile"
  call system(cmd)
endfunction
nnoremap <Leader>y :call CopyVar()<cr>
这会在开头添加一个额外的前导空行,但您可以在以后使用sed或其他方法删除它

或者更好地使用
writefile()
函数:

nnoremap <Leader>y :call writefile(split(@", '\n'), '/tmp/varfile')
nnoremap y:调用writefile(拆分(@“,“\n”),“/tmp/varfile”)

使用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>
函数!CopyVar()
重拨!>/tmp/varfile | sil exe“echo@”| redir end
呼叫系统(“sed'1d'/tmp/varfile>/tmp/tmpvarfile;mv/tmp/tmpvarfile/tmp/varfile”)
端功能
nnoremap y:调用CopyVar()

它适用于任何字符。第二部分是必需的,因为重定向将添加一个不需要的额外换行符,因此使用sed命令。

“这不是我在这里想要实现的“那么……你到底想实现什么呢?我正试图将变量的完整内容导出到一个文件中。这样我就可以在vim之外的其他程序中重复使用它,而您不使用剪贴板,因为?@romainl因为我使用ssh,不允许安装XServer这是一个合理的原因,但是…如果您需要在线路上粘贴内容,您的工作流程就会中断。这将用
替换
这是不需要的。我试着用
替换(getreg(“”)、““”、“\\\\”、“g”)
来正确地进行替换,但是printf仍然失败。现在不会触发错误,但是,新行替换为\newline,
%s
替换为“”(尝试用
y
复制函数本身的文本)WFM。但是,您的代码看起来过于复杂。类似这样的代码如何:
:redir!>/tmp/varfile | exe'echo@'| redir end
这会在文件开头添加一个额外的空行,但可以在以后删除
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>