Как заставить режим Vim Sublime Text и AutoHotKey работать без конфликтов?

482
Da Rossa

Sublime Text - безусловно, лучший текстовый редактор, который я когда-либо видел, а AutoHotKey - программа сценариев, без которой я не могу жить, особенно функция горячих строк, которая позволяет мне создавать пары аббревиатур и расширений, значительно ускоряя набор текста. Эти два человеческих изобретения невообразимо повышают мою повседневную производительность. Недавно я изучил, как использовать Vim, и мне становится удобно включить «Винтажный режим» в Sublime Text.

Тем не менее, существует серьезная проблема: команды Vim могут создавать помехи для горячих строк AutoHotKey. Допустим, у меня есть эта горячая строка:

::xeno::xenófobo

... что означает, что если он наберет "xeno", то расширится до "xenófobo". Однако в Vim «xeno» будет последовательно удалять текущую строку, затем переходить к концу слова, затем искать следующий вхождение входной строки и открывать новую строку. Это нежелательно.

Еще хуже, когда сама часть расширения содержит значимую последовательность Vim:

::eve::Eddie Vedder

... который будет переходить к концу слова, удалять текущую строку, переключаться в режим вставки, вставлять "e Vedder". Абсолютно катастрофический.

Но AutoHotKey является мощным, и мы можем настроить его на игнорирование некоторых окон. Пример: если в активном окне есть строка, как " - Sublime Text"в его заголовке, мы можем игнорировать ввод горячих строк . Что касается Sublime Text с включенным режимом Vim, он отобразит «КОМАНДНЫЙ РЕЖИМ» или «ВСТАВИТЬ РЕЖИМ» в строке состояния, а не в строке заголовка ! Поэтому AutoHotKey не может определить, находится ли Vim Sublime Text в режиме COMMAND или INSERT.

Можно ли написать очень простой плагин / пакет для Sublime Text, чтобы он отображал слова «Режим КОМАНДЫ» или «Режим ВСТАВКИ» в строке заголовка, когда Vim включен? Это может заставить AutoHotKey узнать о текущем режиме и повороте строк хоста.

1

1 ответ на вопрос

1
JJohnston2

Я не знаю, как реализовать это в Sublime, но несколько мыслей / наблюдений

  1. Строка состояния не является отдельным элементом управления, она представляется частью общего PX_WINDOW_CLASSдля всего окна, так что это не очень удобно для непосредственного чтения текстового значения (прямо из AutoHotkey).
  2. Вы можете использовать опрос в AutoHotkey в сочетании с OCR для чтения строки состояния (используя GDIP или что-то подобное). Это, вероятно, будет работать с некоторым минимальным объемом обработки, но всегда потребует задержки между временем, когда он меняет режим, и временем, когда обнаруживается изменение режима. Не совсем идеально. Заставить OCR работать может быть немного сложно (но выполнимо).
  3. Вы можете написать свой собственный возвышенный пакет, чтобы прочитать текст строки состояния и обработать, что делать, основываясь на таком опросе. Например, смотрите здесь: https://forum.sublimetext.com/t/copy-text-from-the-status-bar/20714/8
  4. Возможно, стоит рассмотреть другие типы взаимодействия (помимо использования AutoHotkey #IfWinActiveи установки заголовка окна. Другими словами, установка заголовка окна может быть сложной, но может быть не так сложно запустить отдельный скрипт exe или ahk непосредственно из возвышенного. Скажем, вы смогли опрашивать правильный ключ поиска для текста состояния, чтобы определить, является ли он INSERT или COMMAND, а затем выполнить команду оболочки (exe или ahk script) - это может передать ваш сценарий горячей строки, чтобы включить / отключить различные комбинации клавиш. Существует возвышенный пакет, который делает что-то вроде этого, чтобы установить прозрачность окна (запускает внешнюю утилиту для изменения окна), так что, возможно, это то, что вы могли бы рассмотреть.
  5. Эта ссылка показывает, как вы можете обнаружить изменения режима. Возможно, вы могли бы использовать это в сочетании с последним предметом. https://stackoverflow.com/questions/20514563/change-appearance-in-sublime-text-3-when-switching-mode-in-vintage#39805889
  6. Вы не упоминаете в своем посте, как происходит переход между режимом вставки и командным режимом - я установил Sublime и посмотрел повсюду и сам не могу понять, но одна возможность рассмотреть, является ли это ключом или нет сочетание. Если это так, вы можете обнаружить нажатия клавиш, используемые для переключения между режимами, и отследить, какой режим используется отдельно в AutoHotkey. Этот тип настройки может быть менее желателен, так как это предполагаемое состояние, которое отслеживается (и его также нужно инициализировать один раз для правильной работы). Однако в качестве начальной реализации может быть довольно легко получить что-то, что работает большую часть времени, пока вы не получите что-то более надежное в Sublime.
Спасибо за ваш вклад JJohnston2! Я собирался опубликовать комментарий к вашему ответу здесь, но длина слишком ограничена, поэтому я написал здесь: [Комментарий Pastebin] (http://pastebin.ca/3771985) Da Rossa 7 лет назад 0