[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: creating a function that works for active region or whole buffer
From: |
Luca Ferrari |
Subject: |
Re: creating a function that works for active region or whole buffer |
Date: |
Wed, 23 Jan 2013 08:43:01 +0100 |
Ops...right answer to the wrong thread, sorry!
However below my function that is a simple indent behavior
(suggestions are welcome):
defun dataflex-indent-region-or-buffer ()
"This function indents the whole buffer or, in the case a region is
active, the active region."
(interactive)
(let ( (current-block-end-line 0 ) (current-block-start-line 0)
(current-indentation-step 0) (next-line-indentation-step 0) )
(progn
;; if using a region indent only such region, otherwise the whole buffer
(if (use-region-p)
;; using a region...
(setq current-block-start-line (line-number-at-pos
(region-beginning) )
current-block-end-line (line-number-at-pos (region-end) ) )
;; ...else use the whole buffer
(setq current-block-start-line (line-number-at-pos (point-min) )
current-block-end-line (line-number-at-pos (point-max) ) ) )
;; go to the starting line
(goto-line current-block-start-line)
;; go to the beginning of the line
(beginning-of-line)
(while (<= current-block-start-line current-block-end-line )
(if (looking-at "^[ \t]*\\(IF\\|WHILE\\|BEGIN\\|LOOP\\)")
;; the BEGIN line has to be indented at the current level,
and the next
;; line at a deeper level
(setq next-line-indentation-step (+ current-indentation-step
dataflex-mode-indent-step) )
;; else if looking at an END line remove the indentation
(if (looking-at "^[ \t]*\\(END\\|RETURN\\|ABORT\\)")
(progn
(setq current-indentation-step (-
current-indentation-step dataflex-mode-indent-step) )
(setq next-line-indentation-step current-indentation-step ) )
;; else if this is a label line reset the indentation
(if (looking-at "^[ \t]*\\(.+\\):[ \t\n]*")
(setq current-indentation-step 0
next-line-indentation-step dataflex-mode-indent-step-labels) ) ) )
;; security check: do not indent at negative offset
(if (< current-indentation-step 0 )
(setq current-indentation-step 0) )
(if (< next-line-indentation-step 0 )
(setq next-line-indentation-step 0 ) )
;; do the indent of the current line and go forward
(indent-line-to current-indentation-step)
(setq current-indentation-step next-line-indentation-step)
(setq current-block-start-line (1+ current-block-start-line))
(forward-line 1) ) ) ) )
Re: creating a function that works for active region or whole buffer, Mark Skilbeck, 2013/01/22