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)))))
elisp
comment
syntax-table
Kaushal Modi
sumber
sumber
/* ... */
)?comment-start
dancomment-end
string yang diatur ke "/ *" dan "* /" dic-mode
(tetapi tidakc++-mode
). Dan adac-comment-start-regexp
yang cocok dengan kedua gaya. Anda menghapus karakter akhir lalu awal setelah bergabung. Tapi saya pikir solusi saya akanuncomment-region
,join-line
yangcomment-region
dan membiarkan Emacs khawatir tentang apa komentar karakter apa.Jawaban:
Anda dapat memeriksa apakah karakter saat ini adalah komentar karakter dengan menggunakan tabel sintaks:
(looking-at "\\s<")
. Regexp\\s<
akan mencocokkan karakter apa pun dengan sintaks "komentar mulai";\\s>
akan cocok dengan sintaks "komentar akhir".Opsi lain adalah variabel
comment-start
, yang merupakan string yang dimasukkan olehcomment-dwim
dan teman. Biasanya diatur ke karakter mulai komentar ditambah beberapa ruang.sumber
Ada solusi yang lebih sederhana , silakan pelajari kode saya di https://github.com/redguardtoo/evil-nerd-commenter/blob/master/evil-nerd-commenter.el
Saya tidak akan menyalin / menempelkan semua kode di sini. tetapi inilah poin-poin utamanya:
komentar memiliki wajah font sendiri, cari font-lock-comment-face dan font-lock-comment-delimiter-face dalam kode saya
gunakan API Emacs sendiri untuk menghapus komentar pada baris kedua, lalu bergabung dengan baris pertama
Ini harus bekerja pada mode utama yang masuk akal.
Trik ini tidak saya temukan. Ini sebenarnya dari kode Emacs sendiri, (lebih khusus, flyspell). Jadi solusinya harus mendukung semua dukungan mode terbang utama mode
sumber
Jika Anda mencari fitur ini untuk kode lisp (Elisp, Clojure, Skema dan Common Lisp), maka Anda harus mencoba lispy , sebuah fungsi yang disebut
lispy-fill
melakukan hal semacam ini.Jika Anda mencari fitur ini untuk bahasa lain, maka Anda harus rebox2 (diverifikasi untuk
C
danPython
), fungsi yang disebutrebox-fill
atau fungsi lain yang disebutrebox-dwim
melakukan hal semacam ini.Keduanya adalah paket yang bagus, dan tidak saling bertentangan karena keduanya digunakan untuk mode-mode utama yang berbeda, dan keduanya (
lispy-fill
danrebox-dwim
) terikatM-q
, cukup rapi.sumber