2026/10/20

Vim 탭라인, 상태표시줄 설정



Claude를 이용해 neovim에서 쓰던 mini.statusline설정을 플러그인 없이 vim에서 쓸 수 있도록 수정.

" Statusline/Tabline
set laststatus=2                " 상태표시줄 항상 표시(ls)
set noshowmode                  " 상태표시줄에 모드정보 표시(smd)
set showtabline=2               " 탭페이지 목록 항상 표시

" Highlight
function! s:Highlights() abort
  highlight Normal ctermbg=NONE guibg=NONE                       " 기본 배경 투명 처리
  highlight LineNr ctermbg=NONE guibg=NONE                       " 줄번호 배경 투명 처리
  highlight CursorLine ctermbg=238 ctermfg=NONE guibg=#313244    " 커서라인 배경색
  highlight CursorLineNr ctermbg=238 ctermfg=NONE guibg=#313244  " 현재 줄번호 배경
  highlight ExtraWhitespace ctermfg=red guifg=red                " 잔여 공백문자 색상
  highlight NonText ctermfg=red guifg=red                        " 화면표시용 문자 색상
  highlight EndOfBuffer ctermbg=NONE guibg=NONE                  " EndOfBuffer 배경색
  " Statusline
  highlight StlNormal  ctermfg=0 ctermbg=4 guifg=#1e1e2e guibg=#89b4fa
  highlight StlInsert  ctermfg=0 ctermbg=2 guifg=#1e1e2e guibg=#a6e3a1
  highlight StlVisual  ctermfg=0 ctermbg=5 guifg=#1e1e2e guibg=#cba6f7
  highlight StlReplace ctermfg=0 ctermbg=1 guifg=#1e1e2e guibg=#f38ba8
  highlight StlCommand ctermfg=0 ctermbg=3 guifg=#1e1e2e guibg=#f9e2af
  highlight StlOther   ctermfg=0 ctermbg=6 guifg=#1e1e2e guibg=#94e2d5
  highlight StlFile    ctermfg=7 ctermbg=8 guifg=#cdd6f4 guibg=#313244
  " Tabline
  highlight TlSel  ctermfg=0 ctermbg=4 guifg=#1e1e2e guibg=#89b4fa gui=bold
  highlight TlNorm ctermfg=7 ctermbg=8 guifg=#cdd6f4 guibg=#313244
  highlight TlFill ctermfg=7 ctermbg=0 guifg=#6c7086 guibg=#181825
endfunction

" Statusline/설정
let s:modes = {
  \ 'n': ['NORMAL',  'StlNormal'],
  \ 'i': ['INSERT',  'StlInsert'],
  \ 'v': ['VISUAL',  'StlVisual'],
  \ 'V': ['V-LINE',  'StlVisual'],
  \ "\<C-v>": ['V-BLOCK', 'StlVisual'],
  \ 'R': ['REPLACE', 'StlReplace'],
  \ 'c': ['COMMAND', 'StlCommand'],
  \ 't': ['TERMINAL', 'StlOther'],
  \ }
function! StlFilesize() abort
  let s = getfsize(expand('%:p'))
  if s < 0 | return '' | endif
  let u = ['B', 'K', 'M', 'G']
  let i = 0
  let s = s * 1.0
  while s >= 1024 && i < 3
    let s = s / 1024
    let i += 1
  endwhile
  return printf('%.1f%s', s, u[i])
endfunction
function! StlFormat() abort
  return &fileformat
endfunction
function! StlEncoding() abort
  let enc = &fileencoding !=# '' ? &fileencoding : &encoding
  return &bomb ? enc . 'ᵇ' : enc
endfunction
function! Stl() abort
  if g:statusline_winid != win_getid()
    return '%#StatusLineNC# %f %m%r'
  endif
  let m = mode()
  let [name, hl] = get(s:modes, m, [m, 'StlOther'])
  let pct = line('$') > 0 ? line('.') * 100 / line('$') : 0
  return '%#' . hl . '# ' . name . ' '
    \ . '%#StlFile#%< %f %m%r'
    \ . '%='
    \ . ' ' . StlFormat() . ' ' . StlEncoding() . ' ' . StlFilesize() . ' '
    \ . '%#' . hl . '# ' . line('.') . ':' . col('.')
    \ . ' ' . printf('%d%%%%', pct) . ' '
endfunction
set statusline=%!Stl()

" Tabline/설정
let s:sup = ['⁰','¹','²','³','⁴','⁵','⁶','⁷','⁸','⁹']
function! s:Super(n) abort
  return join(map(split(string(a:n), '\zs'), 's:sup[v:val]'), '')
endfunction
function! Tl() abort
  let cur = bufnr('%')
  let s = ''
  let idx = 0
  for b in range(1, bufnr('$'))
    if !buflisted(b) | continue | endif
    let idx += 1
    let name = fnamemodify(bufname(b), ':t')
    let name = name ==# '' ? '[No Name]' : substitute(name, '%', '%%', 'g')
    let mod  = getbufvar(b, '&modified') ? '+' : ''
    let hl   = b == cur ? '%#TlSel#' : '%#TlNorm#'
    let s .= hl . ' ' . s:Super(idx) . name . mod . ' '
  endfor
  return s . '%#TlFill#'
endfunction
set tabline=%!Tl()

" <leader>1-9: N번째 버퍼로 이동
function! GotoBuf(n) abort
  let bufs = getbufinfo({'buflisted': 1})
  if a:n <= len(bufs)
    execute 'buffer' bufs[a:n - 1].bufnr
  endif
endfunction
for i in range(1, 9)
  execute 'nnoremap <silent> <leader>' . i . ' :call GotoBuf(' . i . ')<CR>'
endfor

" 컬러스킴 실행시 사용자 하일라이트 다시 적용
augroup Highlights
  autocmd!
  autocmd ColorScheme * call <SID>Highlights()
augroup END

call s:Highlights()