在Vim保存文件时自动添加当前日期到文件名。

3

我使用vim来阅读学术文章并做笔记。我更喜欢为每个笔记创建一个新的文本文件,但是整理它们变得很繁琐。

我想设置一个自动命令来检测我是否在特定目录中写入新文件,并将当前日期和时间附加到我写的任何文件名后。

因此,如果我有:

:pwd
/path/to/projects

当我输入时
:w Notes

我希望用vim将文件保存为“Notes - <当前日期-时间>.txt”。

我认为这需要在我的vimrc中声明以下内容:

autocmd BufNewFile,BufWrite "/path/to/projects/*" <command involving strftime("%Y-%m-%d_%H-%M")>

但我无法弄清楚是什么问题。有什么想法吗?我正在使用Debian Linux上的Vim 7.3。
2个回答

5
你已经非常接近了。我认为最好在创建文件时将文件重命名;在写入过程中更改文件名会使此过程更加困难(例如,如果重新打开现有的注释或仅再次写入缓冲区,怎么办?)。
可以使用:file命令来重命名当前文件;当前文件名位于%特殊标识符中。当创建新文件时触发,它可以完成这项工作:
autocmd BufNewFile /path/to/projects/* execute 'file' fnameescape(expand('%') . strftime(" - %Y-%m-%d_%H-%M.txt"))

如果您不考虑原始文件名,这将变得更加容易:
autocmd BufNewFile /path/to/projects/* execute 'file' fnameescape(strftime("Notes - %Y-%m-%d_%H-%M.txt"))

谢谢您的回复Ingo,这非常接近我所需要的。但是,它要求我从终端启动vim并使用参数作为文件名。我使用Debian的Openbox,并将“sakura -e'vim'”映射到热键,因此我通常通过热键启动vim,开始输入我的笔记,然后使用“:w Note”命令保存文件。是否有类似于您上面提到的东西可以适应这种情况? - Brian Albert Monroe
为此,将BufNewFile替换为BufWritePre,并处理后续的写入。 - Ingo Karkat
将BufNewFile替换为BufWritePre仍未解决问题,当我在“/path/to/projects”中键入“:w Note”时,文件保存为“Note”。但是,我通过添加一个新的热键映射来找到了一个不错的解决方法,用于“sakura -e 'vim /path/to/projects/Note'”代码。然而,这仍然限制了我所有笔记的名称为“Note”。 - Brian Albert Monroe

4

您可能正在寻找以下内容:

function! SaveWithTS(filename) range
    execute "save '" . a:filename . strftime(" - %Y-%m-%d_%H-%M.txt'")
endfunction

command! -nargs=1 SWT call SaveWithTS( <q-args> )

在你的.vimrc文件中添加以上内容后,执行:SWT Note将会把你的文件保存为Note - YYYY-MM-DD_HH-MM.txt。这种方法的缺点是不会自动发生,所以你必须记住第一次写文件时使用:SWT而不是:w,但它确实让你等到准备好保存时再决定文件名(即你不必每次都使用Note)。
编辑:上述版本的SaveWithTS实际上保存了带有单引号的文件名(我的测试有误)。下面是一个修复该问题并且还允许您指定文件扩展名(但默认为.txt)的版本。
function! SaveWithTS(filename) range
    let l:extension = '.' . fnamemodify( a:filename, ':e' )
    if len(l:extension) == 1
        let l:extension = '.txt'
    endif

    let l:filename = escape( fnamemodify(a:filename, ':r') . strftime(" - %Y-%m-%d_%H-%M") . l:extension, ' ' )

    execute "write " . l:filename
endfunction

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接