如何使用 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')"
您的文件名扩展也会从中受益。
我的 .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')"
您的文件名扩展也会从中受益。