Update of /project/climacs/cvsroot/climacs
In directory common-lisp.net:/tmp/cvs-serv18067
Modified Files:
gui.lisp climacs.asd cl-syntax.lisp
Log Message:
Moved various things from gui.lisp into developer-commands.lisp,
file-commands.lisp, misc-commands.lisp (rather large...),
search-commands.lisp, unicode-commands.lisp and
window-commands.lisp. Also tried to get the .asd right.
Additionally, removed "lisp" as a file-type for the Common Lisp
syntax.
Date: Sat Nov 12 10:34:35 2005
Author: dmurray
Index: climacs/gui.lisp
diff -u climacs/gui.lisp:1.194 climacs/gui.lisp:1.195
--- climacs/gui.lisp:1.194 Thu Nov 3 11:17:40 2005
+++ climacs/gui.lisp Sat Nov 12 10:34:34 2005
@@ -250,652 +250,43 @@
do (when (modified-p buffer)
(setf (needs-saving buffer) t))))
-(define-command (com-overwrite-mode :name t :command-table editing-table) ()
- (with-slots (overwrite-mode) (current-window)
- (setf overwrite-mode (not overwrite-mode))))
-
-(set-key 'com-overwrite-mode
- 'editing-table
- '((:insert)))
-
-(define-command (com-not-modified :name t :command-table buffer-table) ()
- (setf (needs-saving (buffer (current-window))) nil))
-
-(set-key 'com-not-modified
- 'buffer-table
- '((#\~ :meta :shift)))
-
-(define-command (com-set-fill-column :name t :command-table fill-table)
- ((column 'integer :prompt "Column Number:"))
- (set-fill-column column))
-
-(set-key `(com-set-fill-column ,*numeric-argument-marker*)
- 'fill-table
- '((#\x :control) (#\f)))
-
-(defun set-fill-column (column)
- (if (> column 1)
- (setf (auto-fill-column (current-window)) column)
- (progn (beep) (display-message "Set Fill Column requires an explicit argument."))))
-
-(defun possibly-fill-line ()
- (let* ((pane (current-window))
- (buffer (buffer pane)))
- (when (auto-fill-mode pane)
- (let* ((fill-column (auto-fill-column pane))
- (point (point pane))
- (offset (offset point))
- (tab-width (tab-space-count (stream-default-view pane)))
- (syntax (syntax buffer)))
- (when (>= (buffer-display-column buffer offset tab-width)
- (1- fill-column))
- (fill-line point
- (lambda (mark)
- (syntax-line-indentation mark tab-width syntax))
- fill-column
- tab-width))))))
-
-(defun insert-character (char)
- (let* ((window (current-window))
- (point (point window)))
- (unless (constituentp char)
- (possibly-expand-abbrev point))
- (when (whitespacep char)
- (possibly-fill-line))
- (if (and (slot-value window 'overwrite-mode) (not (end-of-line-p point)))
- (progn
- (delete-range point)
- (insert-object point char))
- (insert-object point char))))
-
-(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) ()
- (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) ()
- (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?"))
- (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?"))
- (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) ()
- (let* ((item (handler-case (accept 't :prompt "Zap to Object")
- (error () (progn (beep)
- (display-message "Not a valid object")
- (return-from com-zap-to-object nil)))))
- (current-point (point (current-window)))
- (item-mark (clone-mark current-point))
- (current-offset (offset current-point)))
- (search-forward item-mark (vector item))
- (delete-range current-point (- (offset item-mark) current-offset))))
-
-(define-command (com-zap-to-character :name t :command-table deletion-table) ()
- (let* ((item-string (handler-case (accept 'string :prompt "Zap to Character") ; Figure out how to get #\d and d. (or 'string 'character)?
- (error () (progn (beep)
- (display-message "Not a valid string. ")
- (return-from com-zap-to-character nil)))))
- (item (subseq item-string 0 1))
- (current-point (point (current-window)))
- (item-mark (clone-mark current-point))
-
- (current-offset (offset current-point)))
- (if (> (length item-string) 1)
- (display-message "Using just the first character"))
- (search-forward item-mark item)
- (delete-range current-point (- (offset item-mark) current-offset))))
-
-(set-key 'com-zap-to-character
- 'deletion-table
- '((#\z :meta)))
-
-(defun transpose-objects (mark)
- (unless (beginning-of-buffer-p mark)
- (when (end-of-line-p mark)
- (backward-object 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-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"))
- (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
- '((:left)))
-
-(define-command (com-forward-object :name t :command-table movement-table)
- ((count 'integer :prompt "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
- '((:right)))
-
-(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)
- ;; this is emacs' message in the minibuffer
- (error "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-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-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?"))
- (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
- '((:up)))
-
-(define-command (com-next-line :name t :command-table movement-table)
- ((numarg 'integer :prompt "How many lines?"))
- (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
- '((:down)))
-
-(define-command (com-open-line :name t :command-table editing-table)
- ((numarg 'integer :prompt "How many lines?"))
- (open-line (point (current-window)) numarg))
-
-(set-key `(com-open-line ,*numeric-argument-marker*)
- 'editing-table
- '((#\o :control)))
-
-(defun kill-line (mark &optional (count 1) (whole-lines-p nil) (concatenate-p nil))
- (let ((start (offset mark)))
- (cond ((= 0 count)
- (beginning-of-line mark))
- ((< count 0)
- (loop repeat (- count)
- until (beginning-of-buffer-p mark)
- do (beginning-of-line mark)
- until (beginning-of-buffer-p mark)
- do (backward-object mark)))
- ((or whole-lines-p (> count 1))
- (loop repeat count
- until (end-of-buffer-p mark)
- do (end-of-line mark)
- until (end-of-buffer-p mark)
- do (forward-object mark)))
- (t
- (cond ((end-of-buffer-p mark) nil)
- ((end-of-line-p mark)(forward-object mark))
- (t (end-of-line mark)))))
- (unless (mark= mark start)
- (if concatenate-p
- (kill-ring-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-line :name t :command-table deletion-table)
- ((numarg 'integer :prompt "Kill how many lines?")
- (numargp 'boolean :prompt "Kill entire lines?"))
- (let* ((pane (current-window))
- (point (point pane))
- (concatenate-p (eq (previous-command pane) 'com-kill-line)))
- (kill-line point numarg numargp concatenate-p)))
-
-(set-key `(com-kill-line ,*numeric-argument-marker* ,*numeric-argument-p*)
- 'deletion-table
- '((#\k :control)))
-
-(define-command (com-forward-word :name t :command-table movement-table)
- ((count 'integer :prompt "Number of 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
- '((:right :control)))
-
-(define-command (com-backward-word :name t :command-table movement-table)
- ((count 'integer :prompt "Number of 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
- '((:left :control)))
-
-(define-command (com-delete-word :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of words"))
- (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"))
- (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"))
- (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"))
- (let* ((pane (current-window))
- (point (point pane))
- (mark (mark pane)))
- (unless (eq (previous-command pane) 'com-mark-word)
- (setf (offset mark) (offset point)))
- (if (plusp count)
- (forward-word mark count)
- (backward-word mark (- count)))))
-
-(set-key `(com-mark-word ,*numeric-argument-marker*)
- 'marking-table
- '((#\@ :meta :shift)))
-
-(define-command (com-backward-delete-word :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of words"))
- (backward-delete-word (point (current-window)) count))
-
-(define-command (com-upcase-region :name t :command-table case-table) ()
- (let ((cw (current-window)))
- (upcase-region (mark cw) (point cw))))
-
-(define-command (com-downcase-region :name t :command-table case-table) ()
- (let ((cw (current-window)))
- (downcase-region (mark cw) (point cw))))
-
-(define-command (com-capitalize-region :name t :command-table case-table) ()
- (let ((cw (current-window)))
- (capitalize-region (mark cw) (point cw))))
-
-(define-command (com-upcase-word :name t :command-table case-table) ()
- (upcase-word (point (current-window))))
-
-(set-key 'com-upcase-word
- 'case-table
- '((#\u :meta)))
-
-(define-command (com-downcase-word :name t :command-table case-table) ()
- (downcase-word (point (current-window))))
-
-(set-key 'com-downcase-word
- 'case-table
- '((#\l :meta)))
-
-(define-command (com-capitalize-word :name t :command-table case-table) ()
- (capitalize-word (point (current-window))))
-
-(set-key 'com-capitalize-word
- 'case-table
- '((#\c :meta)))
-
-(define-command (com-tabify-region :name t :command-table editing-table) ()
- (let ((pane (current-window)))
- (tabify-region
- (mark pane) (point pane) (tab-space-count (stream-default-view pane)))))
-
-(define-command (com-untabify-region :name t :command-table editing-table) ()
- (let ((pane (current-window)))
- (untabify-region
- (mark pane) (point pane) (tab-space-count (stream-default-view pane)))))
-
-(defun indent-current-line (pane point)
- (let* ((buffer (buffer pane))
- (view (stream-default-view pane))
- (tab-space-count (tab-space-count view))
- (indentation (syntax-line-indentation point
- tab-space-count
- (syntax buffer))))
- (indent-line point indentation (and (indent-tabs-mode buffer)
- tab-space-count))))
-
-(define-command (com-indent-line :name t :command-table indent-table) ()
- (let* ((pane (current-window))
- (point (point pane)))
- (indent-current-line pane point)))
-
-(set-key 'com-indent-line
- 'indent-table
- '((#\Tab)))
-
-(set-key 'com-indent-line
- 'indent-table
- '((#\i :control)))
-
-(define-command (com-newline-and-indent :name t :command-table indent-table) ()
- (let* ((pane (current-window))
- (point (point pane)))
- (insert-object point #\Newline)
- (indent-current-line pane point)))
-
-(set-key 'com-newline-and-indent
- 'indent-table
- '((#\j :control)))
-
-(define-command (com-delete-indentation :name t :command-table indent-table) ()
- (delete-indentation (point (current-window))))
-
-(set-key 'com-delete-indentation
- 'indent-table
- '((#\^ :shift :meta)))
-
-(define-command (com-auto-fill-mode :name t :command-table fill-table) ()
- (let ((pane (current-window)))
- (setf (auto-fill-mode pane) (not (auto-fill-mode pane)))))
-
-(define-command (com-fill-paragraph :name t :command-table fill-table) ()
- (let* ((pane (current-window))
- (buffer (buffer pane))
- (syntax (syntax buffer))
- (point (point pane))
- (begin-mark (clone-mark point))
- (end-mark (clone-mark point)))
- (unless (eql (object-before begin-mark) #\Newline)
- (backward-paragraph begin-mark syntax))
- (unless (eql (object-after end-mark) #\Newline)
- (forward-paragraph end-mark syntax))
- (do-buffer-region (object offset buffer
- (offset begin-mark) (offset end-mark))
- (when (eql object #\Newline)
- (setf object #\Space)))
- (let ((point-backup (clone-mark point)))
- (setf (offset point) (offset end-mark))
- (possibly-fill-line)
- (setf (offset point) (offset point-backup)))))
-
-(set-key 'com-fill-paragraph
- 'fill-table
- '((#\q :meta)))
-
-(defun filename-completer (so-far mode)
- (flet ((remove-trail (s)
- (subseq s 0 (let ((pos (position #\/ s :from-end t)))
- (if pos (1+ pos) 0)))))
- (let* ((directory-prefix
- (if (and (plusp (length so-far)) (eql (aref so-far 0) #\/))
- ""
- (namestring #+sbcl *default-pathname-defaults*
- #+cmu (ext:default-directory)
- #-(or sbcl cmu) *default-pathname-defaults*)))
- (full-so-far (concatenate 'string directory-prefix so-far))
- (pathnames
- (loop with length = (length full-so-far)
- and wildcard = (concatenate 'string (remove-trail so-far) "*.*")
- for path in
- #+(or sbcl cmu lispworks) (directory wildcard)
- #+openmcl (directory wildcard :directories t)
- #+allegro (directory wildcard :directories-are-files nil)
- #+cormanlisp (nconc (directory wildcard)
- (cl::directory-subdirs dirname))
- #-(or sbcl cmu lispworks openmcl allegro cormanlisp)
- (directory wildcard)
- when (let ((mismatch (mismatch (namestring path) full-so-far)))
- (or (null mismatch) (= mismatch length)))
- collect path))
- (strings (mapcar #'namestring pathnames))
- (first-string (car strings))
- (length-common-prefix nil)
- (completed-string nil)
- (full-completed-string nil))
- (unless (null pathnames)
- (setf length-common-prefix
- (loop with length = (length first-string)
- for string in (cdr strings)
- do (setf length (min length (or (mismatch string first-string) length)))
- finally (return length))))
- (unless (null pathnames)
- (setf completed-string
- (subseq first-string (length directory-prefix)
- (if (null (cdr pathnames)) nil length-common-prefix)))
- (setf full-completed-string
- (concatenate 'string directory-prefix completed-string)))
- (case mode
- ((:complete-limited :complete-maximal)
- (cond ((null pathnames)
- (values so-far nil nil 0 nil))
- ((null (cdr pathnames))
- (values completed-string t (car pathnames) 1 nil))
- (t
- (values completed-string nil nil (length pathnames) nil))))
- (:complete
- (cond ((null pathnames)
- (values so-far t so-far 1 nil))
- ((null (cdr pathnames))
- (values completed-string t (car pathnames) 1 nil))
- ((find full-completed-string strings :test #'string-equal)
- (let ((pos (position full-completed-string strings :test #'string-equal)))
- (values completed-string
- t (elt pathnames pos) (length pathnames) nil)))
+(define-command (com-full-redisplay :name t :command-table base-table) ()
+ (full-redisplay (current-window)))
+
+(set-key 'com-full-redisplay
+ 'base-table
+ '((#\l :control)))
+
+(defun load-file (file-name)
+ (cond ((directory-pathname-p file-name)
+ (display-message "~A is a directory name." file-name)
+ (beep))
+ (t
+ (cond ((probe-file file-name)
+ (load file-name))
(t
- (values completed-string nil nil (length pathnames) nil))))
- (:possibilities
- (values nil nil nil (length pathnames)
- (loop with length = (length directory-prefix)
- for name in pathnames
- collect (list (subseq (namestring name) length nil)
- name))))))))
-
-(define-presentation-method present (object (type pathname)
- stream (view climacs-textual-view) &key)
- (princ (namestring object) stream))
-
-(define-presentation-method accept ((type pathname) stream (view climacs-textual-view)
- &key (default nil defaultp) (default-type type))
- (multiple-value-bind (pathname success string)
- (complete-input stream
- #'filename-completer
- :allow-any-input t)
- (cond (success
- (values pathname type))
- ((and (zerop (length string))
- defaultp)
- (values default default-type))
- (t (values string 'string)))))
-
-(defun filepath-filename (pathname)
- (if (null (pathname-type pathname))
- (pathname-name pathname)
- (concatenate 'string (pathname-name pathname)
- "." (pathname-type pathname))))
-
-(defun syntax-class-name-for-filepath (filepath)
- (or (climacs-syntax::syntax-description-class-name
- (find (or (pathname-type filepath)
- (pathname-name filepath))
- climacs-syntax::*syntaxes*
- :test (lambda (x y)
- (member x y :test #'string-equal))
- :key #'climacs-syntax::syntax-description-pathname-types))
- 'basic-syntax))
-
-;; Adapted from cl-fad/PCL
-(defun directory-pathname-p (pathspec)
- "Returns NIL if PATHSPEC does not designate a directory."
- (let ((name (pathname-name pathspec))
- (type (pathname-type pathspec)))
- (and (or (null name) (eql name :unspecific))
- (or (null type) (eql type :unspecific)))))
+ (display-message "No such file: ~A" file-name)
+ (beep))))))
+
+(define-command (com-load-file :name t :command-table base-table) ()
+ (let ((filepath (accept 'pathname :prompt "Load File")))
+ (load-file filepath)))
+
+(set-key 'com-load-file
+ 'base-table
+ '((#\c :control) (#\l :control)))
+
+(loop for code from (char-code #\Space) to (char-code #\~)
+ do (set-key `(com-self-insert ,*numeric-argument-marker*)
+ 'self-insert-table
+ (list (list (code-char code)))))
+
+(set-key `(com-self-insert ,*numeric-argument-marker*)
+ 'self-insert-table
+ '((#\Newline)))
+
+;;;;;;;;;;;;;;;;;;;
+;;; Pane commands
(defun make-buffer (&optional name)
(let ((buffer (make-instance 'climacs-buffer)))
@@ -903,124 +294,6 @@
(push buffer (buffers *application-frame*))
buffer))
-(defun find-file (filepath)
- (cond ((null filepath)
- (display-message "No file name given.")
- (beep))
- ((directory-pathname-p filepath)
- (display-message "~A is a directory name." filepath)
- (beep))
- (t
- (let ((existing-buffer (find filepath (buffers *application-frame*)
- :key #'filepath :test #'equal)))
- (if existing-buffer
- (switch-to-buffer existing-buffer)
- (let ((buffer (make-buffer))
- (pane (current-window)))
- (setf (offset (point (buffer pane))) (offset (point pane)))
- (setf (buffer (current-window)) buffer)
- (setf (syntax buffer)
- (make-instance (syntax-class-name-for-filepath filepath)
- :buffer (buffer (point pane))))
- ;; Don't want to create the file if it doesn't exist.
- (when (probe-file filepath)
- (with-open-file (stream filepath :direction :input)
- (input-from-stream stream buffer 0)))
- (setf (filepath buffer) filepath
- (name buffer) (filepath-filename filepath)
- (needs-saving buffer) nil)
- (beginning-of-buffer (point pane))
- ;; this one is needed so that the buffer modification protocol
- ;; resets the low and high marks after redisplay
- (redisplay-frame-panes *application-frame*)
- buffer))))))
-
-(define-command (com-find-file :name t :command-table buffer-table) ()
- (let* ((filepath (accept 'pathname :prompt "Find File")))
- (find-file filepath)))
-
-(set-key 'com-find-file
- 'buffer-table
- '((#\x :control) (#\f :control)))
-
-(defun find-file-read-only (filepath)
- (cond ((null filepath)
- (display-message "No file name given.")
- (beep))
- ((directory-pathname-p filepath)
- (display-message "~A is a directory name." filepath)
- (beep))
- (t
- (let ((existing-buffer (find filepath (buffers *application-frame*)
- :key #'filepath :test #'equal)))
- (if (and existing-buffer (read-only-p existing-buffer))
- (switch-to-buffer existing-buffer)
- (if (probe-file filepath)
- (let ((buffer (make-buffer))
- (pane (current-window)))
- (setf (offset (point (buffer pane))) (offset (point pane)))
- (setf (buffer (current-window)) buffer)
- (setf (syntax buffer)
- (make-instance (syntax-class-name-for-filepath filepath)
- :buffer (buffer (point pane))))
- (with-open-file (stream filepath :direction :input)
- (input-from-stream stream buffer 0))
- (setf (filepath buffer) filepath
- (name buffer) (filepath-filename filepath)
- (needs-saving buffer) nil
- (read-only-p buffer) t)
- (beginning-of-buffer (point pane))
- ;; this one is needed so that the buffer modification protocol
- ;; resets the low and high marks after redisplay
- (redisplay-frame-panes *application-frame*)
- buffer)
- (progn
- (display-message "No such file: ~A" filepath)
- (beep)
- nil)))))))
-
-(define-command (com-find-file-read-only :name t :command-table buffer-table) ()
- (let ((filepath (accept 'pathname :Prompt "Find file read only")))
- (find-file-read-only filepath)))
-
-(set-key 'com-find-file-read-only
- 'buffer-table
- '((#\x :control) (#\r :control)))
-
-(define-command (com-read-only :name t :command-table buffer-table) ()
- (let ((buffer (buffer (current-window))))
- (setf (read-only-p buffer) (not (read-only-p buffer)))))
-
-(set-key 'com-read-only
- 'buffer-table
- '((#\x :control) (#\q :control)))
-
-(defun set-visited-file-name (filename buffer)
- (setf (filepath buffer) filename
- (name buffer) (filepath-filename filename)
- (needs-saving buffer) t))
-
-(define-command (com-set-visited-file-name :name t :command-table buffer-table) ()
- (let ((filename (accept 'pathname :prompt "New file name")))
- (set-visited-file-name filename (buffer (current-window)))))
-
-(define-command (com-insert-file :name t :command-table buffer-table) ()
- (let ((filename (accept 'pathname :prompt "Insert File"))
- (pane (current-window)))
- (when (probe-file filename)
- (setf (mark pane) (clone-mark (point pane) :left))
- (with-open-file (stream filename :direction :input)
- (input-from-stream stream
- (buffer pane)
- (offset (point pane))))
- (psetf (offset (mark pane)) (offset (point pane))
- (offset (point pane)) (offset (mark pane))))
- (redisplay-frame-panes *application-frame*)))
-
-(set-key 'com-insert-file
- 'buffer-table
- '((#\x :control) (#\i :control)))
-
(defgeneric erase-buffer (buffer))
(defmethod erase-buffer ((buffer string))
@@ -1035,93 +308,6 @@
(end-of-buffer point)
(delete-region mark point)))
-(define-command (com-revert-buffer :name t :command-table buffer-table) ()
- (let* ((pane (current-window))
- (buffer (buffer pane))
- (filepath (filepath buffer))
- (save (offset (point pane))))
- (when (accept 'boolean :prompt (format nil "Revert buffer from file ~A?"
- (filepath buffer)))
- (cond ((directory-pathname-p filepath)
- (display-message "~A is a directory name." filepath)
- (beep))
- ((probe-file filepath)
- (erase-buffer buffer)
- (with-open-file (stream filepath :direction :input)
- (input-from-stream stream buffer 0))
- (setf (offset (point pane))
- (min (size buffer) save)))
- (t
- (display-message "No file ~A" filepath)
- (beep))))))
-
-(defun save-buffer (buffer)
- (let ((filepath (or (filepath buffer)
- (accept 'pathname :prompt "Save Buffer to File"))))
- (cond
- ((directory-pathname-p filepath)
- (display-message "~A is a directory." filepath)
- (beep))
- (t
- (when (probe-file filepath)
- (let ((backup-name (pathname-name filepath))
- (backup-type (concatenate 'string (pathname-type filepath) "~")))
- (rename-file filepath (make-pathname :name backup-name
- :type backup-type))))
- (with-open-file (stream filepath :direction :output :if-exists :supersede)
- (output-to-stream stream buffer 0 (size buffer)))
- (setf (filepath buffer) filepath
- (name buffer) (filepath-filename filepath))
- (display-message "Wrote: ~a" (filepath buffer))
- (setf (needs-saving buffer) nil)))))
-
-(define-command (com-save-buffer :name t :command-table buffer-table) ()
- (let ((buffer (buffer (current-window))))
- (if (or (null (filepath buffer))
- (needs-saving buffer))
- (save-buffer buffer)
- (display-message "No changes need to be saved from ~a" (name buffer)))))
-
-(set-key 'com-save-buffer
- 'buffer-table
- '((#\x :control) (#\s :control)))
-
-(defmethod frame-exit :around ((frame climacs))
- (loop for buffer in (buffers frame)
- when (and (needs-saving buffer)
- (filepath buffer)
- (handler-case (accept 'boolean
- :prompt (format nil "Save buffer: ~a ?" (name buffer)))
- (error () (progn (beep)
- (display-message "Invalid answer")
- (return-from frame-exit nil)))))
- do (save-buffer buffer))
- (when (or (notany #'(lambda (buffer) (and (needs-saving buffer) (filepath buffer)))
- (buffers frame))
- (handler-case (accept 'boolean :prompt "Modified buffers exist. Quit anyway?")
- (error () (progn (beep)
- (display-message "Invalid answer")
- (return-from frame-exit nil)))))
- (call-next-method)))
-
-(define-command (com-write-buffer :name t :command-table buffer-table) ()
- (let ((filepath (accept 'pathname :prompt "Write Buffer to File"))
- (buffer (buffer (current-window))))
- (cond
- ((directory-pathname-p filepath)
- (display-message "~A is a directory name." filepath))
- (t
- (with-open-file (stream filepath :direction :output :if-exists :supersede)
- (output-to-stream stream buffer 0 (size buffer)))
- (setf (filepath buffer) filepath
- (name buffer) (filepath-filename filepath)
- (needs-saving buffer) nil)
- (display-message "Wrote: ~a" (filepath buffer))))))
-
-(set-key 'com-write-buffer
- 'buffer-table
- '((#\x :control) (#\w :control)))
-
(define-presentation-method present (object (type buffer)
stream
(view textual-view)
@@ -1227,1497 +413,3 @@
(set-key 'com-kill-buffer
'pane-table
'((#\x :control) (#\k)))
-
-(define-command (com-full-redisplay :name t :command-table base-table) ()
- (full-redisplay (current-window)))
-
-(set-key 'com-full-redisplay
- 'base-table
- '((#\l :control)))
-
-(defun load-file (file-name)
- (cond ((directory-pathname-p file-name)
- (display-message "~A is a directory name." file-name)
- (beep))
- (t
- (cond ((probe-file file-name)
- (load file-name))
- (t
- (display-message "No such file: ~A" file-name)
- (beep))))))
-
-(define-command (com-load-file :name t :command-table base-table) ()
- (let ((filepath (accept 'pathname :prompt "Load File")))
- (load-file filepath)))
-
-(set-key 'com-load-file
- 'base-table
- '((#\c :control) (#\l :control)))
-
-(define-command (com-beginning-of-buffer :name t :command-table movement-table) ()
- (beginning-of-buffer (point (current-window))))
-
-(set-key 'com-beginning-of-buffer
- 'movement-table
- '((#\< :shift :meta)))
-
-(set-key 'com-beginning-of-buffer
- 'movement-table
- '((:home :control)))
-
-(define-command (com-page-down :name t :command-table movement-table) ()
- (let ((pane (current-window)))
- (page-down pane)))
-
-(set-key 'com-page-down
- 'movement-table
- '((#\v :control)))
-
-(set-key 'com-page-down
- 'movement-table
- '((:next)))
-
-(define-command (com-page-up :name t :command-table movement-table) ()
- (let ((pane (current-window)))
- (page-up pane)))
-
-(set-key 'com-page-up
- 'movement-table
- '((#\v :meta)))
-
-(set-key 'com-page-up
- 'movement-table
- '((:prior)))
-
-(define-command (com-end-of-buffer :name t :command-table movement-table) ()
- (end-of-buffer (point (current-window))))
-
-(set-key 'com-end-of-buffer
- 'movement-table
- '((#\> :shift :meta)))
-
-(set-key 'com-end-of-buffer
- 'movement-table
- '((:end :control)))
-
-(define-command (com-mark-whole-buffer :name t :command-table marking-table) ()
- (beginning-of-buffer (point (current-window)))
- (end-of-buffer (mark (current-window))))
-
-(set-key 'com-mark-whole-buffer
- 'marking-table
- '((#\x :control) (#\h)))
-
-(defun back-to-indentation (mark)
- (beginning-of-line mark)
- (loop until (end-of-line-p mark)
- while (whitespacep (object-after mark))
- do (forward-object mark)))
-
-(define-command (com-back-to-indentation :name t :command-table movement-table) ()
- (back-to-indentation (point (current-window))))
-
-(set-key 'com-back-to-indentation
- 'movement-table
- '((#\m :meta)))
-
-(defun delete-horizontal-space (mark &optional (backward-only-p nil))
- (let ((mark2 (clone-mark mark)))
- (loop until (beginning-of-line-p mark)
- while (whitespacep (object-before mark))
- do (backward-object mark))
- (unless backward-only-p
- (loop until (end-of-line-p mark2)
- while (whitespacep (object-after mark2))
- do (forward-object mark2)))
- (delete-region mark mark2)))
-
-(define-command (com-delete-horizontal-space :name t :command-table deletion-table)
- ((backward-only-p
- 'boolean :prompt "Delete backwards only?"))
- (delete-horizontal-space (point (current-window)) backward-only-p))
-
-(set-key `(com-delete-horizontal-space ,*numeric-argument-p*)
- 'deletion-table
- '((#\\ :meta)))
-
-(defun just-one-space (mark count)
- (let (offset)
- (loop until (beginning-of-line-p mark)
- while (whitespacep (object-before mark))
- do (backward-object mark))
- (loop until (end-of-line-p mark)
- while (whitespacep (object-after mark))
- repeat count do (forward-object mark)
- finally (setf offset (offset mark)))
- (loop until (end-of-line-p mark)
- while (whitespacep (object-after mark))
- do (forward-object mark))
- (delete-region offset mark)))
-
-(define-command (com-just-one-space :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of spaces"))
- (just-one-space (point (current-window)) count))
-
-(set-key `(com-just-one-space ,*numeric-argument-marker*)
- 'deletion-table
- '((#\Space :meta)))
-
-(defun goto-position (mark pos)
- (setf (offset mark) pos))
-
-(define-command (com-goto-position :name t :command-table movement-table) ()
- (goto-position
- (point (current-window))
- (handler-case (accept 'integer :prompt "Goto Position")
- (error () (progn (beep)
- (display-message "Not a valid position")
- (return-from com-goto-position nil))))))
-
-(defun goto-line (mark line-number)
- (loop with m = (clone-mark (low-mark (buffer mark))
- :right)
- initially (beginning-of-buffer m)
- do (end-of-line m)
- until (end-of-buffer-p m)
- repeat (1- line-number)
- do (incf (offset m))
- (end-of-line m)
- finally (beginning-of-line m)
- (setf (offset mark) (offset m))))
-
-(define-command (com-goto-line :name t :command-table movement-table) ()
- (goto-line (point (current-window))
- (handler-case (accept 'integer :prompt "Goto Line")
- (error () (progn (beep)
- (display-message "Not a valid line number")
- (return-from com-goto-line nil))))))
-
-(define-command (com-browse-url :name t :command-table base-table) ()
- (let ((url (accept 'url :prompt "Browse URL")))
- #+ (and sbcl darwin)
- (sb-ext:run-program "/usr/bin/open" `(,url) :wait nil)
- #+ (and openmcl darwin)
- (ccl:run-program "/usr/bin/open" `(,url) :wait nil)))
-
-(define-command (com-set-mark :name t :command-table marking-table) ()
- (let ((pane (current-window)))
- (setf (mark pane) (clone-mark (point pane)))))
-
-(set-key 'com-set-mark
- 'marking-table
- '((#\Space :control)))
-
-(define-command (com-exchange-point-and-mark :name t :command-table marking-table) ()
- (let ((pane (current-window)))
- (psetf (offset (mark pane)) (offset (point pane))
- (offset (point pane)) (offset (mark pane)))))
-
-(set-key 'com-exchange-point-and-mark
- 'marking-table
- '((#\x :control) (#\x :control)))
-
-(defgeneric set-syntax (buffer syntax))
-
-(defmethod set-syntax ((buffer climacs-buffer) (syntax syntax))
- (setf (syntax buffer) syntax))
-
-;;; FIXME: This :around method is probably not going to remain here
-;;; for ever; it is a symptom of level mixing, I think. See also the
-;;; similar method on (SETF BUFFER). -- CSR, 2005-10-31.
-(defmethod (setf syntax) :around (syntax (buffer climacs-buffer))
- (call-next-method)
- ;; FIXME: we need this because some clients (e.g. the tablature
- ;; editor) use climacs buffers without a gui, for off-line (e.g. Web
- ;; backend) processing. The problem here is that (setf syntax)
- ;; /should/ have no GUI effects whatsoever. So maybe the right
- ;; answer would instead be to find the active pane's buffer in the
- ;; top-level loop? That might need to be pushed into ESA.
- (when clim:*application-frame*
- (let ((pane (current-window)))
- (assert (eq (buffer pane) buffer))
- (note-pane-syntax-changed pane syntax))))
-
-;;; FIXME - what should this specialise on?
-(defmethod set-syntax ((buffer climacs-buffer) syntax)
- (set-syntax buffer (make-instance syntax :buffer buffer)))
-
-(defmethod set-syntax ((buffer climacs-buffer) (syntax string))
- (let ((syntax-class (syntax-from-name syntax)))
- (cond (syntax-class
- (set-syntax buffer (make-instance syntax-class
- :buffer buffer)))
- (t
- (beep)
- (display-message "No such syntax: ~A." syntax)))))
-
-(define-command (com-set-syntax :name t :command-table buffer-table) ()
- (let* ((pane (current-window))
- (buffer (buffer pane)))
- (set-syntax buffer (accept 'syntax :prompt "Set Syntax"))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Commands for splitting windows
-
-(defun replace-constellation (constellation additional-constellation vertical-p)
- (let* ((parent (sheet-parent constellation))
- (children (sheet-children parent))
- (first (first children))
- (second (second children))
- (third (third children))
- (adjust (make-pane 'clim-extensions:box-adjuster-gadget)))
- (assert (member constellation children))
- (sheet-disown-child parent constellation)
- (let ((new (if vertical-p
- (vertically ()
- constellation adjust additional-constellation)
- (horizontally ()
- constellation adjust additional-constellation))))
- (sheet-adopt-child parent new)
- (reorder-sheets parent
- (if (eq constellation first)
- (if third
- (list new second third)
- (list new second))
- (if third
- (list first second new)
- (list first new)))))))
-
-(defun find-parent (sheet)
- (loop for parent = (sheet-parent sheet)
- then (sheet-parent parent)
- until (typep parent 'vrack-pane)
- finally (return parent)))
-
-(defclass typeout-pane (application-pane esa-pane-mixin) ())
-
-(defun make-typeout-constellation (&optional label)
- (let* ((typeout-pane
- (make-pane 'typeout-pane :width 900 :height 400 :display-time nil))
- (label
- (make-pane 'label-pane :label label))
- (vbox
- (vertically ()
- (scrolling (:scroll-bar :vertical) typeout-pane) label)))
- (values vbox typeout-pane)))
-
-(defun typeout-window (&optional (label "Typeout") (pane (current-window)))
- (with-look-and-feel-realization
- ((frame-manager *application-frame*) *application-frame*)
- (multiple-value-bind (vbox new-pane) (make-typeout-constellation label)
- (let* ((current-window pane)
- (constellation-root (find-parent current-window)))
- (push new-pane (windows *application-frame*))
- (other-window)
- (replace-constellation constellation-root vbox t)
- (full-redisplay current-window)
- new-pane))))
-
-(define-command (com-describe-bindings :name t :command-table help-table)
- ((sort-by-keystrokes 'boolean :prompt "Sort by keystrokes?"))
- (let* ((window (current-window))
- (buffer (buffer (current-window)))
- (stream (typeout-window
- (format nil "~10THelp: Describe Bindings for ~A" (name buffer))))
- (command-table (command-table window)))
- (esa::describe-bindings stream command-table
- (if sort-by-keystrokes
- #'esa::sort-by-keystrokes
- #'esa::sort-by-name))))
-
-(set-key `(com-describe-bindings ,*numeric-argument-p*) 'help-table '((#\h :control) (#\b)))
-
-(defun make-pane-constellation (&optional (with-scrollbars *with-scrollbars*))
- "make a vbox containing a scroller pane as its first child and an
-info pane as its second child. The scroller pane contains a viewport
-which contains an extended pane. Return the vbox and the extended pane
-as two values.
-If with-scrollbars nil, omit the scroller."
- (let* ((extended-pane
- (make-pane 'extended-pane
- :width 900 :height 400
- :name 'window
- :end-of-line-action :scroll
- :incremental-redisplay t
- :display-function 'display-window
- :command-table 'global-climacs-table))
- (vbox
- (vertically ()
- (if with-scrollbars
- (scrolling ()
- extended-pane)
- extended-pane)
- (make-pane 'climacs-info-pane
- :master-pane extended-pane
- :width 900))))
- (values vbox extended-pane)))
-
-(defun split-window (&optional (vertically-p nil) (pane (current-window)))
- (with-look-and-feel-realization
- ((frame-manager *application-frame*) *application-frame*)
- (multiple-value-bind (vbox new-pane) (make-pane-constellation)
- (let* ((current-window pane)
- (constellation-root (find-parent current-window)))
- (setf (offset (point (buffer current-window))) (offset (point current-window))
- (buffer new-pane) (buffer current-window)
- (auto-fill-mode new-pane) (auto-fill-mode current-window)
- (auto-fill-column new-pane) (auto-fill-column current-window))
- (push new-pane (windows *application-frame*))
- (setf *standard-output* new-pane)
- (replace-constellation constellation-root vbox vertically-p)
- (full-redisplay current-window)
- (full-redisplay new-pane)
- new-pane))))
-
-(define-command (com-split-window-vertically :name t :command-table window-table) ()
- (split-window t))
-
-(set-key 'com-split-window-vertically
- 'window-table
- '((#\x :control) (#\2)))
-
-(define-command (com-split-window-horizontally :name t :command-table window-table) ()
- (split-window))
-
-(set-key 'com-split-window-horizontally
- 'window-table
- '((#\x :control) (#\3)))
-
-(defun other-window (&optional pane)
- (if (and pane (find pane (windows *application-frame*)))
- (setf (windows *application-frame*)
- (append (list pane)
- (remove pane (windows *application-frame*))))
- (setf (windows *application-frame*)
- (append (cdr (windows *application-frame*))
- (list (car (windows *application-frame*))))))
- (setf *standard-output* (car (windows *application-frame*))))
-
-(define-command (com-other-window :name t :command-table window-table) ()
- (other-window))
-
-(set-key 'com-other-window
- 'window-table
- '((#\x :control) (#\o)))
-
-(defun click-to-offset (window x y)
- (with-slots (top bot) window
- (let ((new-x (floor x (stream-character-width window #\m)))
- (new-y (floor y (stream-line-height window)))
- (buffer (buffer window)))
- (loop for scan from (offset top)
- with lines = 0
- until (= scan (offset bot))
- until (= lines new-y)
- when (eql (buffer-object buffer scan) #\Newline)
- do (incf lines)
- finally (loop for columns from 0
- until (= scan (offset bot))
- until (eql (buffer-object buffer scan) #\Newline)
- until (= columns new-x)
- do (incf scan))
- (return scan)))))
-
-(define-command (com-switch-to-this-window :name nil :command-table window-table)
- ((window 'pane) (x 'integer) (y 'integer))
- (other-window window)
- (when (typep window 'extended-pane)
- (setf (offset (point window))
- (click-to-offset window x y))))
-
-(define-presentation-to-command-translator blank-area-to-switch-to-this-window
- (blank-area com-switch-to-this-window window-table :echo nil)
- (window x y)
- (list window x y))
-
-(define-gesture-name :select-other :pointer-button (:right) :unique nil)
-
-(define-command (com-mouse-save :name nil :command-table window-table)
- ((window 'pane) (x 'integer) (y 'integer))
- (when (and (typep window 'extended-pane)
- (eq window (current-window)))
- (setf (offset (mark window))
- (click-to-offset window x y))
- (com-exchange-point-and-mark)
- (com-copy-region)))
-
-(define-presentation-to-command-translator blank-area-to-mouse-save
- (blank-area com-mouse-save window-table :echo nil :gesture :select-other)
- (window x y)
- (list window x y))
-
-(define-gesture-name :middle-button :pointer-button (:middle) :unique nil)
-
-(define-command (com-yank-here :name nil :command-table window-table)
- ((window 'pane) (x 'integer) (y 'integer))
- (when (typep window 'extended-pane)
- (other-window window)
- (setf (offset (point window))
- (click-to-offset window x y))
- (com-yank)))
-
-(define-presentation-to-command-translator blank-area-to-yank-here
- (blank-area com-yank-here window-table :echo nil :gesture :middle-button)
- (window x y)
- (list window x y))
-
-(defun single-window ()
- (loop until (null (cdr (windows *application-frame*)))
- do (rotatef (car (windows *application-frame*))
- (cadr (windows *application-frame*)))
- (com-delete-window))
- (setf *standard-output* (car (windows *application-frame*))))
-
-(define-command (com-single-window :name t :command-table window-table) ()
- (single-window))
-
-(set-key 'com-single-window
- 'window-table
- '((#\x :control) (#\1)))
-
-(define-command (com-scroll-other-window :name t :command-table window-table) ()
- (let ((other-window (second (windows *application-frame*))))
- (when other-window
- (page-down other-window))))
-
-(set-key 'com-scroll-other-window
- 'window-table
- '((#\v :control :meta)))
-
-(define-command (com-scroll-other-window-up :name t :command-table window-table) ()
- (let ((other-window (second (windows *application-frame*))))
- (when other-window
- (page-up other-window))))
-
-(set-key 'com-scroll-other-window-up
- 'window-table
- '((#\V :control :meta :shift)))
-
-(defun delete-window (&optional (window (current-window)))
- (unless (null (cdr (windows *application-frame*)))
- (let* ((constellation (find-parent window))
- (box (sheet-parent constellation))
- (box-children (sheet-children box))
- (other (if (eq constellation (first box-children))
- (third box-children)
- (first box-children)))
- (parent (sheet-parent box))
- (children (sheet-children parent))
- (first (first children))
- (second (second children))
- (third (third children)))
- (setf (windows *application-frame*)
- (remove window (windows *application-frame*)))
- (setf *standard-output* (car (windows *application-frame*)))
- (sheet-disown-child box other)
- (sheet-disown-child parent box)
- (sheet-adopt-child parent other)
- (reorder-sheets parent (if (eq box first)
- (if third
- (list other second third)
- (list other second))
- (if third
- (list first second other)
- (list first other)))))))
-
-(define-command (com-delete-window :name t :command-table window-table) ()
- (delete-window))
-
-(set-key 'com-delete-window
- 'window-table
- '((#\x :control) (#\0)))
-
-;;;;;;;;;;;;;;;;;;;;
-;; Kill ring commands
-
-;; Copies an element from a kill-ring to a buffer at the given offset
-(define-command (com-yank :name t :command-table editing-table) ()
- (insert-sequence (point (current-window)) (kill-ring-yank *kill-ring*)))
-
-(set-key 'com-yank
- 'editing-table
- '((#\y :control)))
-
-;; Destructively cut a given buffer region into the kill-ring
-(define-command (com-kill-region :name t :command-table editing-table) ()
- (let ((pane (current-window)))
- (kill-ring-standard-push
- *kill-ring* (region-to-sequence (mark pane) (point pane)))
- (delete-region (mark pane) (point pane))))
-
-(set-key 'com-kill-region
- 'editing-table
- '((#\w :control)))
-
-;; Non destructively copies buffer region to the kill ring
-(define-command (com-copy-region :name t :command-table marking-table) ()
- (let ((pane (current-window)))
- (kill-ring-standard-push *kill-ring* (region-to-sequence (point pane) (mark pane)))))
-
-(set-key 'com-copy-region
- 'marking-table
- '((#\w :meta)))
-
-(define-command (com-rotate-yank :name t :command-table editing-table) ()
- (let* ((pane (current-window))
- (point (point pane))
- (last-yank (kill-ring-yank *kill-ring*)))
- (if (eq (previous-command pane)
- 'com-rotate-yank)
- (progn
- (delete-range point (* -1 (length last-yank)))
- (rotate-yank-position *kill-ring*)))
- (insert-sequence point (kill-ring-yank *kill-ring*))))
-
-(set-key 'com-rotate-yank
- 'editing-table
- '((#\y :meta)))
-
-(define-command (com-resize-kill-ring :name t :command-table editing-table) ()
- (let ((size (handler-case (accept 'integer :prompt "New kill ring size")
- (error () (progn (beep)
- (display-message "Not a valid kill ring size")
- (return-from com-resize-kill-ring nil))))))
- (setf (kill-ring-max-size *kill-ring*) size)))
-
-(define-command (com-append-next-kill :name t :command-table editing-table) ()
- (setf (append-next-p *kill-ring*) t))
-
-(set-key 'com-append-next-kill
- 'editing-table
- '((#\w :control :meta)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Incremental search
-
-(make-command-table 'isearch-climacs-table :errorp nil)
-
-(defun isearch-command-loop (pane forwardp)
- (let ((point (point pane)))
- (unless (endp (isearch-states pane))
- (setf (isearch-previous-string pane)
- (search-string (first (isearch-states pane)))))
- (setf (isearch-mode pane) t)
- (setf (isearch-states pane)
- (list (make-instance 'isearch-state
- :search-string ""
- :search-mark (clone-mark point)
- :search-forward-p forwardp
- :search-success-p t)))
- (simple-command-loop 'isearch-climacs-table
- (isearch-mode pane)
- ((setf (isearch-mode pane) nil)))))
-
-(defun isearch-from-mark (pane mark string forwardp)
- (flet ((object-equal (x y)
- (if (characterp x)
- (and (characterp y) (char-equal x y))
- (eql x y))))
- (let* ((point (point pane))
- (mark2 (clone-mark mark))
- (success (funcall (if forwardp #'search-forward #'search-backward)
- mark2
- string
- :test #'object-equal)))
- (when success
- (setf (offset point) (offset mark2)
- (offset mark) (if forwardp
- (- (offset mark2) (length string))
- (+ (offset mark2) (length string)))))
- (display-message "~:[Failing ~;~]Isearch~:[ backward~;~]: ~A"
- success forwardp string)
- (push (make-instance 'isearch-state
- :search-string string
- :search-mark mark
- :search-forward-p forwardp
- :search-success-p success)
- (isearch-states pane))
- (unless success
- (beep)))))
-
-(define-command (com-isearch-forward :name t :command-table search-table) ()
- (display-message "Isearch: ")
- (isearch-command-loop (current-window) t))
-
-(set-key 'com-isearch-forward
- 'search-table
- '((#\s :control)))
-
-(define-command (com-isearch-backward :name t :command-table search-table) ()
- (display-message "Isearch backward: ")
- (isearch-command-loop (current-window) nil))
-
-(set-key 'com-isearch-backward
- 'search-table
- '((#\r :control)))
-
-(define-command (com-isearch-append-char :name t :command-table isearch-climacs-table) ()
- (let* ((pane (current-window))
- (states (isearch-states pane))
- (string (concatenate 'string
- (search-string (first states))
- (string *current-gesture*)))
- (mark (clone-mark (search-mark (first states))))
- (forwardp (search-forward-p (first states))))
- (unless forwardp
- (incf (offset mark)))
- (isearch-from-mark pane mark string forwardp)))
-
-(define-command (com-isearch-delete-char :name t :command-table isearch-climacs-table) ()
- (let* ((pane (current-window)))
- (cond ((null (second (isearch-states pane)))
- (display-message "Isearch: ")
- (beep))
- (t
- (pop (isearch-states pane))
- (loop until (endp (rest (isearch-states pane)))
- until (search-success-p (first (isearch-states pane)))
- do (pop (isearch-states pane)))
- (let ((state (first (isearch-states pane))))
- (setf (offset (point pane))
- (if (search-forward-p state)
- (+ (offset (search-mark state))
- (length (search-string state)))
- (- (offset (search-mark state))
- (length (search-string state)))))
- (display-message "Isearch~:[ backward~;~]: ~A"
- (search-forward-p state)
- (search-string state)))))))
-
-(define-command (com-isearch-search-forward :name t :command-table isearch-climacs-table) ()
- (let* ((pane (current-window))
- (point (point pane))
- (states (isearch-states pane))
- (string (if (null (second states))
- (isearch-previous-string pane)
- (search-string (first states))))
- (mark (clone-mark point)))
- (isearch-from-mark pane mark string t)))
-
-(define-command (com-isearch-search-backward :name t :command-table isearch-climacs-table) ()
- (let* ((pane (current-window))
- (point (point pane))
- (states (isearch-states pane))
- (string (if (null (second states))
- (isearch-previous-string pane)
- (search-string (first states))))
- (mark (clone-mark point)))
- (isearch-from-mark pane mark string nil)))
-
-(define-command (com-isearch-exit :name t :command-table isearch-climacs-table) ()
- (setf (isearch-mode (current-window)) nil))
-
-(defun isearch-set-key (gesture command)
- (add-command-to-command-table command 'isearch-climacs-table
- :keystroke gesture :errorp nil))
-
-(loop for code from (char-code #\Space) to (char-code #\~)
- do (isearch-set-key (code-char code) 'com-isearch-append-char))
-
-(isearch-set-key '(#\Newline) 'com-isearch-exit)
-(isearch-set-key '(#\Backspace) 'com-isearch-delete-char)
-(isearch-set-key '(#\s :control) 'com-isearch-search-forward)
-(isearch-set-key '(#\r :control) 'com-isearch-search-backward)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Query replace
-
-(make-command-table 'query-replace-climacs-table :errorp nil)
-
-(defun query-replace-find-next-match (mark string)
- (flet ((object-equal (x y)
- (and (characterp x)
- (characterp y)
- (char-equal x y))))
- (let ((offset-before (offset mark)))
- (search-forward mark string :test #'object-equal)
- (/= (offset mark) offset-before))))
-
-(define-command (com-query-replace :name t :command-table search-table) ()
- (let* ((pane (current-window))
- (old-state (query-replace-state pane))
- (old-string1 (when old-state (string1 old-state)))
- (old-string2 (when old-state (string2 old-state)))
- (string1 (handler-case
- (if old-string1
- (accept 'string
- :prompt "Query Replace"
- :default old-string1
- :default-type 'string)
- (accept 'string :prompt "Query Replace"))
- (error () (progn (beep)
- (display-message "Empty string")
- (return-from com-query-replace nil)))))
- (string2 (handler-case
- (if old-string2
- (accept 'string
- :prompt (format nil "Query Replace ~A with"
- string1)
- :default old-string2
- :default-type 'string)
- (accept 'string
- :prompt (format nil "Query Replace ~A with" string1)))
- (error () (progn (beep)
- (display-message "Empty string")
- (return-from com-query-replace nil)))))
- (point (point pane))
- (occurrences 0))
- (declare (special string1 string2 occurrences))
- (when (query-replace-find-next-match point string1)
- (setf (query-replace-state pane) (make-instance 'query-replace-state
- :string1 string1
- :string2 string2)
- (query-replace-mode pane) t)
- (display-message "Query Replace ~A with ~A:"
- string1 string2)
- (simple-command-loop 'query-replace-climacs-table
- (query-replace-mode pane)
- ((setf (query-replace-mode pane) nil))))
- (display-message "Replaced ~A occurrence~:P" occurrences)))
-
-(set-key 'com-query-replace
- 'search-table
- '((#\% :shift :meta)))
-
-(define-command (com-query-replace-replace :name t :command-table query-replace-climacs-table) ()
- (declare (special string1 string2 occurrences))
- (let* ((pane (current-window))
- (point (point pane))
- (buffer (buffer pane))
- (string1-length (length string1)))
- (backward-object point string1-length)
- (let* ((offset1 (offset point))
- (offset2 (+ offset1 string1-length))
- (region-case (buffer-region-case buffer offset1 offset2)))
- (delete-range point string1-length)
- (insert-sequence point string2)
- (setf offset2 (+ offset1 (length string2)))
- (finish-output *error-output*)
- (unless (find-if #'upper-case-p string1)
- (case region-case
- (:upper-case (upcase-buffer-region buffer offset1 offset2))
- (:lower-case (downcase-buffer-region buffer offset1 offset2))
- (:capitalized (capitalize-buffer-region buffer offset1 offset2)))))
- (incf occurrences)
- (if (query-replace-find-next-match point string1)
- (display-message "Query Replace ~A with ~A:"
- string1 string2)
- (setf (query-replace-mode pane) nil))))
-
-(define-command (com-query-replace-skip :name t :command-table query-replace-climacs-table) ()
- (declare (special string1 string2))
- (let* ((pane (current-window))
- (point (point pane)))
- (if (query-replace-find-next-match point string1)
- (display-message "Query Replace ~A with ~A:"
- string1 string2)
- (setf (query-replace-mode pane) nil))))
-
-(define-command (com-query-replace-exit :name t :command-table query-replace-climacs-table) ()
- (setf (query-replace-mode (current-window)) nil))
-
-(defun query-replace-set-key (gesture command)
- (add-command-to-command-table command 'query-replace-climacs-table
- :keystroke gesture :errorp nil))
-
-(query-replace-set-key '(#\Newline) 'com-query-replace-exit)
-(query-replace-set-key '(#\Space) 'com-query-replace-replace)
-(query-replace-set-key '(#\Backspace) 'com-query-replace-skip)
-(query-replace-set-key '(#\Rubout) 'com-query-replace-skip)
-(query-replace-set-key '(#\q) 'com-query-replace-exit)
-(query-replace-set-key '(#\y) 'com-query-replace-replace)
-(query-replace-set-key '(#\n) 'com-query-replace-skip)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Undo/redo
-
-(define-command (com-undo :name t :command-table editing-table) ()
- (handler-case (undo (undo-tree (buffer (current-window))))
- (no-more-undo () (beep) (display-message "No more undo")))
- (full-redisplay (current-window)))
-
-(set-key 'com-undo
- 'editing-table
- '((#\_ :shift :control)))
-
-(set-key 'com-undo
- 'editing-table
- '((#\x :control) (#\u)))
-
-(define-command (com-redo :name t :command-table editing-table) ()
- (handler-case (redo (undo-tree (buffer (current-window))))
- (no-more-undo () (beep) (display-message "No more redo")))
- (full-redisplay (current-window)))
-
-(set-key 'com-redo
- 'editing-table
- '((#\_ :shift :meta)))
-
-(set-key 'com-redo
- 'editing-table
- '((#\x :control) (#\r :control)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Dynamic abbrevs
-
-(define-command (com-dabbrev-expand :name t :command-table editing-table) ()
- (let* ((window (current-window))
- (point (point window)))
- (with-slots (original-prefix prefix-start-offset dabbrev-expansion-mark) window
- (flet ((move () (cond ((beginning-of-buffer-p dabbrev-expansion-mark)
- (setf (offset dabbrev-expansion-mark)
- (offset point))
- (forward-word dabbrev-expansion-mark))
- ((mark< dabbrev-expansion-mark point)
- (backward-object dabbrev-expansion-mark))
- (t (forward-object dabbrev-expansion-mark)))))
- (unless (or (beginning-of-buffer-p point)
- (not (constituentp (object-before point))))
- (unless (and (eq (previous-command window) 'com-dabbrev-expand)
- (not (null prefix-start-offset)))
- (setf dabbrev-expansion-mark (clone-mark point))
- (backward-word dabbrev-expansion-mark)
- (setf prefix-start-offset (offset dabbrev-expansion-mark))
- (setf original-prefix (region-to-sequence prefix-start-offset point))
- (move))
- (loop until (or (end-of-buffer-p dabbrev-expansion-mark)
- (and (or (beginning-of-buffer-p dabbrev-expansion-mark)
- (not (constituentp (object-before dabbrev-expansion-mark))))
- (looking-at dabbrev-expansion-mark original-prefix)))
- do (move))
- (if (end-of-buffer-p dabbrev-expansion-mark)
- (progn (delete-region prefix-start-offset point)
- (insert-sequence point original-prefix)
- (setf prefix-start-offset nil))
- (progn (delete-region prefix-start-offset point)
- (insert-sequence point
- (let ((offset (offset dabbrev-expansion-mark)))
- (prog2 (forward-word dabbrev-expansion-mark)
- (region-to-sequence offset dabbrev-expansion-mark)
- (setf (offset dabbrev-expansion-mark) offset))))
- (move))))))))
-
-(set-key 'com-dabbrev-expand
- 'editing-table
- '((#\/ :meta)))
-
-(define-command (com-backward-paragraph :name t :command-table movement-table)
- ((count 'integer :prompt "Number of paragraphs"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (backward-paragraph point syntax))
- (loop repeat (- count) do (forward-paragraph point syntax)))))
-
-(set-key `(com-backward-paragraph ,*numeric-argument-marker*)
- 'movement-table
- '((#\{ :shift :meta)))
-
-(define-command (com-forward-paragraph :name t :command-table movement-table)
- ((count 'integer :prompt "Number of paragraphs"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (forward-paragraph point syntax))
- (loop repeat (- count) do (backward-paragraph point syntax)))))
-
-(set-key `(com-forward-paragraph ,*numeric-argument-marker*)
- 'movement-table
- '((#\} :shift :meta)))
-
-(define-command (com-mark-paragraph :name t :command-table marking-table)
- ((count 'integer :prompt "Number of paragraphs"))
- (let* ((pane (current-window))
- (point (point pane))
- (mark (mark pane))
- (syntax (syntax (buffer pane))))
- (unless (eq (previous-command pane) 'com-mark-paragraph)
- (setf (offset mark) (offset point))
- (if (plusp count)
- (backward-paragraph point syntax)
- (forward-paragraph point syntax)))
- (if (plusp count)
- (loop repeat count do (forward-paragraph mark syntax))
- (loop repeat (- count) do (backward-paragraph mark syntax)))))
-
-(set-key `(com-mark-paragraph ,*numeric-argument-marker*)
- 'marking-table
- '((#\h :meta)))
-
-(define-command (com-backward-sentence :name t :command-table movement-table)
- ((count 'integer :prompt "Number of sentences"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (backward-sentence point syntax))
- (loop repeat (- count) do (forward-sentence point syntax)))))
-
-(set-key `(com-backward-sentence ,*numeric-argument-marker*)
- 'movement-table
- '((#\a :meta)))
-
-(define-command (com-forward-sentence :name t :command-table movement-table)
- ((count 'integer :prompt "Number of sentences"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (forward-sentence point syntax))
- (loop repeat (- count) do (backward-sentence point syntax)))))
-
-(set-key `(com-forward-sentence ,*numeric-argument-marker*)
- 'movement-table
- '((#\e :meta)))
-
-(define-command (com-kill-sentence :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of sentences"))
- (let* ((pane (current-window))
- (point (point pane))
- (mark (clone-mark point))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (forward-sentence point syntax))
- (loop repeat (- count) do (backward-sentence point syntax)))
- (kill-ring-standard-push *kill-ring* (region-to-sequence point mark))
- (delete-region point mark)))
-
-(set-key `(com-kill-sentence ,*numeric-argument-marker*)
- 'deletion-table
- '((#\k :meta)))
-
-(define-command (com-backward-kill-sentence :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of sentences"))
- (let* ((pane (current-window))
- (point (point pane))
- (mark (clone-mark point))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (backward-sentence point syntax))
- (loop repeat (- count) do (forward-sentence point syntax)))
- (kill-ring-standard-push *kill-ring* (region-to-sequence point mark))
- (delete-region point mark)))
-
-(set-key `(com-backward-kill-sentence ,*numeric-argument-marker*)
- 'deletion-table
- '((#\x :control) (#\Backspace)))
-
-(defun forward-page (mark &optional (count 1))
- (loop repeat count
- unless (search-forward mark (coerce (list #\Newline #\Page) 'vector))
- do (end-of-buffer mark)
- (loop-finish)))
-
-(define-command (com-forward-page :name t :command-table movement-table)
- ((count 'integer :prompt "Number of pages"))
- (let* ((pane (current-window))
- (point (point pane)))
- (if (plusp count)
- (forward-page point count)
- (backward-page point count))))
-
-(set-key `(com-forward-page ,*numeric-argument-marker*)
- 'movement-table
- '((#\x :control) (#\])))
-
-(defun backward-page (mark &optional (count 1))
- (loop repeat count
- when (search-backward mark (coerce (list #\Newline #\Page) 'vector))
- do (forward-object mark)
- else do (beginning-of-buffer mark)
- (loop-finish)))
-
-(define-command (com-backward-page :name t :command-table movement-table)
- ((count 'integer :prompt "Number of pages"))
- (let* ((pane (current-window))
- (point (point pane)))
- (if (plusp count)
- (backward-page point count)
- (forward-page point count))))
-
-(set-key `(com-backward-page ,*numeric-argument-marker*)
- 'movement-table
- '((#\x :control) (#\[)))
-
-(define-command (com-mark-page :name t :command-table marking-table)
- ((count 'integer :prompt "Move how many pages")
- (numargp 'boolean :prompt "Move to another page?"))
- (let* ((pane (current-window))
- (point (point pane))
- (mark (mark pane)))
- (cond ((and numargp (/= 0 count))
- (if (plusp count)
- (forward-page point count)
- (backward-page point (1+ count))))
- (t (backward-page point count)))
- (setf (offset mark) (offset point))
- (forward-page mark 1)))
-
-(set-key `(com-mark-page ,*numeric-argument-marker* ,*numeric-argument-p*)
- 'marking-table
- '((#\x :control) (#\p :control)))
-
-(define-command (com-count-lines-page :name t :command-table info-table) ()
- (let* ((pane (current-window))
- (point (point pane))
- (start (clone-mark point))
- (end (clone-mark point)))
- (backward-page start)
- (forward-page end)
- (let ((total (number-of-lines-in-region start end))
- (before (number-of-lines-in-region start point))
- (after (number-of-lines-in-region point end)))
- (display-message "Page has ~A lines (~A + ~A)" total before after))))
-
-(set-key 'com-count-lines-page
- 'info-table
- '((#\x :control) (#\l)))
-
-(define-command (com-count-lines-region :name t :command-table info-table) ()
- (let* ((pane (current-window))
- (point (point pane))
- (mark (mark pane))
- (lines (number-of-lines-in-region point mark))
- (chars (abs (- (offset point) (offset mark)))))
- (display-message "Region has ~D line~:P, ~D character~:P." lines chars)))
-
-(set-key 'com-count-lines-region
- 'info-table
- '((#\= :meta)))
-
-(define-command (com-what-cursor-position :name t :command-table info-table) ()
- (let* ((pane (current-window))
- (point (point pane))
- (buffer (buffer pane))
- (offset (offset point))
- (size (size buffer))
- (char (object-after point))
- (column (column-number point)))
- (display-message "Char: ~:C (#o~O ~:*~D ~:*#x~X) point=~D of ~D (~D%) column ~D"
- char (char-code char) offset size
- (round (* 100 (/ offset size))) column)))
-
-(set-key 'com-what-cursor-position
- 'info-table
- '((#\x :control) (#\=)))
-
-(define-command (com-eval-expression :name t :command-table base-table)
- ((insertp 'boolean :prompt "Insert?"))
- (let* ((*package* (find-package :climacs-gui))
- (string (handler-case (accept 'string :prompt "Eval")
- (error () (progn (beep)
- (display-message "Empty string")
- (return-from com-eval-expression nil)))))
- (values (multiple-value-list
- (handler-case (eval (read-from-string string))
- (error (condition) (progn (beep)
- (display-message "~a" condition)
- (return-from com-eval-expression nil))))))
- (result (format nil "~:[; No values~;~:*~{~S~^,~}~]" values)))
- (if insertp
- (insert-sequence (point (current-window)) result)
- (display-message result))))
-
-(set-key `(com-eval-expression ,*numeric-argument-p*)
- 'base-table
- '((#\: :shift :meta)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Commenting
-
-;;; figure out how to make commands without key bindings accept numeric arguments.
-(define-command (com-comment-region :name t :command-table comment-table) ()
- (let* ((pane (current-window))
- (point (point pane))
- (mark (mark pane))
- (syntax (syntax (buffer pane))))
- (comment-region syntax point mark)))
-
-(define-command (com-backward-expression :name t :command-table movement-table)
- ((count 'integer :prompt "Number of expressions"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (backward-expression point syntax))
- (loop repeat (- count) do (forward-expression point syntax)))))
-
-(set-key `(com-backward-expression ,*numeric-argument-marker*)
- 'movement-table
- '((#\b :control :meta)))
-
-(define-command (com-forward-expression :name t :command-table movement-table)
- ((count 'integer :prompt "Number of expresssions"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (forward-expression point syntax))
- (loop repeat (- count) do (backward-expression point syntax)))))
-
-(set-key `(com-forward-expression ,*numeric-argument-marker*)
- 'movement-table
- '((#\f :control :meta)))
-
-(define-command (com-mark-expression :name t :command-table marking-table)
- ((count 'integer :prompt "Number of expressions"))
- (let* ((pane (current-window))
- (point (point pane))
- (mark (mark pane))
- (syntax (syntax (buffer pane))))
- (unless (eq (previous-command pane) 'com-mark-expression)
- (setf (offset mark) (offset point)))
- (if (plusp count)
- (loop repeat count do (forward-expression mark syntax))
- (loop repeat (- count) do (backward-expression mark syntax)))))
-
-(set-key `(com-mark-expression ,*numeric-argument-marker*)
- 'marking-table
- '((#\@ :shift :control :meta)))
-
-(define-command (com-kill-expression :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of expressions"))
- (let* ((pane (current-window))
- (point (point pane))
- (mark (clone-mark point))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (forward-expression mark syntax))
- (loop repeat (- count) do (backward-expression mark syntax)))
- (kill-ring-standard-push *kill-ring* (region-to-sequence mark point))
- (delete-region mark point)))
-
-(set-key `(com-kill-expression ,*numeric-argument-marker*)
- 'deletion-table
- '((#\k :control :meta)))
-
-(define-command (com-backward-kill-expression :name t :command-table deletion-table)
- ((count 'integer :prompt "Number of expressions"))
- (let* ((pane (current-window))
- (point (point pane))
- (mark (clone-mark point))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (backward-expression mark syntax))
- (loop repeat (- count) do (forward-expression mark syntax)))
- (kill-ring-standard-push *kill-ring* (region-to-sequence mark point))
- (delete-region mark point)))
-
-(set-key `(com-backward-kill-expression ,*numeric-argument-marker*)
- 'deletion-table
- '((#\Backspace :control :meta)))
-
-;; (defparameter *insert-pair-alist*
-;; '((#\( #\)) (#\[ #\]) (#\{ #\}) (#\< #\>) (#\" #\") (#\' #\') (#\` #\')))
-
-(defun insert-pair (mark syntax &optional (count 0) (open #\() (close #\)))
- (cond ((> count 0)
- (loop while (and (not (end-of-buffer-p mark))
- (whitespacep (object-after mark)))
- do (forward-object mark)))
- ((< count 0)
- (setf count (- count))
- (loop repeat count do (backward-expression mark syntax))))
- (unless (or (beginning-of-buffer-p mark)
- (whitespacep (object-before mark)))
- (insert-object mark #\Space))
- (insert-object mark open)
- (let ((here (clone-mark mark)))
- (loop repeat count
- do (forward-expression here syntax))
- (insert-object here close)
- (unless (or (end-of-buffer-p here)
- (whitespacep (object-after here)))
- (insert-object here #\Space))))
-
-(defun insert-parentheses (mark syntax count)
- (insert-pair mark syntax count #\( #\)))
-
-(define-command (com-insert-parentheses :name t :command-table editing-table)
- ((count 'integer :prompt "Number of expressions")
- (wrap-p 'boolean :prompt "Wrap expressions?"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (unless wrap-p (setf count 0))
- (insert-parentheses point syntax count)))
-
-(set-key `(com-insert-parentheses ,*numeric-argument-marker* ,*numeric-argument-p*)
- 'editing-table
- '((#\( :meta)))
-
-(define-command (com-forward-list :name t :command-table movement-table)
- ((count 'integer :prompt "Number of lists"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (forward-list point syntax))
- (loop repeat (- count) do (backward-list point syntax)))))
-
-(set-key `(com-forward-list ,*numeric-argument-marker*)
- 'movement-table
- '((#\n :control :meta)))
-
-(define-command (com-backward-list :name t :command-table movement-table)
- ((count 'integer :prompt "Number of lists"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (backward-list point syntax))
- (loop repeat (- count) do (forward-list point syntax)))))
-
-(set-key `(com-backward-list ,*numeric-argument-marker*)
- 'movement-table
- '((#\p :control :meta)))
-
-(define-command (com-down-list :name t :command-table movement-table)
- ((count 'integer :prompt "Number of lists"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (down-list point syntax))
- (loop repeat (- count) do (backward-down-list point syntax)))))
-
-(set-key `(com-down-list ,*numeric-argument-marker*)
- 'movement-table
- '((#\d :control :meta)))
-
-(define-command (com-backward-down-list :name t :command-table movement-table)
- ((count 'integer :prompt "Number of lists"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (backward-down-list point syntax))
- (loop repeat (- count) do (down-list point syntax)))))
-
-(define-command (com-backward-up-list :name t :command-table movement-table)
- ((count 'integer :prompt "Number of lists"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (backward-up-list point syntax))
- (loop repeat (- count) do (up-list point syntax)))))
-
-(set-key `(com-backward-up-list ,*numeric-argument-marker*)
- 'movement-table
- '((#\u :control :meta)))
-
-(define-command (com-up-list :name t :command-table movement-table) ((count 'integer :prompt "Number of lists"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (up-list point syntax))
- (loop repeat (- count) do (backward-up-list point syntax)))))
-
-(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)))
-
-(set-key 'com-eval-defun
- 'lisp-table
- '((#\x :control :meta)))
-
-(define-command (com-beginning-of-definition :name t :command-table movement-table)
- ((count 'integer :prompt "Number of definitions"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (beginning-of-definition point syntax))
- (loop repeat (- count) do (end-of-definition point syntax)))))
-
-(set-key `(com-beginning-of-definition ,*numeric-argument-marker*)
- 'movement-table
- '((#\a :control :meta)))
-
-(define-command (com-end-of-definition :name t :command-table movement-table)
- ((count 'integer :prompt "Number of definitions"))
- (let* ((pane (current-window))
- (point (point pane))
- (syntax (syntax (buffer pane))))
- (if (plusp count)
- (loop repeat count do (end-of-definition point syntax))
- (loop repeat (- count) do (beginning-of-definition point syntax)))))
-
-(set-key `(com-end-of-definition ,*numeric-argument-marker*)
- 'movement-table
- '((#\e :control :meta)))
-
-(define-command (com-mark-definition :name t :command-table marking-table) ()
- (let* ((pane (current-window))
- (point (point pane))
- (mark (mark pane))
- (syntax (syntax (buffer pane))))
- (unless (eq (previous-command pane) 'com-mark-definition)
- (beginning-of-definition point syntax)
- (setf (offset mark) (offset point)))
- (end-of-definition mark syntax)))
-
-(set-key 'com-mark-definition
- 'marking-table
- '((#\h :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)))
- (display-message (format nil "~s" package))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; For testing purposes
-
-(define-command (com-reset-profile :name t :command-table development-table) ()
- #+sbcl (sb-profile:reset)
- #-sbcl nil)
-
-(define-command (com-report-profile :name t :command-table development-table) ()
- #+sbcl (sb-profile:report)
- #-sbcl nil)
-
-(define-command (com-recompile :name t :command-table development-table) ()
- (asdf:operate 'asdf:load-op :climacs))
-
-
-(define-gesture-name :select-other :pointer-button-press (:left :meta) :unique nil)
-
-(define-presentation-translator lisp-string-to-string
- (climacs-lisp-syntax::lisp-string string development-table
- :gesture :select-other
- :tester-definitive t
- :menu nil
- :priority 10)
- (object)
- object)
-
-(define-command (com-accept-string :name t :command-table development-table) ()
- (display-message (format nil "~s" (accept 'string))))
-
-(define-command (com-accept-symbol :name t :command-table development-table) ()
- (display-message (format nil "~s" (accept 'symbol))))
-
-(define-command (com-accept-lisp-string :name t :command-table development-table) ()
- (display-message (format nil "~s" (accept 'lisp-string))))
-
-(define-command (com-visible-mark :name t :command-table marking-table) ()
- (setf (mark-visible-p (current-window)) (not (mark-visible-p (current-window)))))
-
-(loop for code from (char-code #\Space) to (char-code #\~)
- do (set-key `(com-self-insert ,*numeric-argument-marker*)
- 'self-insert-table
- (list (list (code-char code)))))
-
-(set-key `(com-self-insert ,*numeric-argument-marker*)
- 'self-insert-table
- '((#\Newline)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Some Unicode stuff
-
-(define-command (com-insert-charcode :name t :command-table self-insert-table)
- ((code 'integer :prompt "Code point"))
- (insert-object (point (current-window)) (code-char code)))
-
-(set-key '(com-insert-charcode 193) 'self-insert-table '((:dead--acute)(#\A)))
-(set-key '(com-insert-charcode 201) 'self-insert-table '((:dead--acute)(#\E)))
-(set-key '(com-insert-charcode 205) 'self-insert-table '((:dead--acute)(#\I)))
-(set-key '(com-insert-charcode 211) 'self-insert-table '((:dead--acute)(#\O)))
-(set-key '(com-insert-charcode 218) 'self-insert-table '((:dead--acute)(#\U)))
-(set-key '(com-insert-charcode 221) 'self-insert-table '((:dead--acute)(#\Y)))
-(set-key '(com-insert-charcode 225) 'self-insert-table '((:dead--acute)(#\a)))
-(set-key '(com-insert-charcode 233) 'self-insert-table '((:dead--acute)(#\e)))
-(set-key '(com-insert-charcode 237) 'self-insert-table '((:dead--acute)(#\i)))
-(set-key '(com-insert-charcode 243) 'self-insert-table '((:dead--acute)(#\o)))
-(set-key '(com-insert-charcode 250) 'self-insert-table '((:dead--acute)(#\u)))
-(set-key '(com-insert-charcode 253) 'self-insert-table '((:dead--acute)(#\y)))
-(set-key '(com-insert-charcode 199) 'self-insert-table '((:dead--acute)(#\C)))
-(set-key '(com-insert-charcode 231) 'self-insert-table '((:dead--acute)(#\c)))
-(set-key '(com-insert-charcode 215) 'self-insert-table '((:dead--acute)(#\x)))
-(set-key '(com-insert-charcode 247) 'self-insert-table '((:dead--acute)(#\-)))
-(set-key '(com-insert-charcode 222) 'self-insert-table '((:dead--acute)(#\T)))
-(set-key '(com-insert-charcode 254) 'self-insert-table '((:dead--acute)(#\t)))
-(set-key '(com-insert-charcode 223) 'self-insert-table '((:dead--acute)(#\s)))
-(set-key '(com-insert-charcode 39) 'self-insert-table '((:dead--acute)(#\Space)))
-
-(set-key '(com-insert-charcode 197) 'self-insert-table '((:dead--acute)(:dead--acute)(#\A)))
-(set-key '(com-insert-charcode 229) 'self-insert-table '((:dead--acute)(:dead--acute)(#\a)))
-
-(set-key '(com-insert-charcode 192) 'self-insert-table '((:dead--grave)(#\A)))
-(set-key '(com-insert-charcode 200) 'self-insert-table '((:dead--grave)(#\E)))
-(set-key '(com-insert-charcode 204) 'self-insert-table '((:dead--grave)(#\I)))
-(set-key '(com-insert-charcode 210) 'self-insert-table '((:dead--grave)(#\O)))
-(set-key '(com-insert-charcode 217) 'self-insert-table '((:dead--grave)(#\U)))
-(set-key '(com-insert-charcode 224) 'self-insert-table '((:dead--grave)(#\a)))
-(set-key '(com-insert-charcode 232) 'self-insert-table '((:dead--grave)(#\e)))
-(set-key '(com-insert-charcode 236) 'self-insert-table '((:dead--grave)(#\i)))
-(set-key '(com-insert-charcode 242) 'self-insert-table '((:dead--grave)(#\o)))
-(set-key '(com-insert-charcode 249) 'self-insert-table '((:dead--grave)(#\u)))
-(set-key '(com-insert-charcode 96) 'self-insert-table '((:dead--grave)(#\Space)))
-
-(set-key '(com-insert-charcode 196) 'self-insert-table '((:dead--diaeresis :shift)(#\A)))
-(set-key '(com-insert-charcode 203) 'self-insert-table '((:dead--diaeresis :shift)(#\E)))
-(set-key '(com-insert-charcode 207) 'self-insert-table '((:dead--diaeresis :shift)(#\I)))
-(set-key '(com-insert-charcode 214) 'self-insert-table '((:dead--diaeresis :shift)(#\O)))
-(set-key '(com-insert-charcode 220) 'self-insert-table '((:dead--diaeresis :shift)(#\U)))
-(set-key '(com-insert-charcode 228) 'self-insert-table '((:dead--diaeresis :shift)(#\a)))
-(set-key '(com-insert-charcode 235) 'self-insert-table '((:dead--diaeresis :shift)(#\e)))
-(set-key '(com-insert-charcode 239) 'self-insert-table '((:dead--diaeresis :shift)(#\i)))
-(set-key '(com-insert-charcode 246) 'self-insert-table '((:dead--diaeresis :shift)(#\o)))
-(set-key '(com-insert-charcode 252) 'self-insert-table '((:dead--diaeresis :shift)(#\u)))
-(set-key '(com-insert-charcode 255) 'self-insert-table '((:dead--diaeresis :shift)(#\y)))
-(set-key '(com-insert-charcode 34) 'self-insert-table '((:dead--diaeresis :shift)(#\Space)))
-
-(set-key '(com-insert-charcode 195) 'self-insert-table '((:dead--tilde :shift)(#\A)))
-(set-key '(com-insert-charcode 209) 'self-insert-table '((:dead--tilde :shift)(#\N)))
-(set-key '(com-insert-charcode 227) 'self-insert-table '((:dead--tilde :shift)(#\a)))
-(set-key '(com-insert-charcode 241) 'self-insert-table '((:dead--tilde :shift)(#\n)))
-(set-key '(com-insert-charcode 198) 'self-insert-table '((:dead--tilde :shift)(#\E)))
-(set-key '(com-insert-charcode 230) 'self-insert-table '((:dead--tilde :shift)(#\e)))
-(set-key '(com-insert-charcode 208) 'self-insert-table '((:dead--tilde :shift)(#\D)))
-(set-key '(com-insert-charcode 240) 'self-insert-table '((:dead--tilde :shift)(#\d)))
-(set-key '(com-insert-charcode 216) 'self-insert-table '((:dead--tilde :shift)(#\O)))
-(set-key '(com-insert-charcode 248) 'self-insert-table '((:dead--tilde :shift)(#\o)))
-(set-key '(com-insert-charcode 126) 'self-insert-table '((:dead--tilde :shift)(#\Space)))
-
-(set-key '(com-insert-charcode 194) 'self-insert-table '((:dead--circumflex :shift)(#\A)))
-(set-key '(com-insert-charcode 202) 'self-insert-table '((:dead--circumflex :shift)(#\E)))
-(set-key '(com-insert-charcode 206) 'self-insert-table '((:dead--circumflex :shift)(#\I)))
-(set-key '(com-insert-charcode 212) 'self-insert-table '((:dead--circumflex :shift)(#\O)))
-(set-key '(com-insert-charcode 219) 'self-insert-table '((:dead--circumflex :shift)(#\U)))
-(set-key '(com-insert-charcode 226) 'self-insert-table '((:dead--circumflex :shift)(#\a)))
-(set-key '(com-insert-charcode 234) 'self-insert-table '((:dead--circumflex :shift)(#\e)))
-(set-key '(com-insert-charcode 238) 'self-insert-table '((:dead--circumflex :shift)(#\i)))
-(set-key '(com-insert-charcode 244) 'self-insert-table '((:dead--circumflex :shift)(#\o)))
-(set-key '(com-insert-charcode 251) 'self-insert-table '((:dead--circumflex :shift)(#\u)))
-(set-key '(com-insert-charcode 94) 'self-insert-table '((:dead--circumflex :shift)(#\Space)))
-
-(define-command (com-regex-search-forward :name t :command-table search-table) ()
- (let ((string (accept 'string :prompt "RE search"
- :delimiter-gestures nil
- :activation-gestures
- '(:newline :return))))
- (re-search-forward (point (current-window)) string)))
-
-(define-command (com-regex-search-backward :name t :command-table search-table) ()
- (let ((string (accept 'string :prompt "RE search backward"
- :delimiter-gestures nil
- :activation-gestures
- '(:newline :return))))
- (re-search-backward (point (current-window)) string)))
Index: climacs/climacs.asd
diff -u climacs/climacs.asd:1.38 climacs/climacs.asd:1.39
--- climacs/climacs.asd:1.38 Sun Sep 25 22:06:25 2005
+++ climacs/climacs.asd Sat Nov 12 10:34:34 2005
@@ -72,6 +72,13 @@
(:file "esa" :depends-on ("packages"))
(:file "gui" :depends-on ("packages" "syntax" "base" "buffer" "undo" "pane"
"esa" "kill-ring" "io" "text-syntax" "abbrev"))
+;; (:file "buffer-commands" :depends-on ("gui"))
+ (:file "developer-commands" :depends-on ("gui" "lisp-syntax"))
+ (:file "file-commands" :depends-on ("gui"))
+ (:file "misc-commands" :depends-on ("gui"))
+ (:file "search-commands" :depends-on ("gui"))
+ (:file "window-commands" :depends-on ("gui"))
+ (:file "unicode-commands" :depends-on ("gui"))
(:file "slidemacs" :depends-on ("packages" "buffer" "syntax" "base" "pane"))
(:file "slidemacs-gui" :depends-on ("packages" "slidemacs" "pane" "buffer" "syntax" "gui"))))
Index: climacs/cl-syntax.lisp
diff -u climacs/cl-syntax.lisp:1.15 climacs/cl-syntax.lisp:1.16
--- climacs/cl-syntax.lisp:1.15 Tue Aug 16 01:31:22 2005
+++ climacs/cl-syntax.lisp Sat Nov 12 10:34:34 2005
@@ -116,7 +116,7 @@
(valid-parse :initform 1)
(parser))
(:name "Common Lisp")
- (:pathname-types "lisp" "lsp" "cl"))
+ (:pathname-types "lsp" "cl"))
(defun neutralcharp (var)
(and (characterp var)