]> git.eshelyaron.com Git - emacs.git/commitdiff
* bookmark.el (bookmark-search-delay, bookmark-search-prompt): New options.
authorStefan Monnier <monnier@iro.umontreal.ca>
Fri, 20 Nov 2009 15:47:26 +0000 (15:47 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Fri, 20 Nov 2009 15:47:26 +0000 (15:47 +0000)
(bookmark-search-pattern, bookmark-search-timer, bookmark-quit-flag): New vars.
(bookmark-read-search-input, bookmark-filtered-alist-by-regexp-only)
(bookmark-bmenu-filter-alist-by-regexp)
(bookmark-bmenu-goto-bookmark, bookmark-bmenu-cancel-search): New funs.
(bookmark-bmenu-search): New command.
(bookmark-bmenu-mode-map): Bind it.

etc/NEWS
lisp/ChangeLog
lisp/bookmark.el

index 31e8620f6ab0adb8af1408ec2d7047eb9c8ce327..87c11dd17a2a35912b6c65ae5b0bbc447e2f1ef9 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -153,6 +153,11 @@ when the value of the new variable `completions-format' is `vertical'.
 \f
 * Changes in Specialized Modes and Packages in Emacs 23.2
 
+** The bookmark menu has a narrowing search via bookmark-bmenu-search.
+
+** LaTeX mode now provides completion via latex-complete and
+latex-indent-or-complete.
+
 ** lucid.el and levents.el are now declared obsolete.
 
 ** pcomplete provides a new command `pcomplete-std-completion' which
index 914a4e8e950592e20dad21d2dc7f62b0a17ed0ec..575f121852ea026d568d8418ed9428455b5cd1cc 100644 (file)
@@ -1,7 +1,18 @@
+2009-11-20  Thierry Volpiatto  <thierry.volpiatto@gmail.com>
+
+       * bookmark.el (bookmark-search-delay, bookmark-search-prompt):
+       New options.
+       (bookmark-search-pattern, bookmark-search-timer, bookmark-quit-flag):
+       New vars.
+       (bookmark-read-search-input, bookmark-filtered-alist-by-regexp-only)
+       (bookmark-bmenu-filter-alist-by-regexp)
+       (bookmark-bmenu-goto-bookmark, bookmark-bmenu-cancel-search): New funs.
+       (bookmark-bmenu-search): New command.
+       (bookmark-bmenu-mode-map): Bind it.
+
 2009-11-20  Chong Yidong  <cyd@stupidchicken.com>
 
-       * cedet/semantic/complete.el (semantic-complete-inline-map): Doc
-       fix.
+       * cedet/semantic/complete.el (semantic-complete-inline-map): Doc fix.
 
        * cedet/semantic/idle.el (define-semantic-idle-service)
        (semantic-idle-summary-mode, semantic-idle-completions): Doc fix.
        * Makefile.in: Don't refer cc-subword.elc but subword.elc.
 
        * progmodes/cc-cmds.el (c-update-modeline)
-       (c-forward-into-nomenclature, c-backward-into-nomenclature): Refer
-       to subword.el functions instead of cc-subword.el.
+       (c-forward-into-nomenclature, c-backward-into-nomenclature):
+       Refer to subword.el functions instead of cc-subword.el.
 
        * progmodes/cc-mode.el (subword-mode, c-mode-base-map): Refer to
        subword.el functions instead of cc-subword.el.
 
-       * progmodes/cc-subword.el: Renamed to subword.el.
-       * subword.el: Renamed from progmodes/cc-subword.el.
-       (subword-mode-map): Renamed from c-subword-mode-map.
-       (subword-mode): Renamed from c-subword-mode.
+       * progmodes/cc-subword.el: Rename to subword.el.
+       * subword.el: Rename from progmodes/cc-subword.el.
+       (subword-mode-map): Rename from c-subword-mode-map.
+       (subword-mode): Rename from c-subword-mode.
        (global-subword-mode): New global minor mode.
-       (forward-subword): Renamed from c-forward-subword.
-       (backward-subword): Renamed from c-backward-subword.
-       (mark-subword): Renamed from c-mark-subword.
-       (kill-subword): Renamed from c-kill-subword.
-       (backward-kill-subword): Renamed from c-backward-kill-subword.
-       (transpose-subwords): Renamed from c-tranpose-subword.
-       (downcase-subword): Renamed from c-downcase-subword.
-       (capitalize-subword): Renamed from c-capitalize-subword.
-       (forward-subword-internal): Renamed from
-       c-forward-subword-internal.
-       (backward-subword-internal): Renamed from
-       c-backward-subword-internal.
+       (forward-subword): Rename from c-forward-subword.
+       (backward-subword): Rename from c-backward-subword.
+       (mark-subword): Rename from c-mark-subword.
+       (kill-subword): Rename from c-kill-subword.
+       (backward-kill-subword): Rename from c-backward-kill-subword.
+       (transpose-subwords): Rename from c-tranpose-subword.
+       (downcase-subword): Rename from c-downcase-subword.
+       (capitalize-subword): Rename from c-capitalize-subword.
+       (forward-subword-internal): Rename from c-forward-subword-internal.
+       (backward-subword-internal): Rename from c-backward-subword-internal.
 
 2009-11-20  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * vc-mtn.el (vc-mtn-print-log):
        * vc-hg.el (vc-hg-print-log):
        * vc-bzr.el (vc-bzr-print-log): Add new optional argument LIMIT,
-       pass it to the log command when set. Make the BUFFER argument
+       pass it to the log command when set.  Make the BUFFER argument
        non-optional.
 
        * vc-sccs.el (vc-sccs-print-log):
index a3c315acbc26c644c42dc8b1deb65fceecf68c56..a68f83a29b7970920a1828401bff2abaa0195696 100644 (file)
@@ -197,6 +197,18 @@ following in your `.emacs' file:
   :group 'bookmark)
 
 
+(defcustom bookmark-search-delay 0.2
+  "*Display when searching bookmarks is updated all `bookmark-search-delay' seconds."
+  :group 'bookmark
+  :type  'integer)
+
+
+(defcustom bookmark-search-prompt "Pattern: "
+  "*Prompt used for `bookmark-bmenu-search'."
+  :group 'bookmark
+  :type  'string)
+
+
 (defface bookmark-menu-heading
   '((t (:inherit font-lock-type-face)))
   "Face used to highlight the heading in bookmark menu buffers."
@@ -320,6 +332,18 @@ the source buffer for that information; see `bookmark-yank-word' and
 This point is in `bookmark-curent-buffer'.")
 
 
+(defvar bookmark-search-pattern ""
+  "Store keyboard input for incremental search.")
+
+
+(defvar bookmark-search-timer nil
+  "Timer used for searching")
+
+
+(defvar bookmark-quit-flag nil
+  "Non nil make `bookmark-bmenu-search' quit immediately.")
+
+
 \f
 ;; Helper functions.
 
@@ -1525,6 +1549,7 @@ method buffers use to resolve name collisions."
     (define-key map "a" 'bookmark-bmenu-show-annotation)
     (define-key map "A" 'bookmark-bmenu-show-all-annotations)
     (define-key map "e" 'bookmark-bmenu-edit-annotation)
+    (define-key map "\M-g" 'bookmark-bmenu-search)
     (define-key map [mouse-2] 'bookmark-bmenu-other-window-with-mouse)
     map))
 
@@ -2072,6 +2097,79 @@ To carry out the deletions that you've marked, use \\<bookmark-bmenu-mode-map>\\
         (bookmark-relocate bmrk)
         (goto-char thispoint))))
 
+;;; Bookmark-bmenu search
+
+(defun bookmark-read-search-input ()
+  "Read each keyboard input and add it to `bookmark-search-pattern'."
+  (setq bookmark-search-pattern "")    ; Always reset pattern to empty string
+  (let ((prompt       (propertize bookmark-search-prompt 'face '((:foreground "cyan"))))
+        (inhibit-quit t)
+        (tmp-list     ())
+        char)
+    (catch 'break
+      (while 1
+        (catch 'continue
+          (condition-case nil
+              (setq char (read-char (concat prompt bookmark-search-pattern)))
+            (error (throw 'break nil)))
+          (case char
+            ((or ?\e ?\r) (throw 'break nil))    ; RET or ESC break search loop and lead to [1].
+            (?\d (pop tmp-list)         ; Delete last char of `bookmark-search-pattern' with DEL
+                 (setq bookmark-search-pattern (mapconcat 'identity (reverse tmp-list) ""))
+                 (throw 'continue nil))
+            (?\C-g (setq bookmark-quit-flag t) (throw 'break nil))
+            (t
+             (push (text-char-description char) tmp-list)
+             (setq bookmark-search-pattern (mapconcat 'identity (reverse tmp-list) ""))
+             (throw 'continue nil))))))))
+
+
+(defun bookmark-filtered-alist-by-regexp-only (regexp)
+  "Return a filtered `bookmark-alist' with bookmarks matching REGEXP."
+  (loop for i in bookmark-alist
+     when (string-match regexp (car i)) collect i into new
+     finally return new))
+
+
+(defun bookmark-bmenu-filter-alist-by-regexp (regexp)
+  "Filter `bookmark-alist' with bookmarks matching REGEXP and rebuild list."
+  (let ((bookmark-alist (bookmark-filtered-alist-by-regexp-only regexp)))
+    (bookmark-bmenu-list)))
+
+;;;###autoload
+(defun bookmark-bmenu-search ()
+  "Incremental search of bookmarks matching `bookmark-search-pattern'.
+`bookmark-search-pattern' is build incrementally with `bookmark-read-search-input'"
+  (interactive)
+  (when (string= (buffer-name (current-buffer)) "*Bookmark List*")
+    (let ((bmk (bookmark-bmenu-bookmark)))
+      (unwind-protect
+           (progn
+             (setq bookmark-search-timer
+                   (run-with-idle-timer bookmark-search-delay 'repeat
+                                        #'(lambda ()
+                                            (bookmark-bmenu-filter-alist-by-regexp bookmark-search-pattern))))
+             (bookmark-read-search-input))
+        (progn ; [1] Stop timer.
+          (bookmark-bmenu-cancel-search)
+          (when bookmark-quit-flag ; C-g hit restore menu list.
+            (bookmark-bmenu-list) (bookmark-bmenu-goto-bookmark bmk))
+          (setq bookmark-quit-flag nil))))))
+      
+(defun bookmark-bmenu-goto-bookmark (name)
+  "Move point to bookmark with name NAME."
+  (goto-char (point-min))
+  (bookmark-bmenu-check-position)
+  (while (not (equal name (bookmark-bmenu-bookmark)))
+    (forward-line 1))
+  (forward-line 0))
+          
+
+(defun bookmark-bmenu-cancel-search ()
+  "Cancel timer used for searching in bookmarks."
+  (cancel-timer bookmark-search-timer)
+  (setq bookmark-search-timer nil))
+
 \f
 ;;; Menu bar stuff.  Prefix is "bookmark-menu".