[О блоге] [наверх] [пред] [2021-06-29 12:13:15+03:00] [231afdef7064d9a180de16f4ad8b285f85bb6e79]
Темы: [tip][vim]

Куча оптимизаций Vim скриптов

https://www.arp242.net/effective-vimscript.html
Напоролся тут вот на такую статью и... понапеределывал свою .vim
директорию на diff в 500+ строк. Я всё же ужасно знаю и пишу на vimscript.

* К function можно добавить abort, чтобы при ошибках во время исполнения
  она останавливалась. Как set -e в shell. Как я без этого страдал!
* Не везде у меня присутствовали ограничители scope, чтобы не
  загромождался глобальный namespace
* set на setlocal в ftplugins я когда-то заменял. Но совершенно не
  обращал внимание на *map команды, которые тоже можно ограничить только
  буфером. Как и аббревиатуры
* У разных функций можно передавать код не в виде строчки (где помнить
  об экранировании и не иметь синтаксической подсветки), а в виде ссылки
  на функцию. Что может быть и лямбдой, что очень удобно
* Так как я могу запросто одновременно редактировать и Python и Go
  файлы, то всякие глобальные настройки помешают всему функционалу в них
  работать. Например мой Defsplit имел глобальную настройку
  используемого отступа. Переделал на то, чтобы это была переменная буфера
* Аналогично проделал с функцией печатающей значение LintStatus в
  statusline. Прежде я переопределял функцию в ftplugin скриптах. Теперь
  я ftplugin выставляю буффер-локальную переменную с ссылкой на функцию
  печати статуса lint -- теперь каждый буфер для разных типов файлов
  будет иметь свои работающие статусы

И главное изменение: я начал использовать autoload директорию. Не
понимаю почему я раньше просто игнорировал эту удобнейшую штуку! И
namespace удобный она создаёт и, самое главное, загружает всего лишь
один раз при первом использовании. Однократная ленивая загрузка. Плюс
исчезают проблемы когда нет возможности передать s:-scoped переменные во
многих местах. Плюс сам факт наличия autoload-функции использую для
проверки был ли скрипт загружен или нет (если нет, то делаю всякие *map
и command например). Удобнейший функционал!

Плюс я думал что тема с bracketed paste закрыта навсегда. Но
документация Vim, как будто, живёт своей жизнью и постоянно изменяется и
начинает содержать доселе неизведанные и неизвестные факты :help
xterm-bracketed-paste. Vim 8.2 из коробки понимает что это такое и
смотрит на настройки терминала для определения возможностей. У меня не
определяет (лень выяснять по какой причине, наверное описание screen
терминала не содержит ничего про xterm-специфичные вещи), но help
подсказывает тривиальное решение:

    let &t_BE = "\e[?2004h"
    let &t_BD = "\e[?2004l"
    exec "set t_PS=\e[200~"
    exec "set t_PE=\e[201~"

После которого вообще никаких скриптов и map-ов не нужно для работающего
bracketed paste.

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