;;; -*- lexical-binding: t -*- ;; ;; DWIM code helpers and examples. ;; ;; Advantages: ;; ;; - the same default interactively and from Lisp ;; - the default is the whole buffer ;; - the region is never used from Lisp ;; - the variables are always set, to default fallback if not explicitly ;; - one can have preceding, non-optional arguments ;; ;; -------------------------------------------------------------------------- (require 'luki-lisp) ;; -------------------------------------------------------------------------- (-> 'cl-lib) ;; -------------------------------------------------------------------------- (defun use-region () (if (use-region-p) (list (region-beginning) (region-end)) (list nil nil))) ;; -------------------------------------------------------------------------- (defun test-dwim (&optional beg end) (interactive (use-region)) (or beg (setq beg (point-min))) (or end (setq end (point-max))) ($ "%d %d" beg end)) (defun test-dwim-2 (re &optional beg end) (interactive `(,(read-regexp "regexp: ") ,@(use-region))) (or beg (setq beg (point-min))) (or end (setq end (point-max))) ($ "%s %d %d" re beg end)) ;; -------------------------------------------------------------------------- (defun replace-regexp-dwim (re rep &optional beg end not-rev) (interactive `(,(read-string "re: ") ,(read-string "replace: ") ,@(use-region) ,current-prefix-arg)) (or beg (setq beg (point-min))) (or end (setq end (point-max))) (pcase-let ((`(,strt ,sfun ,stop) (if not-rev (list beg #'re-search-forward end) (list end #'re-search-backward beg)))) (cl-loop initially do (goto-char strt) with c = 0 while (apply sfun re stop '(t)) do (replace-match rep) (++ c) finally do (goto-char strt) finally return c))) (defalias 'rr #'replace-regexp-dwim) ;; -------------------------------------------------------------------------- (provide 'll-dwim)