From 2d06525ce8bc48be93376479ca8a0a639c6789eb Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Thu, 11 Jun 2020 10:55:24 +0300 Subject: [PATCH] =?utf8?q?=D0=9C=D0=BE=D0=B9=20zsh=20prompt=20=D0=B8=20Vim?= =?utf8?q?=20statusline?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Спросили меня тут как-то, увидев 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-ы в конце показываются ярким зелёным цветом, чтобы бить в глаза ими. Табы отображаются ">→→→→→→→" символами -- я могу визуально сосчитать кол-во табов, если захочу. -- 2.48.1