Warum unterscheidet sich der Popup-Dialog von .gvimrc und der Befehlszeile?

463
ysap

Ich verwende die confirm()Funktion von gVim, um ein Dialogfeld zu öffnen, das darauf wartet, dass der Benutzer auf eine Schaltfläche klickt. Es scheint jedoch einen Unterschied in der Darstellung des Dialogs zu geben, wenn von .gvimrc:

Mit dem Befehl: :let MyTestV = confirm("IN MY_GVIMRC")wird folgender Dialog erzeugt:

Warum unterscheidet sich der Popup-Dialog von .gvimrc und der Befehlszeile?

Wenn diese Zeile :in eine .gvimrc(und auch in die .vimrc) Datei eingefügt wird, wird beim Öffnen eines neuen gVim Folgendes angezeigt:

Warum unterscheidet sich der Popup-Dialog von .gvimrc und der Befehlszeile?

Beachten Sie, dass der Dialog erscheint, bevor das eigentliche gVim-Fenster auf dem Bildschirm angezeigt wird.

1) Warum unterscheidet sich das Erscheinungsbild der beiden Dialoge?

2) Wo kann ich den Befehl so einstellen, dass der Dialog wie erwartet angezeigt wird?

1

2 Antworten auf die Frage

1
Heptite

Ich vermute, dass dies eine Variante der typischen Fehlerkategorie "Race Condition" ist. Starten Sie eine Nicht-GUI-Version von Vim und führen Sie Ihren confirm()Befehl aus. Sie werden sehen, woher der zusätzliche Text kommt. Grundsätzlich fügt Vim den Nicht-GUI- confirm()Text in das GUI-Popup ein, da die GUI zum Zeitpunkt der .vimrcAusführung noch nicht verfügbar ist.

Ich schlage vor, dass Sie eine E-Mail bugsan vim.org(Adresse etwas verschleiert, um Spambots zu verlangsamen) mit einem Bericht darüber. Sie könnten sogar auf diese SuperUser-Frage verweisen.

Edit: Dieses Problem ist noch schlimmer als ich vermutet habe. Ich beschloss zu sehen, ob ich es reproduzieren konnte, und gab diesen Befehl in mein.vimrc:

echo confirm('test') 

Und ich habe das gleiche Ergebnis erhalten wie Sie, aber mit einer zusätzlichen Zeile, bestehend aus 1dem Rückgabewert der Funktion confirm (). Hier stimmt definitiv etwas.

Bearbeiten Sie zwei: Wenn das Verzögern Ihresconfirm()Dialogs kein Problem ist, können Sie stattdessen Folgendes tun:

autocmd VimEnter * let MyTestV = confirm("IN MY_GVIMRC") 
Danke für die Antwort. Dies auf die Startdatei zu setzen bedeutete nicht, etwas Dauerhaftes zu sein, ich spielte nur mit den Startdateien und der neu entdeckten confirm () - Funktion. Ich war nur überrascht, dieses Verhalten zu sehen. Ihre Lösung zu Edit Two ist sinnvoll (und wurde von @IngoKarkat bestätigt). ysap vor 10 Jahren 0
1
Ingo Karkat

Ich denke, Sie stoßen in undefiniertes Verhalten. Funktionen, die mit dem Benutzer interagieren, sollten nicht ausgeführt werden ~/.vimrc, da die GUI noch nicht ordnungsgemäß initialisiert wurde. :help input()enthält eine Warnung:

HINWEIS: Diese Funktion darf nicht in einer Startdatei für die Versionen verwendet werden, die nur im GUI-Modus ausgeführt werden (z. B. die Win32-GUI).

Wenn Sie unmittelbar nach dem Start etwas vom Benutzer abfragen müssen, verwenden Sie :autocmd VimEnter, um es auszulösen.

Vielen Dank. Du hast wahrscheinlich Recht. Ihre Lösung wurde auch von @Heptite vorgeschlagen. Ich frage mich nur, ob dies als Fehler gemeldet werden sollte, wie er vorschlug (wahrscheinlich nicht, da dies erwartet wird, vorausgesetzt, die GUI wird nach den Init-Skripts wirklich neu gestartet). ysap vor 10 Jahren 0
Eine Antwort auf einen Fehlerbericht von Braam Moolenaar bestätigt, dass dies ein erwartetes Verhalten ist. ysap vor 10 Jahren 0