Перенёс в hexo цвета из nord

Постепенно перехожу на использование темы nord в терминале, neovim и tmux.

По этой причине, внезапно, захотел использовать эту же тему в подсветке исходников здесь, в блоге.

Если кому-нибудь захочется скопипастить цвета себе в тему, можно посмотреть тут:

highlight-background = #3B4252
highlight-current-line = #434C5E
highlight-selection = #4C566A
highlight-foreground = #ECEFF4
highlight-comment = #8FBCBB
highlight-red = #BF616A
highlight-orange = #D08770
highlight-yellow = #EBCB8B
highlight-green = #A3BE8C
highlight-aqua = #88C0D0
highlight-blue = #5E81AC
highlight-purple = #B48EAD

Год в консоли

В этом году я серъёзно переполз с VSCode в терминал и узнал об этом всём невероятное (для меня раньше) количество информации.

tmux, который в связке с vim позволяет переключаться между сплитами редактора/сплитами tmux и спокойно работать там и там.

NeoVim, в который в этом году завезли конфигурирование на Lua, в котором я самостоятельно настроил себе подсветку активного сплита и стиль отрисовки в telescope.

fzf, который переворачивает представление о том, как должна выглядеть история команд и позволяет встраивать выбор с консоли везде, где необходимо.

fnm на замену nvm, стартующий за доли секунды (в отличие от нескольких секунд в nvm).

uvu для тестирования, pnpm вместо lerna и npm.

И это не говоря уже о TypeScript, знакомство с которым откладывал до последнего, а в результате просто упал в чужую кодобазу и, судорожно загребая, поплыл.

Репозиторий, в котором собираю свои частоиспользуемые скрипты, сохраняющий собственное состояние по одной команде, в который, после очередного аврала, стягиваю все остальные утилиты, чтобы следующий аврал был уже не таким болезненным. (Кстати сказать, приличная часть настроек vim и tmux никуда не делись, как раз благодаря сохранению на github).

В нем же лежит скрипт для бэкапа скачанной музыки и видео, чтобы не перевыкачивать из снова и снова.

Мой подход к консоли серьёзно изменился за прошедший год. Это не привело к повышению оплаты, но жить стало интереснее. Возможно, в будущем (ттт) затраченное время окупится.

Фокус для neovim

После переезда с версии 0.4.4 на 0.5+ никак не мог заставить себя сесть за документацию и настроить себе подсветку активного окна внутри neovim. Но всё в какой-то момент меняется и, почитав :h hi, найдя соответствующие группы Normal, LineNr и SignColumn (последний добавляется с плагином vim-signify), сделал себе несколько автокоманд, которые переключают цвет этих групп в ctermbg=235 для активного окна и в ctermbg=237 для неактивного. Решение всё ещё довольно косячное (в момент зажимания Ctrl окно моргает, просто потому, что нажатие Ctrl, внезапно, выдаёт событие FocusLost), но при смене активного окна всё выглядит замечательно, в т.ч. и при переходе из/в vim.

Реализация для тех, кому интересно.

Читать полностью

О пользе чтения. Опять

Настраивать vim можно постоянно. Настраивать понравившиеся расширения внутри vim — тоже. Иногда, чтобы настроить расширение так, как хочется, приходится поковыряться в документации, а иногда и в исходниках расширения.

Живой пример — настройка темы в telescope.nvim. В какой-то момент мне захотелось использовать тему ivy для всех операций, производимых через telescope. Гуглим вариант, читаем про функцию для каждой операции, делаем хелпер, всё работает!

Ура! Или не ура?

Не ура. В какой-то момент обнаруживается, что при использовании telescope-project.nvim наша настройка работает только на верхнем уровне и при поиске в выбранном проекте telescope кладёт на наши хотелки болт с правой нарезкой.

Что же делать? Кто виноват? Никто не виноват. Читаем документацию и находим ключик defaults в параметре, который передаётся в require('telescope').setup(). Присваиваем ему значение get_ivy() и наслаждаемся результатом.

Ну или если лениво ходить по ссылке, просто копируем:

require('telescope').setup {
-- ...
defaults = require('telescope.themes').get_ivy()
}

