--- rect-orig.el 2023-01-31 17:25:08.498658466 +0300 +++ rect-patched.el 2023-02-02 20:21:11.041198925 +0300 @@ -144,11 +144,18 @@ ;;; Rectangle operations. +(defvar rectangle-select-skip-line nil + "Control the `apply-on-rectangle' execution. +`nil' -- apply action to selected lines, `t' -- skip empty lines, +`function' -- skip line if it return non-`nil'. +The function get 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. +The `rectangle-select-skip-line' variable allow to skip lines. The final point after the last operation will be returned." (save-excursion (let* ((cols (rectangle--pos-cols start end)) @@ -166,7 +173,14 @@ (goto-char startpt) (while (progn - (apply function startcol endcol args) + (when (cond + ((null rectangle-select-skip-line) + t) + ((functionp rectangle-select-skip-line) + (apply rectangle-select-skip-line 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))))