1

我的 .vimrc 中有一个函数,它可以使用上次“保存”(:w) 的时间戳(修改)自动更新我当前正在编辑的文件。

我还想更新文件名和文件路径。我有一个更新文件名的自动命令(通过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

谢谢!米

4

1 回答 1

1

您需要在文件路径上执行正确的转义,因为您将/两者用作分隔符:substitute,并且(Unix 样式)替换路径中也有/分隔符。:substitute会提醒你的 via 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')"

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

于 2016-11-15T09:57:20.460 回答