help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

updating buffer window while accepting minibuffer input


From: Buchs, Kevin J.
Subject: updating buffer window while accepting minibuffer input
Date: Wed, 16 Jul 2014 16:12:57 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0

This is a follow-up to "regexp nirvana - near miss" (thanks Drew for giving me this programming burden ;-). I'm wanting to traverse a list of buffer positions according to minibuffer keystrokes and have the referenced buffer position update (and eventually highlight) much like isearch-*. I'm stuck on the buffer position not actually updating whilest I am in the midst of (read-minibuffer-input). I have spent about two hours delving into how isearch works and came out without a clue as to how it actually gets minibuffer reading activated. So, I'm seeking help. Code follows signature.

Kevin Buchs   Research Computer Services   Phone: 507-538-5459
Mayo Clinic   200 1st. St SW   Rochester, MN 55905
http://mayoclinic.org  http://facebook.com/MayoClinic  
http://youtube.com/MayoClinic  http://twitter.com/MayoClinic

(defun regexpneg-fwd ()
   (interactive)
     ;; Move to next match
     (if (< regexpneg-pointer (1- (length regexpneg-list)))
            (progn
                 (set-buffer regexpneg-buffer)
                 (setq regexpneg-pointer (1+ regexpneg-pointer))
                 (goto-char (nth regexpneg-pointer regexpneg-list))
                 (recenter 5)
                 (message "buffer: %S, position: %d, pointer: %d"
                        (current-buffer) (point) regexpneg-pointer))))


(defun regexpneg-rev ()
   (interactive)
     ;; Move to prior match
     (unless (= regexpneg-pointer 0)
            (set-buffer regexpneg-buffer)
            (setq regexpneg-pointer (1- regexpneg-pointer))
            (goto-char (nth regexpneg-pointer regexpneg-list))
            (recenter 5)
            (message "buffer: %S, position: %d, pointer: %d"
                 (current-buffer) (point) regexpneg-pointer)))


(defun regexpneg (part negpart)
"Search for regexp part, not followed by regexp negpart; You can advance in search hits with C-s or SPACE. Reverse with C-r or DEL"
     (interactive)
     (let (
                     (point-start (point))
                     (subsetnotlist '()))

            ;; Save a reference to current buffer
            (setq regexpneg-buffer (current-buffer))

;; Search for 'part' - return list of locations = regexpneg-list
            (setq regexpneg-list '())
            (while (re-search-forward part nil t)
                 (setq regexpneg-list (append regexpneg-list
 (list (match-beginning 0)))))

;; Search for 'part'+'negpart' - return list of locations = subsetnotlist
            (goto-char point-start)
            (while (re-search-forward (concat part negpart) nil t)
(setq subsetnotlist (append subsetnotlist (list (match-beginning 0)))))

            ;; Delete members of subsetnotlist from regexpneg-list
            (dolist (var subsetnotlist)
                 (delq var regexpneg-list))

            ;; Check for keymap or create it
            (unless (keymapp 'regexpneg-keymap)
                 (setq regexpneg-keymap (make-sparse-keymap))
                 (define-key regexpneg-keymap "\C-s" 'regexpneg-fwd)
                 (define-key regexpneg-keymap " " 'regexpneg-fwd)
                 (define-key regexpneg-keymap "\C-r" 'regexpneg-rev)
                 (define-key regexpneg-keymap "DEL" 'regexpneg-rev)
                 (define-key regexpneg-keymap "\C-j" 'exit-minibuffer)
                 (define-key regexpneg-keymap "\C-m" 'exit-minibuffer))

            ;; Set index-pointer
            (setq regexpneg-pointer 0)

            ;; Move to first match
            (goto-char (nth regexpneg-pointer regexpneg-list))
            (message "buffer: %S, position: %d, pointer: %d"
                 (current-buffer) (point) regexpneg-pointer)

            ;; Show minibuffer for further options
            (setq resp (read-from-minibuffer
                 "REN: fwd=C-s,SPACE; rev=C-r,DEL; exit=C-j,C-m: " nil
                 regexpneg-keymap))
            (message "got response '%s'" resp)))





reply via email to

[Prev in Thread] Current Thread [Next in Thread]