" --- " @author jianqun.me " @created 2024-11-18 " @modified 2025-06-30 " @permalink https://dl.jianqun.me/dotfiles/vim/vimrc.txt " --- syntax on " 开启语法高亮。 colorscheme habamax " 设定语法高亮的配色。 filetype plugin on " 开启文件类型检测。 " --- " Options " --- set autoindent " 开启自动缩进,默认是 'off'。 set autoread " 开启自动读取,当检测到文件在 Vim 外部被修改时,默认是 'off'。 set belloff=all " 设定要关闭响铃提示的事件列表,默认是 'empty'。 set browsedir=buffer " 设定 GUI 的文件浏览器初始目录,默认是 'last'。 set cdhome " 开启在执行没有参数的 :cd :tcd :lcd 命令时自动切换到 $HOME 目录,默认是 'off'。 set clipboard= " 设定剪贴板使用的寄存器列表,默认是 'autoselect,exclude:cons\|linux'。 set confirm " 开启在执行 :q :e 命令时,若有未保存的 Buffer,将进行对话确认,默认是 'off'。 set cursorline " 开启高亮光标行,默认是 'off'。 set display=lastline " 设定屏幕末行文本过长时的显示方式,默认是 'empty'。 set encoding=utf-8 " 设定 Vim 使用的字符编码,默认是 'latin1'。 set expandtab " 开启在 Insert Mode 中将 插入的制表符展开成空格符,默认是 'off'。 set foldcolumn=1 " 设定折叠标记列的宽度,默认是 '0'。 set guicursor= " 设定 GUI 的光标样式,默认是 'n-v-c:block-Cursor/lCursor,...'。 set guicursor+=n-v-ve-o-c-ci-cr-sm:block,i:ver10,r:hor5, set guicursor+=a:Cursor-blinkon0 set guifont= " 设定 GUI 的字体列表,默认是 'empty'。 set guifont+=Sarasa\ Fixed\ SC:h12,Cascadia\ Mono:h12, set guifont+=* set guioptions=c " 设定 GUI 的功能组件和选项,默认是 'egmrLtT'。 set hidden " 开启 Buffer 隐藏来快速切换文件,默认是 'off'。 set hlsearch " 开启高亮搜索结果,默认是 'off'。 set ignorecase " 开启在执行搜索或命令行补全时忽略字母大小写,默认是 'off'。 set incsearch " 开启在执行搜索时进行增量查找,默认是 'off'。 set nojoinspaces " 关闭使用 连接上下两行时在中间插入两个空格符,默认是 'on'。 set laststatus=2 " 设定何时显示状态行, 默认是 '1'。 set list " 开启 List Mode 来渲染不可见字符,默认是 'off'。 set listchars=tab:··▸,lead:·,trail:· " 设定 List Mode 的可视化符号列表,默认是 'eol:$'。 set matchpairs=(:),[:],{:},<:> " 设定要配对的括号列表,默认是 '(:),{:},[:]'。 set nomodeline " 关闭对文件内预设 Vim 选项的检查,默认是 'on'。 set mouse= " 设定要启用鼠标支持的 Mode,默认是 'empty'。 set mousemodel=extend " 设定鼠标支持所使用的 Model,默认是 'extend'。 set number " 开启显示行号列,默认是 'off'。 set numberwidth=1 " 设定行号列的最小宽度,默认是 '4'。 set shiftwidth=0 " 设定构成一个缩进层级的宽度,默认是 '8'。 set showcmd " 开启命令指示器,默认是 'off'。 set showmatch " 开启高亮配对的括号,默认是 'off'。 set showtabline=2 " 设定何时显示标签行,默认是 '1'。 set sidescroll=1 " 设定水平滚动的宽度,默认是 '0'。 set smartcase " 开启在 ignorecase 为 on 时,为 / ? :g :s 命令智能忽略字母大小写,默认是 'off'。 set smarttab " 开启智能 ,默认是 'off'。 set splitbelow " 开启在水平分割窗口时,将新窗口置于当前窗口的下方,默认是 'off'。 set splitright " 开启在垂直分割窗口时,将新窗口置于当前窗口的右侧,默认是 'off'。 set nostartofline " 关闭在跳转光标位置时自动将光标移动至行首,默认是 'on'。 set statusline=%!MyStatusLine() " 设定状态行样式,默认是 'empty'。 set switchbuf=usetab " 设定在 Buffer 之间切换的行为,默认是 'empty'。 set tabline=%!MyTabLine() " 设定标签行样式,默认是 'empty'。 set tabstop=2 " 设定制表符的宽度,默认是 '8'。 set termguicolors " 开启 TUI 的 24-bit 真彩色,默认是 'off'。 set timeoutlen=200 " 设定 Vim 等待转义序列完成的时间,默认是 '1000'。 set title " 开启将 titlestring 作为窗口标题,默认是 'off'。 set titlestring= " 设定 Vim 窗口的标题样式,默认是 'empty'。 set titlestring+=%{bufname('%')==''?'Untitled':fnamemodify(bufname('%'),':t')} set titlestring+=%(\ [%H%W%{&modified?',+':''}%R]%)\ -\ Vim set viminfofile=NONE " 设定替换 .viminfo 的文件名,默认是 'empty'。 if has('unix') set directory=/var/tmp//,/tmp//,. " 设定交换文件的目录列表,默认是 '.,~/tmp,/var/tmp,/tmp'。 endif if has('win32') set directory=$TEMP//,$TMP//,. " 设定交换文件的目录列表,默认是 '.,$TEMP,c:\tmp,c:\temp'。 set renderoptions=type:directx " 设定 Vim 使用的文本渲染器,默认是 'empty'。 endif if has('gui_running') set columns=120 " 设定 Vim 窗口的水平宽度,默认是 '80'。 set lines=30 " 设定 Vim 窗口的垂直高度,默认是 '24'。 endif if !has('gui_running') let &t_SI = "\e[6 q" " 设定 TUI 中 Insert Mode 的光标样式。 let &t_SR = "\e[4 q" " 设定 TUI 中 Replace Mode 的光标样式。 let &t_EI = "\e[2 q" " 设定 TUI 中 Normal Mode 的光标样式。 endif " --- " MyStatusLine " --- function! MyStatusLine() let modemap = { \ 'n' : '[NORMAL] ', \ 'niI' : '[(insert)] ', \ 'niR' : '[(replace)] ', \ 'niV' : '[(vreplace)] ', \ 'nt' : '[(terminal)] ', \ 'ntT' : '[(terminal)] ', \ 'v' : '[VISUAL] ', \ 'vs' : '[VISUAL] ', \ 'V' : '[VISUAL LINE] ', \ 'Vs' : '[VISUAL LINE] ', \ '\22' : '[VISUAL BLOCK] ', \ '\22s' : '[VISUAL BLOCK] ', \ 's' : '[SELECT] ', \ 'S' : '[SELECT LINE] ', \ '\19' : '[SELECT BLOCK] ', \ 'i' : '[INSERT] ', \ 'ic' : '[INSERT] ', \ 'R' : '[REPLACE] ', \ 'Rc' : '[REPLACE] ', \ 'Rv' : '[VREPLACE] ', \ 'Rvc' : '[VREPLACE] ', \ 'c' : '[CMDLINE] ', \ 'ct' : '[CMDLINE] ', \ 'cr' : '[CMDLINE] ', \ 't' : '[TERMINAL] ' \ } return get(modemap, mode(1), '') .. join([ \ '%<', \ '%{bufname("%")==""?"Untitled":bufname("%")}', \ '%( [%H%W%{&modified?",+":""}%R]%)', \ '%= %l,%c%V %p%%', \ '%( [%{toupper(&fenc!=""?&fenc:&enc)},%{toupper(&ff)}%(,%Y%)]%)' \ ], '') endfunction " --- " MyTabLine " --- function! MyTabLine() let tabline = '' for tabnr in range(1, tabpagenr('$')) if tabnr == tabpagenr() let tabline ..= '%#TabLineSel#' else let tabline ..= '%#TabLine#' endif let tabline ..= '%' .. tabnr .. 'T' let buflist = tabpagebuflist(tabnr) let bufname = bufname(buflist[tabpagewinnr(tabnr) - 1]) if bufname != '' let bufname = pathshorten(bufname) else let bufname = 'Untitled' endif let hasmodified = 0 for bufnr in buflist if getbufvar(bufnr, '&modified') let hasmodified = 1 break endif endfor let wincount = tabpagewinnr(tabnr, '$') let label = '' if wincount > 1 | let label ..= wincount | endif if hasmodified | let label ..= '+' | endif if label != '' | let label ..= ' ' | endif let tabline ..= ' ' .. label .. bufname .. ' ' endfor let tabline ..= '%#TabLineFill#%T' .. '%<' return tabline endfunction " --- " SyntaxComplete " --- if exists('+omnifunc') augroup syntaxcomplete autocmd! autocmd Filetype * if &omnifunc == '' | setlocal omnifunc=syntaxcomplete#Complete | endif augroup END endif " --- " Clipboard " --- if exists('$SSH_CONNECTION') || filereadable('/.dockerenv') function! OscYank() let clipboard = @" if strlen(clipboard) < 70000 let osc52 = "\e]52;c;" .. substitute(system('base64', clipboard), '\n', '', 'g') .. "\e\\" silent call writefile([osc52], '/dev/tty', 'b') endif endfunction augroup clipboard autocmd! autocmd TextYankPost * if v:event.operator ==# 'y' | silent call OscYank() | endif augroup END endif if has('clipboard') nnoremap y "+y xnoremap y "+y endif " --- " Mappings " --- nnoremap : xnoremap : nnoremap nnoremap vnoremap vnoremap inoremap inoremap inoremap inoremap cnoremap cnoremap cnoremap cnoremap vnoremap :m '>+1gv vnoremap :m '<-2gv noremap noremap noremap noremap noremap noremap noremap noremap noremap noremap noremap noremap noremap noremap noremap noremap noremap! noremap! noremap! noremap! noremap! noremap! noremap! noremap! noremap! noremap! noremap! noremap! noremap! noremap! noremap! noremap!