参考地址
augroup my_cmdline_window
au!
au CmdWinEnter * let s:old_cmdline_hist = getline(1, line('$')-1)
"旧命令行列表.
au CmdWinLeave * call s:update_history()
"更新当前会话历史,尝试删除`viminfo`已删历史
augroup END
fu! s:update_history() abort
let hist = filter(getline(1, '$'), 'v:val !~# "^\\s*$"')
call histdel(':')
for i in hist
call histadd(':', i)
endfor
"此块仅更新当前会话历史记录
let viminfo = expand('~/.viminfo')
if !filereadable(viminfo)
return
endif
"不可读,则停止.
let info = readfile(viminfo)
let deleted_entries = filter(copy(s:old_cmdline_hist), 'index(hist, v:val) == -1')
"取`info`中内容,用`filter`取已删项
"后者删除不满足后面条件项.
"如果`过滤()`操作旧历史项不在新历史内,则该式为真
call map(deleted_entries, 'index(info, ":".v:val)')
"此行将删除文本项转换为`~/.viminfo`内部行地址
call sort(filter(deleted_entries, 'v:val >= 0'))
if empty(deleted_entries)
return
endif
"排序行地址,删除非正的,避免上一步找不到的(如,索引()返回-1).
"并检查此时是否还有行地址,无则停止
for entry in reverse(deleted_entries)
call remove(info, entry, entry + 1)
endfor
"此块从`信息`中删除相关行,删了2行(项,项+1)
"因为每个命令行中`~/.viminfo`中有2行,第2行为时间戳.反序删除,不必更新要删除行地址(你删一行,下行要减一)
call writefile(info, viminfo, 'b')
"用新内容覆盖`~/.viminfo`.与原来一样,只是去掉`命令行窗口`删除的行.
"使用前,注意,先备份.
endfu
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现