Wie deaktiviere ich die Eingabeaufforderung "Drücken Sie die EINGABETASTE oder geben Sie den Befehl ein, um fortzufahren" in Vim?

102

Gibt es eine Möglichkeit, die Eingabeaufforderung "Drücken Sie ENTER oder geben Sie den Befehl ein, um fortzufahren" zu deaktivieren, die nach dem Ausführen eines externen Befehls angezeigt wird?

BEARBEITEN: <CR>Problemumgehung gefunden: Fügen Sie der Verknüpfung in meinem .lvimrc ein Extra hinzu.

map <F5> :wall!<CR>:!sbcl --load foo.cl<CR><CR>

Irgendwelche besseren Ideen?

Johan Kotlinski
quelle
9
Unter Windows 7 wird diese Eingabeaufforderung häufig angezeigt, weil die Fehler "Auslagerungsdatei kann nicht geöffnet werden" gedruckt wurden, aber nicht angezeigt werden. Dies führt zu der Eingabeaufforderung. Die Lösung besteht darin, set dir=$TEMPIhr vimrc einzutragen. Dies weist vim an, den richtigen temporären Ordner für seine temporären Dateien zu verwenden. Dies behebt wiederum die Fehler und entfernt die Eingabeaufforderungen "Drücken Sie die Eingabetaste".
Lucas

Antworten:

76

Ich bin mir nicht sicher, wie ich es global für einen Befehl machen soll:

:silent !<command>

Stellen Sie sicher, dass nach ein Leerzeichen eingefügt wird silent

Tabitha
quelle
3
Leider nicht sehr hilfreich für mich, es bringt den Bildschirm durcheinander und ich muss Strg-L drücken ... was noch ärgerlicher ist als das Drücken der Leertaste.
Johan Kotlinski
1
Arbeitete für mein Grep-Skript!
Mikko Rantanen
5
In Übereinstimmung mit dem Kommentator unten (der vorgeschlagen hat, am Ende des Befehls zusätzliches <CR> hinzuzufügen) können Sie bei Verwendung von Silent zusätzliches <Cl> hinzufügen, damit Sie es nicht manuell drücken müssen. Funktioniert also gut mit dem Bildschirm.
Victor Farazdagi
4
Verwenden Sie einfach den Befehl: quiet! und dann: neu zeichnen! nach - ich denke, es tut dies nicht automatisch aufgrund von Skripten, die Dinge auf dem Bildschirm tun können, die Sie bleiben möchten, zum Beispiel eine Uhr oder eine andere
Statusüberwachungssache
2
Ja ... es bringt den Bildschirm auch für mich durcheinander. Die :redraw!Option löst es. Das Doppel <cr>ist wahrscheinlich ähnlich. und weniger kompliziert
alpha_989
57

Eine Problemumgehung wurde gefunden: Fügen Sie <CR> dem Map-Befehl ein zusätzliches hinzu .

map <F5> :wall!<CR>:!sbcl --load foo.cl<CR><CR>
Johan Kotlinski
quelle
2
Daran hätte ich nie gedacht. Absolut brilliant!
Kohányi Róbert
1
Ja, das Hinzufügen des zusätzlichen <CR> zu meinem Befehl hat ebenfalls den Trick getan.
Daniel Miessler
2
Unglaublich einfach. Es ist sehr effektiv!
Wayne Werner
28
:help hit-enter
Anthony
quelle
1
Ich bin gespannt, warum jemand diese Antwort abgelehnt hat, da sie :help hit-entereinige ziemlich nützliche Hintergrundinformationen zur Eingabeaufforderung "ENTER drücken ..." enthält. Möchtest du das erklären?
cjs
38
Welche Informationen von ': help hit-enter' beantworten die Frage? Ich kann es nicht finden.
Johan Kotlinski
1
Es ist möglich, dass Sie vor dem Shell-Befehl eine Eingabeaufforderung "Drücken Sie die EINGABETASTE" vom Befehl "Alle schreiben" erhalten. In diesem Fall sind die Informationen unter <code> shortmess </ code> gültig, auf die <code> hit-enter </ code> verweist. Die Eingabeaufforderung, die Sie erhalten, ist jedoch das Beschießen. Wergans Vorschlag ist also der richtige. Wie unter <code>: help: quiet </ code> angegeben. "Wenn Sie dies für einen externen Befehl verwenden, kann dies dazu führen, dass der Bildschirm durcheinander gerät. Verwenden Sie | STRG-L |, um ihn zu bereinigen." Sie können Ihrem Befehl Folgendes hinzufügen: Neuzeichnen oder Strg-L, um dies zu beheben. Oder machen Sie einfach die beiden Retouren, die Sie bereits machen.
Auffälliger Compiler
Für mich ging es um set hl( :highlight), das ich fälschlicherweise als Verknüpfung für hlsearchdie eigentliche Verknüpfung verwendet habe hls. Eins ist swichtig :)
1
@ JohanKotlinski theset nomore
Tinmarino vor
19

