2012-07-19 5 views
6

Chciałbym zdefiniować makro vim, które przerywa wprowadzanie danych przez użytkownika w określonych momentach, czy jest to możliwe?Czy potrafisz robić interaktywne makra lub nagrania w vimie?

EDIT: Okazuje się, że ment nagrań (q) nie makra

Możliwe jest użycie polecenia wejścia w nagraniu, ale to więcej kłopotów niż to warte.

raz pierwszy odwzorowane wejścia insert ucieczkę do kluczowego

:map <F2> a<C-R>=input('input: ')<CR> 

Potem zrobiłem ten zapis w rejestrze q

name: 

i wklejać go w nowej karcie

iname: ^[ 

I po ostatecznej ucieczce nacisnąłem <C-V><F2> tworząc linię:

iname ^[^[OQ 

To, że przyciągnąłem do bufora q, użyłem makra, pozwalając mi użyć funkcji wprowadzania. Działa, ale strasznie.

Odpowiedz

3

Tak. Zobacz funkcję input({prompt}, [, {text} [, {completion}] ]). Istnieje nawet inputdialog({prompt} [, {text} [, {cancelreturn}]]), dla wyskakującego okna dialogowego.

+0

vim jest po prostu niesamowity! czy jest JAKIEKOLWIEK pytanie typu "czy mogę zrobić xxx w vimie" z brakiem odpowiedzi? :) – moritz

+0

input() nie wydaje się być dostępny w makrach (nawet przez 'Ctrl-R = input ('prompt:')'), ale jeśli wszystko jest w porządku z normalnymi mapowaniami lub funkcjami, to ładnie wykona to zadanie . – mogelbrod

+0

@VictorHallberg: Hmm. Po prostu (ponownie) wypróbowany. Działa dla mnie (Vim 7.3.547). Na wszelki wypadek, co masz na myśli przez _macro_? Nie rozumiesz, co ': help macro'? – fork0

1

Niestety nie wydaje się to możliwe. Możesz wyzwolić input() wewnątrz makra, ale kontynuowanie po nim nie wydaje się możliwe, ponieważ wszelkie dodatkowe zapisy wejściowe są wstawiane do linii wejściowej.

Przewiń linię do nazwanego rejestru ("qY) i uruchom go (@q), aby go wypróbować.
Uwaga: zamień ^R i ^M za pomocą Ctrl-V Ctrl-R/M (patrz :help i_CTRL-V).

  • oBEFORE ^R=input('prompt> ')- działa
  • oBEFORE ^R=input('prompt> ')^Mitest- działa, ale wstawia itest do szybkiego
  • oBEFORE ^R=input('prompt> ')<CR>test- nie
+0

Zauważyłem to samo. Byłoby miło, gdyby ta funkcja została zaimplementowana. – everett1992

+0

@ everett1992: Jest, w postaci 'inputsave()' i 'inputrestore()'; spójrz na moją odpowiedź. –

2

Jeśli używasz input() wewnątrz odwzorowania lub makro, pozostałe znaki będą traktowane jako dane wejściowe, a co nie chcesz. Vim oferuje funkcje inputsave() i inputrestore() do tymczasowego wstrzymania odczytu od strumienia znaków odwzorowania.

Na podstawie odpowiedzi mogelbroda, to nie działa; itest jest odczytywany jako wejście:

oBEFORE ^R=input('prompt> ')^Mitest 

Ale to robi:

function! Input() 
    call inputsave() 
    let text = input('prompt> ') 
    call inputrestore() 
    return text 
endfunction 
oBEFORE ^R=Input()^Mitest 

Niestety, z powodu <C-R> bierze wyrażenie, nie możemy umieścić polecenia inline, ale trzeba zdefiniować oddzielny Input() funkcję.

Powiązane problemy