Sto lavorando a questa piccola funzione che porta la riga successiva alla riga corrente. Voglio aggiungere una funzionalità in modo che se la riga corrente è un commento di riga e la riga successiva è anche un commento di riga, i caratteri del commento vengono rimossi dopo l'azione "pull-up".
Esempio:
Prima
;; comment 1▮
;; comment 2
chiamata M-x modi/pull-up-line
Dopo
;; comment 1▮comment 2
Nota che i ;;
personaggi vengono rimossi prima 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 funzione di cui sopra funziona, ma per il momento, a prescindere dal maggiore-mode, si prenderà in considerazione /
o ;
o #
come un carattere di commento: (looking-at "/\\|;\\|#")
.
Vorrei rendere questa linea più intelligente; specifico della modalità principale.
Soluzione
Grazie alla soluzione di @ericstokes, credo che il seguito ora copra tutti i miei casi d'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
e comment-end
che sono impostate su "/ *" e "* /" in c-mode
(ma non c++-mode
). E c'è c-comment-start-regexp
che corrisponde a entrambi gli stili. Stai eliminando i caratteri finali e quindi l'inizio dopo l'adesione. Ma penso che la mia soluzione sarebbe quella di uncomment-region
, join-line
la comment-region
e lasciare Emacs preoccuparsi di ciò che carattere di commento è ciò.
/* ... */
)?