]> code.delx.au - gnu-emacs-elpa/commitdiff
Add ignore pattern toggling
authorStephen Whipple <shw@wicdmedia.org>
Mon, 8 Feb 2016 10:41:15 +0000 (03:41 -0700)
committerOleh Krehel <ohwoeowho@gmail.com>
Mon, 8 Feb 2016 12:14:42 +0000 (13:14 +0100)
* ivy.el (ivy-minibuffer-map): Bind "C-c C-a" to `ivy-toggle-ignore'.

(ivy-use-ignore): New defvar.

(ivy-toggle-ignore): New command to toggle ignore
patterns (user-configured filtering). If the ignore patterns are enabled
and there are zero candidates after ignoring, display the ones that
match the current text. This feature currently works for
`ivy-switch-buffer' and `counsel-find-file'.

(ivy--buffer-list): Simplify.
(ivy--switch-buffer-matcher): New defun.
(ivy-switch-buffer): Use `ivy--switch-buffer-matcher'.

* counsel.el (counsel--find-file-matcher): Use `ivy-use-ignore'.

Fixes #369

counsel.el
ivy.el

index 2a6a26416a9e34708cbd75675280ab7bc6019db5..25ebf98ac90b31014d2e17646c7d4a4f2927e63b 100644 (file)
@@ -542,13 +542,15 @@ Possible value: \"\\(?:\\`[#.]\\)\\|\\(?:[#~]\\'\\)\"."
   "Return REGEXP-matching CANDIDATES.
 Skip some dotfiles unless `ivy-text' requires them."
   (let ((res (ivy--re-filter regexp candidates)))
-    (if (or (null counsel-find-file-ignore-regexp)
+    (if (or (null ivy-use-ignore)
+            (null counsel-find-file-ignore-regexp)
             (string-match counsel-find-file-ignore-regexp ivy-text))
         res
-      (cl-remove-if
-       (lambda (x)
-         (string-match counsel-find-file-ignore-regexp x))
-       res))))
+      (or (cl-remove-if
+           (lambda (x)
+             (string-match counsel-find-file-ignore-regexp x))
+           res)
+          res))))
 
 (defun counsel-git-grep-matcher (regexp candidates)
   (or (and (equal regexp ivy--old-re)
diff --git a/ivy.el b/ivy.el
index 4a17bbfbd3553f849b4803b24d3434209e52e480..b95ce33d0dcecf724ee7f7427f8f5b2e77caf1b8 100644 (file)
--- a/ivy.el
+++ b/ivy.el
@@ -236,6 +236,7 @@ Example:
     (define-key map (kbd "C-'") 'ivy-avy)
     (define-key map (kbd "C-M-a") 'ivy-read-action)
     (define-key map (kbd "C-c C-o") 'ivy-occur)
+    (define-key map (kbd "C-c C-a") 'ivy-toggle-ignore)
     (define-key map (kbd "C-h m") 'ivy-help)
     map)
   "Keymap used in the minibuffer.")
@@ -318,6 +319,9 @@ sources. These values will subsequently be filtered on `ivy-text'.
 
 This variable is set by `ivy-read' and used by `ivy--set-candidates'.")
 
+(defvar ivy-use-ignore t
+  "Store policy for user-configured candidate filtering.")
+
 (defvar ivy--default nil
   "Default initial input.")
 
@@ -734,6 +738,13 @@ If the input is empty, select the previous history element instead."
   (when (setq ivy-calling (not ivy-calling))
     (ivy-call)))
 
+(defun ivy-toggle-ignore ()
+  "Toggle user-configured candidate filtering."
+  (interactive)
+  (setq ivy-use-ignore (null ivy-use-ignore))
+  ;; invalidate cache
+  (setq ivy--old-cands nil))
+
 (defun ivy--get-action (state)
   "Get the action function from STATE."
   (let ((action (ivy-state-action state)))
@@ -1285,6 +1296,7 @@ This is useful for recursive `ivy-read'."
     (setq ivy--full-length nil)
     (setq ivy-text "")
     (setq ivy-calling nil)
+    (setq ivy-use-ignore t)
     (let (coll sort-fn)
       (cond ((eq collection 'Info-read-node-name-1)
              (if (equal Info-current-file "dir")
@@ -2383,24 +2395,18 @@ CANDS is a list of strings."
 (defun ivy--buffer-list (str &optional virtual)
   "Return the buffers that match STR.
 When VIRTUAL is non-nil, add virtual buffers."
-  (cl-remove-if
-   (lambda (buf)
-     (cl-find-if
-      (lambda (regexp)
-        (string-match regexp buf))
-      ivy-ignore-buffers))
-   (delete-dups
-    (append
-     (mapcar
-      (lambda (x)
-        (if (with-current-buffer x
-              (file-remote-p
-               (abbreviate-file-name default-directory)))
-            (propertize x 'face 'ivy-remote)
-          x))
-      (all-completions str 'internal-complete-buffer))
-     (and virtual
-          (ivy--virtual-buffers))))))
+  (delete-dups
+   (append
+    (mapcar
+     (lambda (x)
+       (if (with-current-buffer x
+             (file-remote-p
+              (abbreviate-file-name default-directory)))
+           (propertize x 'face 'ivy-remote)
+         x))
+     (all-completions str 'internal-complete-buffer))
+    (and virtual
+         (ivy--virtual-buffers)))))
 
 (defun ivy--switch-buffer-action (buffer)
   "Switch to BUFFER.
@@ -2449,6 +2455,22 @@ BUFFER may be a string or nil."
     ivy--rename-buffer-action
     "rename")))
 
+(defun ivy--switch-buffer-matcher (regexp candidates)
+  "Return REGEXP-matching CANDIDATES.
+Skip buffers that match `ivy-ignore-buffers'."
+  (let ((res (ivy--re-filter regexp candidates)))
+    (if (or (null ivy-use-ignore)
+            (null ivy-ignore-buffers))
+        res
+      (or (cl-remove-if
+           (lambda (buf)
+             (cl-find-if
+              (lambda (regexp)
+                (string-match regexp buf))
+              ivy-ignore-buffers))
+           res)
+          res))))
+
 ;;;###autoload
 (defun ivy-switch-buffer ()
   "Switch to another buffer."
@@ -2457,6 +2479,7 @@ BUFFER may be a string or nil."
       (call-interactively 'switch-to-buffer)
     (let ((this-command 'ivy-switch-buffer))
       (ivy-read "Switch to buffer: " 'internal-complete-buffer
+                :matcher #'ivy--switch-buffer-matcher
                 :preselect (buffer-name (other-buffer (current-buffer)))
                 :action #'ivy--switch-buffer-action
                 :keymap ivy-switch-buffer-map))))