万年历 购物 网址 日历 小说 | 三峰软件 天天财富 小游戏 视频推荐 小游戏
TxT小说阅读器
↓小说语音阅读,小说下载↓
一键清除系统垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放,产品展示↓
首页  日历2024  日历2025  日历2026  日历知识  | 每日头条  视频推荐  数码知识 两性话题 情感天地 心理咨询 旅游天地 | 明星娱乐 电视剧  职场天地  体育  娱乐 
日历软件  煮酒论史  历史 中国历史 世界历史 春秋战国 三国 唐朝 宋朝 明朝 清朝 哲学 厚黑学 心理学 | 文库大全  文库分类 
电影票房 娱乐圈 娱乐 弱智 火研 中华城市 仙家 六爻 佛门 风水 钓鱼 双色球 戒色 航空母舰 网球 乒乓球 足球 nba 象棋 体操
    
  知识库 -> 数码 -> Vim 到底可以配置得多漂亮? -> 正文阅读

[数码]Vim 到底可以配置得多漂亮?

[收藏本文] 【下载本文】
求一个极限, 配置成如下样式: 请问还有什么可以美化和提升的地方么? 或者一些美化的插件, 或者补丁. OS: Windows 7 SP1 Ultim…
我已经尽力让它看起来像 vscode 了..


--- 一觉睡醒 突然炸了---
再补几张图吧。






仓库地址:
https://github.com/askfiy/SimpleNvim
主题是我自己写的:
https://github.com/askfiy/visual_studio_code?github.com/askfiy/visual_studio_code
-- 正经一下,为什么用 vim --
最初我用 jb 家的产品,大概一年,奈何启动速度慢。
后面用了 vscode,但那时候 vim 插件非常卡。
原因是 vim 插件和其他插件公用一个线程,影响编辑体验,卡到批爆。现在在 vscode 的仓库里搜性能问题,估计还能搜出一大堆。
换了 nvim vscode 插件,可视模式有问题。弃坑… vsc 总共用了大半年吧,我还是挺喜欢他的…
一个最重要的原因就是手腕疼,那时候天天晃鼠标,一到晚上就疼…
---
另外我用 wm 而不是 de,vim 恰好能配合我的工具链。
Range tmux dwm lazygit firfox 的 vim 插件
一整套下来我完全可以丢掉鼠标。
我百分之 99% 的时间都在 terminal 中,可以快速去到任何我想去的目录。
nvim 最吸引我的是它的自由度。你不爽的地方你都可以改,可以改源码重新编译,可以撸你自己想要的插件而且非常简单。启动速度超快,基本 50 毫秒左右搞定…
我想要的功能,现有插件不具备我的需求就自己撸一个,总会有解决办法的。
如果以上你都觉得没有说服力,那么最后一个原因就是: 我乐意!!!
漂亮是次要的,顺手是主要的。
我用的是neovim,neovim用lua配置,比vimscript好写多了,而且还快。
一共用了36个插件/配色方案,用packer管理插件,用mason管理lsp,一共只装了5个lsp,主要写点python,c,还有LaTeX写写论文文档啥的。


Packer.nvim


LSP


文件树


Telescope快速查找文件


Telescope快速查函数


命令补全


函数签名


自动补全的时候也能看


补全和提示效果
附Plugins列表

    -- Packer can manage itself
    use 'wbthomason/packer.nvim'
    -- Language Server Protocol Configuration
    use 'neovim/nvim-lspconfig'
    -- Language Server Protocol Manager
    use 'williamboman/mason.nvim'
    use 'williamboman/mason-lspconfig.nvim'
    -- Tip tools
    use 'kosayoda/nvim-lightbulb'
    use 'ray-x/lsp_signature.nvim'
    -- Devicons
    use 'nvim-tree/nvim-web-devicons'
    -- File tree
    use 'nvim-tree/nvim-tree.lua'
    -- Alternate toggler <leader>ta
    use 'rmagatti/alternate-toggler'
    -- Brackets auto pair
    use 'windwp/nvim-autopairs'
    -- Multi-editing <c-n>
    use 'mg979/vim-visual-multi'
    -- Object selecting press <cr>
    use 'gcmt/wildfire.vim'
    -- Fast brackets adding
    use 'tpope/vim-surround'
    -- Status line
    use {
        'nvim-lualine/lualine.nvim',
        requires = {
            'kyazdani42/nvim-web-devicons',
            opt = true
        }
    }
    -- Buffer line
    use 'akinsho/bufferline.nvim'
    -- Telescope
    use {
        'nvim-telescope/telescope.nvim', tag = '0.1.1',
        requires = { { 'nvim-lua/plenary.nvim' } }
    }
    -- Complete
    use 'hrsh7th/cmp-nvim-lsp'
    use 'hrsh7th/cmp-buffer'
    use 'hrsh7th/cmp-path'
    use 'hrsh7th/cmp-cmdline'
    use 'hrsh7th/nvim-cmp'
    use 'hrsh7th/cmp-nvim-lua'
    -- Snippet
    use 'L3MON4D3/LuaSnip'
    use 'saadparwaiz1/cmp_luasnip'
    -- Complete icons
    use 'onsails/lspkind-nvim'
    -- Eslint
    use 'jose-elias-alvarez/null-ls.nvim'
    -- Treesitter
    use 'nvim-treesitter/nvim-treesitter'

    -- Comment toggler
    use 'terrortylor/nvim-comment'
    -- Colorschemes
    use 'rebelot/kanagawa.nvim'
    use 'titanzero/zephyrium'
    use 'rafamadriz/neon'
    use 'Mofiqul/dracula.nvim'
    -- LaTeX Support
    use 'lervag/vimtex'
    -- Code outline
    use 'stevearc/aerial.nvim'
    -- Color Preview
    use 'norcalli/nvim-colorizer.lua'

