Sublime Text 2 Vintage: Einfügemodus bei Fokus verlassen verloren

Sublime Text 2 Vintage: Einfügemodus bei Fokus verlassen verloren

Ich benutzeJahrgangModus (Vi-Bindungen) in Sublime Text 2.

Beim Zurückschalten auf ST2 werde ich regelmäßig dadurch gestört, dass ich mich noch immer im Einfügemodus befinde und daher „jjjjjjjjjjjjkkkkkkkkk“ eingebe.

Gibt es eine Möglichkeit, den Einfügemodus automatisch zu verlassen und zum Befehlsmodus zurückzukehren, wenn das ST2-Fenster den Fokus verliert?

Antwort1

Ich habe Sublime Text 2 noch nie verwendet, aber es sieht aus, als ob es vielversprechend sein könnte ... allerdings kein Unterschied zu meinem Vim {Grin}

Die folgendeSOLLENWenn Sie den Einfügemodus deaktivieren möchten, wenn Sie den Fokus verlieren, nennen Sie ihn "stop_insert_on_focus_lost.py" und platzieren Sie es irgendwo in Ihrem Plugin-Ordner.

Hoffentlich funktioniert es. Ich musste die API und einige ihrer Beispiel-Plugins scannen, um das Format und die Befehle zu erhalten. (Habe ST2 allerdings noch nie zuvor gesehen ... bekomme ich Punkte dafür, dass ich ihre API, Python und den Vintage-Modus in ein paar Minuten verstanden habe?)

import sublime, sublime_plugin
import os.path

class StopInsertOnFocusLost(sublime_plugin.EventListener):
    def on_deactivated(self, view):
        view.run_command('exit_insert_mode')

Antwort2

Das obige Plugin ist großartig, leidet aber unter einem nervigen Fehler, wie in den anderen Kommentaren erwähnt. Wenn Sie zu etwas wie dem Suchmenü oder dem Popup „Gehe zu irgendetwas“ wechseln, befinden Sie sich dort im Befehls-/Normalmodus. Schlimmer noch, Befehle funktionieren nicht ganz richtig, da viele Befehle im Vintage-Modus nicht in Popups ausgeführt werden, sodass Sie sich in einer Situation befinden, in der beides schlimmer ist.

Diese Version behebt Folgendes:

import sublime, sublime_plugin
import os.path

class StopInsertOnFocusLost(sublime_plugin.EventListener):
    def on_deactivated(self, view):
        view.run_command('exit_insert_mode')

    def on_activated(self, view):
        if view.settings().get('is_widget') == True:
            view.run_command('enter_insert_mode')

Danke an die ursprüngliche Antwort für den Startcode!

Antwort3

Das habe ich außerdem noch anzubieten:

import sublime, sublime_plugin
import os.path

class StopInsertOnFocusLost(sublime_plugin.EventListener):
    def on_deactivated(self, view):
        if view.file_name() and not view.settings().get('command_mode'):
            view.run_command('exit_insert_mode')

Angepasst an die Antwort von lornix – behebt einige Randfälle. Geben Sie ihm einen Namen stop_insert_on_focus_lost.pyund fügen Sie es unter hinzu Packages.

verwandte Informationen