`delete-duplicate-lines`가 빈 줄과 특정 단어를 무시하게하십시오.


9

조직 모드에서 텍스트를 편집하고 있습니다. 같은 주제의 다른 파일의 일부가 여러 줄에 있기 때문에 여러 줄이 반복됩니다.

delete-duplicate-lines반복되는 줄을 삭제하는 데 사용하고 싶지만 명령으로 빈 줄도 제거합니다. 빈 줄도 원하지 않습니다 (그렇지 않으면 단락이 없습니다!). "Resume" 과 같이 한 줄로만 존재하는 특정 단어를 무시하고 싶습니다 . 텍스트에서 여러 번 반복되지만 필요하므로 계속 유지하고 싶습니다.

답변:


5

빈 줄 무시

delete-duplicate-lines빈 줄을 무시하여 무시하도록 지시 할 수 있습니다.

C-u C-u C-u M-x delete-duplicate-lines RET

C-u을 호출 할 때 여러 번 delete-duplicate-lines누르지 않으려면 사용자 지정 명령으로 래핑하고 해당 명령을 선택한 키 시퀀스에 바인딩 할 수 있습니다.

(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)

정규 표현식과 일치하는 줄 무시

귀하의 질문의 두 번째 부분은 기본 제공 버전을 사용하여 원하는 것을 얻을 수 있다고 생각하지 않습니다 delete-duplicate-lines. 그러나 수정 된 버전의 명령을 사용할 수 있습니다 (기본적으로 빈 줄도 유지됨).

(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))

이 버전은 delete-duplicate-lines정규 표현식을 요구하고 정규 표현식과 일치하는 모든 줄을 유지합니다. 예를 들어, 모든 줄을 단어로 구성하려면 Resume다음을 수행하십시오.

M-x delete-duplicate-lines RET ^Resume$ RET

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.