new commands to list and select open buffers
authorD Herring <dherring@at.tentpost.dot.com>
Sun, 13 May 2012 15:29:37 +0000 (00:29 +0900)
committerD Herring <dherring@at.tentpost.dot.com>
Sun, 13 May 2012 15:34:11 +0000 (00:34 +0900)
config.lisp
main.lisp

index 0b3aa22..864a543 100644 (file)
@@ -60,6 +60,7 @@
 (defparameter *key-reload-file* "<Control-r>" "Re-load the current file")
 (defparameter *key-compile-file* "<Control-k>" "Compile the current file")
 (defparameter *key-next-file* "<Control-b>" "Cycle through open files")
+(defparameter *key-select-file* "<Control-B>" "Select open file")
 (defparameter *key-find* "<Control-f>" "Find text in current file")
 (defparameter *key-find-again* "<Control-g>" "Repeat the previous search")
 (defparameter *key-cut* "<Control-x>" "Cut the selected text")
index dc9d885..0310370 100644 (file)
--- a/main.lisp
+++ b/main.lisp
 (defmethod get-current-text-ctrl ((buffer-manager buffer-manager))
   (edit-ctrl (selected-buffer buffer-manager)))
 
+(defun update-current-buffers (buffer-manager)
+  (ltk:menu-delete *buffer-menubar* 5)
+  (loop for b in (reverse (buffers buffer-manager))
+    for c from 1
+    do (ltk:make-menubutton
+         *buffer-menubar*
+         (format nil "~A: ~A" c (file-path b))
+         (let ((n c))
+           (lambda ()
+             (on-select-file n))))))
+
 (defmethod add-buffer ((buffer-manager buffer-manager) file-path &optional open-file-p)
   (if (not (find-buffer buffer-manager file-path))
       (let* ((newbuffer (make-instance 'buffer :file-path file-path :master *editor-frame*))
         (ltk:configure text-ctrl :undo 1)
         (ltk::set-cursor-pos text-ctrl "1.0")
         (push newbuffer (buffers buffer-manager))))
-  (select-buffer buffer-manager file-path))
+  (select-buffer buffer-manager file-path)
+  (update-current-buffers buffer-manager))
 
 (defmethod find-buffer ((buffer-manager buffer-manager) path-name)
   (loop for buffer in (reverse (buffers buffer-manager)) do
 
 (defmethod close-buffer ((buffer buffer) (buffer-manager buffer-manager))
   (setf (buffers buffer-manager) (remove buffer (buffers buffer-manager) :test #'equalp))
+  (update-current-buffers buffer-manager)
   (let ((nextfile (get-next-buffer buffer buffer-manager)))
     (select-next-buffer buffer-manager buffer)
     (ltk:pack-forget buffer)
      (list *key-goto-line* 'on-goto)
      (list *key-asdf-load* 'on-asdf-load)
      (list *key-next-file* 'on-next-file)
+     (list *key-select-file* 'on-select-file)
      (list *key-reload-file* 'on-reload-file)
      (list *key-compile-file* 'on-compile-file)
      (list *key-invoke-debugger* 'on-invoke-debugger)
     (destructuring-bind (key action) entry
       (add-key-binding ltk::*tk* key action))))
 
+(defparameter *buffer-menubar* nil "store a reference to the buffer menubar for listing the open buffers")
+
 (defun create-menus ()
   (let* ((mb (ltk:make-menubar))
          (mfile (ltk:make-menu mb "File"))
          (medit (ltk:make-menu mb "Edit"))
          (mbuffer (ltk:make-menu mb "Buffers"))
          (mlisp (ltk:make-menu mb "Lisp")))
+    (setf *buffer-menubar* mbuffer)
 
     (macrolet ((with-menu (menu &body body)
                  `(macrolet
       (with-menu mbuffer
         (action "Next buffer" on-next-file)
         (separator)
-        (action "Close buffer" on-close-file))
+        (action "Close buffer" on-close-file)
+       (separator)
+       (action "Select buffer" on-select-file)
+       ;; sacrificial placeholder for the current buffer list
+       ;; update the magic number in update-current-buffers when adding/removing entries
+       (ltk:make-menubutton mbuffer "" nil))
       (with-menu mlisp
         (text-action "Macroexpand" on-macro-expand)
         (text-action "Copy to REPL" on-copy-sexp-to-repl)
 (defun on-next-file (&optional event)
   (select-next-buffer *buffer-manager* (selected-buffer *buffer-manager*)))
 
+(defun on-select-file (&optional n)
+  (unless (integerp n)
+    (setf n (parse-integer (input-prompt *listener* "buffer number:"))))
+  (when (integerp n)
+    (select-buffer *buffer-manager*
+      ;; compensate for the reversed order
+      (- (length (buffers *buffer-manager*)) n)))
+  (prompt *listener* :clear t))
+
 (defun on-file-modified (evt)
   (pathname-message))
 
       (ltk:on-close ltk::*tk* 'on-quit)
       (ltk:set-geometry ltk::*tk* *window-width* *window-height* *window-x* *window-y*)
       (ltk:minsize ltk::*tk* 320 200)
-      (on-new-file)
       (bind-commands)
       (create-menus)
+      (on-new-file) ;; create the new file after the menus so it is listed in the current buffer list
 
       (when old-manager
         (dolist (buf (reverse (buffers old-manager)))