[climacs-cvs] CVS climacs
thenriksen
thenriksen at common-lisp.net
Sun Mar 26 14:14:48 UTC 2006
Update of /project/climacs/cvsroot/climacs
In directory clnet:/tmp/cvs-serv14986
Modified Files:
packages.lisp misc-commands.lisp lisp-syntax-commands.lisp
base.lisp
Log Message:
Added region- and expression-indentation commands.
--- /project/climacs/cvsroot/climacs/packages.lisp 2006/03/25 21:15:21 1.86
+++ /project/climacs/cvsroot/climacs/packages.lisp 2006/03/26 14:14:48 1.87
@@ -57,6 +57,7 @@
(defpackage :climacs-base
(:use :clim-lisp :climacs-buffer)
(:export #:do-buffer-region
+ #:do-buffer-region-lines
#:previous-line #:next-line
#:open-line #:kill-line
#:empty-line-p
@@ -73,6 +74,7 @@
#:upcase-word #:downcase-word #:capitalize-word
#:tabify-region #:untabify-region
#:indent-line
+ #:indent-region
#:delete-indentation
#:fill-line
#:input-from-stream #:output-to-stream
--- /project/climacs/cvsroot/climacs/misc-commands.lisp 2006/03/03 19:38:57 1.4
+++ /project/climacs/cvsroot/climacs/misc-commands.lisp 2006/03/26 14:14:48 1.5
@@ -531,6 +531,30 @@
'indent-table
'((#\j :control)))
+(defun indent-region (pane mark1 mark2)
+ "Indent all lines in the region delimited by `mark1' and `mark2'
+ according to the rules of the active syntax in `pane'."
+ (let* ((buffer (buffer pane))
+ (view (stream-default-view pane))
+ (tab-space-count (tab-space-count view))
+ (tab-width (and (climacs-pane:indent-tabs-mode buffer)
+ tab-space-count))
+ (syntax (climacs-syntax:syntax buffer)))
+ (do-buffer-region-lines (line mark1 mark2)
+ (let ((indentation (climacs-syntax:syntax-line-indentation
+ line
+ tab-space-count
+ syntax)))
+ (indent-line line indentation tab-width)))))
+
+(define-command (com-indent-region :name t :command-table indent-table) ()
+ "Indent every line of the current region as specified by the
+syntax for the buffer."
+ (let* ((pane (current-window))
+ (point (point pane))
+ (mark (mark pane)))
+ (indent-region pane point mark)))
+
(define-command (com-delete-indentation :name t :command-table indent-table) ()
(delete-indentation (point (current-window))))
--- /project/climacs/cvsroot/climacs/lisp-syntax-commands.lisp 2006/03/15 17:17:48 1.3
+++ /project/climacs/cvsroot/climacs/lisp-syntax-commands.lisp 2006/03/26 14:14:48 1.4
@@ -32,25 +32,42 @@
(define-command (com-eval-defun :name t :command-table lisp-table) ()
(let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
+ (point (point pane))
+ (syntax (syntax (buffer pane))))
(eval-defun point syntax)))
(esa:set-key 'com-eval-defun
- 'lisp-table
- '((#\x :control :meta)))
+ 'lisp-table
+ '((#\x :control :meta)))
(define-command (com-package :name t :command-table lisp-table) ()
(let* ((pane (current-window))
- (syntax (syntax (buffer pane)))
- (package (climacs-lisp-syntax::package-of syntax)))
+ (syntax (syntax (buffer pane)))
+ (package (climacs-lisp-syntax::package-of syntax)))
(esa:display-message (format nil "~A" (if (packagep package)
- (package-name package)
- package)))))
+ (package-name package)
+ package)))))
(define-command (com-fill-paragraph :name t :command-table lisp-table) ()
)
(esa:set-key 'com-fill-paragraph
- 'lisp-table
- '((#\q :meta)))
\ No newline at end of file
+ 'lisp-table
+ '((#\q :meta)))
+
+(define-command (com-indent-expression :name t :command-table lisp-table)
+ ((count 'integer :prompt "Number of expressions"))
+ (let* ((pane (current-window))
+ (point (point pane))
+ (mark (clone-mark point))
+ (syntax (syntax (buffer pane)))
+ (view (stream-default-view pane))
+ (tab-space-count (tab-space-count view)))
+ (if (plusp count)
+ (loop repeat count do (forward-expression mark syntax))
+ (loop repeat (- count) do (backward-expression mark syntax)))
+ (indent-region pane (clone-mark point) mark)))
+
+(esa:set-key `(com-indent-expression ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\q :meta :control)))
\ No newline at end of file
--- /project/climacs/cvsroot/climacs/base.lisp 2005/08/27 22:07:45 1.45
+++ /project/climacs/cvsroot/climacs/base.lisp 2006/03/26 14:14:48 1.46
@@ -41,6 +41,27 @@
(loop for ,offset from ,offset1 below ,offset2
do , at body)))
+(defmacro do-buffer-region-lines ((line-var mark1 mark2) &body body)
+ "Iterate over the lines in the region delimited by `mark1' and `mark2'.
+ For each line, `line-var' will be bound to a mark positioned
+ at the beginning of the line and `body' will be executed. Note
+ that the iteration will always start from the mark specifying
+ the earliest position in the buffer."
+ (let ((mark-sym (gensym))
+ (mark2-sym (gensym)))
+ `(progn
+ (when (mark< ,mark2 ,mark1)
+ (rotatef ,mark1 ,mark2))
+ (let ((,mark-sym (clone-mark ,mark1))
+ (,mark2-sym (clone-mark ,mark2)))
+ (loop while (mark<= ,mark-sym ,mark2-sym)
+ do
+ (let ((,line-var (clone-mark ,mark-sym)))
+ , at body)
+ (end-of-line ,mark-sym)
+ (unless (end-of-buffer-p ,mark-sym)
+ (forward-object ,mark-sym)))))))
+
(defmethod previous-line (mark &optional column (count 1))
"Move a mark up COUNT lines conserving horizontal position."
(unless column
More information about the Climacs-cvs
mailing list