A hacked beyond recognition patch: Move plugins to seperate modules,
put plugin api and registration into a module, add a new message-type, make directory-files plugin work again, delete some hundred lines of extremly silly code,
This commit is contained in:
		
							parent
							
								
									87f701f59d
								
							
						
					
					
						commit
						428c9587cc
					
				| 
						 | 
				
			
			@ -38,42 +38,34 @@
 | 
			
		|||
  (res-marked-items browse-dir-list-res-obj-res-marked-items)
 | 
			
		||||
  (c-x-pressed browse-dir-list-res-obj-c-x-pressed))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;;Layout of the directory-tree-browser
 | 
			
		||||
(define layout-result-browse-dir-list
 | 
			
		||||
  (lambda (result-str result width directory)
 | 
			
		||||
    (let ((printed-file-list (print-file-list-1 result directory)))
 | 
			
		||||
      (append
 | 
			
		||||
       (list
 | 
			
		||||
        (if (<= (string-length directory) (- width 25))
 | 
			
		||||
            (string-append "Paths relative to " directory  " :")
 | 
			
		||||
            (let ((dir-string (substring directory 
 | 
			
		||||
                                         (- (string-length directory) 
 | 
			
		||||
(define (layout-dir-list files wdir width)
 | 
			
		||||
  (let ((marked-files (mark-special-files wdir files)))
 | 
			
		||||
    (append
 | 
			
		||||
     (list
 | 
			
		||||
      (if (<= (string-length wdir) (- width 25))
 | 
			
		||||
	  (string-append "Paths relative to " wdir  " :")
 | 
			
		||||
	  (let ((dir-string (substring wdir
 | 
			
		||||
                                         (- (string-length wdir) 
 | 
			
		||||
                                            (- width 25))
 | 
			
		||||
                                         (string-length directory))))
 | 
			
		||||
              (string-append "Paths relative to ..."
 | 
			
		||||
                             dir-string))))
 | 
			
		||||
       printed-file-list))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;;One File per-line
 | 
			
		||||
;;In case the object is a directory "/" is added
 | 
			
		||||
(define print-file-list-1
 | 
			
		||||
  (lambda (file-list dir)
 | 
			
		||||
    (let loop ((old file-list)
 | 
			
		||||
	       (new '()))
 | 
			
		||||
      (if (equal? '() old)
 | 
			
		||||
	  new
 | 
			
		||||
	  (let* ((hd (list-ref old 0))
 | 
			
		||||
		 (hd-path (string-append dir "/" hd))
 | 
			
		||||
		 (tl (cdr old)))
 | 
			
		||||
	    (if (file-exists? hd-path)
 | 
			
		||||
		(if (file-directory? hd-path)
 | 
			
		||||
		    (let ((new-str (string-append " " hd "/")))
 | 
			
		||||
		      (loop tl (append new (list new-str))))
 | 
			
		||||
		    (loop tl (append new (list (string-append " " hd)))))
 | 
			
		||||
		(loop tl new)))))))
 | 
			
		||||
                                         (string-length wdir))))
 | 
			
		||||
	    (string-append "Paths relative to ..."
 | 
			
		||||
			   dir-string))))
 | 
			
		||||
     marked-files)))
 | 
			
		||||
 | 
			
		||||
(define (mark-special-files dir files)
 | 
			
		||||
  (map (lambda (file)
 | 
			
		||||
	 (let ((complete-name (string-append dir "/" file)))
 | 
			
		||||
	   (cond
 | 
			
		||||
	    ((file-directory? complete-name)
 | 
			
		||||
	     (string-append " " file "/"))
 | 
			
		||||
	    ((file-executable? complete-name)
 | 
			
		||||
	     (string-append "*" file))
 | 
			
		||||
	    ((file-symlink? complete-name)
 | 
			
		||||
	     (string-append "@" file))
 | 
			
		||||
	    (else
 | 
			
		||||
	     (string-append " " file)))))
 | 
			
		||||
       files))
 | 
			
		||||
   
 | 
			
		||||
;;selection->descend
 | 
			
		||||
(define selected-browse-dir-list
 | 
			
		||||
  (lambda (model)
 | 
			
		||||
| 
						 | 
				
			
			@ -90,12 +82,10 @@
 | 
			
		|||
			 (if (not (equal? "/" (cwd)))
 | 
			
		||||
			     (begin
 | 
			
		||||
			       (chdir "..")
 | 
			
		||||
			       (let* ((new-result (evaluate "(directory-files)"))
 | 
			
		||||
				      (new-result-string (exp->string new-result))
 | 
			
		||||
			       (let* ((new-result (directory-files))
 | 
			
		||||
				      (width (browse-dir-list-res-obj-width model))
 | 
			
		||||
				      (new-text (layout-result-browse-dir-list 
 | 
			
		||||
						 new-result-string 
 | 
			
		||||
						 new-result width (cwd)))
 | 
			
		||||
				      (new-text (layout-dir-list 
 | 
			
		||||
						 new-result (cwd) width))
 | 
			
		||||
				      (new-model (make-browse-dir-list-res-obj
 | 
			
		||||
						  2
 | 
			
		||||
						  1
 | 
			
		||||
| 
						 | 
				
			
			@ -122,12 +112,10 @@
 | 
			
		|||
			       (begin
 | 
			
		||||
				 (chdir wd)
 | 
			
		||||
				 (chdir rest)
 | 
			
		||||
				 (let* ((new-result (evaluate "(directory-files)"))
 | 
			
		||||
					(new-result-string (exp->string new-result))
 | 
			
		||||
				 (let* ((new-result (directory-files))
 | 
			
		||||
					(width (browse-dir-list-res-obj-width model))
 | 
			
		||||
					(new-text (layout-result-browse-dir-list 
 | 
			
		||||
						   new-result-string new-result width 
 | 
			
		||||
						   (cwd)))
 | 
			
		||||
					(new-text (layout-dir-list 
 | 
			
		||||
						   new-result (cwd) width))
 | 
			
		||||
					(new-model (make-browse-dir-list-res-obj
 | 
			
		||||
						    2
 | 
			
		||||
						    1
 | 
			
		||||
| 
						 | 
				
			
			@ -145,35 +133,25 @@
 | 
			
		|||
				   new-model))
 | 
			
		||||
			   model)))))))))
 | 
			
		||||
 | 
			
		||||
(define (init-with-list-of-files files dir width)
 | 
			
		||||
  (make-browse-dir-list-res-obj
 | 
			
		||||
   2 1
 | 
			
		||||
   files (layout-dir-list files dir width) dir
 | 
			
		||||
   width (cwd) '() '() #f))
 | 
			
		||||
 | 
			
		||||
(define browse-dir-list-receiver
 | 
			
		||||
  (lambda (message)
 | 
			
		||||
    (debug-message "browse-dir-list-receiver " message)
 | 
			
		||||
    (cond 
 | 
			
		||||
 | 
			
		||||
     ((init-with-result-message? message)
 | 
			
		||||
      (let ((fs-objects (init-with-result-message-result message)))
 | 
			
		||||
	(init-with-list-of-files
 | 
			
		||||
	 (map fs-object-name fs-objects) (cwd)
 | 
			
		||||
	 (init-with-result-message-width message))))
 | 
			
		||||
 | 
			
		||||
     ((next-command-message? message)
 | 
			
		||||
      (let* ((command (next-command-string message))
 | 
			
		||||
	     (parameters (next-command-message-parameters message))
 | 
			
		||||
	     (width (next-command-message-width message)))
 | 
			
		||||
	(if (< (length parameters) 2)
 | 
			
		||||
            (let* ((result (list "forgot parameters?"))
 | 
			
		||||
                   (text
 | 
			
		||||
                    (layout-result-standard "forgot parameters?"
 | 
			
		||||
                                            result width))
 | 
			
		||||
                   (browse-obj
 | 
			
		||||
		      (make-browse-dir-list-res-obj 1 1 result text (cwd) 
 | 
			
		||||
						    width (cwd) '() '() #f)))
 | 
			
		||||
              browse-obj)
 | 
			
		||||
	    
 | 
			
		||||
	    (let* ((file-list 
 | 
			
		||||
		    (evaluate (list-ref parameters 0)))
 | 
			
		||||
		   (dir (evaluate (list-ref parameters 1)))
 | 
			
		||||
		   (result-string (exp->string file-list))
 | 
			
		||||
		   (width (next-command-message-width message))
 | 
			
		||||
		   (text 
 | 
			
		||||
		    (layout-result-browse-dir-list result-string
 | 
			
		||||
						   file-list width dir))
 | 
			
		||||
		   (browse-obj 
 | 
			
		||||
		    (make-browse-dir-list-res-obj 2 1 file-list text dir width
 | 
			
		||||
						  (cwd) '() '() #f)))
 | 
			
		||||
	      browse-obj))))
 | 
			
		||||
      (init-with-list-of-files (directory-files) (cwd)))
 | 
			
		||||
 | 
			
		||||
     ((print-message? message)
 | 
			
		||||
      (let* ((model (message-result-object message))
 | 
			
		||||
| 
						 | 
				
			
			@ -353,10 +331,10 @@
 | 
			
		|||
	     (marked-items (browse-dir-list-res-obj-res-marked-items model)))
 | 
			
		||||
	(string-append "'" (exp->string marked-items)))))))
 | 
			
		||||
 | 
			
		||||
(define browse-dir-list-rec (make-receiver "browse-dir-list" 
 | 
			
		||||
					   browse-dir-list-receiver))
 | 
			
		||||
 | 
			
		||||
(set! receivers (cons browse-dir-list-rec receivers))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define (list-of-fs-objects? thing)
 | 
			
		||||
  (and (proper-list? thing)
 | 
			
		||||
       (every fs-object? thing)))
 | 
			
		||||
 | 
			
		||||
(register-plugin! (make-plugin "ls"
 | 
			
		||||
			       browse-dir-list-receiver
 | 
			
		||||
			       list-of-fs-objects?))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -130,8 +130,7 @@
 | 
			
		|||
						    width '() '() #f)))
 | 
			
		||||
		browse-obj))
 | 
			
		||||
 | 
			
		||||
	    (let ((lst 
 | 
			
		||||
		   (evaluate (list-ref parameters 0))))
 | 
			
		||||
	    (let ((lst (list-ref parameters 0)))
 | 
			
		||||
	      (if (not (null? lst))
 | 
			
		||||
		  (let*
 | 
			
		||||
		      ((result-string (map exp->string lst))
 | 
			
		||||
| 
						 | 
				
			
			@ -337,9 +336,4 @@
 | 
			
		|||
 | 
			
		||||
)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define browse-list-rec (make-receiver "browse-list" 
 | 
			
		||||
					   browse-list-receiver))
 | 
			
		||||
 | 
			
		||||
(set! receivers (cons browse-list-rec receivers))
 | 
			
		||||
(register-plugin! (make-plugin "browse-list" browse-list-receiver))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,15 +61,8 @@
 | 
			
		|||
	(browse-dir-list-receiver browse-sel-message)))
 | 
			
		||||
      )))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define dir-files-rec1
 | 
			
		||||
  (make-receiver "directory-files"  dir-files-receiver))
 | 
			
		||||
(register-plugin!
 | 
			
		||||
 (make-plugin "directory-files"  dir-files-receiver))
 | 
			
		||||
	   
 | 
			
		||||
(set! receivers (cons dir-files-rec1 receivers))
 | 
			
		||||
 | 
			
		||||
(define dir-files-rec2
 | 
			
		||||
  (make-receiver "ls" dir-files-receiver))
 | 
			
		||||
 | 
			
		||||
(set! receivers (cons dir-files-rec2 receivers))
 | 
			
		||||
 | 
			
		||||
(register-plugin!
 | 
			
		||||
 (make-plugin "ls" dir-files-receiver))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
(define (directory-files . optional-args)
 | 
			
		||||
  (let-optionals optional-args
 | 
			
		||||
      ((dir (cwd))
 | 
			
		||||
       (dotfiles? #f))
 | 
			
		||||
    (map (lambda (file)
 | 
			
		||||
	   (make-fs-object file dir))
 | 
			
		||||
	 (scsh-directory-files dir dotfiles?))))
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
(define-record-type fs-object :fs-object
 | 
			
		||||
  (make-fs-object name path)
 | 
			
		||||
  fs-object?
 | 
			
		||||
  (name fs-object-name)
 | 
			
		||||
  (path fs-object-path))
 | 
			
		||||
 | 
			
		||||
(define-record-discloser :fs-object
 | 
			
		||||
  (lambda (r)
 | 
			
		||||
    `(fs-object ,(fs-object-name r))))
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
;;seperate a long line into pieces, each fitting into a smaller line.
 | 
			
		||||
(define (seperate-line line width)
 | 
			
		||||
  (let loop ((new '())
 | 
			
		||||
	     (old line))
 | 
			
		||||
    (if (> width (string-length old))
 | 
			
		||||
	(if (= 0 (string-length old))
 | 
			
		||||
	    (if (equal? new '())
 | 
			
		||||
		'("")
 | 
			
		||||
		new)
 | 
			
		||||
	    (append (list old) new))
 | 
			
		||||
	(let ((next-line (substring old 0 width))
 | 
			
		||||
	      (rest-old (substring old width (string-length old))))
 | 
			
		||||
	  (loop (cons next-line new) rest-old)))))
 | 
			
		||||
 | 
			
		||||
;;the result is the "answer" of scsh
 | 
			
		||||
(define (layout-result-standard result-str result width)
 | 
			
		||||
  (reverse (seperate-line result-str width)))
 | 
			
		||||
 | 
			
		||||
;useful helpers
 | 
			
		||||
;;; EK: useful for what=
 | 
			
		||||
(define (get-marked-positions-1 all-items marked-items)
 | 
			
		||||
  (let loop ((count 0)
 | 
			
		||||
	     (result '()))
 | 
			
		||||
    (if (>= count (length all-items))
 | 
			
		||||
	result
 | 
			
		||||
	(let ((act-item (list-ref all-items count)))
 | 
			
		||||
	  (if (member act-item marked-items)
 | 
			
		||||
	      (loop (+ count 1)
 | 
			
		||||
		    (append result (list (+ count 1))))
 | 
			
		||||
	      (loop (+ count 1) result))))))
 | 
			
		||||
 | 
			
		||||
(define (get-marked-positions-2 all-items marked-items)
 | 
			
		||||
  (let loop ((count 0)
 | 
			
		||||
	     (result '()))
 | 
			
		||||
    (if (>= count (length all-items))
 | 
			
		||||
	result
 | 
			
		||||
	(let ((act-item (list-ref all-items count)))
 | 
			
		||||
	  (if (member act-item marked-items)
 | 
			
		||||
	      (loop (+ count 1)
 | 
			
		||||
		    (append result (list (+ count 2))))
 | 
			
		||||
	      (loop (+ count 1) result))))))
 | 
			
		||||
 | 
			
		||||
(define (get-marked-positions-3 all-items marked-items)
 | 
			
		||||
  (let loop ((count 0)
 | 
			
		||||
	     (result '()))
 | 
			
		||||
    (if (>= count (length all-items))
 | 
			
		||||
	result
 | 
			
		||||
	(let ((act-item (list-ref all-items count)))
 | 
			
		||||
	  (if (member act-item marked-items)
 | 
			
		||||
	      (loop (+ count 1)
 | 
			
		||||
		    (append result (list (+ count 3))))
 | 
			
		||||
	      (loop (+ count 1) result))))))
 | 
			
		||||
 | 
			
		||||
;;expression as string
 | 
			
		||||
(define (exp->string exp)
 | 
			
		||||
  (let ((exp-port (open-output-string)))
 | 
			
		||||
    (write exp exp-port)
 | 
			
		||||
    (get-output-string exp-port)))
 | 
			
		||||
 | 
			
		||||
(define (sublist l pos k)
 | 
			
		||||
  (let ((tmp (list-tail l pos)))
 | 
			
		||||
    (reverse (list-tail (reverse tmp) 
 | 
			
		||||
			(- (length tmp) k)))))
 | 
			
		||||
| 
						 | 
				
			
			@ -42,20 +42,6 @@
 | 
			
		|||
(define result-window #f)
 | 
			
		||||
(define result-frame-window #f)
 | 
			
		||||
 | 
			
		||||
(define shortcuts '("F1:Exit"
 | 
			
		||||
		    "F2:Repaint (after change of buffer size)"
 | 
			
		||||
		    "Ctrl+x o:Switch Buffer"
 | 
			
		||||
		    "Ctrl+x s:Insert/Select"
 | 
			
		||||
		    "Ctrl+x u:-/Unselect"
 | 
			
		||||
		    "PageUp - previous entry in result history"
 | 
			
		||||
		    "PageDown - next entry in result history"
 | 
			
		||||
		    "Ctrl+x r:Redo (Active Command)"
 | 
			
		||||
		    "CursorUp - previous entry in command history"
 | 
			
		||||
		    "CursorDown - next entry in command history"
 | 
			
		||||
		    "Ctrl+a:First Pos of Line"
 | 
			
		||||
		    "Ctrl+e:End of Line"
 | 
			
		||||
		    "Ctrl+k:Delete Line"))
 | 
			
		||||
 | 
			
		||||
(define key-control-x 24)
 | 
			
		||||
(define key-o 111)
 | 
			
		||||
		    
 | 
			
		||||
| 
						 | 
				
			
			@ -128,12 +114,12 @@
 | 
			
		|||
  *current-history-item*)
 | 
			
		||||
 | 
			
		||||
(define-record-type history-entry :history-entry
 | 
			
		||||
  (make-history-entry command args result receiver)
 | 
			
		||||
  (make-history-entry command args result plugin)
 | 
			
		||||
  history-entry?
 | 
			
		||||
  (command history-entry-command)
 | 
			
		||||
  (args history-entry-args)
 | 
			
		||||
  (result history-entry-result set-history-entry-result!)
 | 
			
		||||
  (receiver history-entry-receiver))
 | 
			
		||||
  (plugin history-entry-plugin))
 | 
			
		||||
 | 
			
		||||
(define (current-history-entry-selector-maker selector)
 | 
			
		||||
  (lambda ()
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +142,7 @@
 | 
			
		|||
  (cond
 | 
			
		||||
   ((current-history-item)
 | 
			
		||||
    => (lambda (entry)
 | 
			
		||||
	 (set-history-entry-result! (entry-data) new-value)))
 | 
			
		||||
	 (set-history-entry-result! (entry-data entry) new-value)))
 | 
			
		||||
   (else (values))))
 | 
			
		||||
 | 
			
		||||
(define (append-to-history! history-entry)
 | 
			
		||||
| 
						 | 
				
			
			@ -187,125 +173,10 @@
 | 
			
		|||
;;If a keyboard-interrupt occurs this can be checked by looking-up this box
 | 
			
		||||
(define active-keyboard-interrupt #f)
 | 
			
		||||
 | 
			
		||||
;;This indicates if the last input was Ctrl-x
 | 
			
		||||
(define c-x-pressed #f)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;;Message-Types
 | 
			
		||||
;;---------------------
 | 
			
		||||
;;A new command was entered
 | 
			
		||||
;;->create a new "object"
 | 
			
		||||
(define-record-type next-command-message :next-command-message
 | 
			
		||||
  (make-next-command-message command-string
 | 
			
		||||
			     parameters
 | 
			
		||||
			     width)
 | 
			
		||||
  next-command-message?
 | 
			
		||||
  (command-string next-command-string)
 | 
			
		||||
  (parameters next-command-message-parameters)
 | 
			
		||||
  (width next-command-message-width))
 | 
			
		||||
 | 
			
		||||
;;key pressed
 | 
			
		||||
;;The object and the key are send to the user-code, who returns the
 | 
			
		||||
;;changed object.
 | 
			
		||||
(define-record-type key-pressed-message :key-pressed-message
 | 
			
		||||
  (make-key-pressed-message command-string
 | 
			
		||||
			    result-object
 | 
			
		||||
			    key prefix-key)
 | 
			
		||||
  key-pressed-message?
 | 
			
		||||
  (command-string key-pressed-command-string)
 | 
			
		||||
  (result-object key-pressed-message-result-object)
 | 
			
		||||
  (key key-pressed-message-key)
 | 
			
		||||
  (prefix-key key-pressed-message-prefix-key))
 | 
			
		||||
 | 
			
		||||
;;print
 | 
			
		||||
(define-record-type print-message :print-message
 | 
			
		||||
  (make-print-message command-string
 | 
			
		||||
		      result-object
 | 
			
		||||
		      width)
 | 
			
		||||
  print-message?
 | 
			
		||||
  (command-string print-message-command-string)
 | 
			
		||||
  (result-object print-message-result-object)
 | 
			
		||||
  (width print-message-width))
 | 
			
		||||
 | 
			
		||||
;;->this sort of data-type is returned by a print-message 
 | 
			
		||||
(define-record-type print-object :print-object
 | 
			
		||||
  (make-print-object pos-y
 | 
			
		||||
		     pos-x
 | 
			
		||||
		     text
 | 
			
		||||
		     highlighted-lines
 | 
			
		||||
		     marked-lines)
 | 
			
		||||
  print-object?
 | 
			
		||||
  (pos-y print-object-pos-y)
 | 
			
		||||
  (pos-x print-object-pos-x)
 | 
			
		||||
  (text print-object-text)
 | 
			
		||||
  (highlighted-lines print-object-highlighted-lines)
 | 
			
		||||
  (marked-lines print-object-marked-lines))
 | 
			
		||||
 | 
			
		||||
;;restore (when side-effects occur)
 | 
			
		||||
(define-record-type restore-message :restore-message
 | 
			
		||||
  (make-restore-message command-string
 | 
			
		||||
			result-object)
 | 
			
		||||
  restore-message?
 | 
			
		||||
  (command-string restore-message-command-string)
 | 
			
		||||
  (result-object restore-message-result-object))
 | 
			
		||||
 | 
			
		||||
;;request the selection
 | 
			
		||||
(define-record-type selection-message :selection-message
 | 
			
		||||
  (make-selection-message command-string
 | 
			
		||||
			  result-object)
 | 
			
		||||
  selection-message?
 | 
			
		||||
  (command-string selection-message-command-string)
 | 
			
		||||
  (result-object selection-message-result-object))
 | 
			
		||||
 | 
			
		||||
(define (message-result-object message)
 | 
			
		||||
  ((cond 
 | 
			
		||||
    ((key-pressed-message? message) 
 | 
			
		||||
     key-pressed-message-result-object)
 | 
			
		||||
    ((print-message? message) 
 | 
			
		||||
     print-message-result-object)
 | 
			
		||||
    ((restore-message? message) 
 | 
			
		||||
     restore-message-result-object)
 | 
			
		||||
    ((selection-message? message) 
 | 
			
		||||
     selection-message-result-object message)
 | 
			
		||||
    (else 
 | 
			
		||||
     (error "This message-type has no field for result-objects"
 | 
			
		||||
	    message)))
 | 
			
		||||
   message))
 | 
			
		||||
 | 
			
		||||
(define (message-command-string message)
 | 
			
		||||
  ((cond
 | 
			
		||||
    ((next-command-message? message)
 | 
			
		||||
     next-command-string)
 | 
			
		||||
    ((key-pressed-message? message)
 | 
			
		||||
     key-pressed-command-string)
 | 
			
		||||
    ((print-message? message)
 | 
			
		||||
     print-message-command-string)
 | 
			
		||||
    ((restore-message? message)
 | 
			
		||||
     restore-message-command-string)
 | 
			
		||||
    ((selection-message? message)
 | 
			
		||||
     selection-message-command-string)
 | 
			
		||||
    (else
 | 
			
		||||
     (error "This message-type has no command field" message)))
 | 
			
		||||
   message))
 | 
			
		||||
   
 | 
			
		||||
;;The "user" (who extends the functionality of NUIT) has to inform NUIT
 | 
			
		||||
;;about which function is meant to be the receiver, when a certain
 | 
			
		||||
;;command is active
 | 
			
		||||
(define-record-type receiver :receiver
 | 
			
		||||
  (really-make-receiver command rec type-predicate)
 | 
			
		||||
  receiver?
 | 
			
		||||
  (command receiver-command)
 | 
			
		||||
  (rec receiver-rec)
 | 
			
		||||
  (type-predicate receiver-type-predicate))
 | 
			
		||||
 | 
			
		||||
(define (make-receiver command rec . more)
 | 
			
		||||
  (really-make-receiver command rec
 | 
			
		||||
			(if (null? more)
 | 
			
		||||
			    (lambda (v) #f)
 | 
			
		||||
			    (car more))))
 | 
			
		||||
 | 
			
		||||
;;This list contains all the receivers that have been registered.
 | 
			
		||||
(define receivers '())
 | 
			
		||||
 | 
			
		||||
;;*************************************************************************
 | 
			
		||||
;;Actions
 | 
			
		||||
| 
						 | 
				
			
			@ -369,7 +240,7 @@
 | 
			
		|||
	      ch key-control-x)))
 | 
			
		||||
	(update-current-result!
 | 
			
		||||
	 (post-message
 | 
			
		||||
	  (history-entry-receiver (entry-data (current-history-item)))
 | 
			
		||||
	  (history-entry-plugin (entry-data (current-history-item)))
 | 
			
		||||
	  key-message))
 | 
			
		||||
	(loop (wait-for-input) #f)))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -405,33 +276,47 @@
 | 
			
		|||
 | 
			
		||||
     ((= ch 10)
 | 
			
		||||
      (let ((command (last (buffer-text command-buffer))))
 | 
			
		||||
	(call-with-values 
 | 
			
		||||
	    (lambda ()
 | 
			
		||||
	      (execute-command command))
 | 
			
		||||
	  (lambda (result receiver)
 | 
			
		||||
	    (let ((new-entry
 | 
			
		||||
		   (make-history-entry command '() 
 | 
			
		||||
				       result receiver)))
 | 
			
		||||
	      (append-to-history! new-entry)
 | 
			
		||||
	      (buffer-text-append-new-line! command-buffer)
 | 
			
		||||
	      (paint-result-window new-entry)
 | 
			
		||||
	      (paint-active-command-window)
 | 
			
		||||
	      (scroll-command-buffer)
 | 
			
		||||
	      (paint-command-window-contents)
 | 
			
		||||
	      (move-cursor command-buffer)
 | 
			
		||||
	      (refresh-result-window)
 | 
			
		||||
	      (refresh-command-window)
 | 
			
		||||
	      (loop (wait-for-input) c-x-pressed?))))))
 | 
			
		||||
	(if (not (string=? command ""))
 | 
			
		||||
	    (call-with-values 
 | 
			
		||||
		(lambda ()
 | 
			
		||||
		  (execute-command command))
 | 
			
		||||
	      (lambda (result plugin)
 | 
			
		||||
		(let ((new-entry
 | 
			
		||||
		       (make-history-entry command '() 
 | 
			
		||||
					   result plugin)))
 | 
			
		||||
		  (append-to-history! new-entry)
 | 
			
		||||
		  (buffer-text-append-new-line! command-buffer)
 | 
			
		||||
		  (paint-result-window new-entry)
 | 
			
		||||
		  (paint-active-command-window)
 | 
			
		||||
		  (scroll-command-buffer)
 | 
			
		||||
		  (paint-command-window-contents)
 | 
			
		||||
		  (move-cursor command-buffer)
 | 
			
		||||
		  (refresh-result-window)
 | 
			
		||||
		  (refresh-command-window)
 | 
			
		||||
		  (loop (wait-for-input) c-x-pressed?))))
 | 
			
		||||
	    (loop (wait-for-input) #f))))
 | 
			
		||||
 | 
			
		||||
     (else 
 | 
			
		||||
      (input command-buffer ch)
 | 
			
		||||
      (werase (app-window-curses-win command-window))
 | 
			
		||||
      (print-command-buffer (app-window-curses-win command-window) 
 | 
			
		||||
			    command-buffer)
 | 
			
		||||
      ;;(debug-message "loop after print-command-buffer " command-buffer)
 | 
			
		||||
      (move-cursor command-buffer)
 | 
			
		||||
      (refresh-command-window)
 | 
			
		||||
      (loop (wait-for-input) c-x-pressed?)))))
 | 
			
		||||
      (cond
 | 
			
		||||
       ((focus-on-result-buffer?)
 | 
			
		||||
	(when (current-history-item)
 | 
			
		||||
	  (update-current-result!
 | 
			
		||||
	   (post-message
 | 
			
		||||
	    (history-entry-plugin (entry-data (current-history-item)))
 | 
			
		||||
	    (make-key-pressed-message 
 | 
			
		||||
	     (active-command) (current-result)
 | 
			
		||||
	     ch c-x-pressed?)))
 | 
			
		||||
	  (paint-result-window (entry-data (current-history-item)))
 | 
			
		||||
	  (refresh-result-window))
 | 
			
		||||
	(loop (wait-for-input) #f))
 | 
			
		||||
       (else
 | 
			
		||||
	(input command-buffer ch)
 | 
			
		||||
	(werase (app-window-curses-win command-window))
 | 
			
		||||
	(print-command-buffer (app-window-curses-win command-window) 
 | 
			
		||||
			      command-buffer)
 | 
			
		||||
	(move-cursor command-buffer)
 | 
			
		||||
	(refresh-command-window)
 | 
			
		||||
	(loop (wait-for-input) c-x-pressed?)))))))
 | 
			
		||||
 | 
			
		||||
(define (window-init-curses-win! window)
 | 
			
		||||
  (set-app-window-curses-win!
 | 
			
		||||
| 
						 | 
				
			
			@ -519,8 +404,7 @@
 | 
			
		|||
  (wclear (app-window-curses-win result-window))
 | 
			
		||||
  (paint-result-buffer
 | 
			
		||||
   (post-message
 | 
			
		||||
    (or (history-entry-receiver entry)
 | 
			
		||||
	(determine-receiver-by-command (history-entry-command entry)))
 | 
			
		||||
    (history-entry-plugin entry)
 | 
			
		||||
    (make-print-message (history-entry-command entry)
 | 
			
		||||
			(history-entry-result entry)
 | 
			
		||||
			(buffer-num-cols command-buffer)))))
 | 
			
		||||
| 
						 | 
				
			
			@ -551,64 +435,19 @@
 | 
			
		|||
(define (execute-command command)
 | 
			
		||||
  (let ((result (evaluate command)))
 | 
			
		||||
    (cond
 | 
			
		||||
     ((determine-receiver-by-type result)
 | 
			
		||||
      => (lambda (receiver)
 | 
			
		||||
	   (values result receiver)))
 | 
			
		||||
     ((determine-plugin-by-type result)
 | 
			
		||||
      => (lambda (plugin)
 | 
			
		||||
	   (values 
 | 
			
		||||
	    (post-message plugin
 | 
			
		||||
			  (make-init-with-result-message
 | 
			
		||||
			   result (buffer-num-cols command-buffer)))
 | 
			
		||||
	    plugin)))
 | 
			
		||||
     (else 
 | 
			
		||||
      (values 
 | 
			
		||||
       (post-message standard-receiver
 | 
			
		||||
       (post-message standard-plugin
 | 
			
		||||
		     (make-next-command-message
 | 
			
		||||
		      command '() (buffer-num-cols command-buffer)))
 | 
			
		||||
       standard-receiver)))))
 | 
			
		||||
 | 
			
		||||
'(define (execute-command)
 | 
			
		||||
  (let* ((com (list-ref (buffer-text command-buffer) 
 | 
			
		||||
			(- (length (buffer-text command-buffer)) 1)))
 | 
			
		||||
	 (com-par (extract-com-and-par com))
 | 
			
		||||
	 (command (car com-par))
 | 
			
		||||
	 (parameters (cdr com-par))
 | 
			
		||||
	 ;;todo: parameters
 | 
			
		||||
	 (message (make-next-command-message 
 | 
			
		||||
		   command parameters result-cols))
 | 
			
		||||
	 (model (post-message
 | 
			
		||||
		 (determine-receiver-by-command command)
 | 
			
		||||
		 message)))
 | 
			
		||||
    (debug-message 'execute-command
 | 
			
		||||
		   com " " com-par )
 | 
			
		||||
    (if (not (= history-pos 0))
 | 
			
		||||
	(let ((hist-entry (make-history-entry (active-command)
 | 
			
		||||
					      (active-command-arguments)
 | 
			
		||||
					      (current-result)))
 | 
			
		||||
	      ;; hack of year
 | 
			
		||||
	      (active (make-history-entry command 
 | 
			
		||||
					  (get-param-as-str parameters)
 | 
			
		||||
					  (if (standard-result-obj? model)
 | 
			
		||||
					      (standard-result-obj-result model)
 | 
			
		||||
					      model)
 | 
			
		||||
					  (and (standard-result-obj? model)
 | 
			
		||||
					       (determine-receiver-by-type 
 | 
			
		||||
						(standard-result-obj-result model))))))
 | 
			
		||||
		      
 | 
			
		||||
	  (if (< history-pos (length history))
 | 
			
		||||
	      (set! history (append history (list hist-entry)))
 | 
			
		||||
	      (set! history (append 
 | 
			
		||||
			     (sublist history 0 
 | 
			
		||||
				      (- (length history) 1)) 
 | 
			
		||||
			     (list hist-entry) (list active))))
 | 
			
		||||
	  (set! history-pos (length history)))
 | 
			
		||||
	(let ((hist-entry (make-history-entry 
 | 
			
		||||
			   command 
 | 
			
		||||
			   (get-param-as-str parameters) model)))
 | 
			
		||||
	  (set! history (list hist-entry))
 | 
			
		||||
	  (set! history-pos 1)))
 | 
			
		||||
 | 
			
		||||
    (set-buffer-text! command-buffer 
 | 
			
		||||
		      (append (buffer-text command-buffer)
 | 
			
		||||
			      (list "")))
 | 
			
		||||
    (set! active-command command)
 | 
			
		||||
    (set! active-parameters (get-param-as-str parameters))
 | 
			
		||||
    (set! (current-result) model)
 | 
			
		||||
    (scroll-command-buffer)))
 | 
			
		||||
       standard-plugin)))))
 | 
			
		||||
 | 
			
		||||
;;Extracts the name of the function and its parameters
 | 
			
		||||
(define extract-com-and-par
 | 
			
		||||
| 
						 | 
				
			
			@ -683,26 +522,26 @@
 | 
			
		|||
    (read string-port)))
 | 
			
		||||
 | 
			
		||||
(define evaluate 
 | 
			
		||||
  (let ((env (init-evaluation-environment 'nuit-eval-structure)))
 | 
			
		||||
  (let ((env (init-evaluation-environment 'nuit-eval)))
 | 
			
		||||
    (lambda (exp)
 | 
			
		||||
      (with-fatal-error-handler
 | 
			
		||||
       (lambda (condition more)
 | 
			
		||||
	 (cons 'error condition))
 | 
			
		||||
       (eval (read-sexp-from-string exp) env)))))
 | 
			
		||||
 | 
			
		||||
(define (post-message receiver message)
 | 
			
		||||
  ((receiver-rec receiver) message))
 | 
			
		||||
(define (post-message plugin message)
 | 
			
		||||
  ((plugin-fun plugin) message))
 | 
			
		||||
 | 
			
		||||
(define (determine-receiver-by-command command)
 | 
			
		||||
(define (determine-plugin-by-command command)
 | 
			
		||||
  (or (find (lambda (r)
 | 
			
		||||
	      (string=? (receiver-command r) command))
 | 
			
		||||
	    receivers)
 | 
			
		||||
      standard-receiver))
 | 
			
		||||
	      (string=? (plugin-command r) command))
 | 
			
		||||
	    (plugin-list))
 | 
			
		||||
      standard-plugin))
 | 
			
		||||
 | 
			
		||||
(define (determine-receiver-by-type result)
 | 
			
		||||
(define (determine-plugin-by-type result)
 | 
			
		||||
  (find (lambda (r)
 | 
			
		||||
	  ((receiver-type-predicate r) result))
 | 
			
		||||
	receivers))
 | 
			
		||||
	  ((plugin-type-predicate r) result))
 | 
			
		||||
	(plugin-list)))
 | 
			
		||||
  
 | 
			
		||||
;;Management of the upper buffer
 | 
			
		||||
;;add a char to the buffer
 | 
			
		||||
| 
						 | 
				
			
			@ -766,12 +605,11 @@
 | 
			
		|||
 | 
			
		||||
(define (post-print-message command result-object)
 | 
			
		||||
  (post-message
 | 
			
		||||
   (determine-receiver-by-command command)
 | 
			
		||||
   (determine-plugin-by-command command)
 | 
			
		||||
   (make-print-message command result-object
 | 
			
		||||
		       (buffer-num-cols command-buffer))))
 | 
			
		||||
 | 
			
		||||
(define (paint-result-buffer print-object)
 | 
			
		||||
  (debug-message "paint-result-buffer ")
 | 
			
		||||
  (let* ((window (app-window-curses-win result-window))
 | 
			
		||||
	 (text (print-object-text print-object))
 | 
			
		||||
	 (pos-y (print-object-pos-y print-object))
 | 
			
		||||
| 
						 | 
				
			
			@ -881,53 +719,6 @@
 | 
			
		|||
      (set! result-buffer-pos-y pos-result))
 | 
			
		||||
  (set! result-buffer-pos-x pos-result-col))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; ;;index of shortcuts at the bottom
 | 
			
		||||
; (define print-bar3
 | 
			
		||||
;   (lambda (width)
 | 
			
		||||
;     (let loop ((pos 0)
 | 
			
		||||
; 	       (used-width 0)
 | 
			
		||||
; 	       (act-line 1))
 | 
			
		||||
;       (if (>= pos (length shortcuts))
 | 
			
		||||
; 	  (begin
 | 
			
		||||
; 	    (let* ((num-blanks (+ (- width used-width) 1))
 | 
			
		||||
; 		   (last-string (make-string num-blanks #\space)))
 | 
			
		||||
; 	      (mvwaddstr bar3 act-line (+ used-width 1) last-string))
 | 
			
		||||
; 	    (wrefresh bar3))
 | 
			
		||||
; 	  (let* ((act-string (list-ref shortcuts pos))
 | 
			
		||||
; 		 (act-length (string-length act-string))
 | 
			
		||||
; 		 (rest-width (- width used-width)))
 | 
			
		||||
; 	    (if (= act-line 1)
 | 
			
		||||
; 		(if (<= (+ act-length 3) rest-width)
 | 
			
		||||
; 		    (if (= used-width 0)
 | 
			
		||||
; 			(begin
 | 
			
		||||
; 			  (mvwaddstr bar3 1 (+ used-width 1) act-string)
 | 
			
		||||
; 			  (loop (+ pos 1) (+ used-width act-length) 1))	    
 | 
			
		||||
; 			(begin
 | 
			
		||||
; 			  (mvwaddstr bar3 1 (+ used-width 1)
 | 
			
		||||
; 				     (string-append " | " act-string))
 | 
			
		||||
; 			  (loop (+ pos 1) (+ used-width (+ 3 act-length))
 | 
			
		||||
; 				1)))
 | 
			
		||||
; 		    (begin
 | 
			
		||||
; 		      (let* ((num-blanks (+ rest-width 1))
 | 
			
		||||
; 			     (last-string (make-string num-blanks #\space)))
 | 
			
		||||
; 			(mvwaddstr bar3 1 (+ used-width 1) last-string))       
 | 
			
		||||
; 		      (loop pos 0 2)))
 | 
			
		||||
; 		(if (<= (+ act-length 3) rest-width)
 | 
			
		||||
; 		    (if (= used-width 0)
 | 
			
		||||
; 			(begin
 | 
			
		||||
; 			  (mvwaddstr bar3 2 (+ used-width 1) act-string)
 | 
			
		||||
; 			  (loop (+ pos 1) (+ used-width act-length) 2))
 | 
			
		||||
; 			(begin
 | 
			
		||||
; 			  (mvwaddstr bar3 2 (+ used-width 1)
 | 
			
		||||
; 				     (string-append " | " act-string))
 | 
			
		||||
; 			  (loop (+ pos 1) (+ used-width (+ 3 act-length)) 2)))
 | 
			
		||||
; 		    (begin
 | 
			
		||||
; 		      (let* ((num-blanks (+ rest-width 1) )
 | 
			
		||||
; 			     (last-string (make-string num-blanks #\space)))
 | 
			
		||||
; 			(mvwaddstr bar3 2 (+ used-width 1) last-string))
 | 
			
		||||
; 		      (wrefresh bar3)))))))))
 | 
			
		||||
 | 
			
		||||
(define (sublist l pos k)
 | 
			
		||||
  (let ((tmp (list-tail l pos)))
 | 
			
		||||
    (reverse (list-tail (reverse tmp) 
 | 
			
		||||
| 
						 | 
				
			
			@ -948,39 +739,15 @@
 | 
			
		|||
  (set! history '())
 | 
			
		||||
  (set! history-pos 0)
 | 
			
		||||
  (set! active-keyboard-interrupt #f))
 | 
			
		||||
    
 | 
			
		||||
;;Shortcuts-receiver:
 | 
			
		||||
;;-------------------
 | 
			
		||||
;;If the user enters the command "shortcuts" a list of the included
 | 
			
		||||
;;shortcuts is displayed
 | 
			
		||||
(define-record-type shortcut-result-obj shortcut-result-obj
 | 
			
		||||
  (make-shortcut-result-obj a)
 | 
			
		||||
  shortcut-result-object?
 | 
			
		||||
  (a shortcut-result-object-a))
 | 
			
		||||
 | 
			
		||||
(define (shortcut-receiver message)
 | 
			
		||||
  (cond
 | 
			
		||||
   ((next-command-message? message)
 | 
			
		||||
    (make-shortcut-result-obj #t))
 | 
			
		||||
   ((print-message? message)
 | 
			
		||||
    (make-print-object 1 1 shortcuts '() '()))
 | 
			
		||||
   ((key-pressed-message? message)
 | 
			
		||||
    (message-result-object message))
 | 
			
		||||
   ((restore-message? message)
 | 
			
		||||
    (values))
 | 
			
		||||
   ((selection-message? message)
 | 
			
		||||
    "")))
 | 
			
		||||
(define (get-param-as-str param-lst)
 | 
			
		||||
  (let loop ((lst param-lst)
 | 
			
		||||
	     (str ""))
 | 
			
		||||
    (if (null? lst)
 | 
			
		||||
	str
 | 
			
		||||
	(loop (cdr lst)
 | 
			
		||||
	      (string-append str " " (car lst))))))
 | 
			
		||||
 | 
			
		||||
(define shortcut-rec (make-receiver "shortcuts" shortcut-receiver))
 | 
			
		||||
 | 
			
		||||
(set! receivers (cons shortcut-rec receivers))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;;Standard-Receiver
 | 
			
		||||
;;-----------------
 | 
			
		||||
 | 
			
		||||
;;Datatype representing the "standard-result-objects"
 | 
			
		||||
(define-record-type standard-result-obj standard-result-obj
 | 
			
		||||
  (make-standard-result-obj cursor-pos-y
 | 
			
		||||
			    cursor-pos-x
 | 
			
		||||
| 
						 | 
				
			
			@ -1021,71 +788,6 @@
 | 
			
		|||
   ((selection-message? message)
 | 
			
		||||
    "")))
 | 
			
		||||
 | 
			
		||||
(define standard-receiver
 | 
			
		||||
  (make-receiver #f standard-receiver-rec))
 | 
			
		||||
(define standard-plugin
 | 
			
		||||
  (make-plugin #f standard-receiver-rec))
 | 
			
		||||
 | 
			
		||||
;;the result is the "answer" of scsh
 | 
			
		||||
(define (layout-result-standard result-str result width)
 | 
			
		||||
  (reverse (seperate-line result-str width)))
 | 
			
		||||
 | 
			
		||||
;useful helpers
 | 
			
		||||
(define (get-marked-positions-1 all-items marked-items)
 | 
			
		||||
  (let loop ((count 0)
 | 
			
		||||
	     (result '()))
 | 
			
		||||
    (if (>= count (length all-items))
 | 
			
		||||
	result
 | 
			
		||||
	(let ((act-item (list-ref all-items count)))
 | 
			
		||||
	  (if (member act-item marked-items)
 | 
			
		||||
	      (loop (+ count 1)
 | 
			
		||||
		    (append result (list (+ count 1))))
 | 
			
		||||
	      (loop (+ count 1) result))))))
 | 
			
		||||
 | 
			
		||||
(define (get-marked-positions-2 all-items marked-items)
 | 
			
		||||
  (let loop ((count 0)
 | 
			
		||||
	     (result '()))
 | 
			
		||||
    (if (>= count (length all-items))
 | 
			
		||||
	result
 | 
			
		||||
	(let ((act-item (list-ref all-items count)))
 | 
			
		||||
	  (if (member act-item marked-items)
 | 
			
		||||
	      (loop (+ count 1)
 | 
			
		||||
		    (append result (list (+ count 2))))
 | 
			
		||||
	      (loop (+ count 1) result))))))
 | 
			
		||||
 | 
			
		||||
(define (get-marked-positions-3 all-items marked-items)
 | 
			
		||||
  (let loop ((count 0)
 | 
			
		||||
	     (result '()))
 | 
			
		||||
    (if (>= count (length all-items))
 | 
			
		||||
	result
 | 
			
		||||
	(let ((act-item (list-ref all-items count)))
 | 
			
		||||
	  (if (member act-item marked-items)
 | 
			
		||||
	      (loop (+ count 1)
 | 
			
		||||
		    (append result (list (+ count 3))))
 | 
			
		||||
	      (loop (+ count 1) result))))))
 | 
			
		||||
 | 
			
		||||
;;expression as string
 | 
			
		||||
(define (exp->string exp)
 | 
			
		||||
  (let ((exp-port (open-output-string)))
 | 
			
		||||
    (write exp exp-port)
 | 
			
		||||
    (get-output-string exp-port)))
 | 
			
		||||
 | 
			
		||||
;;seperate a long line into pieces, each fitting into a smaller line.
 | 
			
		||||
(define (seperate-line line width)
 | 
			
		||||
  (let loop ((new '())
 | 
			
		||||
	     (old line))
 | 
			
		||||
    (if (> width (string-length old))
 | 
			
		||||
	(if (= 0 (string-length old))
 | 
			
		||||
	    (if (equal? new '())
 | 
			
		||||
		'("")
 | 
			
		||||
		new)
 | 
			
		||||
	    (append (list old) new))
 | 
			
		||||
	(let ((next-line (substring old 0 width))
 | 
			
		||||
	      (rest-old (substring old width (string-length old))))
 | 
			
		||||
	  (loop (cons next-line new) rest-old)))))
 | 
			
		||||
 | 
			
		||||
(define (get-param-as-str param-lst)
 | 
			
		||||
  (let loop ((lst param-lst)
 | 
			
		||||
	     (str ""))
 | 
			
		||||
    (if (null? lst)
 | 
			
		||||
	str
 | 
			
		||||
	(loop (cdr lst)
 | 
			
		||||
	      (string-append str " " (car lst))))))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,18 +13,156 @@
 | 
			
		|||
	  history-last-entry))
 | 
			
		||||
 | 
			
		||||
(define-structure history history-interface
 | 
			
		||||
  (open scheme 
 | 
			
		||||
  (open scheme
 | 
			
		||||
	define-record-types)
 | 
			
		||||
  (files history))
 | 
			
		||||
 | 
			
		||||
;;; layout utilities
 | 
			
		||||
 | 
			
		||||
(define-interface layout-interface
 | 
			
		||||
  (export seperate-line
 | 
			
		||||
	  layout-result-standard
 | 
			
		||||
	  get-marked-positions-1
 | 
			
		||||
	  get-marked-positions-2
 | 
			
		||||
	  get-marked-positions-3
 | 
			
		||||
	  exp->string
 | 
			
		||||
	  sublist))
 | 
			
		||||
 | 
			
		||||
(define-structure layout layout-interface
 | 
			
		||||
  (open scheme
 | 
			
		||||
	srfi-6			;; basic string ports
 | 
			
		||||
	)
 | 
			
		||||
  (files layout))
 | 
			
		||||
 | 
			
		||||
;;; process viewer plugin
 | 
			
		||||
 | 
			
		||||
(define-structure process-view-plugin
 | 
			
		||||
    (export)
 | 
			
		||||
  (open scheme
 | 
			
		||||
	srfi-1
 | 
			
		||||
	formats
 | 
			
		||||
	pps
 | 
			
		||||
	plugin
 | 
			
		||||
	tty-debug)
 | 
			
		||||
  (files process))
 | 
			
		||||
 | 
			
		||||
;;; file list view plugin
 | 
			
		||||
 | 
			
		||||
(define-structure dirlist-view-plugin
 | 
			
		||||
    (export)
 | 
			
		||||
  (open scheme-with-scsh
 | 
			
		||||
	define-record-types
 | 
			
		||||
	layout
 | 
			
		||||
	fs-object
 | 
			
		||||
	srfi-1
 | 
			
		||||
	plugin
 | 
			
		||||
	ncurses
 | 
			
		||||
	tty-debug)
 | 
			
		||||
  (files browse-directory-list))
 | 
			
		||||
 | 
			
		||||
;;; browse-list plugin
 | 
			
		||||
 | 
			
		||||
(define-structure browse-list-plugin
 | 
			
		||||
    (export)
 | 
			
		||||
  (open scheme
 | 
			
		||||
	define-record-types
 | 
			
		||||
	ncurses
 | 
			
		||||
	plugin
 | 
			
		||||
	layout)
 | 
			
		||||
  (files browse-list))
 | 
			
		||||
 | 
			
		||||
;;; fs-objects
 | 
			
		||||
 | 
			
		||||
(define-interface fs-object-interface
 | 
			
		||||
  (export make-fs-object
 | 
			
		||||
	  fs-object?
 | 
			
		||||
	  fs-object-name
 | 
			
		||||
	  fs-object-path))
 | 
			
		||||
 | 
			
		||||
(define-structure fs-object fs-object-interface
 | 
			
		||||
  (open scheme
 | 
			
		||||
	define-record-types)
 | 
			
		||||
  (files fs-object))
 | 
			
		||||
 | 
			
		||||
;;; nuit evaluates the expressions entered into command buffer in this
 | 
			
		||||
;;; package
 | 
			
		||||
 | 
			
		||||
(define-structure nuit-eval-structure (export)
 | 
			
		||||
  (open scheme-with-scsh
 | 
			
		||||
	srfi-1
 | 
			
		||||
	pps)
 | 
			
		||||
  (begin))
 | 
			
		||||
(define-structure nuit-eval
 | 
			
		||||
    (export)
 | 
			
		||||
  (open 
 | 
			
		||||
   (modify scheme-with-scsh
 | 
			
		||||
	   (rename (directory-files scsh-directory-files)))
 | 
			
		||||
   let-opt
 | 
			
		||||
   srfi-1
 | 
			
		||||
   fs-object
 | 
			
		||||
   pps)
 | 
			
		||||
  (files eval))
 | 
			
		||||
 | 
			
		||||
;;; nuit plug-in registration
 | 
			
		||||
 | 
			
		||||
(define-interface plugin-interface
 | 
			
		||||
  (export make-plugin
 | 
			
		||||
	  plugin?
 | 
			
		||||
	  plugin-command
 | 
			
		||||
	  plugin-fun
 | 
			
		||||
	  plugin-type-predicate
 | 
			
		||||
	  register-plugin!
 | 
			
		||||
 | 
			
		||||
	  make-print-object
 | 
			
		||||
	  print-object?
 | 
			
		||||
	  print-object-pos-y
 | 
			
		||||
	  print-object-pos-x
 | 
			
		||||
	  print-object-text
 | 
			
		||||
	  print-object-highlighted-lines
 | 
			
		||||
	  print-object-marked-lines
 | 
			
		||||
 | 
			
		||||
	  next-command-message?
 | 
			
		||||
	  next-command-string
 | 
			
		||||
	  next-command-message-parameters
 | 
			
		||||
	  next-command-message-width
 | 
			
		||||
 | 
			
		||||
	  init-with-result-message?
 | 
			
		||||
	  init-with-result-message-result
 | 
			
		||||
	  init-with-result-message-width
 | 
			
		||||
 | 
			
		||||
	  key-pressed-message?
 | 
			
		||||
	  key-pressed-message-result-object
 | 
			
		||||
	  key-pressed-message-key
 | 
			
		||||
	  key-pressed-message-prefix-key
 | 
			
		||||
 | 
			
		||||
	  print-message?
 | 
			
		||||
	  print-message-command-string
 | 
			
		||||
	  print-message-result-object
 | 
			
		||||
	  print-message-width
 | 
			
		||||
 | 
			
		||||
	  restore-message?
 | 
			
		||||
	  restore-message-command-string
 | 
			
		||||
	  restore-message-result-object
 | 
			
		||||
 | 
			
		||||
	  selection-message?
 | 
			
		||||
	  selection-message-command-string
 | 
			
		||||
	  selection-message-result-object
 | 
			
		||||
 | 
			
		||||
	  message-result-object
 | 
			
		||||
	  message-command-string))
 | 
			
		||||
 | 
			
		||||
(define-interface plugin-host-interface
 | 
			
		||||
  (export plugin-list
 | 
			
		||||
	  make-next-command-message
 | 
			
		||||
	  make-init-with-result-message
 | 
			
		||||
	  make-key-pressed-message
 | 
			
		||||
	  make-print-message
 | 
			
		||||
	  make-restore-message
 | 
			
		||||
	  make-selection-message))
 | 
			
		||||
 | 
			
		||||
(define-structures
 | 
			
		||||
  ((plugin plugin-interface)
 | 
			
		||||
   (plugin-host plugin-host-interface))
 | 
			
		||||
  (open scheme
 | 
			
		||||
	define-record-types
 | 
			
		||||
	let-opt
 | 
			
		||||
	signals)
 | 
			
		||||
  (files plugins))
 | 
			
		||||
 | 
			
		||||
;;; nuit 
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -46,17 +184,16 @@
 | 
			
		|||
	inspect-exception
 | 
			
		||||
	rt-modules
 | 
			
		||||
	tty-debug
 | 
			
		||||
	fs-object
 | 
			
		||||
	plugin
 | 
			
		||||
	plugin-host
 | 
			
		||||
	layout
 | 
			
		||||
	pps
 | 
			
		||||
	history)
 | 
			
		||||
	history
 | 
			
		||||
	;; the following modules are plugins
 | 
			
		||||
	browse-list-plugin
 | 
			
		||||
	dirlist-view-plugin
 | 
			
		||||
	process-view-plugin)
 | 
			
		||||
  (files nuit-engine
 | 
			
		||||
	 handle-fatal-error
 | 
			
		||||
	 directory-files
 | 
			
		||||
	 find
 | 
			
		||||
	 cd
 | 
			
		||||
	 browse-directory-list
 | 
			
		||||
	 browse-list
 | 
			
		||||
	 process))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	 handle-fatal-error))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,125 @@
 | 
			
		|||
(define *plugins* '())
 | 
			
		||||
 | 
			
		||||
(define (plugin-list)
 | 
			
		||||
  *plugins*)
 | 
			
		||||
 | 
			
		||||
(define-record-type plugin :plugin
 | 
			
		||||
  (really-make-plugin command fun type-predicate)
 | 
			
		||||
  plugin?
 | 
			
		||||
  (command plugin-command)
 | 
			
		||||
  (fun plugin-fun)
 | 
			
		||||
  (type-predicate plugin-type-predicate))
 | 
			
		||||
 | 
			
		||||
(define-record-discloser :plugin
 | 
			
		||||
  (lambda (r)
 | 
			
		||||
    `(plugin ,(plugin-command r) ,(plugin-fun r))))
 | 
			
		||||
 | 
			
		||||
(define (make-plugin command fun . more)
 | 
			
		||||
  (let-optionals more
 | 
			
		||||
      ((type-predicate (lambda (v) #f)))
 | 
			
		||||
    (really-make-plugin command fun type-predicate)))
 | 
			
		||||
 | 
			
		||||
(define (register-plugin! plugin)
 | 
			
		||||
  (set! *plugins* (cons plugin *plugins*)))
 | 
			
		||||
 | 
			
		||||
;; answers
 | 
			
		||||
 | 
			
		||||
(define-record-type print-object :print-object
 | 
			
		||||
  (make-print-object pos-y
 | 
			
		||||
		     pos-x
 | 
			
		||||
		     text
 | 
			
		||||
		     highlighted-lines
 | 
			
		||||
		     marked-lines)
 | 
			
		||||
  print-object?
 | 
			
		||||
  (pos-y print-object-pos-y)
 | 
			
		||||
  (pos-x print-object-pos-x)
 | 
			
		||||
  (text print-object-text)
 | 
			
		||||
  (highlighted-lines print-object-highlighted-lines)
 | 
			
		||||
  (marked-lines print-object-marked-lines))
 | 
			
		||||
 | 
			
		||||
;; messages
 | 
			
		||||
 | 
			
		||||
(define-record-type next-command-message :next-command-message
 | 
			
		||||
  (make-next-command-message command-string
 | 
			
		||||
			     parameters
 | 
			
		||||
			     width)
 | 
			
		||||
  next-command-message?
 | 
			
		||||
  (command-string next-command-string)
 | 
			
		||||
  (parameters next-command-message-parameters)
 | 
			
		||||
  (width next-command-message-width))
 | 
			
		||||
 | 
			
		||||
(define-record-type init-with-result-message :init-with-result-message
 | 
			
		||||
  (make-init-with-result-message result width)
 | 
			
		||||
  init-with-result-message?
 | 
			
		||||
  (result init-with-result-message-result)
 | 
			
		||||
  (width init-with-result-message-width))
 | 
			
		||||
 | 
			
		||||
;;key pressed
 | 
			
		||||
;;The object and the key are send to the user-code, who returns the
 | 
			
		||||
;;changed object.
 | 
			
		||||
(define-record-type key-pressed-message :key-pressed-message
 | 
			
		||||
  (make-key-pressed-message command-string
 | 
			
		||||
			    result-object
 | 
			
		||||
			    key prefix-key)
 | 
			
		||||
  key-pressed-message?
 | 
			
		||||
  (command-string key-pressed-command-string)
 | 
			
		||||
  (result-object key-pressed-message-result-object)
 | 
			
		||||
  (key key-pressed-message-key)
 | 
			
		||||
  (prefix-key key-pressed-message-prefix-key))
 | 
			
		||||
 | 
			
		||||
;;print
 | 
			
		||||
(define-record-type print-message :print-message
 | 
			
		||||
  (make-print-message command-string
 | 
			
		||||
		      result-object
 | 
			
		||||
		      width)
 | 
			
		||||
  print-message?
 | 
			
		||||
  (command-string print-message-command-string)
 | 
			
		||||
  (result-object print-message-result-object)
 | 
			
		||||
  (width print-message-width))
 | 
			
		||||
 | 
			
		||||
;;restore (when side-effects occur)
 | 
			
		||||
(define-record-type restore-message :restore-message
 | 
			
		||||
  (make-restore-message command-string
 | 
			
		||||
			result-object)
 | 
			
		||||
  restore-message?
 | 
			
		||||
  (command-string restore-message-command-string)
 | 
			
		||||
  (result-object restore-message-result-object))
 | 
			
		||||
 | 
			
		||||
;;request the selection
 | 
			
		||||
(define-record-type selection-message :selection-message
 | 
			
		||||
  (make-selection-message command-string
 | 
			
		||||
			  result-object)
 | 
			
		||||
  selection-message?
 | 
			
		||||
  (command-string selection-message-command-string)
 | 
			
		||||
  (result-object selection-message-result-object))
 | 
			
		||||
 | 
			
		||||
(define (message-result-object message)
 | 
			
		||||
  ((cond 
 | 
			
		||||
    ((key-pressed-message? message) 
 | 
			
		||||
     key-pressed-message-result-object)
 | 
			
		||||
    ((print-message? message) 
 | 
			
		||||
     print-message-result-object)
 | 
			
		||||
    ((restore-message? message) 
 | 
			
		||||
     restore-message-result-object)
 | 
			
		||||
    ((selection-message? message) 
 | 
			
		||||
     selection-message-result-object message)
 | 
			
		||||
    (else 
 | 
			
		||||
     (error "This message-type has no field for result-objects"
 | 
			
		||||
	    message)))
 | 
			
		||||
   message))
 | 
			
		||||
 | 
			
		||||
(define (message-command-string message)
 | 
			
		||||
  ((cond
 | 
			
		||||
    ((next-command-message? message)
 | 
			
		||||
     next-command-string)
 | 
			
		||||
    ((key-pressed-message? message)
 | 
			
		||||
     key-pressed-command-string)
 | 
			
		||||
    ((print-message? message)
 | 
			
		||||
     print-message-command-string)
 | 
			
		||||
    ((restore-message? message)
 | 
			
		||||
     restore-message-command-string)
 | 
			
		||||
    ((selection-message? message)
 | 
			
		||||
     selection-message-command-string)
 | 
			
		||||
    (else
 | 
			
		||||
     (error "This message-type has no command field" message)))
 | 
			
		||||
   message))
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,8 @@
 | 
			
		|||
  (cond
 | 
			
		||||
   ((next-command-message? message)
 | 
			
		||||
    (pps))
 | 
			
		||||
   ((init-with-result-message? message)
 | 
			
		||||
    (init-with-result-message-result message))
 | 
			
		||||
   ((print-message? message)
 | 
			
		||||
    (let ((processes (message-result-object message)))
 | 
			
		||||
      (make-print-object 1 1 (print-processes processes)
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +35,5 @@
 | 
			
		|||
   ((selection-message? message)
 | 
			
		||||
    "'()")))
 | 
			
		||||
 | 
			
		||||
(set! receivers (cons (make-receiver "ps" pps-receiver 
 | 
			
		||||
				     list-of-processes?)
 | 
			
		||||
		      receivers))
 | 
			
		||||
 | 
			
		||||
(register-plugin! 
 | 
			
		||||
 (make-plugin "ps" pps-receiver list-of-processes?))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue