¿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.
Respuestas:
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
: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:isRecording
que se activará cada vez que inicie o detenga una grabación. De esta manera, cuando comience a grabarg:isRecording
, se establecerá en1
y0
cuando 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.fuente
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 en
usr_10
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
:reg
lista. ¡Resulta que funciona como un encanto!Ejemplo:
En modo normal:
qaisomething<Esc>
y dentro de
:reg
nosotros vemos la entrada!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
q
para 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
vimL
que está escribiendo (nunca se activará ningún registro en el registro ("ay
))Aquí hay un poco de información de
:help registers
los registros disponiblesSuponiendo 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-event
deCursorHold
; 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)fuente
blackhole register
solo 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 ..CursorHold
parece ser un sueño imposible debido al retraso de lo queCursorHold
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 ..q
y 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 :-)