我有一个包含以下字符串的模板文件:
{{date}} {{time24}} Some text.
我想{{date}} {{time}}
用键盘映射上的当前日期和时间替换。
我目前有:
:nnoremap <leader>d :%s@{{date}} {{time24}}@\=system('/path/to/script.sh')@<CR><CR>
在脚本中,我有:
#!/bin/bash
date "+%Y-%m-%d %H:%M" | tr -d '\n'
我遇到的问题是这会从我的 中引入文本.bashrc
。
有没有办法从 vim 内部完成这一点,或者有更简单的方法来完成这一点?
答案1
或者你可以在一个地方完成所有操作:
nnoremap <leader>d :s/{{date}}\s*{{time24}}/\=strftime("%Y.%m.%d %H:%M:%S")<CR>
在哪里…
- 你不需要维护单独的脚本,
:source
避免使用脚本的任何潜在副作用(延迟、不存在的文件、自动命令等),- 你只使用一个替代品,
- 并调用一次
strftime()
。
答案2
我创建了一个 vimscript 文件(foo.txt),其中包含以下文本:
:s/{{date}}/\=strftime("%Y%m%d")/
:s/{{time24}}/\=strftime("%H:%M:%S")/
这两个命令是 sed 命令,它们将模板字符串替换为字符串格式的时间,该格式由标准日期和时间变量指定。第一个命令涵盖日期;第二个命令涵盖时间。
我已将键盘映射更改为以下内容:
:nnoremap <leader>d :source! /path/to/foo.vim<CR>
在这里,在正常模式下,我在输入我的键绑定时触发非递归重映射,在本例中leader d
为 ,d
代表日期。此键绑定执行源命令,该命令执行上面给出的脚本,然后按顺序执行每个命令,首先替换日期,然后替换时间。
现在日期和时间已替换,没有问题。