From 231afdef7064d9a180de16f4ad8b285f85bb6e79 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Tue, 29 Jun 2021 12:13:15 +0300 Subject: [PATCH] =?utf8?q?=D0=9A=D1=83=D1=87=D0=B0=20=D0=BE=D0=BF=D1=82?= =?utf8?q?=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9=20Vim=20=D1=81?= =?utf8?q?=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. -- 2.48.1