Упрощаем работу с русскими текстами в Sublime Text 3 + Vintage

в 7:41, , рубрики: cyrillic, sublime text 3, vim, vintage, кириллица

Если вы недавно начали: 1) пользоваться Sublime Text и/или 2) пользоваться плагином Vintage и/или 3) редактировать много текста на русском (или наоборот английском) языке с использованием ST3+Vintage, то скорее всего уже почувствовали какая боль связана с командами назначенными на символы пунктуации — "$", ";", ".", ",", """ и т.п. В небольшой заметке под катом я хочу предложить вам пару костылей, которые помогают эту боль в значительной степени облегчить.

Возможно вы не знали, что значительной частью плагина Vintage является пачка биндингов стандартных Vim-овых команд на их реализацию в плагине, например:

  { "keys": [";"], "command": "set_repeat_move_to_character_motion",
    "context": [{"key": "setting.command_mode"}]
  },

Так вот у обозначенной выше проблемы, корни лежат в том, что данный биндинг не знает, была ли нажата клавиша 4/$/; (и надо выполнить "в конец строки") или ;/ж/: (и надо выполнить "повторить поиск символа"). То есть фактически биндинг не знает текущую раскладку. Если бы плагину можно было подсказать текущую раскладку, то всё бы замечательно.

И оказывается, что сделать эту подсказку возможно — для этого у биндингов есть "context", который может смотреть в сеттинги:

{"key": "setting.is_rus"}

С помощью этого трюка мы можем поменять поведение символа ";" на "в конец строки" только в том случае, если настройка "is_rus" выставлена в true:

  { "keys": [";"], "command": "set_motion", "args": {
    "motion": "vi_move_to_hard_eol",
    "motion_args": {"repeat": 1, "extend": true},
    "inclusive": true,
    "clip_to_line": true },
    "context": [{"key": "setting.command_mode"},{"key": "setting.is_rus"}]
  }

К сожалению это решение не идеально — если вы редактируете файл где примерно равное количество текста на русском и английском языках, то один из языков в любом случае будет страдать. Более того, если вы хотя бы раз в полчаса переключаетесь между файлами на разных языках, то каждый раз лазить в настройки тоже не очень удобно.

Конечно, мне бы хотелось показать вам ещё пару строк, которые бы автоматически смотрели на системную раскладку и проставляли бы значение "is_rus". Но сейчас я не знаю как это сделать — возможно позже я с этим разберусь и обязательно поделюсь результатами.

Но всё-таки у меня есть для вас второй костыль, который позволяет и эту боль в значительной степени облегчить. Он базируется на команде "toggle_setting", которая позволяет переключить заданный булевый сеттинг, и которую мы повесим на F8:

 { "keys": ["f8"], "command": "toggle_setting", "args": {"setting": "is_rus"} }

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

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

  { "keys": [""", "<character>"], "command": "vi_replay_macro",
    "context": [{"key": "setting.command_mode"},{"key": "setting.is_rus"}]
  },
  { "keys": [";"], "command": "set_motion", "args": {
    "motion": "vi_move_to_hard_eol",
    "motion_args": {"repeat": 1, "extend": true},
    "inclusive": true,
    "clip_to_line": true },
    "context": [{"key": "setting.command_mode"},{"key": "setting.is_rus"}]
  },
  { "keys": ["."], "command": "show_panel", "args":
    {
      "panel": "incremental_find",
      "select_text": false,
      "reverse": false
    },
    "context": [{"key": "setting.command_mode"},{"key": "setting.is_rus"}]
  }

Если кто-то может предложить более удачный вариант решения этой проблемы — расскажите пожалуйста в комментах.

P.S. Готовый конфиг с биндингами русских символов

Автор: jdev

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js