[О блоге] [наверх] [пред] [2020-06-11 10:55:24+03:00] [2d06525ce8bc48be93376479ca8a0a639c6789eb]
Темы: [tip][vim][zsh]

Мой zsh prompt и Vim statusline

Спросили меня тут как-то, увидев screenshot, что означают всякие циферки
у меня в zsh и vim.

zsh prompt у меня однострочный (всегда ужасался колоссальной потере
места на экране на многострочных), классический:

    work/blog|0|1-% f bar G foo W

Цветов нет, кроме жирной "1" и "%":

* "%" фиолетового цвета: его хорошо видно на экране когда надо глазами
  найти где же начало вывода какой-нибудь программы.
* "-" перед ним отображает текущий vi-режим. Если я нажму Esc и перейду
  в командный, то он поменяется на "+"
* "1" перед ним яркого белого цвета (bold) и это код возврата только что
  выполнившейся команды. Нередко бывает надо его узнать -- можно конечно
  набрать echo $?, но иногда я уже успею набрать какую-нибудь другую
  команду и эта информация уже будет потеряна, а тут на экране
  сохранится
* "0" показывает время исполнения последней команды. Очень часто хочется
  узнать сколько же она выполнялась, но забываешь добавлять time, к тому
  же у которого довольно громоздкий вывод. Очень полезная штука!
* work/blog это два последних элемента пути. "~" если я нахожусь в
  домашней директории, "~/work" если в $HOME/work, "~pyg" если в
  именованной директории "pyg" (PyGOST директория проекта в данном
  случае). Показывать полный путь -- самоубийство, ибо он может быть
  громадным, не оставляя места для команды

Когда-то я там писал и название git ветки в prompt, но отказался --
во-первых, как правило, я знаю где я, во-вторых, оно тормозит. Только
зайдя в какой-нибудь проект, с непрогретым ARC-ом этой git-директории,
тормоз будет даже на SSD, что меня дико бесит. Нажав F2/F3 я сделаю git
status (--short). Набрав Gb я увижу ветки, если уж запамятовал.
Аналогично и в Vim я не отображаю этой информации, ибо тормозит!

Я пробовал разграничивать колонки prompt-а по цветам, например чтобы
убрать "|" разделитель, но там их и так всего две штуки и слишком
горизонтально сгруппированная информация тоже не шибко приятна.

Я не понимаю когда добавляют в строку приглашения всякие вещи типа
времени или уровня WiFi сигнала -- ведь это же всё стоит вывести в
вне терминала в какой-нибудь statusbar desktop environment-а (или
dwmstatus в моём случае). Как минимум, это не будет запрашивать кучу
информации у ОС при каждом отображении приглашения. Да и, действительно
каждый раз вам нужно знать время после каждого ls? Нерациональная трата
места.

По директориям я перемещаюсь не просто через cd, а с обязательной (это
первая главная причина почему я не могу использовать bash) autopushd
фичей, когда формируется стэк директорий и любой cd превращается в
pushd. Нажав F4 я сделаю popd, быстро вернувшись по стэку назад, что
крайне частая операция.

"f bar G foo W" это аналог: find . -name "*bar*" | grep --color foo | wc -l

В zsh у меня синтаксическая подсветка команд, кавычек, всяких аргументов
команд и спецсимволов типа "|", "<>", и т.д.. ОЧЕНЬ помогает и удобно --
а главное что не тормозит. Плюс включён autosuggestions плагин, который
бледным синим цветом выводит элемент истории найденный по уже набранным
символам -- это очень полезно тем, что я буквально вижу что будет если я
нажму Up+Enter. Ctrl-R у меня включает поиск по истории с regexp-ом, ибо
я не всегда точно помню с чего начинается команда, но помню её примерные
опорные слова.

          ------------------------ >8 ------------------------

В Vim мой текущий statusline вот такой (только одно "LN" поле у меня
заполняется внешними средствами, а всё остальное -- встроено в Vim):

    ~/work/blog/.git/COMMIT_EDITMSG [+] ^^^^^^^^ 1 [GITCOMMIT][utf-8 unix][31/37][43-31:0x03A][2324][LN][73%]

