根据日期打开文件的自定义Vim命令

3

我正在尝试简化我的流程并根据日期自动打开或创建文件。我一天中会频繁地访问这个文件。之前,我使用以下命令,然后我必须导航到该文件,或者为当天创建它。

map <Leader>gn :e ~/Dropbox/notes<cr>

我正在尝试使用类似于以下内容的东西。它是有效的,唯一的问题是它不会打开文件,我必须按,gt然后enter。上面的命令将在不按Enter的情况下打开文件夹。

map <Leader>gt :e ~/Dropbox/notes/journal/<C-r>=strftime("%Y-%m-%d") . '.md'<cr>


有点傻的回答,但你不能只是在映射的结尾添加另一个<cr>吗?这对我有效。添加G会将您放在文件的末尾... - moopet
1
哈哈,就是这样。谢谢@moopet,如果你想提交答案,我会接受它。 - Riley Bracken
2个回答

1
任何时候,当Vim在映射中等待按下Enter键时,您可以添加另一个<cr>
如果文件已经存在,这将把光标向下移动一行,因此为了保持一致,让我们添加一个G,以便将您带到文件底部(毕竟这是一个日志)。将其更改为:
map <Leader>gt :e ~/Dropbox/notes/journal/<C-r>=strftime("%Y-%m-%d") . '.md'<cr><cr>G

1
我建议使用nnoremap而不是普通的map - Peter Rincker

0

Vimscript 的评估方式与在 : 命令行中键入的 Ex 命令完全相同。在 ex 中没有变量,因此无法指定它们。当交互式地输入命令时,您可能会使用 <C-R>= 来插入变量内容:

:sleep <C-R>=timetowait<CR>m<CR>

...但在脚本中,必须使用:execute。在映射中,这通常更易读。(这就是为什么我将其添加到接受的答案中的原因。)Ex命令的所有文字部分都必须用引号(单引号或双引号)括起来,然后与变量连接:

execute 'sleep' timetowait . 'm'

你的例子

map <Leader>gt :execute 'e ~/Dropbox/notes/journal/' . strftime("%Y-%m-%d") . '.md'<cr>G

使用printf()的变量(当有许多标识符时更易读):

map <Leader>gt :execute printf('e ~/Dropbox/notes/journal/%s.md', strftime("%Y-%m-%d"))<cr>G

另一个选择是使用:help map-expr
map <expr> <Leader>gt printf(":e ~/Dropbox/notes/journal/%s.md\<CR>G", strftime("%Y-%m-%d"))

额外的批评

  • 你应该使用:noremap; 它使映射免疫重映射和递归。
  • 此外,这主要只在正常模式下有意义,因此最好使用:nnoremap

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