Update of /project/climacs/cvsroot/climacs
In directory clnet:/tmp/cvs-serv23493
Modified Files:
ttcn3-syntax.lisp text-syntax.lisp syntax.lisp slidemacs.lisp
search-commands.lisp prolog-syntax.lisp packages.lisp
misc-commands.lisp lisp-syntax.lisp lisp-syntax-commands.lisp
html-syntax.lisp gui.lisp fundamental-syntax.lisp
file-commands.lisp climacs.asd cl-syntax.lisp buffer.lisp
base.lisp
Added Files:
motion.lisp motion-commands.lisp editing.lisp
editing-commands.lisp
Log Message:
Major motion and editing functions and commands refactoring (see the
thread "paredit.lisp, regularization of motion commands, and more" on
climacs-devel for full details).
Breakage not found during testing, but still expected.
--- /project/climacs/cvsroot/climacs/ttcn3-syntax.lisp 2006/05/06 19:51:04 1.5
+++ /project/climacs/cvsroot/climacs/ttcn3-syntax.lisp 2006/06/12 19:10:58 1.6
@@ -372,7 +372,7 @@
(incf valid-parse))))
(defmethod inter-lexeme-object-p ((lexer ttcn3-lexer) object)
- (whitespacep object))
+ (whitespacep (syntax (buffer lexer)) object))
(defmethod update-syntax (buffer (syntax ttcn3-syntax))
(with-slots (lexer valid-parse) syntax
@@ -392,7 +392,8 @@
(let ((space-width (space-width pane))
(tab-width (tab-width pane)))
(loop while (and (< start end)
- (whitespacep (buffer-object buffer start)))
+ (whitespacep (syntax buffer)
+ (buffer-object buffer start)))
do (ecase (buffer-object buffer start)
(#\Newline (terpri pane)
(setf (aref *cursor-positions* (incf *current-line*))
--- /project/climacs/cvsroot/climacs/text-syntax.lisp 2005/08/06 20:51:19 1.9
+++ /project/climacs/cvsroot/climacs/text-syntax.lisp 2006/06/12 19:10:58 1.10
@@ -148,16 +148,17 @@
(incf pos1))
(t nil))))))))
-(defmethod backward-paragraph (mark (syntax text-syntax))
+(defmethod backward-one-paragraph (mark (syntax text-syntax))
(with-slots (paragraphs) syntax
(let ((pos1 (index-of-mark-after-offset paragraphs (offset mark))))
(when (> pos1 0)
(setf (offset mark)
(if (typep (element* paragraphs (1- pos1)) 'right-sticky-mark)
(offset (element* paragraphs (- pos1 2)))
- (offset (element* paragraphs (1- pos1)))))))))
+ (offset (element* paragraphs (1- pos1)))))
+ t))))
-(defmethod forward-paragraph (mark (syntax text-syntax))
+(defmethod forward-one-paragraph (mark (syntax text-syntax))
(with-slots (paragraphs) syntax
(let ((pos1 (index-of-mark-after-offset
paragraphs
@@ -168,16 +169,18 @@
(setf (offset mark)
(if (typep (element* paragraphs pos1) 'left-sticky-mark)
(offset (element* paragraphs (1+ pos1)))
- (offset (element* paragraphs pos1))))))))
+ (offset (element* paragraphs pos1))))
+ t))))
- (defmethod backward-sentence (mark (syntax text-syntax))
+ (defmethod backward-one-sentence (mark (syntax text-syntax))
(with-slots (sentence-beginnings) syntax
(let ((pos1 (index-of-mark-after-offset sentence-beginnings (offset mark))))
(when (> pos1 0)
- (setf (offset mark)
- (offset (element* sentence-beginnings (1- pos1))))))))
+ (setf (offset mark)
+ (offset (element* sentence-beginnings (1- pos1))))
+ t))))
- (defmethod forward-sentence (mark (syntax text-syntax))
+ (defmethod forward-one-sentence (mark (syntax text-syntax))
(with-slots (sentence-endings) syntax
(let ((pos1 (index-of-mark-after-offset
sentence-endings
@@ -186,13 +189,14 @@
(1+ (offset mark)))))
(when (< pos1 (nb-elements sentence-endings))
(setf (offset mark)
- (offset (element* sentence-endings pos1)))))))
+ (offset (element* sentence-endings pos1)))
+ t))))
(defmethod syntax-line-indentation (mark tab-width (syntax text-syntax))
(loop with indentation = 0
with mark2 = (clone-mark mark)
until (beginning-of-buffer-p mark2)
- do (previous-line mark2)
+ do (climacs-motion:backward-line mark2 syntax)
(setf indentation (line-indentation mark2 tab-width))
while (empty-line-p mark2)
finally (return indentation)))
--- /project/climacs/cvsroot/climacs/syntax.lisp 2006/06/04 16:21:06 1.65
+++ /project/climacs/cvsroot/climacs/syntax.lisp 2006/06/12 19:10:58 1.66
@@ -50,49 +50,8 @@
(:documentation "Return the correct indentation for the line containing
the mark, according to the specified syntax."))
-(defgeneric forward-expression (mark syntax))
-
-(defgeneric backward-expression (mark syntax))
-
(defgeneric eval-defun (mark syntax))
-(defgeneric beginning-of-definition (mark syntax))
-
-(defgeneric end-of-definition (mark syntax))
-
-(defgeneric backward-paragraph (mark syntax))
-
-(defgeneric forward-paragraph (mark syntax))
-
-(defgeneric backward-sentence (mark syntax))
-
-(defgeneric forward-sentence (mark syntax))
-
-(defgeneric forward-list (mark syntax)
- (:method (mark syntax)
- (error 'no-such-operation)))
-
-(defgeneric backward-list (mark syntax)
- (:method (mark syntax)
- (error 'no-such-operation)))
-
-(defgeneric down-list (mark syntax)
- (:method (mark syntax)
- (error 'no-such-operation)))
-
-(defgeneric backward-down-list (mark syntax)
- (:method (mark syntax)
- (error 'no-such-operation)))
-
-(defgeneric backward-up-list (mark syntax)
- (:method (mark syntax)
- (error 'no-such-operation)))
-
-(defgeneric up-list (mark syntax)
- (:method (mark syntax)
- (error 'no-such-operation)))
-
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Commenting
@@ -298,33 +257,9 @@
(declare (ignore mark tab-width))
0)
-(defmethod forward-expression (mark syntax)
- (error 'no-such-operation))
-
-(defmethod backward-expression (mark syntax)
- (error 'no-such-operation))
-
(defmethod eval-defun (mark syntax)
(error 'no-such-operation))
-(defmethod beginning-of-defintion (mark syntax)
- (error 'no-such-operation))
-
-(defmethod end-of-definition (mark syntax)
- (error 'no-such-operation))
-
-(defmethod backward-paragraph (mark syntax)
- (error 'no-such-operation))
-
-(defmethod forward-paragraph (mark syntax)
- (error 'no-such-operation))
-
-(defmethod backward-sentence (mark syntax)
- (error 'no-such-operation))
-
-(defmethod forward-sentence (mark syntax)
- (error 'no-such-operation))
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Incremental Earley parser
@@ -789,3 +724,34 @@
(defgeneric redisplay-pane-with-syntax (pane syntax current-p))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Querying
+
+(defgeneric word-constituentp (syntax obj)
+ (:documentation "Return T if `obj' is a word constituent
+ character in `syntax'.")
+ (:method (syntax obj)
+ nil)
+ (:method (syntax (obj character))
+ (alphanumericp obj)))
+
+(defgeneric whitespacep (syntax obj)
+ (:documentation "Return T if `obj' is a whitespace character in
+ `syntax'.")
+ (:method (syntax obj)
+ nil)
+ (:method (syntax (obj character))
+ (member obj '(#\Space #\Tab #\Newline #\Page #\Return))))
+
+(defgeneric page-delimiter (syntax)
+ (:documentation "Return the object sequence used as a page
+ deliminter in `syntax'.")
+ (:method (syntax)
+ '(#\Newline #\Page)))
+
+(defgeneric paragraph-delimiter (syntax)
+ (:documentation "Return the object used as a paragraph
+ deliminter in `syntax'.")
+ (:method (syntax)
+ '(#\Newline #\Newline)))
\ No newline at end of file
--- /project/climacs/cvsroot/climacs/slidemacs.lisp 2006/05/06 19:51:04 1.9
+++ /project/climacs/cvsroot/climacs/slidemacs.lisp 2006/06/12 19:10:58 1.10
@@ -363,7 +363,7 @@
nil)
(defmethod inter-lexeme-object-p ((lexer slidemacs-lexer) object)
- (whitespacep object))
+ (whitespacep (syntax (buffer lexer)) object))
(defmethod update-syntax (buffer (syntax slidemacs-editor-syntax))
(with-slots (parser lexer valid-parse) syntax
@@ -389,7 +389,8 @@
(let ((space-width (space-width pane))
(tab-width (tab-width pane)))
(loop while (and (< start end)
- (whitespacep (buffer-object buffer start)))
+ (whitespacep (syntax buffer)
+ (buffer-object buffer start)))
do (ecase (buffer-object buffer start)
(#\Newline (terpri pane)
(setf (aref *cursor-positions* (incf *current-line*))
--- /project/climacs/cvsroot/climacs/search-commands.lisp 2006/05/26 22:41:54 1.6
+++ /project/climacs/cvsroot/climacs/search-commands.lisp 2006/06/12 19:10:58 1.7
@@ -538,11 +538,13 @@
with start = 0
while (< index length)
do (loop until (>= index length)
- while (whitespacep (char contents index))
+ while (whitespacep (syntax buffer)
+ (char contents index))
do (incf index))
(setf start index)
(loop until (>= index length)
- until (whitespacep (char contents index))
+ until (whitespacep (syntax buffer)
+ (char contents index))
do (incf index))
until (= start index)
collecting (string-trim '(#\Space #\Tab #\Newline)
--- /project/climacs/cvsroot/climacs/prolog-syntax.lisp 2006/05/06 19:51:04 1.27
+++ /project/climacs/cvsroot/climacs/prolog-syntax.lisp 2006/06/12 19:10:58 1.28
@@ -302,7 +302,8 @@
(t
(cond
((and (string= string ".")
- (or (whitespacep (object-after scan))
+ (or (whitespacep (syntax (buffer lexer))
+ (object-after scan))
(eql (object-after scan) #\%)))
(return (make-instance 'end-lexeme)))
(t (return (make-instance 'graphic-lexeme))))))
@@ -372,7 +373,8 @@
(when (or (end-of-buffer-p scan)
(let ((object (object-after scan)))
(or (eql object #\%)
- (whitespacep object))))
+ (whitespacep (syntax (buffer lexer))
+ object))))
(bo)
(return (make-instance 'integer-lexeme)))
(loop until (end-of-buffer-p scan)
--- /project/climacs/cvsroot/climacs/packages.lisp 2006/06/06 16:50:36 1.99
+++ /project/climacs/cvsroot/climacs/packages.lisp 2006/06/12 19:10:58 1.100
@@ -32,7 +32,10 @@
#:invalid-motion #:motion-before-beginning #:motion-after-end
#:size #:number-of-lines
#:offset #:mark< #:mark<= #:mark= #:mark> #:mark>=
- #:forward-object #:backward-object
+ #:forward-object
+ #:backward-object
+ #:forward-line-start #:backward-line-start
+ #:forward-line-end #:backward-line-end
#:beginning-of-buffer #:end-of-buffer
#:beginning-of-buffer-p #:end-of-buffer-p
#:beginning-of-line #:end-of-line
@@ -47,44 +50,41 @@
#:buffer-object #:buffer-sequence
#:object-before #:object-after #:region-to-sequence
#:low-mark #:high-mark #:modified-p #:clear-modify
-
#:binseq-buffer #:obinseq-buffer #:binseq2-buffer
#:persistent-left-sticky-mark #:persistent-right-sticky-mark
#:persistent-left-sticky-line-mark #:persistent-right-sticky-line-mark
#:p-line-mark-mixin #:buffer-line-offset
-
#:delegating-buffer #:implementation))
+(defpackage :climacs-kill-ring
+ (:use :clim-lisp :flexichain)
+ (:export #:kill-ring
+ #:kill-ring-length #:kill-ring-max-size
+ #:append-next-p
+ #:reset-yank-position #:rotate-yank-position #:kill-ring-yank
+ #:kill-ring-standard-push #:kill-ring-concatenating-push
+ #:kill-ring-reverse-concatenating-push))
+
(defpackage :climacs-base
- (:use :clim-lisp :climacs-buffer)
+ (:use :clim-lisp :climacs-buffer :climacs-kill-ring)
(:export #:do-buffer-region
#:do-buffer-region-lines
#:previous-line #:next-line
- #:open-line #:kill-line
#:empty-line-p
#:line-indentation
#:buffer-display-column
#:number-of-lines-in-region
- #:constituentp #:whitespacep
+ #:constituentp
#:forward-word #:backward-word
- #:delete-word #:backward-delete-word
#:buffer-region-case
- #:upcase-buffer-region #:upcase-region
- #:downcase-buffer-region #:downcase-region
- #:capitalize-buffer-region #:capitalize-region
- #:upcase-word #:downcase-word #:capitalize-word
- #:tabify-region #:untabify-region
- #:indent-line
- #:indent-region
- #:delete-indentation
- #:fill-line #:fill-region
#:input-from-stream #:output-to-stream
#:name-mixin #:name
#:buffer-looking-at #:looking-at
#:buffer-search-forward #:buffer-search-backward
#:buffer-re-search-forward #:buffer-re-search-backward
#:search-forward #:search-backward
- #:re-search-forward #:re-search-backward))
+ #:re-search-forward #:re-search-backward
+ #:*kill-ring*))
(defpackage :climacs-abbrev
(:use :clim-lisp :clim :climacs-buffer :climacs-base)
@@ -125,15 +125,11 @@
#:backward-down-list #:backward-up-list
#:syntax-line-comment-string
#:line-comment-region #:comment-region
- #:line-uncomment-region #:uncomment-region))
-
-(defpackage :climacs-kill-ring
- (:use :clim-lisp :flexichain)
- (:export #:kill-ring #:kill-ring-length #:kill-ring-max-size
- #:append-next-p
- #:reset-yank-position #:rotate-yank-position #:kill-ring-yank
- #:kill-ring-standard-push #:kill-ring-concatenating-push
- #:kill-ring-reverse-concatenating-push))
+ #:line-uncomment-region #:uncomment-region
+ #:word-constituentp
+ #:whitespacep
+ #:page-delimiter
+ #:paragraph-delimiter))
(defpackage :undo
(:use :common-lisp)
@@ -168,10 +164,129 @@
#:url
#:climacs-textual-view #:+climacs-textual-view+))
+(defpackage :climacs-motion
+ (:use :clim-lisp :clim :climacs-base :climacs-buffer :climacs-syntax)
+ (:export #:forward-to-word-boundary #:backward-to-word-boundary
+ #:define-motion-fns
+ #:beep-limit-action #:revert-limit-action #:error-limit-action
+ #:motion-limit-error
+ #:make-diligent-motor
+
+ ;; Lines
+ #:forward-one-line
+ #:backward-one-line
+ #:forward-line
+ #:backward-line
+
+ ;; Words
+ #:forward-one-word
+ #:backward-one-word
+ #:forward-word
+ #:backward-word
+
+ ;; Pages
+ #:forward-one-page
+ #:backward-one-page
+ #:forward-page
+ #:backward-page
+
+ ;; Expressions
+ #:forward-one-expression
+ #:backward-one-expression
+ #:forward-expression
+ #:backward-expression
+
+ ;; Definitions
+ #:forward-one-definition
+ #:backward-one-definition
+ #:forward-definition
+ #:backward-definition
+
+ ;; Up
+ #:forward-one-up
+ #:backward-one-up
+ #:forward-up
+ #:backward-up
+
+ ;; Down
+ #:forward-one-down
+ #:backward-one-down
+ #:forward-down
+ #:backward-down
+
+ ;; Paragraphs
+ #:forward-one-paragraph
+ #:backward-one-paragraph
+ #:forward-paragraph
+ #:backward-paragraph
+
+ ;; Sentences
+ #:forward-one-sentence
+ #:backward-one-sentence
+ #:forward-sentence
+ #:backward-sentence))
+
+(defpackage :climacs-editing
+ (:use :clim-lisp :clim :climacs-base :climacs-buffer
+ :climacs-syntax :climacs-motion :climacs-pane :climacs-kill-ring)
+ (:export #:transpose-objects
+ #:open-line
+
+ ;; Lines
+ #:forward-delete-line #:backward-delete-line
+ #:forward-kill-line #:backward-kill-line
+ #:transpose-lines
+ #:forward-delete-line-start #:backward-delete-line-start
+ #:forward-kill-line-start #:backward-kill-line-start
+ #:transpose-line-starts
+
+ ;; Words
+ #:forward-delete-word #:backward-delete-word
+ #:forward-kill-word #:backward-kill-word
+ #:transpose-words
+
+ ;; Pages
+ #:forward-delete-page #:backward-delete-page
+ #:forward-kill-page #:backward-kill-page
+ #:transpose-page
+
+ ;; Expressions
+ #:forward-delete-expression #:backward-delete-expression
+ #:forward-kill-expression #:backward-kill-expression
+ #:transpose-expressions
+
+ ;; Definitions
+ #:forward-delete-definition #:backward-delete-definition
+ #:forward-kill-definition #:backward-kill-definition
+ #:transpose-definitions
+
+ ;; Paragraphs
+ #:forward-delete-paragraph #:backward-delete-paragraph
+ #:forward-kill-paragraph #:backward-kill-paragraph
+ #:transpose-paragraphs
+
+ ;; Sentences
+ #:forward-delete-sentence #:backward-delete-sentence
+ #:forward-kill-sentence #:backward-kill-sentence
+ #:transpose-sentences
+
+ #:downcase-buffer-region #:downcase-region
+ #:upcase-buffer-region #:upcase-region
+ #:downcase-word #:upcase-word
+ #:capitalize-buffer-region #:capitalize-region
+ #:capitalize-word
+ #:tabify-region #:untabify-region
+ #:indent-line
+ #:indent-region
+ #:delete-indentation
+ #:fill-line
+ #:fill-region))
+
(defpackage :climacs-gui
(:use :clim-lisp :clim :climacs-buffer :climacs-base
- :climacs-abbrev :climacs-syntax
- :climacs-kill-ring :climacs-pane :clim-extensions :undo :esa)
+ :climacs-abbrev :climacs-syntax :climacs-motion
+ :climacs-kill-ring :climacs-pane :clim-extensions
+ :undo :esa :climacs-editing :climacs-motion)
;;(:import-from :lisp-string)
(:export :climacs ; Main entry point.
;; GUI functions follow.
@@ -183,7 +298,35 @@
:point
:syntax
:mark
- :insert-character))
+ :insert-character
+ :base-table
+ :buffer-table
+ :case-table
+ :comment-table
+ :deletion-table
+ :development-table
+ :editing-table
+ :fill-table
+ :indent-table
+ :info-table
+ :marking-table
+ :movement-table
+ :pane-table
+ :search-table
+ :self-insert-table
+ :window-table))
+
+(defpackage :climacs-motion-commands
+ (:use :clim-lisp :clim :climacs-base :climacs-buffer
+ :climacs-syntax :climacs-motion :climacs-gui :esa)
+ (:export #:define-motion-commands))
+
+(defpackage :climacs-editing-commands
+ (:use :clim-lisp :clim :climacs-base :climacs-buffer
+ :climacs-syntax :climacs-motion :climacs-gui
+ :esa :climacs-editing :climacs-kill-ring)
+ (:export #:define-deletion-commands
+ #:define-editing-commands))
(defpackage :climacs-fundamental-syntax
(:use :clim-lisp :clim :climacs-buffer :climacs-base
@@ -206,7 +349,5 @@
(defpackage :climacs-lisp-syntax
(:use :clim-lisp :clim :clim-extensions :climacs-buffer :climacs-base
- :climacs-syntax :flexichain :climacs-pane :climacs-gui)
- (:export :lisp-string))
-
-
+ :climacs-syntax :flexichain :climacs-pane :climacs-gui :climacs-motion :climacs-editing)
+ (:export :lisp-string))
\ No newline at end of file
--- /project/climacs/cvsroot/climacs/misc-commands.lisp 2006/06/03 17:58:04 1.14
+++ /project/climacs/cvsroot/climacs/misc-commands.lisp 2006/06/12 19:10:58 1.15
@@ -85,14 +85,15 @@
(lambda (mark)
(syntax-line-indentation mark tab-width syntax))
fill-column
- tab-width))))))
+ tab-width
+ (syntax buffer)))))))
(defun insert-character (char)
(let* ((window (current-window))
(point (point window)))
(unless (constituentp char)
(possibly-expand-abbrev point))
- (when (whitespacep char)
+ (when (whitespacep (syntax (buffer window)) char)
(possibly-fill-line))
(if (and (slot-value window 'overwrite-mode) (not (end-of-line-p point)))
(progn
@@ -103,73 +104,6 @@
(define-command com-self-insert ((count 'integer))
(loop repeat count do (insert-character *current-gesture*)))
-(define-command (com-beginning-of-line :name t :command-table movement-table) ()
- "Move point to the beginning of the current line."
- (beginning-of-line (point (current-window))))
-
-(set-key 'com-beginning-of-line
- 'movement-table
- '((:home)))
-
-(set-key 'com-beginning-of-line
- 'movement-table
- '((#\a :control)))
-
-(define-command (com-end-of-line :name t :command-table movement-table) ()
- "Move point to the end of the current line."
- (end-of-line (point (current-window))))
-
-(set-key 'com-end-of-line
- 'movement-table
- '((#\e :control)))
-
-(set-key 'com-end-of-line
- 'movement-table
- '((:end)))
-
-(define-command (com-delete-object :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of Objects")
- (killp 'boolean :prompt "Kill?"))
- "Delete the object after point.
-With a numeric argument, kill that many objects
-after (or before, if negative) point."
- (let* ((point (point (current-window)))
- (mark (clone-mark point)))
- (forward-object mark count)
- (when killp
- (kill-ring-standard-push *kill-ring*
- (region-to-sequence point mark)))
- (delete-region point mark)))
-
-(set-key `(com-delete-object ,*numeric-argument-marker*
- ,*numeric-argument-p*)
- 'deletion-table
- '(#\Rubout))
-
-(set-key `(com-delete-object ,*numeric-argument-marker*
- ,*numeric-argument-p*)
- 'deletion-table
- '((#\d :control)))
-
-(define-command (com-backward-delete-object :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of Objects")
- (killp 'boolean :prompt "Kill?"))
- "Delete the object before point.
-With a numeric argument, kills that many objects
-before (or after, if negative) point."
- (let* ((point (point (current-window)))
- (mark (clone-mark point)))
- (backward-object mark count)
- (when killp
- (kill-ring-standard-push *kill-ring*
- (region-to-sequence mark point)))
- (delete-region mark point)))
-
-(set-key `(com-backward-delete-object ,*numeric-argument-marker*
- ,*numeric-argument-p*)
- 'deletion-table
- '(#\Backspace))
-
(define-command (com-zap-to-object :name t :command-table deletion-table) ()
"Prompt for an object and kill to the next occurence of that object after point.
Characters can be entered in #\ format."
@@ -206,174 +140,6 @@
'deletion-table
'((#\z :meta)))
-(defun transpose-objects (mark)
- (unless (beginning-of-buffer-p mark)
- (when (end-of-line-p mark)
- (backward-object mark))
- (unless (beginning-of-buffer-p mark)
- (let ((object (object-after mark)))
- (delete-range mark)
- (backward-object mark)
- (insert-object mark object)
- (forward-object mark)))))
-
-(define-command (com-transpose-objects :name t :command-table editing-table) ()
- "Transpose the objects before and after point, advancing point.
-At the end of a line transpose the previous two objects without
-advancing point. At the beginning of the buffer do nothing.
-At the beginning of any line other than the first effectively
-move the first object of that line to the end of the previous line."
- (transpose-objects (point (current-window))))
-
-(set-key 'com-transpose-objects
- 'editing-table
- '((#\t :control)))
-
-(define-command (com-backward-object :name t :command-table movement-table)
- ((count 'integer :prompt "Number of Objects"))
- "Move point backward one object.
-With a numeric argument, move point backward (or forward, if negative)
-that number of objects."
- (backward-object (point (current-window)) count))
-
-(set-key `(com-backward-object ,*numeric-argument-marker*)
- 'movement-table
- '((#\b :control)))
-
-(set-key `(com-backward-object ,*numeric-argument-marker*)
- 'movement-table
- '((#+mcclim :left #-mcclim :left-arrow)))
-
-(define-command (com-forward-object :name t :command-table movement-table)
- ((count 'integer :prompt "Number of Objects"))
- "Move point forward one object.
-With a numeric argument, move point forward (or backward, if negative)
-that number of objects."
- (forward-object (point (current-window)) count))
-
-(set-key `(com-forward-object ,*numeric-argument-marker*)
- 'movement-table
- '((#\f :control)))
-
-(set-key `(com-forward-object ,*numeric-argument-marker*)
- 'movement-table
- '((#+mcclim :right #-mcclim :right-arrow)))
-
-(defun transpose-words (mark)
- (let (bw1 bw2 ew1 ew2)
- (backward-word mark)
- (setf bw1 (offset mark))
- (forward-word mark)
- (setf ew1 (offset mark))
- (forward-word mark)
- (when (= (offset mark) ew1)
- (display-message "Don't have two things to transpose"))
- (setf ew2 (offset mark))
- (backward-word mark)
- (setf bw2 (offset mark))
- (let ((w2 (buffer-sequence (buffer mark) bw2 ew2))
- (w1 (buffer-sequence (buffer mark) bw1 ew1)))
- (delete-word mark)
- (insert-sequence mark w1)
- (backward-word mark)
- (backward-word mark)
- (delete-word mark)
- (insert-sequence mark w2)
- (forward-word mark))))
-
-(define-command (com-transpose-words :name t :command-table editing-table) ()
- "Transpose the words around point, leaving point at the end of them.
-With point in the whitespace between words, transpose the words before
-and after point. With point inside a word, transpose that word with
-the next one. With point before the first word of the buffer, transpose
-the first two words of the buffer.
-
-FIXME: with point after the penultimate word of the buffer,
-or if there are <2 words in the buffer, Strange Things (TM)
-happen (including breaking Climacs)."
- (transpose-words (point (current-window))))
-
-(set-key 'com-transpose-words
- 'editing-table
- '((#\t :meta)))
-
-(defun transpose-lines (mark)
- (beginning-of-line mark)
- (unless (beginning-of-buffer-p mark)
- (previous-line mark))
- (let* ((bol (offset mark))
- (eol (progn (end-of-line mark)
- (offset mark)))
- (line (buffer-sequence (buffer mark) bol eol)))
- (delete-region bol mark)
- ;; Remove newline at end of line as well.
- (unless (end-of-buffer-p mark)
- (delete-range mark))
- ;; If the current line is at the end of the buffer, we want to
- ;; be able to insert past it, so we need to get an extra line
- ;; at the end.
- (end-of-line mark)
- (when (end-of-buffer-p mark)
- (insert-object mark #\Newline))
- (next-line mark 0)
- (insert-sequence mark line)
- (insert-object mark #\Newline)))
-
-(define-command (com-transpose-lines :name t :command-table editing-table) ()
- "Transpose current line and previous line, leaving point at the end of them.
-If point is in the first line, transpose the first two lines.
-If point is in the last line of the buffer and there is no
-final #\Newline, add one."
- (transpose-lines (point (current-window))))
-
-(set-key 'com-transpose-lines
- 'editing-table
- '((#\x :control) (#\t :control)))
-
-(define-command (com-previous-line :name t :command-table movement-table)
- ((numarg 'integer :prompt "How many lines?"))
- "Move point to the previous line.
-With a numeric argument, move point up (down, if negative) that many lines.
-Successive line movement commands seek to respect the 'goal column'."
- (let* ((window (current-window))
- (point (point window)))
- (unless (or (eq (previous-command window) 'com-previous-line)
- (eq (previous-command window) 'com-next-line))
- (setf (slot-value window 'goal-column) (column-number point)))
- (if (plusp numarg)
- (previous-line point (slot-value window 'goal-column) numarg)
- (next-line point (slot-value window 'goal-column) (- numarg)))))
-
-(set-key `(com-previous-line ,*numeric-argument-marker*)
- 'movement-table
- '((#\p :control)))
-
-(set-key `(com-previous-line ,*numeric-argument-marker*)
- 'movement-table
- '((#+mcclim :up #-mcclim :up-arrow)))
-
-(define-command (com-next-line :name t :command-table movement-table)
- ((numarg 'integer :prompt "How many lines?"))
- "Move point to the next line.
-With a numeric argument, move point down (up, if negative) that many lines.
-Successive line movement commands seek to respect the 'goal column'."
- (let* ((window (current-window))
- (point (point window)))
- (unless (or (eq (previous-command window) 'com-previous-line)
- (eq (previous-command window) 'com-next-line))
- (setf (slot-value window 'goal-column) (column-number point)))
- (if (plusp numarg)
- (next-line point (slot-value window 'goal-column) numarg)
- (previous-line point (slot-value window 'goal-column) (- numarg)))))
-
-(set-key `(com-next-line ,*numeric-argument-marker*)
- 'movement-table
- '((#\n :control)))
-
-(set-key `(com-next-line ,*numeric-argument-marker*)
- 'movement-table
- '((#+mcclim :down #-mcclim :down-arrow)))
-
(define-command (com-open-line :name t :command-table editing-table)
((numarg 'integer :prompt "How many lines?"))
"Insert a #\Newline and leave point before it.
@@ -402,7 +168,7 @@
do (forward-object mark)))
(t
(cond ((end-of-buffer-p mark) nil)
- ((end-of-line-p mark)(forward-object mark))
+ ((end-of-line-p mark) (forward-object mark))
(t (end-of-line mark)))))
(unless (mark= mark start)
(if concatenate-p
@@ -431,122 +197,64 @@
'deletion-table
'((#\k :control)))
-(define-command (com-forward-word :name t :command-table movement-table)
- ((count 'integer :prompt "Number of words"))
- "Move point to the next word end.
-With a numeric argument, move point forward (backward, if negative)
-that many words."
- (if (plusp count)
- (forward-word (point (current-window)) count)
- (backward-word (point (current-window)) (- count))))
-
-(set-key `(com-forward-word ,*numeric-argument-marker*)
- 'movement-table
- '((#\f :meta)))
-
-(set-key `(com-forward-word ,*numeric-argument-marker*)
- 'movement-table
- '((#+mcclim :right #-mcclim :right-arrow :control)))
-
-(define-command (com-backward-word :name t :command-table movement-table)
- ((count 'integer :prompt "Number of words"))
- "Move point to the previous word beginning.
-With a numeric argument, move point backward (forward, if negative)
-that many words."
- (backward-word (point (current-window)) count))
-
-(set-key `(com-backward-word ,*numeric-argument-marker*)
- 'movement-table
- '((#\b :meta)))
-
-(set-key `(com-backward-word ,*numeric-argument-marker*)
- 'movement-table
- '((#+mcclim :left #-mcclim :left-arrow :control)))
-
-(define-command (com-delete-word :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of words"))
- "Delete from point until the next word end.
-With a positive numeric argument, delete that many words forward."
- (delete-word (point (current-window)) count))
-
-(defun kill-word (mark &optional (count 1) (concatenate-p nil))
- (let ((start (offset mark)))
- (if (plusp count)
- (loop repeat count
- until (end-of-buffer-p mark)
- do (forward-word mark))
- (loop repeat (- count)
- until (beginning-of-buffer-p mark)
- do (backward-word mark)))
- (unless (mark= mark start)
- (if concatenate-p
- (if (plusp count)
- (kill-ring-concatenating-push *kill-ring*
- (region-to-sequence start mark))
- (kill-ring-reverse-concatenating-push *kill-ring*
- (region-to-sequence start mark)))
- (kill-ring-standard-push *kill-ring*
- (region-to-sequence start mark)))
- (delete-region start mark))))
-
-(define-command (com-kill-word :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of words"))
- "Kill from point until the next word end.
-With a numeric argument, kill forward (backward, if negative)
-that many words.
-
-Successive kills append to the kill ring."
- (let* ((pane (current-window))
- (point (point pane))
- (concatenate-p (eq (previous-command pane) 'com-kill-word)))
- (kill-word point count concatenate-p)))
-
-(set-key `(com-kill-word ,*numeric-argument-marker*)
- 'deletion-table
- '((#\d :meta)))
-
-(define-command (com-backward-kill-word :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of words"))
- "Kill from point until the previous word beginning.
-With a numeric argument, kill backward (forward, if negative)
-that many words.
-
-Successive kills append to the kill ring."
- (let* ((pane (current-window))
- (point (point pane))
- (concatenate-p (eq (previous-command pane) 'com-backward-kill-word)))
- (kill-word point (- count) concatenate-p)))
-
-(set-key `(com-backward-kill-word ,*numeric-argument-marker*)
- 'deletion-table
- '((#\Backspace :meta)))
-
-(define-command (com-mark-word :name t :command-table marking-table)
- ((count 'integer :prompt "Number of words"))
- "Place mark at the next word end.
+(defmacro define-mark-unit-command (unit command-table &key
+ move-point
+ noun
+ plural)
+ "Define a COM-MARK-<UNIT> for `unit' command and put it in
+ `command-table'."
+ (labels ((symbol (&rest strings)
+ (intern (apply #'concat strings)))
+ (concat (&rest strings)
+ (apply #'concatenate 'STRING (mapcar #'string strings))))
+ (let ((forward (symbol "FORWARD-" unit))
+ (backward (symbol "BACKWARD-" unit))
+ (noun (or noun (string-downcase unit)))
+ (plural (or plural (concat (string-downcase unit) "s"))))
+ `(define-command (,(symbol "COM-MARK-" unit)
+ :name t
+ :command-table ,command-table)
+ ((count 'integer :prompt ,(concat "Number of " plural)))
+ ,(if (not (null move-point))
+ (concat "Place point and mark around the current " noun ".
+Put point at the beginning of the current " noun ", and mark at the end.
+With a positive numeric argument, put mark that many " plural " forward.
+With a negative numeric argument, put point at the end of the current
+" noun " and mark that many " plural " backward.
+Successive invocations extend the selection.")
[700 lines skipped]
--- /project/climacs/cvsroot/climacs/lisp-syntax.lisp 2006/06/12 10:48:29 1.86
+++ /project/climacs/cvsroot/climacs/lisp-syntax.lisp 2006/06/12 19:10:58 1.87
@@ -246,7 +246,7 @@
(macrolet ((fo () `(forward-object scan)))
(loop when (end-of-buffer-p scan)
do (return nil)
- until (not (whitespacep (object-after scan)))
+ until (not (whitespacep syntax (object-after scan)))
do (fo)
finally (return t))))
@@ -434,7 +434,7 @@
(defmethod skip-inter ((syntax lisp-syntax) (state lexer-line-comment-state) scan)
(macrolet ((fo () `(forward-object scan)))
(loop until (or (end-of-line-p scan)
- (not (whitespacep (object-after scan))))
+ (not (whitespacep syntax (object-after scan))))
do (fo)
finally (return t))))
@@ -520,7 +520,7 @@
(fo)
(go start))
(if (evenp bars-seen)
- (unless (whitespacep (object-after scan))
+ (unless (whitespacep syntax (object-after scan))
(fo)
(go start))
(when (constituentp (object-after scan))
@@ -1823,47 +1823,57 @@
(when (not (null list-child))
(funcall fn list-child)))))
-(defmethod backward-expression (mark (syntax lisp-syntax))
+(defmethod backward-one-expression (mark (syntax lisp-syntax))
(let ((potential-form (or (form-before syntax (offset mark))
(form-around syntax (offset mark)))))
(if potential-form
(setf (offset mark) (start-offset potential-form))
(error 'no-expression))))
-(defmethod forward-expression (mark (syntax lisp-syntax))
+(defmethod forward-one-expression (mark (syntax lisp-syntax))
(let ((potential-form (or (form-after syntax (offset mark))
(form-around syntax (offset mark)))))
(if potential-form
(setf (offset mark) (end-offset potential-form))
(error 'no-expression))))
-(defmethod forward-list (mark (syntax lisp-syntax))
+(defgeneric forward-one-list (mark syntax)
+ (:documentation
+ "Move `mark' forward by one list.
+Return T if successful, or NIL if the buffer limit was reached."))
+
+(defmethod forward-one-list (mark (syntax lisp-syntax))
(loop for start = (offset mark)
- then (end-offset potential-form)
- for potential-form = (or (form-after syntax start)
- (form-around syntax start))
- until (or (null potential-form)
- (and (= start
- (end-offset potential-form))
- (null (form-after syntax start))))
- when (typep potential-form 'list-form)
- do (setf (offset mark) (end-offset potential-form))
- (return)
- finally (error 'no-expression)))
+ then (end-offset potential-form)
+ for potential-form = (or (form-after syntax start)
+ (form-around syntax start))
+ until (or (null potential-form)
+ (and (= start
+ (end-offset potential-form))
+ (null (form-after syntax start))))
+ when (typep potential-form 'list-form)
+ do (setf (offset mark) (end-offset potential-form))
+ (return t)))
+
+(defgeneric backward-one-list (mark syntax)
+ (:documentation
+ "Move `mark' backward by one list. Return T if successful, or
+NIL if the buffer limit was reached."))
-(defmethod backward-list (mark (syntax lisp-syntax))
+(defmethod backward-one-list (mark (syntax lisp-syntax))
(loop for start = (offset mark)
- then (start-offset potential-form)
- for potential-form = (or (form-before syntax start)
- (form-around syntax start))
- until (or (null potential-form)
- (and (= start
- (start-offset potential-form))
- (null (form-before syntax start))))
- when (typep potential-form 'list-form)
- do (setf (offset mark) (start-offset potential-form))
- (return)
- finally (error 'no-expression)))
+ then (start-offset potential-form)
+ for potential-form = (or (form-before syntax start)
+ (form-around syntax start))
+ until (or (null potential-form)
+ (and (= start
+ (start-offset potential-form))
+ (null (form-before syntax start))))
+ when (typep potential-form 'list-form)
+ do (setf (offset mark) (start-offset potential-form))
+ (return t)))
+
+(climacs-motion:define-motion-fns list)
(defun down-list-by-fn (mark syntax fn)
(let* ((offset (offset mark))
@@ -1876,31 +1886,30 @@
fn
offset)))))
(when new-offset
- (setf (offset mark) (1+ new-offset))))))
+ (progn (setf (offset mark) (1+ new-offset)) t)))))
-(defmethod down-list (mark (syntax lisp-syntax))
+(defmethod forward-one-down (mark (syntax lisp-syntax))
(down-list-by-fn mark syntax #'start-offset))
-(defmethod backward-down-list (mark (syntax lisp-syntax))
+(defmethod backward-one-down (mark (syntax lisp-syntax))
(down-list-by-fn mark syntax #'end-offset)
- (backward-object mark))
+ (backward-object mark syntax))
(defun up-list-by-fn (mark syntax fn)
(let ((form (or (form-before syntax (offset mark))
(form-after syntax (offset mark))
(form-around syntax (offset mark)))))
- (if form
+ (when form
(let ((parent (parent form)))
(when (not (null parent))
(let ((new-offset (find-list-parent-offset parent fn)))
(when new-offset
- (setf (offset mark) new-offset)))))
- (error 'no-expression))))
+ (setf (offset mark) new-offset))))))))
-(defmethod backward-up-list (mark (syntax lisp-syntax))
+(defmethod backward-one-up (mark (syntax lisp-syntax))
(up-list-by-fn mark syntax #'start-offset))
-(defmethod up-list (mark (syntax lisp-syntax))
+(defmethod forward-one-up (mark (syntax lisp-syntax))
(up-list-by-fn mark syntax #'end-offset))
(defmethod eval-defun (mark (syntax lisp-syntax))
@@ -1911,7 +1920,7 @@
do (return (eval (read-from-string
(token-string syntax form)))))))
-(defmethod beginning-of-definition (mark (syntax lisp-syntax))
+(defmethod backward-one-definition (mark (syntax lisp-syntax))
(with-slots (stack-top) syntax
(loop for form in (children stack-top)
with last-toplevel-list = nil
@@ -1925,15 +1934,18 @@
when (typep form 'form)
do (setf last-toplevel-list form)
finally (when last-toplevel-list form
- (setf (offset mark) (start-offset last-toplevel-list))))))
+ (setf (offset mark)
+ (start-offset last-toplevel-list))
+ (return t)))))
-(defmethod end-of-definition (mark (syntax lisp-syntax))
+(defmethod forward-one-definition (mark (syntax lisp-syntax))
(with-slots (stack-top) syntax
(loop for form in (children stack-top)
when (and (typep form 'form)
(mark< mark (end-offset form)))
do (setf (offset mark) (end-offset form))
- (loop-finish))))
+ (loop-finish)
+ finally (return t))))
(defun in-type-p-in-children (children offset type)
(loop for child in children
--- /project/climacs/cvsroot/climacs/lisp-syntax-commands.lisp 2006/06/05 21:01:51 1.5
+++ /project/climacs/cvsroot/climacs/lisp-syntax-commands.lisp 2006/06/12 19:10:58 1.6
@@ -30,16 +30,26 @@
(in-package :climacs-lisp-syntax)
+;; Movement commands.
+(climacs-motion-commands:define-motion-commands expression lisp-table)
+(climacs-motion-commands:define-motion-commands definition lisp-table)
+(climacs-motion-commands:define-motion-commands up lisp-table
+ :noun "nesting level up"
+ :plural "levels")
+(climacs-motion-commands:define-motion-commands down lisp-table
+ :noun "nesting level down"
+ :plural "levels")
+(climacs-motion-commands:define-motion-commands list lisp-table)
+
+(climacs-editing-commands:define-editing-commands expression lisp-table)
+(climacs-editing-commands:define-deletion-commands expression lisp-table)
+
(define-command (com-eval-defun :name t :command-table lisp-table) ()
(let* ((pane (current-window))
(point (point pane))
(syntax (syntax (buffer pane))))
(eval-defun point syntax)))
-(esa:set-key 'com-eval-defun
- 'lisp-table
- '((#\x :control :meta)))
-
(define-command (com-package :name t :command-table lisp-table) ()
(let* ((pane (current-window))
(syntax (syntax (buffer pane)))
@@ -62,35 +72,74 @@
(when (typep token 'string-form)
(with-accessors ((offset1 start-offset)
(offset2 end-offset)) token
- (fill-region (make-instance 'standard-right-sticky-mark
- :buffer implementation
- :offset offset1)
- (make-instance 'standard-right-sticky-mark
- :buffer implementation
- :offset offset2)
- #'(lambda (mark)
- (syntax-line-indentation mark tab-width syntax))
- fill-column
- tab-width
- t)))))
-
-(esa:set-key 'com-fill-paragraph
- 'lisp-table
- '((#\q :meta)))
+ (climacs-editing:fill-region (make-instance 'standard-right-sticky-mark
+ :buffer implementation
+ :offset offset1)
+ (make-instance 'standard-right-sticky-mark
+ :buffer implementation
+ :offset offset2)
+ #'(lambda (mark)
+ (syntax-line-indentation mark tab-width syntax))
+ fill-column
+ tab-width
+ syntax
+ t)))))
(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)))
+ (syntax (syntax (buffer pane))))
(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)))
+ (climacs-editing:indent-region pane (clone-mark point) mark)))
+
+(esa:set-key 'com-fill-paragraph
+ 'lisp-table
+ '((#\q :meta)))
+
+(esa:set-key 'com-eval-defun
+ 'lisp-table
+ '((#\x :control :meta)))
(esa:set-key `(com-indent-expression ,*numeric-argument-marker*)
'lisp-table
- '((#\q :meta :control)))
\ No newline at end of file
+ '((#\q :meta :control)))
+
+(esa:set-key `(com-backward-up ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\u :control :meta)))
+
+(esa:set-key `(com-forward-down ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\d :control :meta)))
+
+(esa:set-key `(com-backward-expression ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\b :control :meta)))
+
+(esa:set-key `(com-forward-expression ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\f :control :meta)))
+
+(esa:set-key `(com-backward-definition ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\a :control :meta)))
+
+(esa:set-key `(com-forward-definition ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\e :control :meta)))
+
+(esa:set-key `(com-forward-list ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\n :control :meta)))
+
+(esa:set-key `(com-backward-list ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\p :control :meta)))
+
+(esa:set-key `(com-kill-expression ,*numeric-argument-marker*)
+ 'lisp-table
+ '((#\k :control :meta)))
\ No newline at end of file
--- /project/climacs/cvsroot/climacs/html-syntax.lisp 2006/05/06 19:51:04 1.33
+++ /project/climacs/cvsroot/climacs/html-syntax.lisp 2006/06/12 19:10:58 1.34
@@ -675,7 +675,7 @@
(incf valid-parse))))
(defmethod inter-lexeme-object-p ((lexer html-lexer) object)
- (whitespacep object))
+ (whitespacep (syntax (buffer lexer)) object))
(defmethod update-syntax (buffer (syntax html-syntax))
(with-slots (lexer valid-parse) syntax
--- /project/climacs/cvsroot/climacs/gui.lisp 2006/06/04 16:27:18 1.217
+++ /project/climacs/cvsroot/climacs/gui.lisp 2006/06/12 19:10:58 1.218
@@ -311,8 +311,6 @@
(declare (ignore region))
(redisplay-frame-pane *application-frame* pane))
-(defvar *kill-ring* (make-instance 'kill-ring :max-size 7))
-
(defmethod execute-frame-command :around ((frame climacs) command)
(let ((current-window (car (windows frame))))
(handler-case
--- /project/climacs/cvsroot/climacs/fundamental-syntax.lisp 2006/05/06 19:51:04 1.3
+++ /project/climacs/cvsroot/climacs/fundamental-syntax.lisp 2006/06/12 19:10:58 1.4
@@ -192,12 +192,6 @@
;;;
;;; exploit the parse
-(defmethod backward-expression (mark (syntax fundamental-syntax))
- nil)
-
-(defmethod forward-expression (mark (syntax fundamental-syntax))
- nil)
-
;; do this better
(defmethod syntax-line-indentation (mark tab-width (syntax fundamental-syntax))
0)
--- /project/climacs/cvsroot/climacs/file-commands.lisp 2006/06/01 22:51:40 1.19
+++ /project/climacs/cvsroot/climacs/file-commands.lisp 2006/06/12 19:10:58 1.20
@@ -177,7 +177,7 @@
(let ((scan (beginning-of-buffer (clone-mark (point buffer)))))
;; skip the leading whitespace
(loop until (end-of-buffer-p scan)
- until (not (whitespacep (object-after scan)))
+ until (not (whitespacep (syntax buffer) (object-after scan)))
do (forward-object scan))
;; stop looking if we're already 1,000 objects into the buffer
(unless (> (offset scan) 1000)
--- /project/climacs/cvsroot/climacs/climacs.asd 2006/04/23 12:11:26 1.44
+++ /project/climacs/cvsroot/climacs/climacs.asd 2006/06/12 19:10:58 1.45
@@ -44,15 +44,17 @@
(:file "packages" :depends-on ("cl-automaton" "Persistent"))
(:file "buffer" :depends-on ("packages"))
+ (:file "motion" :depends-on ("packages" "buffer" "syntax"))
+ (:file "editing" :depends-on ("packages" "buffer" "syntax" "motion" "kill-ring"))
(:file "persistent-buffer"
:pathname #p"Persistent/persistent-buffer.lisp"
:depends-on ("packages" "buffer" "Persistent"))
- (:file "base" :depends-on ("packages" "buffer" "persistent-buffer"))
+ (:file "base" :depends-on ("packages" "buffer" "persistent-buffer" "kill-ring"))
(:file "io" :depends-on ("packages" "buffer"))
(:file "abbrev" :depends-on ("packages" "buffer" "base"))
(:file "syntax" :depends-on ("packages" "buffer" "base"))
- (:file "text-syntax" :depends-on ("packages" "base" "buffer" "syntax"))
+ (:file "text-syntax" :depends-on ("packages" "base" "buffer" "syntax" "motion"))
(:file "delegating-buffer" :depends-on ("packages" "buffer"))
(:file "kill-ring" :depends-on ("packages"))
(:file "undo" :depends-on ("packages"))
@@ -72,12 +74,14 @@
"pane"))
(:file "lisp-syntax" :depends-on ("packages" "syntax" "buffer" "base" "pane"
"gui"))
- (:file "lisp-syntax-commands" :depends-on ("lisp-syntax"))
+ (:file "lisp-syntax-commands" :depends-on ("lisp-syntax" "motion" "gui" "motion-commands" "editing-commands"))
(:file "gui" :depends-on ("packages" "syntax" "base" "buffer" "undo" "pane"
"kill-ring" "io" "text-syntax"
- "abbrev" ))
+ "abbrev" "editing" "motion"))
;; (:file "buffer-commands" :depends-on ("gui"))
(:file "developer-commands" :depends-on ("gui" "lisp-syntax"))
+ (:file "motion-commands" :depends-on ("gui"))
+ (:file "editing-commands" :depends-on ("gui"))
(:file "file-commands" :depends-on ("gui"))
(:file "misc-commands" :depends-on ("gui"))
(:file "search-commands" :depends-on ("gui"))
--- /project/climacs/cvsroot/climacs/cl-syntax.lisp 2006/05/06 19:51:04 1.18
+++ /project/climacs/cvsroot/climacs/cl-syntax.lisp 2006/06/12 19:10:58 1.19
@@ -1006,7 +1006,7 @@
(incf valid-parse))))
(defmethod inter-lexeme-object-p ((lexer cl-lexer) object)
- (whitespacep object))
+ (whitespacep (syntax (buffer lexer)) object))
(defmethod update-syntax (buffer (syntax cl-syntax))
(with-slots (lexer valid-parse) syntax
@@ -1030,7 +1030,8 @@
(let ((space-width (space-width pane))
(tab-width (tab-width pane)))
(loop while (and (< start end)
- (whitespacep (buffer-object buffer start)))
+ (whitespacep (syntax buffer)
+ (buffer-object buffer start)))
do (ecase (buffer-object buffer start)
(#\Newline (terpri pane)
(setf (aref *cursor-positions* (incf *current-line*))
--- /project/climacs/cvsroot/climacs/buffer.lisp 2006/04/30 15:20:46 1.33
+++ /project/climacs/cvsroot/climacs/buffer.lisp 2006/06/12 19:10:58 1.34
@@ -136,25 +136,17 @@
(:documentation "Move `mark' `count' objects backwards. Returns
`mark'."))
-(defmethod backward-object :around (mark &optional count)
- (declare (ignore count))
- (call-next-method)
- mark)
-
-(defmethod backward-object ((mark mark-mixin) &optional (count 1))
- (decf (offset mark) count))
-
(defgeneric forward-object (mark &optional count)
(:documentation "Move `mark' `count' objects forwards. Returns
`mark'"))
-(defmethod forward-object :around (mark &optional count)
- (declare (ignore count))
- (call-next-method)
- mark)
-
(defmethod forward-object ((mark mark-mixin) &optional (count 1))
- (incf (offset mark) count))
+ (incf (offset mark) count)
+ t)
+
+(defmethod backward-object ((mark mark-mixin) &optional (count 1))
+ (decf (offset mark) count)
+ t)
(defclass standard-left-sticky-mark (left-sticky-mark mark-mixin) ()
(:documentation "A left-sticky-mark subclass suitable for use in a standard-buffer"))
@@ -377,7 +369,7 @@
(defmethod beginning-of-line ((mark mark-mixin))
(loop until (beginning-of-line-p mark)
- do (decf (offset mark))))
+ do (backward-object mark)))
(defgeneric end-of-line (mark)
(:documentation "Move the mark to the end of the line. The mark will be positioned
@@ -432,6 +424,15 @@
(defmethod column-number ((mark mark-mixin))
(buffer-column-number (buffer mark) (offset mark)))
+(defgeneric (setf column-number) (number mark)
+ (:documentation "Set the column number of the mark."))
+
+(defmethod (setf column-number) (number mark)
+ (beginning-of-line mark)
+ (loop repeat number
+ until (end-of-line-p mark)
+ do (incf (offset mark))))
+
(defgeneric insert-buffer-object (buffer offset object)
(:documentation "Insert the object at the offset in the buffer. Any left-sticky marks
that are placed at the offset will remain positioned before the
--- /project/climacs/cvsroot/climacs/base.lisp 2006/06/05 21:01:51 1.50
+++ /project/climacs/cvsroot/climacs/base.lisp 2006/06/12 19:10:58 1.51
@@ -63,71 +63,6 @@
(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
- (setf column (column-number mark)))
- (loop repeat count
- do (beginning-of-line mark)
- until (beginning-of-buffer-p mark)
- do (backward-object mark))
- (end-of-line mark)
- (when (> (column-number mark) column)
- (beginning-of-line mark)
- (incf (offset mark) column)))
-
-(defmethod previous-line ((mark p-line-mark-mixin) &optional column (count 1))
- "Move a mark up COUNT lines conserving horizontal position."
- (unless column
- (setf column (column-number mark)))
- (let* ((line (line-number mark))
- (goto-line (max 0 (- line count))))
- (setf (offset mark)
- (+ column (buffer-line-offset (buffer mark) goto-line)))))
-
-(defmethod next-line (mark &optional column (count 1))
- "Move a mark down COUNT lines conserving horizontal position."
- (unless column
- (setf column (column-number mark)))
- (loop repeat count
- do (end-of-line mark)
- until (end-of-buffer-p mark)
- do (forward-object mark))
- (end-of-line mark)
- (when (> (column-number mark) column)
- (beginning-of-line mark)
- (incf (offset mark) column)))
-
-(defmethod next-line ((mark p-line-mark-mixin) &optional column (count 1))
- "Move a mark down COUNT lines conserving horizontal position."
- (unless column
- (setf column (column-number mark)))
- (let* ((line (line-number mark))
- (goto-line (min (number-of-lines (buffer mark))
- (+ line count))))
- (setf (offset mark)
- (+ column (buffer-line-offset (buffer mark) goto-line)))))
-
-(defmethod open-line ((mark left-sticky-mark) &optional (count 1))
- "Create a new line in a buffer after the mark."
- (loop repeat count
- do (insert-object mark #\Newline)))
-
-(defmethod open-line ((mark right-sticky-mark) &optional (count 1))
- "Create a new line in a buffer after the mark."
- (loop repeat count
- do (insert-object mark #\Newline)
- (decf (offset mark))))
-
-(defun kill-line (mark)
- "Remove a line from a buffer."
- (if (end-of-line-p mark)
- (unless (end-of-buffer-p mark)
- (delete-range mark))
- (let ((offset (offset mark)))
- (end-of-line mark)
- (delete-region offset mark))))
-
(defun empty-line-p (mark)
"Check whether the mark is in an empty line."
(and (beginning-of-line-p mark) (end-of-line-p mark)))
@@ -204,60 +139,6 @@
#\: #\< #\= #\> #\? #\@ #\^ #\~ #\_
#\{ #\} #\[ #\] )))))
-(defun whitespacep (obj)
- "A predicate to ensure that an object is a whitespace character."
- (and (characterp obj)
- (member obj '(#\Space #\Tab #\Newline #\Page #\Return))))
-
-(defun forward-to-word-boundary (mark)
- "Move the mark forward to the beginning of the next word."
- (loop until (end-of-buffer-p mark)
- until (constituentp (object-after mark))
- do (incf (offset mark))))
-
-(defun backward-to-word-boundary (mark)
- "Move the mark backward to the end of the previous word."
- (loop until (beginning-of-buffer-p mark)
- until (constituentp (object-before mark))
- do (decf (offset mark))))
-
-(defun forward-word (mark &optional (count 1))
- "Forward the mark to the next word."
- (loop repeat count
- do (forward-to-word-boundary mark)
- (loop until (end-of-buffer-p mark)
- while (constituentp (object-after mark))
- do (incf (offset mark)))))
-
-(defun backward-word (mark &optional (count 1))
- "Shuttle the mark to the start of the previous word."
- (loop repeat count
- do (backward-to-word-boundary mark)
- (loop until (beginning-of-buffer-p mark)
- while (constituentp (object-before mark))
- do (decf (offset mark)))))
-
-(defun delete-word (mark &optional (count 1))
- "Delete until the end of the word"
- (let ((mark2 (clone-mark mark)))
- (forward-word mark2 count)
- (delete-region mark mark2)))
-
-(defun backward-delete-word (mark &optional (count 1))
- "Delete until the beginning of the word"
- (let ((mark2 (clone-mark mark)))
- (backward-word mark2 count)
- (delete-region mark mark2)))
-
-(defun previous-word (mark)
- "Return a freshly allocated sequence, that is word before the mark"
- (region-to-sequence
- (loop for i downfrom (offset mark)
- while (and (plusp i)
- (constituentp (buffer-object (buffer mark) (1- i))))
- finally (return i))
- mark))
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Character case
@@ -285,325 +166,6 @@
(possibly-capitalized :capitalized)
(t nil))))
-;;; I'd rather have update-buffer-range methods spec. on buffer for this,
-;;; for performance and history-size reasons --amb
-(defun downcase-buffer-region (buffer offset1 offset2)
- (do-buffer-region (object offset buffer offset1 offset2)
- (when (and (constituentp object) (upper-case-p object))
- (setf object (char-downcase object)))))
-
-(defgeneric downcase-region (mark1 mark2)
- (:documentation "Convert all characters after mark1 and before mark2 to
-lowercase. An error is signaled if the two marks are positioned in different
-buffers. It is acceptable to pass an offset in place of one of the marks."))
-
-(defmethod downcase-region ((mark1 mark) (mark2 mark))
- (assert (eq (buffer mark1) (buffer mark2)))
- (let ((offset1 (offset mark1))
- (offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (downcase-buffer-region (buffer mark1) offset1 offset2)))
-
-(defmethod downcase-region ((offset1 integer) (mark2 mark))
- (let ((offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (downcase-buffer-region (buffer mark2) offset1 offset2)))
-
-(defmethod downcase-region ((mark1 mark) (offset2 integer))
- (let ((offset1 (offset mark1)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (downcase-buffer-region (buffer mark1) offset1 offset2)))
-
-(defun downcase-word (mark &optional (n 1))
- "Convert the next N words to lowercase, leaving mark after the last word."
- (loop repeat n
- do (forward-to-word-boundary mark)
- (let ((offset (offset mark)))
- (forward-word mark)
- (downcase-region offset mark))))
-
-(defun upcase-buffer-region (buffer offset1 offset2)
- (do-buffer-region (object offset buffer offset1 offset2)
- (when (and (constituentp object) (lower-case-p object))
- (setf object (char-upcase object)))))
-
-(defgeneric upcase-region (mark1 mark2)
- (:documentation "Convert all characters after mark1 and before mark2 to
-uppercase. An error is signaled if the two marks are positioned in different
-buffers. It is acceptable to pass an offset in place of one of the marks."))
-
-(defmethod upcase-region ((mark1 mark) (mark2 mark))
- (assert (eq (buffer mark1) (buffer mark2)))
- (let ((offset1 (offset mark1))
- (offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (upcase-buffer-region (buffer mark1) offset1 offset2)))
-
-(defmethod upcase-region ((offset1 integer) (mark2 mark))
- (let ((offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (upcase-buffer-region (buffer mark2) offset1 offset2)))
-
-(defmethod upcase-region ((mark1 mark) (offset2 integer))
- (let ((offset1 (offset mark1)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (upcase-buffer-region (buffer mark1) offset1 offset2)))
-
-(defun upcase-word (mark &optional (n 1))
- "Convert the next N words to uppercase, leaving mark after the last word."
- (loop repeat n
- do (forward-to-word-boundary mark)
- (let ((offset (offset mark)))
- (forward-word mark)
- (upcase-region offset mark))))
-
-(defun capitalize-buffer-region (buffer offset1 offset2)
- (let ((previous-char-constituent-p nil))
- (do-buffer-region (object offset buffer offset1 offset2)
- (when (constituentp object)
- (if previous-char-constituent-p
- (when (upper-case-p object)
- (setf object (char-downcase object)))
- (when (lower-case-p object)
- (setf object (char-upcase object)))))
- (setf previous-char-constituent-p (constituentp object)))))
-
-(defgeneric capitalize-region (mark1 mark2)
- (:documentation "Capitalize all words after mark1 and before mark2.
-An error is signaled if the two marks are positioned in different buffers.
-It is acceptable to pass an offset in place of one of the marks."))
-
-(defmethod capitalize-region ((mark1 mark) (mark2 mark))
- (assert (eq (buffer mark1) (buffer mark2)))
- (let ((offset1 (offset mark1))
- (offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (capitalize-buffer-region (buffer mark1) offset1 offset2)))
-
-(defmethod capitalize-region ((offset1 integer) (mark2 mark))
- (let ((offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (capitalize-buffer-region (buffer mark2) offset1 offset2)))
-
-(defmethod capitalize-region ((mark1 mark) (offset2 integer))
- (let ((offset1 (offset mark1)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (capitalize-buffer-region (buffer mark1) offset1 offset2)))
-
-(defun capitalize-word (mark &optional (n 1))
- "Capitalize the next N words, leaving mark after the last word."
- (loop repeat n
- do (forward-to-word-boundary mark)
- (let ((offset (offset mark)))
- (forward-word mark)
- (capitalize-region offset mark))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Tabify
-
-(defun tabify-buffer-region (buffer offset1 offset2 tab-width)
- (flet ((looking-at-spaces (buffer offset count)
- (loop for i from offset
- repeat count
- unless (char= (buffer-object buffer i) #\Space)
- return nil
- finally (return t))))
- (loop for offset = offset1 then (1+ offset)
- until (>= offset offset2)
- do (let* ((column (buffer-display-column
- buffer offset tab-width))
- (count (- tab-width (mod column tab-width))))
- (when (looking-at-spaces buffer offset count)
- (finish-output)
- (delete-buffer-range buffer offset count)
- (insert-buffer-object buffer offset #\Tab)
- (decf offset2 (1- count)))))))
-
-(defgeneric tabify-region (mark1 mark2 tab-width)
- (:documentation "Replace sequences of tab-width spaces with tabs
-in the region delimited by mark1 and mark2."))
-
-(defmethod tabify-region ((mark1 mark) (mark2 mark) tab-width)
- (assert (eq (buffer mark1) (buffer mark2)))
- (let ((offset1 (offset mark1))
- (offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (tabify-buffer-region (buffer mark1) offset1 offset2 tab-width)))
-
-(defmethod tabify-region ((offset1 integer) (mark2 mark) tab-width)
- (let ((offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (tabify-buffer-region (buffer mark2) offset1 offset2 tab-width)))
-
-(defmethod tabify-region ((mark1 mark) (offset2 integer) tab-width)
- (let ((offset1 (offset mark1)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (tabify-buffer-region (buffer mark1) offset1 offset2 tab-width)))
-
-(defun untabify-buffer-region (buffer offset1 offset2 tab-width)
- (loop for offset = offset1 then (1+ offset)
- until (>= offset offset2)
- when (char= (buffer-object buffer offset) #\Tab)
- do (let* ((column (buffer-display-column buffer
- offset
- tab-width))
- (count (- tab-width (mod column tab-width))))
- (delete-buffer-range buffer offset 1)
- (loop repeat count
- do (insert-buffer-object buffer offset #\Space))
- (incf offset (1- count))
- (incf offset2 (1- count)))))
-
-(defgeneric untabify-region (mark1 mark2 tab-width)
- (:documentation "Replace tabs with tab-width spaces in the region
-delimited by mark1 and mark2."))
-
-(defmethod untabify-region ((mark1 mark) (mark2 mark) tab-width)
- (assert (eq (buffer mark1) (buffer mark2)))
- (let ((offset1 (offset mark1))
- (offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (untabify-buffer-region (buffer mark1) offset1 offset2 tab-width)))
-
-(defmethod untabify-region ((offset1 integer) (mark2 mark) tab-width)
- (let ((offset2 (offset mark2)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (untabify-buffer-region (buffer mark2) offset1 offset2 tab-width)))
-
-(defmethod untabify-region ((mark1 mark) (offset2 integer) tab-width)
- (let ((offset1 (offset mark1)))
- (when (> offset1 offset2)
- (rotatef offset1 offset2))
- (untabify-buffer-region (buffer mark1) offset1 offset2 tab-width)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Indentation
-
-(defgeneric indent-line (mark indentation tab-width)
- (:documentation "Indent the line containing mark with indentation
-spaces. Use tabs and spaces if tab-width is not nil, otherwise use
-spaces only."))
-
-(defun indent-line* (mark indentation tab-width left)
- (let ((mark2 (clone-mark mark)))
- (beginning-of-line mark2)
- (loop until (end-of-buffer-p mark2)
- as object = (object-after mark2)
- while (or (eql object #\Space) (eql object #\Tab))
- do (delete-range mark2 1))
- (loop until (zerop indentation)
- do (cond ((and tab-width (>= indentation tab-width))
- (insert-object mark2 #\Tab)
- (when left ; spaces must follow tabs
- (forward-object mark2))
- (decf indentation tab-width))
- (t
- (insert-object mark2 #\Space)
- (decf indentation))))))
-
-(defmethod indent-line ((mark left-sticky-mark) indentation tab-width)
- (indent-line* mark indentation tab-width t))
-
-(defmethod indent-line ((mark right-sticky-mark) indentation tab-width)
- (indent-line* mark indentation tab-width nil))
-
-(defun delete-indentation (mark)
- (beginning-of-line mark)
- (unless (beginning-of-buffer-p mark)
- (delete-range mark -1)
- (loop until (end-of-buffer-p mark)
- while (whitespacep (object-after mark))
- do (delete-range mark 1))
- (loop until (beginning-of-buffer-p mark)
- while (whitespacep (object-before mark))
- do (delete-range mark -1))
- (when (and (not (beginning-of-buffer-p mark))
- (constituentp (object-before mark)))
- (insert-object mark #\Space))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Auto fill
-
-(defun fill-line (mark syntax-line-indentation-function fill-column tab-width
- &optional (compress-whitespaces t))
- "Breaks the contents of line pointed to by MARK up to MARK into
-multiple lines such that none of them is longer than FILL-COLUMN. If
-COMPRESS-WHITESPACES is non-nil, whitespaces are compressed after the
[84 lines skipped]
--- /project/climacs/cvsroot/climacs/motion.lisp 2006/06/12 19:10:59 NONE
+++ /project/climacs/cvsroot/climacs/motion.lisp 2006/06/12 19:10:59 1.1
[589 lines skipped]
--- /project/climacs/cvsroot/climacs/motion-commands.lisp 2006/06/12 19:10:59 NONE
+++ /project/climacs/cvsroot/climacs/motion-commands.lisp 2006/06/12 19:10:59 1.1
[803 lines skipped]
--- /project/climacs/cvsroot/climacs/editing.lisp 2006/06/12 19:10:59 NONE
+++ /project/climacs/cvsroot/climacs/editing.lisp 2006/06/12 19:10:59 1.1
[1427 lines skipped]
--- /project/climacs/cvsroot/climacs/editing-commands.lisp 2006/06/12 19:10:59 NONE
+++ /project/climacs/cvsroot/climacs/editing-commands.lisp 2006/06/12 19:10:59 1.1
[1676 lines skipped]