2012-07-19 15 views
6

Vorrei definire una macro vim che si interrompe per l'input dell'utente in determinati momenti, è possibile?È possibile eseguire macro interattive o registrazioni in vim?

EDIT: Risulta I ge- registrazioni (q), non macro

E 'possibile utilizzare il comando di input in una registrazione, ma è più problemi che vale.

ho mappati fuga insert a una chiave

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

poi ho fatto questa registrazione nel registro delle q

name: 

e incollato in una nuova scheda

iname: ^[ 

E dopo la fuga finale ho premuto <C-V><F2> facendo la linea:

iname ^[^[OQ 

Che ho richiamato il buffer q quindi ho utilizzato la macro, permettendomi di utilizzare la funzione di input. Funziona, ma terribilmente.

risposta

3

Sì. Vedi la funzione input({prompt}, [, {text} [, {completion}] ]). C'è anche inputdialog({prompt} [, {text} [, {cancelreturn}]]), per un popup di dialogo.

+0

vim è semplicemente fantastico! c'è QUALSIASI domanda tipo "posso fare xxx in vim" con un no come risposta? :) – moritz

+0

input() non sembra essere disponibile in macro (nemmeno con 'Ctrl-R = input ('prompt:')') ma se stai bene con normali mappature o funzioni farà bene il lavoro . – mogelbrod

+0

@VictorHallberg: Hmm. Solo (ri) provato. Funziona per me (Vim 7.3.547). Nel caso, cosa intendi per _macro_? Non è ciò che ': help macro' spiega? – fork0

1

Sfortunatamente non sembra possibile. È possibile attivare input() all'interno di una macro, ma continuare in seguito non sembra possibile poiché qualsiasi input aggiuntivo registrato viene inserito nel prompt di input.

Inserire la riga in un registro denominato ("qY) ed eseguirlo (@q) per provarlo.
Nota: sostituire ^R e ^M con Ctrl-V Ctrl-R/M (vedere :help i_CTRL-V).

  • oBEFORE ^R=input('prompt> ')- Lavori
  • oBEFORE ^R=input('prompt> ')^Mitest- opere, ma inserisce itest nel prompt
  • oBEFORE ^R=input('prompt> ')<CR>test- fallisce
+0

Ho notato la stessa cosa. Sarebbe bello se questa funzionalità fosse implementata. – everett1992

+0

@ everett1992: È, sotto forma di 'inputsave()' e 'inputrestore()'; dai un'occhiata alla mia risposta –

2

Se si utilizza input() all'interno di una mappatura o macro, i caratteri rimanenti saranno presi come input, che non è quello che tu vuoi. Vim offre le funzioni inputsave() e inputrestore() per sospendere temporaneamente la lettura dal flusso dei caratteri di mappatura.

In base alla risposta di mogelbrod, questo non funziona; la itest viene letta come input:

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

ma ciò:

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

Sfortunatamente, a causa <C-R> prende un'espressione, non possiamo mettere i comandi in linea, ma devono definire una funzione separata Input().

Problemi correlati