2017-07-03 2 views
1

Ich habe eine Funktion, die confirm ruft Benutzereingabe zu erhalten, eine Aktion ausführt, druckt dann eine Nachricht an den Benutzer:vimscript: klare Befehlszeile nach `confirm`

function! PerformAction() 
    let answer = confirm('Do thing?', "&Yes\n&No", 1) 
    if answer == 1 
    call system("do_thing") 
    echo "Did thing!" 
    endif 
endfunction 

Das Problem, das ich habe, ist, Dies führt dazu, dass der Benutzer gezwungen ist, nach dem Ausführen des Befehls eine zusätzliche Zeit von [Enter] zu erreichen, da die Befehlszeile erweitert wurde, um die Eingabeaufforderung und die Nachricht anzuzeigen.

Ist es möglich, dies zu verhindern, so dass, nachdem der Benutzer einen Wert für die Eingabeaufforderung eingegeben hat, die Befehlszeile gelöscht, die call system ausgeführt wird, dann wird die einzelne Zeile "Did thing!" in der Befehlszeile gedruckt, so dass der Benutzer sofort weiterarbeiten?

Antwort

2

Wenn Sie vim sagen Sie den Bildschirm mit :redraw, dies behebt das Problem zu aktualisieren:

function! PerformAction() 
    let answer = confirm('Do thing?', "&Yes\n&No", 1) 
    if answer == 1 
    call system("do_thing") 
    redraw 
    echo "Did thing!" 
    endif 
endfunction 

Ich weiß nicht genau, warum das funktioniert, aber :redraw für echo in der Hilfeseite erwähnt:

      *:echo-redraw* 
      A later redraw may make the message disappear again. 
      And since Vim mostly postpones redrawing until it's 
      finished with a sequence of commands this happens 
      quite often. To avoid that a command from before the 
      ":echo" causes a redraw afterwards (redraws are often 
      postponed until you type something), force a redraw 
      with the |:redraw| command. Example: > 
     :new | redraw | echo "there is a new window"