localcfg/notgui_running.vim

Enforce vim script implementation to reduce ambiguities and improve robustness:

scriptversion 4

Use the system’s terminal capabilities database, as I’m in the unusual situation where vim’s are inferior on many of the systems I regularly use:

set nottybuiltin

Annoying, but necessary, to refresh termcap:

set term=$TERM

We’ll forcibly set 'guifont' here to make it easier to configure options based on the used font:

silent let &guifont = system('fc-match -f "%{family}" monospace')

Note

This obviously doesn’t work if you configure custom fonts for your terminal, but I configure a global monospace font and use that everywhere. If the font isn’t correct in one application, it is usable for other applications. The uniformity is the only thing that matter to me.

Todo

Some terminals support querying the current font using escape sequences, we should look in to which terms can reliably do this. For example, xterm requires additional configuration to support the escape.

Where possible, enable 24-bit colour:

if has('termguicolors')
    if &t_Co > 256 || &term =~# '^\(kitty\|rxvt-unicode.*\|st\)$'
        set termguicolors
    endif
endif

Poke around, as best we can, to discern the background colour:

const s:feature_terms =
\   '^\(kitty\|linux\|\(rxvt-unicode\|st\|xterm\)\(-256color\)\?\)$'
if &term =~# s:feature_terms || split($COLORFGBG .. ';padding', ';')[0] == 15
    if &background !=# 'dark'
        set background=dark
    endif
else
    if &background !=# 'light'
        set background=light
    endif
endif

Note

We purposely check that we’re changing the background setting, as it can cause an ugly redraw or reissue :autocmds.

… and change the cursor colour depending on mode on supported terminals:

if &term =~# s:feature_terms && exists('&t_SI')
    let &t_EI = "\<Esc>]12;green\x7"
    let &t_SI = "\<Esc>]12;purple\x7"
    let &t_SR = "\<Esc>]12;red\x7"

Todo

This is brittle, but I don’t know a foolproof way to handle it. Thoughts?

… and match cursor types to gvim:

    let &t_EI ..= "\<Esc>[2 q"
    let &t_SI ..= "\<Esc>[6 q"
    let &t_SR ..= "\<Esc>[4 q"
endif

Omnicompletion rocks, but <C-x><C-o> doesn’t:

if has('insert_expand')
    inoremap <Nul> <C-x><C-o>
endif

kitty and vim interact poorly with background repainting, the following works around it:

if $TERM ==# 'xterm-kitty'
    let &t_ut=''
endif

kitty has some really cool features, called kittens, that can do all kinds of magic; icat, for example, can display images inline. However, vim works in the alternate screen where the images will not be displayed. The following snippet disables the alternate screen, which is a poor solution to workaround this:

if $TERM ==# 'xterm-kitty'
    set t_ti= t_te=
endif

kitty and VTE-based terminals can display undercurls for spelling error highlighting that more closely matches my setup in gvim:

if $TERM ==# 'xterm-kitty' || exists('$VTE_VERSION')
    let &t_Cs = "\e[4:3m"
    let &t_Ce = "\e[4:0m"
    highlight clear SpellBad
    highlight SpellBad ctermfg=1 term=undercurl cterm=undercurl
    augroup jnrowe_kitty
        autocmd!
        autocmd ColorScheme * highlight clear SpellBad |
        \   highlight SpellBad ctermfg=1 term=undercurl cterm=undercurl
    augroup END
endif