indentation – cambiar la sangría del paquete de uso

Pregunta:

Me gustaría cambiar el estilo de sangría de use-package para que se vea más distinguible, (más o menos) similar al siguiente estilo de sangría:

(use-package foo
  :commands (gah)
  :init (setq f 1)
        (blubb g 2)

  :config
    (blah h 3)
    (moo i 4))

Esto significa que las palabras clave deben tener una sangría normal, pero todas las opciones siguientes para dicha palabra clave deben tener una sangría un poco mayor y deben alinearse verticalmente.


Ya sé que es posible definir una función para calcular la columna de sangría actual. De forma predeterminada, se establece en sangría defun estándar:

(get 'use-package 'lisp-indent-function)
; → defun

La siguiente definición de función y configuración de propiedad cambia eso, pero lucho con los detalles de implementación de la función my-use-package-indent-function .

(defun my-use-package-indent-function (indent-point state)
  (let* ((normal-indent (current-column))
        (indent-offset (progn (back-to-indentation)
                              (current-column))))
    (goto-char indent-point)
    (back-to-indentation)
    (if (eq ?: (char-after))
        (+ indent-offset 2)
      (+ indent-offset 5))))
(put 'use-package 'lisp-indent-function #'my-use-package-indent-function)

Arriba hay una versión ingenua e incompleta, pero ¿cómo calcular correctamente el valor de sangría?

Respuesta:

Como a nadie se le ocurrió una respuesta, seguí con el depurador a través del proceso de sangría y se me ocurrió el siguiente código.

(defun my--use-package-indent-function (indent-point state)
  "custom indentation rules for use-package s-exps.

`;;!' indents to same level as keywords
for some reason `;;;' won't be indented at all"
  (let ((indent-offset (progn (back-to-indentation)
                              (current-column))))
    (goto-char indent-point)
    (back-to-indentation)
    (cond ((eq ?: (char-after))
           (+ indent-offset 2))
          ((and (eq ?\; (char-after)) (eq ?! (char-after (+ (point) 2))))
           (+ indent-offset 2))
          ((eq ?\) (char-after))
           (+ indent-offset 2))
          ((eq ?: (progn (backward-sexp)
                         (char-after)))
           (+ indent-offset (+ 2 4)))
          (t (current-column )))))

(put 'use-package 'lisp-indent-function #'my--use-package-indent-function)

Parece funcionar, pero no estoy seguro de cuán robusto es este código.

¡Las mejores implementaciones son bienvenidas!

Editar : el siguiente código configura la sangría eléctrica para activarse en ':', por lo que las palabras clave se sangrarán justo en la inserción.

(setq electric-indent-chars (append electric-indent-chars '(?:)))

Leave a Comment

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

Scroll to Top

web tasarım