设置 Tab 大小
set tabstop=4
set softtabstop=4
set shiftwidth =4
set expandtab
set autoindent
设置相对行号
set nu
set rnu
augroup relative_numbser
autocmd!
autocmd InsertEnter * :set norelativenumber
autocmd InsertLeave * :set relativenumber
augroup END
自动括号
"补全括号和花括号(换行四次)
:inoremap ( ()<left>
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap [ []<left>
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<left>
:inoremap ' ''<left>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
我的完整配置
set nocompatible
set hidden " 设置允许在未保存切换buffer
" indent buffer
nnoremap <silent><nowait> =e gg=G<c-o><c-o>zz
onoremap <silent>ie :<c-u>normal! ggVG<cr>
xnoremap <silent>ie :<c-u>normal! ggVG<cr>
onoremap <silent>ae :<c-u>normal! ggVG<cr>
xnoremap <silent>ae :<c-u>normal! ggVG<cr>
" object line
onoremap <silent>il :<c-u>normal! ^v$BE<cr>
xnoremap <silent>il :<c-u>normal! ^v$<cr><left>
onoremap <silent>al :<c-u>normal! 0v$<cr>
xnoremap <silent>al :<c-u>normal! 0v$<cr>
set wildmenu
set wildmode=longest:list,full
set wildoptions=pum
set path+=** " 递归搜索路径
" 防止特殊符号(中文标点)无法显示🤣😄
set ambiwidth=double
" .swp file
set updatetime=4000
set updatecount=200
set timeoutlen=1000 " 快捷键间隔
set scrolloff=5
set sidescrolloff=0 " 水平方向
set colorcolumn=88
set textwidth=78 " 自动换行长度
set wrapmargin=0 " 折行处与右边缘空出的字符数
set linebreak " 不在单词内部换行
set t_Co=256
set cursorline
autocmd colorscheme * highlight! Cursorline cterm=bold,italic ctermbg=236 guibg=Grey90
autocmd ColorScheme * highlight! CursorLineNr cterm=bold,italic ctermfg=159 ctermbg=236 guibg=Grey90
set cursorcolumn
autocmd ColorScheme * hi! CursorColumn cterm=bold ctermfg=250 ctermbg=232 guibg=Grey90
colorscheme habamax
set number
set relativenumber
augroup relative_numbser
autocmd!
autocmd Insertenter * :set norelativenumber
autocmd Insertleave * :set relativenumber
augroup END
" 按下回车键后,下一行的缩进会自动跟上一行的缩进保持一致
set autoindent
set smartindent
" 按下Tab键后,vim显示的空格数
set tabstop=4
" normal模式下,>>增加一级缩进、<<取消一级缩进、==取消全部缩进时,每一级缩进的空格数
set shiftwidth=4
" 自动将Tab转为空格(防止Tab键在不同编辑器缩进不一致导致问题)
set expandtab
" Tab转为多少个空格
set softtabstop=4
" 按一次 backspace 删除4个空格
set smarttab
" 当前编辑文件的编码
set fileencoding=utf-8 " 只修改这个
" vim 打开支持编码的文件
set fileencodings=ucs-bom,utf-8,gbk,chinese,cp936,gb2312,big5,euc-kr,latinl
" vim 内部编码
set encoding=utf-8
" 设置终端编码为 vim 内部编码
let &termencoding=&encoding
set langmenu=zh_cn.utf-8
set helplang=cn
" language messages zh_cn.utf-8
set hlsearch
set incsearch " 自动定位第一个搜索结果
set history=50 " 搜索历史数量
set ignorecase
set smartcase
set list
set listchars=tab:▸\ ,trail:▫
set autowrite " 自动保存
set autoread "文件在vim之外修改过,自动重新读入
set autochdir " 自动切换当前目录为当前文件所在的目录
let mapleader=" "
inoremap jk <esc>
vnoremap . :normal! .<cr>
map Q <cmd>q<cr>
map <leader>rc :edit ~/_vimrc<cr>
map <c-s> <cmd>update<cr><cmd>source $MYVIMRC<cr>
map <c-t> <cmd>tabnew<cr>
map <leader><leader> <esc>/<++><cr>:nohlsearch<cr>c4l
nnoremap gf gF
map H ^
map L $
map ;l :set splitright<cr>:vsplit<cr>
map ;h :set nosplitright<cr>:vsplit<cr>
map ;j :set nosplitbelow<cr>:split<cr>
map ;k :set splitbelow<cr>:split<cr>
map <leader>i <c-w>i
map <leader>k <c-w>k
map <leader>l <c-w>l
map <leader>h <c-w>h
" scroll in other window
nnoremap <silent>\u <c-w>p<c-u><c-w>p
nnoremap <silent>\d <c-w>p<c-d><c-w>p
noremap <up> :res +5<cr>
noremap <down> :res -5<cr>
noremap <left> :vertical resize-5<cr>
noremap <right> :vertical resize+5<cr>
" select move
xnoremap <silent><up> :move '<-2<cr>gv
xnoremap <silent><down> :move '>+1<cr>gv
xnoremap <silent><right> y<c-w>lo<c-[>vpgv
xnoremap <silent><left> y<c-w>ho<c-[>vpgv
" Compile function
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!gcc % -o %<"
exec "!time ./%<"
exec "!rm ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
exec "!time ./%<"
exec "!rm ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
elseif &filetype == 'python'
silent! exec "!clear"
exec "!time python3 %"
elseif &filetype == 'html'
exec "!firefox % &"
endif
endfunc
nnoremap <c-`> <cmd>term<cr>
tnoremap <c-`> <c-\><c-n><cmd>bdelete! %<cr>
tnoremap <esc><esc> <c-\><c-n>
tnoremap <c-w>b <c-\><c-n><c-b>
tnoremap <c-w>n <c-w>:tabnext<CR>
tnoremap <C-W>N <C-W>:tabNext<CR>
tnoremap <C-W>1 <C-W>:1tabNext<CR>
tnoremap <C-W>2 <C-W>:2tabNext<CR>
" set netrw {{{
" 点击i键,可以在thin/long/wide/tree这4种显示模式之间切换,使用以下命令来设置显示模式:
let g:netrw_liststyle = 3
let g:netrw_winsize = 25
let g:netrw_browse_split = 4 " 在当前窗口打开文件
let g:netrw_altv = 1 " 水平分割时。netrw 始终显示在左边
nnoremap <C-b> :Lexplore<CR>
highlight VertSplit guibg=#1a1b26 guifg=#232433
"}}}
"buffer delete
nnoremap <leader>bd :bdelete<CR>
nnoremap gb :bnext<CR>
nnoremap gB :bprevious<CR>
filetype on " 设置开启文件类型侦测
filetype plugin on " 设置加载对应文件类型的插件
filetype indent on " 自适应不同语言的智能缩进
"使用tab自动补全的设定
function! CleverTab()
if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
return "\<Tab>"
else
return "\<C-N>"
endif
endfunction
inoremap <Tab> <C-R>=Clevertab()<cr>
if has("autocmd") && exists("+omnifunc")
autocmd Filetype *
\ if &omnifunc == "" |
\ setlocal omnifunc=syntaxcomplete#Complete |
\ endif
endif
" set pair baket
inoremap ( ()<left>
inoremap [ []<left>
inoremap { {}<left>
cnoremap ( ()<left>
cnoremap [ []<left>
cnoremap { {}<left>
" jump
func! s:Judge(ch,mode)
if a:mode!='c'
let ch=getline('.')[col('.')-1]
else
let ch=getcmdline()[getcmdpos()-1]
endif
if a:ch=='"'||a:ch=="'"||a:ch=='`'
if ch!=a:ch
return a:ch.a:ch."\<left>"
endif
endif
if ch==a:ch
return "\<right>"
endif
return a:ch
endfunc
inoremap <expr><silent>" <sid>Judge('"','i')
inoremap <expr><silent>` <sid>Judge('`','i')
inoremap <expr><silent>' <sid>Judge("'",'i')
inoremap <expr><silent>> <sid>Judge('>','i')
inoremap <expr><silent>) <sid>Judge(')','i')
inoremap <expr><silent>} <sid>Judge('}','i')
inoremap <expr><silent>] <sid>Judge(']','i')
cnoremap <expr>" <sid>Judge('"','c')
cnoremap <expr>` <sid>Judge('`','c')
cnoremap <expr>' <sid>Judge("'",'c')
cnoremap <expr>> <sid>Judge('>','c')
cnoremap <expr>) <sid>Judge(')','c')
cnoremap <expr>} <sid>Judge('}','c')
cnoremap <expr>] <sid>Judge(']','c')
" set backspace
inoremap <expr><bs> <sid>Backspace('i')
cnoremap <expr><bs> <sid>Backspace('c')
func! s:Backspace(mode)
if a:mode!='c'
let s:pair=getline('.')[col('.')-1]|let s:pair_l=getline('.')[col('.')-2]
else
let s:pair=getcmdline()[getcmdpos()-1]|let s:pair_l=getcmdline()[getcmdpos()-2]
endif
if has_key(g:pair_map, s:pair_l)&&(g:pair_map[s:pair_l]==s:pair)
return "\<right>\<bs>\<bs>"
else
return "\<bs>"
endif
endfunc
" map enter这个功能是autopair插件一部分,我自己实现了一下,用于大括号回车正确缩进
func! s:Enter()
let ch=getline('.')[col('.')-1]|let last=getline('.')[col('.')-2]
if ch=='}'&&last=='{'
let str=matchstr(getline('.'),"^\\s*")
call append(line('.'),str.ch)
return "\<del>\<cr>"
endif
return "\<cr>"
endfunc
inoremap <silent><cr> <c-r>=<sid>Enter()<cr>
" 支持单行和批量注释解注释
" set gcc enable {{{
func! s:Commentary(line) abort
let s:num=a:line
let line=getline(s:num)
let uncomment=2
let [l, r] = split( substitute(substitute(substitute(
\ &commentstring, '^$', '%s', ''), '\S\zs%s',' %s', '') ,'%s\ze\S', '%s ', ''), '%s', 1)
let line = matchstr(getline(s:num),'\S.*\s\@<!')
if l[-1:] ==# ' ' && stridx(line,l) == -1 && stridx(line,l[0:-2]) == 0|let l = l[:-2]|endif
if r[0] ==# ' ' && line[-strlen(r):] != r && line[1-strlen(r):] == r[1:]|let r = r[1:]|endif
if len(line) && (stridx(line,l) || line[strlen(line)-strlen(r) : -1] != r)|let uncomment = 0|endif
let line=getline(s:num)
let [l, r] = split( substitute(substitute(substitute(
\ &commentstring, '^$', '%s', ''), '\S\zs%s',' %s', '') ,'%s\ze\S', '%s ', ''), '%s', 1)
if strlen(r) > 2 && l.r !~# '\\'
let line = substitute(line,
\'\M' . substitute(l, '\ze\S\s*$', '\\zs\\d\\*\\ze', '') . '\|' . substitute(r, '\S\zs', '\\zs\\d\\*\\ze', ''),
\'\=substitute(submatch(0)+1-uncomment,"^0$\\|^-\\d*$","","")','g')
endif
if uncomment
let line = substitute(line,'\S.*\s\@<!','\=submatch(0)[strlen(l):-strlen(r)-1]','')
else
let line = substitute(line,'^\%('.matchstr(getline(s:num),'^\s*').'\|\s*\)\zs.*\S\@<=','\=l.submatch(0).r','')
endif
call setline(s:num,line)
endfunc
" visual gcc
func! s:VisualComment() abort
for temp in range(min([line('.'),line('v')]),max([line('.'),line('v')]))
call s:Commentary(temp)
endfor
endfunc
nnoremap <silent><nowait>gcc :call <sid>Commentary(line('.'))<cr>
xnoremap <silent><nowait>gc :call <sid>VisualComment()<cr>
"}}}
" vim sourround {{{
let g:pair_map={'(':')','[':']','{':'}','"':'"',"'":"'",'<':'>','`':'`',}
func! s:AddSourround()
let s:ch=nr2char(getchar())|let s:col=col('.')|let pos=getcurpos()
norm! gv"sy
let s:str = @s
for k in keys(g:pair_map)
if s:ch==k||s:ch==g:pair_map[k]
execute ":s/^\\(.\\{".(col('.')-1)."\\}\\)".escape(s:str, '~"\.^$[]*')."/\\1".k.s:str.g:pair_map[k]."/"
call setpos('.', pos)
return
endif
endfor
echo s:ch.' unknow pair'
endfunc
func! s:DelSourround()
let s:ch=nr2char(getchar())
if getline('.')[col('.')-1]!=s:ch|echo 'not begin with'.s:ch|return|endif
for k in keys(g:pair_map)
if s:ch==k|execute 'normal! xf'.g:pair_map[k].'x'|return|endif
endfor
endfunc
func! s:ChangeSourround()
let s:ch=nr2char(getchar())|let s:two=nr2char(getchar())
let pos=getcurpos()
if getline('.')[col('.')-1]!=s:ch|echo 'not begin with'.s:ch|return|endif
execute 'normal! r'.s:two.'f'.g:pair_map[s:ch].'r'.g:pair_map[s:two]
call setpos('.',pos)
endfunc
xnoremap <silent>S :<c-u>call <sid>AddSourround()<cr>
nnoremap <silent>ds :call <sid>DelSourround()<cr>
nnoremap <silent>cs :call <sid>ChangeSourround()<cr>
"}}}
" like easy motion {{{
let s:easymotion_key=['j','l','k','h','a','s','d','f','g','q','w','e','r','u','i','o','p','c','v','b','n','m','t','y','z','x']
let s:easymotion_leader=[';',',',' ',"'",'.','/','[','\',']']|let s:easymotion_leader_dict={';':0,',':0,'.':0,"'":0,' ':0,'/':0,'[':0,'\':0,']':0}
func! s:EasyMotion()abort
echo "input key:"|let ch=nr2char(getchar())|let s:easymotion={}|let llen=len(s:easymotion_leader)+1
let ch=tolower(ch)|if ch>='a'&&ch<='z'|let up=toupper(ch)|else|let up=""|endif
let info=winsaveview()|let info["endline"]=winheight(0)+info["topline"]|let width=winwidth(0)|let num=0|let old=ch|let pos=0|let klen=len(s:easymotion_key)
if ch=="\<c-[>"|return|endif
let lines=getbufline("%",info["topline"],info["endline"])|let bak=copy(lines)|set nohlsearch
let hlcomment=[]|let begin=info["topline"]|let end=info["endline"]
while end-begin>=8|call add(hlcomment,matchaddpos("comment",range(begin,end)))|let begin+=8|endwhile
call add(hlcomment,matchaddpos("comment",range(begin,end)))
let listl=range(0,len(lines)-1)|let nowline=info["lnum"]-info["topline"]|call sort(listl,{arg1,arg2 -> abs(arg2-nowline)-abs(arg1-nowline)})
for i in listl
" if i+info["topline"]==info["lnum"]|continue|endif
while 1
let pos=stridx(lines[i],ch,pos)
if up!=""|let postemp=stridx(lines[i],up,pos)|if postemp!=-1&&(postemp<pos||pos==-1)|let pos=postemp|endif|endif
if pos!=-1&&(pos<width||&wrap)
if num<klen|let req=s:easymotion_key[num]
elseif num<llen*klen|let req=s:easymotion_leader[num/klen-1].s:easymotion_key[num%klen]
else|break
endif
let m= matchaddpos("incsearch", [[i+info["topline"],pos+1,len(req)]])
let s:easymotion[req]={"line":i,"pos":pos,"hl":m}
let lines[i]=strpart(lines[i],0,pos).req.strpart(lines[i],pos+len(req))
let num+=1|let pos+=2|if num>=llen*klen|break|endif
else|let pos=0|break
endif
endwhile
if num>=llen*klen|break|endif
endfor
if len(s:easymotion)==0|echo "cannot find"|endif
silent! undojoin|call setline(info["topline"],lines)|redraw!|echo "target key:"| let ch=nr2char(getchar())
if has_key(s:easymotion_leader_dict,ch)|let ch=ch.nr2char(getchar())|endif
if has_key(s:easymotion, ch)|let temp=s:easymotion[ch]|call cursor(temp["line"]+info["topline"],temp["pos"]+1)|endif
for [key,val] in items(s:easymotion)|let i=val["line"]|let pos=val["pos"]|let hl=val["hl"]|call matchdelete(hl)|endfor
for hlnow in hlcomment|call matchdelete(hlnow)|endfor
silent! undojoin|call setline(info["topline"],bak)|setlocal nomodified
endfunc
nnoremap <silent>s :call <sid>EasyMotion()<cr>
inoremap <silent><c-s> <c-o>:call <sid>EasyMotion()<cr>
" }}}
" set tabline {{{
let s:tab_after=""
func! TabLine(direct)
let s:tab_result=""|let flag=0
if a:direct|return s:tab_after|else|let s:tab_after=""|endif
for buf in getbufinfo({'buflisted':1})
let s:name=buf.name
if strridx(buf.name,"/")!=-1|let s:name=strpart(buf.name,strridx(buf.name,"/")+1)|endif
if buf.name!=expand('%:p')
if flag==0|let s:tab_result=s:tab_result." ".s:name|else|let s:tab_after=s:tab_after." ".s:name.""|endif
else
let flag=1
endif
endfor
redrawt
return s:tab_result
endfunc
func! TabLineSet()
if &modified|let tab="%2* %0.32(%{TabLine(0)}%)%5* %t%6*%2*%<%{TabLine(1)}%r%h%w%=%6*%5* buffer"
else|let tab="%2* %0.32(%{TabLine(0)}%)%1* %t%2*%2*%<%{TabLine(1)}%r%h%w%=%2*%1* buffer"
endif
return tab
endfunc
set tabline=%!TabLineSet()
set showtabline=2
"}}}
" set statusline {{{
function GetMode()
let m = mode()|let s:str=''|let s:color='#9ECE6A'
if m == 'R'|let s:color='#F7768E'|let s:str= 'Replace'
elseif m == 'v'|let s:color='#F7768E'|let s:str= 'Visual'
elseif m == 'i'|let s:color='#7AA2F7'|let s:str= 'Insert'
elseif m == 't'|let s:color='#7AA2F7'|let s:str= 'Terminal'
else|let s:color='#9ECE6A'|let s:str= 'Normal'
endif
exec 'highlight User3 font=#000000 guifg=#1a1b26 guibg='.s:color
exec 'highlight User4 font=#000000 guifg='.s:color.' guibg=#232433'
redraw|return s:str
endfunction
let g:status_git_branch=""
func! GitBranchShow(chan,msg)
let g:status_git_branch=" ".a:msg." "
endfunc
if g:status_git_branch==""
call job_start("git rev-parse --abbrev-ref HEAD",{"out_cb":"GitBranchShow"})
endif
set statusline=%3*\ %{GetMode()}
set statusline+=%4*%{g:status_git_branch}\ %F\ %m%r%h%w%=
set statusline+=%3*\ %Y\ |
set statusline+=%3*¦%{\"\".(\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\"+\":\"\").\"\"}¦
set statusline+=%5*☰\ %l/%-L¦%3p%%¦:%v\ ¦
"}}}
" highlight define,you can change self {{{
highlight User1 font=#000000 guifg=#1a1b26 guibg=#9ECE6A
highlight User2 font=#000000 guifg=#9ECE6A guibg=#232433
highlight User3 font=#000000 guifg=#1a1b26 guibg=#9ECE6A
highlight User4 font=#000000 guifg=#9ECE6A guibg=#232433
highlight User5 font=#000000 guifg=#1a1b26 guibg=#7AA2F7
highlight User6 font=#000000 guifg=#7AA2F7 guibg=#232433
"}}}
" tokyonight color inside,donnot change it {{{
set termguicolors
let g:tokyonight_style = 'night' " available: night, storm
let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 2
let s:tmux = executable('tmux') && $TMUX !=# ''
let g:colors_name = 'tokyonight'|let s:configuration = {}
let s:configuration.style = get(g:, 'tokyonight_style', 'night')
let s:configuration.transparent_background = get(g:, 'tokyonight_transparent_background', 0)
let s:configuration.menu_selection_background = get(g:, 'tokyonight_menu_selection_background', 'green')
let s:configuration.disable_italic_comment = get(g:, 'tokyonight_disable_italic_comment', 0)
let s:configuration.enable_italic = get(g:, 'tokyonight_enable_italic', 0)
let s:configuration.cursor = get(g:, 'tokyonight_cursor', 'auto')
let s:configuration.current_word = get(g:, 'tokyonight_current_word', get(g:, 'tokyonight_transparent_background', 0) == 0 ? 'grey background' : 'bold')
if s:configuration.style ==# 'night'
let s:palette = {
\ 'black': ['#06080a', '237', 'DarkGrey'],
\ 'bg0': ['#1a1b26', '235', 'Black'],
\ 'bg1': ['#232433', '236', 'DarkGrey'],
\ 'bg2': ['#2a2b3d', '236', 'DarkGrey'],
\ 'bg3': ['#32344a', '237', 'DarkGrey'],
\ 'bg4': ['#3b3d57', '237', 'Grey'],
\ 'bg_red': ['#ff7a93', '203', 'Red'],
\ 'diff_red': ['#803d49', '52', 'DarkRed'],
\ 'bg_green': ['#b9f27c', '107', 'Green'],
\ 'diff_green': ['#618041', '22', 'DarkGreen'],
\ 'bg_blue': ['#7da6ff', '110', 'Blue'],
\ 'diff_blue': ['#3e5380', '17', 'DarkBlue'],
\ 'fg': ['#a9b1d6', '250', 'White'],
\ 'red': ['#F7768E', '203', 'Red'],
\ 'orange': ['#FF9E64', '215', 'Orange'],
\ 'yellow': ['#E0AF68', '179', 'Yellow'],
\ 'green': ['#9ECE6A', '107', 'Green'],
\ 'blue': ['#7AA2F7', '110', 'Blue'],
\ 'purple': ['#ad8ee6', '176', 'Magenta'],
\ 'grey': ['#444B6A', '246', 'LightGrey'],
\ 'none': ['NONE', 'NONE', 'NONE']
\ }
elseif s:configuration.style ==# 'storm'
let s:palette = {
\ 'black': ['#06080a', '237', 'DarkGrey'],
\ 'bg0': ['#24283b', '235', 'Black'],
\ 'bg1': ['#282d42', '236', 'DarkGrey'],
\ 'bg2': ['#2f344d', '236', 'DarkGrey'],
\ 'bg3': ['#333954', '237', 'DarkGrey'],
\ 'bg4': ['#3a405e', '237', 'Grey'],
\ 'bg_red': ['#ff7a93', '203', 'Red'],
\ 'diff_red': ['#803d49', '52', 'DarkRed'],
\ 'bg_green': ['#b9f27c', '107', 'Green'],
\ 'diff_green': ['#618041', '22', 'DarkGreen'],
\ 'bg_blue': ['#7da6ff', '110', 'Blue'],
\ 'diff_blue': ['#3e5380', '17', 'DarkBlue'],
\ 'fg': ['#a9b1d6', '250', 'White'],
\ 'red': ['#F7768E', '203', 'Red'],
\ 'orange': ['#FF9E64', '215', 'Orange'],
\ 'yellow': ['#E0AF68', '179', 'Yellow'],
\ 'green': ['#9ECE6A', '107', 'Green'],
\ 'blue': ['#7AA2F7', '110', 'Blue'],
\ 'purple': ['#ad8ee6', '176', 'Magenta'],
\ 'grey': ['#444B6A', '246', 'LightGrey'],
\ 'none': ['NONE', 'NONE', 'NONE']
\ }
endif
if (has('termguicolors') && &termguicolors) || has('gui_running') " guifg guibg gui cterm guisp
function! s:HL(group, fg, bg, ...)
let hl_string = [ 'highlight', a:group, 'guifg=' . a:fg[0], 'guibg=' . a:bg[0], ]
if a:0 >= 1
if a:1 ==# 'undercurl'
if !s:tmux|call add(hl_string, 'gui=undercurl')
else|call add(hl_string, 'gui=underline')
endif
call add(hl_string, 'cterm=underline')
else|call add(hl_string, 'gui=' . a:1)|call add(hl_string, 'cterm=' . a:1)
endif
else|call add(hl_string, 'gui=NONE')|call add(hl_string, 'cterm=NONE')
endif
if a:0 >= 2|call add(hl_string, 'guisp=' . a:2[0])|endif
execute join(hl_string, ' ')
endfunction
elseif s:t_Co >= 256
function! s:HL(group, fg, bg, ...)
let hl_string = [ 'highlight', a:group, 'ctermfg=' . a:fg[1], 'ctermbg=' . a:bg[1]]
if a:0 >= 1
if a:1 ==# 'undercurl'|call add(hl_string, 'cterm=underline')
else|call add(hl_string, 'cterm=' . a:1)
endif
else|call add(hl_string, 'cterm=NONE')
endif
execute join(hl_string, ' ')
endfunction
else " ctermfg ctermbg cterm
function! s:HL(group, fg, bg, ...)
let hl_string = [ 'highlight', a:group, 'ctermfg=' . a:fg[2], 'ctermbg=' . a:bg[2]]
if a:0 >= 1
if a:1 ==# 'undercurl'|call add(hl_string, 'cterm=underline')
else|call add(hl_string, 'cterm=' . a:1)
endif
else|call add(hl_string, 'cterm=NONE')
endif
execute join(hl_string, ' ')
endfunction
endif
if s:configuration.transparent_background
call s:HL('Normal', s:palette.fg, s:palette.none)
call s:HL('Terminal', s:palette.fg, s:palette.none)
call s:HL('EndOfBuffer', s:palette.bg0, s:palette.none)
call s:HL('FoldColumn', s:palette.grey, s:palette.none)
call s:HL('Folded', s:palette.grey, s:palette.none)
call s:HL('SignColumn', s:palette.fg, s:palette.none)
call s:HL('ToolbarLine', s:palette.fg, s:palette.none)
else
call s:HL('Normal', s:palette.fg, s:palette.bg0)
call s:HL('Terminal', s:palette.fg, s:palette.bg0)
call s:HL('EndOfBuffer', s:palette.bg0, s:palette.bg0)
call s:HL('FoldColumn', s:palette.grey, s:palette.bg1)
call s:HL('Folded', s:palette.grey, s:palette.bg1)
call s:HL('SignColumn', s:palette.fg, s:palette.bg1)
call s:HL('ToolbarLine', s:palette.fg, s:palette.bg2)
endif
call s:HL('ColorColumn', s:palette.none, s:palette.bg1)
call s:HL('Conceal', s:palette.grey, s:palette.none)
if s:configuration.cursor ==# 'auto'|call s:HL('Cursor', s:palette.none, s:palette.none, 'reverse')
elseif s:configuration.cursor ==# 'red'|call s:HL('Cursor', s:palette.bg0, s:palette.red)
elseif s:configuration.cursor ==# 'green'|call s:HL('Cursor', s:palette.bg0, s:palette.green)
elseif s:configuration.cursor ==# 'blue'|call s:HL('Cursor', s:palette.bg0, s:palette.blue)
endif
highlight! link vCursor Cursor
highlight! link iCursor Cursor
highlight! link lCursor Cursor
highlight! link CursorIM Cursor
call s:HL('CursorColumn', s:palette.none, s:palette.bg1)
call s:HL('CursorLine', s:palette.none, s:palette.bg1)
call s:HL('LineNr', s:palette.grey, s:palette.none)
if &relativenumber == 1 && &cursorline == 0|call s:HL('CursorLineNr', s:palette.fg, s:palette.none)
else|call s:HL('CursorLineNr', s:palette.fg, s:palette.bg1)
endif
call s:HL('DiffAdd', s:palette.none, s:palette.diff_green)
call s:HL('DiffChange', s:palette.none, s:palette.diff_blue)
call s:HL('DiffDelete', s:palette.none, s:palette.diff_red)
call s:HL('DiffText', s:palette.none, s:palette.none, 'reverse')
call s:HL('Directory', s:palette.green, s:palette.none)
call s:HL('ErrorMsg', s:palette.red, s:palette.none, 'bold,underline')
call s:HL('WarningMsg', s:palette.yellow, s:palette.none, 'bold')
call s:HL('ModeMsg', s:palette.fg, s:palette.none, 'bold')
call s:HL('MoreMsg', s:palette.blue, s:palette.none, 'bold')
call s:HL('IncSearch', s:palette.bg0, s:palette.bg_red)
call s:HL('Search', s:palette.bg0, s:palette.bg_green)
call s:HL('MatchParen', s:palette.none, s:palette.bg4)
call s:HL('NonText', s:palette.bg4, s:palette.none)
call s:HL('Whitespace', s:palette.bg4, s:palette.none)
call s:HL('SpecialKey', s:palette.bg4, s:palette.none)
call s:HL('Pmenu', s:palette.fg, s:palette.bg2)
call s:HL('PmenuSbar', s:palette.none, s:palette.bg2)
if s:configuration.menu_selection_background ==# 'blue'
call s:HL('PmenuSel', s:palette.bg0, s:palette.bg_blue)
call s:HL('WildMenu', s:palette.bg0, s:palette.bg_blue)
elseif s:configuration.menu_selection_background ==# 'green'
call s:HL('PmenuSel', s:palette.bg0, s:palette.bg_green)
call s:HL('WildMenu', s:palette.bg0, s:palette.bg_green)
elseif s:configuration.menu_selection_background ==# 'red'
call s:HL('PmenuSel', s:palette.bg0, s:palette.bg_red)
call s:HL('WildMenu', s:palette.bg0, s:palette.bg_red)
endif
call s:HL('PmenuThumb', s:palette.none, s:palette.grey)
call s:HL('Question', s:palette.yellow, s:palette.none)
call s:HL('SpellBad', s:palette.red, s:palette.none, 'undercurl', s:palette.red)
call s:HL('SpellCap', s:palette.yellow, s:palette.none, 'undercurl', s:palette.yellow)
call s:HL('SpellLocal', s:palette.blue, s:palette.none, 'undercurl', s:palette.blue)
call s:HL('SpellRare', s:palette.purple, s:palette.none, 'undercurl', s:palette.purple)
call s:HL('StatusLine', s:palette.fg, s:palette.bg3)
call s:HL('StatusLineTerm', s:palette.fg, s:palette.bg3)
call s:HL('StatusLineNC', s:palette.grey, s:palette.bg1)
call s:HL('StatusLineTermNC', s:palette.grey, s:palette.bg1)
call s:HL('TabLine', s:palette.fg, s:palette.bg4)
call s:HL('TabLineFill', s:palette.grey, s:palette.bg1)
call s:HL('TabLineSel', s:palette.bg0, s:palette.bg_red)
call s:HL('VertSplit', s:palette.black, s:palette.none)
call s:HL('Visual', s:palette.none, s:palette.bg3)
call s:HL('VisualNOS', s:palette.none, s:palette.bg3, 'underline')
call s:HL('QuickFixLine', s:palette.blue, s:palette.none, 'bold')
call s:HL('Debug', s:palette.yellow, s:palette.none)
call s:HL('debugPC', s:palette.bg0, s:palette.green)
call s:HL('debugBreakpoint', s:palette.bg0, s:palette.red)
call s:HL('ToolbarButton', s:palette.bg0, s:palette.bg_blue)
call s:HL('Type', s:palette.blue, s:palette.none, 'italic')
call s:HL('Structure', s:palette.blue, s:palette.none, 'italic')
call s:HL('StorageClass', s:palette.blue, s:palette.none, 'italic')
call s:HL('Identifier', s:palette.orange, s:palette.none, 'italic')
call s:HL('Constant', s:palette.orange, s:palette.none, 'italic')
call s:HL('PreProc', s:palette.red, s:palette.none)
call s:HL('PreCondit', s:palette.red, s:palette.none)
call s:HL('Include', s:palette.red, s:palette.none)
call s:HL('Keyword', s:palette.red, s:palette.none)
call s:HL('Define', s:palette.red, s:palette.none)
call s:HL('Typedef', s:palette.red, s:palette.none)
call s:HL('Exception', s:palette.red, s:palette.none)
call s:HL('Conditional', s:palette.red, s:palette.none)
call s:HL('Repeat', s:palette.red, s:palette.none)
call s:HL('Statement', s:palette.red, s:palette.none)
call s:HL('Macro', s:palette.purple, s:palette.none)
call s:HL('Error', s:palette.red, s:palette.none)
call s:HL('Label', s:palette.purple, s:palette.none)
call s:HL('Special', s:palette.purple, s:palette.none)
call s:HL('SpecialChar', s:palette.purple, s:palette.none)
call s:HL('Boolean', s:palette.purple, s:palette.none)
call s:HL('String', s:palette.yellow, s:palette.none)
call s:HL('Character', s:palette.yellow, s:palette.none)
call s:HL('Number', s:palette.purple, s:palette.none)
call s:HL('Float', s:palette.purple, s:palette.none)
call s:HL('Function', s:palette.green, s:palette.none)
call s:HL('Operator', s:palette.red, s:palette.none)
call s:HL('Title', s:palette.red, s:palette.none, 'bold')
call s:HL('Tag', s:palette.orange, s:palette.none)
call s:HL('Delimiter', s:palette.fg, s:palette.none)
call s:HL('Comment', s:palette.grey, s:palette.none, 'italic')
call s:HL('SpecialComment', s:palette.grey, s:palette.none, 'italic')
call s:HL('Todo', s:palette.blue, s:palette.none, 'italic')
call s:HL('Ignore', s:palette.grey, s:palette.none)
call s:HL('Underlined', s:palette.none, s:palette.none, 'underline')
call s:HL('Fg', s:palette.fg, s:palette.none)
call s:HL('Grey', s:palette.grey, s:palette.none)
call s:HL('Red', s:palette.red, s:palette.none)
call s:HL('Orange', s:palette.orange, s:palette.none)
call s:HL('Yellow', s:palette.yellow, s:palette.none)
call s:HL('Green', s:palette.green, s:palette.none)
call s:HL('Blue', s:palette.blue, s:palette.none)
call s:HL('Purple', s:palette.purple, s:palette.none)
call s:HL('RedItalic', s:palette.red, s:palette.none, 'italic')
call s:HL('BlueItalic', s:palette.blue, s:palette.none, 'italic')
call s:HL('OrangeItalic', s:palette.orange, s:palette.none, 'italic')
let s:terminal = {
\ 'black':s:palette.black,'red':s:palette.red,'yellow':s:palette.yellow,'green':s:palette.green,
\ 'cyan':s:palette.orange,'blue':s:palette.blue,'purple':s:palette.purple,'white':s:palette.fg
\ }
let g:terminal_ansi_colors = [s:terminal.black[0], s:terminal.red[0], s:terminal.green[0], s:terminal.yellow[0],
\ s:terminal.blue[0], s:terminal.purple[0], s:terminal.cyan[0], s:terminal.white[0], s:terminal.black[0], s:terminal.red[0],
\ s:terminal.green[0], s:terminal.yellow[0], s:terminal.blue[0], s:terminal.purple[0], s:terminal.cyan[0], s:terminal.white[0]]