Jak wyłączyć monit „Naciśnij klawisz ENTER lub wpisz polecenie, aby kontynuować” w Vimie?

104

Czy istnieje sposób na wyłączenie monitu „Naciśnij klawisz ENTER lub wpisz polecenie, aby kontynuować”, który pojawia się po wykonaniu polecenia zewnętrznego?

EDYCJA: Znalazłem obejście: Dodaj dodatek <CR>do skrótu w moim .lvimrc.

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

Jakieś lepsze pomysły?

Johan Kotlinski
źródło
9
W systemie Windows 7 ten monit pojawia się często z powodu błędu „nie można otworzyć pliku wymiany”, które zostały wydrukowane, ale ich nie widać, co powoduje wyświetlenie monitu. Rozwiązaniem jest umieszczenie set dir=$TEMPpliku vimrc. Mówi to vimowi, aby używał właściwego folderu tymczasowego dla swoich plików tymczasowych. To z kolei naprawia błędy i usuwa monity „naciśnij klawisz Enter”.
Lucas

Odpowiedzi:

76

Nie jestem pewien, jak to zrobić globalnie dla jednego polecenia:

:silent !<command>

Pamiętaj, aby dodać spację po silent

Tabitha
źródło
3
Niestety nie jest to dla mnie zbyt pomocne, psuje ekran i muszę wcisnąć Ctrl-L ... co jest jeszcze bardziej irytujące niż naciskanie spacji.
Johan Kotlinski
1
Pracowałem jednak dla mojego skryptu grep!
Mikko Rantanen
5
Zgodnie z poniższym komentatorem (który zasugerował dodanie dodatkowego <CR> na końcu polecenia), podczas używania silent możesz dodać dodatkowe <Cl>, aby nie trzeba było go wciskać ręcznie. W takim razie działa dobrze z ekranem.
Victor Farazdagi,
4
po prostu użyj polecenia: silent !, a następnie: redraw! po - myślę, że nie robi to automatycznie, ponieważ skryptów, które mogą robić rzeczy na ekranie, który chcesz zatrzymać, na przykład, zegar lub jakiś inny stan monitorowania rzecz ... tylko przypuszczenie
osirisgothra
2
Tak ... dla mnie też psuje ekran. :redraw!opcja rozwiązuje go. Podwójna <cr>jest prawdopodobnie podobna. i mniej skomplikowane
alpha_989
58

Znalazłem jedno obejście: dodaj dodatkowe <CR> polecenie do mapy.

map <F5> :wall!<CR>:!sbcl --load foo.cl<CR><CR>
Johan Kotlinski
źródło
2
Nigdy bym o tym nie pomyślał. Absolutnie genialne!
Kohányi Róbert
1
Tak, dodanie dodatkowego <CR> do mojego polecenia również załatwiło sprawę.
Daniel Miessler
2
Niesamowicie proste. To bardzo skuteczne!
Wayne Werner
28
:help hit-enter
antoni
źródło
1
Jestem ciekawy, dlaczego ktoś odrzucił tę odpowiedź, skoro :help hit-enterdostarcza dość przydatnych informacji na temat zachęty „Naciśnij ENTER ...”. Chcesz wyjaśnić?
cjs
38
Jakie informacje z „: help hit-enter” odpowiadają na pytanie? Nie mogę tego znaleźć.
Johan Kotlinski
1
Jest możliwe, że przed wykonaniem powłoki pojawi się zachęta „Naciśnij klawisz ENTER” z polecenia zapisz wszystko. Informacja pod <code> shortmess </code>, do której prowadzi <code> hit-enter </code> prowadzi w tym przypadku. Jednak komunikat, który otrzymujesz, pochodzi z ostrzału, więc sugestia Wergana jest słuszna. Jak zauważono w <code>: help: silent </code> "Używając tego dla polecenia zewnętrznego, może to spowodować popsucie ekranu. Użyj | CTRL-L |, aby go wyczyścić". Możesz dodać: przerysuj lub Ctrl-L do swojego polecenia, aby to naprawić. Lub po prostu wykonaj dwa zwroty, które już robisz.
Conspicuous Compiler
Dla mnie chodziło o set hl( :highlight) błędnie użyłem jako skrótu do tego, hlsearchkto jest prawdziwym skrótem hls. Jedno ma sznaczenie :)
1
@JohanKotlinski sięset nomore
Tinmarino
19

Ustaw na cmdheight2, w moim vimrc ( :e $MYVIMRC):

:set cmdheight=2

Więcej informacji tutaj .

TankorSmash
źródło
1
Jest to idealne rozwiązanie w przypadku naprawdę długich zapytań
Keith Smiley,
18

