Давно работаю со сниппетами: с помощью них создаю скелеты модулей, функций и конструкций (for, if, given). Становится реально запилить даже средние проекты в одиночку. Сниппеты – незаменимая вещь при поиске ошибки в программе методом дихотомии: приходится вставлять вывод информации десятки раз, меняя в ней только текущие переменные.

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

Было бы неплохо иметь программу, которая могла бы вставлять сниппеты во все приложения.

  • Когда я захожу на удалённый сервер по ssh, то странно ожидать сниппеты в mcedit-е (Рис.1.1).

Рис.1.1 mcedit-ор
Рис.1.1 mcedit-ор
  • На удалённом сервере обязательно нужно зайти в докер – а там обычно тебя ожидает ed или vi (Рис.1.2) в котором сниппеты не запишешь – они пропадут при перезапуске контейнера.

Рис.1.2 Редактор vi
Рис.1.2 Редактор vi
  • Я пользуюсь несколькими редакторами одновременно: vscodium, kate, notepad++ (под wine, конечно-же), kwrite, pycharm, Intellij Idea (в которых актуальны сниппеты для html, css/sass и js), atom и subl.

  • sql-сниппеты понадобятся в heidisql, Database Intelliji Idea, в консольных mysql и pgsql.

  • Для проверки кода (если есть сомнения как он работает) я запускаю в консоли однострочники в которых сниппеты очень даже пригодились бы.

  • Если нужно привести пример кода при переписке, то сниппеты будут незаменимы в мессенджерах и почтовых клиентах.

  • Ну и наконец, я часто пишу статьи на Хабре и, в некоторых случаях, было бы идеально вставлять сниппеты в фрагменты кода прямо в статье не переключаясь для этого в редактор.

Тем временем вышел En-Ru Switcher 7, который всё это поддерживает (Рис.2.1).

En-Ru Switcher

Рис.2.1 Конфигуратор erswitcher-а открыт на сниппетах perl
Рис.2.1 Конфигуратор erswitcher-а открыт на сниппетах perl