Setze das cmdheightin meinem vimrc ( :e $MYVIMRC) auf 2 :

:set cmdheight=2

Mehr Infos hier .

TankorSmash
quelle
1
Dies ist perfekt für wirklich lange Suchanfragen
Keith Smiley
18

So ging ich mit dem Problem um, dass das Ausführen eines externen Programms durch stilles Durcheinander den Bildschirm im Textmodus vim durcheinander bringt (meiner Erfahrung nach leidet gvim nicht unter diesem Problem):

command! -nargs=1 Silent
\ | execute ':silent !'.<q-args>
\ | execute ':redraw!'

Verwenden Sie es anstelle des regulären Silent-Befehls:

:Silent top
emil.p.stanchev
quelle
13

Möglicherweise handelt es sich um einen Syntaxfehler in der vimrc- Datei

8.8.8.8
quelle
5
Dies. Ich hatte set numberund dann set syntaxdirekt unten in meiner .vimrc-Datei verwendet. Nachdem ich set syntaxVim entfernt hatte, wurde ich nicht mehr dazu aufgefordert.
Piperchester
1
@ Piperchester das hat funktioniert! Versuchte Tonnen von Vorschlägen und nur das hat funktioniert. Danke :)
Paul Evans
Ich aktualisiere vim, Problem gelöst. Aber ich denke, die Leute könnten tippen :message, um herauszufinden, was falsch läuft.
NanoNova
Ja. Ich hatte die Leitung set syntax. Ersetzt durch set syntax=onund es behebt das Problem.
McSuperbX1
7

Die Antwort von Anthony brachte mich an den richtigen Ort und ich konnte gvim so konfigurieren, dass nicht viele Nachrichten angehalten werden.
Ich habe set shortmess=aoOtIzu meiner gvimrc-Datei hinzugefügt .
Dies wird auf der Hilfeseite erläutert, die Ihnen von zur Verfügung gestellt wird :help shortmess.
Die Buchstaben bedeuten Klassen von Nachrichten, die Sie nicht sehen möchten oder die vim abschneiden soll, um zu vermeiden, dass die Eingabetaste gedrückt wird.
Ich habe dies zuvor geschafft, indem ich ein breites Anfangsfenster mit columns=130in gvimrc so eingestellt habe, dass nur wenige Nachrichten überlaufen und das nervige, anstrengende Drücken der Eingabetaste erforderlich ist.

Juan Lanus
quelle
6

So führe ich externe Befehle in schwierigen Szenarien aus, ohne "ENTER drücken" zu haben. Im Gegensatz dazu :silentkann ich immer noch die Befehlsausgabe sehen.

Befehlszeile

:exe ":!<command>" | redraw

Skript / Funktion

exe ':!<command>' 
redraw

Mapping mit <expr>

map <expr> <F5> ":exe ':!<command>'\n:redraw\<CR>"

Das Mapping <expr>damit ruft eine Funktion auf

map <expr> <F5> MyFoo()
fu! MyFoo()
    return ":exe ':!<command>' | redraw\<CR>"
endf
svlasov
quelle
Ist das in irgendeiner Weise wiederverwendbar? Wenn ich F5 drücke, wird nur eine Zeichenfolge <command>
aufgerufen
1
<command>soll durch einen tatsächlichen externen Befehl ersetzt werden, zBmap <expr> <F5> ":exe ':!gdb'\n:redraw\<CR>"
svlasov
4

