【问题标题】:Automatically append current date to file name when saving in Vim在 Vim 中保存时自动将当前日期附加到文件名
【发布时间】:2014-08-06 14:41:47
【问题描述】:

我在阅读学术文章时使用 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。

【问题讨论】:

    标签: vim autocmd


    【解决方案1】:

    你很亲密。我认为最好在创建文件时重命名它;在写入过程中弄乱文件名会使这变得更加困难(例如,如果您重新打开现有笔记,或者只是再次写入缓冲区怎么办?)

    :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 命令保存文件。是否有与您上面提到的类似的东西可以适应这种情况?
    • 为此,将BufNewFile替换为BufWritePre,并处理后续写入。
    • 用 BufWritePre 替换 BufNewFile 仍然没有解决问题,当我在 /path/to/projects 中键入 :w Note 时,文件保存为 Note。但是,通过为“sakura -e 'vim /path/to/projects/Note'”添加一个新的热键映射,我找到了一个不错的解决方法。不过,这仍然将我所有笔记的名称限制为“笔记”。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2023-01-24
      • 2020-10-30
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多