Tôi đang làm việc với chức năng nhỏ này kéo dòng tiếp theo lên dòng hiện tại. Tôi muốn thêm một chức năng để nếu dòng hiện tại là một nhận xét dòng và dòng tiếp theo cũng là một nhận xét dòng, thì các ký tự nhận xét sẽ bị xóa sau hành động "kéo lên".
Thí dụ:
Trước
;; comment 1▮
;; comment 2
Gọi điện thoại M-x modi/pull-up-line
Sau
;; comment 1▮comment 2
Lưu ý rằng các ;;
ký tự được loại bỏ trước đó 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)))))
Hàm trên hoạt động nhưng hiện tại, bất kể chế độ chính, nó sẽ xem xét /
hoặc ;
hoặc #
là một ký tự nhận xét : (looking-at "/\\|;\\|#")
.
Tôi muốn làm cho dòng này thông minh hơn; chế độ chính cụ thể.
Giải pháp
Nhờ giải pháp của @ericstokes, tôi tin rằng hiện tại bên dưới bao gồm tất cả các trường hợp sử dụng của tôi :)
(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
và comment-end
chuỗi được đặt thành "/ *" và "* /" trong c-mode
(nhưng không c++-mode
). Và có c-comment-start-regexp
phù hợp với cả hai phong cách. Bạn xóa các ký tự kết thúc sau đó bắt đầu sau khi tham gia. Nhưng tôi nghĩ rằng giải pháp của tôi sẽ được uncomment-region
, join-line
các comment-region
và để cho Emacs lo lắng về những gì bình luận nhân vật là gì.
/* ... */
) không?