如何使用vi/vim中的autocmd自动更新文件头中的文件路径?

如何使用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

我在my.vimrc中有一个函数,它会自动更新我当前编辑的文件,并使用最后一次“保存”(:w)的时间戳(修改)

我还想更新文件名和文件路径。我有一个autocmd可以更新文件名(通过expand(“%”)。至于文件路径,根据我在文档中读到的内容,使用expand(“%:p:h”)应该允许我插入路径(不包括文件名),但它不起作用

任何人都可以告诉我如何在头文件中插入文件路径

我希望更新的文件头示例:

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'
设置;通常,它是打开的,因此
&
~
也必须转义。