参考地址
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
