送礼物
还没有人送礼物,鼓励一下作者吧


vim的美化主要是靠插件完成的,对新手来说,经常将各个插件的配置写到一个文件中,一坨陀的,既不美观,修改的时候也不方便,如果某天突然不想用这个插件了,就要去注释掉或者删掉一大片自己辛辛苦苦写的配置,费时费力。
我写了一个很简单的vim配置,每个插件都拥有自己单独的配置文件,我们只需要在配置文件中对相应的插件进行配置就可以了,不影响其他插件的配置。另外,我们拥有一个管理插件的文件,我们需要什么插件,就写在这里面,当vim启动的时候,我的配置会依据插件文件自动载入对应的插件配置。整个配置的结构简单明了。你甚至可以将插件的配置直接拿出来放到自己的vim配置文件中使用。
fgheng/vime?github.com/fgheng/vime


下面放几张图片吧








分割线,推荐下我最近写的一个linux下的键盘音效软件
ever:linux键盘音效 keysound21 赞同 · 19 评论文章


keysound?github.com/fgheng/keysound
分割线,推荐下我最近写的一个winbar插件
ever:Neovim新特性winbar25 赞同 · 1 评论文章


配来配去,最终成了vscode的模样,那为啥不直接用vscode呢?
-------------------分割线
评论区好多来教我做人的,还有直接贴配置文件链接的
我就职于某 iot broker 公司研发岗,怎么可能不会用这些…再说了,配置、插件啥的,大都依赖网络下载吧,生产环境都不做网络隔离的么……
开发就在vsc上做,上服务器就黑底白字vi(很多生产环境没有vim),花点时间出去玩,花点时间陪陪家人,剩下的交给插件市场点击即用不好么
现在甚至懒的开发环境都不配了,环境打一个docker vsc远程进去。当然了,这个docker镜像也是别人做的,我比较懒
vim无插件版小升级
除了vim自带的插件外,在不安装其他插件的情况下,想让vim变得更加符合自己的使用习惯,所以就最近就又重新整理了无插件配置的vimrc,需要使用这个配置的vim的时候,使用下方命令即可调用:

vim -u ~/.vim/vimrc demo.py

其中~/.vim/vimrc为无插件配置保存的位置。也可以修改环境变量,设置一个别名,方便调用,在Mac上,可以将下方内容添加到~/.zprofile中,保存退出后,重启终端就可以使用mvim这个别名来启动无插件配置的vim了,如果你已经装有macvim,建议使用别的名字来命名。

alias mvim="/usr/local/bin/vim -u ~/.vim/vimrc"

这次主要是添加了tab栏的优化,显示标签序号、设置颜色高亮、绑定快捷键方便切换等等
vimrc

"-----------------------------------------------"
"               基础设置                        "
"-----------------------------------------------"
set modelines=0                          " 禁用模式行(安全措施)
syntax on                                " 语法高亮
filetype on                              " 开启文件类型检测
colorscheme desert

set encoding=utf-8                       " 编码设置
set number                               " 显示行号
set relativenumber                       " 显示相对行号
set smartindent                          " 智能缩进
set autoindent                           " 自动对齐

set smarttab
set tabstop=4                            " tab缩进
set shiftwidth=4                         " 设定自动缩进为4个字符
set expandtab                            " 用space替代tab的输入
set splitright                           " 设置左右分割窗口时,新窗口出现在右侧
set splitbelow                           " 设置水平分割窗口时,新窗口出现在底部

set nobackup                             " 不需要备份
set noswapfile                           " 禁止生成临时文件
set autoread                             " 文件自动检测外部更改
set clipboard=unnamed                    " 共享剪切板

set nocompatible                         " 去除vi一致性
set ambiwidth=double                     " 解决中文标点显示的问题
set nowrap                               " 不自动折行
set mouse=a                              " 使用鼠标
set mousehide                            " 输入时隐藏光标
set sidescroll=10                        " 移动到看不见的字符时,自动向右滚动是个字符

set sm!                                  " 高亮显示匹配括号
set hlsearch                             " 高亮查找匹配
set cursorline                           " 高亮显示当前行
set termguicolors                        " 启用终端真色

set showmatch                            " 显示匹配
set ruler                                " 显示标尺,在右下角显示光标位置
set novisualbell                         " 不要闪烁
set showcmd                              " 显示输入的命令