Oto jak poradziłem sobie z problemem polegającym na tym, że uruchamianie zewnętrznego programu przez cichy psuje ekran w trybie tekstowym vim (z mojego doświadczenia wynika, że ​​gvim nie ma tego problemu):

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

Użyj go zamiast zwykłego cichego polecenia:

:Silent top
emil.p.stanchev
źródło
13

Prawdopodobnie jest to błąd składni w pliku vimrc

8.8.8.8
źródło
5
To. Użyłem, set numbera następnie set syntaxponiżej w moim pliku .vimrc. Kiedy usunąłem, set syntaxVim już mnie nie monitował.
piperchester
1
@piperchester to zadziałało! Wypróbowałem mnóstwo sugestii i tylko to zadziałało. Dzięki :)
Paul Evans,
Aktualizuję Vima, problem rozwiązany. Ale myślę, że ludzie mogliby pisać :messagena klawiaturze, aby dowiedzieć się, co się dzieje.
NanoNova
Tak. Miałem linię set syntax. Zastąpiłem go set syntax=oni rozwiązuje problem.
McSuperbX1
7

Odpowiedź Anthony'ego zaprowadziła mnie we właściwe miejsce i byłem w stanie skonfigurować gvim tak, aby nie zatrzymywał się na wielu wiadomościach.
Dodałem set shortmess=aoOtIdo mojego pliku gvimrc.
Jest to wyjaśnione na stronie pomocy dostarczonej przez :help shortmess.
Litery oznaczają klasy wiadomości, których nie chcesz widzieć lub chciałbyś, aby vim obciął, aby uniknąć wciśnięcia enter stop.
Udało mi się to wcześniej, ustawiając szerokie okno początkowe columns=130w gvimrc, więc niewiele wiadomości przepełniłoby go i wymagałoby irytującej, wyczerpującej potrzeby wciśnięcia enter.

Juan Lanus
źródło
6

W ten sposób uruchamiam polecenia zewnętrzne w trudnych sytuacjach bez konieczności naciskania klawisza ENTER. W przeciwieństwie do tego :silent, nadal widzę dane wyjściowe polecenia.

Wiersz poleceń

:exe ":!<command>" | redraw

Skrypt / funkcja

exe ':!<command>' 
redraw

Mapowanie za pomocą <expr>

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

Mapowanie z <expr>tym wywołuje funkcję

map <expr> <F5> MyFoo()
fu! MyFoo()
    return ":exe ':!<command>' | redraw\<CR>"
endf
svlasov
źródło
Czy jest to w jakikolwiek sposób wielokrotnego użytku? Kiedy naciskam F5, po prostu wywołuje ciąg znaków<command>
ashrasmun
1
<command>ma zostać zastąpiony faktycznym poleceniem zewnętrznym, np.map <expr> <F5> ":exe ':!gdb'\n:redraw\<CR>"
svlasov
4

Możesz użyć:

call feedkeys(" ")

Na przykład:

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
źródło
Dzięki za tę odpowiedź! Szybkie, łatwe i skuteczne w moim osobistym przypadku, w przeciwieństwie do wielu innych wymienionych odpowiedzi.
ab5tract
3

Umieszczenie przerysowania przed wyczyszczeniem ekranu również działa. Oto, co miałem:

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

Ale to nie spowoduje wyświetlenia monitu:

exe 'ls'  
redraw  
exe 'b4'
Liang Li
źródło
Pomogło mi to, ponieważ po prostu programowo pozbyłem się monitu w określonym miejscu w funkcji. Po prostu wydanie redrawrozwiązało to. Inne rozwiązanie nie pasowało, ponieważ chciałem zaakceptować dane wejściowe użytkownika między oryginalną wiadomością a zniknięciem monitu.
Daniel Andersson
2

Mój przypadek (automatyczna komenda) załatwił sprawę set shortmess+=F.

: h shortmess
F nie podaje informacji o pliku podczas edycji pliku, np.:silent

Biggybi
źródło
1

Mam podobny problem, ale kiedy uruchamiam argdo, aby zamienić ten sam ciąg w wielu plikach, np.

 argdo %s/something/Something/eg|update

Ciągle musiałem naciskać stronę w dół.

Przed uruchomieniem skryptu można ustawić następującą opcję, aby zamiast wielu monitów był tylko ostatni monit

:set nomore
Matt Vukomanovic
źródło
To była odpowiedź: :set nomorezły lizanie to wciąż koniec. Jest również w :h help hit-enter@anthony
Tinmarino
0

Dzieje się tak, gdy zapisuję plik znajdujący się w katalogu, w którym nie mam uprawnień do zapisu w tym katalogu. Zrobiłem chmod 777 na katalogu (miałem już prawa zapisu do samego pliku) i komunikat „Press ENTER” już się nie pojawia.

