如何使用vi/vim中的autocmd自动更新文件头中的文件路径?
我在my.vimrc中有一个函数,它会自动更新我当前编辑的文件,并使用最后一次“保存”(:w)的时间戳(修改) 我还想更新文件名和文件路径。我有一个autocmd可以更新文件名(通过expand(“%”)。至于文件路径,根据我在文档中读到的内容,使用expand(“%:p:h”)应该允许我插入路径(不包括文件名),但它不起作用 任何人都可以告诉我如何在头文件中插入文件路径 我希望更新的文件头示例:如何使用vi/vim中的autocmd自动更新文件头中的文件路径?,vim,path,vi,autocmd,Vim,Path,Vi,Autocmd,我在my.vimrc中有一个函数,它会自动更新我当前编辑的文件,并使用最后一次“保存”(:w)的时间戳(修改) 我还想更新文件名和文件路径。我有一个autocmd可以更新文件名(通过expand(“%”)。至于文件路径,根据我在文档中读到的内容,使用expand(“%:p:h”)应该允许我插入路径(不包括文件名),但它不起作用 任何人都可以告诉我如何在头文件中插入文件路径 我希望更新的文件头示例: Modified: November 13 2016 Filename: myfile Filep
Modified: November 13 2016
Filename: myfile
Filepath: /home/me/path/tomyfile/
我目前拥有的代码:
autocmd BufWritePre * call UpdHeader()
function! UpdHeader()
" update path <<<<<< DOES NOT WORK >>>>>>>
silent! execute "1," . 10 . "g/Filepath:.*/s//Filepath: " .expand("%:p:h")
" update filename <<WORKS>>
silent! execute "1," . 10 . "g/Filename:.*/s//Filename: " . expand("%")
" update last mod date <<WORKS>>
silent! execute "1," . 10 . "g/Modified:.*/s//Modified: " . strftime("%d %B %Y%t%t%T (%z)%tBy : ") . $USER
...
endf
autocmd BufWritePre*调用UpdHeader()
函数!UpdHeader()
“更新路径>>
静默!执行“1,.10.”g/Filepath:.*/s//Filepath:“.expand”(%:p:h))
“更新文件名
静默!执行“1,.10.”g/Filename:.*/s//Filename:“.expand(%”)
“更新上次修改日期
静默!执行“1,.10.”g/Modified:.*/s//Modified:“.strftime”(%d%B%Y%t%t(%z)%t字节):)。$USER
...
endf
谢谢!
M您需要在文件路径上执行正确的转义,因为您在
:substitute
中同时使用/
作为分隔符,并且(Unix样式)替换路径中也有/
分隔符。:substitute
会通过E488:尾随字符
向您发出警报,但您已经:silent!
它了
快速修复方法是切换:替换分隔符,希望#
永远不会出现在文件路径中:
silent! execute "1," . 10 . "g/Filepath:.*/s##Filepath: " .expand("%:p:h")
最好做适当的逃避:
silent! execute "1," . 10 . "g/Filepath:.*/s//Filepath: " .escape(expand("%:p:h"), '/\'. (&magic ? '&~' : ''))
或者,可以替换为表达式:
silent! execute "1," . 10 . "g/Filepath:.*/s//\\='Filepath: ' .expand('%:p:h')"
您的文件名扩展也会从中受益。谢谢Ingo,您提出的3个解决方案都能按预期工作:)。我将使用第二个,它似乎是正确转义的最佳解决方案。(也将类似地修改文件名扩展)哦,Ingo,您能解释一下“(&magic?&~”:”))“请使用零件?替换零件的转义取决于'magic'
设置;通常,它是打开的,因此&
和~
也必须转义。