set laststatus=2                         " always show statusline
set showtabline=2                        " always show tabline
set vb t_vb=

" 设置代码折叠---------------------------------
"  set nofoldenable             " 启动 vim 时关闭折叠代码
"  set foldmethod=indent        " 设置语法折叠
"  setlocal foldlevel=99        " 设置折叠层数
"  nnoremap <space> za          " 用空格键来开关折叠

" 设置光标样式-------------------------------
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"

set completeopt=longest,menu             " 自动补全配置让Vim补全菜单行为跟IDE一致
set backspace=indent,eol,start           " 允许用退格键删除字符
let g:markdown_fenced_languages =['c', 'cpp', 'python', 'javascript']
set guifont=Hack_Nerd_Font_Mono:h16      " 设置字体和字体大小, 只对gui客户端起作用,终端使用需要修改终端字体和大小
" 禁止显示滚动条
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
" 禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T

" 设置状态行-----------------------------------
" 设置状态行显示常用信息
" %F 完整文件路径名
" %m 当前缓冲被修改标记
" %m 当前缓冲只读标记
" %h 帮助缓冲标记
" %w 预览缓冲标记
" %Y 文件类型
" %b ASCII值
" %B 十六进制值
" %l 行数
" %v 列数
" %p 当前行数占总行数的的百分比
" %L 总行数
" %{...} 评估表达式的值,并用值代替
" %{"[fenc=".(&fenc==""?&enc:&fenc).((exists("+bomb") && &bomb)?"+":"")."]"} 显示文件编码
" %{&ff} 显示文件类型
set statusline=%1*%F%m%r%h%w%=\ 
set statusline+=%2*\ %Y\ \|\  
set statusline+=%3*%{\"\".(\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\"+\":\"\").\"\"}\ 
set statusline+=%4*[%l:%v]\ 
set statusline+=%5*%p%%\ \|\ 
set statusline+=%6*%LL\ 

hi User1 cterm=none ctermfg=gray ctermbg=darkgray
hi User2 cterm=none ctermfg=darkgrey ctermbg=gray
hi User3 cterm=bold ctermfg=darkgrey ctermbg=gray
hi User4 cterm=bold ctermfg=yellow ctermbg=gray
hi User5 cterm=none ctermfg=darkgrey ctermbg=gray
hi User6 cterm=none ctermfg=darkgrey ctermbg=gray

" 设置tab栏-------------------------------------------------
" 选中的tab颜色
hi SelectTabLine term=Bold cterm=Bold ctermfg=DarkYellow ctermbg=LightGray
hi SelectPageNum cterm=None ctermfg=DarkRed ctermbg=LightGray
hi SelectWindowsNum cterm=None ctermfg=DarkCyan ctermbg=LightGray
" 未选中状态的tab
hi NormalTabLine cterm=None ctermfg=Gray ctermbg=DarkGray
hi NormalPageNum cterm=None ctermfg=Gray ctermbg=DarkGray
hi NormalWindowsNum cterm=None ctermfg=Gray ctermbg=DarkGray
" tab栏背景色
hi TabLineFill term=reverse ctermfg=5 ctermbg=7 guibg=#6c6c6c

function MyTabLine()
    let s = ''
    for i in range(tabpagenr('$'))
        " select the highlighting
        let hlTab = ''
        let select = 0
        if i + 1 == tabpagenr()
            let hlTab = '%#SelectTabLine#'
            let s ..= hlTab . '?%#SelectPageNum#%T' . (i + 1) . hlTab
            let select = 1
        else
            let hlTab = '%#NormalTabLine#'
            let s ..= hlTab . "?%#NormalTabLine#%T" . (i + 1) . hlTab
        endif

        " the label is made by MyTabLabel()
        let s .= ' %<%{MyTabLabel(' . (i + 1) . ', ' . select . ')} '
        "追加窗口数量
        let wincount = tabpagewinnr(i + 1, '$')
        if wincount > 1
            if select == 1
                let s .= "%#SelectWindowsNum#" . wincount
            else
                let s .= "%#NormalWindowsNum#" . wincount
            endif
        endif
        let s .= hlTab . "?"
    endfor

    " after the last tab fill with TabLineFill and reset tab page nr
    let s ..= '%#TabLineFill#%T'

    " right-align the label to close the current tab page
    if tabpagenr('$') > 1
      let s ..= '%=%#TabLine#%999X??X?'
    endif

    return s
endfunction

" Now the MyTabLabel() function is called for each tab page to get its label. >
function MyTabLabel(n, select)
    let label = ''
    let buflist = tabpagebuflist(a:n)

    for bufnr in buflist
        if getbufvar(bufnr, "&modified")
            let label = '+'
            break
        endif
    endfor

    let winnr = tabpagewinnr(a:n)
    let name = bufname(buflist[winnr - 1])

    if name == ''
        if &buftype == 'quickfix'
            let name = '[Quickfix List]'
        else
            let name = '[No Name]'
        endif
    else
        let name = fnamemodify(name, ':t')
    endif

    let label .= name
    return label
endfunction

set tabline=%!MyTabLine()

" 设置netrw-------------------------------------
let g:netrw_banner = 0         " 设置是否显示横幅
let g:netrw_liststyle = 3      " 设置目录列表样式:树形
let g:netrw_browse_split = 4   " 在之前的窗口编辑文件
let g:netrw_altv = 1           " 水平分割时,文件浏览器始终显示在左边
let g:netrw_winsize = 20       " 设置文件浏览器窗口宽度为25%
let g:netrw_list_hide= '^\..*' " 不显示隐藏文件 用 a 键就可以显示所有文件、 隐藏匹配文件或只显示匹配文件
" 自动打开文件浏览器
" augroup ProjectDrawer
"     autocmd!
"     autocmd VimEnter * :Vexplore
" augroup END

nnoremap <SPACE>ft :Lexplore<CR>    " 打开或关闭目录树

"-----------------------------------------------"
"               自定义功能                      "
"-----------------------------------------------"

" 快捷键绑定-------------------------
let mapleader='\'
" 窗口移动快捷键
noremap <TAB>w <C-w>w
noremap <TAB><left> <C-w><left>
noremap <TAB><right> <C-w><right>
noremap <TAB><up> <C-w><up>
noremap <TAB><down> <C-w><down>
" 使用方向键切换buffer
noremap <Leader><left> :bp<CR>
noremap <Leader><right> :bn<CR>
" 使用方括号切换tab
noremap <Leader>] :tabnext<CR>
noremap <Leader>[ :tabprevious<CR>
" 使用 \ + s 保存, \ + q 退出
noremap <Leader>s :w<CR>
noremap <Leader>q :q<CR>

效果


vim+netrw
送礼物
还没有人送礼物,鼓励一下作者吧
这样说吧,你想让它多漂亮,它就可以多漂亮!
Vim这么多年可以说是经久不衰,编辑器/IDE方面无论怎么更新换代,Vim一直都很坚挺。
我觉得这和它本身特点密不可分:跨平台兼容性、可定制性强、便携式配置和灵活的插件框架、高效的命令操作。
虽然前期学习会有一些吃力,但是一旦学会就可以成为效率奇高的生产力工具。
很多人觉得VS Code可以很漂亮、IDEA可以很漂亮,难道Vim就只能跟随Linux系统主题那么丑陋吗?
得益于Vim灵活的扩展性、可定制性,我们也可以给它配置很强大的功能和漂亮的主题,我之前写过一篇内容,详细的介绍了如何从零开始把Vim打造成一款高效的IDE,自动补全、主题、插件管理都有,喜欢琢磨的同学可以看一下:
不过,动不动都从零开始搭建显然是非常麻烦、低效的。
其实,现在有很多在原生Vim的基础上进行扩展打造的一些功能齐全的Vim编辑器,这些Vim编辑器开箱即用、配置简单,对初学者也很友好,我们可以像用VS Code、IDEA那样通过简单的配置就可以实现非常丰富的功能,例如,NeoVim、Kakoune、Helix等,这些都很不错。
但是,如果你既想拥有Vim的强大功能,有希望它能够简单易用、外观漂亮,我更加推荐SpaceVim,它一个社区驱动的Vim发行版。
SpaceVim开始于2016年12月,是wsdjeg的DotFiles仓库的一个衍生品,它具有很多亮点:
易用且完善的文档:用:h SpaceVim访问SpaceVim中的文档漂亮的用户界面记忆性的键绑定:自动显示键绑定指南快速启动降低RSI的风险。一致的体验:Vim和NeoVim之间的体验一致配置简单
下面,就来单独看一下它的用户界面到底有多漂亮:
欢迎界面


工作界面


多光标功能



文件管理


快速搜索



键绑定描述



上面展示了不同主题、不同功能,就可以看出SpaceVim有多漂亮了。
令人高兴的是,SpaceVim支持macOS、Linux、Windows不同平台,还可以运行在Docker里,下面简单一下如何使用。
安装
Linux&macOS

curl -sLf https://spacevim.org/install.sh | bash

Windows

docker pull spacevim/spacevim
docker run -it --rm spacevim/spacevim nvim

配置
SpaceVim 的默认配置文件是 ~/.SpaceVim.d/init.toml,在这里就可以配置外观主题、自动补全、语言支持等功能,这里不详细介绍,感兴趣的可以查看官方文档:
建议大家有空可以多浏览Github,有很多好用的开源免费工具。但是,目前Github上项目多如牛毛,而且刷榜现在也非常严重,想要找到优质的项目变得越来越难。这里,给大家推荐Github上一个非常不错的项目《DevWeekly》,这个项目每周都会精挑细选一些优质的开源项目,涵盖C++、JAVA、JavaScript、Python、Go等不同编程语言。此外,还有一些开源工具、优秀的技术文章,喜欢的同学可以Star并收藏一下,每周五会定期更新:
送礼物
还没有人送礼物,鼓励一下作者吧
配成vscode样子有啥意义?别tm逗了。
vim简单配合下fzf,功能就完爆vscode。
vscode现在的vim插件到今天连o功能的自动缩进都做不对,
函数参数的自动补全一堆历史毛病一直不fix,terminal也一堆毛病,越做还小毛病越多,原来能使的现在经常会扑街。
vim利用awk,sort,column,fzf 就可以轻松定制一个好用的符号系统,
一个快捷键+filter,就能找出一个陌生项目里的某个特定类的所有方法,或所有成员




一个快捷键,就能找出全局一共定义了哪些struct,哪些class,哪些typedef,哪些宏,哪些全局变量,而且全支持 fuzzy search




一个快捷键就能看到文件的函数列表,还能看到函数是虚函,还是内联,private还是public,是不是static,属于哪个class,哪个ns。


一个快捷键,就能把光标所在函数或者定义的变量或者宏,涉及的所有 call 调用全列出来


你可以轻松通过一个模糊func name 去找到这个函数属于哪个class,
比如 load model 找到模型文件读取器,main找到函数入口, callback找到注册的钩子, normalize找到数学库。
你找到这个类,又想多了解一点,
再调出全局symbol,或者buf symbol,通过模糊查询,就能把这个类的所有方法、成员全列出来,源文件都可以不用打开,就能看到这个类的大致外貌。
还可以用这玩意轻松找出你自定义的快捷键,自定义的vimscript脚本函数,自定义的shell命令,甚至自己写的markdown或org笔记里的某个chapter或section




2w以内的符号数目和函数数目都是秒开,几万行一个的源代码也是秒开,直接拿awk去怼都ok,
到了符号数5w个还往上,还想有秒开体验,也可以自己写后台cache数据和做filter喂给fzf。
配合vifm就可以弄个跑窗口里的文件管理器


写代码支持实时语法错误检查,实时显示git的代码变动


一键异步编译,
出错自动定位到错误代码错误行的具体错误符号:




修改完毕没错误,编译完毕自动关闭之前错误列表。
也可以一键呼出浮窗,干点临时需要命令行的工作


也可以一键呼出一个垂直命令行,以便更好观察输出或log


你也可以一键在角落呼出一个命令行浮窗,去跑监控或者sever


如果你比较变态,也可以俄罗斯套娃,terminal里再嵌套开个nvim来临时编辑下文件


VSCode 的buf tag,你觉得够用还用的很开心,那就继续用呗。


glew 这样的大文件,弹出个符号列表至少得花5-7秒,好在还cache了结果,
不过一旦你关了源文件,再打开,再等个5-7秒吧


当遇到shellscript呢,这玩意啥都弹不出来


觉得vsc非常满足你期望,就tm继续用呗。
辨不出个好坏优劣,也tm是种福气。
老子不知道一个个时间吝啬如金的优秀开发人才们既然对vim怨念这么深,来tm这种话题干嘛?
是tm学不会让你们自尊心难以接受吗?
宁可tmd当个垃圾人,说些几吧用都没有的垃圾话,
你tm有这功夫早tm能把vim学会了。
评论区有人坚持tag没用,靠vsc的search就挺好,
既然“挺好”,那就实践下,
我们在代码里来搜camera,游戏代码一定会有camera类,
那么vsc搜camera是这个结果:
2000个结果在119个文件之中,你就翻吧


ok,我假定你知道应该搜 class camera,


你会发现啥玩意都搜不出来,为什么?因为类名叫 idCamera,
所以除非你搜 class idCamera,


这个时候结果才能搜出来。
而且你必须准确的搜“class idCamera”,换了“class camera”“camera class”,甚至中间两个空格的“class idCamera”,你都会啥都搜不出来。
当然你也可以用正则 class .*camera,这样你至少获得了一个少的多的列表,但依然不够直观,不过至少人肉能一个个查了。


如果是tag系统,仅仅一个camera c| ,就找到了,就这么简单。


哪怕你用 c| camera 也是一样的结果。
你用 c| cam era
甚至用 ca c| mera
一样能快速找出 class idCamera


再进一步,我发现idCamera只是个基类没功能,那找子类怎么办
搜 c| :camera,都出来了


如果想要看子类 idCameraAnima的成员,搜m| cmeraanim.


在任何代码任何位置,你都能发起类似查询,
查出任何类的类关系,类成员,类函数,想细看就跳过去
如果这个case 换到ide或vcs,你能怎么做?
你得先辛辛苦苦找到 idCameraAnim ,然后扫源码,或者等待outline面板把你这个类的成员tree给一个个解析出来。
如果idCameraAnim这个符号,刚好出现在你编辑代码的区域,那还走运,光标移过去lsp跳转就行,
但如果 idCameraAnim 这个符号根本没出现在你编辑区,你突然想看,又忘了在哪个文件,那又变成一个搜索磨难。
tag保障了你search的所有东西绝对是一个语言符号,基于tag搜索的效率和稳定性都会很高。
而search只是一个字符串pattern匹配,根本不care是不是符号,且不说执行效率,仅仅就是输出结果的稳定性和简约都难以控制。
感谢
@林夕丶
告知,我一直不知道有c-t能查定位全局符号,
用了一下,正好对比




normalize是重载函数,需要接口信息,vsc只能闭着眼睛跳。




vsc 我用 fullname + classname 都定位不到操作符重载函数,
vector2和vector4的operator +函数莫名其妙找不到。




过滤UI函数,vsc又是列了一堆我不care的。




fuzzy别指望了,少打一个字或打错一个字就飘了。




列出我程序中的所有main,vsc只有两个main被列出来,你都没法再继续narrow。
说vcs的全局符号勉强能用那都算过奖了。
上面对比的全局tag,其实是clangd插件的能力,
微软自己的cpp插件的tag能力倒比这强一点,至少符号还能给列全了,也可以exclude system symbol,不过速度、可配置性、fuzzy 就别指望和vim比了,各方面差太远。
微软cpp插件应该也是依赖ctags,这也能解释为什么vsc上的glsl插件的tag功能还必须依赖微软的cpp插件,因为在ctags的实现里,解析glsl符号可以用cuda的parser,而cuda的parser实际就是复用c的parser,所以才必须依赖微软cpptools里实现的symbol provider。
本来想看看cpptools实现是不是和我判断一样,结果发现这玩意只有ts源码开源,真正干活的cpptools和cpptools-srv都闭源。
然后翻了下vscode的代码,发现vscode就是把symbol能力作为了一个lsp的接口,于是提供workspace symbol的能力这就得靠各语言去把symbol provider自己去实现一遍,
所以vscode虽然有个ctrl-t的快捷键去query全局符号,可实际上底层根本就没有大一统的后台symbol/tag系统实现,只有一个空的query接口给你的扩展去实现。
这也解释了为啥连shellscript和glsl这些本来被ctags parser所覆盖的语言,即使在装了cpptools的情况下,也无法被解析。
所以你想要不同语言的全局符号系统,你只能指望那个语言的爱好者,哪天用爱发电给你填掉这个大坑,给你重新实现一遍WorkspaceSymbolProvider。
所以我负责任的说,以后你也不用指望vscode能有个通用且好用的全局符号系统。
比如遇到个go项目,上面的mess又tm重演一遍。




@soluty
1.首先你要学习韦易笑的vim 支持 ctags的文章,这个底下其他评论里有链接,你可以参考我用来生成tags的配置,确保能正确生成项目的tags文件。
2.你最好在linux底下来打通tags文件的生成,坑比较少,成功了可以再转移到 windows 下实现。
3.等你能正确生成tags文件,你要学会 fzf.vim的基本用法,就是如何把 cmd 塞给fzf,你要大概知道函数fzf#run() 和fzf#wrap()的用法,把fzf和fzf.vim这两个项目的README至少读一遍,可以先试试利用 ls 命令配合 fzf 实现个简单的 file selector功能。
4.获取全局tags的整体思路,就是利用tagfiles() 这个函数获得项目 tags的路径,然后通过组合 cat XXX.tags | awk | sort 这样的命令,把 tags 重新组织成你需要的格式化好的文本数据,然后把这个命令塞给 fzf.vim 的 fzf#wrap() 和 fzf#run() 的函数
5.弄懂生成的 tags 的文件结构,过滤出你关注的列,设置列和列之间的分隔符,和后面fzf指定的列分隔符要保持一致
6.我的全局 tags 的代码,你可以参考下,但应该很难直接成功套用上,
理解大致思路就够了,思路就是:
(1)构建过滤和格式化 tags 文件的命令行,丢给fzf,
(2)定制fzf的sink函数(下面的tag_sink()),来解析所选中的行中的文件名和行号,然后通过 goto_file() 函数做跳转。

function! s:goto_file(file,lineNum)
  let bufName = bufname(a:file)
  if bufName == ""
    execute 'edit +'.a:lineNum a:file
  else
    let bufNum = bufnr(bufName)
    execut 'b '.bufNum
    call feedkeys(a:lineNum."G","n")
  endif

  if foldclosed('.') != -1
   call feedkeys("zo","n")
  end

  call feedkeys("zz","n")
endfunction

function! s:tag_sink(line)
  let lines = split(a:line,"\\t")[2]
  let lines= split(lines)

  call s:goto_file(lines[0][1:], lines[1][:-2])
endfunction

function! FzfTags(query, fullscreen)
  let tags = join(map(tagfiles(), 'fzf#shellescape(fnamemodify(v:val, ":p"))'))

  echom tags
  let cmd = 'cat '.tags " TODO support multi tags

  "cat z-go-pbr-.tags | awk '(NR>11){gsub(/\/\^/,"");gsub(/\$\/\;\"/,"");gsub(/  +/," ");print $0}' | awk -F"\t" '{print $3}'| cat -A

  " c++:
  " name├──┤/z/f.h├──┤/^int·x;{$/;"├──┤f├──┤line:173├──┤class:Vector3├──┤access:public
  " go:
  " name├──┤/z/f.go├──┤/^├──┤B1Repeat····float32$/;"├──┤m├──┤line:51├──┤struct:model.Material
  let awk1 = printf('%s', "| awk '(NR>11){
        \ gsub(/\\$\\/\\;\"/,\"\");
        \ gsub(/\\/\\^/,\"\");
        \ gsub(/  +/,\" \");
        \ gsub(/\\t\\t/,\"\t\");
        \ print $0}'")

  let awk2 = printf('%s', "| awk -F\"\t\" '$4 !~ /f|p/ {
        \ reset = \"\u001b[00m\";
        \ gray = \"\u001b[37m\";
        \ bold = \"\u001b[01m\";
        \ orange = \"\u001b[33m\";
        \ gsub(/^[ ]+/,\"\",$3);
        \ gsub(\"line:\",\"\",$5);
        \ if (length($6)==0)
        \   gsub(\"\",\"-\",$6);
        \ else if ($6 ~ \"^signature:\") {
        \   $8=$6;
        \   $6=\"-\";
        \   $7=\"-\";
        \ }
        \ else {
        \   gsub(/.*:/,\"\",$6);
        \   gsub(/^__anon.*/,\"Emun\",$6);
        \   $6=$6 gray \"\.\"
        \ }
        \ if (length($7)==0)
        \   gsub(\"\",\" \",$7);
        \ else if ($7==\"-\")
        \   gsub(\"\-\",\" \",$7);
        \ else {
        \   gsub(\"access:public\",\"??\",$7);
        \   gsub(\"access:private\",\"??\",$7);
        \   gsub(\"access:protected\",\" \",$7);
        \ }
        \ gsub(\"signature:\",\"\",$8);
        "\ print $1\"\t\"$2\"\t\"$3\"\t\"$4\"\t\"$5\"\t\"$6\"\t\"$7}'")
        "\ print $4\"\"$7\"\"$1\"\t\"$3\"\t\"$2\"\ \"$5\"\t\"$6}'")
        "\ print $4\"\"$7\"\"$1\"\t \u001b[37m\"$3\"\t[\"$2\"\ \"$5\"]\u001b[00m\t\"$6}'")
        "\ print $4\"\"$7\"\"$1\"\t \u001b[37m\"$3\"\u001b[33m\u001b[01m\t\"$6\"\u001b[00m\t\u001b[37m[\"$2\"\ \"$5\"]\u001b[00m\"}'")
        "\ print gray $4\"|\" reset $7$1\"\t \"gray $3 orange bold\"\t\"$6 reset gray\"\t[\"$2\" \"$5\"]\" reset}'")
        \ print gray $4\"|\" reset $7$1\"  \"gray $3 orange bold\"\t\"$6 reset gray\"\t[\"$2\" \"$5\"]\" reset}'")
  let sort = '| sort -s -k1'

  let cmd = printf('%s %s %s %s', cmd, awk1, awk2, sort)

  try
    return fzf#run(fzf#wrap({
        \ 'source':cmd,
        \ 'sink':function('s:tag_sink'),
        \ 'options': ['-s','+e','-d','\t', '--with-nth', '1,2,3,4', '-n', '1,2',
                    \ '--color', 'hl:148,hl+:190,fg+:15,bg+:235',
                    \ '--prompt', 'Tags> '],
        \ 'window': { 'width': 0.7, 'height': 0.5 }
        \ }))
  catch
    echom v:exception
  endtry
endfunction

command! -nargs=* -bang Tags call FzfTags(<q-args>, <bang>0)
autocmd Filetype c,cpp,glsl,go,typescript nnoremap <buffer> <C-d> :Tags<CR>

7.query函数调用,你可以依赖 global -s -rx 通过gtags来获取,这和前面查询全局符号的原理一样,也可以通过lsp获取函数调用,结果比gtags更精确,coc直接有内建功能你可以直接用。
你也可以自己写命令去quary lsp 然后把命令塞给fzf,原理都类似,小坑比较多,但没啥难理解的。
大概就这样吧


底部是集中的tmux(显示的窗口index和session name)


加入了outline


加入orgmode,可以快速管理待办事项


markdown编辑


补一个orgmode添加待办(可以具体查看某个日期哒待办),左边是使用org做的笔记
发一张在archlinx下的美图,从mac转linux了








目前我用vim 写 C++ 还是很舒服的
这是用到的插件:

Plugin 'VundleVim/Vundle.vim'
Plugin 'ryanoasis/vim-devicons'                     "图标支持, 需要安装 Nerdfont 字体
Plugin 'scrooloose/nerdtree'                        "文件浏览
Plugin 'tiagofumo/vim-nerdtree-syntax-highlight'    "nerdtree 根据文件类型高亮
Plugin 'Xuyuanp/nerdtree-git-plugin'                "nerdtree git 支持
Plugin 'octol/vim-cpp-enhanced-highlight'           "对c++语法高亮增强
Plugin 'neoclide/coc.nvim', {'branch' : 'release'}  "自动补全
Plugin 'preservim/nerdcommenter'                    "多行注释,leader键+cc生成, leader+cu删除注释 cs 以”性感”的方式注释 注意要设置leader键位否则不起作用
Plugin 'skywind3000/asyncrun.vim'                   "执行 shell 命令 主要用于编译运行代码
Plugin 'SirVer/ultisnips'                           "代码片段插件 
Plugin 'honza/vim-snippets'                         "常用的代码片段 
Plugin '907th/vim-auto-save'                        "自动保存插件
Plugin 'Yggdroot/indentLine'                        "缩进线显示
Plugin 'lervag/vimtex'                              "编译latex

上面的系统是ubuntu 22.04 gnome 。最近发现了一个 gnome插件 blur my shell 可以把 gnome 的窗口变成毛玻璃特效 虽然跟vim 配置没有关系, 但是vim 更好看了,而且也不会因为背景透明而分心了。


vimtext 配置
@Adamlz

# vim-Latex 设置 ---------------------------------------------------------------------
# 开启 remote_startserver 否则无法使用反向搜索 :help vimtex-requirements
# 可查看 vimtex 的要求 
if empty(v:servername) && exists('*remote_startserver')
  call remote_startserver('VIM')
endif


g:tex_flavor = 'latex'

g:vimtex_quickfix_mode = 1
g:vimtex_quickfix_open_on_warning = 0

g:vimtex_view_general_viewer = 'okular'
g:vimtex_view_general_options = '--unique file:@pdf\#src:@line@tex'


# 设置代码隐藏功能 conceallevel=1 会导致插件 vim-icons的设置 webdevicons#refresh 刷新异常 ,
# 导致nerdtree 排版乱掉 把这个设置 放在 webdevicons#refresh 之前
# 就可以解决这个问题
set conceallevel=1
g:tex_conceal = 'abdmg'

#这里是LaTeX编译引擎的设置,这里默认LaTeX编译方式为-pdf(pdfLaTeX),
#vimtex提供了magic comments来为文件设置编译方式
#例如,我在tex文件开头输入 % !TEX program = xelatex   即指定-xelatex (xelatex)编译文件
g:vimtex_compiler_latexmk_engines = {
       '_':                 '-pdf',
       'pdflatex':          '-pdf',
       'dvipdfex':          '-pdfdvi',
       'lualatex':          '-lualatex',
       'xelatex':           '-xelatex',
       'context (pdftex)':  '-pdf -pdflatex=texexec',
       'context (luatex)':  '-pdf -pdflatex=context',
       'context (xetex)':   '-pdf -pdflatex=''texexec --xtx''',
      }
#这里是设置latexmk工具的可选参数
g:vimtex_compiler_latexmk = {
       'build_dir':   '',
       'callback':    1,
       'continuous':  1,
       'executable':  'latexmk',
       'hooks':       [],
       'options':     [
         '-verbose',
         '-file-line-error',
         '-shell-escape',
         '-synctex=1',
         '-interaction=nonstopmode',
       ],
      }

pdf查看器是okular,反向搜索功能需要在okular 中需要设置:
设置->配置okular->编辑器->自定义文本编辑器

vim --remote-silent +%l %f

在okular 的浏览模式下,用shift + 鼠标左键可以从pdf定位到tex,在tex中按 \lv 可以定位到pdf
漂亮这东西非常主观且流于表面,选对一个主题占据了大部因素。此外,学会如何按照喜欢的模样去进行改造可能才是最重要的 (只要你有想法并且愿意花时间,相信肯定会学会如何定制),而不仅仅 “受制于人”。比如我不喜欢 vertical split 的分割线,所以就隐藏掉~. 喜欢 warning 与 error 简洁点,所以仅用前景色,这一点是我不喜欢现有流行 vim 主题的主要原因 ( 如何优雅地使用 Vim? - simple 的回答 - 知乎 )。
Vim 配置:
Vim 主题和插件:






[收藏本文] 【下载本文】
   数码 最新文章
华为刚刚发布的新机华为畅享 80 搭载了麒麟
如果你手机里第33张照片突然开始攻击你,你
如何看待荣耀 GT Pro 价格 3699 元起?对友
为什么 CCD 相机在数码摄影普及的今天突然「
瑞幸同款饮品不同手机 3 种价格,客服称不同
如何看待英伟达被曝未来将推24GB的 RTX 508
为什么现在键盘鼠标的电池那么小?做大些是
为什么知乎都在劝退计算机国企?
如何看待小米王腾回应被拍拿着iPhone登机?
大学生寒假预计购买新电脑,有没有高性能全
上一篇文章      下一篇文章      查看所有文章
加:2025-04-27 20:50:15  更:2025-04-28 10:00:10 
 
娱乐生活: 电影票房 娱乐圈 娱乐 弱智 火研 中华城市 印度 仙家 六爻 佛门 风水 古钱币交流专用 钓鱼 双色球 航空母舰 网球 乒乓球 中国女排 足球 nba 中超 跑步 象棋 体操 戒色 上海男科 80后
足球: 曼城 利物浦队 托特纳姆热刺 皇家马德里 尤文图斯 罗马 拉齐奥 米兰 里昂 巴黎圣日尔曼 曼联
  网站联系: qq:121756557 email:121756557@qq.com  知识库