debugging – (RegEx-) Reemplazar: datos de coincidencia esporádicos golpeados por ganchos de modificación del búfer

Pregunta:

Sé que esto ya se preguntó en otros contextos, pero no pude encontrar nada relacionado con el desarrollo de C ++ con mis ganchos que pudiera ayudarme. Estoy trabajando mucho con replace y query-replace y query-replace-regexp y me encanta.

Ahora tengo el problema muy molesto de que después de un tiempo estoy trabajando en un búfer, de repente aparece el error mencionado en el título después de la primera actualización.

Esto no siempre sucede, pero después de un tiempo aparece de repente. Reabrir el búfer lo arregla por un tiempo, pero no es una solución.

En otras respuestas se mencionan las after-change-functions before-changes-functions after-change-functions . Debido a que el error ocurre después del primer reemplazo, supongo que debería estar ubicado en el after-change-functions . El valor de esto en el búfer es:

(c-after-change flycheck-handle-change flymake-after-change-function lsp-on-change jit-lock-after-change t)

No pude averiguar qué está sucediendo allí, por lo que cualquier ayuda al respecto es muy apreciada.

EDITAR: Gracias a Alex Karbivnichiy por la respuesta. Me gusta tu idea de un reemplazo personalizado.

Me inspiró a hacer más pruebas con before-change-functions after-change-functions sin éxito. Tenía un búfer con el problema de la paliza y comencé a deshabilitar los modos menores. Nada ayudó. Luego configuré ambas funciones de cambio en cero e incluso esto no resolvió el problema.

Maté y volví a abrir el búfer y el reemplazo está funcionando como se esperaba nuevamente.

¿Me falta alguna otra variable o función que pueda causar este problema?

Respuesta:

lsp-on-change probablemente se conecta a un servidor (Protocolo de servidor de idioma) en cada cambio:

https://github.com/emacs-lsp/lsp-mode/blob/9b5511dbf187348d00be8815d5b7533732f164d6/lsp-mode.el#L1658

c-after-change doc en los comentarios, extracto:

A veces podemos obtener dos llamadas consecutivas a after-change-functions sin una llamada intermedia a before-change-functions al revertir el búfer (ver error # 24094). Cualquiera sea la causa, suponga que todo el búfer ha cambiado.

Entonces, debido a una gran cantidad de contexto de tiempo de ejecución desconocido, puede ser frágil.

Una solución para investigar o mejorar sería la creación de envoltorios personalizados alrededor de las funciones de reemplazo , deshabilitando las funciones after-change-functions durante la ejecución de esas funciones.
En gancho de c-mode :

(defun my-query-replace-regexp ()
  (interactive)
  (let ((after-change-functions nil)) ; empty when executing this func
    (call-interactively 'query-replace-regexp)))

(define-key c-mode-map (kbd "C-M-%") 'my-query-replace-regexp)

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım