3

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

4

2 回答 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"))
于 2014-08-06T14:58:31.647 回答
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
于 2014-08-07T13:15:54.647 回答