Bỏ qua các dòng trống
Bạn có thể nói delete-duplicate-lines
bỏ qua các dòng trống bằng cách gọi qua
C-u C-u C-u M-x delete-duplicate-lines
RET
Nếu bạn không muốn phải đánh C-unó nhiều lần khi bạn gọi delete-duplicate-lines
, bạn có thể gói nó trong một lệnh tùy chỉnh và liên kết lệnh đó với một chuỗi khóa bạn chọn:
(defun delete-duplicate-lines-keep-blanks ()
(interactive)
(delete-duplicate-lines (region-beginning) (region-end) nil nil t))
(global-set-key (kbd "C-c d") 'delete-duplicate-lines-keep-blanks)
Bỏ qua các dòng khớp với biểu thức chính
Đối với phần thứ hai của câu hỏi của bạn, tôi không nghĩ bạn có thể đạt được những gì bạn muốn bằng phiên bản tích hợp sẵn delete-duplicate-lines
. Tuy nhiên, bạn có thể sử dụng một phiên bản sửa đổi của lệnh (cũng giữ các dòng trống theo mặc định):
(defun delete-duplicate-lines
(beg end keep &optional reverse adjacent keep-blanks interactive)
(interactive
(progn
(barf-if-buffer-read-only)
(list (region-beginning) (region-end)
(read-string "Keep lines matching regexp: ") ; Prompt for regexp to keep
(equal current-prefix-arg '(4))
(equal current-prefix-arg '(16))
t ; Keep blanks by default
t)))
(let ((lines (unless adjacent (make-hash-table :test 'equal)))
line prev-line
(count 0)
(beg (copy-marker beg))
(end (copy-marker end)))
(save-excursion
(goto-char (if reverse end beg))
(if (and reverse (bolp)) (forward-char -1))
(while (if reverse
(and (> (point) beg) (not (bobp)))
(and (< (point) end) (not (eobp))))
(setq line (buffer-substring-no-properties
(line-beginning-position) (line-end-position)))
(if (or (and keep-blanks (string= "" line))
(string-match keep line)) ; Ignore line if it
; matches regexp to keep
(forward-line 1)
(if (if adjacent (equal line prev-line) (gethash line lines))
(progn
(delete-region (progn (forward-line 0) (point))
(progn (forward-line 1) (point)))
(if reverse (forward-line -1))
(setq count (1+ count)))
(if adjacent (setq prev-line line) (puthash line t lines))
(forward-line (if reverse -1 1))))))
(set-marker beg nil)
(set-marker end nil)
(when interactive
(message "Deleted %d %sduplicate line%s%s"
count
(if adjacent "adjacent " "")
(if (= count 1) "" "s")
(if reverse " backward" "")))
count))
Phiên bản delete-duplicate-lines
này sẽ nhắc bạn về một biểu thức chính quy và giữ tất cả các dòng khớp với biểu thức chính. Ví dụ: để giữ tất cả các dòng bao gồm từ Resume
bạn sẽ làm:
M-x delete-duplicate-lines
RET ^Resume$
RET