Sie können verwenden:

call feedkeys(" ")

Beispielsweise:

function! Interactive_Questions()
    echo "Question 1:"
    let response1 = getchar()
    echo "Question 2:"
    let response2 = getchar()

    " Do something

    " Without the next line, you would have to hit ENTER,
    " even if what is written (the questions) has no interest:
    call feedkeys(" ")
endf
Yolenoyer
quelle
Danke für diese Antwort! Schnell und einfach und tatsächlich effektiv für meinen persönlichen Fall im Gegensatz zu vielen anderen Antworten.
Ab5Tract
3

Das Neuzeichnen vor dem Löschen des Bildschirms funktioniert ebenfalls. Folgendes hatte ich:

exe 'ls'  
exe 'b4'  "This redraws, so the Prompt is triggered

Dies löst jedoch keine Eingabeaufforderung aus:

exe 'ls'  
redraw  
exe 'b4'
Liang Li
quelle
Dies hat mir geholfen, da ich die Eingabeaufforderung an einer bestimmten Stelle innerhalb einer Funktion nur programmgesteuert entfernen musste. Nur ein redrawProblem gelöst. Die andere Lösung passte nicht, da ich Benutzereingaben zwischen der ursprünglichen Nachricht und dem Verschwinden der Eingabeaufforderung akzeptieren wollte.
Daniel Andersson
1

Ich habe ein ähnliches Problem, aber wenn ich ein Argdo ausführe, um dieselbe Zeichenfolge in mehreren Dateien zu ersetzen, z.

 argdo %s/something/Something/eg|update

Ich musste ständig die Seite nach unten drücken.

Sie können die folgende Option festlegen, bevor Sie das Skript ausführen, sodass anstelle vieler Eingabeaufforderungen nur die letzte Eingabeaufforderung angezeigt wird

:set nomore
Matt Vukomanovic
quelle
Das war die Antwort :set nomore:, schlechtes lecken ist es noch am ende. Es ist auch in :h help hit-entervon @anthony
Tinmarino vor
1

Ich mein Fall (ein Autocommand) set shortmess+=Fhat den Trick gemacht.

: h shortmess
F Geben Sie beim Bearbeiten einer Datei keine Dateiinformationen an , wie z:silent

Biggybi
quelle
0

Dies passiert mir, wenn ich eine Datei speichere, die sich in einem Verzeichnis befindet, in dem ich keine Schreibberechtigungen für das Verzeichnis habe. Ich habe einen chmod 777 für das Verzeichnis ausgeführt (ich hatte bereits Schreibberechtigungen für die Datei selbst) und die Meldung "ENTER drücken" wird nicht mehr angezeigt.

Jayemar
quelle
0
  • Wenn Sie eine Schlüsselkarte verwenden, kann Ihr Leben viel einfacher sein, indem Sie am Ende Ihres Befehls mehrere hinzufügen - aber normalerweise ist 2-mal gut genug.
  • Wenn Sie jedoch einen Befehl über die vim-Befehlszeile ausführen. Dann ist es etwas schwierig. Sie können silentvor Ihrem eigentlichen Befehl ein Schlüsselwort hinzufügen . Nach Ausführung des Befehls kehren Sie automatisch zum vim-Fenster zurück. Sie müssen jedoch weiterhin manuell ausgeführt werden, redrawda einige Fenster wie NERD_Tree neu gezeichnet werden müssen.

    • Versuchen Sie in diesem Fall, die Anweisungen aus dem vim-Hilfedokument zu befolgen:

      So reduzieren Sie die Anzahl der Eingabeaufforderungen:

      • Stellen Sie 'cmdheight' auf 2 oder höher ein.
      • Fügen Sie 'shortmess' Flags hinzu.
      • Setzen Sie 'showmd' und / oder 'Lineal' zurück.
    • Dieser Link bietet einen weiteren Ausweg. Fügen Sie dies in Ihre vimrc-Datei ein

      Befehl! -nargs = 1 Silent
      \ 'Silent!' .
      \ | Führen Sie 'Neu zeichnen!'
      

