Wie funktioniert der Vim-Modus von Sublime Text und AutoHotKey ohne Konflikte?

596
Da Rossa

Sublime Text ist bei weitem der beste Texteditor, den ich je gesehen habe, und AutoHotKey ist das Scripting-Programm, ohne das ich nicht leben kann, insbesondere die Hotstrings-Funktion, mit der ich Abkürzungs-Erweiterungs-Paare erstellen kann, die das Tippen erheblich beschleunigen. Diese beiden menschlichen Erfindungen steigern meine tägliche Produktivität auf unvorstellbare Weise. Ich habe vor kurzem gelernt, wie man Vim verwendet, und ich werde es bequemer, den "Vintage-Modus" in Sublime Text zu aktivieren.

Es gibt jedoch ein großes Problem: Die Vim-Befehle können die HotStrings von AutoHotKey stören. Nehmen wir an, ich habe diesen Hotstring:

::xeno::xenófobo

... was bedeutet, wenn Sie "xeno" eingeben, wird es zu "xenófobo" erweitert. In Vim löscht "xeno" jedoch nacheinander die aktuelle Zeile, springt dann zum Ende des Wortes, sucht dann nach dem nächsten Vorkommen der Eingabezeichenfolge und öffnet dann eine neue Zeile. Dies ist unerwünscht.

Noch schlimmer ist es, wenn der Expansionsteil selbst eine sinnvolle Vim-Sequenz enthält:

::eve::Eddie Vedder

... die zum Wortende springen, aktuelle Zeile löschen, in den Einfügemodus wechseln, "e Vedder" einfügen. Absolut katastrophal.

AutoHotKey ist jedoch leistungsstark und wir können festlegen, dass einige Fenster ignoriert werden. Beispiel: Wenn das aktive Fenster eine Zeichenfolge wie " - Sublime Text"im Titel hat, können Sie die Eingabe der Hotstrings ignorieren. Beim Sublime Text mit aktiviertem Vim-Modus wird "COMMAND MODE" oder "INSERT MODE" in der Statusleiste angezeigt, nicht in der Titelleiste ! Daher kann AutoHotKey nicht feststellen, ob sich Vim von Sublime Text im COMMAND- oder INSERT-Modus befindet.

Ist es möglich, ein sehr einfaches Plugin / Paket in Sublime Text zu schreiben, damit in der Titelleiste die Wörter "COMMAND-Modus" oder "INSERT-Modus" angezeigt werden, wenn Vim aktiviert ist? Dies könnte AutoHotKey auf den aktuellen Modus und das Einschalten der Hostringe aufmerksam machen.

1

1 Antwort auf die Frage

1
JJohnston2

Ich weiß nicht, wie ich das in Sublime umsetzen soll, aber ein paar Gedanken / Beobachtungen

  1. Die Statusleiste ist kein separates Steuerelement, sie scheint Teil des allgemeinen PX_WINDOW_CLASSFensters für das gesamte Fenster zu sein. Daher ist es nicht gut, den Textwert direkt zu lesen (direkt aus AutoHotkey).
  2. Sie können die Abfrage in AutoHotkey zusammen mit OCR verwenden, um die Statusleiste zu lesen (mithilfe von GDIP oder ähnlichem). Dies würde wahrscheinlich mit einem minimalen Verarbeitungsaufwand funktionieren, würde jedoch immer eine Verzögerung zwischen dem Zeitpunkt, zu dem der Modus geändert wird, und dem Zeitpunkt, zu dem der Moduswechsel erkannt wird, erfordern. Nicht wirklich ideal Die OCR zum Laufen zu bringen, kann auch etwas schwierig sein (ist aber machbar).
  3. Sie können Ihr eigenes sublime Paket schreiben, um den Text in der Statuszeile zu lesen und basierend auf dieser Art der Abfrage zu verarbeiten, was zu tun ist. Zum Beispiel hier: https://forum.sublimetext.com/t/copy-text-from-the-status-bar/20714/8
  4. Andere Interaktionstypen (neben der Verwendung von AutoHotkey #IfWinActiveund dem Festlegen des Fenstertitels) sollten in Betracht gezogen werden . Mit anderen Worten, das Einstellen des Fenstertitels ist möglicherweise schwierig, es ist jedoch möglicherweise nicht so schwierig, ein separates Exe- oder Ahk-Skript direkt von sublime aus auszuführen. Angenommen, Sie konnten den korrekten Suchschlüssel für den Statustext abfragen, um festzustellen, ob es sich um INSERT oder COMMAND handelt, und dann einen Shellbefehl (Exe oder Ahk-Skript) auszuführen - dies könnte Ihr Hotstring-Skript dazu bringen, verschiedene Tastenkombinationen zu aktivieren / deaktivieren Es gibt ein sublime Paket, das so etwas tut, um die Fenstertransparenz einzustellen (führt ein externes Hilfsprogramm aus, um das Fenster zu ändern). Vielleicht könnten Sie sich das genauer ansehen.
  5. Dieser Link zeigt, wie Sie Änderungen im Modus erkennen können. Vielleicht könnten Sie dies in Kombination mit dem letzten Artikel verwenden. https://stackoverflow.com/questions/20514563/change-appearance-in-sublime-text-3-when-switching-mode-in-vintage#39805889
  6. Sie erwähnen in Ihrem Beitrag nicht, wie der Übergang zwischen dem Einfügemodus und dem Befehlsmodus erfolgt. Ich habe Sublime installiert und überall gesucht und kann es selbst nicht herausfinden, aber eine Möglichkeit zu prüfen ist, ob es sich dabei um einen Schlüssel handelt oder nicht Kombination. In diesem Fall könnten Sie die Tastatureingaben erkennen, mit denen zwischen den Modi gewechselt wird, und verfolgen, welcher Modus in AutoHotkey verwendet wird. Diese Art der Einrichtung kann weniger wünschenswert sein, da es sich um einen abgeleiteten Status handelt, der verfolgt wird (und er muss auch einmalig initialisiert werden, damit er ordnungsgemäß funktioniert). Als anfängliche Implementierung kann es jedoch recht einfach sein, etwas zu erhalten, das meistens funktioniert, bis Sie etwas stabileres in Sublime erhalten.
Danke für deine Eingabe JJohnston2! Ich wollte gerade einen Kommentar zu Ihrer Antwort hier posten, aber die Länge ist zu begrenzt, daher habe ich hier gepostet: [Pastebin-Kommentar] (http://pastebin.ca/3771985) Da Rossa vor 7 Jahren 0