在Vim中保存时自动将当前日期附加到文件名

时间:2014-08-06 14:41:48

标签: vim autocmd

我正在使用vim在阅读学术文章时做笔记。我更喜欢为我拍的每个音符都有一个新的文本文件,但是组织它们会变得单调乏味。

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

所以,如果我有:

:pwd
/path/to/projects

当我输入

:w Notes

我想将vim保存为 “Notes - <CURRENT DATE - TIME >.txt

我认为它涉及在我的vimrc中声明类似下面的内容:

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

但我无法弄清楚是什么。有任何想法吗?我在Debian Linux上使用Vim 7.3。

2 个答案:

答案 0 :(得分:4)

你非常接近。我认为最好在创建文件时重命名该文件;在写入过程中弄乱文件名会使这更加困难(例如,如果重新打开现有注释,或者只是再次写入缓冲区会怎样?)

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

答案 1 :(得分:1)

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

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 - YYYY-MM-DD_HH-MM.txt。这样做的缺点是不会自动发生,所以你必须记住使用:SWT而不是:w第一次写你的文件,但它确实让你等到你准备保存以决定你的文件名应该是什么(即你每次都不会被注意到。)

编辑:上面版本的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