Конфигуратор erswitcher-а [1] открывается по щелчку на красном квадрате у часов. Он разделён на список секций конфига и редактор. По списку легко переместиться к нужной секции или разделу (разделы начинаются на ##, в то время как # – обычный комментарий).

До знака = идёт мнемоника в секции [compose], которая будет заменяться на текст справа при нажатии на клавишу menu (центральная клавиша на дополнительной цифровой клавиатуре), или комбинация клавиш в других секциях.

Для обозначения символа табуляции используется \t, а для перевода строки \n. \^ используется для указания позиции в которую поместить курсор после вставки текста (имеется ввиду текстовый курсор, конечно же).

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

Чтобы использовать один и тот же конфиг на разных компьютерах, просто выделите его весь и скопируйте (Ctrl+a, Ctrl+c), после чего его можно сохранить на docs.google.com, например.

Что такое сниппет?

Сниппет это такой "скелет" часто повторяемого кода [4]. После вставки текста сниппета в нём заполняют "пробелы", как это показано на видео [2].

У слова «сниппет» есть и другие значения. Так SEO-оптимизаторы называют сниппетом «небольшой фрагмент текста, который мы видим на странице выдачи поисковика (гугл, яндекс, яху, рамблер, дак-дак-гоу) вместе со ссылкой на сайт» [5].

Как erswitcher вставляет текст?

Ввод тела сниппета осуществляется по ICCCM: erswitcher отслеживает нажатия клавиш и запоминает последние введённые программистом символы. При нажатии клавиши menu он распознаёт введённую только что мнемонику, например, "if" и эмулирует двойное нажатие backspace, чтобы их удалить. Затем объявляет себя буфером обмена и нажимает Ctrl+v. Программа, в которой был написан "if", запрашивает у сервера обмена текст и получает тело сниппета "if() {\n\t\n}", который и вставляет в позицию курсора. erswitcher тем временем ожидает пока вставка закончится 10 микросекунд и нажимает на клавишу "стрелка влево" столько раз, сколько символов между \^ и концом текста сниппета, чтобы добраться до указанной в сниппете позиции курсора ("if=if(\^) {\n\t\n}").

Ограничения erswitcher

Как следует из описания процесса вставки сниппета erswitcher обладает следующими ограничениями:

  1. Для работы erswitcher нужны иксы. Под wayland-ом и в голой консоли он работать не будет.

  2. В приложениях, куда планируется вставлять сниппеты, должна быть настроена комбинация Ctrl+v, если нет – нужно будет настроить.

  3. В окне виртуальной машины (virtualbox или vmware) erswitcher с хостовой машины работать не сможет по двум причинам: там не работает буфер обмена хостовой машины и переключение раскладки клавиатуры. Поэтому рекомендуется заходить на виртуальные машины по ssh.

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

Как известно, иксы позволяют эмулировать ввод с клавиатуры только тех клавиш, которые есть в текущей раскладке клавиатуры.

Конечно можно было бы держать раскладки клавиатуры на все случаи жизни и инсталлировать новую раскладку для ввода очередного символа. Если инсталляция раскладки клавиатуры занимает немного времени, то отказаться от буфера обмена вполне реально. Однако опять же, менять в виртуальных машинах раскладки клавиатуры не получится. Проще поставить erswitcher и в виртуальную машину.

Есть ли альтернатива?

erswitcher сделан для unix-а. PuntoSwitcher вроде как кто-то когда-то сумел запустить под wine, но без бубна можно получить только ошибку отсутствия локализации. Кроме того вставки текста у PuntoSwitcher сделаны в виде списка, куда нельзя вставить перевод строки или табуляцию. Так же нельзя позиционировать курсор.

Развитие идеи

На самом деле хотелось бы указывать несколько "пробелов" в сниппете erswitcher-а, куда позиционировать курсор после заполнения первого (например при нажатии некоей комбинации клавиш). Так же текст сниппета в редакторе конфигуратора записывается в одну строку и, хотя можно использовать \n для символа перевода строки, то было бы неплохо добавить многострочные определения сниппетов.

Всё это будет реализовано в будущих версиях erswitcher-а.

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

  1. Ярослав О. Косьмина «Конфиг EN-RU Switcher»

  2. Ярослав О. Косьмина «Сниппеты из erswitcher»

  3. «Программы, поддерживающие сниппеты» под ред. Vbif-routine

  4. Yaoguai «Сниппеты. Как сделать процесс работы с документацией проще»

  5. MPalma «25 способов скомпоновать исчерпывающий сниппет», 2014

  6. alspirichev «На пути к ‹10x инженеру›: шорткаты, сниппеты, шаблоны», 2020

  7. Kapodastr «Sublime Text 2: Как создать сниппет?», 2012

Комментарии (5)


  1. leha_gorbunov
    15.12.2023 12:14

    Copy/Paste не будет работать в терминальных окнах и внутри виртуальных машин. Не везде есть общий буфер обмена. Надо было использовать эмулятор ввода. Что-то вроде xdotool для linux.


    1. darviarush Автор
      15.12.2023 12:14

      1. Для работы erswitcher нужны иксы. В открытом в них терминале обычно уже настроена комбинация Ctrl+v, если нет - нужно будет настроить

      2. В статье предлагается заходить на виртуальные машины по ssh

      3. В разделе статьи "Как erswitcher вставляет текст" указывается, что он эмулирует нажатие клавишь. Но символы юникода через клавиатуру не вставишь и поэтому пришлось использовать буфер обмена


  1. ritorichesky_echpochmak
    15.12.2023 12:14

    Прочитал про ed и vi (и соответственно весь остальной базовый софт) в докере, взгрустнул.

    heidisql - а зачем? У вас IntellijIDEA к ней как и к половину от JB должен быть DataGrip после которого любой другой клиент к БД вызывает уныние и непреодолимую тоску. И в нём можно прям норм с файлами работать для того чтобы пресеты на разных серверах гонять


    1. darviarush Автор
      15.12.2023 12:14

      Тормознутость и прожорливость к памяти IntellijIDEA - вот что должно вызывать тоску )

      Для меня heidisql более удобен (по комбинациям клавиш, например), чем DataGrip, ведь это и отдельное приложение и интерфейс у него приятнее. Опять же, функциональность вся нужная мне, у heidisql в наличии )

      С файлами heidisql тоже справляется - не жалуюсь )


    1. darviarush Автор
      15.12.2023 12:14

      Ну а докер не я настраиваю, иначе ставлю туда mc сразу )