Пробелы в именах файлов

Хорошая штука lf (это такой консольный файловый менеджер, если что). Особенно хорош, если брать чужие настройки и спокойно ими пользоваться. Но иногда исследовательский гвоздь в попе пересиливает хомячковость и тогда начинаются исследования.

Одно из таких исследований привело меня к желанию написать свой скрипт для предпросмотра (но это, наверное, все пользователи lf пишут) и, что гораздо интереснее, к попытке распознания mime-типа файла с использованием команды file. И всё было хорошо, пока я не наткнулся на файлы, в именах которых присутствовали пробелы. Поотлаживав скрипт препросмотра я обнаружил следующее: в скрипт имя файла (даже с пробелами) поступает в виде одного параметра командной строки. Но при попытке использовать file --mime-type $FILENAME -b, если FILENAME содержит пробелы, получаем полную ерунду. И пляски с ${FILENAME// /\\\ } помогали не особенно (хотя это тоже был интересный опыт). В итоге тип файла получается как-то вот так: FILETYPE=$(eval "file --mime-type \"${FILETYPE// /\\\ }\" -b"). Косо, криво, но это работает. И теперь я могу показывать длину видео-файла и прочее, используя mediainfo.

Кстати, ещё один итог отладки: вторым параметром мой скрипт получал параметр высоты доступного окна. Именно его я и использовал, чтобы не печатать файл или информацию о нём целиком. Это экономит какое-то время.

Список использованной литературы

Немного о projectionist

Для переключения между модулем и тестом к нему в vim удобно использовать projectionist. Всё бы хорошо, но в случае, если модули лежат в файлах с именами, например, common/cli/foo.py, а тесты, соответственно, tests/common/cli/test_foo.py, не сразу сообразишь, как для этого случая лучше настроить соответствия.

Почитав документацию и найдя в ней разъяснения про *, его соответствие ** и *, и макросы dirname и basename, я пришёл примерно к вот такому рецепту:

{
"*.py": {
"alternate": "tests/{dirname}/test_{basename}.py"
},
"tests/**/test_*.py": {
"alternate": "{dirname}/{basename}.py"
}
}

«Все танцуют».

P.S. Можно сделать ещё проще:

{
"*.py": {
"alternate": "tests/{dirname}/test_{basename}.py"
},
"tests/**/test_*.py": {
"alternate": "{}.py"
}
}

Кое-что о пользе чтения долбаной документации

В моменты, когда винда перегружается в процессе обновлений очень хочется, чтобы она делала это без обязательного присутствия наблюдателя, т.е. использовала тот же пункт меню загрузки, что был использован при её загрузке.

И делается это очень просто:

# /etc/default/grub

GRUB_DEFAULT=saved # Обычно тут стоит 0, заменяем
GRUB_SAVEDEFAULT=true

После этого выполняем sudo update-grub и в следующий раз, когда винда захочет перегрузиться в процессе обновления, сидим спокойно.

Переустановка пакетов по-быстрому

Время от времени возникает ситуация, когда файлы package-lock.json из разных веток начинают друг с другом конфликтовать. В этом случае помогает волшебное:

$ rm packages/*/package-lock.json
$ lerna clean --yes
$ lerna exec "npm install"

Учитывая, что многие пакеты зависят от одного, в котором ставятся puppeteer и png-img, процесс установки норовит затянуться надолго. Чтобы немного сэкономить время предлагаю вот такой вариант последней строки:

$ PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 lerna exec "npm install --ignore-scripts"

Здесь длинная переменная окружения используется, чтобы не грузить хромиум каждый раз, а ключ --ignore-scripts не даёт запускать компиляцию png-img.

Но, конечно, после этого нужно будет зайти в пакет, в котором используются puppeteer и png-img (в моём случае это painter) и в нём поставить всё по-честному.

Раз, два, три, четыре, пять

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

Читать полностью

Блог есть, а сборщика — нет

Немного начал разбираться с github actions и тут же применил их в деле: вынес сборку и деплой блога на github. Вот и настало время, когда можно писать сколько хочешь и не думать о том, как всё будет собираться.

И, внезапно оказывается, что писать, как раз таки не о чем.