【问题标题】:how to auto update file path in file header with autocmd in vi/vim?如何在 vi/vim 中使用 autocmd 自动更新文件头中的文件路径?
【发布时间】:2016-11-14 01:55:42
【问题描述】:

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

我还想更新文件名和文件路径。我有一个更新文件名的自动命令(通过扩展(“%”)。至于文件路径,从我在文档中阅读的内容来看,使用扩展(“%: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

谢谢! M

【问题讨论】:

    标签: vim path vi autocmd


    【解决方案1】:

    您需要对文件路径进行适当的转义,因为您在: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')"
    

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

    【讨论】:

    • 谢谢 Ingo,您提出的所有 3 个解决方案都按预期工作:)。我将使用第二个,似乎最好的适当转义。 (同样也会修改文件名扩展)
    • 哦,Ingo,你能解释一下 '(&magic ? '&~' : ''))' 部分吗?
    • 替换部分的转义取决于'magic'的设置;通常,它是开启的,所以&amp;~ 也必须转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2012-01-15
    • 2021-06-11
    相关资源
    最近更新 更多