--- rect-orig.el 2023-01-31 17:25:08.498658466 +0300 +++ rect-patched.el 2023-01-31 17:30:02.163121185 +0300 @@ -144,11 +144,16 @@ ;;; Rectangle operations. +(defvar *rectangle-skip-lines* nil + "If `t' -- skip empty lines, if `function' -- skip line when it returns `nil'. +The function gets all arguments of `apply-on-rectangle' as input.") + (defun apply-on-rectangle (function start end &rest args) "Call FUNCTION for each line of rectangle with corners at START, END. FUNCTION is called with two arguments: the start and end columns of the rectangle, plus ARGS extra arguments. Point is at the beginning of line when the function is called. +Application of the FUNCTION is affected by the `*rectangle-skip-lines*'. The final point after the last operation will be returned." (save-excursion (let* ((cols (rectangle--pos-cols start end)) @@ -166,7 +171,14 @@ (goto-char startpt) (while (progn - (apply function startcol endcol args) + (when (cond + ((null *rectangle-skip-lines*) + t) + ((functionp *rectangle-skip-lines*) + (apply *rectangle-skip-lines* function start end args)) + (t + (not (string-match-p "\\`\\s-*$" (thing-at-point 'line))))) + (apply function startcol endcol args)) (setq final-point (point)) (and (zerop (forward-line 1)) (bolp) (<= (point) endpt))))