Und dann können Sie :Silent commandwie ein normaler Befehl verwenden.

Huangzonghao
quelle
0

An meiner Seite bestand die Lösung darin, silenthäufiger in einer Befehlskette zu verwenden .

Speziell vorher .vimrchatte:

nnoremap M :silent make\|redraw!\|cc<CR>

Dies wurde geändert in:

nnoremap M :silent make\|silent redraw!\|silent cc<CR>

Vorher tauchte die "Drücken Sie ENTER" nicht immer auf, aber ärgerlich oft. Die zusätzlichen silents haben dies behoben. (Es sieht so aus, als würde silentes nicht benötigt, redraw!da :ccdie Meldung "ENTER drücken" ausgelöst wurde.)

Diese Änderung hat den Nachteil, dass die Ausgabe von nicht mehr angezeigt :ccwird. Sie müssen also raten, was der Fehler ist. Eine kleine Änderung behebt dies:

nnoremap M :silent make\|redraw!\|cw\|silent cc<CR>

Dadurch wird die Fehler-QuickFix-Liste (Ausgabe von make) automatisch angezeigt (und von vim-magic ausgeblendet , wenn kein Fehler vorliegt).

Zu Ihrer Information:

Die Motivation für diese MZuordnung besteht darin, einfach Mim Normalmodus zu drücken, um:

  • Speichern Sie die Bearbeitung (wenn Sie verwenden make, ist gitsowieso alles unter Kontrolle)
  • aufrufen make
  • und direkt zum ersten Fehler oder zur ersten Warnung springen

Meine Makefiles sind normalerweise so aufgebaut, dass dies nur einen Bruchteil einer Sekunde dauert.

Mit ein wenig Optimierung kann dies auch auf CWorkloads ohne Typ angewendet werden :

Zusätzlich .vimrchinzufügen

set efm+=#%t#%f#%l#%c#%m#

Dies ermöglicht vimdie Interpretation von Meldungen wie folgt für :cc(Anzeigefehler):

#E#file#line#column#message#
#W#file#line#column#message#
#I#file#line#column#message#

( ESpiegel, WArnings, Info, basierend auf vimMagie)

Beispiel, wie dies für Python-Skripte verwendet wird . (Sorry, keine Kopie hier, es ist eine andere Geschichte.)

Tino
quelle
0

Wenn Ihr Fehler durch E303 verursacht wird, kann er durch Erstellen eines temporären Verzeichnisses in der .vimrcDatei behoben werden .

Schreiben Sie nach dem Öffnen einer Datei Folgendes und geben Sie Folgendes ein:

:messages

Wenn es Fehler gibt, werden Sie dazu aufgefordert.

Wenn E303 (Fehler303) "Auslagerungsdatei für" {Dateiname} "kann nicht geöffnet werden, Wiederherstellung nicht möglich" angezeigt wird, weist dies möglicherweise darauf hin, dass ein alter Versuch unternommen wurde, eine Auslagerungsdatei (höchstwahrscheinlich verloren oder nicht vorhanden) im System wiederherzustellen .

Um dies zu beheben, weisen Sie der .vimrcDatei ein temporäres Verzeichnis zu .

Geben Sie .vimrcFolgendes ein und geben Sie Folgendes ein, um den Speicherort der Datei zu ermitteln:

$ locate .vimrc
/root/.vimrc

Öffne die Datei $ vi .vimrc

Fügen Sie dies an das Ende der Datei an:

set directory=.,$TEMP

Speichern und schließen mit :wq

Laden Sie das Profil abschließend neu mit:

$ . /etc/profile

Versuchen Sie, eine beliebige Datei mit VI zu öffnen. Das Problem soll behoben sein.

Rafael Vidal
quelle
0

Auf gvimwenn Sie haben festgelegt guioptions+=!(Hinzugefügt !in guioptions), ist dies , weil davon. Mit dieser Option ( !) können gvimeinige Befehle auf einem externen Terminal ausgeführt werden (die mehr Funktionen wie Farbe und so viele andere unterstützen).

Sie können es mit versuchen :set guioptions-=iund sehen, ob dies für Sie funktioniert.

Nilesh Kevlani
quelle