faire `delete-duplicate-lines` ignorer les lignes vides et certains mots

9

Je modifie un texte en mode org, plusieurs lignes sont répétées car elles faisaient partie de différents fichiers du même sujet.

Je veux utiliser delete-duplicate-linespour supprimer les lignes répétées, cependant, la commande supprime également les lignes vides, ce que je ne veux pas (sinon je n'aurais pas de paragraphes!). Je veux ignorer certains mots qui existent seuls dans les lignes, par exemple, "Reprendre" , il est répété beaucoup de fois dans le texte, mais je veux le garder car il est requis.

shackra
la source

Réponses:

5

Ignorer les lignes vides

Vous pouvez dire delete-duplicate-linesd'ignorer les lignes vides en l'appelant via

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

Si vous ne voulez pas avoir à frapper C-uautant de fois lorsque vous appelez delete-duplicate-lines, vous pouvez l'encapsuler dans une commande personnalisée et lier cette commande à une séquence de touches de votre choix:

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

Ignorer les lignes correspondant à l'expression rationnelle

Quant à la deuxième partie de votre question, je ne pense pas que vous puissiez obtenir ce que vous voulez en utilisant la version intégrée de delete-duplicate-lines. Vous pouvez cependant utiliser une version modifiée de la commande (qui conserve également les lignes vides par défaut):

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

Cette version de delete-duplicate-linesvous demandera une expression rationnelle et conservera toutes les lignes qui correspondent à l'expression rationnelle. Par exemple, pour conserver toutes les lignes composées du mot que Resumevous feriez:

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

itsjeyd
la source