2012-07-19 10 views
6

Me gustaría definir una macro vim que se rompa para la entrada del usuario en ciertos momentos, ¿es esto posible?¿Puedes hacer macros o grabaciones interactivas en vim?

EDIT: Resulta que yo ment grabaciones (q), no macros

Es posible utilizar el comando de entrada en una grabación, pero es más problemas de lo que vale la pena.

primera vez mapeados inserción de escape de entrada a una tecla

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

entonces hice esta grabación en el registro q

name: 

y pegar en una nueva pestaña

iname: ^[ 

Y después del escape final presioné <C-V><F2> haciendo la línea:

iname ^[^[OQ 

Que volví al búfer q luego usé la macro, permitiéndome usar la función de entrada. Funciona, pero terriblemente.

Respuesta

3

Sí. Ver la función input({prompt}, [, {text} [, {completion}] ]). Incluso hay inputdialog({prompt} [, {text} [, {cancelreturn}]]), para un diálogo emergente.

+0

vim es simplemente increíble! ¿Hay CUALQUIER pregunta como "puedo hacer xxx en vim" con un no como respuesta? :) – moritz

+0

entrada() no parece estar disponible en macros (ni siquiera a través de 'Ctrl-R = entrada ('prompt:')') pero si está bien con asignaciones normales o funciones, hará el trabajo muy bien . – mogelbrod

+0

@VictorHallberg: Hmm. Solo (re) probado. Funciona para mí (Vim 7.3.547). Por si acaso, ¿qué quieres decir con _macro_? ¿Qué no explica ': help macro'? – fork0

1

Desafortunadamente, no parece posible. Puede disparar input() dentro de una macro, pero continuar después no parece posible ya que cualquier entrada adicional grabada se inserta en el indicador de entrada.

Introduzca la línea en un registro con nombre ("qY) y ejecútela (@q) para probarla.
Nota: reemplace ^R y ^M con Ctrl-V Ctrl-R/M (consulte :help i_CTRL-V).

  • oBEFORE ^R=input('prompt> ')- obras
  • oBEFORE ^R=input('prompt> ')^Mitest- obras, sino inserta itest en el símbolo
  • oBEFORE ^R=input('prompt> ')<CR>test- falla
+0

Noté lo mismo. Sería bueno si esta característica se implementara. – everett1992

+0

@ everett1992: Es, en forma de 'inputsave()' y 'inputrestore()'; eche un vistazo a mi respuesta. –

2

Si utiliza input() dentro de un mapeo o macro, los caracteres restantes se tomarán como entrada, que no es lo que usted quiere. Vim ofrece las funciones inputsave() y inputrestore() para suspender temporalmente la lectura de la secuencia de caracteres de asignación.

Según la respuesta de mogelbrod, esto no funciona; la itest se lee en como entrada:

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

pero esto:

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

Desafortunadamente, debido <C-R> toma una expresión, no podemos poner las órdenes en línea, sino que tienen que definir una función separada Input().

Cuestiones relacionadas