¿Hay alguna manera de detectar si estoy grabando en vimscript?


11

¿Hay algo como

eval("is_recording()")

que puedo llamar en mi vimscript para averiguar si actualmente estoy grabando una macro? Pensé que esto funciona:

eval("mode(1)")

pero eso solo vuelve "n".

No estoy seguro si importa, pero estoy usando neovim, por lo que si es exclusivo de neovim, está bien.


3
En mi humilde opinión, sería una mala idea: "grabar", en ese caso, se convertiría en un nombre falso :) No sé lo que está tratando de hacer, pero tal vez hacer esa pregunta podría proporcionar diferentes formas de resolverlo.
VanLaser

@VanLaser ¿Qué quieres decir con nombre falso?
James

1
Si una acción de Vim es diferente cuando la está grabando, significa que el proceso de grabación en sí afecta a la acción, cuando solo debería "almacenarla" para repetirla más tarde. ¿Qué esperas que suceda cuando ejecutas la macro?
VanLaser

Respuestas:


4

En primer lugar, creo que su problema es principalmente un problema XY . Debería darnos más información sobre lo que está tratando de hacer al final y creo que podríamos encontrar otra solución.

Ahora, aquí hay una solución, probablemente no sea lo ideal y ciertamente no es muy robusto, pero podría agregar estas líneas a su .vimrc:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

La idea es que el "modo de grabación" se activa exclusivamente cuando se presiona qen modo normal.

En función de eso, crea una variable g:isRecordingque se activará cada vez que inicie o detenga una grabación. De esta manera, cuando comience a grabar g:isRecording, se establecerá en 1y 0cuando pare de grabar. Luego puede acceder al estado de grabación a través del valor de la variable.

El "inconveniente" es que para evitar el mapeo recursivo, tendrá que usar Shit-q para iniciar y detener la grabación en lugar de hacerlo q. (Tenga en cuenta que no es un problema tan grande: he estado usando shift-qpara alternar el modo de grabación durante algún tiempo porque no me gusta el shift-qcomportamiento original )

El principal problema de esta solución es que si lo olvidó y utiliza qla variable, no se activará, pero no podrá desactivarla q(por ejemplo, con nnoremap q <nop>) porque si lo hace shift-qno funcionará más.


2

Esta es una solicitud bastante curiosa ya que no hay un "modo" para grabar una macro. Después de examinar algunos documentos, encontré lo siguiente enusr_10

Empiezas moviéndote al primer carácter de la primera línea. Luego ejecuta los siguientes comandos:

qa Comience a grabar una macro en el registro a .

^ Moverse al comienzo de la línea.

i # include "Insertar la cadena #include" al comienzo de la línea.

$ Moverse al final de la línea.

a "Agregar la comilla doble de caracteres (") al final de la línea.

j Ir a la siguiente línea.

q Detenga la grabación de la macro.

Lo más destacado para mí fue la frase sobre "Comenzar a grabar una macro en el registro a"

Como cada macro se guardará en un registro de forma predeterminada, esperaba que pudiéramos verla en la :reglista. ¡Resulta que funciona como un encanto!

Ejemplo:

En modo normal: qaisomething<Esc>

y dentro de :regnosotros vemos la entrada!

"a   isomething^[

Con ese conocimiento, debería poder "espiar" los registros para confirmar que se está grabando una macro (use un registro con nombre en cada grabación [mapa qpara usar siempre el mismo registro (o algo así)]

Si tiene problemas, hágamelo saber y trataré de ayudarlo (ya que esta funcionalidad también es nueva para mí: D)

editar Para abordar el problema de un registro que se está utilizando durante el retiro, recomendaría buscar un tipo especial de registro que pueda usar solo para el vimLque está escribiendo (nunca se activará ningún registro en el registro ( "ay))

Aquí hay un poco de información de :help registerslos registros disponibles

Hay diez tipos de registros: registros E354

  1. El registro sin nombre ""

  2. 10 registros numerados "0 a" 9

  3. El pequeño registro de eliminación "-

  4. 26 registros con nombre "a a" z o "A a" Z

  5. tres registros de solo lectura ":,"., "%

  6. registro de buffer alternativo "#

  7. el registro de expresión "=

  8. Los registros de selección y descarte "*," + y "~

  9. El registro del agujero negro "_

  10. Último registro de patrón de búsqueda "/

Suponiendo que tiene un registro que va a usar ahora, el problema se convierte en "¿cómo sé cuándo se detuvo la grabación?". Para hacerse cargo de esto me gustaría echar un vistazo a la autocmd-eventde CursorHold; la nota en los documentos de ayuda parece bastante prometedora (trataría de descubrir cómo podría diferenciar cursorHold normal frente al evento inactivo / no existente que ocurre cuando se escribe en su registro a los efectos de la macro)

CursorHold

Cuando el usuario no presiona una tecla durante el tiempo especificado con 'updatetime'. No se vuelve a activar hasta que el usuario haya presionado una tecla (es decir, no dispara cada 'tiempo de actualización' ms si deja Vim para hacer un café. :) Ver | CursorHold-example | para previsualizar etiquetas. Este evento solo se activa en modo Normal. No se activa cuando se espera que se escriba un argumento de comando o un movimiento después de un operador. Mientras se graba el evento CursorHold no se activa. | q |


Realmente no veo cómo resuelve el problema: cuando termina de grabar su macro, se guarda una cadena en el registro, pero ¿cómo se diferencia cuando el registro contiene una macro o cuando contiene algo que proviene de un comando de extracción, por ejemplo? Además, el registro se guarda como una toma cuando termina de grabar, de modo que cuando ve que el contenido del registro ha cambiado, ya no está en modo de grabación.
statox

Mi esperanza era que pudieras usar algo como el registro de agujeros negros (un registro que nunca será eliminado). Si tiene ese registro bloqueado, entonces puede verificar CursorHold que tiene un comportamiento especial cuando está en modo de grabación (actualizará mi respuesta con más información para ver si eso lo ayuda)
Dan Bradbury

agregó información sobre los otros registros (forma de evitar conflictos con el tirón) y una pista sobre cómo podríamos atrapar la "grabación" con CursorHold no activo durante la grabación macro. Si todavía está luchando contra esto después de esas notas, hágamelo saber y puedo intentar implementarlo después de que termine el trabajo. Como nota, blackhole registersolo se mencionó como una pista y un interesante vim tidbit que podría conducir a algo (no sería útil usarlo al grabar macros; ya que @_ no es utilizable), de hecho, ni siquiera puede intentar guardar la macro a él ..
Dan Bradbury

Pasé algún tiempo en esto anoche (después del bloqueo del teclado de cerveza) y me resultó increíblemente difícil determinar exactamente cuándo se produce y finaliza la grabación. Mi corazonada CursorHoldparece ser un sueño imposible debido al retraso de lo que CursorHold realmente está sucediendo (hizo un simple incremento global cada vez que se ve esto). Todavía increíblemente interesado en encontrar una manera de hacer esto y continuaré golpeando mi cara contra las teclas hasta que tengamos una solución ..
Dan Bradbury

En mi opinión, no tiene miles de opciones diferentes: debe anular el comportamiento qy hacer que cambie una variable e inicie / detenga la grabación. Una autocomando no puede ser confiable aquí ya que no se activa el autocmd al presionar una tecla, y no es posible realizar una función de sondeo debido a la naturaleza monotread de Vim. Buena suerte con tus futuras experimentaciones :-)
statox
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.