Je travaille sur cette petite fonction qui tire la ligne suivante vers la ligne actuelle. Je veux ajouter une fonctionnalité de sorte que si la ligne actuelle est un commentaire de ligne et la ligne suivante est également un commentaire de ligne, les caractères de commentaire sont supprimés après l'action "pull-up".
Exemple:
Avant
;; comment 1▮
;; comment 2
Appel M-x modi/pull-up-line
Après
;; comment 1▮comment 2
Notez que les ;;
caractères sont supprimés avant 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 fonction ci - dessus fonctionne , mais pour l' instant, quel que soit le principal mode, il considérera /
ou ;
ou #
comme caractère de commentaire: (looking-at "/\\|;\\|#")
.
Je voudrais rendre cette ligne plus intelligente; spécifique au mode majeur.
Solution
Grâce à la solution de @ericstokes, je pense que ce qui suit couvre désormais tous mes cas d'utilisation :)
(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
et comment-end
qui sont définies sur "/ *" et "* /" dans c-mode
(mais pas c++-mode
). Et il y a c-comment-start-regexp
cela qui correspond aux deux styles. Vous supprimez les caractères de fin puis le début après avoir rejoint. Mais je pense que ma solution serait uncomment-region
, join-line
le comment-region
et laissez Emacs vous inquiétez pas au sujet de ce caractère de commentaire est quoi.
/* ... */
)?