如何在Vim命令行输入文本但不执行?含自定义时间戳前缀需求
实现Vim命令行预填带时间戳的保存前缀
嘿,这个需求我太有共鸣了!平时用Vim记笔记、整理文档时,总希望能快速生成带日期前缀的保存命令,还能手动补全文件名——刚好有个简单又好用的解决方案,完美解决你说的“停在命令模式不执行”的问题。
核心思路
Vim的feedkeys()函数可以模拟键盘输入,关键是只输入命令前缀,不添加回车,同时用参数确保输入直接写入命令行,不会触发自动执行。
具体实现步骤
- 先在你的
~/.vimrc(或~/.config/nvim/init.vim如果你用Neovim)里添加这个自定义函数:
function! SaveWithTimestampPrefix() " 生成YYYYMMDD_格式的时间戳,可按需修改格式 let l:timestamp = strftime('%Y%m%d_') " 把:sav 时间戳写入命令行,'n'参数避免触发映射,停在命令行等待输入 call feedkeys(":sav " . l:timestamp, 'n') endfunction
- 给这个函数绑定一个顺手的快捷键,比如我习惯用
<Leader>s(Leader键默认是反斜杠\):
nnoremap <Leader>s :call SaveWithTimestampPrefix()<CR>
怎么用?
在普通模式下按<Leader>s,命令行就会自动出现 :sav 20240520_(日期是当前系统日期),光标刚好停在下划线后面——你直接输入笔记的名字(比如vim_notes),按回车就会把当前文件另存为20240520_vim_notes啦!
自定义小技巧
- 想要更精细的时间格式?修改
strftime()的参数就行:- 带时分秒:
strftime('%Y%m%d_%H%M%S_'),生成20240520_143022_ - 带月份名称:
strftime('%Y%b%d_'),生成2024May20_
- 带时分秒:
- 如果不想用
sav(:saveas的缩写),换成:w或者其他命令也完全可以,只要修改feedkeys里的字符串就行。
为什么这个方法能解决你的核心问题?
之前你可能尝试过用宏或者简单的输入,但容易不小心触发自动执行——这个方法里,我们没有传入回车符<CR>,而且feedkeys的'n'参数确保输入直接写入命令行缓冲区,不会触发任何自动执行的逻辑,完美停在命令模式等待你补充文件名。
内容的提问来源于stack exchange,提问作者blake
相关产品推荐
相关产品推荐

