elisp – ¿Cómo puedo detectar si el carácter actual es un carácter de comentario para ese modo principal?

Pregunta:

Estoy trabajando en esta pequeña función que abre la siguiente línea a la línea actual. Quiero agregar una funcionalidad para que si la línea actual es un comentario de línea y la siguiente línea también es un comentario de línea, entonces los caracteres de comentario se eliminan después de la acción "pull-up".

Ejemplo:

Antes

;; comment 1▮
;; comment 2

Llamando a Mx modi/pull-up-line

Después

;; comment 1▮comment 2

Tenga en cuenta que ;; Se eliminan los caracteres que estaban antes del comment 2 .

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      (while (looking-at "/\\|;\\|#")
        (delete-forward-char 1))
      (when (looking-at "\\s-")
        (delete-forward-char 1)))))

La función anterior funciona, pero por ahora, independientemente del modo principal, considerará / o ; o # como carácter de comentario: (looking-at "/\\|;\\|#") .

Me gustaría hacer esta línea más inteligente; específico del modo principal.

Solución

Gracias a la solución de @ericstokes, creo que lo siguiente ahora cubre todos mis casos de uso 🙂

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      ;; Delete all comment-start or space characters
      (while (looking-at (concat "\\s<" ; comment-start char as per syntax table
                                 "\\|" (substring comment-start 0 1) ; first char of `comment-start'
                                 "\\|" "\\s-")) ; extra spaces
        (delete-forward-char 1)))))

Respuesta:

Puede comprobar si el carácter actual es un carácter de comentario utilizando la tabla de sintaxis: (looking-at "\\s<") . La expresión regular \\s< coincidirá con cualquier carácter con la sintaxis de "inicio de comentario"; \\s> coincidirá con aquellos con sintaxis de "final de comentario".

Otra opción es la variable comment-start , que es la cadena insertada por comment-dwim y friends. Por lo general, se establece en el carácter de inicio de comentario más algo de espacio.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım