Saya sedang mengerjakan fungsi kecil ini yang menarik baris berikutnya ke baris saat ini. Saya ingin menambahkan fungsionalitas sehingga jika baris saat ini adalah komentar baris dan baris berikutnya juga merupakan komentar baris, maka karakter komentar akan dihapus setelah tindakan "pull-up".
Contoh:
Sebelum
;; comment 1▮
;; comment 2
Panggilan M-x modi/pull-up-line
Setelah
;; comment 1▮comment 2
Perhatikan bahwa ;;
karakter dihapus yang sebelumnya 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)))))
Fungsi di atas bekerja tetapi untuk sekarang, terlepas dari besar-mode, itu akan mempertimbangkan /
atau ;
atau #
sebagai karakter komentar: (looking-at "/\\|;\\|#")
.
Saya ingin membuat garis ini lebih cerdas; khusus mode utama.
Larutan
Berkat solusi @ericstokes, saya percaya bahwa di bawah ini sekarang mencakup semua kasus penggunaan saya :)
(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
dan comment-end
string yang diatur ke "/ *" dan "* /" di c-mode
(tetapi tidak c++-mode
). Dan ada c-comment-start-regexp
yang cocok dengan kedua gaya. Anda menghapus karakter akhir lalu awal setelah bergabung. Tapi saya pikir solusi saya akan uncomment-region
, join-line
yang comment-region
dan membiarkan Emacs khawatir tentang apa komentar karakter apa.
/* ... */
)?