diff options
| -rw-r--r-- | .config/nvim/init.lua | 297 | ||||
| -rw-r--r-- | .vimrc | 291 |
2 files changed, 372 insertions, 216 deletions
diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index 7db69d0..56e74d3 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -353,8 +353,6 @@ paq({ 'LeafCage/foldCC.vim', -- Show indent. 'Yggdroot/indentLine', - -- Cool status line. - 'itchyny/lightline.vim', -- Highlight matched parentheses. 'itchyny/vim-parenmatch', -- Highlight specified words. @@ -563,28 +561,6 @@ vimrc.autocmd('BufRead', '*', function() end) --- Syntax highlight for .vimrc {{{2 - -vimrc.autocmd('ColorScheme', 'ocean', function() - if vim.o.background ~= 'dark' then - return - end - - -- yankround - vimrc.hi_link('YankRoundRegion', 'DiffChange') - - -- sandwich - vimrc.hi_link('OperatorSandwichBuns', 'DiffChange') - vimrc.hi_link('OperatorSandwichStuff', 'DiffChange') - vimrc.hi_link('OperatorSandwichDelete', 'DiffChange') - vimrc.hi_link('OperatorSandwichAdd', 'OperatorSandwichBuns') - - -- easymotion - vimrc.hi('EasyMotionShade', 'guifg=#4d4d4d guibg=NONE gui=NONE cterm=NONE') - vimrc.hi('EasyMotionTarget', 'guifg=#ff7100 guibg=NONE gui=underline cterm=underline') - vimrc.hi_link('EasyMotionMoveHL', 'IncSearch') -end) - -- Mappings {{{1 @@ -1125,7 +1101,9 @@ command! -nargs=+ --- Color scheme {{{1 +-- Appearance {{{1 + +-- Color scheme {{{2 -- A command which changes color scheme with fall back. vim.cmd([[ @@ -1156,6 +1134,180 @@ vim.cmd('ColorScheme! ocean') +-- Statusline {{{2 + +vim.o.statusline = '%!v:lua.vimrc.statusline.build()' + +vimrc.statusline = {} + +function vimrc.statusline.build() + local winid = vim.g.statusline_winid + local bufnr = vim.fn.winbufnr(winid) + local is_active = winid == vim.fn.win_getid() + if is_active then + local mode, mode_hl = vimrc.statusline.mode() + local ro = vimrc.statusline.readonly(bufnr) + local fname = vimrc.statusline.filename(bufnr) + local mod = vimrc.statusline.modified(bufnr) + local linenum = vimrc.statusline.linenum(winid) + local fenc = vimrc.statusline.fenc_ff(bufnr) + local ft = vimrc.statusline.filetype(bufnr) + return string.format( + '%%#statusLineMode%s# %s %%#statusLineLeft# %s%s%s %%#StatusLine#%%=%%#statusLineRight# %s | %s | %s ', + mode_hl, + mode, + ro and ro .. ' ' or '', + fname, + mod and ' ' .. mod or '', + linenum, + fenc, + ft) + else + local ro = vimrc.statusline.readonly(bufnr) + local fname = vimrc.statusline.filename(bufnr) + local mod = vimrc.statusline.modified(bufnr) + local linenum = vimrc.statusline.linenum(winid) + local fenc = vimrc.statusline.fenc_ff(bufnr) + local ft = vimrc.statusline.filetype(bufnr) + return string.format( + '%%#statusLineLeft# %s%s%s %%#StatusLine#%%=%%#statusLineRight# %s | %s | %s ', + ro and ro .. ' ' or '', + fname, + mod and ' ' .. mod or '', + linenum, + fenc, + ft) + end +end + +function vimrc.statusline.mode() + local mode_map = { + n = { 'N', 'Normal' }, + no = { 'O', 'Operator' }, + nov = { 'Oc', 'Operator' }, + noV = { 'Ol', 'Operator' }, + [vimrc.term('no<C-v>')] = { 'Ob', 'Operator' }, + niI = { 'In', 'Insert' }, + niR = { 'Rn', 'Replace' }, + niV = { 'Rn', 'Replace' }, + v = { 'V', 'Visual' }, + V = { 'Vl', 'Visual' }, + [vimrc.term('<C-v>')] = { 'Vb', 'Visual' }, + s = { 'S', 'Visual' }, + S = { 'Sl', 'Visual' }, + [vimrc.term('<C-s>')] = { 'Sb', 'Visual' }, + i = { 'I', 'Insert' }, + ic = { 'I?', 'Insert' }, + ix = { 'I?', 'Insert' }, + R = { 'R', 'Replace' }, + Rc = { 'R?', 'Replace' }, + Rv = { 'R', 'Replace' }, + Rx = { 'R?', 'Replace' }, + c = { 'C', 'Command' }, + cv = { 'C', 'Command' }, + ce = { 'C', 'Command' }, + r = { '-', 'Other' }, + rm = { '-', 'Other' }, + ['r?'] = { '-', 'Other' }, + ['!'] = { '-', 'Other' }, + t = { 'T', 'Terminal' }, + } + local vim_mode_and_hl = mode_map[vim.fn.mode(true)] or { '-', 'Other' } + local vim_mode = vim_mode_and_hl[1] + local hl = vim_mode_and_hl[2] + + -- Calling `eskk#statusline()` makes Vim autoload eskk. If you call it + -- without checking `g:loaded_autoload_eskk`, eskk is loaded on an early + -- stage of the initialization (probably the first rendering of status line), + -- which slows down Vim startup. Loading eskk can be delayed by checking both + -- of `g:loaded_eskk` and `g:loaded_autoload_eskk`. + local skk_mode + if vim.g.loaded_eskk and vim.g.loaded_autoload_eskk then + skk_mode = vim.fn['eskk#statusline'](' (%s)', '') + else + skk_mode = '' + end + + return vim_mode .. skk_mode, hl +end + +function vimrc.statusline.readonly(bufnr) + local ro = vim.fn.getbufvar(bufnr, '&readonly') + if ro == 1 then + return '[RO]' + else + return nil + end +end + +function vimrc.statusline.filename(bufnr) + local name = vim.fn.bufname(bufnr) + if name == '' then + return '[No Name]' + else + return name + end +end + +function vimrc.statusline.modified(bufnr) + local mod = vim.fn.getbufvar(bufnr, '&modified') + local ma = vim.fn.getbufvar(bufnr, '&modifiable') + if mod == 1 then + return '[+]' + elseif ma == 0 then + return '[-]' + else + return nil + end +end + +function vimrc.statusline.linenum(winid) + return vim.fn.line('.', winid) .. '/' .. vim.fn.line('$', winid) +end + +function vimrc.statusline.fenc_ff(bufnr) + local fenc = vim.fn.getbufvar(bufnr, '&fileencoding') + local ff = vim.fn.getbufvar(bufnr, '&fileformat') + local bom = vim.fn.getbufvar(bufnr, '&bomb') -- BOMB!! + + if fenc == '' then + local fencs = vim.fn.split(vim.o.fileencodings, ',') + fenc = fencs[1] or vim.o.encoding + elseif fenc == 'utf-8' then + fenc = bom and 'U8[BOM]' or 'U8' + elseif fenc == 'utf-16' then + fenc = 'U16[BE]' + elseif fenc == 'utf-16le' then + fenc = 'U16[LE]' + elseif fenc == 'ucs-4' then + fenc = 'U32[BE]' + elseif fenc == 'ucs-4le' then + fenc = 'U32[LE]' + else + fenc = fenc:upper() + end + + if ff == 'unix' then + ff = '' + elseif ff == 'dos' then + ff = ' (CRLF)' + elseif ff == 'mac' then + ff = ' (CR)' + else + ff = ' (Unknown)' + end + + return fenc .. ff +end + +function vimrc.statusline.filetype(bufnr) + local ft = vim.fn.getbufvar(bufnr, '&filetype') + if ft == '' then + return '[None]' + else + return ft + end +end -- Plugins configuration {{{1 -- Disable standard plugins. {{{2 @@ -1451,101 +1603,6 @@ vimrc.map_plug('x', 'gJ', '(jplus-input)') --- lightline {{{2 - -vimrc.lightline = {} - -function vimrc.lightline.mode() - -- Calling `eskk#statusline()` makes Vim autoload eskk. If you call it - -- without checking `g:loaded_autoload_eskk`, eskk is loaded on an early - -- stage of the initialization (probably the first rendering of status line), - -- which slows down Vim startup. Loading eskk can be delayed by checking both - -- of `g:loaded_eskk` and `g:loaded_autoload_eskk`. - local skk - if vim.g.loaded_eskk and vim.g.loaded_autoload_eskk then - skk = vim.fn['eskk#statusline'](' (%s)', '') - else - skk = '' - end - return vim.fn['lightline#mode']() .. skk -end - - -function vimrc.lightline.linenum() - return vim.fn.line('.') .. '/' .. vim.fn.line('$') -end - - -function vimrc.lightline.fileformat() - if vim.o.fileformat == 'unix' then - return 'LF' - elseif vim.o.fileformat == 'dos' then - return 'CRLF' - elseif vim.o.fileformat == 'mac' then - return 'CR' - else - return '-' - end -end - - -vim.cmd([[ -function! Lightline_mode() abort - return v:lua.vimrc.lightline.mode() -endfunction - -function! Lightline_linenum() abort - return v:lua.vimrc.lightline.linenum() -endfunction - -function! Lightline_fileformat() abort - return v:lua.vimrc.lightline.fileformat() -endfunction -]]) - - - -vim.g.lightline = { - colorscheme = 'jellybeans', - active = { - left = {{'mode', 'paste'}, {'readonly', 'filename', 'modified'}}, - right = {{'linenum'}, {'fileencoding', 'fileformat', 'filetype'}}, - }, - inactive = { - left = {{'readonly', 'filename', 'modified'}}, - right = {{'linenum'}, {'fileencoding', 'fileformat', 'filetype'}}, - }, - component_function = { - mode = 'Lightline_mode', - linenum = 'Lightline_linenum', - fileformat = 'Lightline_fileformat', - }, - mode_map = { - n = 'N', - i = 'I', - R = 'R', - v = 'V', - V = 'V-L', - [vimrc.term("<C-v>")] = 'V-B', - c = 'C', - s = 'S', - S = 'S-L', - [vimrc.term("<C-s>")] = 'S-B', - t = 'T', - }, - tabline = { - left = {{'tabs'}}, - right = {}, - }, - tab = { - active = {'tabnum', 'filename', 'modified'}, - inactive = {'tabnum', 'filename', 'modified'}, - }, -} - - - - -- vim-lsp {{{2 -- TODO @@ -438,9 +438,6 @@ Plug 'LeafCage/foldCC.vim' " Show indent. Plug 'Yggdroot/indentLine' -" Cool status line. -Plug 'itchyny/lightline.vim' - " Highlight matched parentheses. Plug 'itchyny/vim-parenmatch' @@ -594,28 +591,6 @@ endfunction -Autocmd ColorScheme ocean call s:extra_highlight() - - -function! s:extra_highlight() abort - if &background != 'dark' - return - endif - - hi! link YankRoundRegion DiffChange - - hi! link OperatorSandwichBuns DiffChange - hi! link OperatorSandwichStuff DiffChange - hi! link OperatorSandwichDelete DiffChange - hi! link OperatorSandwichAdd OperatorSandwichBuns - - hi EasyMotionShade guifg=#4d4d4d guibg=NONE gui=NONE cterm=NONE - hi EasyMotionTarget guifg=#ff7100 guibg=NONE gui=underline cterm=underline - hi! link EasyMotionMoveHL IncSearch -endfunction - - - " Mappings {{{1 @@ -1199,7 +1174,9 @@ endfunction -" Color scheme {{{1 +" Appearance {{{1 + +" Color scheme {{{2 " A command which changes color scheme with fall back. command! -bang -nargs=? @@ -1221,10 +1198,202 @@ function! s:colorscheme(bang, name) abort endfunction +function! s:extra_highlight() abort + if &background != 'dark' + return + endif + + hi! link YankRoundRegion DiffChange + + hi! link OperatorSandwichBuns DiffChange + hi! link OperatorSandwichStuff DiffChange + hi! link OperatorSandwichDelete DiffChange + hi! link OperatorSandwichAdd OperatorSandwichBuns + + hi EasyMotionShade guifg=#4d4d4d guibg=NONE gui=NONE cterm=NONE + hi EasyMotionTarget guifg=#ff7100 guibg=NONE gui=underline cterm=underline + hi! link EasyMotionMoveHL IncSearch + + hi statusLineModeNormal guifg=NONE guibg=NONE gui=bold cterm=bold + hi statusLineModeInsert guifg=NONE guibg=NONE gui=bold cterm=bold + hi statusLineModeVisual guifg=NONE guibg=NONE gui=bold cterm=bold + hi statusLineModeOperator guifg=NONE guibg=NONE gui=bold cterm=bold + hi statusLineModeReplace guifg=NONE guibg=NONE gui=bold cterm=bold + hi statusLineModeCommand guifg=NONE guibg=NONE gui=bold cterm=bold + hi statusLineModeTerminal guifg=NONE guibg=NONE gui=bold cterm=bold + hi statusLineModeOther guifg=NONE guibg=NONE gui=bold cterm=bold + hi statusLineLeft guifg=#b7b7b7 guibg=#606060 gui=NONE cterm=NONE + hi statusLineRight guifg=#b7b7b7 guibg=#606060 gui=NONE cterm=NONE +endfunction + + +Autocmd ColorScheme ocean call s:extra_highlight() + + ColorScheme! ocean +" Statusline {{{2 + +set statusline=%!Statusline_build() + +function! Statusline_build() abort + let winid = g:statusline_winid + let bufnr = winbufnr(winid) + let is_active = winid ==# win_getid() + if is_active + let [mode, mode_hl] = s:statusline_mode() + let ro = s:statusline_readonly(bufnr) + let fname = s:statusline_filename(bufnr) + let mod = s:statusline_modified(bufnr) + let linenum = s:statusline_linenum(winid) + let fenc = s:statusline_fenc_ff(bufnr) + let ft = s:statusline_filetype(bufnr) + return printf( + \ '%%#statusLineMode%s# %s %%#statusLineLeft# %s%s%s %%#StatusLine#%%=%%#statusLineRight# %s | %s | %s ', + \ mode_hl, + \ mode, + \ empty(ro) ? '' : ro . ' ', + \ fname, + \ empty(mod) ? '' : ' ' . mod, + \ linenum, + \ fenc, + \ ft) + else + let ro = s:statusline_readonly(bufnr) + let fname = s:statusline_filename(bufnr) + let mod = s:statusline_modified(bufnr) + let linenum = s:statusline_linenum(winid) + let fenc = s:statusline_fenc_ff(bufnr) + let ft = s:statusline_filetype(bufnr) + return printf( + \ '%%#statusLineLeft# %s%s%s %%#StatusLine#%%=%%#statusLineRight# %s | %s | %s ', + \ empty(ro) ? '' : ro . ' ', + \ fname, + \ empty(mod) ? '' : ' ' . mod, + \ linenum, + \ fenc, + \ ft) + endif +endfunction + +function! s:statusline_mode() abort + const mode_map = { + \ 'n': ['N', 'Normal'], + \ 'no': ['O', 'Operator'], + \ 'nov': ['Oc', 'Operator'], + \ 'noV': ['Ol', 'Operator'], + \ "no\<C-v>": ['Ob', 'Operator'], + \ 'niI': ['In', 'Insert'], + \ 'niR': ['Rn', 'Replace'], + \ 'niV': ['Rn', 'Replace'], + \ 'v': ['V', 'Visual'], + \ 'V': ['Vl', 'Visual'], + \ "\<C-v>": ['Vb', 'Visual'], + \ 's': ['S', 'Visual'], + \ 'S': ['Sl', 'Visual'], + \ "\<C-s>": ['Sb', 'Visual'], + \ 'i': ['I', 'Insert'], + \ 'ic': ['I?', 'Insert'], + \ 'ix': ['I?', 'Insert'], + \ 'R': ['R', 'Replace'], + \ 'Rc': ['R?', 'Replace'], + \ 'Rv': ['R', 'Replace'], + \ 'Rx': ['R?', 'Replace'], + \ 'c': ['C', 'Command'], + \ 'cv': ['C', 'Command'], + \ 'ce': ['C', 'Command'], + \ 'r': ['-', 'Other'], + \ 'rm': ['-', 'Other'], + \ 'r?': ['-', 'Other'], + \ '!': ['-', 'Other'], + \ 't': ['T', 'Terminal'], + \ } + let [vim_mode, hl] = get(mode_map, mode(v:true), ['-', 'Other']) + + " Calling `eskk#statusline()` makes Vim autoload eskk. If you call it + " without checking `g:loaded_autoload_eskk`, eskk is loaded on an early + " stage of the initialization (probably the first rendering of status line), + " which slows down Vim startup. Loading eskk can be delayed by checking both + " of `g:loaded_eskk` and `g:loaded_autoload_eskk`. + if exists('g:loaded_eskk') && exists('g:loaded_autoload_eskk') + let skk_mode = eskk#statusline(' (%s)', '') + else + let skk_mode = '' + endif + + return [vim_mode . skk_mode, hl] +endfunction + +function! s:statusline_readonly(bufnr) abort + let ro = getbufvar(a:bufnr, '&readonly') + return ro ? '[RO]' : '' +endfunction + +function! s:statusline_filename(bufnr) abort + let name = bufname(a:bufnr) + return empty(name) ? '[No Name]' : name +endfunction + +function! s:statusline_modified(bufnr) abort + let mod = getbufvar(a:bufnr, '&modified') + let ma = getbufvar(a:bufnr, '&modifiable') + if mod + return '[+]' + elseif ma + return '' + else + return '[-]' + endif +endfunction + +function! s:statusline_linenum(winid) abort + return line('.', a:winid) . '/' . line('$', a:winid) +endfunction + +function! s:statusline_fenc_ff(bufnr) abort + let fenc = getbufvar(a:bufnr, '&fileencoding') + let ff = getbufvar(a:bufnr, '&fileformat') + let bom = getbufvar(a:bufnr, '&bomb') " BOMB!! + + if fenc ==# '' + let fencs = split(&fileencodings, ',') + let fenc = get(fencs, 0, &encoding) + elseif fenc ==# 'utf-8' + let fenc = bom ? 'U8[BOM]' : 'U8' + elseif fenc ==# 'utf-16' + let fenc = 'U16[BE]' + elseif fenc ==# 'utf-16le' + let fenc = 'U16[LE]' + elseif fenc ==# 'ucs-4' + let fenc = 'U32[BE]' + elseif fenc ==# 'ucs-4le' + let fenc = 'U32[LE]' + else + let fenc = toupper(fenc) + endif + + if ff ==# 'unix' + let ff = '' + elseif ff ==# 'dos' + let ff = ' (CRLF)' + elseif ff ==# 'mac' + let ff = ' (CR)' + else + let ff = ' (Unknown)' + endif + + return fenc . ff +endfunction + +function! s:statusline_filetype(bufnr) abort + let ft = getbufvar(a:bufnr, '&filetype') + return empty(ft) ? '[None]' : ft +endfunction + + + " Plugins configuration {{{1 @@ -1515,76 +1684,6 @@ xmap gJ <Plug>(jplus-input) -" lightline {{{2 - -let g:lightline = { - \ 'colorscheme': 'jellybeans', - \ 'active': { - \ 'left': [['mode', 'paste'], ['readonly', 'filename', 'modified']], - \ 'right': [['linenum'], ['fileencoding', 'fileformat', 'filetype']] - \ }, - \ 'inactive': { - \ 'left': [['readonly', 'filename', 'modified']], - \ 'right': [['linenum'], ['fileencoding', 'fileformat', 'filetype']] - \ }, - \ 'component_function': { - \ 'mode': 'Lightline_mode', - \ 'linenum': 'Lightline_linenum', - \ 'fileformat': 'Lightline_fileformat', - \ }, - \ 'mode_map': { - \ 'n': 'N', - \ 'i': 'I', - \ 'R': 'R', - \ 'v': 'V', - \ 'V': 'V-L', - \ "\<C-v>": 'V-B', - \ 'c': 'C', - \ 's': 'S', - \ 'S': 'S-L', - \ "\<C-s>": 'S-B', - \ 't': 'T', - \ }, - \ 'tabline': { - \ 'left': [['tabs']], - \ 'right': [], - \ }, - \ 'tab': { - \ 'active': ['tabnum', 'filename', 'modified'], - \ 'inactive': ['tabnum', 'filename', 'modified'], - \ }, - \ } - -function! Lightline_mode() - " Calling `eskk#statusline()` makes Vim autoload eskk. If you call it - " without checking `g:loaded_autoload_eskk`, eskk is loaded on an early - " stage of the initialization (probably the first rendering of status line), - " which slows down Vim startup. Loading eskk can be delayed by checking both - " of `g:loaded_eskk` and `g:loaded_autoload_eskk`. - if exists('g:loaded_eskk') && exists('g:loaded_autoload_eskk') - let skk = eskk#statusline(' (%s)', '') - else - let skk = '' - endif - return lightline#mode() . skk -endfunction - -function! Lightline_linenum() - return line('.') . '/' . line('$') -endfunction - -function! Lightline_fileformat() - if &fileformat ==# 'unix' - return 'LF' - elseif &fileformat ==# 'dos' - return 'CRLF' - elseif &fileformat ==# 'mac' - return 'CR' - else - return '-' - endif -endfunction - " vim-lsp {{{2 |