jayemar
źródło
0
  • Jeśli korzystasz z mapy klucza, twoje życie może być znacznie łatwiejsze, dodając kilka kolejnych na końcu polecenia - ale zwykle 2 razy wystarcza.
  • Ale jeśli wykonujesz polecenie z wiersza poleceń vim. Wtedy jest to trochę trudne. Możesz dodać słowo kluczowe silentprzed wydaniem polecenia. Po wykonaniu polecenia automatycznie przeniesie Cię z powrotem do okna vima. Ale nadal musisz wykonać ręcznie, redrawponieważ niektóre okna, takie jak NERD_Tree, wymagają ponownego narysowania.

    • W tym przypadku spróbuj postępować zgodnie z instrukcjami z dokumentu pomocy vim:

      Aby zmniejszyć liczbę monitów o naciśnięcie klawisza Enter:

      • Ustaw „cmdheight” na 2 lub więcej.
      • Dodaj flagi do „shortmess”.
      • Zresetuj „showcmd” i / lub „ruler”.
    • Ten link zapewnia inne wyjście. Umieść to w swoim pliku vimrc

      Komenda! -nargs = 1 Cichy
      \ wykonaj 'cicho!' .
      \ | wykonaj polecenie „przerysuj!”
      

A potem możesz użyć :Silent commandjak zwykłego polecenia.

huangzonghao
źródło
0

Z mojej strony rozwiązaniem było częstsze używanie silentw łańcuchu poleceń .

W szczególności wcześniej .vimrc:

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

Zostało to zmienione na:

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

Wcześniej „Press ENTER” nie zawsze pojawiał się, ale irytująco często. Dodatkowe silentrozwiązania to naprawiły. (Wygląda na silentto, że nie jest potrzebny, redraw!ponieważ :ccspowodował komunikat „Naciśnij klawisz ENTER”).

Ta zmiana ma tę wadę, że nie wyświetla już wyniku programu :cc, więc musisz zgadnąć, na czym polega błąd. Trochę uszczypnąć rozwiązuje w ten sposób:

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

To sprawia, że ​​lista błędów QuickFix (wyjście make) pojawia się automatycznie (i, przez vim-magic, znika, jeśli nie ma błędu).

FYI:

Motywacją do tego M-mapowania jest po prostu naciśnięcie Mw trybie normalnym, aby:

  • zapisz edycję (kiedy i tak makewszystko jest pod kontrolą git)
  • odwołać się make
  • i bezpośrednio przejdź do pierwszego błędu lub ostrzeżenia

Moje Makefilesą zwykle tak skonstruowane, że zajmuje to tylko ułamek sekundy.

Po drobnych poprawkach można to zastosować również do Cobciążeń innych niż typowe:

w .vimrcdodatku

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

Pozwala to vimna interpretację następujących komunikatów dla :cc(błąd wyświetlania):

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

( ERrors, Warnings, Info, oparte na vimmagii)

Przykład użycia tego dla skryptów Pythona . (Przepraszamy, nie ma tu kopii, to inna historia).

Tino
źródło
0

Jeśli błąd jest spowodowany przez E303, utworzenie katalogu tymczasowego w .vimrcpliku może go naprawić.

Po otwarciu dowolnego pliku napisz i wprowadź:

:messages

Jeśli wystąpią błędy, pojawi się monit.

Jeśli zobaczysz komunikat E303 (błąd 303) „Nie można otworzyć pliku wymiany dla„ {nazwa pliku} ”, odzyskanie niemożliwe”, może to oznaczać, że w systemie została podjęta stara próba odzyskania pliku wymiany (najprawdopodobniej utracony lub nie istnieje) .

Aby to naprawić, przypisz katalog tymczasowy w .vimrcpliku.

Aby znaleźć lokalizację .vimrcpliku, wpisz i wprowadź to:

$ locate .vimrc
/root/.vimrc

Otwórz plik $ vi .vimrc

Dołącz to na końcu pliku:

set directory=.,$TEMP

Zapisz i zamknij za pomocą :wq

Na koniec przeładuj profil za pomocą:

$ . /etc/profile

Spróbuj otworzyć dowolny plik z VI. Problem zostanie rozwiązany.

Rafael Vidal
źródło
0

On gvim, jeśli masz ustawione guioptions+=!(Dodano !w guioptions), to z tego powodu. Ta opcja ( !) powoduje gvimwykonanie niektórych poleceń na terminalu zewnętrznym (które obsługują więcej funkcji, takich jak kolor i wiele innych).

Możesz spróbować, używając :set guioptions-=ii sprawdzić, czy to działa dla Ciebie.

Nilesh Kevlani
źródło