某次滚动更新后,neovim的配色突然变丑了,我就觉得我应该回归vim了,重构下 vim 配置。
向来喜欢从简,所以打算放弃原来庞杂的 vim 配置,回归朴素。本次配置主要以实用性和少量外观进行入手,精简插件也是目的之一,不使用vim9script,因为需要兼容其他版本的 vim,但以后可以考虑弄一个 vim9script 的 branch
开始打算试试 YCM,但找了下资料,2024年已经几乎没有人用 YCM 了,只能找到 lsp 刚出来时用 YCM 的人对 lsp 的讨论,令人感叹
这次决定不用 coc,实在太庞大了,有点不适
vim-lsp: 提供前端,后端配置自己写在 vimrc 里
lsp: 本来想要用这个的,很轻量,但是只有能用 vim9script 才行,这就意味着只能在新版vim才行(大多数包管理器的vim版本大多数还在8),所以不考虑了
原来用的ultisnips
这东西很好用,只可惜需要 python 依赖,而且本身不太好用,换个更轻的miniSnip
使用 <{}>
进行标记填充部分,里面可以设置默认内容,其中<{!xx}>
可以使用 vim 的表达式进行计算,<{+}>
可以表示最后位置,好像还能自定义填充标记符。
但要注意,这个插件好像不能自定义顺序或者回退到刚刚输入的填充位置,也许只是我目前没发现,不知道怎么写可以看一下作者本人写的几个模板
对比度太高,太刺眼了,决定换品味了
set t_Co=256
set background=dark
nnoremap wtf :echo synIDattr(synID(line('.'), col('.'), 1), "name")<CR>
"main color
let s:a=234
let s:b=181
let s:c=65
let s:d=100
let s:e=166
let s:f=131
let s:g=178
let s:h=180
let s:i=241
let s:red=166
let s:blue=98
let s:cyan=79
let s:green=34
hi clear
"ui
hi CursorLine cterm=None
exec 'hi Folded ctermfg='.s:e.' ctermbg='.s:a
exec 'hi LineNr ctermfg='.s:b
exec 'hi CursorLineNR cterm=None ctermfg='.s:g
exec 'hi SignColumn ctermbg='.s:a
exec 'hi CursorLineSign ctermbg='.s:i
exec 'hi Edflag cterm=bold ctermfg='.s:i
exec 'hi StatusLine cterm=bold ctermfg='.s:i
exec 'hi StatusLineNC ctermfg='.s:a
exec 'hi VertSplit ctermfg='.s:a.' ctermbg='.s:i
hi Search cterm=bold,reverse ctermfg=None ctermbg=None
hi IncSearch cterm=bold,underline,reverse
hi CurSearch cterm=bold,underline
hi Visual ctermbg=None ctermfg=None cterm=reverse
exec 'hi EndOfBuffer ctermfg='.s:i
exec 'hi Pmenu cterm=bold ctermfg='.s:i.' ctermbg='.s:a
exec 'hi PmenuSbar ctermbg='.s:a
exec 'hi PmenuSel cterm=bold ctermfg='.s:c
exec 'hi PmenuThumb ctermbg='.s:i
"lang
hi clear Statement
exec 'hi Normal ctermbg='.s:a.' ctermfg='.s:b
exec 'hi Constant ctermfg='.s:g
exec 'hi Keyword cterm=bold ctermfg='.s:c
exec 'hi Number ctermfg='.s:e
exec 'hi Type cterm=bold ctermfg='.s:f
exec 'hi Identifier cterm=bold ctermfg='.s:d
exec 'hi Comment cterm=italic ctermfg='.s:h
exec 'hi PreProc ctermfg='.s:e
exec 'hi Special ctermfg='.s:f
hi link Statement Keyword
hi link Operator Keyword
"event
au ModeChanged * call ChangeEdflagColor()
let s:palette = {
\'n':s:i,
\'i':s:cyan,
\'R':s:red,
\'v':s:blue,
\'':s:blue, "^V
\'V':s:blue
\}
"func
function! ChangeEdflagColor()
exec 'hi Edflag ctermfg='.get(s:palette, mode(), s:i)
endfunction
去插件化了,这里直接使用 vim 自带的 statusline
set statusline=%!Cleanline()
function! Cleanline()
if g:statusline_winid != win_getid()
let l:hl=''
else
let l:hl='%#Edflag#'
endif
if &modified
let l:editflag='*'
else
let l:editflag='●'
endif
let l:otherstatus='%#StatusLine# %f%r %P %Y%= '.&encoding.' %l,%c'
return l:hl.' '.l:editflag.l:otherstatus
endfunction
不仅能显示信息,自带的功能就能完成色彩变换,搭配上面色彩中的几行 autocmd 就能完成lightline模式显示的功能,以后就不用插件了
这个 fold 指的是折叠的效果
实现起来不难,写个函数即可
"\的后面是空格
set fillchars=fold:\
set foldtext=Blackbox()
function! Blackbox()
let len = 55
let text = getline(v:foldstart)
if len <= strlen(text)
let text = strpart(text, 0, len - 5) . ".."
endif
let cur = line('.')
if v:foldstart <= cur && cur <= v:foldend
let text = '▶ ' . text . repeat(' ', max([1, len - strlen(text)]) - 2) . '█ ' . (v:foldend - v:foldstart + 1) . ' '
else
let text = text . repeat(' ', max([1, len - strlen(text)])) . '│ ' . (v:foldend - v:foldstart + 1) . ' '
endif
return text
endfunction
看了一堆视频,发现 vim 的好多功能我都没遇到过,比如说
:set paste
,C-X
模式,tags 等,定制自己的工具是真浪费时间啊