Cómo editar elisp sin perderse entre paréntesis

Pregunta:

Estoy modificando un código elisp de linum.el:

(custom-set-variables '(linum-format 'dynamic))
(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

Pude corregir un error en el que la sangría estaba desviada por uno modificando (count-lines (point-min) (point-max)) a (+ (count-lines (point-min) (point-max)) 1) . Eso fue fácil.

Pero ahora quiero modificarlo para que el ancho mínimo sea 2 agregando un if-conditional where (concat " %" (number-to-string w) "2d ") si el número de línea es <10.

¡Esto debería ser fácil! Agregue un condicional y copie / pegue el concat. Trozo de pastel, ¿verdad? Quiero decir, sé lo que se supone que debo hacer, pero rara vez toco elisp y siempre me intimida cuando tengo que modificar algo con muchos paréntesis.

El estilo "correcto", por lo que tengo entendido, es estructurar el código en función de la sangría y envolver el paréntesis al final de una línea en lugar de hacerlo solo. Viniendo de otros lenguajes de estilo 'C', lucho tanto con la lectura como con la escritura de código de esta manera. Entonces mi pregunta es: ¿qué estoy haciendo mal? ¿Cómo se supone que debo editar elisp y navegar por el código de modo que no tenga que sentarme allí y contar cada paréntesis?

Cuando trabajo con algo en elisp que se vuelve demasiado profundo, tengo que cerrar la puerta, tirar de las persianas y comenzar a colocar el paréntesis al estilo K & R para que no solo pueda leer, sino modificar la maldita cosa sin asustarme.

Obviamente estoy haciendo todo mal. ¿Cómo puedo tocar elisp así sin miedo?

Tenga en cuenta que mi pregunta es cómo navegar y editar elisp, no como una pregunta de estilo. Ya estoy usando lo siguiente como guía de estilo: https://github.com/bbatsov/emacs-lisp-style-guide

Actualizaciones:

Cómo formatear correctamente elisp antes de avergonzarse en emacs.stackexchange:

Marque su elisp y realice Mx indent-region .

La solución del problema:

Para aquellos que quieran saber cómo realizar una justificación a la derecha para linum con un ancho mínimo de dos, aquí está la solución:

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (if (> w 1)
                           (concat " %" (number-to-string w) "d ")
                         " %2d ")))
    ad-do-it))

Respuesta:

Hay una serie de paquetes complementarios que pueden ayudar, como paredit, smartparens y lispy. Estos paquetes facilitan la navegación y la manipulación del código lisp para que pueda pensar en expresiones-s y dejar que el editor se preocupe por equilibrar los parens.

Emacs también tiene muchos comandos incorporados para manejar sexps y listas que vale la pena aprender y pueden ayudarlo a acostumbrarse más a la estructura del código lisp. Por lo general, están vinculados con un prefijo CM- , como:

  • CMf / CMb para avanzar / retroceder por sexp
  • CMn / CMp para avanzar / retroceder por lista
  • CMu / CMd para subir / bajar un nivel
  • CMt para intercambiar los dos sexps alrededor del punto
  • CMk para matar a un sexp
  • CM-SPC para marcar un sexp
  • CMq para volver a sangrar un sexp

El código de ejemplo que proporcionó podría ser más claro si corrige la sangría: ponga el punto al principio de (defadvice... y CMq para volver a sangrar toda la expresión. Para reemplazar la (concat... comenzaría poniendo apunte al comienzo de ese sexp y CMo para dividir la línea mientras conserva la sangría. Luego agregue su (if... , y use los comandos anteriores para saltar al final de una lista para agregar otro par de cierre, de regreso al comenzando a volver a sangrar, etc.

Es posible que también desee activar el modo show-paren-mode , que resaltará los pares correspondientes cuando el punto esté al principio o al final de una lista. Es posible que prefiera resaltar toda la expresión en lugar de los pares coincidentes, así que intente personalizar el estilo show-paren-style .

Como @Tyler mencionó en los comentarios sobre otra respuesta, debe consultar el manual para obtener más información sobre estos y los comandos relacionados.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım