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>