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

how to auto update file path in file header with autocmd in vi/vim?

我的 .vimrc 中有一个函数可以自动更新我当前正在编辑的文件,其中包含最后一个 'save' (:w) 的时间戳(已修改)。

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

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

我要更新的文件 header 示例:

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

谢谢! M

您需要对文件路径进行适当的转义,因为您在 :substitute 中同时使用 / 作为分隔符,并且(Unix 风格)替换路径也有 /其中的分隔符。 :substitute 会通过 E488: Trailing characters 提醒您,但您已经 :silent! 它了。

快速解决方法是切换 :substitute 分隔符,希望 # 永远不会出现在文件路径中:

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')"

您的文件名扩展也会从中受益。