На самом деле тут (кроме "[+]") нет ни одного "[", "]" -- я так пометил
области выделенные разными яркими цветами. Во-первых, это хорошо заметно
и быстрее позволяет навигации глазами. Во-вторых, экономит ощутимо места
на экране, ведь тут много полей. Место становится важно когда открыто
несколько split-ов всяких.

* ~/work/blog/.git/COMMIT_EDITMSG -- путь до файла, тут всё очевидно
* [+] -- флаг что файл изменён. После него могут идти и всякие другие
  флаги типа [RO]
* ^^^^^^^^ -- заполняет всё пустое пространство и показывает текущее
  окно, если их больше одного. Это сильно помогает быстро глазами
  отыскать где я
* 1 -- номер текущего буфера, который можно ввести при нажатии Tab для
  прыжка в него. Вообще не часто я его запоминаю и смотрю в его сторону,
  но бывает, место мало занимает
* GITCOMMIT -- текущий filetype, обязательная к показу информация
* "utf-8 unix" -- текущая кодировка и режим окончания строк. Тоже
  обязательные к показанию информации, ибо Vim при открытии
  самостоятельно делает конвертирования и ты не увидишь что это файл с
  DOS-овскими окончаниями строк или что Vim некорректно подумал что это
  не UTF-8 файл
* 31/37 -- номер текущей строки и всего их сколько. Без этого никуда
* 43-31 -- первое число показывает номер байта в строке, offset в
  пределах строки на котором сейчас мой курсор. Второе число показывает
  номер символа в строке. Если числа совпадают, то показывается только
  одно. Разнится эти числа будут на многобайтных символах (кириллица).
  Полезны оба числа зачастую для разных случаев
* 0x03A -- Unicode codepoint символа под курсором. С ходу мне
  вспоминается что это чаще всего используется для понимания что у меня
  под курсором: какой-то Unicode или ASCII, которые могут выглядеть
  абсолютно одинаково
* 2324 -- абсолютная байтовая позиция курсора внутри файла. Полезно при
  разбирательствах с немного не текстовыми файлами. Было очень полезно
  "отлаживать" комментарии моего блога, которые в netstring формате, в
  которых постоянно из-за преобразований git-а что-то съезжало на 1-2
  байта
* LN -- это поле штатно не видно вообще (пустое пространство), но если в
  фоне у меня запущен linter или какая-нибудь gogetdoc команда, то там
  красным ярким цветом показывается двухбуквенное уведомление что что-то
  работает в фоне
* 73% -- позиция внутри файла, "Ende" если в конце, "Anfang" если в
  начале. Всегда очень полезно быстро понимать сколько я уже просмотрел
  какого файла

Вообще особо ничего хитрого: почти всё что умеет Vim тут просто
выводится. И действительно многое очень полезно на практике.

Кроме того, у меня подчёркивается вся строка на которой я сейчас
нахожусь, вертикальной красной линией подсвечивается текущая колонка где
курсор -- эдакое перекрестие, которое очень помогает быстро отыскивать
местоположение курсора, который может быть плохо виден на всяких
разукрашенных синтаксической подсветкой файлах.

Слева отображаются относительные номера строк -- überfeature, без
которой жизни нет вообще. Граница 80-го символа тоже подсвечивается
вертикальной красной четой. По умолчанию у меня включён folding по
отступу и слева от номеров строк отображается уровень fold-а. Частенько
бывает смотрю туда чтобы понять на какой глубине находится тот или иной
участок кода, особенно когда полностью вся функция/класс/метод не
влезают на экран. А ещё левее могут отображаться sign-ы, которые
linter-ами показывают строки в которых что-то не ладно.

Whitespace-ы в конце показываются ярким зелёным цветом, чтобы бить в
глаза ими. Табы отображаются ">→→→→→→→" символами -- я могу визуально
сосчитать кол-во табов, если захочу.

    [оставить комментарий]