¿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:isRecordingque se activará cada vez que inicie o detenga una grabación. De esta manera, cuando comience a grabarg:isRecording, se establecerá en1y0cuando 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_10Lo 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!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 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-eventdeCursorHold; 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 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 ..CursorHoldparece ser un sueño imposible debido al retraso de lo queCursorHoldrealmente 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 ..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 :-)