Estoy trabajando en esta pequeña función que muestra 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, los caracteres de comentario se eliminan después de la acción "pull-up".
Ejemplo:
antes de
;; comment 1▮
;; comment 2
Vocación M-x modi/pull-up-line
Después
;; comment 1▮comment 2
Tenga en cuenta que ;;
se eliminan los caracteres que estaban antes 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 de la major-mode, se tendrá en cuenta /
o ;
, o #
como un carácter de comentario: (looking-at "/\\|;\\|#")
.
Me gustaría hacer esta línea más inteligente; modo mayor específico.
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)))))
comment-start
y comment-end
que se establecen en "/ *" y "* /" en c-mode
(pero no c++-mode
). Y hay c-comment-start-regexp
que coincide con ambos estilos. Elimina los caracteres finales y luego el comienzo después de unirse. Pero creo que mi solución sería uncomment-region
, join-line
el comment-region
y dejo que Emacs se preocupe por lo que carácter de comentario es qué.
/* ... */
)?