vim中删除命令行.

参考地址

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
posted @   zjh6  阅读(24)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示