Terminal st, VIM i kolory

Posted on Sat 22 August 2020 in Shitz • 2 min read

Sam sobie zgotowałem ten los! Zacząłem używać skórki Cosmic Latte, i w shellu i w VIM-ie, i dobrze mi z tym jest, z jednym zastrzeżeniem: w trybie Insert w VIM-ie bardzo słabo widać gdzie znajduje się kursor.

Naprawiłem to wprowadzając podświetlenie kolumny, dopisałem do .vimrc to:

set cursorcolumn (demo można sobie zrobić wpisując :set cul)

Było mi mało, więc podświetliłem też wiersz:

set hl=.:Visual

Kropka oznacza aktywny wiersz, a po dwukropku znajduje się nazwa szablonu kolorów. Można się tym fajnie bawić, np. przekreślenie aktywnego wiersza to:

set hl=.t

Wciąż było mi mało, chciałem mieć kursor w innym niż domyślny kolorze ale żadne ustawienia nie działały. Taki efekt można uzyskać np. w 256-kolorowym xtermie, wykorzystując do tego kody ANSI ale ja używam 24-bitowego emulatora st, który domyślnie nie obsługuje tej funkcji.

Na szczęście znalazłem patch: https://st.suckless.org/patches/osc_101112/ po zaaplikowaniu którego można już robić to samo co w xtermie.

Zabarwienie kursora na czerwono sprowadza się do paru linijek w .vimrc:

if &term =~ "xterm\\|rxvt\\|st"
  " use an orange cursor in insert mode
  let &t_SI = "\<Esc>]12;orange\x7"
  " use a red cursor otherwise
  let &t_EI = "\<Esc>]12;red\x7"
  silent !echo -ne "\033]12;red\007"
  " reset cursor when vim exits
  autocmd VimLeave * silent !printf "\033c"
  " use \003]12;gray\007 for gnome-terminal
endif

Ważna linia to ta, zawierająca "VimLeave", uruchamia ona sekwecję przywracającą domyślne ustawieia. Gdyby jej zabrakło, po wyjściu z VIM-a kursor pozostałby czerwony.

p.s. Wstrzymanie VIM-a (Ctrl+Z) pozostawia czerwony kursor, bawiłem się autokomendami związanymi z buforami ale skończyło się tragicznie.

p.p.s. Przy okazji dowiedziałem się, że istnieje autokomenda:

UserGettingBored                When the user presses the same key 42 times.
                                Just kidding! :-)