emacs-prelude/vendor/anything-config/anything-config.el

12621 lines
511 KiB
EmacsLisp
Raw Normal View History

2012-03-13 17:20:19 +02:00
;;; anything-config.el --- Applications libary for `anything.el'
;; Filename: anything-config.el
;; Description: Applications libary for `anything.el'
;; Author: Tassilo Horn <tassilo@member.fsf.org>
;; Maintainer: Tassilo Horn <tassilo@member.fsf.org>
;; rubikitch <rubikitch@ruby-lang.org>
;; Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; Copyright (C) 2007 ~ 2011, Tassilo Horn, all rights reserved.
;; Copyright (C) 2009, Andy Stewart, all rights reserved.
;; Copyright (C) 2009 ~ 2012, rubikitch, all rights reserved.
;; Copyright (C) 2009 ~ 2012, Thierry Volpiatto, all rights reserved.
;; Created: 2009-02-16 21:38:23
;; X-URL: <http://repo.or.cz/w/anything-config.git>
;; MailingList: <https://groups.google.com/group/emacs-anything?hl=en>
;; Keywords: anything, anything-config
;; Compatibility: GNU Emacs 22 ~ 24
;; Dependencies: `anything.el', `anything-match-plugin.el'.
;;; This file is NOT part of GNU Emacs
;;; License
;;
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.
;;; Commentary:
;;
;; Predefined configurations for `anything.el'
;;
;; For quick start, try `anything-for-files' to open files.
;;
;; To configure anything you should define anything command
;; with your favorite sources, like below:
;;
;; (defun my-anything ()
;; (interactive)
;; (anything-other-buffer
;; '(anything-c-source-buffers
;; anything-c-source-file-name-history
;; anything-c-source-info-pages
;; anything-c-source-info-elisp
;; anything-c-source-man-pages
;; anything-c-source-locate
;; anything-c-source-emacs-commands)
;; " *my-anything*"))
;;
;; Then type M-x my-anything to use sources.
;;
;; Defining own command is better than setup `anything-sources'
;; directly, because you can define multiple anything commands with
;; different sources. Each anything command should have own anything
;; buffer, because M-x anything-resume revives anything command.
;; NOTE: What you find on Emacswiki is mostly deprecated and not maintained,
;; don't complain if you use such code or configuration and something
;; doesn't work.
;;; Autodoc documentation:
;; ---------------------
;; * Commands defined here are:
;; [EVAL] (autodoc-document-lisp-buffer :type 'command :prefix "anything-" :docstring t)
;; `anything-configuration'
;; Customize `anything'.
;; `anything-c-buffer-help'
;; Help command for anything buffers.
;; `anything-ff-help'
;; Help command for `anything-find-files'.
;; `anything-read-file-name-help'
;; Not documented.
;; `anything-generic-file-help'
;; Not documented.
;; `anything-grep-help'
;; Not documented.
;; `anything-pdfgrep-help'
;; Not documented.
;; `anything-etags-help'
;; The help function for etags.
;; `anything-c-ucs-help'
;; Help command for `anything-ucs'.
;; `anything-c-bookmark-help'
;; Help command for bookmarks.
;; `anything-show-this-source-only'
;; Show all candidates of this source.
;; `anything-test-sources'
;; List all anything sources for test.
;; `anything-select-source'
;; [OBSOLETE] Select source.
;; `anything-insert-buffer-name'
;; Insert buffer name.
;; `anything-quit-and-find-file'
;; Drop into `anything-find-files' from `anything'.
;; `anything-mark-all'
;; Mark all visible unmarked candidates in current source.
;; `anything-unmark-all'
;; Unmark all candidates in all sources of current anything session.
;; `anything-toggle-all-marks'
;; Toggle all marks.
;; `anything-buffer-diff-persistent'
;; Toggle diff buffer without quitting anything.
;; `anything-buffer-revert-persistent'
;; Revert buffer without quitting anything.
;; `anything-buffer-save-persistent'
;; Save buffer without quitting anything.
;; `anything-buffer-run-kill-buffers'
;; Run kill buffer action from `anything-c-source-buffers-list'.
;; `anything-buffer-run-grep'
;; Run Grep action from `anything-c-source-buffers-list'.
;; `anything-buffer-run-zgrep'
;; Run Grep action from `anything-c-source-buffers-list'.
;; `anything-buffer-run-query-replace-regexp'
;; Run Query replace regexp action from `anything-c-source-buffers-list'.
;; `anything-buffer-run-query-replace'
;; Run Query replace action from `anything-c-source-buffers-list'.
;; `anything-buffer-switch-other-window'
;; Run switch to other window action from `anything-c-source-buffers-list'.
;; `anything-buffer-switch-other-frame'
;; Run switch to other frame action from `anything-c-source-buffers-list'.
;; `anything-buffer-switch-to-elscreen'
;; Run switch to elscreen action from `anything-c-source-buffers-list'.
;; `anything-buffer-run-ediff'
;; Run ediff action from `anything-c-source-buffers-list'.
;; `anything-buffer-run-ediff-merge'
;; Run ediff action from `anything-c-source-buffers-list'.
;; `anything-ff-run-toggle-auto-update'
;; Not documented.
;; `anything-ff-run-switch-to-history'
;; Run Switch to history action from `anything-c-source-find-files'.
;; `anything-ff-run-grep'
;; Run Grep action from `anything-c-source-find-files'.
;; `anything-ff-run-pdfgrep'
;; Run Pdfgrep action from `anything-c-source-find-files'.
;; `anything-ff-run-zgrep'
;; Run Grep action from `anything-c-source-find-files'.
;; `anything-ff-run-copy-file'
;; Run Copy file action from `anything-c-source-find-files'.
;; `anything-ff-run-rename-file'
;; Run Rename file action from `anything-c-source-find-files'.
;; `anything-ff-run-byte-compile-file'
;; Run Byte compile file action from `anything-c-source-find-files'.
;; `anything-ff-run-load-file'
;; Run Load file action from `anything-c-source-find-files'.
;; `anything-ff-run-eshell-command-on-file'
;; Run eshell command on file action from `anything-c-source-find-files'.
;; `anything-ff-run-ediff-file'
;; Run Ediff file action from `anything-c-source-find-files'.
;; `anything-ff-run-ediff-merge-file'
;; Run Ediff merge file action from `anything-c-source-find-files'.
;; `anything-ff-run-symlink-file'
;; Run Symlink file action from `anything-c-source-find-files'.
;; `anything-ff-run-hardlink-file'
;; Run Hardlink file action from `anything-c-source-find-files'.
;; `anything-ff-run-delete-file'
;; Run Delete file action from `anything-c-source-find-files'.
;; `anything-ff-run-complete-fn-at-point'
;; Run complete file name action from `anything-c-source-find-files'.
;; `anything-ff-run-switch-to-eshell'
;; Run switch to eshell action from `anything-c-source-find-files'.
;; `anything-ff-run-switch-other-window'
;; Run switch to other window action from `anything-c-source-find-files'.
;; `anything-ff-run-switch-other-frame'
;; Run switch to other frame action from `anything-c-source-find-files'.
;; `anything-ff-run-open-file-externally'
;; Run open file externally command action from `anything-c-source-find-files'.
;; `anything-ff-run-locate'
;; Run locate action from `anything-c-source-find-files'.
;; `anything-ff-run-gnus-attach-files'
;; Run gnus attach files command action from `anything-c-source-find-files'.
;; `anything-ff-run-etags'
;; Run Etags command action from `anything-c-source-find-files'.
;; `anything-ff-run-print-file'
;; Run Print file action from `anything-c-source-find-files'.
;; `anything-ff-run-toggle-basename'
;; Not documented.
;; `anything-find-files-down-one-level'
;; Go down one level like unix command `cd ..'.
;; `anything-ff-properties-persistent'
;; Show properties without quitting anything.
;; `anything-ff-persistent-delete'
;; Delete current candidate without quitting.
;; `anything-ff-run-kill-buffer-persistent'
;; Execute `anything-ff-kill-buffer-fname' whitout quitting.
;; `anything-ff-rotate-left-persistent'
;; Rotate image left without quitting anything.
;; `anything-ff-rotate-right-persistent'
;; Rotate image right without quitting anything.
;; `anything-c-goto-precedent-file'
;; Go to precedent file in anything grep/etags buffers.
;; `anything-c-goto-next-file'
;; Go to precedent file in anything grep/etags buffers.
;; `anything-c-grep-run-persistent-action'
;; Run grep persistent action from `anything-do-grep-1'.
;; `anything-c-grep-run-default-action'
;; Run grep default action from `anything-do-grep-1'.
;; `anything-c-grep-run-other-window-action'
;; Run grep goto other window action from `anything-do-grep-1'.
;; `anything-c-grep-run-save-buffer'
;; Run grep save results action from `anything-do-grep-1'.
;; `anything-yank-text-at-point'
;; Yank text at point in minibuffer.
;; `anything-c-bookmark-run-jump-other-window'
;; Jump to bookmark from keyboard.
;; `anything-c-bookmark-run-delete'
;; Delete bookmark from keyboard.
;; `anything-c-bmkext-run-edit'
;; Run `bmkext-edit-bookmark' from keyboard.
;; `anything-yaoddmuse-cache-pages'
;; Fetch the list of files on emacswiki and create cache file.
;; `anything-eval-new-line-and-indent'
;; Not documented.
;; `anything-call-source-from-anything'
;; Call anything source within `anything' session.
;; `anything-create-from-anything'
;; Run `anything-create' from `anything' as a fallback.
;; `anything-c-ucs-persistent-insert'
;; Not documented.
;; `anything-c-ucs-persistent-forward'
;; Not documented.
;; `anything-c-ucs-persistent-backward'
;; Not documented.
;; `anything-c-ucs-persistent-delete'
;; Not documented.
;; `anything-lisp-completion-at-point'
;; Anything lisp symbol completion at point.
;; `anything-c-complete-file-name-at-point'
;; Complete file name at point.
;; `anything-lisp-completion-at-point-or-indent'
;; First call indent and second call complete lisp symbol.
;; `anything-lisp-completion-or-file-name-at-point'
;; Complete lisp symbol or filename at point.
;; `anything-w32-shell-execute-open-file'
;; Not documented.
;; `anything-c-set-variable'
;; Set value to VAR interactively.
;; `anything-c-adaptive-save-history'
;; Save history information to file given by `anything-c-adaptive-history-file'.
;; `anything-c-reset-adaptative-history'
;; Delete all `anything-c-adaptive-history' and his file.
;; `anything-mini'
;; Preconfigured `anything' lightweight version (buffer -> recentf).
;; `anything-for-files'
;; Preconfigured `anything' for opening files.
;; `anything-recentf'
;; Preconfigured `anything' for `recentf'.
;; `anything-info-at-point'
;; Preconfigured `anything' for searching info at point.
;; `anything-show-kill-ring'
;; Preconfigured `anything' for `kill-ring'.
;; `anything-minibuffer-history'
;; Preconfigured `anything' for `minibuffer-history'.
;; `anything-gentoo'
;; Preconfigured `anything' for gentoo linux.
;; `anything-imenu'
;; Preconfigured `anything' for `imenu'.
;; `anything-google-suggest'
;; Preconfigured `anything' for google search with google suggest.
;; `anything-yahoo-suggest'
;; Preconfigured `anything' for Yahoo searching with Yahoo suggest.
;; `anything-for-buffers'
;; Preconfigured `anything' for buffers.
;; `anything-buffers-list'
;; Preconfigured `anything' to list buffers.
;; `anything-bbdb'
;; Preconfigured `anything' for BBDB.
;; `anything-locate'
;; Preconfigured `anything' for Locate.
;; `anything-w3m-bookmarks'
;; Preconfigured `anything' for w3m bookmark.
;; `anything-firefox-bookmarks'
;; Preconfigured `anything' for firefox bookmark.
;; `anything-colors'
;; Preconfigured `anything' for color.
;; `anything-bookmarks'
;; Preconfigured `anything' for bookmarks.
;; `anything-c-pp-bookmarks'
;; Preconfigured `anything' for bookmarks (pretty-printed).
;; `anything-c-insert-latex-math'
;; Preconfigured anything for latex math symbols completion.
;; `anything-register'
;; Preconfigured `anything' for Emacs registers.
;; `anything-man-woman'
;; Preconfigured `anything' for Man and Woman pages.
;; `anything-org-keywords'
;; Preconfigured `anything' for org keywords.
;; `anything-emms'
;; Preconfigured `anything' for emms sources.
;; `anything-eev-anchors'
;; Preconfigured `anything' for eev anchors.
;; `anything-bm-list'
;; Preconfigured `anything' for visible bookmarks.
;; `anything-timers'
;; Preconfigured `anything' for timers.
;; `anything-list-emacs-process'
;; Preconfigured `anything' for emacs process.
;; `anything-occur'
;; Preconfigured Anything for Occur source.
;; `anything-browse-code'
;; Preconfigured anything to browse code.
;; `anything-org-headlines'
;; Preconfigured anything to show org headlines.
;; `anything-regexp'
;; Preconfigured anything to build regexps.
;; `anything-c-copy-files-async'
;; Preconfigured anything to copy file list FLIST to DEST asynchronously.
;; `anything-find-files'
;; Preconfigured `anything' for anything implementation of `find-file'.
;; `anything-write-file'
;; Preconfigured `anything' providing completion for `write-file'.
;; `anything-insert-file'
;; Preconfigured `anything' providing completion for `insert-file'.
;; `anything-dired-rename-file'
;; Preconfigured `anything' to rename files from dired.
;; `anything-dired-copy-file'
;; Preconfigured `anything' to copy files from dired.
;; `anything-dired-symlink-file'
;; Preconfigured `anything' to symlink files from dired.
;; `anything-dired-hardlink-file'
;; Preconfigured `anything' to hardlink files from dired.
;; `anything-do-grep'
;; Preconfigured anything for grep.
;; `anything-do-pdfgrep'
;; Preconfigured anything for pdfgrep.
;; `anything-c-etags-select'
;; Preconfigured anything for etags.
;; `anything-filelist'
;; Preconfigured `anything' to open files instantly.
;; `anything-filelist+'
;; Preconfigured `anything' to open files/buffers/bookmarks instantly.
;; `anything-M-x'
;; Preconfigured `anything' for Emacs commands.
;; `anything-manage-advice'
;; Preconfigured `anything' to disable/enable function advices.
;; `anything-bookmark-ext'
;; Preconfigured `anything' for bookmark-extensions sources.
;; `anything-simple-call-tree'
;; Preconfigured `anything' for simple-call-tree. List function relationships.
;; `anything-mark-ring'
;; Preconfigured `anything' for `anything-c-source-mark-ring'.
;; `anything-global-mark-ring'
;; Preconfigured `anything' for `anything-c-source-global-mark-ring'.
;; `anything-all-mark-rings'
;; Preconfigured `anything' for `anything-c-source-global-mark-ring' and `anything-c-source-mark-ring'.
;; `anything-yaoddmuse-emacswiki-edit-or-view'
;; Preconfigured `anything' to edit or view EmacsWiki page.
;; `anything-yaoddmuse-emacswiki-post-library'
;; Preconfigured `anything' to post library to EmacsWiki.
;; `anything-eval-expression'
;; Preconfigured anything for `anything-c-source-evaluation-result'.
;; `anything-eval-expression-with-eldoc'
;; Preconfigured anything for `anything-c-source-evaluation-result' with `eldoc' support.
;; `anything-calcul-expression'
;; Preconfigured anything for `anything-c-source-calculation-result'.
;; `anything-surfraw'
;; Preconfigured `anything' to search PATTERN with search ENGINE.
;; `anything-call-source'
;; Preconfigured `anything' to call anything source.
;; `anything-execute-anything-command'
;; Preconfigured `anything' to execute preconfigured `anything'.
;; `anything-create'
;; Preconfigured `anything' to do many create actions from STRING.
;; `anything-top'
;; Preconfigured `anything' for top command.
;; `anything-select-xfont'
;; Preconfigured `anything' to select Xfont.
;; `anything-world-time'
;; Preconfigured `anything' to show world time.
;; `anything-apt'
;; Preconfigured `anything' : frontend of APT package manager.
;; `anything-esh-pcomplete'
;; Preconfigured anything to provide anything completion in eshell.
;; `anything-eshell-history'
;; Preconfigured anything for eshell history.
;; `anything-c-run-external-command'
;; Preconfigured `anything' to run External PROGRAM asyncronously from Emacs.
;; `anything-ratpoison-commands'
;; Preconfigured `anything' to execute ratpoison commands.
;; `anything-ucs'
;; Preconfigured anything for `ucs-names' math symbols.
;; `anything-c-apropos'
;; Preconfigured anything to describe commands, functions, variables and faces.
;; `anything-xrandr-set'
;; Not documented.
;; * User variables defined here:
;; [EVAL] (autodoc-document-lisp-buffer :type 'user-variable :prefix "anything-" :var-value t)
;; `anything-c-adaptive-history-file'
;; Default Value: "~/.emacs.d/anything-c-adaptive-history"
;; `anything-c-adaptive-history-length'
;; Default Value: 50
;; `anything-c-google-suggest-url'
;; Default Value: "http://google.com/complete/search?output=toolbar&q="
;; `anything-c-google-suggest-search-url'
;; Default Value: "http://www.google.com/search?ie=utf-8&oe=utf-8&q="
;; `anything-google-suggest-use-curl-p'
;; Default Value: nil
;; `anything-c-yahoo-suggest-url'
;; Default Value: "http://search.yahooapis.com/WebSearchService/V1/relatedSuggestion?appid=G [...]
;; `anything-c-yahoo-suggest-search-url'
;; Default Value: "http://search.yahoo.com/search?&ei=UTF-8&fr&h=c&p="
;; `anything-c-boring-buffer-regexp'
;; Default Value: "\\ (\\` \\)\\|\\*anything\\|\\*ac-mode\\| \\*Echo Area\\| \\*Minibuf"
;; `anything-c-boring-file-regexp'
;; Default Value: "/\\ (?:\\(?:\\.\\(?:git\\|hg\\|svn\\)\\|CVS\\|_darcs\\)\\)\\(?:/\\|$\\)\\| [...]
;; `anything-kill-ring-threshold'
;; Default Value: 10
;; `anything-c-kill-ring-max-lines-number'
;; Default Value: nil
;; `anything-su-or-sudo'
;; Default Value: "su"
;; `anything-for-files-prefered-list'
;; Default Value: (anything-c-source-ffap-line anything-c-source-ffap-guesser anything-c-sou [...]
;; `anything-create--actions-private'
;; Default Value: nil
;; `anything-allow-skipping-current-buffer'
;; Default Value: nil
;; `anything-c-enable-eval-defun-hack'
;; Default Value: t
;; `anything-tramp-verbose'
;; Default Value: 0
;; `anything-raise-command'
;; Default Value: nil
;; `anything-command-map-prefix-key'
;; Default Value: "<f5> a"
;; `anything-c-browse-code-regexp-lisp'
;; Default Value: "^ * (def\\(un\\|subst\\|macro\\|face\\|alias\\|advice\\|struct\\|type\\|th [...]
;; `anything-c-browse-code-regexp-python'
;; Default Value: "\\<def\\>\\|\\<class\\>"
;; `anything-c-browse-code-regexp-alist'
;; Default Value: ((lisp-interaction-mode . "^ *(def\\(un\\|subst\\|macro\\|face\\|alias\\|a [...]
;; `anything-c-external-programs-associations'
;; Default Value: nil
;; `anything-ff-auto-update-initial-value'
;; Default Value: t
;; `anything-c-copy-async-prefered-emacs'
;; Default Value: "emacs"
;; `anything-ff-lynx-style-map'
;; Default Value: t
;; `anything-ff-history-max-length'
;; Default Value: 100
;; `anything-ff-smart-completion'
;; Default Value: t
;; `anything-ff-default-kbsize'
;; Default Value: 1024.0
;; `anything-ff-tramp-not-fancy'
;; Default Value: t
;; `anything-ff-exif-data-program'
;; Default Value: "exiftran"
;; `anything-ff-exif-data-program-args'
;; Default Value: "-d"
;; `anything-c-grep-use-ioccur-style-keys'
;; Default Value: t
;; `anything-c-pdfgrep-default-read-command'
;; Default Value: "xpdf '%f' %p"
;; `anything-c-etags-tag-file-name'
;; Default Value: "TAGS"
;; `anything-c-etags-tag-file-search-limit'
;; Default Value: 10
;; `anything-c-etags-use-regexp-search'
;; Default Value: nil
;; `anything-c-etags-search-regexp'
;; Default Value: "^.+: .+ \\<%s"
;; `anything-c-filelist-file-name'
;; Default Value: nil
;; `anything-c-eldoc-in-minibuffer-show-fn'
;; Default Value: anything-c-show-info-in-mode-line
;; `anything-c-turn-on-show-completion'
;; Default Value: t
;; `anything-c-show-completion-use-special-display'
;; Default Value: t
;; `anything-c-show-completion-min-window-height'
;; Default Value: 7
;; `anything-lisp-completion-or-indent-delay'
;; Default Value: 0.6
;; `anything-c-default-external-file-browser'
;; Default Value: "nautilus"
;; `anything-c-use-adaptative-sorting'
;; Default Value: nil
;; `anything-ff-newfile-prompt-p'
;; Default Value: t
;; `anything-ff-avfs-directory'
;; Default Value: nil
;; `anything-ff-file-compressed-list'
;; Default Value: ("gz" "bz2" "zip" "7z")
;; `anything-locate-db-file-regexp'
;; Default Value: "m?locate.db$"
;; `anything-c-locate-command'
;; Default Value: nil
;; `anything-c-show-info-in-mode-line-delay'
;; Default Value: 12
;; `anything-c-copy-files-async-log-file'
;; Default Value: "/tmp/dired.log"
;; `anything-ff-printer-list'
;; Default Value: nil
;; `anything-ff-transformer-show-only-basename'
;; Default Value: nil
;; `anything-ff-quick-delete-dont-prompt-for-deletion'
;; Default Value: nil
;; `anything-ff-signal-error-on-dot-files'
;; Default Value: t
;; `anything-completing-read-handlers-alist'
;; Default Value: ((describe-function . anything-completing-read-symbols) (describe-variabl [...]
;; * Anything sources defined here:
;; [EVAL] (autodoc-document-lisp-buffer :type 'anything-source :prefix "anything-" :any-sname t)
;; `anything-c-source-regexp' (Regexp Builder)
;; `anything-c-source-buffers' (Buffers)
;; `anything-c-source-buffer-not-found' (Create buffer)
;; `anything-c-source-buffers-list' (Buffers)
;; `anything-c-source-file-name-history' (File Name History)
;; `anything-c-source-files-in-current-dir' (Files from Current Directory)
;; `anything-c-source-files-in-current-dir+' (Files from Current Directory)
;; `anything-c-source-find-files' (Find Files)
;; `anything-c-source-write-file' (Write File)
;; `anything-c-source-insert-file' (Insert File)
;; `anything-c-source-copy-files' (Copy Files)
;; `anything-c-source-symlink-files' (Symlink Files)
;; `anything-c-source-hardlink-files' (Hardlink Files)
;; `anything-c-source-file-cache' (File Cache)
;; `anything-c-source-locate' (Locate)
;; `anything-c-source-recentf' (Recentf)
;; `anything-c-source-ffap-guesser' (File at point)
;; `anything-c-source-ffap-line' (File/Lineno at point)
;; `anything-c-source-files-in-all-dired' (Files in all dired buffer.)
;; `anything-c-source-filelist' (FileList)
;; `anything-c-source-info-pages' (Info Pages)
;; `anything-c-source-man-pages' (Manual Pages)
;; `anything-c-source-complex-command-history' (Complex Command History)
;; `anything-c-source-extended-command-history' (Emacs Commands History)
;; `anything-c-source-emacs-commands' (Emacs Commands)
;; `anything-c-source-emacs-functions' (Emacs Functions)
;; `anything-c-source-emacs-functions-with-abbrevs' (Emacs Functions)
;; `anything-c-source-advice' (Function Advice)
;; `anything-c-source-emacs-variables' (Emacs Variables)
;; `anything-c-source-lacarte' (Lacarte)
;; `anything-c-source-bookmarks' (Bookmarks)
;; `anything-c-source-bookmark-set' (Set Bookmark)
;; `anything-c-source-bm' (Visible Bookmarks)
;; `anything-c-source-bookmarks-ssh' (Bookmarks-ssh)
;; `anything-c-source-bookmarks-su' (Bookmarks-root)
;; `anything-c-source-bookmarks-local' (Bookmarks-Local)
;; `anything-c-source-bmkext-addressbook' (Bookmark Addressbook)
;; `anything-c-source-bookmark-w3m' (Bookmark W3m)
;; `anything-c-source-bookmark-images' (Bookmark Images)
;; `anything-c-source-bookmark-man' (Bookmark Woman&Man)
;; `anything-c-source-bookmark-gnus' (Bookmark Gnus)
;; `anything-c-source-bookmark-info' (Bookmark Info)
;; `anything-c-source-bookmark-files&dirs' (Bookmark Files&Directories)
;; `anything-c-source-bookmark-su-files&dirs' (Bookmark Root-Files&Directories)
;; `anything-c-source-bookmark-ssh-files&dirs' (Bookmark Ssh-Files&Directories)
;; `anything-c-source-firefox-bookmarks' (Firefox Bookmarks)
;; `anything-c-source-w3m-bookmarks' (W3m Bookmarks)
;; `anything-c-source-elisp-library-scan' (Elisp libraries (Scan))
;; `anything-c-source-imenu' (Imenu)
;; `anything-c-source-ctags' (Exuberant ctags)
;; `anything-c-source-etags-select' (Etags)
;; `anything-c-source-semantic' (Semantic Tags)
;; `anything-c-source-simple-call-tree-functions-callers' (Function is called by)
;; `anything-c-source-simple-call-tree-callers-functions' (Function calls)
;; `anything-c-source-commands-and-options-in-file' (Commands/Options in file)
;; `anything-c-source-customize-face' (Customize Face)
;; `anything-c-source-colors' (Colors)
;; `anything-c-source-tracker-search' (Tracker Search)
;; `anything-c-source-mac-spotlight' (mdfind)
;; `anything-c-source-picklist' (Picklist)
;; `anything-c-source-kill-ring' (Kill Ring)
;; `anything-c-source-mark-ring' (mark-ring)
;; `anything-c-source-global-mark-ring' (global-mark-ring)
;; `anything-c-source-register' (Registers)
;; `anything-c-source-latex-math' (Latex Math Menu)
;; `anything-c-source-fixme' (TODO/FIXME/DRY comments)
;; `anything-c-source-rd-headline' (RD HeadLine)
;; `anything-c-source-oddmuse-headline' (Oddmuse HeadLine)
;; `anything-c-source-emacs-source-defun' (Emacs Source DEFUN)
;; `anything-c-source-emacs-lisp-expectations' (Emacs Lisp Expectations)
;; `anything-c-source-emacs-lisp-toplevels' (Emacs Lisp Toplevel / Level 4 Comment / Linkd Star)
;; `anything-c-source-yaoddmuse-emacswiki-edit-or-view' (Yaoddmuse Edit or View (EmacsWiki))
;; `anything-c-source-yaoddmuse-emacswiki-post-library' (Yaoddmuse Post library (EmacsWiki))
;; `anything-c-source-eev-anchor' (Anchors)
;; `anything-c-source-org-headline' (Org HeadLine)
;; `anything-c-source-org-keywords' (Org Keywords)
;; `anything-c-source-bbdb' (BBDB)
;; `anything-c-source-evaluation-result' (Evaluation Result)
;; `anything-c-source-calculation-result' (Calculation Result)
;; `anything-c-source-google-suggest' (Google Suggest)
;; `anything-c-source-yahoo-suggest' (Yahoo Suggest)
;; `anything-c-source-emms-streams' (Emms Streams)
;; `anything-c-source-emms-dired' (Music Directory)
;; `anything-c-source-emms-files' (Emms files)
;; `anything-c-source-jabber-contacts' (Jabber Contacts)
;; `anything-c-source-call-source' (Call anything source)
;; `anything-c-source-anything-commands' (Preconfigured Anything)
;; `anything-c-source-occur' (Occur)
;; `anything-c-source-browse-code' (Browse code)
;; `anything-c-source-create' (Create)
;; `anything-c-source-minibuffer-history' (Minibuffer History)
;; `anything-c-source-elscreen' (Elscreen)
;; `anything-c-source-top' (Top (Press C-c C-u to refresh))
;; `anything-c-source-absolute-time-timers' (Absolute Time Timers)
;; `anything-c-source-idle-time-timers' (Idle Time Timers)
;; `anything-c-source-xrandr-change-resolution' (Change Resolution)
;; `anything-c-source-xfonts' (X Fonts)
;; `anything-c-source-ucs' (Ucs names)
;; `anything-c-source-emacs-process' (Emacs Process)
;; `anything-c-source-time-world' (Time World List)
;; `anything-c-source-apt' (APT)
;; `anything-c-source-gentoo' (Portage sources)
;; `anything-c-source-use-flags' (Use Flags)
;; `anything-c-source-ratpoison-commands' (Ratpoison Commands)
;; `anything-c-source-esh' (Eshell completions)
;; `anything-c-source-eshell-history' (Eshell history)
;; *** END auto-documentation
;;; For Maintainers:
;;
;; Install developer-tools/autodoc.el and
;; Evaluate (autodoc-update-all) before commit or run it interactively.
;; This function generates anything-c-source-* / functions / options list.
;;
;; [EVAL IT] (autodoc-update-all)
;;
;; Please write details documentation about function, then others will
;; read code more easier. -- Andy Stewart
;;
;;; Change log:
;;
;; Change log of this file is found at
;; http://repo.or.cz/w/anything-config.git/history/master:/anything-config.el
;;
;; Change log of this project is found at
;; http://repo.or.cz/w/anything-config.git?a=shortlog
;;; Contributors:
;;
;; Tamas Patrovics
;; Tassilo Horn <tassilo@member.fsf.org>
;; Vagn Johansen <gonz808@hotmail.com>
;; Mathias Dahl <mathias.dahl@gmail.com>
;; Bill Clementson <billclem@gmail.com>
;; Stefan Kamphausen (see http://www.skamphausen.de for more informations)
;; Drew Adams <drew.adams@oracle.com>
;; Jason McBrayer <jmcbray@carcosa.net>
;; Andy Stewart <lazycat.manatee@gmail.com>
;; Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; rubikitch <rubikitch@ruby-lang.org>
;; Scott Vokes <vokes.s@gmail.com>
;; Kenichirou Oyama <k1lowxb@gmail.com>
;;; TODO
;;
;; - Fix documentation, now many functions haven't documentations.
;;
;;; Code:
;;; Require
;;
;;
(require 'anything)
(require 'thingatpt)
(require 'ffap)
(require 'cl)
(eval-when-compile (require 'dired))
(require 'dired-aux)
(require 'dired-x)
(require 'tramp)
(require 'grep)
(require 'url)
(require 'xml)
(eval-when-compile (require 'org)) ; Shut up byte compiler about org-directory.
(eval-when-compile (require 'semantic nil t))
(require 'anything-match-plugin)
;;; Declare external functions
;;
;;
(declare-function gnus-dired-attach "ext:gnus-dired.el" (files-to-attach))
(declare-function image-dired-display-image "image-dired.el" (file &optional original-size))
(declare-function image-dired-update-property "image-dired.el" (prop value))
(declare-function woman-file-name-all-completions "woman.el" (topic))
(declare-function Man-getpage-in-background "man.el" (topic))
(declare-function simple-call-tree-analyze "ext:simple-call-tree.el" (&optional test))
(declare-function yaoddmuse-update-pagename "ext:yaoddmuse.el" (&optional unforced))
(declare-function yaoddmuse-get-library-list "ext:yaoddmuse.el" (&optional dirs string))
(declare-function org-get-current-options "ext:org-exp.el")
(declare-function emms-streams "ext:emms-streams")
(declare-function emms-stream-delete-bookmark "ext:emms-streams")
(declare-function emms-stream-add-bookmark "ext:emms-streams" (name url fd type))
(declare-function emms-stream-save-bookmarks-file "ext:emms-streams")
(declare-function emms-stream-quit "ext:emms-streams")
(declare-function with-current-emms-playlist "ext:emms" (&rest body))
(declare-function emms-playlist-tracks-in-region "ext:emms" (beg end))
(declare-function emms-playlist-first "ext:emms")
(declare-function emms-playlist-mode-play-smart "ext:emms-playlist-mode")
(declare-function term-line-mode "term")
(declare-function term-char-mode "term")
(declare-function term-send-input "term")
(declare-function term-send-eof "term")
(declare-function Info-index-nodes "info" (&optional file))
(declare-function Info-goto-node "info" (&optional fork))
(declare-function Info-find-node "info.el" (filename nodename &optional no-going-back))
(declare-function elscreen-find-screen-by-buffer "ext:elscreen.el" (buffer &optional create))
(declare-function elscreen-find-file "ext:elscreen.el" (filename))
(declare-function elscreen-goto "ext:elscreen.el" (screen))
(declare-function semantic-format-tag-summarize "ext:format.el" (tag &optional parent color) t)
(declare-function semantic-tag-components "ext:tag.el" (tag) t)
(declare-function semantic-go-to-tag "ext:tag-file.el" (tag) t)
(declare-function semantic-tag-type "ext:tag-file.el" (tag) t)
(declare-function semantic-tag-class "ext:tag-file.el" (tag) t)
(declare-function bbdb "ext:bbdb-com")
(declare-function bbdb-current-record "ext:bbdb-com")
(declare-function bbdb-redisplay-one-record "ext:bbdb-com")
(declare-function bbdb-record-net "ext:bbdb-com" (string) t)
(declare-function bbdb-current-record "ext:bbdb-com")
(declare-function bbdb-dwim-net-address "ext:bbdb-com")
(declare-function bbdb-records "ext:bbdb-com"
(&optional dont-check-disk already-in-db-buffer))
(declare-function eshell-read-aliases-list "em-alias")
(declare-function eshell-send-input "esh-mode" (&optional use-region queue-p no-newline))
(declare-function eshell-bol "esh-mode")
(declare-function eldoc-current-symbol "eldoc")
(declare-function eldoc-get-fnsym-args-string "eldoc" (sym &optional index))
(declare-function eldoc-get-var-docstring "eldoc" (sym))
(declare-function eldoc-fnsym-in-current-sexp "eldoc")
(declare-function find-library-name "find-func.el" (library))
(declare-function adoc-construct "ext:auto-document.el" (buf))
(declare-function adoc-first-line "ext:auto-document.el" (str))
(declare-function adoc-prin1-to-string "ext:auto-document.el" (object))
(declare-function secure-hash "ext:fns.c" (algorithm object &optional start end binary))
(declare-function w32-shell-execute "ext:w32fns.c" (operation document &optional parameters show-flag))
(declare-function undo-tree-restore-state-from-register "ext:undo-tree.el" (register))
;;; compatibility
;;
;;
(unless (fboundp 'window-system)
(defun window-system (&optional arg)
window-system))
(unless (fboundp 'make-composed-keymap)
(defun make-composed-keymap (maps &optional parent)
"Construct a new keymap composed of MAPS and inheriting from PARENT.
When looking up a key in the returned map, the key is looked in each
keymap of MAPS in turn until a binding is found.
If no binding is found in MAPS, the lookup continues in PARENT, if non-nil.
As always with keymap inheritance, a nil binding in MAPS overrides
any corresponding binding in PARENT, but it does not override corresponding
bindings in other keymaps of MAPS.
MAPS can be a list of keymaps or a single keymap.
PARENT if non-nil should be a keymap."
`(keymap
,@(if (keymapp maps) (list maps) maps)
,@parent)))
(unless (fboundp 'apply-partially)
(defun apply-partially (fun &rest args)
"Return a function that is a partial application of FUN to ARGS.
ARGS is a list of the first N arguments to pass to FUN.
The result is a new function which does the same as FUN, except that
the first N arguments are fixed at the values with which this function
was called."
(lexical-let ((fun fun) (args1 args))
(lambda (&rest args2) (apply fun (append args1 args2))))))
;;; Customize
;;
;;
(defgroup anything-config nil
"Predefined configurations for `anything.el'."
:group 'anything)
(defcustom anything-c-adaptive-history-file
"~/.emacs.d/anything-c-adaptive-history"
"Path of file where history information is stored."
:type 'string
:group 'anything-config)
(defcustom anything-c-adaptive-history-length 50
"Maximum number of candidates stored for a source."
:type 'number
:group 'anything-config)
(defcustom anything-c-google-suggest-url
"http://google.com/complete/search?output=toolbar&q="
"URL used for looking up Google suggestions."
:type 'string
:group 'anything-config)
(defcustom anything-c-google-suggest-search-url
"http://www.google.com/search?ie=utf-8&oe=utf-8&q="
"URL used for Google searching."
:type 'string
:group 'anything-config)
(defcustom anything-google-suggest-use-curl-p nil
"When non--nil use CURL to get info from `anything-c-google-suggest-url'.
Otherwise `url-retrieve-synchronously' is used."
:type 'boolean
:group 'anything-config)
(defcustom anything-c-yahoo-suggest-url
"http://search.yahooapis.com/WebSearchService/V1/relatedSuggestion?appid=Generic&query="
"Url used for looking up Yahoo suggestions."
:type 'string
:group 'anything-config)
(defcustom anything-c-yahoo-suggest-search-url
"http://search.yahoo.com/search?&ei=UTF-8&fr&h=c&p="
"Url used for Yahoo searching."
:type 'string
:group 'anything-config)
(defcustom anything-c-boring-buffer-regexp
(rx (or
(group bos " ")
;; anything-buffers
"*anything" "*ac-mode"
;; echo area
" *Echo Area" " *Minibuf"))
"The regexp that match boring buffers.
Buffer candidates matching this regular expression will be
filtered from the list of candidates if the
`anything-c-skip-boring-buffers' candidate transformer is used, or
they will be displayed with face `file-name-shadow' if
`anything-c-shadow-boring-buffers' is used."
:type 'string
:group 'anything-config)
;; (string-match anything-c-boring-buffer-regexp "buf")
;; (string-match anything-c-boring-buffer-regexp " hidden")
;; (string-match anything-c-boring-buffer-regexp " *Minibuf-1*")
(defcustom anything-c-boring-file-regexp
(rx (or
;; Boring directories
(and "/" (or ".svn" "CVS" "_darcs" ".git" ".hg") (or "/" eol))
;; Boring files
(and line-start ".#")
(and (or ".class" ".la" ".o" "~") eol)))
"The regexp that match boring files.
File candidates matching this regular expression will be
filtered from the list of candidates if the
`anything-c-skip-boring-files' candidate transformer is used, or
they will be displayed with face `file-name-shadow' if
`anything-c-shadow-boring-files' is used."
:type 'string
:group 'anything-config)
(defcustom anything-kill-ring-threshold 10
"Minimum length to be listed by `anything-c-source-kill-ring'."
:type 'integer
:group 'anything-config)
(defcustom anything-c-kill-ring-max-lines-number nil
"Max number of lines displayed per candidate in kill-ring browser.
If nil or zero, don't truncate candidate, show all."
:type 'integer
:group 'anything-config)
(defcustom anything-su-or-sudo "su"
"What command to use for root access."
:type 'string
:group 'anything-config)
(defcustom anything-for-files-prefered-list
'(anything-c-source-ffap-line
anything-c-source-ffap-guesser
anything-c-source-buffers-list
anything-c-source-recentf
anything-c-source-bookmarks
anything-c-source-file-cache
anything-c-source-files-in-current-dir+
anything-c-source-locate)
"Your prefered sources to find files."
:type 'list
:group 'anything-config)
(defcustom anything-create--actions-private nil
"User defined actions for `anything-create' / `anything-c-source-create'.
It is a list of (DISPLAY . FUNCTION) pairs like `action'
attribute of `anything-sources'.
It is prepended to predefined pairs."
:type 'list
:group 'anything-config)
(defcustom anything-allow-skipping-current-buffer nil
"Show current buffer or not in anything buffer"
:type 'boolean
:group 'anything-config)
(defcustom anything-c-enable-eval-defun-hack t
"If non-nil, execute `anything' using the source at point when C-M-x is pressed.
This hack is invoked when pressing C-M-x in the form \
(defvar anything-c-source-XXX ...) or (setq anything-c-source-XXX ...)."
:type 'boolean
:group 'anything-config)
(defcustom anything-tramp-verbose 0
"Just like `tramp-verbose' but specific to anything.
When set to 0 don't show tramp messages in anything.
If you want to have the default tramp messages set it to 3."
:type 'integer
:group 'anything-config)
(defcustom anything-raise-command nil
"A shell command to jump to a window running specific program.
Need external program wmctrl.
This will be use with `format', so use something like \"wmctrl -xa %s\"."
:type 'string
:group 'anything-config)
(defun anything-set-anything-command-map-prefix-key (var key)
"The customize set function for `anything-command-map-prefix-key'."
(when (boundp var)
(define-key global-map (read-kbd-macro (symbol-value var)) nil))
(set var key)
(define-key global-map
(read-kbd-macro (symbol-value var)) 'anything-command-map))
(defcustom anything-command-map-prefix-key "C-x c"
"The prefix key for all `anything-command-map' commands."
:type 'string
:set 'anything-set-anything-command-map-prefix-key
:group 'anything-config)
(defcustom anything-c-browse-code-regexp-lisp
"^ *\(def\\(un\\|subst\\|macro\\|face\\|alias\\|advice\\|struct\\|\
type\\|theme\\|var\\|group\\|custom\\|const\\|method\\|class\\)"
"Regexp used to parse lisp buffer when browsing code."
:type 'string
:group 'anything-config)
(defcustom anything-c-browse-code-regexp-python
"\\<def\\>\\|\\<class\\>"
"Regexp used to parse python buffer when browsing code."
:type 'string
:group 'anything-config)
(defcustom anything-c-browse-code-regexp-alist
`((lisp-interaction-mode . ,anything-c-browse-code-regexp-lisp)
(emacs-lisp-mode . ,anything-c-browse-code-regexp-lisp)
(lisp-mode . ,anything-c-browse-code-regexp-lisp)
(python-mode . ,anything-c-browse-code-regexp-python))
"Alist to store regexps for browsing code corresponding \
to a specific `major-mode'."
:type 'list
:group 'anything-config)
(defcustom anything-c-external-programs-associations nil
"Alist to store externals programs associated with file extension.
This variable overhide setting in .mailcap file.
e.g : '\(\(\"jpg\" . \"gqview\"\) (\"pdf\" . \"xpdf\"\)\) "
:type 'list
:group 'anything-config)
(defcustom anything-ff-auto-update-initial-value t
"Auto update when only one candidate directory is matched.
This is the default value when starting `anything-find-files'."
:group 'anything-config
:type 'boolean)
(defcustom anything-c-copy-async-prefered-emacs "emacs"
"Path to the emacs you want to use for copying async.
Emacs versions < 24 fail to copy directory due to a bug not fixed
in `copy-directory'."
:group 'anything-config
:type 'string)
(defcustom anything-ff-lynx-style-map t
"Use arrow keys to navigate with `anything-find-files'.
You will have to restart Emacs or reeval `anything-find-files-map'
and `anything-c-read-file-map' for this take effect."
:group 'anything-config
:type 'boolean)
(defcustom anything-ff-history-max-length 100
"Number of elements shown in `anything-find-files' history."
:group 'anything-config
:type 'integer)
(defcustom anything-ff-smart-completion t
"Try to complete filenames smarter when non--nil.
See `anything-ff-transform-fname-for-completion' for more info."
:group 'anything-config
:type 'boolean)
(defcustom anything-ff-default-kbsize 1024.0
"Default Kbsize to use for showing files size.
It is a float, usually 1024.0 but could be 1000.0 on some systems."
:group 'anything-config
:type 'float)
(defcustom anything-ff-tramp-not-fancy t
"No colors when listing remote files when set to non--nil.
This make listing much faster, specially on slow machines."
:group 'anything-config
:type 'boolean)
(defcustom anything-ff-exif-data-program "exiftran"
"Program used to extract exif data of an image file."
:group 'anything-config
:type 'string)
(defcustom anything-ff-exif-data-program-args "-d"
"*Arguments used for `anything-ff-exif-data-program'."
:group 'anything-config
:type 'string)
(defcustom anything-c-grep-use-ioccur-style-keys t
"Use Arrow keys to jump to occurences."
:group 'anything-config
:type 'boolean)
(defcustom anything-c-pdfgrep-default-read-command "xpdf '%f' %p"
"Default command to read pdf files from pdfgrep.
Where '%f' format spec is filename and '%p' is page number"
:group 'anything-config
:type 'string)
(defcustom anything-c-etags-tag-file-name "TAGS"
"Etags tag file name."
:type 'string
:group 'anything-config)
(defcustom anything-c-etags-tag-file-search-limit 10
"The limit level of directory to search tag file.
Don't search tag file deeply if outside this value."
:type 'number
:group 'anything-config)
(defcustom anything-c-etags-use-regexp-search nil
"When non--nil search etags candidates by regexp.
This disable anything-match-plugin when enabled.
When nil search is performed directly on patter and *match-plugin is used
if available. You can customize `anything-c-etags-search-regexp'."
:group 'anything-config
:type 'boolean)
(defcustom anything-c-etags-search-regexp "^.+: .+ \\<%s"
"Regexp that match tags in an anything etags buffer.
The format spec is replaced by pattern.
This regexp have no effect when `anything-c-etags-use-regexp-search'
is nil."
:group 'anything-config
:type 'regexp)
(defcustom anything-c-filelist-file-name nil
"Filename of file list.
Accept a list of string for multiple files.
This file tend to be very large \(> 100MB\) and recommend to be in ramdisk for speed.
File list is created by make-filelist.rb script.
Usage:
ruby make-filelist.rb > /tmp/all.filelist
Then
;; Assume that /tmp is ramdisk or tmpfs
\(setq anything-grep-candidates-fast-directory-regexp \"^/tmp/\"\)
\(setq anything-c-filelist-file-name \"/tmp/all.filelist\"\)
"
:type 'string
:group 'anything-config)
(defcustom anything-c-eldoc-in-minibuffer-show-fn
'anything-c-show-info-in-mode-line
"A function to display eldoc info.
Should take one arg: the string to display."
:group 'anything-config
:type 'symbol)
(defcustom anything-c-turn-on-show-completion t
"Display candidate in buffer while moving selection when non--nil."
:group 'anything-config
:type 'boolean)
(defcustom anything-c-show-completion-use-special-display t
"A special display will be used in lisp completion if non--nil.
All functions that are wrapped in macro `with-anything-show-completion'
will be affected."
:group 'anything-config
:type 'boolean)
(defcustom anything-c-show-completion-min-window-height 7
"Minimum completion window height used in show completion.
This is used in macro `with-anything-show-completion'."
:group 'anything-config
:type 'integer)
(defcustom anything-lisp-completion-or-indent-delay 0.6
"After this delay `anything-lisp-completion-counter' is reset to 0.
This allow to indent again without completing lisp symbol after this delay.
Default is 0.6 seconds."
:group 'anything-config
:type 'number)
(defcustom anything-c-default-external-file-browser "nautilus"
"Default external file browser for your system.
Directories will be opened externally with it when
opening file externally in `anything-find-files'.
Set to nil if you do not have external file browser
or do not want to use it.
Windows users should set that to \"explorer.exe\"."
:group 'anything-config
:type 'string)
(defcustom anything-c-use-adaptative-sorting nil
"Wheter to use or not adaptative sorting.
Even if a source use it, it will have no effect when set to nil."
:type 'boolean
:group 'anything-config)
(defcustom anything-ff-newfile-prompt-p t
"Whether Prompt or not when creating new file.
This set `ffap-newfile-prompt'."
:type 'boolean
:group 'anything-config)
(defcustom anything-ff-avfs-directory nil
"The default avfs directory, usually '.avfs'.
When this is set you will be able to expand archive filenames with `C-z'
inside an avfs directory mounted with mountavfs.
See <http://sourceforge.net/projects/avf/>."
:type 'boolean
:group 'anything-config)
(defcustom anything-ff-file-compressed-list '("gz" "bz2" "zip" "7z")
"Minimal list of compressed files extension."
:type 'list
:group 'anything-config)
(defcustom anything-locate-db-file-regexp "m?locate\.db$"
"Default regexp to match locate database.
If nil Search in all files."
:type 'string
:group 'anything-config)
(defcustom anything-ff-locate-db-filename "locate.db"
"The basename of the locatedb file you use locally in your directories.
When this is set and `anything' find such a file in the directory from
where you launch locate, it will use this file and will not prompt you
for a db file.
Note that this happen only when locate is launched with a prefix arg."
:group 'anything-config
:type 'string)
(defcustom anything-c-locate-command nil
"A list of arguments for locate program.
If nil it will be calculated when `anything-locate' startup
with these default values for different systems:
Gnu/linux: \"locate -i -r %s\"
berkeley-unix: \"locate -i %s\"
windows-nt: \"es -i -r %s\"
Others: \"locate %s\"
This string will be passed to format so it should end with `%s'.
The \"-r\" option must be the last option."
:type 'string
:group 'anything-config)
(defcustom anything-c-show-info-in-mode-line-delay 12
"Eldoc will show info in mode-line during this delay if user is idle."
:type 'integer
:group 'anything-config)
(defcustom anything-c-copy-files-async-log-file "/tmp/dired.log"
"The file used to communicate with two emacs when copying files async."
:type 'string
:group 'anything-config)
(defcustom anything-ff-printer-list nil
"A list of available printers on your system.
When non--nil let you choose a printer to print file.
Otherwise when nil the variable `printer-name' will be used.
On Unix based systems (lpstat command needed) you don't need to set this,
`anything-ff-find-printers' will find a list of available printers for you."
:type 'list
:group 'anything-config)
(defcustom anything-ff-transformer-show-only-basename nil
"Show only basename of candidates in `anything-find-files'.
This can be toggled at anytime from `anything-find-files' with \
\\<anything-find-files-map>0\\[anything-ff-run-toggle-basename]."
:type 'boolean
:group 'anything-config)
(defcustom anything-ff-quick-delete-dont-prompt-for-deletion nil
"Don't ask in persistent deletion of files when non--nil."
:group 'anything-config
:type 'boolean)
(defcustom anything-ff-signal-error-on-dot-files t
"Signal error when file is `.' or `..' on file deletion when non--nil.
Default is non--nil.
WARNING: Setting this to nil is unsafe and can cause deletion of a whole tree."
:group 'anything-config
:type 'boolean)
(defcustom anything-completing-read-handlers-alist
'((describe-function . anything-completing-read-symbols)
(describe-variable . anything-completing-read-symbols)
(debug-on-entry . anything-completing-read-symbols)
(find-function . anything-completing-read-symbols)
(trace-function . anything-completing-read-symbols)
(trace-function-background . anything-completing-read-symbols)
(find-tag . anything-completing-read-with-cands-in-buffer)
(ffap-alternate-file . nil))
"Alist of handlers to replace `completing-read', `read-file-name' in `ac-mode'.
Each entry is a cons cell like \(emacs_command . completing-read_handler\)
where key and value are symbols.
Each key is an Emacs command that use originaly `completing-read'.
Each value maybe an anything function that take same arguments as
`completing-read' plus NAME and BUFFER, where NAME is the name of the new
anything source and BUFFER the name of the buffer we will use.
This function prefix name must start by \"anything\".
See `anything-completing-read-symbols' for example.
If the value of an entry is nil completion will fall back to
emacs vanilla behavior.
e.g If you want to disable anything completion for `describe-function':
\(describe-function . nil\).
Ido is also supported, you can use `ido-completing-read' and
`ido-read-file-name' as value of an entry or just 'ido.
e.g ido completion for `find-file':
\(find-file . ido\)
same as
\(find-file . ido-read-file-name\)
Note that you don't need to enable `ido-mode' for this to work."
:group 'anything-config
:type '(alist :key-type symbol :value-type symbol))
(defcustom anything-M-x-requires-pattern 2
"Value of requires-pattern for `anything-M-x'.
Set it to 0 to disable requires-pattern in `anything-M-x'."
:group 'anything-config
:type 'boolean)
;;; Build info-index sources with info-index plug-in.
;;
;;
(defun anything-c-build-info-index-command (name doc source buffer)
"Define an anything command NAME with documentation DOC.
Arg SOURCE will be an existing anything source named
`anything-c-source-info-<NAME>' and BUFFER a string buffer name."
(eval (list 'defun name nil doc
(list 'interactive)
(list 'anything
:sources source
:buffer buffer
:candidate-number-limit 1000))))
(defun anything-c-define-info-index-sources (var-value &optional commands)
"Define anything sources named anything-c-source-info-<NAME>.
Sources are generated for all entries of `anything-c-default-info-index-list'.
If COMMANDS arg is non--nil build also commands named `anything-info<NAME>'.
Where NAME is one of `anything-c-default-info-index-list'."
(loop with symbols = (loop for str in var-value
collect
(intern (concat "anything-c-source-info-" str)))
for sym in symbols
for str in var-value
do (set sym (list (cons 'name (format "Info index: %s" str))
(cons 'info-index str)))
when commands
do (let ((com (intern (concat "anything-info-" str))))
(anything-c-build-info-index-command com
(format "Predefined anything for %s info." str) sym
(format "*anything info %s*" str)))))
(defun anything-info-index-set (var value)
(set var value)
(anything-c-define-info-index-sources value t))
(defcustom anything-c-default-info-index-list
'("elisp" "cl" "org" "gnus" "tramp" "ratpoison"
"zsh" "bash" "coreutils" "fileutils"
"find" "sh-utils" "textutils" "libc"
"make" "automake" "autoconf" "emacs-lisp-intro"
"emacs" "elib" "eieio" "gauche-refe" "guile"
"guile-tut" "goops" "screen" "latex" "gawk"
"sed" "m4" "wget" "binutils" "as" "bfd" "gprof"
"ld" "diff" "flex" "grep" "gzip" "libtool"
"texinfo" "info" "gdb" "stabs" "cvsbook" "cvs"
"bison" "id-utils" "global")
"Info Manual entries to use for building anything info index commands."
:group 'anything-config
:type 'list
:set 'anything-info-index-set)
(defcustom anything-c-register-max-offset 160
"Max size of string register entries before truncating."
:group 'anything-config
:type 'integer)
;;; General internal variables
;;
;; Some internals variable that need to be loaded
;; here to avoid compiler warnings.
(defvar anything-c-external-commands-list nil
"A list of all external commands the user can execute. If this
variable is not set by the user, it will be calculated
automatically.")
(defvar anything-c-show-completion-overlay nil)
;;; Faces
;;
;;
(defface anything-buffer-saved-out
'((t (:foreground "red")))
"*Face used for buffer files modified outside of emacs."
:group 'anything-config)
(defface anything-buffer-not-saved
'((t (:foreground "Indianred2")))
"*Face used for buffer files not already saved on disk."
:group 'anything-config)
(defface anything-ff-prefix
'((t (:background "yellow" :foreground "black")))
"*Face used to prefix new file or url paths in `anything-find-files'."
:group 'anything-config)
(defface anything-ff-executable
'((t (:foreground "green")))
"*Face used for executable files in `anything-find-files'."
:group 'anything-config)
(defface anything-ff-directory
'((t (:foreground "DarkRed" :background "LightGray")))
"*Face used for directories in `anything-find-files'."
:group 'anything-config)
(defface anything-ff-symlink
'((t (:foreground "DarkOrange")))
"*Face used for symlinks in `anything-find-files'."
:group 'anything-config)
(defface anything-ff-invalid-symlink
'((t (:foreground "black" :background "red")))
"*Face used for invalid symlinks in `anything-find-files'."
:group 'anything-config)
(defface anything-ff-file
'((t (:foreground "CadetBlue" :underline t)))
"*Face used for file names in `anything-find-files'."
:group 'anything-config)
(defface anything-grep-match
'((t (:inherit match)))
"Face used to highlight grep matches."
:group 'anything-config)
(defface anything-grep-file
'((t (:foreground "BlueViolet" :underline t)))
"Face used to highlight grep results filenames."
:group 'anything-config)
(defface anything-grep-lineno
'((t (:foreground "Darkorange1")))
"Face used to highlight grep number lines."
:group 'anything-config)
(defface anything-grep-running
'((t (:foreground "Red")))
"Face used in mode line when grep is running."
:group 'anything-config)
(defface anything-grep-finish
'((t (:foreground "Green")))
"Face used in mode line when grep is finish."
:group 'anything-config)
(defface anything-M-x-key-face '((t (:foreground "orange" :underline t)))
"*Face used in anything-M-x to show keybinding."
:group 'anything)
(defface anything-bmkext-info
'((t (:foreground "green")))
"*Face used for W3m Emacs bookmarks (not w3m bookmarks)."
:group 'anything)
(defface anything-bmkext-w3m
'((t (:foreground "yellow")))
"*Face used for W3m Emacs bookmarks (not w3m bookmarks)."
:group 'anything)
(defface anything-bmkext-gnus
'((t (:foreground "magenta")))
"*Face used for Gnus bookmarks."
:group 'anything)
(defface anything-bmkext-man
'((t (:foreground "Orange4")))
"*Face used for Woman/man bookmarks."
:group 'anything)
(defface anything-bmkext-no--file
'((t (:foreground "grey")))
"*Face used for non--file bookmarks."
:group 'anything)
(defface anything-bmkext-file
'((t (:foreground "Deepskyblue2")))
"*Face used for non--file bookmarks."
:group 'anything)
(defface anything-bookmarks-su-face '((t (:foreground "red")))
"Face for su/sudo bookmarks."
:group 'anything)
(defface anything-w3m-bookmarks-face '((t (:foreground "cyan1" :underline t)))
"Face for w3m bookmarks" :group 'anything)
(defface anything-emms-playlist
'((t (:foreground "Springgreen4" :underline t)))
"*Face used for tracks in current emms playlist."
:group 'anything)
(defface anything-apt-installed
'((t (:foreground "green")))
"*Face used for apt installed candidates."
:group 'anything)
(defface anything-apt-deinstalled
'((t (:foreground "DimGray")))
"*Face used for apt deinstalled candidates."
:group 'anything)
(defface anything-gentoo-match-face '((t (:foreground "red")))
"Face for anything-gentoo installed packages."
:group 'traverse-faces)
(defface anything-lisp-show-completion
'((t (:background "DarkSlateGray")))
"*Face used for showing candidates in `anything-lisp-completion'."
:group 'anything-config)
(defface anything-lisp-completion-info
'((t (:foreground "red")))
"*Face used for showing info in `anything-lisp-completion'."
:group 'anything-config)
(defface anything-overlay-line-face '((t (:background "IndianRed4" :underline t)))
"Face for source header in the anything buffer." :group 'anything)
;;;###autoload
(defun anything-configuration ()
"Customize `anything'."
(interactive)
(customize-group "anything-config"))
;;; Anything-command-map
;;
;;
;;;###autoload
(defvar anything-command-map)
(define-prefix-command 'anything-command-map)
(define-key anything-command-map (kbd "<SPC>") 'anything-execute-anything-command)
(define-key anything-command-map (kbd "a") 'anything-c-apropos)
(define-key anything-command-map (kbd "e") 'anything-c-etags-select)
(define-key anything-command-map (kbd "l") 'anything-locate)
(define-key anything-command-map (kbd "s") 'anything-surfraw)
(define-key anything-command-map (kbd "r") 'anything-regexp)
(define-key anything-command-map (kbd "w") 'anything-w3m-bookmarks)
(define-key anything-command-map (kbd "x") 'anything-firefox-bookmarks)
(define-key anything-command-map (kbd "#") 'anything-emms)
(define-key anything-command-map (kbd "m") 'anything-man-woman)
(define-key anything-command-map (kbd "t") 'anything-top)
(define-key anything-command-map (kbd "i") 'anything-imenu)
(define-key anything-command-map (kbd "<tab>") 'anything-lisp-completion-at-point)
(define-key anything-command-map (kbd "p") 'anything-list-emacs-process)
(define-key anything-command-map (kbd "C-x r b") 'anything-c-pp-bookmarks)
(define-key anything-command-map (kbd "M-y") 'anything-show-kill-ring)
(define-key anything-command-map (kbd "C-c <SPC>") 'anything-all-mark-rings)
(define-key anything-command-map (kbd "C-x C-f") 'anything-find-files)
(define-key anything-command-map (kbd "f") 'anything-for-files)
(define-key anything-command-map (kbd "C-:") 'anything-eval-expression-with-eldoc)
(define-key anything-command-map (kbd "C-,") 'anything-calcul-expression)
(define-key anything-command-map (kbd "M-x") 'anything-M-x)
(define-key anything-command-map (kbd "C-x C-w") 'anything-write-file)
(define-key anything-command-map (kbd "C-x i") 'anything-insert-file)
(define-key anything-command-map (kbd "M-s o") 'anything-occur)
(define-key anything-command-map (kbd "M-g s") 'anything-do-grep)
(define-key anything-command-map (kbd "c") 'anything-colors)
(define-key anything-command-map (kbd "F") 'anything-select-xfont)
(define-key anything-command-map (kbd "C-c f") 'anything-recentf)
(define-key anything-command-map (kbd "C-c g") 'anything-google-suggest)
(define-key anything-command-map (kbd "h i") 'anything-info-at-point)
(define-key anything-command-map (kbd "h r") 'anything-info-emacs)
(define-key anything-command-map (kbd "h g") 'anything-info-gnus)
(define-key anything-command-map (kbd "C-x C-b") 'anything-buffers-list)
(define-key anything-command-map (kbd "C-c C-b") 'anything-browse-code)
(define-key anything-command-map (kbd "C-x r i") 'anything-register)
(define-key anything-command-map (kbd "C-c C-x") 'anything-c-run-external-command)
;; In Emacs 23.1.50, minibuffer-local-must-match-filename-map was renamed to
;; minibuffer-local-filename-must-match-map.
(defvar minibuffer-local-filename-must-match-map (make-sparse-keymap)) ;; Emacs 23.1.+
(defvar minibuffer-local-must-match-filename-map (make-sparse-keymap)) ;; Older Emacsen
(dolist (map (list minibuffer-local-filename-completion-map
minibuffer-local-completion-map
minibuffer-local-must-match-filename-map
minibuffer-local-filename-must-match-map
minibuffer-local-map
minibuffer-local-isearch-map
minibuffer-local-must-match-map
minibuffer-local-ns-map))
(define-key map "\C-r" 'anything-minibuffer-history))
;;; Menu
;;
;;
(easy-menu-define nil global-map
"`anything' menu"
'("Anything"
["All anything commands" anything-execute-anything-command t]
["Find any Files/Buffers" anything-for-files t]
["Anything Everywhere (Toggle)" ac-mode t]
"----"
("Files:"
["Find files" anything-find-files t]
["Recent Files" anything-recentf t]
["Locate" anything-locate t]
["Bookmarks" anything-c-pp-bookmarks t])
("Buffers:"
["Find buffers" anything-buffers-list t])
("Commands:"
["Emacs Commands" anything-M-x t]
["Externals Commands" anything-c-run-external-command t])
("Help:"
["Anything Apropos" anything-c-apropos t])
("Info:"
["Info at point" anything-info-at-point t]
["Emacs Manual index" anything-info-emacs t]
["Gnus Manual index" anything-info-gnus t])
("Org:"
["Org keywords" anything-org-keywords t]
["Org headlines" anything-org-headlines t])
("Tools:"
["Occur" anything-occur t]
["Grep" anything-do-grep t]
["Etags" anything-c-etags-select t]
["Lisp complete at point" anything-lisp-completion-at-point t]
["Browse Kill ring" anything-show-kill-ring t]
["Browse register" anything-register t]
["Browse code" anything-browse-code t]
["Mark Ring" anything-all-mark-rings t]
["Regexp handler" anything-regexp t]
["Colors & Faces" anything-colors t]
["Show xfonts" anything-select-xfont t]
["Ucs Symbols" anything-ucs t]
["Imenu" anything-imenu t]
["Google Suggest" anything-google-suggest t]
["Eval expression" anything-eval-expression-with-eldoc t]
["Calcul expression" anything-calcul-expression t]
["Man pages" anything-man-woman t]
["Top externals process" anything-top t]
["Emacs internals process" anything-list-emacs-process t])
"----"
["Prefered Options" anything-configuration t]))
;;; Anything map add ons
;;
;;
(define-key anything-map (kbd "C-x C-f") 'anything-quit-and-find-file)
(define-key anything-map (kbd "M-m") 'anything-toggle-all-marks)
(define-key anything-map (kbd "C-w") 'anything-yank-text-at-point)
;;; Specialized keymaps
;;
;;
(defvar anything-c-buffer-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "C-c ?") 'anything-c-buffer-help)
;; No need to have separate command for grep and zgrep
;; as we don't use recursivity for buffers.
;; So use zgrep for both as it is capable to handle non--compressed files.
(define-key map (kbd "M-g s") 'anything-buffer-run-zgrep)
(define-key map (kbd "C-c o") 'anything-buffer-switch-other-window)
(define-key map (kbd "C-c C-o") 'anything-buffer-switch-other-frame)
(define-key map (kbd "C-c =") 'anything-buffer-run-ediff)
(define-key map (kbd "M-=") 'anything-buffer-run-ediff-merge)
(define-key map (kbd "C-=") 'anything-buffer-diff-persistent)
(define-key map (kbd "M-U") 'anything-buffer-revert-persistent)
(define-key map (kbd "M-D") 'anything-buffer-run-kill-buffers)
(define-key map (kbd "C-x C-s") 'anything-buffer-save-persistent)
(define-key map (kbd "C-M-%") 'anything-buffer-run-query-replace-regexp)
(define-key map (kbd "M-%") 'anything-buffer-run-query-replace)
(define-key map (kbd "M-m") 'anything-toggle-all-marks)
(define-key map (kbd "M-a") 'anything-mark-all)
(when (locate-library "elscreen")
(define-key map (kbd "<C-tab>") 'anything-buffer-switch-to-elscreen))
(delq nil map))
"Keymap for buffer sources in anything.")
(defvar anything-find-files-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "C-]") 'anything-ff-run-toggle-basename)
(define-key map (kbd "C-x C-f") 'anything-ff-run-locate)
(define-key map (kbd "M-g s") 'anything-ff-run-grep)
(define-key map (kbd "M-g p") 'anything-ff-run-pdfgrep)
(define-key map (kbd "M-g z") 'anything-ff-run-zgrep)
(define-key map (kbd "M-.") 'anything-ff-run-etags)
(define-key map (kbd "M-R") 'anything-ff-run-rename-file)
(define-key map (kbd "M-C") 'anything-ff-run-copy-file)
(define-key map (kbd "M-B") 'anything-ff-run-byte-compile-file)
(define-key map (kbd "M-L") 'anything-ff-run-load-file)
(define-key map (kbd "M-S") 'anything-ff-run-symlink-file)
(define-key map (kbd "M-H") 'anything-ff-run-hardlink-file)
(define-key map (kbd "M-D") 'anything-ff-run-delete-file)
(define-key map (kbd "M-K") 'anything-ff-run-kill-buffer-persistent)
(define-key map (kbd "C-d") 'anything-ff-persistent-delete)
(define-key map (kbd "M-e") 'anything-ff-run-switch-to-eshell)
(define-key map (kbd "<M-tab>") 'anything-ff-run-complete-fn-at-point)
(define-key map (kbd "C-c o") 'anything-ff-run-switch-other-window)
(define-key map (kbd "C-c C-o") 'anything-ff-run-switch-other-frame)
(define-key map (kbd "C-c C-x") 'anything-ff-run-open-file-externally)
(define-key map (kbd "M-!") 'anything-ff-run-eshell-command-on-file)
(define-key map (kbd "C-=") 'anything-ff-run-ediff-file)
(define-key map (kbd "C-c =") 'anything-ff-run-ediff-merge-file)
(define-key map (kbd "M-p") 'anything-ff-run-switch-to-history)
(define-key map (kbd "M-i") 'anything-ff-properties-persistent)
(define-key map (kbd "C-c ?") 'anything-ff-help)
(define-key map (kbd "C-}") 'anything-narrow-window)
(define-key map (kbd "C-{") 'anything-enlarge-window)
(define-key map (kbd "C-<backspace>") 'anything-ff-run-toggle-auto-update)
(define-key map (kbd "M-a") 'anything-mark-all)
(define-key map (kbd "M-m") 'anything-toggle-all-marks)
(define-key map (kbd "M-u") 'anything-unmark-all)
(define-key map (kbd "C-c C-a") 'anything-ff-run-gnus-attach-files)
(define-key map (kbd "C-c p") 'anything-ff-run-print-file)
;; Next 2 have no effect if candidate is not an image file.
(define-key map (kbd "M-l") 'anything-ff-rotate-left-persistent)
(define-key map (kbd "M-r") 'anything-ff-rotate-right-persistent)
(define-key map (kbd "C-.") 'anything-find-files-down-one-level)
(define-key map (kbd "C-l") 'anything-find-files-down-one-level)
(define-key map (kbd "C-h C-b") 'anything-send-bug-report-from-anything)
(define-key map (kbd "C-h C-d") 'anything-debug-output)
(when anything-ff-lynx-style-map
(define-key map (kbd "<left>") 'anything-find-files-down-one-level)
(define-key map (kbd "<right>") 'anything-execute-persistent-action))
(delq nil map))
"Keymap for `anything-find-files'.")
(defvar anything-c-read-file-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "C-]") 'anything-ff-run-toggle-basename)
(define-key map (kbd "C-.") 'anything-find-files-down-one-level)
(define-key map (kbd "C-l") 'anything-find-files-down-one-level)
(define-key map (kbd "C-<backspace>") 'anything-ff-run-toggle-auto-update)
(define-key map (kbd "C-c ?") 'anything-read-file-name-help)
(when anything-ff-lynx-style-map
(define-key map (kbd "<left>") 'anything-find-files-down-one-level)
(define-key map (kbd "<right>") 'anything-execute-persistent-action)
(define-key map (kbd "C-o") nil)
(define-key map (kbd "<M-left>") 'anything-previous-source)
(define-key map (kbd "<M-right>") 'anything-next-source))
(delq nil map))
"Keymap for `anything-c-read-file-name'.")
(defvar anything-generic-files-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "M-g s") 'anything-ff-run-grep)
(define-key map (kbd "M-g z") 'anything-ff-run-zgrep)
(define-key map (kbd "M-g p") 'anything-ff-run-pdfgrep)
(define-key map (kbd "M-D") 'anything-ff-run-delete-file)
(define-key map (kbd "C-=") 'anything-ff-run-ediff-file)
(define-key map (kbd "C-c =") 'anything-ff-run-ediff-merge-file)
(define-key map (kbd "C-c o") 'anything-ff-run-switch-other-window)
(define-key map (kbd "M-i") 'anything-ff-properties-persistent)
(define-key map (kbd "C-c C-x") 'anything-ff-run-open-file-externally)
(define-key map (kbd "C-w") 'anything-yank-text-at-point)
(define-key map (kbd "C-c ?") 'anything-generic-file-help)
map)
"Generic Keymap for files.")
(defvar anything-c-grep-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "M-<down>") 'anything-c-goto-next-file)
(define-key map (kbd "M-<up>") 'anything-c-goto-precedent-file)
(define-key map (kbd "C-c o") 'anything-c-grep-run-other-window-action)
(define-key map (kbd "C-w") 'anything-yank-text-at-point)
(define-key map (kbd "C-x C-s") 'anything-c-grep-run-save-buffer)
(when anything-c-grep-use-ioccur-style-keys
(define-key map (kbd "<right>") 'anything-c-grep-run-persistent-action)
(define-key map (kbd "<left>") 'anything-c-grep-run-default-action))
(define-key map (kbd "C-c ?") 'anything-grep-help)
(delq nil map))
"Keymap used in Grep sources.")
(defvar anything-c-pdfgrep-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "M-<down>") 'anything-c-goto-next-file)
(define-key map (kbd "M-<up>") 'anything-c-goto-precedent-file)
(define-key map (kbd "C-w") 'anything-yank-text-at-point)
(define-key map (kbd "C-c ?") 'anything-pdfgrep-help)
map)
"Keymap used in pdfgrep.")
(defvar anything-c-etags-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "M-<down>") 'anything-c-goto-next-file)
(define-key map (kbd "M-<up>") 'anything-c-goto-precedent-file)
(define-key map (kbd "C-w") 'anything-yank-text-at-point)
(define-key map (kbd "C-c ?") 'anything-etags-help)
map)
"Keymap used in Etags.")
(defvar anything-eval-expression-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "<C-return>") 'anything-eval-new-line-and-indent)
(define-key map (kbd "<tab>") 'lisp-indent-line)
(define-key map (kbd "<C-tab>") 'lisp-complete-symbol)
(define-key map (kbd "C-p") 'previous-line)
(define-key map (kbd "C-n") 'next-line)
(define-key map (kbd "<up>") 'previous-line)
(define-key map (kbd "<down>") 'next-line)
(define-key map (kbd "<right>") 'forward-char)
(define-key map (kbd "<left>") 'backward-char)
map))
(defvar anything-c-ucs-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "<C-backspace>") 'anything-c-ucs-persistent-delete)
(define-key map (kbd "<C-left>") 'anything-c-ucs-persistent-backward)
(define-key map (kbd "<C-right>") 'anything-c-ucs-persistent-forward)
(define-key map (kbd "<C-return>") 'anything-c-ucs-persistent-insert)
(define-key map (kbd "C-c ?") 'anything-c-ucs-help)
map)
"Keymap for `anything-ucs'.")
(defvar anything-c-bookmark-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "C-c o") 'anything-c-bookmark-run-jump-other-window)
(define-key map (kbd "C-d") 'anything-c-bookmark-run-delete)
(when (locate-library "bookmark-extensions")
(define-key map (kbd "M-e") 'anything-c-bmkext-run-edit))
(define-key map (kbd "C-c ?") 'anything-c-bookmark-help)
(delq nil map))
"Generic Keymap for emacs bookmark sources.")
(defvar anything-esh-on-file-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "C-c ?") 'anything-esh-help)
map)
"Keymap for `anything-find-files-eshell-command-on-file'.")
(defvar anything-eshell-history-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "M-p") 'anything-next-line)
map)
"Keymap for `anything-eshell-history'.")
(defvar anything-kill-ring-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "M-y") 'anything-next-line)
(define-key map (kbd "M-u") 'anything-previous-line)
map)
"Keymap for `anything-show-kill-ring'.")
(defvar anything-occur-map
(let ((map (copy-keymap anything-map)))
(define-key map (kbd "C-M-%") 'anything-occur-run-query-replace-regexp)
map)
"Keymap for `anything-occur'.")
;;; Embeded documentation.
;;
;;
(defun anything-c-list-preconfigured-anything ()
"Collect preconfigured anything functions in this file."
(loop with doc
with sym
for entry in (cdr (assoc
(file-truename (locate-library "anything-config"))
load-history))
if (and (consp entry)
(eq (car entry) 'defun)
(string-match "^Preconfigured.+$"
(setq doc (or (documentation (setq sym (cdr entry)))
""))))
collect (cons sym (match-string 0 doc))))
(defun anything-c-format-preconfigured-anything ()
(mapcar (lambda (x) (format "\\[%s] : %s\n" (car x) (cdr x)))
(anything-c-list-preconfigured-anything)))
;;; Global help message - Used by `anything-help'
;;
;;
(setq anything-help-message
(lambda ()
(concat
"\\<anything-map>"
"`anything' is QuickSilver-like candidate-selection framework.
Narrow the list by typing some pattern,
Multiple patterns are allowed by splitting by space.
Select with natural Emacs operations, choose with RET.
If you have any problems, press C-c C-x C-b!!
Feel free to send bug reports. I'll fix them.
The steps are described in the beginning of anything.el file.
== Basic Operations ==
C-p, Up: Previous Line
C-n, Down : Next Line
M-v, PageUp : Previous Page
C-v, PageDown : Next Page
Enter : Execute first (default) action / Select
M-< : First Line
M-> : Last Line
M-PageUp, C-M-S-v, C-M-y : Previous Page (other-window)
M-PageDown, C-M-v : Next Page (other-window)
Tab, C-i : Show action list
Left : Previous Source
Right, C-o : Next Source
C-k : Delete pattern
C-z : Persistent Action (Execute action with anything session kept)
C-c C-x C-b: Send a bug report
== Shortcuts For 2nd/3rd Action ==
\\[anything-select-2nd-action-or-end-of-line] : Execute 2nd Action (if the minibuffer cursor is at end of line)
\\[anything-select-3rd-action] : Execute 3rd Action
== Visible Marks ==
Visible marks store candidate. Some actions uses marked candidates.
\\[anything-toggle-visible-mark] : Toggle Visible Mark
\\[anything-prev-visible-mark] : Previous Mark
\\[anything-next-visible-mark] : Next Mark
== Miscellaneous Commands ==
\\[anything-toggle-resplit-window] : Toggle vertical/horizontal split anything window
\\[anything-quit-and-find-file] : Drop into `find-file'
\\[anything-delete-current-selection] : Delete Selected Item (visually)
\\[anything-kill-selection-and-quit] : Set Item Into the kill-ring And Quit
\\[anything-yank-selection] : Yank Selected Item Into Pattern
\\[anything-follow-mode] : Toggle Automatical Execution Of Persistent Action
\\[anything-force-update] : Recalculate And Redisplay Candidates
== Global Commands ==
\\<global-map>\\[anything-resume] revives last `anything' session.
It is very useful, so you should bind any key.
Single source is executed by \\[anything-call-source].
== Preconfigured `anything' ==
Preconfigured `anything' is commands that uses `anything' interface.
You can use them without configuration.
"
(apply 'concat (anything-c-format-preconfigured-anything))
"
Enjoy!")))
;;; `anything-buffer-list' help
;;
;;
(defvar anything-c-buffer-help-message
"== Anything Buffer ==
\nTips:
You can enter a partial name of major-mode (e.g lisp, sh) to narrow down buffers.
Enter then a space and a pattern to narrow down to buffers matching this pattern.
\nSpecific commands for `anything-buffers-list':
\\<anything-c-buffer-map>
\\[anything-buffer-run-zgrep]\t\t->Grep Buffer(s) works as zgrep too. (C-u grep all buffers but non--file buffers).
\\[anything-buffer-switch-other-window]\t\t->Switch other window.
\\[anything-buffer-switch-other-frame]\t\t->Switch other frame.
\\[anything-buffer-run-query-replace-regexp]\t\t->Query replace regexp in marked buffers.
\\[anything-buffer-run-query-replace]\t\t->Query replace in marked buffers.
\\[anything-buffer-switch-to-elscreen]\t\t->Find buffer in Elscreen.
\\[anything-buffer-run-ediff]\t\t->Ediff current buffer with candidate. If two marked buffers ediff those buffers.
\\[anything-buffer-run-ediff-merge]\t\t->Ediff merge current buffer with candidate. If two marked buffers ediff merge those buffers.
\\[anything-buffer-diff-persistent]\t\t->Toggle Diff buffer with saved file without quitting.
\\[anything-buffer-revert-persistent]\t\t->Revert buffer without quitting.
\\[anything-buffer-save-persistent]\t\t->Save buffer without quitting.
\\[anything-buffer-run-kill-buffers]\t\t->Delete marked buffers and quit.
\\[anything-toggle-all-marks]\t\t->Toggle all marks.
\\[anything-mark-all]\t\t->Mark all.
\\[anything-c-buffer-help]\t\t->Display this help.
\n== Anything Map ==
\\{anything-map}")
;;;###autoload
(defun anything-c-buffer-help ()
"Help command for anything buffers."
(interactive)
(let ((anything-help-message anything-c-buffer-help-message))
(anything-help)))
;;; Find files help (`anything-find-files')
;;
;;
(defvar anything-ff-help-message
"== Anything Find Files ==
\nTips:
\n- Enter `~/' at end of pattern to quickly reach home directory.
- Enter `/' at end of pattern to quickly reach root of your file system.
- Enter `./' at end of pattern to quickly reach `default-directory' (initial start of session).
- You can complete with partial basename \(e.g \"fb\" will complete \"foobar\"\).
- Use `C-u C-z' to watch an image.
- To browse images directories turn on `anything-follow-mode' and navigate with arrow keys.
- When entered ediff, hitting `C-g' will ask you to use locate to find the file to ediff with.
\nSpecific commands for `anything-find-files':
\\<anything-find-files-map>
\\[anything-ff-run-locate]\t\t->Run Locate on basename of candidate (C-u to specify locate db).
\\[anything-ff-run-grep]\t\t->Run Grep (C-u Recursive).
\\[anything-ff-run-pdfgrep]\t\t->Run Pdfgrep on marked files.
\\[anything-ff-run-zgrep]\t\t->Run zgrep (C-u Recursive).
\\[anything-ff-run-etags]\t\t->Run Etags (C-u use thing-at-point `C-u C-u' reload cache)
\\[anything-ff-run-rename-file]\t\t->Rename File (C-u Follow).
\\[anything-ff-run-copy-file]\t\t->Copy File (C-u Follow).
\\[anything-ff-run-byte-compile-file]\t\t->Byte Compile File (C-u Load).
\\[anything-ff-run-load-file]\t\t->Load File.
\\[anything-ff-run-symlink-file]\t\t->Symlink File.
\\[anything-ff-run-hardlink-file]\t\t->Hardlink file.
\\[anything-ff-run-delete-file]\t\t->Delete File.
\\[anything-ff-run-kill-buffer-persistent]\t\t->Kill buffer candidate without quitting.
\\[anything-ff-persistent-delete]\t\t->Delete file without quitting.
\\[anything-ff-run-switch-to-eshell]\t\t->Switch to Eshell.
\\[anything-ff-run-eshell-command-on-file]\t\t->Eshell command on file (C-u Run on all marked files at once).
\\[anything-ff-run-ediff-file]\t\t->Ediff file.
\\[anything-ff-run-ediff-merge-file]\t\t->Ediff merge file.
\\[anything-ff-run-complete-fn-at-point]\t\t->Complete file name at point.
\\[anything-ff-run-switch-other-window]\t\t->Switch other window.
\\[anything-ff-run-switch-other-frame]\t\t->Switch other frame.
\\[anything-ff-run-open-file-externally]\t\t->Open file with external program (C-u to choose).
\\[anything-ff-rotate-left-persistent]\t\t->Rotate Image Left.
\\[anything-ff-rotate-right-persistent]\t\t->Rotate Image Right.
\\[anything-find-files-down-one-level]\t\t->Go down precedent directory.
\\[anything-ff-run-switch-to-history]\t\t->Switch to anything find-files history.
\\[anything-ff-properties-persistent]\t\t->Show file properties in a tooltip.
\\[anything-mark-all]\t\t->Mark all visibles candidates.
\\[anything-ff-run-toggle-auto-update]\t->Toggle auto expansion of directories.
\\[anything-unmark-all]\t\t->Unmark all candidates, visibles and invisibles.
\\[anything-ff-run-gnus-attach-files]\t\t->Gnus attach files to message buffer.
\\[anything-ff-run-print-file]\t\t->Print file, (C-u to refresh printers list).
\\[anything-enlarge-window]\t\t->Enlarge anything window.
\\[anything-narrow-window]\t\t->Narrow anything window.
\\[anything-ff-run-toggle-basename]\t\t->Toggle basename/fullpath.
\\[anything-send-bug-report-from-anything]\t\t->Send Bug report.
\\[anything-ff-help]\t\t->Display this help info.
\n== Anything Map ==
\\{anything-map}")
;;;###autoload
(defun anything-ff-help ()
"Help command for `anything-find-files'."
(interactive)
(let ((anything-help-message anything-ff-help-message))
(anything-help)))
;;; Help for `anything-c-read-file-name'
;;
;;
(defvar anything-read-file-name-help-message
"== Anything read file name Map ==\
\nSpecific commands for anything-c-read-file-name:
\\<anything-c-read-file-map>
\\[anything-find-files-down-one-level]\t\t->Go down precedent directory.
\\[anything-ff-run-toggle-auto-update]\t->Toggle auto expansion of directories.
\\[anything-next-source]\t->Goto next source.
\\[anything-previous-source]\t->Goto previous source.
\\[anything-read-file-name-help]\t\t->Display this help info.
\n== Anything Map ==
\\{anything-map}")
;;;###autoload
(defun anything-read-file-name-help ()
(interactive)
(let ((anything-help-message anything-read-file-name-help-message))
(anything-help)))
;;; Generic file help - Used by locate.
;;
;;
(defvar anything-generic-file-help-message
"== Anything Generic files Map ==\
\nSpecific commands for anything locate and others files sources:
\\<anything-generic-files-map>
\\[anything-ff-run-grep]\t\t->Run grep (C-u recurse).
\\[anything-ff-run-pdfgrep]\t\t->Run Pdfgrep on marked files.
\\[anything-ff-run-delete-file]\t\t->Delete file.
\\[anything-ff-run-ediff-file]\t\t->Ediff file.
\\[anything-ff-run-ediff-merge-file]\t\t->Ediff merge file.
\\[anything-ff-run-switch-other-window]\t\t->Switch other window.
\\[anything-ff-properties-persistent]\t\t->Show file properties.
\\[anything-yank-text-at-point]\t\t->Yank text at point.
\\[anything-ff-run-open-file-externally]\t\t->Open file with external program (C-u to choose).
\nLocate tips:
You can add after writing search pattern any of the locate command line options.
e.g -b, -e, -n <number>...etc.
See Man locate for more infos.
\n== Anything Map ==
\\{anything-map}")
;;;###autoload
(defun anything-generic-file-help ()
(interactive)
(let ((anything-help-message anything-generic-file-help-message))
(anything-help)))
;;; Grep help
;;
;;
(defvar anything-grep-help-message
"== Anything Grep Map ==\
\nAnything Grep tips:
You can start grep with a prefix arg to recurse in subdirectories.
You can use wild card when selecting files (e.g *.el)
You can grep in many differents directories by marking files or wild cards.
You can save your results in a grep-mode buffer, see below.
\nSpecific commands for Anything Grep:
\\<anything-c-grep-map>
\\[anything-c-goto-next-file]\t->Next File.
\\[anything-c-goto-precedent-file]\t\t->Precedent File.
\\[anything-yank-text-at-point]\t\t->Yank Text at point in minibuffer.
\\[anything-c-grep-run-other-window-action]\t\t->Jump other window.
\\[anything-c-grep-run-persistent-action]\t\t->Run persistent action (Same as `C-z').
\\[anything-c-grep-run-default-action]\t\t->Run default action (Same as RET).
\\[anything-c-grep-run-save-buffer]\t\t->Save to a `grep-mode' enabled buffer.
\\[anything-grep-help]\t\t->Show this help.
\n== Anything Map ==
\\{anything-map}")
;;;###autoload
(defun anything-grep-help ()
(interactive)
(let ((anything-help-message anything-grep-help-message))
(anything-help)))
;;; Pdf grep help
;;
;;
(defvar anything-pdfgrep-help-message
"== Anything PdfGrep Map ==\
\nSpecific commands for Pdf Grep:
\\<anything-c-pdfgrep-map>
\\[anything-c-goto-next-file]\t->Next File.
\\[anything-c-goto-precedent-file]\t\t->Precedent File.
\\[anything-yank-text-at-point]\t\t->Yank Text at point in minibuffer.
\\[anything-pdfgrep-help]\t\t->Show this help.
\n== Anything Map ==
\\{anything-map}")
;;;###autoload
(defun anything-pdfgrep-help ()
(interactive)
(let ((anything-help-message anything-pdfgrep-help-message))
(anything-help)))
;;; Etags help
;;
;;
(defvar anything-etags-help-message
"== Anything Etags Map ==\
\nSpecific commands for Etags:
\\<anything-c-etags-map>
\\[anything-c-goto-next-file]\t->Next File.
\\[anything-c-goto-precedent-file]\t\t->Precedent File.
\\[anything-yank-text-at-point]\t\t->Yank Text at point in minibuffer.
\\[anything-etags-help]\t\t->Show this help.
\n== Anything Map ==
\\{anything-map}")
;;;###autoload
(defun anything-etags-help ()
"The help function for etags."
(interactive)
(let ((anything-help-message anything-etags-help-message))
(anything-help)))
;;; Ucs help
;;
;;
(defvar anything-c-ucs-help-message
"== Anything Ucs ==
\nSpecific commands for `anything-ucs':
\\<anything-c-ucs-map>
\\[anything-c-ucs-persistent-insert]\t->Insert char.
\\[anything-c-ucs-persistent-forward]\t->Forward char.
\\[anything-c-ucs-persistent-backward]\t->Backward char.
\\[anything-c-ucs-persistent-delete]\t->Delete char backward.
\\[anything-c-ucs-help]\t\t->Show this help.
\n== Anything Map ==
\\{anything-map}")
(defun anything-c-ucs-help ()
"Help command for `anything-ucs'."
(interactive)
(let ((anything-help-message anything-c-ucs-help-message))
(anything-help)))
;;; Bookmark help
;;
;;
(defvar anything-bookmark-help-message
"== Anything bookmark name Map ==\
\nSpecific commands for bookmarks:
\\<anything-c-bookmark-map>
\\[anything-c-bookmark-run-jump-other-window]\t\t->Jump other window.
\\[anything-c-bookmark-run-delete]\t\t->Delete bookmark.
\\[anything-c-bmkext-run-edit]\t\t->Edit bookmark (only for bmkext).
\\[anything-c-bookmark-help]\t\t->Run this help.
\n== Anything Map ==
\\{anything-map}")
(defun anything-c-bookmark-help ()
"Help command for bookmarks."
(interactive)
(let ((anything-help-message anything-bookmark-help-message))
(anything-help)))
;;; Eshell command on file help
;;
;;
(defvar anything-c-esh-help-message
"== Anything eshell on file ==
\nTips:
- Passing extra args after filename:
Normally your command or alias will be called with file as argument.
e.g <command> 'candidate_file'
But you can also pass an argument or more after 'candidate_file' like this:
<command> %s [extra_args]\n
'candidate_file' will be inserted at '%s' and your command will look at this:
<command> 'candidate_file' [args]
- Specify many files as args (marked files):
e.g <command> file1 file2 ...
Please restart and use a prefix arg to call `anything-find-files-eshell-command-on-file'.
Otherwise your command will be called many times like this:
<command> file1 <command> file2 etc...
\nSpecific commands for `anything-find-files-eshell-command-on-file':
\\<anything-esh-on-file-map>
\\[anything-esh-help]\t\t->Display this help.
\n== Anything Map ==
\\{anything-map}")
(defun anything-esh-help ()
"Help command for `anything-find-files-eshell-command-on-file'."
(interactive)
(let ((anything-help-message anything-c-esh-help-message))
(anything-help)))
;;; Mode line strings
;;
;;
(defvar anything-buffer-mode-line-string
'("Buffer(s)"
"\\<anything-c-buffer-map>\
\\[anything-c-buffer-help]:Help, \
\\<anything-map>\
\\[anything-select-action]:Acts,\
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct,\
\\[anything-send-bug-report-from-anything]:BugReport."
"String displayed in mode-line in `anything-c-source-buffers-list'"))
(defvar anything-ff-mode-line-string
"\\<anything-find-files-map>\
\\[anything-ff-help]:Help, \
\\[anything-send-bug-report-from-anything]:BugReport, \
\\<anything-map>\
\\[anything-select-action]:Acts, \
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct"
"String displayed in mode-line in `anything-c-source-find-files'")
(defvar anything-read-file-name-mode-line-string
"\\<anything-c-read-file-map>\
\\[anything-read-file-name-help]:Help, \
\\<anything-map>\
\\[anything-select-action]:Acts,\
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct"
"String displayed in mode-line in `anything-c-source-find-files'")
(defvar anything-generic-file-mode-line-string
"\\<anything-generic-files-map>\
\\[anything-generic-file-help]:Help, \
\\<anything-map>\
\\[anything-select-action]:Acts,\
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct,\
\\[anything-send-bug-report-from-anything]:BugReport."
"String displayed in mode-line in Locate.")
(defvar anything-grep-mode-line-string
"\\<anything-c-grep-map>\
\\[anything-grep-help]:Help,\
\\<anything-map>\
\\[anything-select-action]:Acts,\
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct,\
\\[anything-send-bug-report-from-anything]:BugReport."
"String displayed in mode-line in `anything-do-grep'.")
(defvar anything-pdfgrep-mode-line-string
"\\<anything-c-pdfgrep-map>\
\\[anything-pdfgrep-help]:Help,\
\\<anything-map>\
\\[anything-select-action]:Acts,\
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct,\
\\[anything-send-bug-report-from-anything]:BugReport."
"String displayed in mode-line in `anything-do-pdfgrep'.")
(defvar anything-etags-mode-line-string
"\\<anything-c-etags-map>\
\\[anything-etags-help]:Help,\
\\<anything-map>\
\\[anything-select-action]:Acts,\
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct,\
\\[anything-send-bug-report-from-anything]:BugReport."
"String displayed in mode-line in `anything-c-etags-select'.")
(defvar anything-c-ucs-mode-line-string
"\\<anything-c-ucs-map>\
\\[anything-c-ucs-help]:Help, \
\\<anything-map>\
\\[anything-select-action]:Acts,\
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct."
"String displayed in mode-line in `anything-ucs'.")
(defvar anything-bookmark-mode-line-string
'("Bookmark(s)"
"\\<anything-c-bookmark-map>\
\\[anything-c-bookmark-help]:Help, \
\\<anything-map>\
\\[anything-select-action]:Acts,\
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct,\
\\[anything-send-bug-report-from-anything]:BugReport."
"String displayed in mode-line in `anything-c-source-buffers-list'"))
(defvar anything-occur-mode-line
"\\<anything-map>\
\\[anything-help]:Help,\
\\<anything-occur-map>\
\\[anything-occur-run-query-replace-regexp]:Query replace regexp,\
\\<anything-map>\
\\[anything-select-action]:Acts,\
\\[anything-exit-minibuffer]/\\[anything-select-2nd-action-or-end-of-line]/\
\\[anything-select-3rd-action]:NthAct,\
\\[anything-send-bug-report-from-anything]:BugReport.")
;;; Utilities Functions
;;
;;
(defun anything-ff-find-printers ()
"Return a list of available printers on Unix systems."
(when (executable-find "lpstat")
(let ((printer-list (with-temp-buffer
(call-process "lpstat" nil t nil "-a")
(split-string (buffer-string) "\n"))))
(loop for p in printer-list
for printer = (car (split-string p))
when printer
collect printer))))
;; Shut up byte compiler in emacs24*.
(defun anything-c-switch-to-buffer (buffer-or-name)
"Same as `switch-to-buffer' whithout warnings at compile time."
(with-no-warnings
(switch-to-buffer buffer-or-name)))
(defun* anything-c-position (item seq &key (test 'eq) all)
"A simple and faster replacement of CL `position'.
Return position of first occurence of ITEM found in SEQ.
Argument SEQ can be a string, in this case ITEM have to be a char.
Argument ALL, if non--nil specify to return a list of positions of
all ITEM found in SEQ."
(let ((key (if (stringp seq) 'across 'in)))
(eval
`(loop for c ,key seq
for index from 0
when (funcall test c item)
if all collect index into ls
else return index
finally return ls))))
(defun anything-c-get-pid-from-process-name (process-name)
"Get pid from running process PROCESS-NAME."
(loop with process-list = (list-system-processes)
for pid in process-list
for process = (assoc-default 'comm (process-attributes pid))
when (and process (string-match process-name process))
return pid))
(defun* anything-current-buffer-narrowed-p (&optional
(buffer anything-current-buffer))
"Check if BUFFER is narrowed.
Default is `anything-current-buffer'."
(with-current-buffer buffer
(let ((beg (point-min))
(end (point-max))
(total (buffer-size)))
(or (/= beg 1) (/= end (1+ total))))))
(defun anything-region-active-p ()
(and transient-mark-mode mark-active (/= (mark) (point))))
(defun anything-goto-char (loc)
"Go to char, revealing if necessary."
(goto-char loc)
(when (or (eq major-mode 'org-mode)
(and (boundp 'outline-minor-mode)
outline-minor-mode))
(require 'org) ; On some old Emacs versions org may not be loaded.
(org-reveal)))
(defun anything-goto-line (lineno &optional noanim)
"Goto LINENO opening only outline headline if needed.
Animation is used unless NOANIM is non--nil."
(goto-char (point-min))
(anything-goto-char (point-at-bol lineno))
(unless noanim
(anything-match-line-color-current-line)
(sit-for 0.3)
(anything-match-line-cleanup)))
(defun anything-show-this-source-only ()
"Show all candidates of this source."
(interactive)
(let (anything-candidate-number-limit)
(anything-set-source-filter
(list (assoc-default 'name (anything-get-current-source))))))
;;;###autoload
(defun anything-test-sources ()
"List all anything sources for test.
The output is sexps which are evaluated by \\[eval-last-sexp]."
(interactive)
(with-output-to-temp-buffer "*Anything Test Sources*"
(mapc (lambda (s) (princ (format ";; (anything '%s)\n" s)))
(apropos-internal "^anything-c-source" #'boundp))
(pop-to-buffer standard-output)))
(defun anything-displaying-source-names ()
"Display sources name."
(with-current-buffer anything-buffer
(goto-char (point-min))
(loop with pos
while (setq pos (next-single-property-change (point) 'anything-header))
do (goto-char pos)
collect (buffer-substring-no-properties (point-at-bol)(point-at-eol))
do (forward-line 1))))
;; [Obsolete]
(defun anything-select-source ()
"[OBSOLETE] Select source."
(interactive)
(let ((default (assoc-default 'name (anything-get-current-source)))
(source-names (anything-displaying-source-names))
(all-source-names (mapcar (lambda (s) (assoc-default 'name s))
(anything-get-sources))))
(setq anything-candidate-number-limit 9999)
(anything-aif
(let (anything-source-filter)
(anything-nest '(((name . "Anything Source")
(candidates . source-names)
(action . identity))
((name . "Anything Source (ALL)")
(candidates . all-source-names)
(action . identity)))
nil "Source: " nil
default "*anything select source*"))
(anything-set-source-filter (list it))
(anything-set-source-filter nil))))
(defun anything-insert-string (str)
"Insert STR."
(anything-set-pattern str 'noupdate))
;;;###autoload
(defun anything-insert-buffer-name ()
"Insert buffer name."
(interactive)
(anything-set-pattern
(with-anything-current-buffer
(if buffer-file-name (file-name-nondirectory buffer-file-name)
(buffer-name)))))
(defalias 'anything-insert-symbol 'next-history-element)
(defalias 'anything-insert-selection 'anything-yank-selection)
(defun anything-c-match-on-file-name (candidate)
"Return non-nil if `anything-pattern' match basename of filename CANDIDATE."
(string-match anything-pattern (file-name-nondirectory candidate)))
(defun anything-c-match-on-directory-name (candidate)
"Return non-nil if `anything-pattern' match directory part of CANDIDATE."
(anything-aif (file-name-directory candidate)
(string-match anything-pattern it)))
(defun anything-c-match-on-basename (candidate)
"Return non-nil if `anything-pattern' match basename of filename CANDIDATE."
(string-match anything-pattern (anything-c-basename candidate)))
(defun anything-c-string-match (candidate)
"Return non-nil if `anything-pattern' match CANDIDATE.
The match is done with `string-match'."
(string-match anything-pattern candidate))
(defun anything-c-skip-entries (list regexp)
"Remove entries which matches REGEXP from LIST."
(remove-if (lambda (x) (and (stringp x) (string-match regexp x)))
list))
(defun anything-c-shadow-entries (list regexp)
"Display elements of LIST matching REGEXP with the `file-name-shadow' face."
(mapcar (lambda (file)
;; Add shadow face property to boring files.
(let ((face (if (facep 'file-name-shadow)
'file-name-shadow
;; fall back to default on XEmacs
'default)))
(if (string-match regexp file)
(setq file (propertize file 'face face))))
file)
list))
(defsubst anything-c-stringify (str-or-sym)
"Get string of STR-OR-SYM."
(if (stringp str-or-sym)
str-or-sym
(symbol-name str-or-sym)))
(defsubst anything-c-symbolify (str-or-sym)
"Get symbol of STR-OR-SYM."
(if (symbolp str-or-sym)
str-or-sym
(intern str-or-sym)))
(defun anything-c-describe-function (func)
"FUNC is symbol or string."
(describe-function (anything-c-symbolify func)))
(defun anything-c-describe-variable (var)
"VAR is symbol or string."
(describe-variable (anything-c-symbolify var)))
(defun anything-c-find-function (func)
"FUNC is symbol or string."
(find-function (anything-c-symbolify func)))
(defun anything-c-find-variable (var)
"VAR is symbol or string."
(find-variable (anything-c-symbolify var)))
(defun anything-c-kill-new (candidate &optional replace)
"CANDIDATE is symbol or string.
See `kill-new' for argument REPLACE."
(kill-new (anything-c-stringify candidate) replace))
(defun* anything-fast-remove-dups (seq &key (test 'eq))
"Remove duplicates elements in list SEQ.
This is same as `remove-duplicates' but with memoisation.
It is much faster, especially in large lists.
A test function can be provided with TEST argument key.
Default is `eq'."
(loop with cont = (make-hash-table :test test)
for elm in seq
unless (gethash elm cont)
do (puthash elm elm cont)
finally return
(loop for i being the hash-values in cont collect i)))
(defadvice eval-defun (after anything-source-hack activate)
"Allow immediate execution of anything source when evaling it.
See `anything-c-enable-eval-defun-hack'."
(when anything-c-enable-eval-defun-hack
(let ((varsym (save-excursion
(beginning-of-defun)
(forward-char 1)
(when (memq (read (current-buffer)) '(defvar setq))
(read (current-buffer))))))
(when (string-match "^anything-c-source-" (symbol-name varsym))
(anything varsym)))))
;; (progn (ad-disable-advice 'eval-defun 'after 'anything-source-hack) (ad-update 'eval-defun))
;; Move this function from anything.el and redefine here
;; to avoid an unneeded defadvice.
(defun anything-quit-and-find-file ()
"Drop into `anything-find-files' from `anything'.
If current selection is a buffer or a file, `anything-find-files'
from its directory."
(interactive)
(anything-run-after-quit
(lambda (f)
(if (file-exists-p f)
(anything-find-files-1 (file-name-directory f)
(if anything-ff-transformer-show-only-basename
(anything-c-basename f) f))
(anything-find-files-1 f)))
(anything-aif (get-buffer (anything-get-selection))
(or (buffer-file-name it)
(car (rassoc it dired-buffers))
(and (with-current-buffer it
(eq major-mode 'org-agenda-mode))
org-directory
(expand-file-name org-directory))
default-directory)
(let ((sel (anything-get-selection)))
(cond ((or (file-remote-p sel)
(file-exists-p sel))
(expand-file-name sel))
((string-match ffap-url-regexp sel)
sel)
(t default-directory))))))
(defmacro* anything-c-walk-directory (directory &key path (directories t) match)
"Walk through DIRECTORY tree.
PATH can be one of basename, relative, or full.
DIRECTORIES when non--nil (default) return also directories names, otherwise
skip directories names.
MATCH match only filenames matching regexp MATCH."
`(let (result
(fn (case ,path
(basename 'file-name-nondirectory)
(relative 'file-relative-name)
(full 'identity)
(t 'file-name-nondirectory))))
(labels ((ls-R (dir)
(loop with ls = (directory-files dir t directory-files-no-dot-files-regexp)
for f in ls
if (file-directory-p f)
do (progn (when ,directories
(push (funcall fn f) result))
;; Don't recurse in directory symlink.
(unless (file-symlink-p f)
(ls-R f)))
else do
(unless (and ,match (not (string-match ,match (file-name-nondirectory f))))
(push (funcall fn f) result)))))
(ls-R ,directory)
(nreverse result))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Anything Applications ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Anything regexp.
;;
;;
(defvar anything-build-regexp-history nil)
(defun anything-c-query-replace-regexp (candidate)
"Query replace regexp from `anything-regexp'.
With a prefix arg replace only matches surrounded by word boundaries,
i.e Don't replace inside a word, regexp is surrounded with \\bregexp\\b."
(let ((regexp (funcall (anything-attr 'regexp))))
(apply 'query-replace-regexp
(anything-c-query-replace-args regexp))))
(defun anything-c-kill-regexp-as-sexp (candidate)
"Kill regexp in a format usable in lisp code."
(anything-c-regexp-kill-new
(prin1-to-string (funcall (anything-attr 'regexp)))))
(defun anything-c-kill-regexp (candidate)
"Kill regexp as it is in `anything-pattern'."
(anything-c-regexp-kill-new (funcall (anything-attr 'regexp))))
(defun anything-c-query-replace-args (regexp)
"create arguments of `query-replace-regexp' action in `anything-regexp'."
(let ((region-only (anything-region-active-p)))
(list
regexp
(query-replace-read-to regexp
(format "Query replace %sregexp %s"
(if anything-current-prefix-arg "word " "")
(if region-only "in region " ""))
t)
anything-current-prefix-arg
(when region-only (region-beginning))
(when region-only (region-end)))))
(defvar anything-c-source-regexp
'((name . "Regexp Builder")
(init . (lambda ()
(anything-candidate-buffer anything-current-buffer)))
(candidates-in-buffer)
(get-line . anything-c-regexp-get-line)
(persistent-action . anything-c-regexp-persistent-action)
(persistent-help . "Show this line")
(multiline)
(delayed)
(requires-pattern . 2)
(mode-line . "Press TAB to select action.")
(regexp . (lambda () anything-input))
(action . (("Kill Regexp as sexp" . anything-c-kill-regexp-as-sexp)
("Query Replace Regexp (C-u Not inside word.)"
. anything-c-query-replace-regexp)
("Kill Regexp" . anything-c-kill-regexp)))))
(defun anything-c-regexp-get-line (s e)
(propertize
(apply 'concat
;; Line contents
(format "%5d: %s" (line-number-at-pos (1- s)) (buffer-substring s e))
;; subexps
(loop for i from 0 to (1- (/ (length (match-data)) 2))
collect (format "\n %s'%s'"
(if (zerop i) "Group 0: " (format "Group %d: " i))
(match-string i))))
;; match beginning
;; KLUDGE: point of anything-candidate-buffer is +1 than that of anything-current-buffer.
;; It is implementation problem of candidates-in-buffer.
'anything-realvalue
(1- s)))
(defun anything-c-regexp-persistent-action (pt)
(anything-goto-char pt)
(anything-persistent-highlight-point))
(defun anything-c-regexp-kill-new (input)
(kill-new input)
(message "Killed: %s" input))
(defun anything-quote-whitespace (candidate)
"Quote whitespace, if some, in string CANDIDATE."
(replace-regexp-in-string " " "\\\\ " candidate))
;;; Toggle all marks.
;;
;;
;;;###autoload
(defun anything-mark-all ()
"Mark all visible unmarked candidates in current source."
(interactive)
(with-anything-window
(save-excursion
(goto-char (anything-get-previous-header-pos))
(anything-next-line)
(let* ((next-head (anything-get-next-header-pos))
(end (and next-head
(save-excursion
(goto-char next-head)
(forward-line -1)
(point))))
(maxpoint (or end (point-max))))
(while (< (point) maxpoint)
(anything-mark-current-line)
(let* ((prefix (get-text-property (point-at-bol) 'display))
(cand (anything-get-selection))
(bn (and (anything-file-completion-source-p)
(anything-c-basename cand)))
(src (assoc-default 'name (anything-get-current-source))))
(when (and (not (anything-this-visible-mark))
(not (or (string= prefix "[?]")
(string= prefix "[@]"))))
;; Don't mark possibles directories ending with . or ..
;; autosave files/links and non--existent file.
(unless
(and (or (anything-file-completion-source-p)
(equal src "Files from Current Directory"))
(or (string-match "^\\.#.*\\|^#.*#$\\|\\.$" bn)
;; We need to test here when not using a transformer
;; that tag prefix (i.e on tramp)
(not (file-exists-p cand))))
(anything-make-visible-mark))))
(forward-line 1) (end-of-line))))
(anything-mark-current-line)
(message "%s candidates marked" (length anything-marked-candidates))))
;;;###autoload
(defun anything-unmark-all ()
"Unmark all candidates in all sources of current anything session."
(interactive)
(with-anything-window
(let ((len (length anything-marked-candidates)))
(save-excursion
(anything-clear-visible-mark))
(setq anything-marked-candidates nil)
(anything-mark-current-line)
(message "%s candidates unmarked" len))))
;;;###autoload
(defun anything-toggle-all-marks ()
"Toggle all marks.
Mark all visible candidates of current source or unmark all candidates
visible or invisible in all sources of current anything session"
(interactive)
(let ((marked (anything-marked-candidates)))
(if (and (>= (length marked) 1)
(with-anything-window anything-visible-mark-overlays))
(anything-unmark-all)
(anything-mark-all))))
;;; Buffers
;;
;;
(defun anything-c-buffer-list ()
"Return a list of buffer names.
The first buffer in the list will be the last recently used
buffer that is not the current buffer unless
`anything-allow-skipping-current-buffer' is nil."
(let ((buffers (mapcar 'buffer-name (buffer-list))))
(if anything-allow-skipping-current-buffer
(progn
(setq buffers (remove (buffer-name anything-current-buffer) buffers))
(append (cdr buffers) (list (car buffers))))
buffers)))
(defvar anything-c-source-buffers
'((name . "Buffers")
(candidates . anything-c-buffer-list)
(type . buffer)))
(defvar anything-c-source-buffer-not-found
`((name . "Create buffer")
(dummy)
(filtered-candidate-transformer (lambda (cands source)
(list anything-pattern)))
(keymap . ,anything-map)
(action . (lambda (candidate)
(anything-c-switch-to-buffer (get-buffer-create candidate))))))
;;; Buffers-list (was buffers+)
;;
;;
(defun anything-c-highlight-buffers (buffers)
"Transformer function to highlight BUFFERS list.
Should be called after others transformers i.e (boring buffers)."
(loop with buflist = (if anything-allow-skipping-current-buffer
buffers
(cons (pop (cdr buffers)) buffers))
for i in buflist
for buf = (get-buffer i)
for bfname = (buffer-file-name buf)
collect
(cond (;; A dired buffer.
(rassoc buf dired-buffers)
(propertize i 'face 'anything-ff-directory
'help-echo (car (rassoc buf dired-buffers))))
;; A buffer file modified somewhere outside of emacs.
((and bfname (not (file-remote-p bfname))
(file-exists-p bfname)
(not (verify-visited-file-modtime buf)))
(propertize i 'face 'anything-buffer-saved-out
'help-echo bfname))
;; A new buffer file not already saved on disk.
((and bfname (not (file-remote-p bfname))
(not (verify-visited-file-modtime buf)))
(propertize i 'face 'anything-buffer-not-saved
'help-echo bfname))
;; A Remote buffer file modified and not saved on disk.
((and bfname (file-remote-p bfname) (buffer-modified-p buf))
(let ((prefix (propertize
" " 'display
(propertize "@ " 'face 'anything-ff-prefix))))
(cons (concat prefix (propertize i 'face 'anything-ff-symlink
'help-echo bfname)) i)))
;; A buffer file modified and not saved on disk.
((and bfname (buffer-modified-p buf))
(propertize i 'face 'anything-ff-symlink
'help-echo bfname))
;; A remote buffer file not modified and saved on disk.
((and bfname (file-remote-p bfname))
(let ((prefix (propertize
" " 'display
(propertize "@ " 'face 'anything-ff-prefix))))
(cons (concat prefix (propertize i 'face 'font-lock-type-face
'help-echo bfname)) i)))
;; A buffer file not modified and saved on disk.
(bfname
(propertize i 'face 'font-lock-type-face
'help-echo bfname))
;; Any non--file buffer.
(t (propertize i 'face 'italic)))))
(defvar anything-c-source-buffers-list
`((name . "Buffers")
(candidates . anything-c-buffer-list)
(type . buffer)
(match anything-c-buffer-match-major-mode)
(candidate-transformer anything-c-skip-boring-buffers
anything-c-highlight-buffers)
(persistent-action . anything-c-buffers-list-persistent-action)
(keymap . ,anything-c-buffer-map)
(volatile)
(mode-line . anything-buffer-mode-line-string)
(persistent-help . "Show this buffer / C-u \\[anything-execute-persistent-action]: Kill this buffer")))
(defvaralias 'anything-c-source-buffers+ 'anything-c-source-buffers-list)
(defun anything-c-buffer-match-major-mode (candidate)
"Match maybe buffer by major-mode.
If you give a major-mode or partial major-mode,
it will list all buffers of this major-mode and/or buffers with name
matching this major-mode.
If you add a space after major-mode and then a space,
it will match all buffers of the major-mode
before space matching pattern after space.
If you give a pattern which doesn't match a major-mode, it will search buffer
with name matching pattern."
(let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate))
(buf (get-buffer cand)))
(when buf
(with-current-buffer buf
(let ((mjm (symbol-name major-mode))
(split (split-string anything-pattern)))
(cond ((string-match "\\s-$" anything-pattern)
(string-match (car split) mjm))
((string-match "\\s-" anything-pattern)
(and (string-match (car split) mjm)
(string-match (cadr split) cand)))
(t (or (string-match anything-pattern mjm)
(string-match anything-pattern cand)))))))))
(defun anything-c-buffer-query-replace-1 (&optional regexp-flag)
"Query replace in marked buffers.
If REGEXP-FLAG is given use `query-replace-regexp'."
(let ((fn (if regexp-flag 'query-replace-regexp 'query-replace))
(prompt (if regexp-flag "Query replace regexp" "Query replace"))
(bufs (anything-marked-candidates)))
(loop
with replace = (query-replace-read-from prompt regexp-flag)
with tostring = (unless (consp replace)
(query-replace-read-to
replace prompt regexp-flag))
for buf in bufs
do
(save-window-excursion
(anything-c-switch-to-buffer buf)
(save-excursion
(let ((case-fold-search t))
(goto-char (point-min))
(if (consp replace)
(apply fn (list (car replace) (cdr replace)))
(apply fn (list replace tostring)))))))))
(defun anything-c-buffer-query-replace-regexp (candidate)
(anything-c-buffer-query-replace-1 'regexp))
(defun anything-c-buffer-query-replace (candidate)
(anything-c-buffer-query-replace-1))
(defun anything-buffer-toggle-diff (candidate)
"Toggle diff buffer CANDIDATE with it's file."
(if (get-buffer-window "*Diff*")
(kill-buffer "*Diff*")
(diff-buffer-with-file (get-buffer candidate))))
;;;###autoload
(defun anything-buffer-diff-persistent ()
"Toggle diff buffer without quitting anything."
(interactive)
(anything-attrset 'diff-action 'anything-buffer-toggle-diff)
(anything-execute-persistent-action 'diff-action))
(defun anything-buffer-revert-and-update (candidate)
(let ((marked (anything-marked-candidates)))
(loop for buf in marked do (anything-revert-buffer buf))
(anything-force-update candidate)))
;;;###autoload
(defun anything-buffer-revert-persistent ()
"Revert buffer without quitting anything."
(interactive)
(anything-attrset 'revert-action 'anything-buffer-revert-and-update)
(anything-execute-persistent-action 'revert-action 'onewindow))
(defun anything-buffer-save-and-update (candidate)
(let ((marked (anything-marked-candidates))
(enable-recursive-minibuffers t))
(loop for buf in marked do
(with-current-buffer (get-buffer buf)
(save-buffer)))
(anything-force-update candidate)))
;;;###autoload
(defun anything-buffer-save-persistent ()
"Save buffer without quitting anything."
(interactive)
(anything-attrset 'save-action 'anything-buffer-save-and-update)
(anything-execute-persistent-action 'save-action 'onewindow))
;;;###autoload
(defun anything-buffer-run-kill-buffers ()
"Run kill buffer action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'anything-kill-marked-buffers))
;;;###autoload
(defun anything-buffer-run-grep ()
"Run Grep action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'anything-c-grep-buffers))
;;;###autoload
(defun anything-buffer-run-zgrep ()
"Run Grep action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'anything-c-zgrep-buffers))
;;;###autoload
(defun anything-buffer-run-query-replace-regexp ()
"Run Query replace regexp action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'anything-c-buffer-query-replace-regexp))
;;;###autoload
(defun anything-buffer-run-query-replace ()
"Run Query replace action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'anything-c-buffer-query-replace))
;;;###autoload
(defun anything-buffer-switch-other-window ()
"Run switch to other window action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'switch-to-buffer-other-window))
;;;###autoload
(defun anything-buffer-switch-other-frame ()
"Run switch to other frame action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'switch-to-buffer-other-frame))
;;;###autoload
(defun anything-buffer-switch-to-elscreen ()
"Run switch to elscreen action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'anything-find-buffer-on-elscreen))
;;;###autoload
(defun anything-buffer-run-ediff ()
"Run ediff action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'anything-ediff-marked-buffers))
(defun anything-buffer-run-ediff-merge ()
"Run ediff action from `anything-c-source-buffers-list'."
(interactive)
(anything-c-quit-and-execute-action 'anything-ediff-marked-buffers-merge))
(defun anything-c-buffers-persistent-kill (buffer)
"Persistent action to kill buffer."
(with-current-buffer (get-buffer buffer)
(if (and (buffer-modified-p)
(buffer-file-name (current-buffer)))
(progn
(save-buffer)
(kill-buffer buffer))
(kill-buffer buffer)))
(anything-delete-current-selection))
(defun anything-c-buffers-list-persistent-action (candidate)
(if current-prefix-arg
(anything-c-buffers-persistent-kill candidate)
(anything-c-switch-to-buffer candidate)))
;;;; <File>
;;
;;
;;; File name history
(defvar anything-c-source-file-name-history
'((name . "File Name History")
(candidates . file-name-history)
(match anything-c-match-on-basename)
(type . file)))
;;; Files in current dir
;;
;;
(defvar anything-c-source-files-in-current-dir
'((name . "Files from Current Directory")
(candidates . (lambda ()
(with-anything-current-buffer
(directory-files (anything-c-current-directory)))))
;; volatile is not needed, I think.
(type . file)))
(defun anything-c-highlight-files (files)
(loop for i in files
if (file-directory-p i)
collect (propertize (file-name-nondirectory i)
'face 'anything-ff-directory
'help-echo (expand-file-name i))
else
collect (propertize (file-name-nondirectory i)
'face 'anything-ff-file
'help-echo (expand-file-name i))))
(defvar anything-c-source-files-in-current-dir+
`((name . "Files from Current Directory")
(candidates . (lambda ()
(with-anything-current-buffer
(directory-files (anything-c-current-directory) t))))
(keymap . ,anything-generic-files-map)
(help-message . anything-generic-file-help-message)
(mode-line . anything-generic-file-mode-line-string)
(candidate-transformer anything-c-highlight-files)
;; volatile is not needed, I think.
(type . file)))
;;; Anything-find-files - The anything files browser.
;;
;;
;; Internal.
(defvar anything-c-find-files-doc-header " (`C-l': Go to precedent level)"
"*The doc that is inserted in the Name header of a find-files or dired source.")
(defvar anything-ff-auto-update-flag nil
"Internal, flag to turn on/off auto-update in `anything-find-files'.
Don't set it directly, use instead `anything-ff-auto-update-initial-value'.")
(defvar anything-ff-last-expanded nil
"Store last expanded directory or file.")
(defvar anything-ff-default-directory nil)
(defvar anything-ff-history nil)
(defvar anything-ff-cand-to-mark nil)
(defvar anything-ff-url-regexp
"\\`\\(news\\(post\\)?:\\|nntp:\\|mailto:\\|file:\\|\\(ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\):/?/?\\).*"
"Same as `ffap-url-regexp' but match earlier possible url.")
(defvar anything-c-source-find-files
`((name . "Find Files")
(header-name . (lambda (name)
(concat name anything-c-find-files-doc-header)))
;; It is needed for filenames with capital letters
(disable-shortcuts)
(init . (lambda ()
(setq anything-ff-auto-update-flag
anything-ff-auto-update-initial-value)))
(candidates . anything-find-files-get-candidates)
(filtered-candidate-transformer anything-c-find-files-transformer)
(persistent-action . anything-find-files-persistent-action)
(persistent-help . "Hit1 Expand Candidate, Hit2 or (C-u) Find file")
(mode-line . anything-ff-mode-line-string)
(volatile)
(candidate-number-limit . 9999)
(action-transformer . anything-find-files-action-transformer)
(action
. ,(delq
nil
`(("Find File" . anything-c-find-file-or-marked)
("Find file in Dired" . anything-c-point-file-in-dired)
,(and (locate-library "elscreen")
'("Find file in Elscreen" . anything-elscreen-find-file))
,(and (locate-library "popwin")
'("Find file in popup window" . popwin:find-file))
("Checksum File" . anything-ff-checksum)
("Complete at point `M-tab'"
. anything-c-insert-file-name-completion-at-point)
("Open file externally `C-c C-x, C-u to choose'"
. anything-c-open-file-externally)
("Grep File(s) `M-g s, C-u Recurse'" . anything-find-files-grep)
("Zgrep File(s) `M-g z, C-u Recurse'" . anything-ff-zgrep)
("Switch to Eshell `M-e'" . anything-ff-switch-to-eshell)
("Etags `M-., C-u tap, C-u C-u reload tag file'" . anything-ff-etags-select)
("Eshell command on file(s) `M-!, C-u run on all marked at once.'"
. anything-find-files-eshell-command-on-file)
("Find file as root" . anything-find-file-as-root)
("Find file in hex dump" . hexl-find-file)
("Ediff File `C-='" . anything-find-files-ediff-files)
("Ediff Merge File `C-c ='" . anything-find-files-ediff-merge-files)
("Delete File(s) `M-D'" . anything-delete-marked-files)
("Copy file(s) `M-C, C-u to follow'" . anything-find-files-copy)
("Copy file(s) Async" . anything-ff-copy-async)
("Rename file(s) `M-R, C-u to follow'" . anything-find-files-rename)
("Serial rename files" . anything-ff-serial-rename)
("Serial rename by symlinking files" . anything-ff-serial-rename-by-symlink)
("Serial rename by copying files" . anything-ff-serial-rename-by-copying)
("Symlink files(s) `M-S, C-u to follow'" . anything-find-files-symlink)
("Relsymlink file(s) `C-u to follow'" . anything-find-files-relsymlink)
("Hardlink file(s) `M-H, C-u to follow'" . anything-find-files-hardlink)
("Find file other window `C-o'" . find-file-other-window)
("Switch to history `M-p'" . anything-find-files-switch-to-hist)
("Find file other frame `C-c C-o'" . find-file-other-frame)
("Print File `C-c p, C-u to refresh'" . anything-ff-print)
("Locate `C-x C-f, C-u to specify locate db'" . anything-ff-locate))))))
(defun anything-find-files-set-prompt-for-action (action files)
"Set prompt for action ACTION for FILES."
(let ((len (length files)))
(format "%s *%s File(s)\n%s to: "
action len
(mapconcat (lambda (f)
(format "- %s\n" f)) files ""))))
(defun anything-dwim-target-directory ()
"Return value of `default-directory' of buffer in other window.
If there is only one window return the value ot `default-directory'
for current buffer."
(with-anything-current-buffer
(let ((num-windows (length (window-list))))
(if (> num-windows 1)
(save-selected-window
(other-window 1)
default-directory)
(car anything-ff-history)))))
(defun anything-find-files-do-action (action)
"Generic function for creating action from `anything-c-source-find-files'.
ACTION must be an action supported by `anything-dired-action'."
(let* ((ifiles (mapcar 'expand-file-name ; Allow modify '/foo/.' -> '/foo'
(anything-marked-candidates)))
(cand (anything-get-selection)) ; Target
(prompt (anything-find-files-set-prompt-for-action
(capitalize (symbol-name action)) ifiles))
(parg anything-current-prefix-arg)
(dest (anything-c-read-file-name
prompt
:preselect (if anything-ff-transformer-show-only-basename
(anything-c-basename cand) cand)
:initial-input (anything-dwim-target-directory)
:history (anything-find-files-history :comp-read nil))))
(anything-dired-action
dest :files ifiles :action action :follow parg)))
(defun anything-find-files-copy (candidate)
"Copy files from `anything-find-files'."
(anything-find-files-do-action 'copy))
(defun anything-find-files-rename (candidate)
"Rename files from `anything-find-files'."
(anything-find-files-do-action 'rename))
(defun anything-find-files-symlink (candidate)
"Symlink files from `anything-find-files'."
(anything-find-files-do-action 'symlink))
(defun anything-find-files-relsymlink (candidate)
"Relsymlink files from `anything-find-files'."
(anything-find-files-do-action 'relsymlink))
(defun anything-find-files-hardlink (candidate)
"Hardlink files from `anything-find-files'."
(anything-find-files-do-action 'hardlink))
(defun anything-find-files-byte-compile (candidate)
"Byte compile elisp files from `anything-find-files'."
(let ((files (anything-marked-candidates))
(parg anything-current-prefix-arg))
(loop for fname in files
do (byte-compile-file fname parg))))
(defun anything-find-files-load-files (candidate)
"Load elisp files from `anything-find-files'."
(let ((files (anything-marked-candidates)))
(loop for fname in files
do (load fname))))
(defun anything-find-files-ediff-files-1 (candidate &optional merge)
"Generic function to ediff/merge files in `anything-find-files'."
(let ((bname (anything-c-basename candidate))
(prompt (if merge "Ediff Merge `%s' With File: "
"Ediff `%s' With File: "))
(fun (if merge 'ediff-merge-files 'ediff-files)))
(funcall fun
candidate
(condition-case quit
(anything-c-read-file-name
(format prompt bname))
(quit ;; Hit C-g ask user to fallback to locate.
(if (y-or-n-p "Search file for ediff with locate? ")
(anything-c-locate-read-file-name
(format prompt bname)
;; Check if -b option is available.
(if (and (eq system-type 'windows-nt)
(string-match "^es" anything-c-locate-command))
bname
(concat bname " -b")))
(error "Error: Ediff Operation aborted")))))))
(defun anything-find-files-ediff-files (candidate)
(anything-find-files-ediff-files-1 candidate))
(defun anything-find-files-ediff-merge-files (candidate)
(anything-find-files-ediff-files-1 candidate 'merge))
(defun anything-find-files-grep (candidate)
"Default action to grep files from `anything-find-files'."
(anything-do-grep-1 (anything-marked-candidates)
anything-current-prefix-arg))
(defun anything-ff-zgrep (candidate)
"Default action to zgrep files from `anything-find-files'."
(let ((prefarg anything-current-prefix-arg)
(ls (anything-marked-candidates)))
(anything-ff-zgrep-1 ls prefarg)))
(defun anything-ff-pdfgrep (candidate)
"Default action to pdfgrep files from `anything-find-files'."
(let ((cands (loop for file in (anything-marked-candidates)
if (or (string= (file-name-extension file) "pdf")
(string= (file-name-extension file) "PDF"))
collect file))
(anything-c-pdfgrep-default-function 'anything-c-pdfgrep-init))
(when cands
(anything-do-pdfgrep-1 cands))))
(defun anything-ff-etags-select (candidate)
"Default action to jump to etags from `anything-find-files'."
(when (get-buffer anything-action-buffer)
(kill-buffer anything-action-buffer))
(let ((default-directory anything-ff-default-directory))
(anything-c-etags-select anything-current-prefix-arg)))
(defun anything-find-files-switch-to-hist (candidate)
"Switch to anything-find-files history."
(anything-find-files t))
;;; Asynchronous copy of files.
;;
;;
(defun anything-c-copy-files-async-1 (flist dest)
"Copy a list of Files FLIST to DEST asynchronously.
It use another emacs process to do the job.
Communication with background emacs is done with temp file
`anything-c-copy-files-async-log-file'."
(start-file-process "emacs-batch" nil anything-c-copy-async-prefered-emacs
"-Q" "--batch" "--eval"
(format "(progn
(require 'dired) (require 'cl)
(let ((dired-recursive-copies 'always)
failures success
(ovw-count 0)
(cpf-count 0))
(dolist (f '%S)
(condition-case err
(let ((file-exists (file-exists-p
(expand-file-name
(file-name-nondirectory (directory-file-name f))
(file-name-directory
(file-name-as-directory \"%s\"))))))
(dired-copy-file f \"%s\" t)
(if file-exists
(progn (push (cons \"Overwriting\" f) success)
(incf ovw-count))
(push (cons \"Copying\" f) success)
(incf cpf-count)))
(file-error
(push (dired-make-relative
(expand-file-name
(file-name-nondirectory (directory-file-name f))
(file-name-directory \"%s\")))
failures))))
(with-current-buffer (find-file-noselect \"%s\")
(erase-buffer)
(when failures
(dolist (fail (reverse failures))
(insert (concat \"Failed to copy \" fail \"\n\"))))
(when success
(loop for (a . s) in (reverse success) do
(insert (concat a \" \" s \" to %s done\n\"))))
(and (/= cpf-count 0) (insert (concat (int-to-string cpf-count) \" File(s) Copied\n\")))
(and (/= ovw-count 0) (insert (concat (int-to-string ovw-count) \" File(s) Overwrited\n\")))
(and failures (insert (concat (int-to-string (length failures)) \" File(s) Failed to copy\n\")))
(save-buffer))))"
flist dest dest dest anything-c-copy-files-async-log-file dest)))
(defun anything-c-copy-async-with-log (flist dest)
"Copy file list FLIST to DEST showing log.
Log is send to `anything-c-copy-files-async-log-file'.
Copying is done asynchronously with `anything-c-copy-files-async-1'."
(declare (special auto-revert-interval))
(pop-to-buffer (find-file-noselect anything-c-copy-files-async-log-file))
(set (make-local-variable 'auto-revert-interval) 1)
(erase-buffer)
(insert "Wait copying files...\n")
(sit-for 0.5) (save-buffer)
(goto-char (point-max))
(auto-revert-mode 1)
(anything-c-copy-files-async-1 flist dest))
(defun anything-ff-copy-async (candidate)
"Anything find files action to copy files async.
Copying is done asynchronously with `anything-c-copy-files-async-1'."
(let* ((flist (anything-marked-candidates))
(dest (anything-c-read-file-name
(anything-find-files-set-prompt-for-action
"Copy Async" flist)
:preselect candidate
:initial-input (car anything-ff-history)
:history (anything-find-files-history :comp-read nil))))
(anything-c-copy-async-with-log flist dest)))
(defvar eshell-command-aliases-list nil)
(defvar anything-eshell-command-on-file-input-history nil)
(defun anything-find-files-eshell-command-on-file-1 (candidate &optional map)
"Run `eshell-command' on CANDIDATE or marked candidates.
This is done possibly with an eshell alias, if no alias found, you can type in
an eshell command.
Basename of CANDIDATE can be a wild-card.
e.g you can do \"eshell-command command *.el\"
Where \"*.el\" is the CANDIDATE.
It is possible to do eshell-command command <CANDIDATE> <some more args>
like this: \"command %s some more args\".
If MAP is given run `eshell-command' on all marked files at once,
Otherwise, run `eshell-command' on each marked files.
In other terms, with a prefix arg do on the three marked files
\"foo\" \"bar\" \"baz\":
\"eshell-command command foo bar baz\"
otherwise do
\"eshell-command command foo\"
\"eshell-command command bar\"
\"eshell-command command baz\"
Note:
If `eshell' or `eshell-command' have not been run once,
or if you have no eshell aliases `eshell-command-aliases-list'
will not be loaded first time you use this."
(when (or eshell-command-aliases-list
(y-or-n-p "Eshell is not loaded, run eshell-command without alias anyway? "))
(and eshell-command-aliases-list (eshell-read-aliases-list))
(let* ((cand-list (anything-marked-candidates))
(default-directory (or anything-ff-default-directory
;; If candidate is an url *-ff-default-directory is nil
;; so keep value of default-directory.
default-directory))
(command (anything-comp-read
"Command: "
(loop for (a . c) in eshell-command-aliases-list
when (string-match "\\(\\$1\\|\\$\\*\\)$" (car c))
collect (propertize a 'help-echo (car c)) into ls
finally return (sort ls 'string<))
:buffer "*esh command on file*"
:name "Eshell command"
:keymap anything-esh-on-file-map
:mode-line
'("Eshell alias"
"C-c ?: Help, \\[universal-argument]: Insert output at point")
:input-history
'anything-eshell-command-on-file-input-history))
(alias-value (car (assoc-default command eshell-command-aliases-list))))
(when (and (= (length cand-list) 1)
(string-match "[*]" (anything-c-basename (car cand-list))))
(setq cand-list (file-expand-wildcards (car cand-list) t)))
;; Be sure output don't go in current buffer
;; but allow sending output to current buffer
;; if a prefix arg have been passed during the
;; `anything-comp-read' call.
(setq current-prefix-arg anything-current-prefix-arg)
;; MAP have been set before calling `anything-comp-read'
;; by `anything-current-prefix-arg'.
(if (and (or map ; prefix-arg
(and alias-value
;; If command is an alias be sure it accept
;; more than one arg i.e $*.
(string-match "\\$\\*$" alias-value)))
(> (length cand-list) 1))
;; Run eshell-command with ALL marked files as arguments.
(let ((mapfiles (mapconcat 'shell-quote-argument cand-list " ")))
(if (string-match "'%s'\\|\"%s\"\\|%s" command)
(eshell-command (format command mapfiles)) ; See [1]
(eshell-command (format "%s %s" command mapfiles))))
;; Run eshell-command on EACH marked files.
(loop for i in cand-list
for bn = (anything-c-basename i)
for files = (format "'%s'" i)
for com = (if (string-match "'%s'\\|\"%s\"\\|%s" command)
;; [1] This allow to enter other args AFTER filename
;; i.e <command %s some_more_args>
(format command files)
(format "%s %s" command files))
do (eshell-command com))))))
(defun anything-find-files-eshell-command-on-file (candidate)
"Run `eshell-command' on CANDIDATE or marked candidates.
See `anything-find-files-eshell-command-on-file-1' for more info."
(anything-find-files-eshell-command-on-file-1
candidate anything-current-prefix-arg))
(defun anything-ff-switch-to-eshell (candidate)
"Switch to eshell and cd to `anything-ff-default-directory'."
(flet ((cd-eshell ()
(goto-char (point-max))
(insert
(format "cd '%s'" anything-ff-default-directory))
(eshell-send-input)))
(if (get-buffer "*eshell*")
(progn
(anything-c-switch-to-buffer "*eshell*")
(cd-eshell))
(call-interactively 'eshell)
(cd-eshell))))
(defun anything-ff-serial-rename-action (method)
"Rename all marked files to `anything-ff-default-directory' with METHOD.
See `anything-ff-serial-rename-1'."
(let* ((cands (anything-marked-candidates))
(def-name (car cands))
(name (read-string "NewName: "
(replace-regexp-in-string
"[0-9]+$" ""
(anything-c-basename
def-name
(file-name-extension def-name)))))
(start (read-number "StartAtNumber: "))
(extension (read-string "Extension: "
(file-name-extension (car cands))))
(dir (expand-file-name
(anything-c-read-file-name
"Serial Rename to directory: "
:initial-input
(expand-file-name anything-ff-default-directory)
:test 'file-directory-p
:must-match t)))
(res (loop for f in cands
for bn = (anything-c-basename f)
for count from start
concat (format "%s <-> %s%s.%s\n"
bn name count extension))))
(if (y-or-n-p
(format "Result:\n %sRename like this to <%s> ? " res dir))
(progn
(anything-ff-serial-rename-1
dir cands name start extension :method method)
(message nil)
(anything-find-files-1 dir))
(message "Operation aborted"))))
(defun anything-ff-member-directory-p (file directory)
(let ((dir-file (expand-file-name
(file-name-as-directory (file-name-directory file))))
(cur-dir (expand-file-name (file-name-as-directory directory))))
(string= dir-file cur-dir)))
(defun* anything-ff-serial-rename-1
(directory collection new-name start-at-num extension &key (method 'rename))
"rename files in COLLECTION to DIRECTORY with the prefix name NEW-NAME.
Rename start at number START-AT-NUM - ex: prefixname-01.jpg.
EXTENSION is the file extension to use, in empty prompt,
reuse the original extension of file.
METHOD can be one of rename, copy or symlink.
Files will be renamed if they are files of current directory, otherwise they
will be treated with METHOD.
Default METHOD is rename."
;; Maybe remove directories selected by error in collection.
(setq collection (remove-if 'file-directory-p collection))
(flet ((symlink-file (file dest)
(let ((flist (list file)))
(anything-dired-action
dest :action 'symlink :files flist))))
(let* ((tmp-dir (file-name-as-directory
(concat (file-name-as-directory directory)
(symbol-name (gensym "tmp")))))
(fn (case method
(copy 'copy-file)
(symlink 'symlink-file)
(rename 'rename-file)
(t (error "Error: Unknow method %s" method)))))
(make-directory tmp-dir)
(unwind-protect
(progn
;; Rename all files to tmp-dir with new-name.
;; If files are not from start directory, use method
;; to move files to tmp-dir.
(loop for i in collection
for count from start-at-num
for fnum = (if (< count 10) "0%s" "%s")
for nname = (concat tmp-dir new-name (format fnum count)
(if (not (string= extension ""))
(format ".%s" (replace-regexp-in-string
"[.]" "" extension))
(file-name-extension i 'dot)))
do (if (anything-ff-member-directory-p i directory)
(rename-file i nname)
(funcall fn i nname)))
;; Now move all from tmp-dir to destination.
(loop with dirlist = (directory-files
tmp-dir t directory-files-no-dot-files-regexp)
for f in dirlist do
(if (file-symlink-p f)
(symlink-file (file-truename f)
(concat (file-name-as-directory directory)
(anything-c-basename f)))
(rename-file f directory))))
(delete-directory tmp-dir t)))))
(defun anything-ff-serial-rename (candidate)
"Serial rename all marked files to `anything-ff-default-directory'.
Rename only file of current directory, and symlink files coming from
other directories.
See `anything-ff-serial-rename-1'."
(anything-ff-serial-rename-action 'rename))
(defun anything-ff-serial-rename-by-symlink (candidate)
"Serial rename all marked files to `anything-ff-default-directory'.
Rename only file of current directory, and symlink files coming from
other directories.
See `anything-ff-serial-rename-1'."
(anything-ff-serial-rename-action 'symlink))
(defun anything-ff-serial-rename-by-copying (candidate)
"Serial rename all marked files to `anything-ff-default-directory'.
Rename only file of current directory, and copy files coming from
other directories.
See `anything-ff-serial-rename-1'."
(anything-ff-serial-rename-action 'copy))
(defun anything-c-quit-and-execute-action (action)
"Quit current anything session and execute ACTION."
(setq anything-saved-action action)
(anything-exit-minibuffer))
(defun anything-ff-toggle-auto-update (candidate)
(setq anything-ff-auto-update-flag (not anything-ff-auto-update-flag))
(message "[Auto expansion %s]"
(if anything-ff-auto-update-flag "enabled" "disabled")))
;;;###autoload
(defun anything-ff-run-toggle-auto-update ()
(interactive)
(when (anything-file-completion-source-p)
(anything-attrset 'toggle-auto-update 'anything-ff-toggle-auto-update)
(anything-execute-persistent-action 'toggle-auto-update)))
;;;###autoload
(defun anything-ff-run-switch-to-history ()
"Run Switch to history action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-find-files-switch-to-hist)))
;;;###autoload
(defun anything-ff-run-grep ()
"Run Grep action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-find-files-grep)))
;;;###autoload
(defun anything-ff-run-pdfgrep ()
"Run Pdfgrep action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-ff-pdfgrep)))
;;;###autoload
(defun anything-ff-run-zgrep ()
"Run Grep action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-ff-zgrep)))
;;;###autoload
(defun anything-ff-run-copy-file ()
"Run Copy file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-find-files-copy)))
;;;###autoload
(defun anything-ff-run-rename-file ()
"Run Rename file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-find-files-rename)))
;;;###autoload
(defun anything-ff-run-byte-compile-file ()
"Run Byte compile file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-find-files-byte-compile)))
;;;###autoload
(defun anything-ff-run-load-file ()
"Run Load file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-find-files-load-files)))
;;;###autoload
(defun anything-ff-run-eshell-command-on-file ()
"Run eshell command on file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action
'anything-find-files-eshell-command-on-file)))
;;;###autoload
(defun anything-ff-run-ediff-file ()
"Run Ediff file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-find-files-ediff-files)))
;;;###autoload
(defun anything-ff-run-ediff-merge-file ()
"Run Ediff merge file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action
'anything-find-files-ediff-merge-files)))
;;;###autoload
(defun anything-ff-run-symlink-file ()
"Run Symlink file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-find-files-symlink)))
;;;###autoload
(defun anything-ff-run-hardlink-file ()
"Run Hardlink file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-find-files-hardlink)))
;;;###autoload
(defun anything-ff-run-delete-file ()
"Run Delete file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-delete-marked-files)))
;;;###autoload
(defun anything-ff-run-complete-fn-at-point ()
"Run complete file name action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action
'anything-c-insert-file-name-completion-at-point)))
;;;###autoload
(defun anything-ff-run-switch-to-eshell ()
"Run switch to eshell action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-ff-switch-to-eshell)))
;;;###autoload
(defun anything-ff-run-switch-other-window ()
"Run switch to other window action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'find-file-other-window)))
;;;###autoload
(defun anything-ff-run-switch-other-frame ()
"Run switch to other frame action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'find-file-other-frame)))
;;;###autoload
(defun anything-ff-run-open-file-externally ()
"Run open file externally command action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-c-open-file-externally)))
(defun anything-ff-locate (candidate)
"Locate action function for `anything-find-files'."
(let ((input (concat (anything-c-basename
(expand-file-name
candidate
anything-ff-default-directory))
;; The locate '-b' option doesn't exists
;; in everything.
(unless (and (eq system-type 'windows-nt)
(string-match "^es" anything-c-locate-command))
" -b")))
(anything-mp-highlight-delay 0.7))
(anything-locate-1 anything-current-prefix-arg input 'from-ff)))
;;;###autoload
(defun anything-ff-run-locate ()
"Run locate action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-ff-locate)))
;;;###autoload
(defun anything-ff-run-gnus-attach-files ()
"Run gnus attach files command action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-ff-gnus-attach-files)))
;;;###autoload
(defun anything-ff-run-etags ()
"Run Etags command action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-ff-etags-select)))
(defun anything-ff-print (candidate)
"Print marked files.
You have to set in order
variables `lpr-command',`lpr-switches' and/or `printer-name'.
e.g:
\(setq lpr-command \"gtklp\"\)
\(setq lpr-switches '(\"-P\")\)
\(setq printer-name \"Epson-Stylus-Photo-R265\"\)
Same as `dired-do-print' but for anything."
(when (or anything-current-prefix-arg
(not anything-ff-printer-list))
(setq anything-ff-printer-list
(anything-ff-find-printers)))
(let* ((file-list (anything-marked-candidates))
(len (length file-list))
(printer-name (if anything-ff-printer-list
(anything-comp-read
"Printer: " anything-ff-printer-list)
printer-name))
(command (read-string
(format "Print *%s File(s):\n%s with: "
len
(mapconcat
(lambda (f) (format "- %s\n" f))
file-list ""))
(when (and lpr-command
(or lpr-switches
printer-name))
(mapconcat 'identity
(cons lpr-command
(append (if (stringp lpr-switches)
(list lpr-switches)
lpr-switches)
(list printer-name)))
" "))))
(file-args (mapconcat #'(lambda (x)
(format "'%s'" x))
file-list " "))
(cmd-line (concat command " " file-args)))
(if command
(start-process-shell-command "anything-print" nil cmd-line)
(error "Error: Please verify your printer settings in Emacs."))))
;;;###autoload
(defun anything-ff-run-print-file ()
"Run Print file action from `anything-c-source-find-files'."
(interactive)
(when (anything-file-completion-source-p)
(anything-c-quit-and-execute-action 'anything-ff-print)))
(defun anything-ff-checksum (file)
"Calculate the checksum of FILE.
Provide completion on different algorithms to use on Emacs24.
On Emacs23 only 'sha1' is available.
The checksum is copied to kill-ring."
(let ((algo-list (and (fboundp 'secure-hash)
'(md5 sha1 sha224 sha256 sha384 sha512))))
(kill-new
(if algo-list
(secure-hash (intern
(anything-comp-read
"Algorithm: " algo-list))
file)
(sha1 (with-temp-buffer
(insert-file-contents file)
(buffer-string)))))
(message "Checksum copied to kill-ring.")))
(defun anything-ff-toggle-basename (candidate)
(setq anything-ff-transformer-show-only-basename
(not anything-ff-transformer-show-only-basename))
(let ((target (if anything-ff-transformer-show-only-basename
(anything-c-basename candidate) candidate)))
(anything-force-update target)))
(defun anything-ff-run-toggle-basename ()
(interactive)
(when (anything-file-completion-source-p)
(anything-attrset 'toggle-basename 'anything-ff-toggle-basename)
(anything-execute-persistent-action 'toggle-basename)))
(defun* anything-reduce-file-name (fname level &key unix-close expand)
"Reduce FNAME by LEVEL from end or beginning depending LEVEL value.
If LEVEL is positive reduce from end else from beginning.
If UNIX-CLOSE is non--nil close filename with /.
If EXPAND is non--nil expand-file-name."
(let* ((exp-fname (expand-file-name fname))
(fname-list (split-string (if (or (string= fname "~/") expand)
exp-fname fname) "/" t))
(len (length fname-list))
(pop-list (if (< level 0)
(subseq fname-list (* level -1))
(subseq fname-list 0 (- len level))))
(result (mapconcat 'identity pop-list "/"))
(empty (string= result "")))
(when unix-close (setq result (concat result "/")))
(if (string-match "^~" result)
(if (string= result "~/") "~/" result)
(if (< level 0)
(if empty "../" (concat "../" result))
(cond ((eq system-type 'windows-nt)
(if empty (expand-file-name "/") ; Expand to "/" or "c:/".
result))
(empty "/")
(t
(concat "/" result)))))))
;; Internal
(defvar anything-file-completion-sources
'("Find Files" "Read File Name"
"Read File Name History" "Copy Files"
"Rename Files" "Symlink Files"
"Hardlink Files" "Write File" "Insert File")
"Sources that use the *find-files mechanism can be added here.
Sources generated by `ac-mode' don't need to be added here, it will
be done automatically.
You should not modify this yourself unless you know what you do.")
(defun anything-file-completion-source-p ()
"Return non--nil if current source is a file completion source.
A source is a file completion source if it is
one of `anything-file-completion-sources'.
Return nil if anything is not running."
(let ((cur-source (cdr (assoc 'name (anything-get-current-source)))))
(loop for i in anything-file-completion-sources
thereis (string= cur-source i))))
(defun anything-find-files-down-one-level (arg)
"Go down one level like unix command `cd ..'.
If prefix numeric arg is given go ARG level down."
(interactive "p")
(when (and (anything-file-completion-source-p)
(not (anything-ff-invalid-tramp-name-p)))
(with-anything-window
(setq anything-follow-mode nil))
;; When going to precedent level we want to be at the line
;; corresponding to actual directory, so store this info
;; in `anything-ff-last-expanded'.
(if (and (not (file-directory-p anything-pattern))
(file-exists-p anything-pattern))
(setq anything-ff-last-expanded anything-pattern)
(setq anything-ff-last-expanded anything-ff-default-directory))
(let ((new-pattern (anything-reduce-file-name anything-pattern arg
:unix-close t :expand t)))
(anything-set-pattern new-pattern))))
(defun anything-ff-retrieve-last-expanded ()
"Move overlay to last visited directory `anything-ff-last-expanded'.
This happen after using `anything-find-files-down-one-level',
or hitting C-z on \"..\"."
(when (and anything-ff-last-expanded
(anything-file-completion-source-p))
(let ((presel (if anything-ff-transformer-show-only-basename
(anything-c-basename
(directory-file-name anything-ff-last-expanded))
(directory-file-name anything-ff-last-expanded))))
(with-anything-window
(when (re-search-forward
(concat "^" (regexp-quote presel) "$") nil t)
(forward-line 0)
(anything-mark-current-line)))
(setq anything-ff-last-expanded nil))))
(add-hook 'anything-after-update-hook 'anything-ff-retrieve-last-expanded)
;; Auto-update - anything-find-files auto expansion of directories.
;;
(defun anything-ff-update-when-only-one-matched ()
"Expand to directory when sole completion.
When only one candidate is remaining and it is a directory,
expand to this directory."
(when (and anything-ff-auto-update-flag
(anything-file-completion-source-p)
(not (anything-ff-invalid-tramp-name-p)))
(let* ((history-p (string= (assoc-default
'name (anything-get-current-source))
"Read File Name History"))
(pat (if (string-match tramp-file-name-regexp
anything-pattern)
(anything-create-tramp-name anything-pattern)
anything-pattern))
(completed-p (string= (file-name-as-directory pat)
anything-ff-default-directory)))
(when (and (or
;; Only one candidate remaining
;; and at least 2 char in basename.
(and (<= (anything-approximate-candidate-number) 2)
(>= (length (anything-c-basename anything-pattern)) 2))
;; Already completed.
completed-p)
(not history-p)) ; Don't try to auto complete in history.
(with-anything-window
(let ((cur-cand (prog2
(unless completed-p
;; Only one non--existing candidate
;; and one directory candidate, move to it.
(anything-next-line))
(anything-get-selection))))
(when (and (stringp cur-cand) (file-directory-p cur-cand))
(if (and (not (string-match "^.*[.]\\{1,2\\}$" cur-cand)) ; [1]
;; Maybe we are here because completed-p is true
;; but check this again to be sure. (Windows fix)
(<= (anything-approximate-candidate-number) 2)) ; [2]
;; If after going to next line the candidate
;; is not one of "." or ".." [1]
;; and only one candidate is remaining [2],
;; assume candidate is a new directory to expand, and do it.
(anything-set-pattern (file-name-as-directory cur-cand))
;; The candidate is one of "." or ".."
;; that mean we have entered the last letter of the directory name
;; in prompt, so expansion is already done, just add the "/" at end
;; of name unless anything-pattern ends with "."
;; (i.e we are writing something starting with ".")
(unless (string-match "^.*[.]\\{1\\}$" anything-pattern)
(anything-set-pattern
;; Need to expand-file-name to avoid e.g /ssh:host:./ in prompt.
(expand-file-name (file-name-as-directory anything-pattern)))))
(anything-check-minibuffer-input-1))))))))
(add-hook 'anything-after-update-hook 'anything-ff-update-when-only-one-matched)
;; Allow expanding to home directory or root
;; when entering respectively "~/" or "//" at end of pattern.
;; e.g /home/thierry/labo/anything-config-qp/~/
;; will expand to "~/"
;; and /home/thierry/labo/anything-config-qp//
;; will expand to "/"
(defun anything-ff-auto-expand-to-home-or-root ()
"Goto home, root or default directory when pattern ends with ~/, /, or ./.
This happen only in function using sources that are
`anything-file-completion-source-p' compliant."
(when (and (anything-file-completion-source-p)
(string-match ".*\\(/~/\\|/\\{2\\}\\|/[.]\\{1\\}/\\)$"
anything-pattern)
(not (string-match anything-ff-url-regexp anything-pattern)))
(let ((match (match-string 1 anything-pattern)))
(cond ((string= match "//")
;; Expand to "/" or "c:/"
(setq anything-pattern (expand-file-name "/")))
((string= match "/~/")
(if (eq system-type 'windows-nt)
(setq anything-pattern (file-name-as-directory (getenv "HOME")))
(setq anything-pattern "~/")))
((string= match "/./")
(setq anything-pattern
(with-anything-current-buffer
(expand-file-name default-directory))))))
(setq anything-ff-default-directory anything-pattern)
;; For some reasons, i must use here with-current-buffer => mini buffer
;; and not `anything-set-pattern' that use with-selected-window => mini win.
(with-current-buffer (window-buffer (minibuffer-window))
(delete-minibuffer-contents)
(insert anything-pattern))))
(add-hook 'anything-after-update-hook 'anything-ff-auto-expand-to-home-or-root)
(defun anything-c-point-file-in-dired (file)
"Put point on filename FILE in dired buffer."
(dired (file-name-directory file))
(dired-goto-file file))
(defun anything-create-tramp-name (fname)
"Build filename for `anything-pattern' like /su:: or /sudo::."
(apply #'tramp-make-tramp-file-name
(loop with v = (tramp-dissect-file-name fname)
for i across v collect i)))
(defun* anything-ff-tramp-hostnames (&optional (pattern anything-pattern))
"Get a list of hosts for tramp method found in `anything-pattern'.
Argument PATTERN default to `anything-pattern', it is here only for debugging
purpose."
(when (string-match tramp-file-name-regexp pattern)
(let ((method (match-string 1 pattern))
(tn (match-string 0 pattern))
(all-methods (mapcar 'car tramp-methods)))
(anything-fast-remove-dups
(loop for (f . h) in (tramp-get-completion-function method)
append (loop for e in (funcall f (car h))
for host = (and (consp e) (cadr e))
when (and host (not (member host all-methods)))
collect (concat tn host)))
:test 'equal))))
(defun anything-ff-before-action-hook-fn ()
"Exit anything when user try to execute action on an invalid tramp fname."
(let ((cand (anything-get-selection)))
(when (and (anything-file-completion-source-p)
(anything-ff-invalid-tramp-name-p cand) ; Check candidate.
(anything-ff-invalid-tramp-name-p)) ; check anything-pattern.
(error "Error: Unknow file or directory `%s'" cand))))
(add-hook 'anything-before-action-hook 'anything-ff-before-action-hook-fn)
(defun* anything-ff-invalid-tramp-name-p (&optional (pattern anything-pattern))
"Return non--nil when PATTERN is an invalid tramp filename."
(string= (anything-ff-set-pattern pattern)
"Invalid tramp file name"))
(defun anything-ff-set-pattern (pattern)
"Handle tramp filenames in `anything-pattern'."
(let ((methods (mapcar 'car tramp-methods))
(reg "\\`/\\([^[/:]+\\|[^/]+]\\):.*:")
cur-method tramp-name)
(cond ((string= pattern "") "")
((string-match ".*\\(~?/?[.]\\{1\\}/\\)$" pattern)
(with-anything-current-buffer
(expand-file-name default-directory)))
((and (string-match ".*\\(~//\\|//\\)$" pattern)
(not (string-match anything-ff-url-regexp anything-pattern)))
(expand-file-name "/") ; Expand to "/" or "c:/"
)
((string-match "^~\\|.*/~/$" pattern)
(let* ((home (expand-file-name (getenv "HOME"))))
(replace-match home nil t pattern)))
;; Match "/method:maybe_hostname:"
((and (string-match reg pattern)
(setq cur-method (match-string 1 pattern))
(member cur-method methods))
(setq tramp-name (anything-create-tramp-name
(match-string 0 pattern)))
(replace-match tramp-name nil t pattern))
;; Match "/hostname:"
((and (string-match tramp-file-name-regexp pattern)
(setq cur-method (match-string 1 pattern))
(and cur-method (not (member cur-method methods))))
(setq tramp-name (anything-create-tramp-name
(match-string 0 pattern)))
(replace-match tramp-name nil t pattern))
;; Match "/method:" in this case don't try to connect.
((and (not (string-match reg pattern))
(string-match tramp-file-name-regexp pattern)
(member (match-string 1 pattern) methods))
"Invalid tramp file name") ; Write in anything-buffer.
;; PATTERN is a directory, end it with "/".
;; This will make PATTERN not ending yet with "/"
;; candidate for `anything-ff-default-directory',
;; allowing `anything-ff-retrieve-last-expanded' to retrieve it
;; when descending level.
((file-directory-p pattern)
(file-name-as-directory pattern))
;; Return PATTERN unchanged.
(t pattern))))
(defun anything-find-files-get-candidates (&optional require-match)
"Create candidate list for `anything-c-source-find-files'."
(let* ((path (anything-ff-set-pattern anything-pattern))
(path-name-dir (if (file-directory-p path)
(file-name-as-directory path)
(file-name-directory path)))
(tramp-verbose anything-tramp-verbose)) ; No tramp message when 0.
(set-text-properties 0 (length path) nil path)
;; Don't set now `anything-pattern' if `path' == "Invalid tramp file name"
;; like that the actual value (e.g /ssh:) is passed to
;; `anything-ff-tramp-hostnames'.
(unless (string= path "Invalid tramp file name")
(setq anything-pattern (anything-ff-transform-fname-for-completion path)))
(setq anything-ff-default-directory
(if (string= anything-pattern "")
(expand-file-name "/") ; Expand to "/" or "c:/"
;; If path is an url *default-directory have to be nil.
(unless (or (string-match anything-ff-url-regexp path)
(string-match ffap-url-regexp path))
path-name-dir)))
(cond ((string= path "Invalid tramp file name")
(or (anything-ff-tramp-hostnames) ; Hostnames completion.
(prog2
;; `anything-pattern' have not been modified yet.
;; Set it here to the value of `path' that should be now
;; "Invalid tramp file name" and set the candidates list
;; to ("Invalid tramp file name") to make `anything-pattern'
;; match single candidate "Invalid tramp file name".
(setq anything-pattern path)
;; "Invalid tramp file name" is now printed
;; in `anything-buffer'.
(list path))))
((or (file-regular-p path)
;; `ffap-url-regexp' don't match until url is complete.
(string-match anything-ff-url-regexp path)
(and (not (file-exists-p path)) (string-match "/$" path))
(and ffap-url-regexp (string-match ffap-url-regexp path)))
(list path))
((string= path "") (anything-ff-directory-files "/" t))
((and (file-directory-p path) (not (file-readable-p path)))
(list (format "Opening directory: access denied, `%s'" path)))
((file-directory-p path) (anything-ff-directory-files path t))
(t
(append (unless require-match (list path))
(anything-ff-directory-files path-name-dir t))))))
(defun anything-ff-directory-files (directory &optional full)
"List contents of DIRECTORY.
Argument FULL mean absolute path.
It is same as `directory-files' but always returns the
dotted filename '.' and '..' on root directories on Windows
systems."
(setq directory (expand-file-name directory))
(let ((ls (directory-files directory full))
dot dot2 lsdir)
(if (or
;; A windows volume.
(string-match "^[a-zA-Z]\\{1\\}:/$" directory)
;; Empty directories on ftp hosts may have no dot dirs.
(and (file-remote-p directory)
(string-match "^/ftp:" directory)))
(progn (setq dot (concat directory "."))
(setq dot2 (concat directory ".."))
(setq lsdir (remove dot2 (remove dot ls)))
(append (list dot dot2) lsdir))
ls)))
(defun anything-ff-transform-fname-for-completion (fname)
"Return FNAME with it's basename modified as a regexp.
e.g foo => f.*o.*o .
If basename contain one or more space or FNAME is a valid directory name
return FNAME unchanged."
(let ((bn (anything-c-basename fname)))
(if (or (not anything-ff-smart-completion)
(string-match "\\s-" bn)
(string-match "/$" fname) ; Allow mkdir.
(file-directory-p fname)
(string-match anything-ff-url-regexp fname))
fname ; Fall back to match-plugin.
(setq bn (if (> (length bn) 2) ; Normal completion on first 2 char.
(mapconcat 'identity (split-string bn "" t) ".*") bn))
(concat (file-name-directory fname) bn))))
(defun anything-ff-save-history ()
"Store the last value of `anything-ff-default-directory' \
in `anything-ff-history'."
(when (and anything-ff-default-directory
(anything-file-completion-source-p))
(push anything-ff-default-directory anything-ff-history)))
(add-hook 'anything-cleanup-hook 'anything-ff-save-history)
(defun anything-ff-valid-symlink-p (file)
(file-exists-p (file-truename file)))
(defun anything-ff-properties (candidate)
"Show file properties of CANDIDATE in a tooltip or message."
(let ((type (anything-ff-attributes candidate :type t))
(dired-line (anything-ff-attributes candidate :dired t :human-size t)))
(if (window-system)
(tooltip-show
(concat
(anything-c-basename candidate) "\n"
"Type: " type "\n"
(when (string= type "symlink")
(format "True name: '%s'\n"
(cond ((string-match "^\.#" (anything-c-basename candidate))
"Autosave symlink")
((anything-ff-valid-symlink-p candidate)
(file-truename candidate))
(t "Invalid Symlink"))))
dired-line))
(message dired-line) (sit-for 5))))
;;;###autoload
(defun anything-ff-properties-persistent ()
"Show properties without quitting anything."
(interactive)
(anything-attrset 'properties-action 'anything-ff-properties)
(anything-execute-persistent-action 'properties-action))
;;;###autoload
(defun anything-ff-persistent-delete ()
"Delete current candidate without quitting."
(interactive)
(anything-attrset 'quick-delete 'anything-ff-quick-delete)
(anything-execute-persistent-action 'quick-delete))
(defun anything-ff-dot-file-p (file)
"Check if FILE is `.' or `..'."
(member (anything-c-basename file) '("." "..")))
(defun anything-ff-quick-delete (candidate)
"Delete file CANDIDATE without quitting."
(let ((presel (prog1 (save-excursion
(let (sel)
(anything-next-line)
(setq sel (anything-get-selection))
(if (string= sel candidate)
(progn (anything-previous-line)
(anything-get-selection))
sel)))
(anything-mark-current-line))))
(setq presel (if (and anything-ff-transformer-show-only-basename
(not (anything-ff-dot-file-p presel)))
(anything-c-basename presel) presel))
(if anything-ff-quick-delete-dont-prompt-for-deletion
(anything-c-delete-file candidate
anything-ff-signal-error-on-dot-files)
(save-selected-window
(when (y-or-n-p (format "Really Delete file `%s'? " candidate))
(anything-c-delete-file candidate
anything-ff-signal-error-on-dot-files)
(message nil))))
(anything-force-update presel)))
(defun anything-ff-kill-buffer-fname (candidate)
(let* ((buf (get-file-buffer candidate))
(buf-name (buffer-name buf)))
(if buf
(progn
(kill-buffer buf) (message "Buffer `%s' killed" buf))
(message "No buffer to kill"))))
(defun anything-ff-kill-or-find-buffer-fname (candidate)
"Find file CANDIDATE or kill it's buffer if it is visible.
Never kill `anything-current-buffer'.
Never kill buffer modified.
This is called normally on third hit of \
\\<anything-map>\\[anything-execute-persistent-action]
in `anything-find-files-persistent-action'."
(let* ((buf (get-file-buffer candidate))
(buf-name (buffer-name buf)))
(if (and buf (get-buffer-window buf)
(not (eq buf (get-buffer anything-current-buffer)))
(not (buffer-modified-p buf)))
(progn
(kill-buffer buf) (message "Buffer `%s' killed" buf-name))
(find-file candidate))))
;;;###autoload
(defun anything-ff-run-kill-buffer-persistent ()
"Execute `anything-ff-kill-buffer-fname' whitout quitting."
(interactive)
(when (anything-file-completion-source-p)
(anything-attrset 'kill-buffer-fname 'anything-ff-kill-buffer-fname)
(anything-execute-persistent-action 'kill-buffer-fname)))
(defun anything-ff-human-size (size)
"Return a string showing SIZE of a file in human readable form.
SIZE can be an integer or a float depending it's value.
`file-attributes' will take care of that to avoid overflow error.
KBSIZE if a floating point number, default value is 1024.0."
(let ((M (cons "M" (/ size (expt anything-ff-default-kbsize 2))))
(G (cons "G" (/ size (expt anything-ff-default-kbsize 3))))
(K (cons "K" (/ size anything-ff-default-kbsize)))
(B (cons "B" size)))
(loop with result = B
for (a . b) in
(loop for (x . y) in (list M G K B)
unless (< y 1) collect (cons x y))
when (< b (cdr result)) do (setq result (cons a b))
finally return (if (string= (car result) "B")
(format "%s" size)
(format "%.1f%s" (cdr result) (car result))))))
(defun* anything-ff-attributes
(file &key type links uid gid access-time modif-time
status size mode gid-change inode device-num dired human-size)
"Easy interface for `file-attributes'."
(let ((all (destructuring-bind
(type links uid gid access-time modif-time
status size mode gid-change inode device-num)
(file-attributes file 'string)
(list :type type
:links links
:uid uid
:gid gid
:access-time access-time
:modif-time modif-time
:status status
:size size
:mode mode
:gid-change gid-change
:inode inode
:device-num device-num))))
(cond (type
(let ((result (getf all :type)))
(cond ((stringp result)
"symlink")
(result "directory")
(t "file"))))
(links (getf all :links))
(uid (getf all :uid))
(gid (getf all :gid))
(access-time
(format-time-string "%Y-%m-%d %R" (getf all :access-time)))
(modif-time
(format-time-string "%Y-%m-%d %R" (getf all :modif-time)))
(status
(format-time-string "%Y-%m-%d %R" (getf all :status)))
(size (if human-size (anything-ff-human-size (getf all :size))
(getf all :size)))
(mode (getf all :mode))
(gid-change (getf all :gid-change))
(inode (getf all :inode))
(device-num (getf all :device-num))
(dired
(concat
(getf all :mode) " "
(number-to-string (getf all :links)) " "
(getf all :uid) ":"
(getf all :gid) " "
(if human-size (anything-ff-human-size (getf all :size))
(int-to-string (getf all :size))) " "
(format-time-string "%Y-%m-%d %R" (getf all :modif-time))))
(t all))))
(defun anything-ff-prefix-filename (fname &optional file-or-symlinkp new-file)
"Return filename FNAME maybe prefixed with [?] or [@].
If FILE-OR-SYMLINKP is non--nil this mean we assume FNAME is an
existing filename or valid symlink and there is no need to test it.
NEW-FILE when non--nil mean FNAME is a non existing file and
return FNAME prefixed with [?]."
(let* ((prefix-new (propertize
" " 'display
(propertize "[?]" 'face 'anything-ff-prefix)))
(prefix-url (propertize
" " 'display
(propertize "[@]" 'face 'anything-ff-prefix))))
(cond ((or file-or-symlinkp (file-exists-p fname)) fname)
((or (string-match anything-ff-url-regexp fname)
(string-match ffap-url-regexp fname))
(concat prefix-url " " fname))
((or new-file (not (file-exists-p fname)))
(concat prefix-new " " fname)))))
(defun anything-c-find-files-transformer (files sources)
"Transformer for `anything-c-source-find-files'.
Tramp files are not highlighted unless `anything-ff-tramp-not-fancy'
is non--nil."
(if (and (string-match tramp-file-name-regexp anything-pattern)
anything-ff-tramp-not-fancy)
(if anything-ff-transformer-show-only-basename
(loop for i in files collect
(if (string-match "[.]\\{1,2\\}$" i)
i (cons (anything-c-basename i) i)))
files)
(anything-ff-highlight-files files sources)))
(defun anything-ff-highlight-files (files sources)
"Candidate transformer for `anything-c-source-find-files' without icons."
(loop for i in files
for disp = (if (and anything-ff-transformer-show-only-basename
(not (string-match "[.]\\{1,2\\}$" i))
(not (string-match ffap-url-regexp i))
(not (string-match anything-ff-url-regexp i)))
(anything-c-basename i) i)
collect
(cond ((and (stringp (car (file-attributes i)))
(not (anything-ff-valid-symlink-p i))
(not (string-match "^\.#" (anything-c-basename i))))
(cons (anything-ff-prefix-filename
(propertize disp 'face 'anything-ff-invalid-symlink) t)
i))
((stringp (car (file-attributes i)))
(cons (anything-ff-prefix-filename
(propertize disp 'face 'anything-ff-symlink) t)
i))
((eq t (car (file-attributes i)))
(cons (anything-ff-prefix-filename
(propertize disp 'face 'anything-ff-directory) t)
i))
((file-executable-p i)
(cons (anything-ff-prefix-filename
(propertize disp 'face 'anything-ff-executable) t)
i))
((file-exists-p i)
(cons (anything-ff-prefix-filename
(propertize disp 'face 'anything-ff-file) t)
i))
(t
(cons (anything-ff-prefix-filename
(propertize disp 'face 'anything-ff-file) nil 'new-file)
i)))))
(defun anything-find-files-action-transformer (actions candidate)
"Action transformer for `anything-c-source-find-files'."
(cond ((with-anything-current-buffer
(eq major-mode 'message-mode))
(append (subseq actions 0 4)
'(("Gnus attach file(s)" . anything-ff-gnus-attach-files))
(subseq actions 4)))
((string-match (image-file-name-regexp) candidate)
(append (subseq actions 0 4)
'(("Rotate image right `M-r'" . anything-ff-rotate-image-right)
("Rotate image left `M-l'" . anything-ff-rotate-image-left))
(subseq actions 4)))
((string-match "\.el$" (anything-aif (anything-marked-candidates)
(car it) candidate))
(append (subseq actions 0 4)
'(("Byte compile lisp file(s) `M-B, C-u to load'"
. anything-find-files-byte-compile)
("Load File(s) `M-L'" . anything-find-files-load-files))
(subseq actions 4)))
((and (string-match "\.html?$" candidate)
(file-exists-p candidate))
(append (subseq actions 0 4)
'(("Browse url file" . browse-url-of-file))
(subseq actions 5)))
((or (string= (file-name-extension candidate) "pdf")
(string= (file-name-extension candidate) "PDF"))
(append (subseq actions 0 4)
'(("Pdfgrep File(s)" . anything-ff-pdfgrep))
(subseq actions 5)))
(t actions)))
(defun anything-ff-gnus-attach-files (candidate)
"Run `gnus-dired-attach' on `anything-marked-candidates' or CANDIDATE."
(let ((flist (anything-marked-candidates)))
(gnus-dired-attach flist)))
(defun anything-ff-rotate-current-image-1 (file &optional num-arg)
"Rotate current image at NUM-ARG degrees.
This is a destructive operation on FILE made by external tool mogrify."
(declare (special image-dired-display-image-buffer))
(setq file (file-truename file)) ; For symlinked images.
;; When FILE is not an image-file, do nothing.
(when (string-match (image-file-name-regexp) file)
(if (executable-find "mogrify")
(progn
(shell-command (format "mogrify -rotate %s %s"
(or num-arg 90)
(shell-quote-argument file)))
(when (buffer-live-p image-dired-display-image-buffer)
(kill-buffer image-dired-display-image-buffer))
(image-dired-display-image file)
(message nil)
(display-buffer (get-buffer image-dired-display-image-buffer)))
(error "mogrify not found"))))
(defun anything-ff-rotate-image-left (candidate)
"Rotate image file CANDIDATE left.
This affect directly file CANDIDATE."
(anything-ff-rotate-current-image-1 candidate -90))
(defun anything-ff-rotate-image-right (candidate)
"Rotate image file CANDIDATE right.
This affect directly file CANDIDATE."
(anything-ff-rotate-current-image-1 candidate))
(defun anything-ff-rotate-left-persistent ()
"Rotate image left without quitting anything."
(interactive)
(anything-attrset 'image-action1 'anything-ff-rotate-image-left)
(anything-execute-persistent-action 'image-action1))
(defun anything-ff-rotate-right-persistent ()
"Rotate image right without quitting anything."
(interactive)
(anything-attrset 'image-action2 'anything-ff-rotate-image-right)
(anything-execute-persistent-action 'image-action2))
(defun anything-ff-exif-data (candidate)
"Extract exif data from file CANDIDATE using `anything-ff-exif-data-program'."
(if (and anything-ff-exif-data-program
(executable-find anything-ff-exif-data-program))
(shell-command-to-string (format "%s %s %s"
anything-ff-exif-data-program
anything-ff-exif-data-program-args
candidate))
(format "No program %s found to extract exif"
anything-ff-exif-data-program)))
(defun anything-find-files-persistent-action (candidate)
"Open subtree CANDIDATE without quitting anything.
If CANDIDATE is not a directory expand CANDIDATE filename.
If CANDIDATE is alone, open file CANDIDATE filename.
That's mean:
First hit on C-z expand CANDIDATE second hit open file.
If a prefix arg is given or `anything-follow-mode' is on open file."
(let ((follow (buffer-local-value
'anything-follow-mode
(get-buffer-create anything-buffer)))
(new-pattern (anything-get-selection))
(num-lines-buf (with-current-buffer anything-buffer
(count-lines (point-min) (point-max)))))
(flet ((insert-in-minibuffer (fname)
(with-selected-window (minibuffer-window)
(unless follow
(delete-minibuffer-contents)
(set-text-properties 0 (length fname) nil fname)
(insert fname)))))
(cond ((and (string= (anything-ff-set-pattern anything-pattern)
"Invalid tramp file name")
(string-match tramp-file-name-regexp candidate))
;; First hit insert hostname and
;; second hit insert ":" and expand.
(if (string= candidate anything-pattern)
(insert-in-minibuffer (concat candidate ":"))
(insert-in-minibuffer candidate)))
(;; A symlink directory, expand it's truename.
(and (file-directory-p candidate) (file-symlink-p candidate))
(insert-in-minibuffer (file-name-as-directory
(file-truename
(expand-file-name candidate)))))
;; A directory, open it.
((file-directory-p candidate)
(when (string= (anything-c-basename candidate) "..")
(setq anything-ff-last-expanded anything-ff-default-directory))
(insert-in-minibuffer (file-name-as-directory
(expand-file-name candidate))))
;; A symlink file, expand to it's true name. (first hit)
((and (file-symlink-p candidate) (not current-prefix-arg) (not follow))
(insert-in-minibuffer (file-truename candidate)))
;; A regular file, expand it, (first hit)
((and (>= num-lines-buf 3) (not current-prefix-arg) (not follow))
(insert-in-minibuffer new-pattern))
;; An image file and it is the second hit on C-z,
;; show the file in `image-dired'.
((string-match (image-file-name-regexp) candidate)
(when (buffer-live-p image-dired-display-image-buffer)
(kill-buffer image-dired-display-image-buffer))
(image-dired-display-image candidate)
(message nil)
(anything-c-switch-to-buffer image-dired-display-image-buffer)
(with-current-buffer image-dired-display-image-buffer
(let ((exif-data (anything-ff-exif-data candidate)))
(image-dired-update-property 'help-echo exif-data))))
;; Allow browsing archive on avfs fs.
;; Assume volume is already mounted with mountavfs.
((and anything-ff-avfs-directory
(string-match
(regexp-quote (expand-file-name anything-ff-avfs-directory))
(file-name-directory candidate))
(anything-ff-file-compressed-p candidate))
(insert-in-minibuffer (concat candidate "#")))
;; On second hit we open file.
;; On Third hit we kill it's buffer maybe.
(t
(anything-ff-kill-or-find-buffer-fname candidate))))))
(defun anything-ff-file-compressed-p (candidate)
"Whether CANDIDATE is a compressed file or not."
(member (file-name-extension candidate)
anything-ff-file-compressed-list))
(defun anything-c-insert-file-name-completion-at-point (candidate)
"Insert file name completion at point."
(with-anything-current-buffer
(if buffer-read-only
(error "Error: Buffer `%s' is read-only" (buffer-name))
(let* ((end (point))
(guess (substring-no-properties (thing-at-point 'filename)))
(beg (- (point) (length guess)))
(full-path-p (or (string-match-p (concat "^" (getenv "HOME")) guess)
(string-match-p "^[^\~]" guess))))
(set-text-properties 0 (length candidate) nil candidate)
(if (and guess (not (string= guess ""))
(string-match-p "^~\\|/.*" guess))
(progn
(delete-region beg end)
(insert (if full-path-p
(expand-file-name candidate)
(abbreviate-file-name candidate))))
(error "Aborting completion: No valid file name at point"))))))
(defun* anything-find-files-history (&key (comp-read t))
"The `anything-find-files' history.
Show the first `anything-ff-history-max-length' elements of
`anything-ff-history' in an `anything-comp-read'."
(let ((history (when anything-ff-history
(anything-fast-remove-dups anything-ff-history
:test 'equal))))
(when history
(setq anything-ff-history
(if (>= (length history) anything-ff-history-max-length)
(subseq history 0 anything-ff-history-max-length)
history))
(if comp-read
(anything-comp-read
"Switch to Directory: "
anything-ff-history
:name "Anything Find Files History"
:must-match t)
anything-ff-history))))
(defun anything-find-files-1 (fname &optional preselect)
"Find FNAME with `anything' completion.
Like `find-file' but with `anything' support.
Use it for non--interactive calls of `anything-find-files'."
(when (get-buffer anything-action-buffer)
(kill-buffer anything-action-buffer))
(let ((anything-mp-highlight-delay nil)
;; Be sure we don't erase the precedent minibuffer if some.
(anything-ff-auto-update-initial-value
(and anything-ff-auto-update-initial-value
(not (minibuffer-window-active-p (minibuffer-window)))))
anything-samewindow)
(anything :sources 'anything-c-source-find-files
:input fname
:preselect preselect
:keymap anything-find-files-map
:prompt "Find Files or Url: "
:buffer "*Anything Find Files*")))
(defun anything-find-files-initial-input (&optional input)
"Return INPUT if present, otherwise try to guess it."
(or (and input (or (and (file-remote-p input) input)
(expand-file-name input)))
(anything-find-files-input
(ffap-guesser)
(thing-at-point 'filename))))
(defun anything-find-files-input (fap tap)
"Default input of `anything-find-files'."
(let* ((def-dir (anything-c-current-directory))
(lib (anything-find-library-at-point))
(url (anything-ff-find-url-at-point))
(remp (and fap (file-remote-p fap)))
(file-p (and (not remp)
fap
(not (string= fap ""))
(file-exists-p fap)
tap (not (string= tap ""))
(file-exists-p
(file-name-directory (expand-file-name tap def-dir))))))
(cond (lib) ; e.g we are inside a require sexp.
(url) ; String at point is an hyperlink.
(remp fap)
(file-p (expand-file-name tap def-dir))
(t (and (not (string= fap "")) fap)))))
(defun anything-c-current-directory ()
"Return current-directory name at point.
Useful in dired buffers when there is inserted subdirs."
(if (eq major-mode 'dired-mode)
(dired-current-directory)
default-directory))
(defun anything-ff-find-url-at-point ()
"Try to find link to an url in text-property at point."
(let* ((he (get-text-property (point) 'help-echo))
(ov (overlays-at (point)))
(ov-he (and ov (overlay-get
(car (overlays-at (point))) 'help-echo)))
(w3m-l (get-text-property (point) 'w3m-href-anchor))
(nt-prop (get-text-property (point) 'nt-link)))
;; Org link.
(when (and (stringp he) (string-match "^LINK: " he))
(setq he (replace-match "" t t he)))
(loop for i in (list he ov-he w3m-l nt-prop)
thereis (and (stringp i) (string-match ffap-url-regexp i) i))))
(defun anything-find-library-at-point ()
"Try to find library path at point.
Find inside `require' and `declare-function' sexp."
(require 'find-func)
(let* ((beg-sexp (save-excursion (search-backward "(" (point-at-bol) t)))
(end-sexp (save-excursion (search-forward ")" (point-at-eol) t)))
(sexp (and beg-sexp end-sexp
(buffer-substring-no-properties
(1+ beg-sexp) (1- end-sexp)))))
(ignore-errors
(cond ((and sexp (string-match "require \'.+[^)]" sexp))
(find-library-name
(replace-regexp-in-string
"'\\|\)\\|\(" ""
;; If require use third arg, ignore it,
;; always use library path found in `load-path'.
(second (split-string (match-string 0 sexp))))))
((and sexp (string-match-p "^declare-function" sexp))
(find-library-name
(replace-regexp-in-string
"\"\\|ext:" ""
(third (split-string sexp)))))
(t nil)))))
;;; Anything completion for `write-file'.==> C-x C-w
(defvar anything-c-source-write-file
`((name . "Write File")
(header-name . (lambda (name)
(concat name anything-c-find-files-doc-header)))
;; It is needed for filenames with capital letters
(disable-shortcuts)
(candidates . anything-find-files-get-candidates)
(filtered-candidate-transformer anything-c-find-files-transformer)
(persistent-action . anything-find-files-persistent-action)
(persistent-help . "Expand Candidate")
(volatile)
(action .
(("Write File" . (lambda (candidate)
(write-file candidate 'confirm)))))))
;;; Anything completion for `insert-file'.==> C-x i
(defvar anything-c-source-insert-file
`((name . "Insert File")
(header-name . (lambda (name)
(concat name anything-c-find-files-doc-header)))
;; It is needed for filenames with capital letters
(disable-shortcuts)
(candidates . anything-find-files-get-candidates)
(filtered-candidate-transformer anything-c-find-files-transformer)
(persistent-action . anything-find-files-persistent-action)
(persistent-help . "Expand Candidate")
(volatile)
(action .
(("Insert File" . (lambda (candidate)
(when (y-or-n-p (format "Really insert %s in %s "
candidate anything-current-buffer))
(insert-file-contents candidate))))))))
;;; Anything completion for copy, rename and (rel)sym/hard/link files from dired.
(defvar anything-c-source-copy-files
`((name . "Copy Files")
(header-name . (lambda (name)
(concat name anything-c-find-files-doc-header)))
;; It is needed for filenames with capital letters
(disable-shortcuts)
(candidates . anything-find-files-get-candidates)
(filtered-candidate-transformer anything-c-find-files-transformer)
(persistent-action . anything-find-files-persistent-action)
(persistent-help . "Expand Candidate")
(volatile)
(action .
(("Copy File"
. (lambda (candidate)
(anything-dired-action candidate :action 'copy)))
("Copy and Follow"
. (lambda (candidate)
(anything-dired-action candidate :action 'copy :follow t)))))))
(defvar anything-c-source-rename-files
`((name . "Rename Files")
(header-name . (lambda (name)
(concat name anything-c-find-files-doc-header)))
;; It is needed for filenames with capital letters
(disable-shortcuts)
(candidates . anything-find-files-get-candidates)
(filtered-candidate-transformer anything-c-find-files-transformer)
(persistent-action . anything-find-files-persistent-action)
(persistent-help . "Expand Candidate")
(volatile)
(action .
(("Rename File"
. (lambda (candidate)
(anything-dired-action candidate :action 'rename)))
("Rename and Follow"
. (lambda (candidate)
(anything-dired-action candidate :action 'rename :follow t)))))))
(defvar anything-c-source-symlink-files
`((name . "Symlink Files")
(header-name . (lambda (name)
(concat name anything-c-find-files-doc-header)))
;; It is needed for filenames with capital letters
(disable-shortcuts)
(candidates . anything-find-files-get-candidates)
(filtered-candidate-transformer anything-c-find-files-transformer)
(persistent-action . anything-find-files-persistent-action)
(persistent-help . "Expand Candidate")
(volatile)
(action
. (("Symlink File"
. (lambda (candidate)
(anything-dired-action candidate :action 'symlink)))
("RelSymlink File"
. (lambda (candidate)
(anything-dired-action candidate :action 'relsymlink)))))))
(defvar anything-c-source-hardlink-files
`((name . "Hardlink Files")
(header-name . (lambda (name)
(concat name anything-c-find-files-doc-header)))
;; It is needed for filenames with capital letters
(disable-shortcuts)
(candidates . anything-find-files-get-candidates)
(filtered-candidate-transformer anything-c-find-files-transformer)
(persistent-action . anything-find-files-persistent-action)
(persistent-help . "Expand Candidate")
(volatile)
(action
. (("Hardlink File"
. (lambda (candidate)
(anything-dired-action candidate :action 'hardlink)))))))
(defun* anything-dired-action (candidate &key action follow (files (dired-get-marked-files)))
"Copy, rename or symlink file at point or marked files in dired to CANDIDATE.
ACTION is a key that can be one of 'copy, 'rename, 'symlink, 'relsymlink."
(when (get-buffer dired-log-buffer) (kill-buffer dired-log-buffer))
(let ((fn (case action
('copy 'dired-copy-file)
('rename 'dired-rename-file)
('symlink 'make-symbolic-link)
('relsymlink 'dired-make-relative-symlink)
('hardlink 'dired-hardlink)))
(marker (case action
((copy rename) dired-keep-marker-copy)
('symlink dired-keep-marker-symlink)
('relsymlink dired-keep-marker-relsymlink)
('hardlink dired-keep-marker-hardlink)))
(dirflag (and (= (length files) 1)
(file-directory-p (car files))
(not (file-directory-p candidate)))))
(dired-create-files
fn (symbol-name action) files
;; CANDIDATE is the destination.
(if (file-directory-p candidate)
;; When CANDIDATE is a directory, build file-name in this directory.
;; Else we use CANDIDATE.
#'(lambda (from)
(expand-file-name (file-name-nondirectory from) candidate))
#'(lambda (from) candidate))
marker)
(push (file-name-as-directory
(if (file-directory-p candidate)
(expand-file-name candidate)
(file-name-directory candidate)))
anything-ff-history)
(when (and follow (not (get-buffer dired-log-buffer)))
(let ((target (directory-file-name candidate)))
(unwind-protect
(progn
(setq anything-ff-cand-to-mark
(anything-get-dest-fnames-from-list files candidate dirflag))
(if (and dirflag (eq action 'rename))
(anything-find-files-1 (file-name-directory target)
(if anything-ff-transformer-show-only-basename
(anything-c-basename target) target))
(anything-find-files-1 (expand-file-name candidate))))
(setq anything-ff-cand-to-mark nil))))))
(defun anything-c-basename (fname &optional ext)
"Print FNAME with any leading directory components removed.
If specified, also remove filename extension EXT."
(if (and ext (or (string= (file-name-extension fname) ext)
(string= (file-name-extension fname t) ext))
(not (file-directory-p fname)))
(file-name-sans-extension (file-name-nondirectory fname))
(file-name-nondirectory (directory-file-name fname))))
(defun anything-get-dest-fnames-from-list (flist dest-cand rename-dir-flag)
"Transform filenames of FLIST to abs of DEST-CAND.
If RENAME-DIR-FLAG is non--nil collect the `directory-file-name' of transformed
members of FLIST."
;; At this point files have been renamed/copied at destination.
;; That's mean DEST-CAND exists.
(loop
with dest = (expand-file-name dest-cand)
for src in flist
for basename-src = (anything-c-basename src)
for fname = (cond (rename-dir-flag (directory-file-name dest))
((file-directory-p dest)
(concat (file-name-as-directory dest) basename-src))
(t dest))
when (file-exists-p fname)
collect fname into tmp-list
finally return (sort tmp-list 'string<)))
(defun anything-ff-maybe-mark-candidates ()
"Mark all candidates of list `anything-ff-cand-to-mark'."
(when (and (string= (assoc-default 'name (anything-get-current-source))
(assoc-default 'name anything-c-source-find-files))
anything-ff-cand-to-mark)
(with-anything-window
(while anything-ff-cand-to-mark
(if (string= (car anything-ff-cand-to-mark) (anything-get-selection))
(progn
(anything-make-visible-mark)
(anything-next-line)
(setq anything-ff-cand-to-mark (cdr anything-ff-cand-to-mark)))
(anything-next-line)))
(unless (anything-this-visible-mark)
(anything-prev-visible-mark)))))
(add-hook 'anything-after-update-hook #'anything-ff-maybe-mark-candidates)
(defun* anything-dired-do-action-on-file (&key action)
(let* ((files (dired-get-marked-files))
(len (length files))
(fname (if (> len 1)
(format "* %d Files" len)
(car files)))
(source (case action
('copy 'anything-c-source-copy-files)
('rename 'anything-c-source-rename-files)
('symlink 'anything-c-source-symlink-files)
('hardlink 'anything-c-source-hardlink-files)))
(prompt-fm (case action
('copy "Copy %s to: ")
('rename "Rename %s to: ")
('symlink "Symlink %s to: ")
('hardlink "Hardlink %s to: ")))
(buffer (case action
('copy "*Anything Copy Files*")
('rename "*Anything Rename Files*")
('symlink "*Anything Symlink Files*")
('hardlink "*Anything Hardlink Files*")))
(anything-mp-highlight-delay nil))
(anything :sources source
:input (or (dired-dwim-target-directory)
(expand-file-name (anything-c-current-directory)))
:preselect (dired-get-filename)
:prompt (format prompt-fm fname)
:keymap anything-c-read-file-map
:buffer buffer)))
;;;###autoload
(define-minor-mode anything-dired-mode ()
"Enable anything completion in Dired functions.
Bindings affected are C, R, S, H.
This is deprecated for Emacs24+ users, use `ac-mode' instead."
:group 'anything-config
:global t
(if anything-dired-mode
(progn
(substitute-key-definition
'dired-do-copy 'anything-dired-copy-file dired-mode-map)
(substitute-key-definition
'dired-do-rename 'anything-dired-rename-file dired-mode-map)
(substitute-key-definition
'dired-do-symlink 'anything-dired-symlink-file dired-mode-map)
(substitute-key-definition
'dired-do-hardlink 'anything-dired-hardlink-file dired-mode-map))
(substitute-key-definition
'anything-dired-copy-file 'dired-do-copy dired-mode-map)
(substitute-key-definition
'anything-dired-rename-file 'dired-do-rename dired-mode-map)
(substitute-key-definition
'anything-dired-symlink-file 'dired-do-symlink dired-mode-map)
(substitute-key-definition
'anything-dired-hardlink-file 'dired-do-hardlink dired-mode-map)))
(defalias 'anything-dired-bindings 'anything-dired-mode)
(defun* anything-c-read-file-name
(prompt
&key
(name "Read File Name")
(initial-input (expand-file-name default-directory))
(buffer "*Anything Completions*")
test
(preselect nil)
(history nil)
must-match
(marked-candidates nil)
(alistp t)
(persistent-action 'anything-find-files-persistent-action)
(persistent-help "Hit1 Expand Candidate, Hit2 or (C-u) Find file"))
"Read a file name with anything completion.
It is anything `read-file-name' emulation.
Argument PROMPT is the default prompt to use.
Keys description:
- NAME: Source name, default to \"Read File Name\".
- INITIAL-INPUT: Where to start read file name, default to `default-directory'.
- BUFFER: `anything-buffer' name default to \"*Anything Completions*\".
- TEST: A predicate called with one arg 'candidate'.
- PRESELECT: anything preselection.
- HISTORY: Display HISTORY in a special source.
- MUST-MATCH: Can be 'confirm, nil, or t.
- MARKED-CANDIDATES: When non--nil return a list of marked candidates.
- ALISTP: Don't use `all-completions' in history (take effect only on history).
- PERSISTENT-ACTION: a persistent action function.
- PERSISTENT-HELP: persistent help message."
(when (get-buffer anything-action-buffer)
(kill-buffer anything-action-buffer))
;; Assume completion have been already required,
;; so always use 'confirm.
(when (eq must-match 'confirm-after-completion)
(setq must-match 'confirm))
(flet ((action-fn (candidate)
(if marked-candidates
(anything-marked-candidates)
(identity candidate))))
(let* ((anything-mp-highlight-delay nil)
;; Be sure we don't erase the underlying minibuffer if some.
(anything-ff-auto-update-initial-value
(and anything-ff-auto-update-initial-value
(not (minibuffer-window-active-p (minibuffer-window)))))
anything-same-window
(hist (and history (anything-comp-read-get-candidates
history nil nil alistp)))
(minibuffer-completion-confirm must-match)
(must-match-map (when must-match
(let ((map (make-sparse-keymap)))
(define-key map (kbd "RET")
'anything-confirm-and-exit-minibuffer)
map)))
(anything-map (if must-match-map
(make-composed-keymap
must-match-map anything-c-read-file-map)
anything-c-read-file-map)))
(or (anything
:sources
`(((name . ,(format "%s History" name))
(header-name . (lambda (name)
(concat name anything-c-find-files-doc-header)))
(disable-shortcuts)
(mode-line . anything-read-file-name-mode-line-string)
(candidates . hist)
(persistent-action . ,persistent-action)
(persistent-help . ,persistent-help)
(action . ,'action-fn))
((name . ,name)
(header-name . (lambda (name)
(concat name anything-c-find-files-doc-header)))
(init . (lambda ()
(setq anything-ff-auto-update-flag
anything-ff-auto-update-initial-value)))
;; It is needed for filenames with capital letters
(disable-shortcuts)
(mode-line . anything-read-file-name-mode-line-string)
(candidates
. (lambda ()
(if test
(loop with hn = (anything-ff-tramp-hostnames)
for i in (anything-find-files-get-candidates
must-match)
when (or (member i hn) (funcall test i))
collect i)
(anything-find-files-get-candidates must-match))))
(filtered-candidate-transformer anything-c-find-files-transformer)
(persistent-action . ,persistent-action)
(candidate-number-limit . 9999)
(toggle-auto-update . anything-ff-toggle-auto-update)
(persistent-help . ,persistent-help)
(volatile)
(action . ,'action-fn)))
:input initial-input
:prompt prompt
:resume 'noresume
:buffer buffer
:preselect preselect)
(when (and (not (string= anything-pattern ""))
(eq anything-exit-status 0)
(eq must-match 'confirm))
(identity anything-pattern))
(keyboard-quit)))))
;;; File Cache
(defvar anything-c-file-cache-initialized-p nil)
(defvar anything-c-file-cache-files nil)
(defvar anything-c-source-file-cache
`((name . "File Cache")
(init
. (lambda ()
(require 'filecache nil t)
(unless anything-c-file-cache-initialized-p
(setq anything-c-file-cache-files
(loop for item in file-cache-alist append
(destructuring-bind (base &rest dirs) item
(loop for dir in dirs collect
(concat dir base)))))
(defadvice file-cache-add-file (after file-cache-list activate)
(add-to-list 'anything-c-file-cache-files (expand-file-name file)))
(setq anything-c-file-cache-initialized-p t))))
(keymap . ,anything-generic-files-map)
(help-message . anything-generic-file-help-message)
(mode-line . anything-generic-file-mode-line-string)
(candidates . anything-c-file-cache-files)
(match anything-c-match-on-basename)
(type . file)))
;;; Locate
;;
;;
;; NOTE for WINDOZE users:
;; You have to install Everything with his command line interface here:
;; http://www.voidtools.com/download.php
(defun anything-ff-find-locatedb (&optional from-ff)
"Try to find if a local locatedb file is available.
The search is done in `anything-ff-default-directory' or
fall back to `default-directory' if FROM-FF is nil."
(when anything-ff-locate-db-filename
(cond ((and anything-ff-default-directory
from-ff
(file-exists-p (expand-file-name
anything-ff-locate-db-filename
anything-ff-default-directory))
(expand-file-name
anything-ff-locate-db-filename
anything-ff-default-directory)))
((and (not from-ff)
(file-exists-p (expand-file-name
anything-ff-locate-db-filename
default-directory))
(expand-file-name
anything-ff-locate-db-filename
default-directory))))))
(defun anything-locate-1 (&optional localdb init from-ff)
"Generic function to run Locate.
if LOCALDB is non--nil search and use a local locate db file.
INIT is a string to use as initial input in prompt.
See `anything-locate-with-db' and `anything-locate'."
(anything-locate-with-db
(and localdb
(or (anything-ff-find-locatedb from-ff)
(anything-c-read-file-name
"LocateDBFiles: "
:initial-input (or anything-ff-default-directory
default-directory)
:marked-candidates t
:preselect anything-locate-db-file-regexp
:test #'(lambda (x)
(if anything-locate-db-file-regexp
;; Select only locate db files and directories
;; to allow navigation.
(or (string-match
anything-locate-db-file-regexp x)
(file-directory-p x))
x)))))
init))
;; (anything-locate-1 t)
(defun anything-locate-with-db (&optional db initial-input)
"Run locate -d DB.
If DB is not given or nil use locate without -d option.
Argument DB can be given as a string or list of db files.
Argument INITIAL-INPUT is a string to use as initial-input.
See also `anything-locate'."
(when (and db (stringp db)) (setq db (list db)))
(unless anything-c-locate-command
(setq anything-c-locate-command
(case system-type
('gnu/linux "locate -i -r %s")
('berkeley-unix "locate -i %s")
('windows-nt "es -i -r %s")
(t "locate %s"))))
(let ((anything-c-locate-command
(if db
(replace-regexp-in-string
"locate"
(format "locate -d %s"
(mapconcat 'identity
;; Remove eventually
;; marked directories by error.
(loop for i in db
unless (file-directory-p i)
collect i) ":"))
anything-c-locate-command)
anything-c-locate-command)))
(anything :sources 'anything-c-source-locate
:buffer "*anything locate*"
:input initial-input
:keymap anything-generic-files-map)))
;; (anything-locate-with-db "~/locate.db")
(defun anything-c-locate-init ()
"Initialize async locate process for `anything-c-source-locate'."
(setq mode-line-format
'(" " mode-line-buffer-identification " "
(line-number-mode "%l") " "
(:eval (propertize "(Locate Process Running) "
'face '((:foreground "red"))))))
(prog1
(start-process-shell-command "locate-process" nil
(format anything-c-locate-command
anything-pattern))
(set-process-sentinel (get-process "locate-process")
#'(lambda (process event)
(when (string= event "finished\n")
(with-anything-window
(force-mode-line-update nil)
(anything-update-move-first-line)))))))
(defvar anything-c-source-locate
`((name . "Locate")
(candidates . anything-c-locate-init)
(type . file)
(requires-pattern . 3)
(keymap . ,anything-generic-files-map)
(help-message . anything-generic-file-help-message)
(candidate-number-limit . 9999)
(mode-line . anything-generic-file-mode-line-string)
(delayed))
"Find files matching the current input pattern with locate.")
(defun anything-c-locate-read-file-name (prompt &optional init)
"Search a file with locate and return it's filename.
Use argument PROMPT and INIT for `anything' arguments
prompt and input."
(anything :sources
'((name . "Locate")
(candidates . anything-c-locate-init)
(action . identity)
(requires-pattern . 3)
(candidate-number-limit . 9999)
(mode-line . anything-generic-file-mode-line-string)
(delayed))
:prompt prompt
:input init
:buffer "*anything locate rfn*"))
;;; Anything Incremental Grep.
;;
;;
;; Allow to grep incrementally with anything interface.
;; It allow also to Grep files recursively without using 'find' shell command.
;; On Windows you will need at least Grep version 2.5.4 of Gnuwin32.
(defvar anything-c-grep-default-command
"grep -d skip %e -niH -e %p %f"
"Default grep format command for `anything-do-grep-1'.
Where:
'%e' format spec is for --exclude or --include grep options.
'%p' format spec is for pattern.
'%f' format spec is for filenames.")
(defvar anything-c-grep-default-recurse-command
"grep -d recurse %e -niH -e %p %f"
"Default recursive grep format command for `anything-do-grep-1'.
See `anything-c-grep-default-command' for format specs.")
(defvar anything-c-default-zgrep-command "zgrep -niH -e %p %f")
(defvar anything-c-rzgrep-cache (make-hash-table :test 'equal))
(defvar anything-c-grep-default-function 'anything-c-grep-init)
(defvar anything-c-grep-debug-command-line nil
"Turn on anything grep command-line debugging when non--nil.")
(defvar anything-c-zgrep-recurse-flag nil)
(defvar anything-c-grep-history nil)
(defvar anything-c-grep-max-length-history 100
"*Max number of elements to save in `anything-c-grep-history'.")
(defun anything-c-grep-prepare-candidates (candidates)
"Prepare filenames and directories CANDIDATES for grep command line."
;; If one or more candidate is a directory, search in all files
;; of this candidate (e.g /home/user/directory/*).
;; If r option is enabled search also in subdidrectories.
;; We need here to expand wildcards to support crap windows filenames
;; as grep doesn't accept quoted wildcards (e.g "dir/*.el").
(if anything-c-zgrep-recurse-flag
(mapconcat 'shell-quote-argument candidates " ")
(loop for i in candidates append
(cond ( ;; Candidate is a directory and we use recursion.
(and (file-directory-p i)
(anything-c-grep-recurse-p))
(list (expand-file-name i)))
;; Candidate is a directory, search in all files.
((file-directory-p i)
(file-expand-wildcards
(concat (file-name-as-directory (expand-file-name i)) "*") t))
;; Candidate is a file or wildcard and we use recursion, use the
;; current directory instead of candidate.
((and (or (file-exists-p i) (string-match "\*" i))
(anything-c-grep-recurse-p))
(list (expand-file-name
(directory-file-name ; Needed for windoze.
(file-name-directory (directory-file-name i))))))
;; Candidate use wildcard.
((string-match "^\*" (anything-c-basename i))
(file-expand-wildcards i t))
;; Else should be one or more file.
(t (list i))) into all-files
finally return
(mapconcat 'shell-quote-argument all-files " "))))
(defun anything-c-grep-recurse-p ()
"Check if `anything-do-grep-1' have switched to recursive."
(let ((args (replace-regexp-in-string
"grep" "" anything-c-grep-default-command)))
(string-match-p "r\\|recurse" args)))
(defun anything-c-grep-init (only-files &optional include zgrep)
"Start an asynchronous grep process in ONLY-FILES list."
(let* ((fnargs (anything-c-grep-prepare-candidates
(if (file-remote-p anything-ff-default-directory)
(mapcar #'(lambda (x)
(file-remote-p x 'localname))
only-files)
only-files)))
(ignored-files (mapconcat
#'(lambda (x)
(concat "--exclude=" (shell-quote-argument x)))
grep-find-ignored-files " "))
(ignored-dirs (mapconcat
;; Need grep version >=2.5.4 of Gnuwin32 on windoze.
#'(lambda (x)
(concat "--exclude-dir=" (shell-quote-argument x)))
grep-find-ignored-directories " "))
(exclude (if (anything-c-grep-recurse-p)
(concat (or include ignored-files) " " ignored-dirs)
ignored-files))
(cmd-line (format-spec
anything-c-grep-default-command
(delq nil
(list (unless zgrep (cons ?e exclude))
(cons ?p (shell-quote-argument anything-pattern))
(cons ?f fnargs))))))
(when anything-c-grep-debug-command-line
(with-current-buffer (get-buffer-create "*any grep debug*")
(goto-char (point-max))
(insert (concat ">>> " cmd-line "\n\n"))))
(setq mode-line-format
'(" " mode-line-buffer-identification " "
(line-number-mode "%l") " "
(:eval (when (get-process "grep-process")
(propertize "[Grep Process Running] "
'face 'anything-grep-running)))))
(force-mode-line-update nil)
(prog1
(let ((default-directory anything-ff-default-directory))
(start-file-process-shell-command "grep-process" nil cmd-line))
(message nil)
(set-process-sentinel
(get-process "grep-process")
#'(lambda (process event)
(when (string= event "finished\n")
(with-anything-window
(anything-update-move-first-line)
(setq mode-line-format
'(" " mode-line-buffer-identification " "
(line-number-mode "%l") " "
(:eval (propertize
(format "[Grep Process Finished - (%s results)] "
(let ((nlines (1- (count-lines
(point-min)
(point-max)))))
(if (> nlines 0) nlines 0)))
'face 'anything-grep-finish))))
(force-mode-line-update nil))))))))
(defun anything-c-grep-action (candidate &optional where mark)
"Define a default action for `anything-do-grep' on CANDIDATE.
WHERE can be one of other-window, elscreen, other-frame."
(let* ((split (anything-c-grep-split-line candidate))
(lineno (string-to-number (nth 1 split)))
(loc-fname (car split))
(tramp-method (file-remote-p anything-ff-default-directory 'method))
(tramp-host (file-remote-p anything-ff-default-directory 'host))
(tramp-prefix (concat "/" tramp-method ":" tramp-host ":"))
(fname (if tramp-host
(concat tramp-prefix loc-fname) loc-fname)))
(case where
(other-window (find-file-other-window fname))
(elscreen (anything-elscreen-find-file fname))
(other-frame (find-file-other-frame fname))
(grep (anything-c-grep-save-results-1))
(t (find-file fname)))
(unless (eq where 'grep)
(anything-goto-line lineno))
(when mark
(set-marker (mark-marker) (point))
(push-mark (point) 'nomsg))
;; Save history
(unless (or anything-in-persistent-action
(string= anything-pattern ""))
(setq anything-c-grep-history
(cons anything-pattern
(delete anything-pattern anything-c-grep-history)))
(when (> (length anything-c-grep-history)
anything-c-grep-max-length-history)
(setq anything-c-grep-history
(delete (car (last anything-c-grep-history))
anything-c-grep-history))))))
(defun anything-c-grep-other-window (candidate)
"Jump to result in other window from anything grep."
(anything-c-grep-action candidate 'other-window))
(defun anything-c-grep-other-frame (candidate)
"Jump to result in other frame from anything grep."
(anything-c-grep-action candidate 'other-frame))
(defun anything-c-grep-jump-elscreen (candidate)
"Jump to result in elscreen from anything grep."
(anything-c-grep-action candidate 'elscreen))
(defun anything-c-grep-save-results (_candidate)
(anything-c-grep-action _candidate 'grep))
(defun anything-c-grep-save-results-1 ()
"Save anything grep result in a `grep-mode' buffer."
(let ((buf "*grep*")
new-buf)
(when (get-buffer buf)
(setq new-buf (read-string "GrepBufferName: " buf))
(loop for b in (anything-c-buffer-list)
when (and (string= new-buf b)
(not (y-or-n-p
(format "Buffer `%s' already exists overwrite? "
new-buf))))
do (setq new-buf (read-string "GrepBufferName: " "*grep ")))
(setq buf new-buf))
(with-current-buffer (get-buffer-create buf)
(let ((inhibit-read-only t))
(erase-buffer)
(insert "-*- mode: grep -*-\n\n"
(format "Grep Results for `%s':\n\n" anything-pattern))
(save-excursion
(insert (with-current-buffer anything-buffer
(goto-char (point-min)) (forward-line 1)
(buffer-substring (point) (point-max))))
(grep-mode))))
(message "Anything Grep Results saved in `%s' buffer" buf)))
(defun anything-c-grep-persistent-action (candidate)
"Persistent action for `anything-do-grep'.
With a prefix arg record CANDIDATE in `mark-ring'."
(if current-prefix-arg
(anything-c-grep-action candidate nil 'mark)
(anything-c-grep-action candidate))
(anything-match-line-color-current-line))
(defun anything-c-grep-guess-extensions (files)
"Try to guess file extensions in FILES list when using grep recurse.
These extensions will be added to command line with --include arg of grep."
(loop
with glob-list = nil
with lst = (if (file-directory-p (car files))
(directory-files
(car files) nil
directory-files-no-dot-files-regexp)
files)
for i in lst
for ext = (file-name-extension i t)
for glob = (and ext (not (string= ext ""))
(concat "*" ext))
unless (or (not glob)
(member glob glob-list)
(member glob grep-find-ignored-files))
collect glob into glob-list
finally return glob-list))
(defun anything-do-grep-1 (only &optional recurse zgrep)
"Launch grep with a list of ONLY files.
When RECURSE is given use -r option of grep and prompt user
to set the --include args of grep.
You can give more than one arg separated by space.
e.g *.el *.py *.tex.
If it's empty --exclude `grep-find-ignored-files' is used instead."
(let* ((anything-compile-source-functions
;; rule out anything-match-plugin because the input is one regexp.
(delq 'anything-compile-source--match-plugin
(copy-sequence anything-compile-source-functions)))
(exts (anything-c-grep-guess-extensions only))
(globs (and (not zgrep) (mapconcat 'identity exts " ")))
(include-files (and recurse (not zgrep)
(read-string "OnlyExt(*.[ext]): "
globs)))
;; Set `minibuffer-history' AFTER includes-files
;; to avoid storing wild-cards here.
(minibuffer-history anything-c-grep-history)
(anything-c-grep-default-command (cond ((and recurse zgrep) anything-c-default-zgrep-command)
(recurse anything-c-grep-default-recurse-command)
(zgrep anything-c-default-zgrep-command)
(t anything-c-grep-default-command)))
;; Disable match-plugin and use here own highlighting.
(anything-mp-highlight-delay nil))
(when include-files
(setq include-files
(and (not (string= include-files ""))
(mapconcat #'(lambda (x)
(concat "--include=" (shell-quote-argument x)))
(split-string include-files) " "))))
;; When called as action from an other source e.g *-find-files
;; we have to kill action buffer.
(when (get-buffer anything-action-buffer)
(kill-buffer anything-action-buffer))
;; `anything-find-files' haven't already started,
;; give a default value to `anything-ff-default-directory'.
(setq anything-ff-default-directory (or anything-ff-default-directory
default-directory))
(anything
:sources
`(((name . "Grep")
(header-name . (lambda (name)
(concat name "(C-c ? Help)")))
(candidates
. (lambda ()
(funcall anything-c-grep-default-function only include-files zgrep)))
(filtered-candidate-transformer anything-c-grep-cand-transformer)
(candidate-number-limit . 9999)
(mode-line . anything-grep-mode-line-string)
(keymap . ,anything-c-grep-map)
(action . ,(delq
nil
`(("Find File" . anything-c-grep-action)
("Find file other frame" . anything-c-grep-other-frame)
,(and (locate-library "elscreen")
'("Find file in Elscreen"
. anything-c-grep-jump-elscreen))
("Save results in grep buffer" . anything-c-grep-save-results)
("Find file other window" . anything-c-grep-other-window))))
(persistent-action . anything-c-grep-persistent-action)
(persistent-help . "Jump to line (`C-u' Record in mark ring)")
(requires-pattern . 3)
(delayed)))
:buffer "*anything grep*")))
(defun anything-ff-zgrep-1 (flist recursive)
(unwind-protect
(let* ((def-dir (or anything-ff-default-directory
default-directory))
(only (if recursive
(or (gethash def-dir anything-c-rzgrep-cache)
(puthash
def-dir
(anything-c-walk-directory
def-dir
:directories nil
:path 'full
:match ".*\\(\.gz\\|\.bz\\|\.xz\\|\.lzma\\)$")
anything-c-rzgrep-cache))
flist)))
(when recursive (setq anything-c-zgrep-recurse-flag t))
(anything-do-grep-1 only recursive 'zgrep))
(setq anything-c-zgrep-recurse-flag nil)))
(defun anything-c-grep-split-line (line)
"Split a grep output line."
(let (beg fname lineno str)
;; Don't print until grep line is valid.
(when (string-match "\\(.*\\)\\(:[0-9]+:\\)\\(.*\\)" line)
(with-temp-buffer
(insert line)
(goto-char (point-min))
(setq beg (point))
(forward-char 2)
(re-search-forward ":" nil t)
(setq fname (buffer-substring-no-properties beg (1- (point))))
(setq beg (point))
(re-search-forward ":" nil t)
(setq lineno (buffer-substring-no-properties beg (1- (point))))
(setq str (buffer-substring-no-properties (point) (point-at-eol))))
(list fname lineno str))))
(defun anything-c-grep-cand-transformer (candidates sources)
"Filtered candidate transformer function for `anything-do-grep'."
(loop for i in candidates
for split = (and i (anything-c-grep-split-line i))
for fname = (car split)
for lineno = (nth 1 split)
for str = (nth 2 split)
when (and fname lineno str)
collect
(cons (concat (propertize (file-name-nondirectory fname)
'face 'anything-grep-file
'help-echo fname) ":"
(propertize lineno 'face 'anything-grep-lineno) ":"
(anything-c-grep-highlight-match str))
i)))
(defun anything-c-grep-highlight-match (str)
"Highlight in string STR all occurences matching `anything-pattern'."
(condition-case nil
(with-temp-buffer
(insert str)
(goto-char (point-min))
(while (and (re-search-forward anything-pattern nil t)
(> (- (match-end 0) (match-beginning 0)) 0))
(add-text-properties
(match-beginning 0) (match-end 0)
'(face anything-grep-match)))
(buffer-string))
(error nil)))
;; Go to next or precedent file (common to etags and grep).
(defun anything-c-goto-next-or-prec-file (n)
"Go to next or precedent candidate file in anything grep/etags buffers.
If N is positive go forward otherwise go backward."
(with-anything-window
(let* ((current-line-list (split-string
(buffer-substring
(point-at-bol)
(point-at-eol)) ":"))
(current-fname (nth 0 current-line-list))
(fn-b-o-f (if (eq n 1) 'eobp 'bobp)))
(catch 'break
(while (not (funcall fn-b-o-f))
(forward-line n) ; Go forward or backward depending of n value.
(unless (search-forward current-fname (point-at-eol) t)
(anything-mark-current-line)
(throw 'break nil))))
(cond ((and (eq n 1) (eobp))
(re-search-backward ".")
(forward-line 0)
(anything-mark-current-line))
((and (< n 1) (bobp))
(forward-line 1)
(anything-mark-current-line))))))
;;;###autoload
(defun anything-c-goto-precedent-file ()
"Go to precedent file in anything grep/etags buffers."
(interactive)
(anything-c-goto-next-or-prec-file -1))
;;;###autoload
(defun anything-c-goto-next-file ()
"Go to precedent file in anything grep/etags buffers."
(interactive)
(anything-c-goto-next-or-prec-file 1))
;;;###autoload
(defun anything-c-grep-run-persistent-action ()
"Run grep persistent action from `anything-do-grep-1'."
(interactive)
(anything-attrset 'jump-persistent 'anything-c-grep-persistent-action)
(anything-execute-persistent-action 'jump-persistent))
;;;###autoload
(defun anything-c-grep-run-default-action ()
"Run grep default action from `anything-do-grep-1'."
(interactive)
(anything-c-quit-and-execute-action 'anything-c-grep-action))
;;;###autoload
(defun anything-c-grep-run-other-window-action ()
"Run grep goto other window action from `anything-do-grep-1'."
(interactive)
(anything-c-quit-and-execute-action 'anything-c-grep-other-window))
;;;###autoload
(defun anything-c-grep-run-save-buffer ()
"Run grep save results action from `anything-do-grep-1'."
(interactive)
(anything-c-quit-and-execute-action 'anything-c-grep-save-results))
;; Grep buffers
(defun anything-c-grep-buffers-1 (candidate &optional zgrep)
"Run grep on all file--buffers or CANDIDATE if it is a file--buffer.
If one of selected buffers is not a file--buffer,
it is ignored and grep will run on all others file--buffers.
If only one candidate is selected and it is not a file--buffer,
switch to this buffer and run `anything-occur'.
If a prefix arg is given run grep on all buffers ignoring non--file-buffers."
(let* ((prefarg (or current-prefix-arg anything-current-prefix-arg))
(cands (if prefarg
(buffer-list)
(anything-marked-candidates)))
(win-conf (current-window-configuration))
;; Non--fname buffers are ignored.
(bufs (loop for buf in cands
for fname = (buffer-file-name (get-buffer buf))
when fname
collect (expand-file-name fname))))
(if bufs
(if zgrep
(anything-do-grep-1 bufs nil 'zgrep)
(anything-do-grep-1 bufs))
;; bufs is empty, thats mean we have only CANDIDATE
;; and it is not a buffer-filename, fallback to occur.
(anything-c-switch-to-buffer candidate)
(when (get-buffer anything-action-buffer)
(kill-buffer anything-action-buffer))
(anything-occur)
(when (eq anything-exit-status 1)
(set-window-configuration win-conf)))))
(defun anything-c-grep-buffers (candidate)
"Action to grep buffers."
(anything-c-grep-buffers-1 candidate))
(defun anything-c-zgrep-buffers (candidate)
"Action to zgrep buffers."
(anything-c-grep-buffers-1 candidate 'zgrep))
;;; Anything interface for pdfgrep
;; pdfgrep program <http://pdfgrep.sourceforge.net/>
;; and a pdf-reader (e.g xpdf) are needed.
;;
(defvar anything-c-pdfgrep-default-command "pdfgrep --color never -niH %s %s")
(defvar anything-c-pdfgrep-default-function 'anything-c-pdfgrep-init)
(defvar anything-c-pdfgrep-debug-command-line nil)
(defun anything-c-pdfgrep-init (only-files)
"Start an asynchronous pdfgrep process in ONLY-FILES list."
(let* ((fnargs (anything-c-grep-prepare-candidates
(if (file-remote-p anything-ff-default-directory)
(mapcar #'(lambda (x)
(file-remote-p x 'localname))
only-files)
only-files)))
(cmd-line (format anything-c-pdfgrep-default-command
anything-pattern
fnargs)))
(when anything-c-pdfgrep-debug-command-line
(with-current-buffer (get-buffer-create "*any pdfgrep debug*")
(goto-char (point-max))
(insert (concat ">>> " cmd-line "\n\n"))))
(setq mode-line-format
'(" " mode-line-buffer-identification " "
(line-number-mode "%l") " "
(:eval (propertize "(Pdfgrep Process Running) "
'face '((:foreground "red"))))))
(prog1
(let ((default-directory anything-ff-default-directory))
(start-file-process-shell-command "pdfgrep-process" nil cmd-line))
(message nil)
(set-process-sentinel
(get-process "pdfgrep-process")
#'(lambda (process event)
(when (string= event "finished\n")
(with-anything-window
(anything-update-move-first-line))
(force-mode-line-update nil)))))))
(defun anything-do-pdfgrep-1 (only)
"Launch pdfgrep with a list of ONLY files."
(unless (executable-find "pdfgrep")
(error "Error: No such program `pdfgrep'."))
(let* ((anything-compile-source-functions
;; rule out anything-match-plugin because the input is one regexp.
(delq 'anything-compile-source--match-plugin
(copy-sequence anything-compile-source-functions)))
;; Disable match-plugin and use here own highlighting.
(anything-mp-highlight-delay nil))
;; When called as action from an other source e.g *-find-files
;; we have to kill action buffer.
(when (get-buffer anything-action-buffer)
(kill-buffer anything-action-buffer))
;; If `anything-find-files' haven't already started,
;; give a default value to `anything-ff-default-directory'.
(setq anything-ff-default-directory (or anything-ff-default-directory
default-directory))
(anything
:sources
`(((name . "PdfGrep")
(candidates
. (lambda ()
(funcall anything-c-pdfgrep-default-function only)))
(filtered-candidate-transformer anything-c-grep-cand-transformer)
(candidate-number-limit . 9999)
(mode-line . anything-pdfgrep-mode-line-string)
(action . anything-c-pdfgrep-action)
(persistent-help . "Jump to PDF Page")
(requires-pattern . 3)
(delayed)))
:keymap anything-c-pdfgrep-map
:buffer "*anything grep*")))
(defun anything-c-pdfgrep-action (candidate)
(let* ((split (anything-c-grep-split-line candidate))
(pageno (nth 1 split))
(fname (car split)))
(start-file-process-shell-command
"pdf-reader" nil
(format-spec anything-c-pdfgrep-default-read-command
(list (cons ?f fname) (cons ?p pageno))))))
;; Yank text at point.
;;
;;
;; Internal
(defvar anything-yank-point nil)
;;;###autoload
(defun anything-yank-text-at-point ()
"Yank text at point in minibuffer."
(interactive)
(let (input)
(flet ((insert-in-minibuffer (word)
(with-selected-window (minibuffer-window)
(let ((str anything-pattern))
(delete-minibuffer-contents)
(set-text-properties 0 (length word) nil word)
(insert (concat str word))))))
(with-anything-current-buffer
;; Start to initial point if C-w have never been hit.
(unless anything-yank-point (setq anything-yank-point (point)))
(and anything-yank-point (goto-char anything-yank-point))
(forward-word 1)
(setq input (buffer-substring-no-properties anything-yank-point (point)))
(setq anything-yank-point (point))) ; End of last forward-word
(insert-in-minibuffer input))))
(defun anything-reset-yank-point ()
(setq anything-yank-point nil))
(add-hook 'anything-after-persistent-action-hook 'anything-reset-yank-point)
(add-hook 'anything-cleanup-hook 'anything-reset-yank-point)
;;; Recentf files
;;
;;
(defvar anything-c-source-recentf
`((name . "Recentf")
(init . (lambda ()
(require 'recentf)
(or recentf-mode (recentf-mode 1))))
;; Needed for filenames with capitals letters.
(disable-shortcuts)
(candidates . recentf-list)
(keymap . ,anything-generic-files-map)
(help-message . anything-generic-file-help-message)
(mode-line . anything-generic-file-mode-line-string)
(match anything-c-match-on-basename)
(type . file))
"See (info \"(emacs)File Conveniences\").
Set `recentf-max-saved-items' to a bigger value if default is too small.")
;;; ffap
(eval-when-compile (require 'ffap))
(defvar anything-c-source-ffap-guesser
`((name . "File at point")
(init . (lambda () (require 'ffap)))
(candidates . (lambda ()
(anything-aif
(with-anything-current-buffer
(ffap-guesser))
(list it))))
(keymap . ,anything-generic-files-map)
(help-message . anything-generic-file-help-message)
(mode-line . anything-generic-file-mode-line-string)
(type . file)))
;;; ffap with line number
(defun anything-c-ffap-file-line-at-point ()
"Get (FILENAME . LINENO) at point."
(anything-aif (let (ffap-alist) (ffap-file-at-point))
(save-excursion
(beginning-of-line)
(when (and (search-forward it nil t)
(looking-at ":\\([0-9]+\\)"))
(cons it (string-to-number (match-string 1)))))))
(defun anything-c-ffap-line-candidates ()
(with-anything-current-buffer
(anything-attrset 'ffap-line-location (anything-c-ffap-file-line-at-point)))
(anything-aif (anything-attr 'ffap-line-location)
(destructuring-bind (file . line) it
(list (cons (format "%s (line %d)" file line) file)))))
;;; Goto line after opening file by `anything-c-source-ffap-line'.
(defun anything-c-ffap-line-goto-line ()
(when (car (anything-attr 'ffap-line-location))
(unwind-protect
(ignore-errors
(with-selected-window
(get-buffer-window
(get-file-buffer (car (anything-attr 'ffap-line-location))))
(anything-goto-line (cdr (anything-attr 'ffap-line-location)))))
(anything-attrset 'ffap-line-location nil))))
(add-hook 'anything-after-action-hook 'anything-c-ffap-line-goto-line)
(add-hook 'anything-after-persistent-action-hook 'anything-c-ffap-line-goto-line)
(defvar anything-c-source-ffap-line
`((name . "File/Lineno at point")
(init . (lambda () (require 'ffap)))
(candidates . anything-c-ffap-line-candidates)
(keymap . ,anything-map)
(type . file)))
;;; list of files gleaned from every dired buffer
(defun anything-c-files-in-all-dired-candidates ()
(save-excursion
(mapcan
(lambda (dir)
(cond ((listp dir) ;filelist
dir)
((equal "" (file-name-nondirectory dir)) ;dir
(directory-files dir t))
(t ;wildcard
(file-expand-wildcards dir t))))
(delq nil
(mapcar (lambda (buf)
(set-buffer buf)
(when (eq major-mode 'dired-mode)
(if (consp dired-directory)
(cdr dired-directory) ;filelist
dired-directory))) ;dir or wildcard
(buffer-list))))))
;; (dired '("~/" "~/.emacs-custom.el" "~/.emacs.bmk"))
(defvar anything-c-source-files-in-all-dired
'((name . "Files in all dired buffer.")
(candidates . anything-c-files-in-all-dired-candidates)
(type . file)))
(defvar anything-c-source-filelist
'((name . "FileList")
(grep-candidates . anything-c-filelist-file-name)
(candidate-number-limit . 200)
(requires-pattern . 4)
(type . file))
"Source to find files instantly.
See `anything-c-filelist-file-name' docstring for usage.")
;;;; <info>
;;; Info pages
(defvar anything-c-info-pages nil
"All info pages on system.
Will be calculated the first time you invoke anything with this
source.")
(defun anything-c-info-pages-init ()
"Collect candidates for initial Info node Top."
(if anything-c-info-pages
anything-c-info-pages
(let ((info-topic-regexp "\\* +\\([^:]+: ([^)]+)[^.]*\\)\\.")
topics)
(require 'info)
(with-temp-buffer
(Info-find-node "dir" "top")
(goto-char (point-min))
(while (re-search-forward info-topic-regexp nil t)
(push (match-string-no-properties 1) topics))
(kill-buffer))
(setq anything-c-info-pages topics))))
(defvar anything-c-source-info-pages
`((name . "Info Pages")
(init . anything-c-info-pages-init)
(candidates . anything-c-info-pages)
(action . (("Show with Info" .(lambda (node-str)
(info (replace-regexp-in-string
"^[^:]+: " "" node-str))))))
(requires-pattern . 2)))
;;; Man and woman UI
;;
;;
(defvar anything-c-man-pages nil
"All man pages on system.
Will be calculated the first time you invoke anything with this
source.")
(defun anything-c-man-default-action (candidate)
"Default action for jumping to a woman or man page from anything."
(let ((wfiles (woman-file-name-all-completions candidate)))
(condition-case err
(if (> (length wfiles) 1)
(woman-find-file
(anything-comp-read
"ManFile: " wfiles :must-match t))
(woman candidate))
;; If woman is unable to format correctly
;; use man instead.
(error (kill-buffer) ; Kill woman buffer.
(let ((Man-notify-method 'meek))
(Man-getpage-in-background candidate))))))
(defvar anything-c-source-man-pages
`((name . "Manual Pages")
(candidates . (lambda ()
(if anything-c-man-pages
anything-c-man-pages
;; XEmacs doesn't have a woman :)
(setq anything-c-man-pages
(ignore-errors
(require 'woman)
(woman-file-name "")
(sort (mapcar 'car woman-topic-all-completions)
'string-lessp))))))
(action ("Show with Woman" . anything-c-man-default-action))
;; Woman does not work OS X
;; http://xahlee.org/emacs/modernization_man_page.html
(action-transformer . (lambda (actions candidate)
(if (eq system-type 'darwin)
'(("Show with Man" . man))
actions)))
(requires-pattern . 2)))
;;;; <Command>
;;; Anything M-x - Enhanced M-x UI
;;
;;
;; Another replacement of `M-x' that act exactly like the
;; vanilla Emacs one, no problem of windows configuration, prefix args
;; can be passed before calling `M-x' (e.g C-u M-x..) but also during
;; anything invocation.
;; Documentation of commands available without quitting,
;; Show keybindings of commands.
;; Show history.
(defvar anything-M-x-input-history nil)
(defun* anything-M-x-get-major-mode-command-alist (mode-map)
"Return alist of MODE-MAP."
(loop for key being the key-seqs of mode-map using (key-bindings com)
for str-key = (key-description key)
for ismenu = (string-match "<menu-bar>" str-key)
unless ismenu collect (cons str-key com)))
(defun anything-get-mode-map-from-mode (mode)
"Guess the mode-map name according to MODE.
Some modes don't use conventional mode-map name
so we need to guess mode-map name. e.g python-mode ==> py-mode-map.
Return nil if no mode-map found."
(loop
;; Start with a conventional mode-map name.
with mode-map = (intern-soft (format "%s-map" mode))
with mode-string = (symbol-name mode)
with mode-name = (replace-regexp-in-string "-mode" "" mode-string)
while (not mode-map)
for count downfrom (length mode-name)
;; Return when no result after parsing entire string.
when (eq count 0) return nil
for sub-name = (substring mode-name 0 count)
do (setq mode-map (intern-soft (format "%s-map" (concat sub-name "-mode"))))
finally return mode-map))
(defun anything-M-x-current-mode-map-alist ()
"Return mode-map alist of current `major-mode'."
(let ((map (anything-get-mode-map-from-mode major-mode)))
(when (and map (boundp map))
(anything-M-x-get-major-mode-command-alist (symbol-value map)))))
(defun anything-M-x-transformer (candidates sources)
"filtered-candidate-transformer to show bindings in emacs commands.
Show global bindings and local bindings according to current `major-mode'."
(with-anything-current-buffer
(loop with local-map = (anything-M-x-current-mode-map-alist)
for cand in candidates
for local-key = (car (rassq cand local-map))
for key = (substitute-command-keys (format "\\[%s]" cand))
collect
(cons (cond ((and (string-match "^M-x" key) local-key)
(format "%s (%s)"
cand (propertize
local-key
'face 'anything-M-x-key-face)))
((string-match "^M-x" key) cand)
(t (format "%s (%s)"
cand (propertize
key
'face 'anything-M-x-key-face))))
cand) into ls
finally return
(sort ls #'(lambda (x y) (string-lessp (car x) (car y)))))))
;;; Complex command history
;;
;;
(defvar anything-c-source-complex-command-history
'((name . "Complex Command History")
(candidates . (lambda () (mapcar 'prin1-to-string command-history)))
(type . sexp)))
;;; M-x history (not related to `anything-M-x')
;;
;;
(defvar anything-c-source-extended-command-history
'((name . "Emacs Commands History")
(candidates
. (lambda ()
(anything-fast-remove-dups extended-command-history :test 'equal)))
(type . command)))
;;; Emacs commands (Basic source for emacs commands)
;;
;;
(defvar anything-c-source-emacs-commands
'((name . "Emacs Commands")
(candidates . (lambda ()
(let (commands)
(mapatoms (lambda (a)
(if (commandp a)
(push (symbol-name a)
commands))))
(sort commands 'string-lessp))))
(type . command)
(requires-pattern . 2))
"Source for completing and invoking Emacs commands.
A command is a function with interactive spec that can
be invoked with `M-x'.
To get non-interactive functions listed, use
`anything-c-source-emacs-functions'.")
;;;; <Function>
;;; Emacs functions
;;
;;
(defvar anything-c-source-emacs-functions
'((name . "Emacs Functions")
(candidates . (lambda ()
(let (commands)
(mapatoms (lambda (a)
(if (functionp a)
(push (symbol-name a) commands))))
(sort commands 'string-lessp))))
(type . function)
(requires-pattern . 2))
"Source for completing Emacs functions.")
;;; With abbrev expansion
;;; Similar to my exec-abbrev-cmd.el
;;; See http://www.tsdh.de/cgi-bin/wiki.pl/exec-abbrev-cmd.el
(defvar anything-c-function-abbrev-regexp nil
"The regexp for `anything-c-source-emacs-functions-with-abbrevs'.
Regexp built from the current `anything-pattern' interpreting it
as abbreviation.
Only for internal use.")
(defun anything-c-match-function-by-abbrev (candidate)
"Return non-nil if `anything-pattern' is an abbreviation of the function CANDIDATE.
Abbreviations are made by taking the first character from each
word in the function's name, e.g. \"bb\" is an abbrev for
`bury-buffer', \"stb\" is an abbrev for `anything-c-switch-to-buffer'."
(string-match anything-c-function-abbrev-regexp candidate))
(defvar anything-c-source-emacs-functions-with-abbrevs
(append anything-c-source-emacs-functions
'((match anything-c-match-function-by-abbrev
anything-c-string-match))
'((init
. (lambda ()
(defadvice anything-update
(before anything-c-update-function-abbrev-regexp activate)
(let ((char-list (append anything-pattern nil))
(str "^"))
(dolist (c char-list)
(setq str (concat str (list c) "[^-]*-")))
(setq str (concat (substring str 0 (1- (length str))) "$"))
(setq anything-c-function-abbrev-regexp str))))))))
(defvar anything-c-source-advice
'((name . "Function Advice")
(candidates . anything-c-advice-candidates)
(action ("Toggle Enable/Disable" . anything-c-advice-toggle))
(persistent-action . anything-c-advice-persistent-action)
(multiline)
(persistent-help . "Describe function / C-u C-z: Toggle advice")))
;; (let ((debug-on-signal t))(anything 'anything-c-source-advice))
;; (testadvice)
(defun anything-c-advice-candidates ()
(require 'advice)
(loop for (fname) in ad-advised-functions
for function = (intern fname)
append
(loop for class in ad-advice-classes append
(loop for advice in (ad-get-advice-info-field function class)
for enabled = (ad-advice-enabled advice)
collect
(cons (format
"%s %s %s"
(if enabled "Enabled " "Disabled")
(propertize fname 'face 'font-lock-function-name-face)
(ad-make-single-advice-docstring advice class nil))
(list function class advice))))))
(defun anything-c-advice-persistent-action (func-class-advice)
(if current-prefix-arg
(anything-c-advice-toggle func-class-advice)
(describe-function (car func-class-advice))))
(defun anything-c-advice-toggle (func-class-advice)
(destructuring-bind (function class advice) func-class-advice
(cond ((ad-advice-enabled advice)
(ad-advice-set-enabled advice nil)
(message "Disabled"))
(t ;disabled
(ad-advice-set-enabled advice t)
(message "Enabled")))
(ad-activate function)
(and anything-in-persistent-action
(anything-c-advice-update-current-display-string))))
(defun anything-c-advice-update-current-display-string ()
(anything-edit-current-selection
(let ((newword (cond ((looking-at "Disabled") "Enabled")
((looking-at "Enabled") "Disabled")))
realvalue)
(when newword
(delete-region (point) (progn (forward-word 1) (point)))
(insert newword)))))
;;;; <Variable>
;;; Emacs variables
;;
;;
(defvar anything-c-source-emacs-variables
'((name . "Emacs Variables")
(candidates . (lambda ()
(sort (all-completions "" obarray 'boundp) 'string-lessp)))
(type . variable)
(requires-pattern . 2))
"Source for completing Emacs variables.")
;;; LaCarte
(defvar anything-c-source-lacarte
'((name . "Lacarte")
(init . (lambda () (require 'lacarte )))
(candidates . (lambda () (delete '(nil) (lacarte-get-overall-menu-item-alist))))
(candidate-number-limit . 9999)
(action . anything-c-call-interactively))
"Needs lacarte.el.
http://www.emacswiki.org/cgi-bin/wiki/download/lacarte.el")
;;; Bookmarks
;;
;;
;; Bind some faces for bookmarks.
(defvar anything-c-bookmarks-face1 'anything-ff-directory)
(defvar anything-c-bookmarks-face2 'anything-ff-file)
(defvar anything-c-bookmarks-face3 'anything-bookmarks-su-face)
(eval-when-compile (require 'bookmark))
(defvar anything-c-source-bookmarks
`((name . "Bookmarks")
(init . (lambda ()
(require 'bookmark)))
(candidates . bookmark-all-names)
(type . bookmark))
"See (info \"(emacs)Bookmarks\").")
;;; bookmark-set
(defvar anything-c-source-bookmark-set
'((name . "Set Bookmark")
(dummy)
(action . bookmark-set))
"See (info \"(emacs)Bookmarks\").")
;;; Visible Bookmarks
;; (install-elisp "http://cvs.savannah.gnu.org/viewvc/*checkout*/bm/bm/bm.el")
;; http://d.hatena.ne.jp/grandVin/20080911/1221114327
(defvar anything-c-source-bm
'((name . "Visible Bookmarks")
(init . anything-c-bm-init)
(candidates-in-buffer)
(type . line))
"Needs bm.el.
http://www.nongnu.org/bm/")
(defun anything-c-bm-init ()
"Init function for `anything-c-source-bm'."
(when (require 'bm nil t)
(with-no-warnings
(let ((bookmarks (bm-lists))
(buf (anything-candidate-buffer 'global)))
(dolist (bm (sort* (append (car bookmarks) (cdr bookmarks))
'< :key 'overlay-start))
(let ((start (overlay-start bm))
(end (overlay-end bm))
(annotation (or (overlay-get bm 'annotation) "")))
(unless (< (- end start) 1) ; org => (if (< (- end start) 2)
(let ((str (format "%5d: [%s]: %s\n"
(line-number-at-pos start)
annotation
(buffer-substring start (1- end)))))
(with-current-buffer buf (insert str))))))))))
;;; Special bookmarks
(defvar anything-c-source-bookmarks-ssh
'((name . "Bookmarks-ssh")
(init . (lambda ()
(require 'bookmark)))
(candidates . (lambda () (anything-c-collect-bookmarks :ssh t)))
(type . bookmark))
"See (info \"(emacs)Bookmarks\").")
(defvar anything-c-source-bookmarks-su
'((name . "Bookmarks-root")
(init . (lambda ()
(require 'bookmark)))
(candidates . (lambda () (anything-c-collect-bookmarks :su t)))
(filtered-candidate-transformer anything-c-highlight-bookmark-su)
(type . bookmark))
"See (info \"(emacs)Bookmarks\").")
(defvar anything-c-source-bookmarks-local
'((name . "Bookmarks-Local")
(init . (lambda ()
(require 'bookmark)))
(candidates . (lambda () (anything-c-collect-bookmarks :local t)))
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-bookmark)
(type . bookmark))
"See (info \"(emacs)Bookmarks\").")
(defun* anything-c-collect-bookmarks (&key local su sudo ssh)
(let* ((lis-all (bookmark-all-names))
(lis-loc (cond (local (loop for i in lis-all
unless (string-match "^(ssh)\\|^(su)" i)
collect i))
(su (loop for i in lis-all
when (string-match "^(su)" i)
collect i))
(sudo (loop for i in lis-all
when (string-match "^(sudo)" i)
collect i))
(ssh (loop for i in lis-all
when (string-match "^(ssh)" i)
collect i)))))
(sort lis-loc 'string-lessp)))
(defun anything-c-bookmark-root-logged-p ()
(catch 'break
(dolist (i (mapcar #'buffer-name (buffer-list)))
(when (string-match (format "*tramp/%s ." anything-su-or-sudo) i)
(throw 'break t)))))
(defun anything-c-highlight-bookmark-su (files source)
(if (anything-c-bookmark-root-logged-p)
(anything-c-highlight-bookmark files source)
(anything-c-highlight-not-logged files source)))
(defun anything-c-highlight-not-logged (files source)
(loop for i in files
collect (propertize i 'face anything-c-bookmarks-face3)))
(defun anything-c-highlight-bookmark (bookmarks source)
"Used as `candidate-transformer' to colorize bookmarks.
Work both with standard Emacs bookmarks and bookmark-extensions.el."
(loop for i in bookmarks
for isfile = (bookmark-get-filename i)
for bufp = (and (fboundp 'bmkext-get-buffer-name)
(bmkext-get-buffer-name i))
for handlerp = (and (fboundp 'bookmark-get-handler)
(bookmark-get-handler i))
for isw3m = (and (fboundp 'bmkext-w3m-bookmark-p)
(bmkext-w3m-bookmark-p i))
for isgnus = (and (fboundp 'bmkext-gnus-bookmark-p)
(bmkext-gnus-bookmark-p i))
for isman = (and (fboundp 'bmkext-man-bookmark-p) ; Man
(bmkext-man-bookmark-p i))
for iswoman = (and (fboundp 'bmkext-woman-bookmark-p) ; Woman
(bmkext-woman-bookmark-p i))
for handlerp = (bookmark-get-handler i)
for isannotation = (bookmark-get-annotation i)
for isabook = (string= (bookmark-prop-get i 'type) "addressbook")
for isinfo = (eq handlerp 'Info-bookmark-jump)
;; Add a * if bookmark have annotation
if (and isannotation (not (string-equal isannotation "")))
do (setq i (concat "*" i))
collect (cond (;; info buffers
isinfo
(propertize i 'face 'anything-bmkext-info 'help-echo isfile))
(;; w3m buffers
isw3m
(propertize i 'face 'anything-bmkext-w3m 'help-echo isfile))
(;; gnus buffers
isgnus
(propertize i 'face 'anything-bmkext-gnus 'help-echo isfile))
(;; Man Woman
(or iswoman isman)
(propertize i 'face 'anything-bmkext-man 'help-echo isfile))
(;; Addressbook
isabook
(propertize i 'face '((:foreground "Tomato"))))
(;; directories
(and isfile (file-directory-p isfile))
(propertize i 'face anything-c-bookmarks-face1 'help-echo isfile))
(;; regular files
t
(propertize i 'face 'anything-bmkext-file 'help-echo isfile)))))
(defun anything-c-bookmark-jump (candidate)
"Jump to bookmark from keyboard."
(let ((current-prefix-arg anything-current-prefix-arg))
(bookmark-jump candidate)))
;;;###autoload
(defun anything-c-bookmark-run-jump-other-window ()
"Jump to bookmark from keyboard."
(interactive)
(anything-c-quit-and-execute-action 'bookmark-jump-other-window))
;;;###autoload
(defun anything-c-bookmark-run-delete ()
"Delete bookmark from keyboard."
(interactive)
(when (y-or-n-p "Delete bookmark?")
(anything-c-quit-and-execute-action 'anything-delete-marked-bookmarks)))
;;; Sources to filter bookmark-extensions bookmarks.
;;
;;
;; Dependency: http://mercurial.intuxication.org/hg/emacs-bookmark-extension
;; If you want to enable google-maps in addressbook you will need
;; Julien Danjou google-maps-el package available here:
;; http://julien.danjou.info/google-maps-el.html
(defun anything-c-bmkext-filter-setup-alist (fn &rest args)
"Return a filtered `bookmark-alist' sorted alphabetically."
(loop
with alist = (if args
(apply #'(lambda (x) (funcall fn x)) args)
(funcall fn))
for i in alist
for b = (car i)
collect b into sa
finally return (sort sa 'string-lessp)))
;;;###autoload
(defun anything-c-bmkext-run-edit ()
"Run `bmkext-edit-bookmark' from keyboard."
(interactive)
(anything-c-quit-and-execute-action 'bmkext-edit-bookmark))
;;; Addressbook.
;;
;;
(defvar anything-c-source-bmkext-addressbook
'((name . "Bookmark Addressbook")
(init . (lambda ()
(require 'bookmark-extensions)
(bookmark-maybe-load-default-file)))
(candidates . anything-c-bmkext-addressbook-setup-alist)
(persistent-action
. (lambda (candidate)
(let ((bmk (anything-bookmark-get-bookmark-from-name
candidate)))
(bookmark--jump-via bmk 'pop-to-buffer))))
(persistent-help . "Show contact - Prefix with C-u to append")
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-bookmark)
(action . (("Show Contact(s)"
. (lambda (candidate)
(let* ((contacts (anything-marked-candidates))
(current-prefix-arg (or anything-current-prefix-arg
(> (length contacts) 1))))
(bookmark-jump
(anything-bookmark-get-bookmark-from-name (car contacts)))
(anything-aif (cdr contacts)
(loop for bmk in it do
(bookmark-jump
(anything-bookmark-get-bookmark-from-name bmk)))))))
("Send Mail"
. (lambda (candidate)
(let* ((contacts (anything-marked-candidates))
(bmk (anything-bookmark-get-bookmark-from-name
(car contacts)))
(append (message-buffers)))
(if append
(addressbook-set-mail-buffer1 bmk 'append)
(addressbook-set-mail-buffer1 bmk))
(setq contacts (cdr contacts))
(when contacts
(loop for bmk in contacts do
(addressbook-set-mail-buffer1 bmk 'append))))))
("Edit Bookmark"
. (lambda (candidate)
(let ((bmk (anything-bookmark-get-bookmark-from-name
candidate)))
(addressbook-bookmark-edit
(assoc bmk bookmark-alist)))))
("Insert Email at point"
. (lambda (candidate)
(let* ((bmk (anything-bookmark-get-bookmark-from-name
candidate))
(mlist (split-string
(assoc-default
'email (assoc bmk bookmark-alist))
", ")))
(insert
(if (> (length mlist) 1)
(anything-comp-read
"Insert Mail Address: " mlist :must-match t)
(car mlist))))))
("Show annotation"
. (lambda (candidate)
(let ((bmk (anything-bookmark-get-bookmark-from-name
candidate)))
(bookmark-show-annotation bmk))))
("Edit annotation"
. (lambda (candidate)
(let ((bmk (anything-bookmark-get-bookmark-from-name
candidate)))
(bookmark-edit-annotation bmk))))
("Show Google map"
. (lambda (candidate)
(let* ((bmk (anything-bookmark-get-bookmark-from-name
candidate))
(full-bmk (assoc bmk bookmark-alist)))
(addressbook-google-map full-bmk))))))))
(defun anything-c-bmkext-addressbook-setup-alist ()
"Specialized filter function for bookmarks w3m."
(anything-c-bmkext-filter-setup-alist 'bmkext-addressbook-alist-only))
;; W3m bookmarks from bookmark-extensions.
(defvar anything-c-source-bookmark-w3m
'((name . "Bookmark W3m")
(init . (lambda ()
(require 'bookmark-extensions)
(bookmark-maybe-load-default-file)))
(candidates . anything-c-bookmark-w3m-setup-alist)
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-bookmark)
(type . bookmark)))
(defun anything-c-bookmark-w3m-setup-alist ()
"Specialized filter function for bookmarks w3m."
(anything-c-bmkext-filter-setup-alist 'bmkext-w3m-alist-only))
;; Images
(defvar anything-c-source-bookmark-images
'((name . "Bookmark Images")
(init . (lambda ()
(require 'bookmark-extensions)
(bookmark-maybe-load-default-file)))
(candidates . anything-c-bookmark-images-setup-alist)
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-bookmark)
(type . bookmark)))
(defun anything-c-bookmark-images-setup-alist ()
"Specialized filter function for images bookmarks."
(anything-c-bmkext-filter-setup-alist 'bmkext-image-file-alist-only))
;; Woman Man
(defvar anything-c-source-bookmark-man
'((name . "Bookmark Woman&Man")
(init . (lambda ()
(require 'bookmark-extensions)
(bookmark-maybe-load-default-file)))
(candidates . anything-c-bookmark-man-setup-alist)
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-bookmark)
(type . bookmark)))
(defun anything-c-bookmark-man-setup-alist ()
"Specialized filter function for bookmarks w3m."
(append (anything-c-bmkext-filter-setup-alist 'bmkext-man-alist-only)
(anything-c-bmkext-filter-setup-alist 'bmkext-woman-alist-only)))
;; Gnus
(defvar anything-c-source-bookmark-gnus
'((name . "Bookmark Gnus")
(init . (lambda ()
(require 'bookmark-extensions)
(bookmark-maybe-load-default-file)))
(candidates . anything-c-bookmark-gnus-setup-alist)
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-bookmark)
(type . bookmark)))
(defun anything-c-bookmark-gnus-setup-alist ()
"Specialized filter function for bookmarks gnus."
(anything-c-bmkext-filter-setup-alist 'bmkext-gnus-alist-only))
;; Info
(defvar anything-c-source-bookmark-info
'((name . "Bookmark Info")
(init . (lambda ()
(require 'bookmark-extensions)
(bookmark-maybe-load-default-file)))
(candidates . anything-c-bookmark-info-setup-alist)
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-bookmark)
(type . bookmark)))
(defun anything-c-bookmark-info-setup-alist ()
"Specialized filter function for bookmarks info."
(anything-c-bmkext-filter-setup-alist 'bmkext-info-alist-only))
;; Local Files&directories
(defvar anything-c-source-bookmark-files&dirs
'((name . "Bookmark Files&Directories")
(init . (lambda ()
(require 'bookmark-extensions)
(bookmark-maybe-load-default-file)))
(candidates . anything-c-bookmark-local-files-setup-alist)
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-bookmark)
(type . bookmark)))
(defun anything-c-bookmark-local-files-setup-alist ()
"Specialized filter function for bookmarks locals files."
(anything-c-bmkext-filter-setup-alist 'bmkext-local-file-alist-only))
;; Su Files&directories
(defvar anything-c-source-bookmark-su-files&dirs
'((name . "Bookmark Root-Files&Directories")
(init . (lambda ()
(require 'bookmark-extensions)
(bookmark-maybe-load-default-file)))
(candidates . anything-c-bookmark-su-files-setup-alist)
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-bookmark-su)
(type . bookmark)))
(defun anything-c-bookmark-su-files-setup-alist ()
"Specialized filter function for bookmarks su/sudo files."
(declare (special bmkext-su-or-sudo-regexp))
(loop
with l = (anything-c-bmkext-filter-setup-alist 'bmkext-remote-file-alist-only)
for i in l
for isfile = (bookmark-get-filename i)
for istramp = (and isfile (boundp 'tramp-file-name-regexp)
(save-match-data
(string-match tramp-file-name-regexp isfile)))
for issu = (and istramp
(string-match bmkext-su-or-sudo-regexp isfile))
if issu
collect i))
;; Ssh Files&directories
(defvar anything-c-source-bookmark-ssh-files&dirs
'((name . "Bookmark Ssh-Files&Directories")
(init . (lambda ()
(require 'bookmark-extensions)
(bookmark-maybe-load-default-file)))
(candidates . anything-c-bookmark-ssh-files-setup-alist)
(filtered-candidate-transformer . anything-c-adaptive-sort)
(type . bookmark)))
(defun anything-c-bookmark-ssh-files-setup-alist ()
"Specialized filter function for bookmarks ssh files."
(loop
with l = (anything-c-bmkext-filter-setup-alist 'bmkext-remote-file-alist-only)
for i in l
for isfile = (bookmark-get-filename i)
for istramp = (and isfile (boundp 'tramp-file-name-regexp)
(save-match-data
(string-match tramp-file-name-regexp isfile)))
for isssh = (and istramp
(string-match "/ssh:" isfile))
if isssh
collect i))
;;; Firefox bookmarks
;;
;;
;; You will have to set firefox to import bookmarks in his html file bookmarks.html.
;; (only for firefox versions >=3)
;; To achieve that, open about:config in firefox and double click on this line to enable value
;; to true:
;; user_pref("browser.bookmarks.autoExportHTML", false);
;; You should have now:
;; user_pref("browser.bookmarks.autoExportHTML", true);
;; NOTE: This is also working in the same way for mozilla aka seamonkey.
(defvar anything-firefox-bookmark-url-regexp "\\(https\\|http\\|ftp\\|about\\|file\\)://[^ \"]*")
(defvar anything-firefox-bookmarks-regexp ">\\([^><]+.[^</a>]\\)")
(defun anything-get-firefox-user-init-dir ()
"Guess the default Firefox user directory name."
(let* ((moz-dir (concat (getenv "HOME") "/.mozilla/firefox/"))
(moz-user-dir
(with-current-buffer (find-file-noselect (concat moz-dir "profiles.ini"))
(goto-char (point-min))
(prog1
(when (search-forward "Path=" nil t)
(buffer-substring-no-properties (point) (point-at-eol)))
(kill-buffer)))))
(file-name-as-directory (concat moz-dir moz-user-dir))))
(defun anything-guess-firefox-bookmark-file ()
"Return the path of the Firefox bookmarks file."
(concat (anything-get-firefox-user-init-dir) "bookmarks.html"))
(defun anything-html-bookmarks-to-alist (file url-regexp bmk-regexp)
"Parse html bookmark FILE and return an alist with (title . url) as elements."
(let (bookmarks-alist url title)
(with-temp-buffer
(insert-file-contents file)
(goto-char (point-min))
(while (re-search-forward "href=\\|^ *<DT><A HREF=" nil t)
(forward-line 0)
(when (re-search-forward url-regexp nil t)
(setq url (match-string 0)))
(when (re-search-forward bmk-regexp nil t)
(setq title (match-string 1)))
(push (cons title url) bookmarks-alist)
(forward-line)))
(nreverse bookmarks-alist)))
(defvar anything-c-firefox-bookmarks-alist nil)
(defvar anything-c-source-firefox-bookmarks
'((name . "Firefox Bookmarks")
(init . (lambda ()
(setq anything-c-firefox-bookmarks-alist
(anything-html-bookmarks-to-alist
(anything-guess-firefox-bookmark-file)
anything-firefox-bookmark-url-regexp
anything-firefox-bookmarks-regexp))))
(candidates . (lambda ()
(mapcar #'car anything-c-firefox-bookmarks-alist)))
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-firefox-bookmarks)
(action . (("Browse Url"
. (lambda (candidate)
(anything-c-browse-url
(anything-c-firefox-bookmarks-get-value candidate))))
("Copy Url"
. (lambda (elm)
(kill-new (anything-c-w3m-bookmarks-get-value elm))))))))
(defun anything-c-firefox-bookmarks-get-value (elm)
(assoc-default elm anything-c-firefox-bookmarks-alist))
(defun anything-c-highlight-firefox-bookmarks (bookmarks source)
(loop for i in bookmarks
collect (propertize
i 'face '((:foreground "YellowGreen"))
'help-echo (anything-c-firefox-bookmarks-get-value i))))
;;; W3m bookmark - anything interface.
;;
;;
;; Some users have the emacs-w3m library in load-path
;; without having the w3m executable :-;
;; So check if w3m program is present before trying to load
;; emacs-w3m.
(eval-when-compile
(when (executable-find "w3m")
(require 'w3m-bookmark nil t)))
(defvar w3m-bookmark-file "~/.w3m/bookmark.html")
(defvar anything-w3m-bookmarks-regexp ">\\([^><]+.[^</a>]\\)")
(defvar anything-w3m-bookmark-url-regexp "\\(https\\|http\\|ftp\\|file\\)://[^>]*")
(defvar anything-c-w3m-bookmarks-alist nil)
(defvar anything-c-source-w3m-bookmarks
'((name . "W3m Bookmarks")
(init . (lambda ()
(setq anything-c-w3m-bookmarks-alist
(anything-html-bookmarks-to-alist
w3m-bookmark-file
anything-w3m-bookmark-url-regexp
anything-w3m-bookmarks-regexp))))
(candidates . (lambda ()
(mapcar #'car anything-c-w3m-bookmarks-alist)))
(filtered-candidate-transformer
anything-c-adaptive-sort
anything-c-highlight-w3m-bookmarks)
(action . (("Browse Url"
. (lambda (candidate)
(anything-c-w3m-browse-bookmark candidate)))
("Copy Url"
. (lambda (elm)
(kill-new (anything-c-w3m-bookmarks-get-value elm))))
("Browse Url Externally"
. (lambda (candidate)
(anything-c-w3m-browse-bookmark candidate t)))
("Delete Bookmark"
. (lambda (candidate)
(anything-c-w3m-delete-bookmark candidate)))
("Rename Bookmark"
. (lambda (candidate)
(anything-c-w3m-rename-bookmark candidate)))))
(persistent-action . (lambda (candidate)
(if current-prefix-arg
(anything-c-w3m-browse-bookmark candidate t)
(anything-c-w3m-browse-bookmark candidate nil t))))
(persistent-help . "Open URL with emacs-w3m in new tab / \
C-u \\[anything-execute-persistent-action]: Open URL with Firefox"))
"Needs w3m and emacs-w3m.
http://w3m.sourceforge.net/
http://emacs-w3m.namazu.org/")
(defun anything-c-w3m-bookmarks-get-value (elm)
(replace-regexp-in-string
"\"" "" (cdr (assoc elm anything-c-w3m-bookmarks-alist))))
(defun anything-c-w3m-browse-bookmark (elm &optional use-external new-tab)
(let* ((fn (if use-external 'anything-c-browse-url 'w3m-browse-url))
(arg (and (eq fn 'w3m-browse-url) new-tab)))
(funcall fn (anything-c-w3m-bookmarks-get-value elm) arg)))
(defun anything-c-highlight-w3m-bookmarks (bookmarks source)
(loop for i in bookmarks
collect (propertize
i 'face 'anything-w3m-bookmarks-face
'help-echo (anything-c-w3m-bookmarks-get-value i))))
(defun anything-c-w3m-delete-bookmark (elm)
"Delete w3m bookmark from `w3m-bookmark-file'."
(with-current-buffer
(find-file-literally w3m-bookmark-file)
(goto-char (point-min))
(when (re-search-forward elm nil t)
(beginning-of-line)
(delete-region (point)
(line-end-position))
(delete-blank-lines))
(save-buffer)
(kill-buffer)))
(defun anything-c-w3m-rename-bookmark (elm)
"Rename w3m bookmark in `w3m-bookmark-file'."
(let* ((old-title (replace-regexp-in-string ">" "" elm))
(new-title (read-string "NewTitle: " old-title)))
(with-current-buffer
(find-file-literally w3m-bookmark-file)
(goto-char (point-min))
(when (re-search-forward (concat elm "<") nil t)
(goto-char (1- (point)))
(delete-char (- (length old-title)))
(insert new-title))
(save-buffer)
(kill-buffer))))
;;;; <Library>
;;; Elisp library scan
;;
;;
(defvar anything-c-source-elisp-library-scan
'((name . "Elisp libraries (Scan)")
(init . (anything-c-elisp-library-scan-init))
(candidates-in-buffer)
(action ("Find library"
. (lambda (candidate) (find-file (find-library-name candidate))))
("Find library other window"
. (lambda (candidate)
(find-file-other-window (find-library-name candidate))))
("Load library"
. (lambda (candidate) (load-library candidate))))))
(defun anything-c-elisp-library-scan-init ()
"Init anything buffer status."
(let ((anything-buffer (anything-candidate-buffer 'global))
(library-list (anything-c-elisp-library-scan-list)))
(with-current-buffer anything-buffer
(dolist (library library-list)
(insert (format "%s\n" library))))))
(defun anything-c-elisp-library-scan-list (&optional dirs string)
"Do completion for file names passed to `locate-file'.
DIRS is directory to search path.
STRING is string to match."
;; Use `load-path' as path when ignore `dirs'.
(or dirs (setq dirs load-path))
;; Init with blank when ignore `string'.
(or string (setq string ""))
;; Get library list.
(let ((string-dir (file-name-directory string))
;; File regexp that suffix match `load-file-rep-suffixes'.
(match-regexp (format "^.*\\.el%s$" (regexp-opt load-file-rep-suffixes)))
name
names)
(dolist (dir dirs)
(unless dir
(setq dir default-directory))
(if string-dir
(setq dir (expand-file-name string-dir dir)))
(when (file-directory-p dir)
(dolist (file (file-name-all-completions
(file-name-nondirectory string) dir))
;; Suffixes match `load-file-rep-suffixes'.
(setq name (if string-dir (concat string-dir file) file))
(if (string-match match-regexp name)
(add-to-list 'names name)))))
names))
;;;; <Programming>
;;
;;
;;; Imenu
;;
;;
(defvar anything-c-imenu-delimiter " / ")
(defvar anything-c-imenu-index-filter nil)
(make-variable-buffer-local 'anything-c-imenu-index-filter)
(defvar anything-c-cached-imenu-alist nil)
(make-variable-buffer-local 'anything-c-cached-imenu-alist)
(defvar anything-c-cached-imenu-candidates nil)
(make-variable-buffer-local 'anything-c-cached-imenu-candidates)
(defvar anything-c-cached-imenu-tick nil)
(make-variable-buffer-local 'anything-c-cached-imenu-tick)
(eval-when-compile (require 'imenu))
(setq imenu-auto-rescan t)
(defun anything-imenu-create-candidates (entry)
"Create candidates with ENTRY."
(if (listp (cdr entry))
(mapcan
(lambda (sub)
(if (consp (cdr sub))
(mapcar
(lambda (subentry)
(concat (car entry) anything-c-imenu-delimiter subentry))
(anything-imenu-create-candidates sub))
(list (concat (car entry) anything-c-imenu-delimiter (car sub)))))
(cdr entry))
(list entry)))
(defvar anything-c-source-imenu
'((name . "Imenu")
(init . (lambda () (require 'imenu)))
(candidates . anything-c-imenu-candidates)
(persistent-action . (lambda (elm)
(anything-c-imenu-default-action elm)
(unless (fboundp 'semantic-imenu-tag-overlay)
(anything-match-line-color-current-line))))
(persistent-help . "Show this entry")
(action . anything-c-imenu-default-action))
"See (info \"(emacs)Imenu\")")
(defun anything-c-imenu-candidates ()
(with-anything-current-buffer
(let ((tick (buffer-modified-tick)))
(if (eq anything-c-cached-imenu-tick tick)
anything-c-cached-imenu-candidates
(setq imenu--index-alist nil)
(setq anything-c-cached-imenu-tick tick
anything-c-cached-imenu-candidates
(ignore-errors
(mapcan
'anything-imenu-create-candidates
(setq anything-c-cached-imenu-alist
(let ((index (imenu--make-index-alist)))
(if anything-c-imenu-index-filter
(funcall anything-c-imenu-index-filter index)
index))))))
(setq anything-c-cached-imenu-candidates
(mapcar #'(lambda (x)
(if (stringp x)
x
(car x)))
anything-c-cached-imenu-candidates))))))
(setq imenu-default-goto-function 'imenu-default-goto-function)
(defun anything-c-imenu-default-action (elm)
"The default action for `anything-c-source-imenu'."
(let ((path (split-string elm anything-c-imenu-delimiter))
(alist anything-c-cached-imenu-alist))
(dolist (elm path)
(setq alist (assoc elm alist)))
(imenu alist)))
;;; Ctags
;;
;;
(defvar anything-c-ctags-modes
'( c-mode c++-mode awk-mode csharp-mode java-mode javascript-mode lua-mode
makefile-mode pascal-mode perl-mode cperl-mode php-mode python-mode
scheme-mode sh-mode slang-mode sql-mode tcl-mode ))
(defun anything-c-source-ctags-init ()
(when (and buffer-file-name
(memq major-mode anything-c-ctags-modes)
(anything-current-buffer-is-modified))
(with-current-buffer (anything-candidate-buffer 'local)
(call-process-shell-command
(if (string-match "\\.el\\.gz$" anything-buffer-file-name)
(format "ctags -e -u -f- --language-force=lisp --fields=n =(zcat %s) "
anything-buffer-file-name)
(format "ctags -e -u -f- --fields=n %s " anything-buffer-file-name))
nil (current-buffer))
(goto-char (point-min))
(forward-line 2)
(delete-region (point-min) (point))
(loop while (and (not (eobp)) (search-forward "\001" (point-at-eol) t))
for lineno-start = (point)
for lineno = (buffer-substring
lineno-start
(1- (search-forward "," (point-at-eol) t)))
do
(beginning-of-line)
(insert (format "%5s:" lineno))
(search-forward "\177" (point-at-eol) t)
(delete-region (1- (point)) (point-at-eol))
(forward-line 1)))))
(defvar anything-c-source-ctags
'((name . "Exuberant ctags")
(init . anything-c-source-ctags-init)
(candidates-in-buffer)
(adjust)
(type . line))
"Needs Exuberant Ctags.
http://ctags.sourceforge.net/")
;;; Etags
;;
;;
;; anything-etags.el is deprecated, if this file is found,
;; warn user at compile time.
(eval-when-compile
(when (locate-library "anything-etags.el")
(display-warning
'(anything-config)
"You are using obsolete library `anything-etags.el' and should remove it."
:warning)))
(defvar anything-c-etags-tag-file-dir nil
"Etags file directory.")
(defvar anything-c-etags-mtime-alist nil
"Store the last modification time of etags files here.")
(defvar anything-c-etags-cache (make-hash-table :test 'equal)
"Cache content of etags files used here for faster access.")
(defun anything-c-etags-get-tag-file (&optional directory)
"Return the path of etags file if found."
;; Get tag file from `default-directory' or upper directory.
(let ((current-dir (anything-c-etags-find-tag-file-directory
(or directory default-directory))))
;; Return nil if not find tag file.
(when current-dir
;; Set tag file directory.
(setq anything-c-etags-tag-file-dir current-dir)
(expand-file-name anything-c-etags-tag-file-name current-dir))))
(defun anything-c-etags-find-tag-file-directory (current-dir)
"Try to find the directory containing tag file.
If not found in CURRENT-DIR search in upper directory."
(flet ((file-exists? (dir)
(let ((tag-path (expand-file-name
anything-c-etags-tag-file-name dir)))
(and (stringp tag-path)
(file-regular-p tag-path)
(file-readable-p tag-path)))))
(loop with count = 0
until (file-exists? current-dir)
;; Return nil if outside the value of
;; `anything-c-etags-tag-file-search-limit'.
if (= count anything-c-etags-tag-file-search-limit)
do (return nil)
;; Or search upper directories.
else
do (incf count)
(setq current-dir (expand-file-name (concat current-dir "../")))
finally return current-dir)))
(defun anything-c-source-etags-header-name (x)
"Create header name for this anything etags session."
(concat "Etags in "
(with-anything-current-buffer
(anything-c-etags-get-tag-file))))
(defmacro anything-c-etags-create-buffer (file)
"Create the `anything-buffer' based on contents of etags tag FILE."
`(let* ((tag-fname ,file)
max
(split (with-current-buffer (find-file-noselect tag-fname)
(prog1
(split-string (buffer-string) "\n" 'omit-nulls)
(setq max (line-number-at-pos (point-max)))
(kill-buffer))))
(progress-reporter (make-progress-reporter "Loading tag file..." 0 max)))
(loop
with fname
with cand
for i in split for count from 0
for elm = (unless (string-match "^\x0c" i)
(anything-aif (string-match "\177" i)
(substring i 0 it)
i))
do (cond ((and elm (string-match "^\\(.+\\),[0-9]+" elm))
(setq fname (match-string 1 elm)))
(elm (setq cand (concat fname ": " elm)))
(t (setq cand nil)))
when cand do (progn
(insert (concat cand "\n"))
(progress-reporter-update progress-reporter count)))))
(defun anything-c-etags-init ()
"Feed `anything-buffer' using `anything-c-etags-cache' or tag file.
If no entry in cache, create one."
(let ((tagfile (anything-c-etags-get-tag-file)))
(when tagfile
(with-current-buffer (anything-candidate-buffer 'global)
(anything-aif (gethash tagfile anything-c-etags-cache)
;; An entry is present in cache, insert it.
(insert it)
;; No entry, create a new buffer using content of tag file (slower).
(anything-c-etags-create-buffer tagfile)
;; Store content of buffer in cache.
(puthash tagfile (buffer-string) anything-c-etags-cache)
;; Store or set the last modification of tag file.
(anything-aif (assoc tagfile anything-c-etags-mtime-alist)
;; If an entry exists modify it.
(setcdr it (anything-c-etags-mtime tagfile))
;; No entry create a new one.
(add-to-list 'anything-c-etags-mtime-alist
(cons tagfile (anything-c-etags-mtime tagfile)))))))))
(defvar anything-c-source-etags-select
'((name . "Etags")
(header-name . anything-c-source-etags-header-name)
(init . anything-c-etags-init)
(candidates-in-buffer)
(search . (anything-c-etags-search-fn))
(mode-line . anything-etags-mode-line-string)
(action . anything-c-etags-default-action)
(persistent-action . (lambda (candidate)
(anything-c-etags-default-action candidate)
(anything-match-line-color-current-line))))
"Anything source for Etags.")
(defun anything-c-etags-search-fn (pattern)
"Search function for `anything-c-source-etags-select'."
(re-search-forward
(if anything-c-etags-use-regexp-search
(format anything-c-etags-search-regexp pattern)
pattern)
nil t))
(defun anything-c-etags-default-action (candidate)
"Anything default action to jump to an etags entry."
(let* ((split (split-string candidate ": "))
(fname (expand-file-name
(car split) anything-c-etags-tag-file-dir))
(elm (cadr split)))
(find-file fname)
(goto-char (point-min))
(search-forward elm nil t)
(goto-char (match-beginning 0))))
(defun anything-c-etags-mtime (file)
"Last modification time of etags tag FILE."
(cadr (nth 5 (file-attributes file))))
(defun anything-c-etags-file-modified-p (file)
"Check if tag FILE have been modified in this session.
If FILE is nil return nil."
(let ((last-modif (and file
(assoc-default file anything-c-etags-mtime-alist))))
(and last-modif
(/= last-modif (anything-c-etags-mtime file)))))
;;; Semantic
;;
;;
(defvar anything-semantic-candidates nil)
(defun anything-semantic-construct-candidates (tags depth)
(when (require 'semantic nil t)
(apply
'append
(mapcar
(lambda (tag)
(if (listp tag)
(let ((type (semantic-tag-type tag))
(class (semantic-tag-class tag)))
(if (or (and (stringp type)
(or (string= type "class")
(string= type "namespace")))
(eq class 'function)
(eq class 'variable))
(cons (cons (concat (make-string (* depth 2) ?\s)
(semantic-format-tag-summarize tag nil t))
tag)
(anything-semantic-construct-candidates
(semantic-tag-components tag) (1+ depth)))))))
tags))))
(defun anything-semantic-default-action (candidate)
(let ((tag (cdr (assoc candidate anything-semantic-candidates))))
(semantic-go-to-tag tag)))
(defvar anything-c-source-semantic
'((name . "Semantic Tags")
(init . (lambda ()
(setq anything-semantic-candidates
(ignore-errors (anything-semantic-construct-candidates
(semantic-fetch-tags) 0)))))
(candidates . (lambda ()
(if anything-semantic-candidates
(mapcar 'car anything-semantic-candidates))))
(persistent-action . (lambda (elm)
(anything-semantic-default-action elm)
(anything-match-line-color-current-line)))
(persistent-help . "Show this entry")
(action . anything-semantic-default-action)
"Needs semantic in CEDET.
http://cedet.sourceforge.net/semantic.shtml
http://cedet.sourceforge.net/"))
;;; Anything interface of `simple-call-tree.el'.
;;
;; <http://www.emacswiki.org/cgi-bin/wiki/download/simple-call-tree.el>
;;
;; Function is called by
(defvar anything-c-source-simple-call-tree-functions-callers
'((name . "Function is called by")
(init . anything-c-simple-call-tree-functions-callers-init)
(multiline)
(candidates . anything-c-simple-call-tree-candidates)
(persistent-action . anything-c-simple-call-tree-persistent-action)
(persistent-help . "Show function definitions by rotation")
(action ("Find definition selected by persistent-action" .
anything-c-simple-call-tree-find-definition)))
"Needs simple-call-tree.el.
http://www.emacswiki.org/cgi-bin/wiki/download/simple-call-tree.el")
(defvar anything-c-simple-call-tree-tick nil)
(make-variable-buffer-local 'anything-c-simple-call-tree-tick)
(defun anything-c-simple-call-tree-analyze-maybe ()
(unless (eq (buffer-chars-modified-tick) anything-c-simple-call-tree-tick)
(simple-call-tree-analyze)
(setq anything-c-simple-call-tree-tick (buffer-chars-modified-tick))))
(defun anything-c-simple-call-tree-init-base (function message)
(require 'simple-call-tree)
(with-no-warnings
(when (anything-current-buffer-is-modified)
(anything-c-simple-call-tree-analyze-maybe)
(let ((list (funcall function simple-call-tree-alist)))
(with-current-buffer (anything-candidate-buffer 'local)
(dolist (entry list)
(let ((funcs (concat " " (mapconcat #'identity (cdr entry) "\n "))))
(insert (car entry) message
(if (string= funcs " ")
" no functions."
funcs)
"\n\n"))))))))
(defun anything-c-simple-call-tree-functions-callers-init ()
(anything-c-simple-call-tree-init-base 'simple-call-tree-invert
" is called by\n"))
(defun anything-c-simple-call-tree-candidates ()
(with-current-buffer (anything-candidate-buffer)
(split-string (buffer-string) "\n\n")))
(defvar anything-c-simple-call-tree-related-functions nil)
(defvar anything-c-simple-call-tree-function-index 0)
(defun anything-c-simple-call-tree-persistent-action (candidate)
(unless (eq last-command 'anything-execute-persistent-action)
(setq anything-c-simple-call-tree-related-functions
(delete "no functions."
(split-string
(replace-regexp-in-string " \\| is called by\\| calls "
"" candidate)
"\n")))
(setq anything-c-simple-call-tree-function-index -1))
(incf anything-c-simple-call-tree-function-index)
(anything-c-simple-call-tree-find-definition candidate))
(defun anything-c-simple-call-tree-find-definition (candidate)
(find-function
(intern
(nth (mod anything-c-simple-call-tree-function-index
(length anything-c-simple-call-tree-related-functions))
anything-c-simple-call-tree-related-functions))))
;;; Function calls
(defvar anything-c-source-simple-call-tree-callers-functions
'((name . "Function calls")
(init . anything-c-simple-call-tree-callers-functions-init)
(multiline)
(candidates . anything-c-simple-call-tree-candidates)
(persistent-action . anything-c-simple-call-tree-persistent-action)
(persistent-help . "Show function definitions by rotation")
(action ("Find definition selected by persistent-action" .
anything-c-simple-call-tree-find-definition)))
"Needs simple-call-tree.el.
http://www.emacswiki.org/cgi-bin/wiki/download/simple-call-tree.el")
(defun anything-c-simple-call-tree-callers-functions-init ()
(anything-c-simple-call-tree-init-base 'identity " calls \n"))
;;; Anything UI of auto-document.el
;;
;; <http://www.emacswiki.org/cgi-bin/wiki/download/auto-document.el>
;;
;; Commands/Options with doc
(defvar anything-c-auto-document-data nil)
(make-variable-buffer-local 'anything-c-auto-document-data)
(defvar anything-c-source-commands-and-options-in-file
'((name . "Commands/Options in file")
(header-name
. (lambda (x) (format "Commands/Options in %s"
(buffer-local-value 'buffer-file-name
anything-current-buffer))))
(candidates . anything-command-and-options-candidates)
(multiline)
(action . imenu))
"List Commands and Options with doc. It needs auto-document.el .
http://www.emacswiki.org/cgi-bin/wiki/download/auto-document.el")
(eval-when-compile (require 'auto-document nil t))
(defun anything-command-and-options-candidates ()
(with-anything-current-buffer
(when (and (require 'auto-document nil t)
(eq major-mode 'emacs-lisp-mode)
(or (anything-current-buffer-is-modified)
(not anything-c-auto-document-data)))
(or imenu--index-alist (imenu--make-index-alist t))
(setq anything-c-auto-document-data
(destructuring-bind (commands options)
(adoc-construct anything-current-buffer)
(append
(loop for (command . doc) in commands
for cmdname = (symbol-name command)
collect
(cons
(format "Command: %s\n %s"
(propertize cmdname 'face font-lock-function-name-face)
(adoc-first-line doc))
(assoc cmdname imenu--index-alist)))
(loop with var-alist = (cdr (assoc "Variables" imenu--index-alist))
for (option doc default) in options
for optname = (symbol-name option)
collect
(cons
(format "Option: %s\n %s\n default = %s"
(propertize optname 'face font-lock-variable-name-face)
(adoc-first-line doc)
(adoc-prin1-to-string default))
(assoc optname
var-alist)))))))
anything-c-auto-document-data))
;;;; <Color and Face>
;;
;;; Customize Face
;;
;;
(defvar anything-c-source-customize-face
'((name . "Customize Face")
(init . (lambda ()
(unless (anything-candidate-buffer)
(save-selected-window
(list-faces-display))
(anything-candidate-buffer (get-buffer "*Faces*")))))
(candidates-in-buffer)
(get-line . buffer-substring)
(action . (lambda (line)
(customize-face (intern (car (split-string line))))))
(requires-pattern . 3))
"See (info \"(emacs)Faces\")")
;;; Colors browser
;;
;;
(defvar anything-c-source-colors
'((name . "Colors")
(init . (lambda () (unless (anything-candidate-buffer)
(save-selected-window
(list-colors-display))
(anything-candidate-buffer (get-buffer "*Colors*")))))
(candidates-in-buffer)
(get-line . buffer-substring)
(action
("Copy Name" . (lambda (candidate)
(kill-new (anything-c-colors-get-name candidate))))
("Copy RGB" . (lambda (candidate)
(kill-new (anything-c-colors-get-rgb candidate))))
("Insert Name" . (lambda (candidate)
(with-anything-current-buffer
(insert (anything-c-colors-get-name candidate)))))
("Insert RGB" . (lambda (candidate)
(with-anything-current-buffer
(insert (anything-c-colors-get-rgb candidate))))))))
(defun anything-c-colors-get-name (candidate)
"Get color name."
(replace-regexp-in-string
" " ""
(with-temp-buffer
(insert (capitalize candidate))
(goto-char (point-min))
(search-forward-regexp "\\s-\\{2,\\}")
(delete-region (point) (point-max))
(buffer-string))))
(defun anything-c-colors-get-rgb (candidate)
"Get color RGB."
(replace-regexp-in-string
" " ""
(with-temp-buffer
(insert (capitalize candidate))
(goto-char (point-max))
(search-backward-regexp "\\s-\\{2,\\}")
(delete-region (point) (point-min))
(buffer-string))))
;;;; <Search Engine>
;;; Tracker desktop search
(defvar anything-c-source-tracker-search
'((name . "Tracker Search")
(candidates . (lambda ()
(start-process "tracker-search-process" nil
"tracker-search"
anything-pattern)))
(type . file)
(requires-pattern . 3)
(delayed))
"Source for retrieving files matching the current input pattern
with the tracker desktop search.")
;;; Spotlight (MacOS X desktop search)
(defvar anything-c-source-mac-spotlight
'((name . "mdfind")
(candidates
. (lambda () (start-process "mdfind-process" nil "mdfind" anything-pattern)))
(type . file)
(requires-pattern . 3)
(delayed))
"Source for retrieving files via Spotlight's command line
utility mdfind.")
;;; Picklist
(defvar anything-c-source-picklist
'((name . "Picklist")
(candidates . (lambda () (mapcar 'car picklist-list)))
(type . file)))
;;; Kill ring
;;
;;
(defvar anything-c-source-kill-ring
`((name . "Kill Ring")
(init . (lambda () (anything-attrset 'last-command last-command)))
(candidates . anything-c-kill-ring-candidates)
(filtered-candidate-transformer anything-c-kill-ring-transformer)
(action . anything-c-kill-ring-action)
(keymap . ,anything-kill-ring-map)
(last-command)
(migemo)
(multiline))
"Source for browse and insert contents of kill-ring.")
(defun anything-c-kill-ring-candidates ()
(loop for kill in (anything-fast-remove-dups kill-ring :test 'equal)
unless (or (< (length kill) anything-kill-ring-threshold)
(string-match "^[\\s\\t]+$" kill))
collect kill))
(defun anything-c-kill-ring-transformer (candidates source)
"Display only the `anything-c-kill-ring-max-lines-number' lines of candidate."
(loop for i in candidates
for nlines = (with-temp-buffer (insert i) (count-lines (point-min) (point-max)))
if (and anything-c-kill-ring-max-lines-number
(> nlines anything-c-kill-ring-max-lines-number))
collect (cons
(with-temp-buffer
(insert i)
(goto-char (point-min))
(concat
(buffer-substring
(point-min)
(save-excursion
(forward-line anything-c-kill-ring-max-lines-number)
(point)))
"[...]")) i)
else collect i))
(defun anything-c-kill-ring-action (str)
"Insert STR in `kill-ring' and set STR to the head.
If this action is executed just after `yank',
replace with STR as yanked string."
(setq kill-ring (delete str kill-ring))
(if (not (eq (anything-attr 'last-command) 'yank))
(insert-for-yank str)
;; from `yank-pop'
(let ((inhibit-read-only t)
(before (< (point) (mark t))))
(if before
(funcall (or yank-undo-function 'delete-region) (point) (mark t))
(funcall (or yank-undo-function 'delete-region) (mark t) (point)))
(setq yank-undo-function nil)
(set-marker (mark-marker) (point) (current-buffer))
(insert-for-yank str)
;; Set the window start back where it was in the yank command,
;; if possible.
(set-window-start (selected-window) yank-window-start t)
(if before
;; This is like exchange-point-and-mark, but doesn't activate the mark.
;; It is cleaner to avoid activation, even though the command
;; loop would deactivate the mark because we inserted text.
(goto-char (prog1 (mark t)
(set-marker (mark-marker) (point) (current-buffer)))))))
(kill-new str))
;;;; <Mark ring>
;; DO NOT include these sources in `anything-sources' use
;; the commands `anything-mark-ring', `anything-global-mark-ring' or
;; `anything-all-mark-rings' instead.
(defun anything-c-source-mark-ring-candidates ()
(flet ((get-marks (pos)
(save-excursion
(goto-char pos)
(beginning-of-line)
(let ((line (car (split-string (thing-at-point 'line) "[\n\r]"))))
(when (string= "" line)
(setq line "<EMPTY LINE>"))
(format "%7d: %s" (line-number-at-pos) line)))))
(with-anything-current-buffer
(loop
with marks = (if (mark) (cons (mark-marker) mark-ring) mark-ring)
with recip = nil
for i in marks
for m = (get-marks i)
unless (member m recip)
collect m into recip
finally return recip))))
(defvar anything-mark-ring-cache nil)
(defvar anything-c-source-mark-ring
'((name . "mark-ring")
(init . (lambda ()
(setq anything-mark-ring-cache
(ignore-errors (anything-c-source-mark-ring-candidates)))))
(candidates . (lambda ()
(anything-aif anything-mark-ring-cache
it)))
(action . (("Goto line"
. (lambda (candidate)
(anything-goto-line (string-to-number candidate))))))
(persistent-action . (lambda (candidate)
(anything-goto-line (string-to-number candidate))
(anything-match-line-color-current-line)))
(persistent-help . "Show this line")))
;;; Global-mark-ring
(defvar anything-c-source-global-mark-ring
'((name . "global-mark-ring")
(candidates . anything-c-source-global-mark-ring-candidates)
(action . (("Goto line"
. (lambda (candidate)
(let ((items (split-string candidate ":")))
(anything-c-switch-to-buffer (second items))
(anything-goto-line (string-to-number (car items))))))))
(persistent-action . (lambda (candidate)
(let ((items (split-string candidate ":")))
(anything-c-switch-to-buffer (second items))
(anything-goto-line (string-to-number (car items)))
(anything-match-line-color-current-line))))
(persistent-help . "Show this line")))
(defun anything-c-source-global-mark-ring-candidates ()
(flet ((buf-fn (m)
(with-current-buffer (marker-buffer m)
(goto-char m)
(beginning-of-line)
(let (line)
(if (string= "" line)
(setq line "<EMPTY LINE>")
(setq line (car (split-string (thing-at-point 'line)
"[\n\r]"))))
(format "%7d:%s: %s"
(line-number-at-pos) (marker-buffer m) line)))))
(loop
with marks = global-mark-ring
with recip = nil
for i in marks
for gm = (unless (or (string-match
"^ " (format "%s" (marker-buffer i)))
(null (marker-buffer i)))
(buf-fn i))
when (and gm (not (member gm recip)))
collect gm into recip
finally return recip)))
;;;; <Register>
;;; Insert from register
(defvar anything-c-source-register
'((name . "Registers")
(candidates . anything-c-register-candidates)
(action-transformer . anything-c-register-action-transformer)
(multiline)
(action))
"See (info \"(emacs)Registers\")")
(defun anything-c-register-candidates ()
"Collecting register contents and appropriate commands."
(loop for (char . val) in register-alist
for key = (single-key-description char)
for string-actions =
(cond
((numberp val)
(list (int-to-string val)
'insert-register
'increment-register))
((markerp val)
(let ((buf (marker-buffer val)))
(if (null buf)
(list "a marker in no buffer")
(list (concat
"a buffer position:"
(buffer-name buf)
", position "
(int-to-string (marker-position val)))
'jump-to-register
'insert-register))))
((and (consp val) (window-configuration-p (car val)))
(list "window configuration."
'jump-to-register))
((and (consp val) (frame-configuration-p (car val)))
(list "frame configuration."
'jump-to-register))
((and (consp val) (eq (car val) 'file))
(list (concat "file:"
(prin1-to-string (cdr val))
".")
'jump-to-register))
((and (consp val) (eq (car val) 'file-query))
(list (concat "file:a file-query reference: file "
(car (cdr val))
", position "
(int-to-string (car (cdr (cdr val))))
".")
'jump-to-register))
((consp val)
(let ((lines (format "%4d" (length val))))
(list (format "%s: %s\n" lines
(truncate-string-to-width
(mapconcat 'identity (list (car val))
"^J") (- (window-width) 15)))
'insert-register)))
((stringp val)
(list
;; without properties
(concat (substring-no-properties
val 0 (min (length val) anything-c-register-max-offset))
(if (> (length val) anything-c-register-max-offset)
"[...]" ""))
'insert-register
'append-to-register
'prepend-to-register))
((vectorp val)
(list
"Undo-tree entry."
'undo-tree-restore-state-from-register))
(t
"GARBAGE!"))
collect (cons (format "register %3s: %s" key (car string-actions))
(cons char (cdr string-actions)))))
(defun anything-c-register-action-transformer (actions register-and-functions)
"Decide actions by the contents of register."
(loop with func-actions =
'((insert-register
"Insert Register" .
(lambda (c) (insert-register (car c))))
(jump-to-register
"Jump to Register" .
(lambda (c) (jump-to-register (car c))))
(append-to-register
"Append Region to Register" .
(lambda (c) (append-to-register
(car c) (region-beginning) (region-end))))
(prepend-to-register
"Prepend Region to Register" .
(lambda (c) (prepend-to-register
(car c) (region-beginning) (region-end))))
(increment-register
"Increment Prefix Arg to Register" .
(lambda (c) (increment-register
anything-current-prefix-arg (car c))))
(undo-tree-restore-state-from-register
"Restore Undo-tree register"
(lambda (c) (and (fboundp 'undo-tree-restore-state-from-register)
(undo-tree-restore-state-from-register (car c))))))
for func in (cdr register-and-functions)
for cell = (assq func func-actions)
when cell
collect (cdr cell)))
;;; Latex completion
(defun anything-c-latex-math-candidates ()
"Collect candidates for latex math completion."
(declare (special LaTeX-math-menu))
(loop for i in (cddr LaTeX-math-menu)
for elm = (loop for s in i when (vectorp s)
collect (cons (aref s 0) (aref s 1)))
append elm))
(defvar anything-c-source-latex-math
'((name . "Latex Math Menu")
(init . (lambda ()
(with-anything-current-buffer
(LaTeX-math-mode 1))))
(candidate-number-limit . 9999)
(candidates . anything-c-latex-math-candidates)
(action . (lambda (candidate)
(call-interactively candidate)))))
;;;; <Headline Extraction>
(defvar anything-c-source-fixme
'((name . "TODO/FIXME/DRY comments")
(headline . "^.*\\<\\(TODO\\|FIXME\\|DRY\\)\\>.*$")
(adjust)
(recenter))
"Show TODO/FIXME/DRY comments in current file.")
(defvar anything-c-source-rd-headline
'((name . "RD HeadLine")
(headline "^= \\(.+\\)$" "^== \\(.+\\)$" "^=== \\(.+\\)$" "^==== \\(.+\\)$")
(condition . (memq major-mode '(rdgrep-mode rd-mode)))
(migemo)
(subexp . 1))
"Show RD headlines.
RD is Ruby's POD.
http://en.wikipedia.org/wiki/Ruby_Document_format")
(defvar anything-c-source-oddmuse-headline
'((name . "Oddmuse HeadLine")
(headline "^= \\(.+\\) =$" "^== \\(.+\\) ==$"
"^=== \\(.+\\) ===$" "^==== \\(.+\\) ====$")
(condition . (memq major-mode '(oddmuse-mode yaoddmuse-mode)))
(migemo)
(subexp . 1))
"Show Oddmuse headlines, such as EmacsWiki.")
(defvar anything-c-source-emacs-source-defun
'((name . "Emacs Source DEFUN")
(headline . "DEFUN\\|DEFVAR")
(condition . (string-match "/emacs2[0-9].+/src/.+c$"
(or buffer-file-name ""))))
"Show DEFUN/DEFVAR in Emacs C source file.")
(defvar anything-c-source-emacs-lisp-expectations
'((name . "Emacs Lisp Expectations")
(headline . "(desc[ ]\\|(expectations")
(condition . (eq major-mode 'emacs-lisp-mode)))
"Show descriptions (desc) in Emacs Lisp Expectations.
http://www.emacswiki.org/cgi-bin/wiki/download/el-expectations.el")
(defvar anything-c-source-emacs-lisp-toplevels
'((name . "Emacs Lisp Toplevel / Level 4 Comment / Linkd Star")
(headline . "^(\\|(@\\*\\|^;;;;")
(get-line . buffer-substring)
(condition . (eq major-mode 'emacs-lisp-mode))
(adjust))
"Show top-level forms, level 4 comments and linkd stars (optional) in Emacs Lisp.
linkd.el is optional because linkd stars are extracted by regexp.
http://www.emacswiki.org/cgi-bin/wiki/download/linkd.el")
;;; Anything yaoddmuse
;;
;; Be sure to have yaoddmuse.el installed
;; install-elisp may be required if you want to install elisp file from here.
(defvar anything-yaoddmuse-use-cache-file nil)
(defvar anything-c-yaoddmuse-cache-file "~/.emacs.d/yaoddmuse-cache.el")
(defvar anything-c-yaoddmuse-ew-cache nil)
(defun anything-yaoddmuse-get-candidates ()
(declare (special yaoddmuse-pages-hash))
(if anything-yaoddmuse-use-cache-file
(ignore-errors
(unless anything-c-yaoddmuse-ew-cache
(load anything-c-yaoddmuse-cache-file)
(setq anything-c-yaoddmuse-ew-cache
(gethash "EmacsWiki" yaoddmuse-pages-hash)))
anything-c-yaoddmuse-ew-cache)
(yaoddmuse-update-pagename t)
(gethash "EmacsWiki" yaoddmuse-pages-hash)))
(defvar anything-c-source-yaoddmuse-emacswiki-edit-or-view
'((name . "Yaoddmuse Edit or View (EmacsWiki)")
(candidates . anything-yaoddmuse-get-candidates)
(action . (("Edit page" . (lambda (candidate)
(yaoddmuse-edit "EmacsWiki" candidate)))
("Browse page"
. (lambda (candidate)
(yaoddmuse-browse-page "EmacsWiki" candidate)))
("Browse page other window"
. (lambda (candidate)
(if (one-window-p)
(split-window-vertically))
(yaoddmuse-browse-page "EmacsWiki" candidate)))
("Browse diff"
. (lambda (candidate)
(yaoddmuse-browse-page-diff "EmacsWiki" candidate)))
("Copy URL"
. (lambda (candidate)
(kill-new (yaoddmuse-url "EmacsWiki" candidate))
(message "Have copy page %s's URL to yank." candidate)))
("Create page"
. (lambda (candidate)
(yaoddmuse-edit "EmacsWiki" anything-input)))
("Update cache"
. (lambda (candidate)
(if anything-yaoddmuse-use-cache-file
(progn
(anything-yaoddmuse-cache-pages t)
(setq anything-c-yaoddmuse-ew-cache
(gethash "EmacsWiki" yaoddmuse-pages-hash)))
(yaoddmuse-update-pagename))))))
(action-transformer anything-c-yaoddmuse-action-transformer))
"Needs yaoddmuse.el.
http://www.emacswiki.org/emacs/download/yaoddmuse.el")
(defvar anything-c-source-yaoddmuse-emacswiki-post-library
'((name . "Yaoddmuse Post library (EmacsWiki)")
(init . (anything-yaoddmuse-init))
(candidates-in-buffer)
(action . (("Post library and Browse"
. (lambda (candidate)
(yaoddmuse-post-file
(find-library-name candidate)
"EmacsWiki"
(file-name-nondirectory (find-library-name candidate))
nil t)))
("Post library"
. (lambda (candidate)
(yaoddmuse-post-file
(find-library-name candidate)
"EmacsWiki"
(file-name-nondirectory
(find-library-name candidate))))))))
"Needs yaoddmuse.el.
http://www.emacswiki.org/emacs/download/yaoddmuse.el")
(defun anything-c-yaoddmuse-action-transformer (actions candidate)
"Allow the use of `install-elisp' only on elisp files."
(if (string-match "\.el$" candidate)
(append actions '(("Install Elisp"
. (lambda (elm)
(install-elisp-from-emacswiki elm)))))
actions))
;;;###autoload
(defun anything-yaoddmuse-cache-pages (&optional load)
"Fetch the list of files on emacswiki and create cache file.
If load is non--nil load the file and feed `yaoddmuse-pages-hash'."
(interactive)
(declare (special yaoddmuse-pages-hash))
(yaoddmuse-update-pagename)
(save-excursion
(find-file anything-c-yaoddmuse-cache-file)
(erase-buffer)
(insert "(puthash \"EmacsWiki\" '(")
(loop for i in (gethash "EmacsWiki" yaoddmuse-pages-hash)
do
(insert (concat "(\"" (car i) "\") ")))
(insert ") yaoddmuse-pages-hash)\n")
(save-buffer)
(kill-buffer (current-buffer))
(when (or current-prefix-arg
load)
(load anything-c-yaoddmuse-cache-file))))
(defun anything-yaoddmuse-init ()
"Init anything buffer status."
(let ((anything-buffer (anything-candidate-buffer 'global))
(library-list (yaoddmuse-get-library-list)))
(with-current-buffer anything-buffer
;; Insert library name.
(dolist (library library-list)
(insert (format "%s\n" library)))
;; Sort lines.
(sort-lines nil (point-min) (point-max)))))
;;; Eev anchors
(defvar anything-c-source-eev-anchor
'((name . "Anchors")
(candidates
. (lambda ()
(ignore-errors
(with-anything-current-buffer
(loop initially (goto-char (point-min))
while (re-search-forward
(format ee-anchor-format "\\([^\.].+\\)") nil t)
for anchor = (match-string-no-properties 1)
collect (cons (format "%5d:%s"
(line-number-at-pos (match-beginning 0))
(format ee-anchor-format anchor))
anchor))))))
(persistent-action . (lambda (item)
(ee-to item)
(anything-match-line-color-current-line)))
(persistent-help . "Show this entry")
(action . (("Goto link" . ee-to)))))
;;; Org headlines
;;
;;
(defvar anything-c-source-org-headline
`((name . "Org HeadLine")
(headline
,@(mapcar
(lambda (num)
(format "^\\*\\{%d\\} \\(.+?\\)\\([ \t]*:[a-zA-Z0-9_@:]+:\\)?[ \t]*$"
num))
(number-sequence 1 8)))
(condition . (eq major-mode 'org-mode))
(migemo)
(subexp . 1)
(persistent-action . (lambda (elm)
(anything-c-action-line-goto elm)
(org-cycle)))
(action-transformer
. (lambda (actions candidate)
'(("Go to Line" . anything-c-action-line-goto)
("Refile to this Headline" . anything-c-org-headline-refile)
("Insert Link to This Headline"
. anything-c-org-headline-insert-link-to-headline)))))
"Show Org headlines.
org-mode is very very much extended text-mode/outline-mode.
See (find-library \"org.el\")
See http://orgmode.org for the latest version.")
(defun anything-c-org-headline-insert-link-to-headline (lineno-and-content)
(insert
(save-excursion
(anything-goto-line (car lineno-and-content))
(and (looking-at org-complex-heading-regexp)
(org-make-link-string (concat "*" (match-string 4)))))))
(defun anything-c-org-headline-refile (lineno-and-content)
"Refile current org entry to LINENO-AND-CONTENT."
(with-anything-current-buffer
(org-cut-subtree)
(anything-goto-line (car lineno-and-content))
(org-end-of-subtree t t)
(let ((org-yank-adjusted-subtrees t))
(org-yank))))
;;; Org keywords
;;
;;
(defvar anything-c-source-org-keywords
'((name . "Org Keywords")
(init . anything-c-org-keywords-init)
(candidates . anything-c-org-keywords-candidates)
(action . anything-c-org-keywords-insert)
(persistent-action . anything-c-org-keywords-show-help)
(persistent-help . "Show an example and info page to describe this keyword.")
(keywords-examples)
(keywords)))
(defvar anything-c-org-keywords-info-location
'(("#+TITLE:" . "(org)Export options")
("#+AUTHOR:" . "(org)Export options")
("#+DATE:" . "(org)Export options")
("#+EMAIL:" . "(org)Export options")
("#+DESCRIPTION:" . "(org)Export options")
("#+KEYWORDS:" . "(org)Export options")
("#+LANGUAGE:" . "(org)Export options")
("#+TEXT:" . "(org)Export options")
("#+TEXT:" . "(org)Export options")
("#+OPTIONS:" . "(org)Export options")
("#+BIND:" . "(org)Export options")
("#+LINK_UP:" . "(org)Export options")
("#+LINK_HOME:" . "(org)Export options")
("#+LATEX_HEADER:" . "(org)Export options")
("#+EXPORT_SELECT_TAGS:" . "(org)Export options")
("#+EXPORT_EXCLUDE_TAGS:" . "(org)Export options")
("#+INFOJS_OPT" . "(org)Javascript support")
("#+BEGIN_HTML" . "(org)Quoting HTML tags")
("#+BEGIN_LaTeX" . "(org)Quoting LaTeX code")
("#+ORGTBL" . "(org)Radio tables")
("#+HTML:" . "(org)Quoting HTML tags")
("#+LaTeX:" . "(org)Quoting LaTeX code")
("#+BEGIN:" . "(org)Dynamic blocks") ;clocktable columnview
("#+BEGIN_EXAMPLE" . "(org)Literal examples")
("#+BEGIN_QUOTE" . "(org)Paragraphs")
("#+BEGIN_VERSE" . "(org)Paragraphs")
("#+BEGIN_SRC" . "(org)Literal examples")
("#+CAPTION" . "(org)Tables in HTML export")
("#+LABEL" . "(org)Tables in LaTeX export")
("#+ATTR_HTML" . "(org)Links")
("#+ATTR_LaTeX" . "(org)Images in LaTeX export")))
(defun anything-c-org-keywords-init ()
(unless (anything-attr 'keywords-examples)
(require 'org)
(anything-attrset 'keywords-examples
(append
(mapcar
(lambda (x)
(string-match "^#\\+\\(\\([A-Z_]+:?\\).*\\)" x)
(cons (match-string 2 x) (match-string 1 x)))
(org-split-string (org-get-current-options) "\n"))
(mapcar 'list org-additional-option-like-keywords)))
(anything-attrset 'keywords (mapcar 'car (anything-attr 'keywords-examples)))))
(defun anything-c-org-keywords-candidates ()
(and (or (eq (buffer-local-value 'major-mode anything-current-buffer) 'org-mode)
(eq (buffer-local-value 'major-mode anything-current-buffer) 'message-mode))
(anything-attr 'keywords)))
(defun anything-c-org-keywords-insert (keyword)
(cond ((and (string-match "BEGIN" keyword)
(anything-region-active-p))
(let ((beg (region-beginning))
(end (region-end)))
(goto-char end)
(insert "\n#+" (replace-regexp-in-string
"BEGIN" "END" keyword) "\n")
(goto-char beg)
(insert "#+" keyword " ")
(save-excursion (insert "\n"))))
((string-match "BEGIN" keyword)
(insert "#+" keyword " ")
(save-excursion
(insert "\n#+" (replace-regexp-in-string
"BEGIN" "END" keyword) "\n")))
(t (insert "#+" keyword " "))))
(defun anything-c-org-keywords-show-help (keyword)
(info (or (assoc-default (concat "#+" keyword) anything-c-org-keywords-info-location)
"(org)In-buffer settings"))
(search-forward (concat "#+" keyword) nil t)
(anything-persistent-highlight-point)
(message "%s" (or (cdr (assoc keyword (anything-attr 'keywords-examples))) "")))
;;; bbdb
;;
;;
(defvar bbdb-records)
(defvar bbdb-buffer-name)
(defun anything-c-bbdb-candidates ()
"Return a list of all names in the bbdb database. The format
is \"Firstname Lastname\"."
(mapcar (lambda (bbdb-record)
(replace-regexp-in-string
"\\s-+$" ""
(concat (aref bbdb-record 0) " " (aref bbdb-record 1))))
(bbdb-records)))
(defun anything-c-bbdb-create-contact (actions candidate)
"Action transformer that returns only an entry to add the
current `anything-pattern' as new contact. All other actions are
removed."
(if (string= candidate "*Add to contacts*")
'(("Add to contacts" . (lambda (actions)
(bbdb-create-internal
(read-from-minibuffer "Name: " anything-c-bbdb-name)
(read-from-minibuffer "Company: ")
(read-from-minibuffer "Email: ")
nil
nil
(read-from-minibuffer "Note: ")))))
actions))
(defun anything-c-bbdb-get-record (candidate)
"Return record that match CANDIDATE."
(bbdb candidate nil)
(set-buffer "*BBDB*")
(bbdb-current-record))
(defvar anything-c-bbdb-name nil
"Only for internal use.")
(defvar anything-c-source-bbdb
'((name . "BBDB")
(candidates . anything-c-bbdb-candidates)
(action ("Send a mail" . anything-c-bbdb-compose-mail)
("View person's data" . anything-c-bbdb-view-person-action))
(filtered-candidate-transformer . (lambda (candidates source)
(setq anything-c-bbdb-name anything-pattern)
(if (not candidates)
(list "*Add to contacts*")
candidates)))
(action-transformer . (lambda (actions candidate)
(anything-c-bbdb-create-contact actions candidate))))
"Needs BBDB.
http://bbdb.sourceforge.net/")
(defun anything-c-bbdb-view-person-action (candidate)
"View BBDB data of single CANDIDATE or marked candidates."
(anything-aif (anything-marked-candidates)
(let ((bbdb-append-records (length it)))
(dolist (i it)
(bbdb-redisplay-one-record (anything-c-bbdb-get-record i))))
(bbdb-redisplay-one-record (anything-c-bbdb-get-record candidate))))
(defun anything-c-bbdb-collect-mail-addresses ()
"Return a list of all mail addresses of records in bbdb buffer."
(with-current-buffer bbdb-buffer-name
(loop for i in bbdb-records
if (bbdb-record-net (car i))
collect (bbdb-dwim-net-address (car i)))))
(defun anything-c-bbdb-compose-mail (candidate)
"Compose a mail with all records of bbdb buffer."
(anything-c-bbdb-view-person-action candidate)
(let* ((address-list (anything-c-bbdb-collect-mail-addresses))
(address-str (mapconcat 'identity address-list ",\n ")))
(compose-mail address-str)))
;;; Evaluation Result
;;
;;
;; Internal
(defvar anything-eldoc-active-minibuffers-list nil)
(defvar anything-eval-expression-input-history nil)
(defvar anything-c-source-evaluation-result
'((name . "Evaluation Result")
(disable-shortcuts)
(dummy)
(multiline)
(mode-line . "C-RET: nl-and-indent, tab: reindent, C-tab:complete, C-p/n: next/prec-line.")
(filtered-candidate-transformer . (lambda (candidates source)
(list
(condition-case nil
(with-anything-current-buffer
(pp-to-string
(eval (read anything-pattern))))
(error "Error")))))
(action . (("Copy result to kill-ring" . (lambda (candidate)
(with-current-buffer anything-buffer
(let ((end (save-excursion
(goto-char (point-max))
(search-backward "\n")
(point))))
(kill-region (point) end)))))
("copy sexp to kill-ring" . (lambda (candidate)
(kill-new anything-input)))))))
(defun anything-eval-new-line-and-indent ()
(interactive)
(newline) (lisp-indent-line))
(defun anything-eldoc-store-minibuffer ()
"Store minibuffer buffer name in `anything-eldoc-active-minibuffers-list'."
(with-selected-window (minibuffer-window)
(push (buffer-name) anything-eldoc-active-minibuffers-list)))
(defun anything-eldoc-show-in-eval ()
"Return eldoc in mode-line for current minibuffer input."
(let ((buf (with-selected-window (minibuffer-window)
(buffer-name))))
(when (member buf anything-eldoc-active-minibuffers-list)
(let* ((str-all (with-current-buffer buf
(minibuffer-completion-contents)))
(sym (when str-all
(with-temp-buffer
(insert str-all)
(goto-char (point-max))
(unless (looking-back ")\\|\"") (forward-char -1))
(eldoc-current-symbol))))
(info-fn (eldoc-fnsym-in-current-sexp))
(doc (or (eldoc-get-var-docstring sym)
(eldoc-get-fnsym-args-string
(car info-fn) (cadr info-fn)))))
(when doc (funcall anything-c-eldoc-in-minibuffer-show-fn doc))))))
(defun anything-c-show-info-in-mode-line (str)
"Display string STR in mode-line."
(save-selected-window
(with-current-buffer anything-buffer
(let ((mode-line-format (concat " " str)))
(force-mode-line-update)
(sit-for anything-c-show-info-in-mode-line-delay))
(force-mode-line-update))))
;;; Calculation Result
;;
;;
(defvar anything-c-source-calculation-result
'((name . "Calculation Result")
(dummy)
(filtered-candidate-transformer . (lambda (candidates source)
(list
(condition-case nil
(calc-eval anything-pattern)
(error "error")))))
(action ("Copy result to kill-ring" . kill-new))))
;;; Google Suggestions
;;
;;
;; Internal
(defvar anything-ggs-max-length-real-flag 0)
(defvar anything-ggs-max-length-num-flag 0)
(defun anything-c-google-suggest-fetch (input)
"Fetch suggestions for INPUT from XML buffer.
Return an alist with elements like (data . number_results)."
(setq anything-ggs-max-length-real-flag 0
anything-ggs-max-length-num-flag 0)
(let ((request (concat anything-c-google-suggest-url
(url-hexify-string input))))
(flet ((fetch ()
(loop
with result-alist = (xml-get-children
(car (xml-parse-region
(point-min) (point-max)))
'CompleteSuggestion)
for i in result-alist
for data = (cdr (caadr (assoc 'suggestion i)))
for nqueries = (cdr (caadr (assoc 'num_queries i)))
for lqueries = (length (anything-c-ggs-set-number-result
nqueries))
for ldata = (length data)
do
(progn
(when (> ldata anything-ggs-max-length-real-flag)
(setq anything-ggs-max-length-real-flag ldata))
(when (> lqueries anything-ggs-max-length-num-flag)
(setq anything-ggs-max-length-num-flag lqueries)))
collect (cons data nqueries) into cont
finally return cont)))
(if anything-google-suggest-use-curl-p
(with-temp-buffer
(call-process "curl" nil t nil request)
(fetch))
(with-current-buffer
(url-retrieve-synchronously request)
(fetch))))))
(defun anything-c-google-suggest-set-candidates (&optional request-prefix)
"Set candidates with result and number of google results found."
(let ((suggestions
(loop with suggested-results = (anything-c-google-suggest-fetch
(or (and request-prefix
(concat request-prefix
" " anything-pattern))
anything-pattern))
for (real . numresult) in suggested-results
;; Prepare number of results with ","
for fnumresult = (anything-c-ggs-set-number-result numresult)
;; Calculate number of spaces to add before fnumresult
;; if it is smaller than longest result
;; `anything-ggs-max-length-num-flag'.
;; e.g 1,234,567
;; 345,678
;; To be sure it is aligned properly.
for nspaces = (if (< (length fnumresult)
anything-ggs-max-length-num-flag)
(- anything-ggs-max-length-num-flag
(length fnumresult))
0)
;; Add now the spaces before fnumresult.
for align-fnumresult = (concat (make-string nspaces ? )
fnumresult)
for interval = (- anything-ggs-max-length-real-flag
(length real))
for spaces = (make-string (+ 2 interval) ? )
for display = (format "%s%s(%s results)"
real spaces align-fnumresult)
collect (cons display real))))
(if (loop for (disp . dat) in suggestions
thereis (equal dat anything-pattern))
suggestions
;; if there is no suggestion exactly matching the input then
;; prepend a Search on Google item to the list
(append
suggestions
(list (cons (concat "Search for " "'" anything-input "'" " on Google")
anything-input))))))
(defun anything-c-ggs-set-number-result (num)
(if num
(progn
(and (numberp num) (setq num (number-to-string num)))
(loop for i in (reverse (split-string num "" t))
for count from 1
append (list i) into C
when (= count 3)
append (list ",") into C
and do (setq count 0)
finally return
(replace-regexp-in-string
"^," "" (mapconcat 'identity (reverse C) ""))))
"?"))
(defvar anything-c-google-suggest-default-browser-function nil
"*The browse url function you prefer to use with google suggest.
When nil, use the first browser function available
See `anything-browse-url-default-browser-alist'.")
(defun anything-c-google-suggest-action (candidate)
"Default action to jump to a google suggested candidate."
(let ((arg (concat anything-c-google-suggest-search-url
(url-hexify-string candidate))))
(anything-aif anything-c-google-suggest-default-browser-function
(funcall it arg)
(anything-c-browse-url arg))))
(defvar anything-c-google-suggest-default-function
'anything-c-google-suggest-set-candidates
"Default function to use in anything google suggest.")
(defvar anything-c-source-google-suggest
'((name . "Google Suggest")
(candidates . (lambda ()
(funcall anything-c-google-suggest-default-function)))
(action . (("Google Search" . anything-c-google-suggest-action)))
(volatile)
(requires-pattern . 3)
(delayed)))
(defun anything-c-google-suggest-emacs-lisp ()
"Try to emacs lisp complete with google suggestions."
(anything-c-google-suggest-set-candidates "emacs lisp"))
;;; Yahoo suggestions
;;
;;
(defun anything-c-yahoo-suggest-fetch (input)
"Fetch Yahoo suggestions for INPUT from XML buffer.
Return an alist with elements like (data . number_results)."
(let ((request (concat anything-c-yahoo-suggest-url
(url-hexify-string input))))
(flet ((fetch ()
(loop
with result-alist = (xml-get-children
(car (xml-parse-region
(point-min) (point-max)))
'Result)
for i in result-alist
collect (caddr i))))
(with-current-buffer
(url-retrieve-synchronously request)
(fetch)))))
(defun anything-c-yahoo-suggest-set-candidates ()
"Set candidates with Yahoo results found."
(let ((suggestions (anything-c-yahoo-suggest-fetch anything-input)))
(or suggestions
(append
suggestions
(list (cons (concat "Search for " "'" anything-input "'" " on Yahoo")
anything-input))))))
(defun anything-c-yahoo-suggest-action (candidate)
"Default action to jump to a Yahoo suggested candidate."
(anything-c-browse-url (concat anything-c-yahoo-suggest-search-url
(url-hexify-string candidate))))
(defvar anything-c-source-yahoo-suggest
'((name . "Yahoo Suggest")
(candidates . anything-c-yahoo-suggest-set-candidates)
(action . (("Yahoo Search" . anything-c-yahoo-suggest-action)))
(volatile)
(requires-pattern . 3)
(delayed)))
;;; Web browser functions.
;;
;;
(require 'browse-url)
;; If default setting of `w3m-command' is not
;; what you want you and you modify it, you will have to reeval
;; also `anything-browse-url-default-browser-alist'.
(defvar w3m-command "/usr/bin/w3m")
(defvar anything-c-home-url "http://www.google.fr"
"*Default url to use as home url.")
(defvar ac-browse-url-chromium-program "chromium-browser")
(defvar ac-browse-url-uzbl-program "uzbl-browser")
(defvar anything-browse-url-default-browser-alist
`((,w3m-command . w3m-browse-url)
(,browse-url-firefox-program . browse-url-firefox)
(,ac-browse-url-chromium-program . ac-browse-url-chromium)
(,ac-browse-url-uzbl-program . ac-browse-url-uzbl)
(,browse-url-kde-program . browse-url-kde)
(,browse-url-gnome-moz-program . browse-url-gnome-moz)
(,browse-url-mozilla-program . browse-url-mozilla)
(,browse-url-galeon-program . browse-url-galeon)
(,browse-url-netscape-program . browse-url-netscape)
(,browse-url-mosaic-program . browse-url-mosaic)
(,browse-url-xterm-program . browse-url-text-xterm))
"*Alist of \(executable . function\) to try to find a suitable url browser.")
(defun* anything-c-generic-browser (url name &rest args)
"Browse URL with NAME browser."
(let ((proc (concat name " " url)))
(message "Starting %s..." name)
(apply 'start-process proc nil name
(append args (list url)))
(set-process-sentinel
(get-process proc)
#'(lambda (process event)
(when (string= event "finished\n")
(message "%s process %s" process event))))))
(defun ac-browse-url-chromium (url)
"Browse URL with google chrome browser."
(interactive "sURL: ")
(anything-c-generic-browser
url ac-browse-url-chromium-program))
(defun ac-browse-url-uzbl (url &optional ignore)
"Browse URL with uzbl browser."
(interactive "sURL: ")
(anything-c-generic-browser url ac-browse-url-uzbl-program "-u"))
(defun anything-browse-url-default-browser (url &rest args)
"Find the first available browser and ask it to load URL."
(let ((default-browser-fn
(loop for (exe . fn) in anything-browse-url-default-browser-alist
thereis (and exe (executable-find exe) fn))))
(if default-browser-fn
(apply default-browser-fn url args)
(error "No usable browser found"))))
(defun anything-c-browse-url (url &rest args)
"Default command to browse URL."
(if browse-url-browser-function
(browse-url url args)
(anything-browse-url-default-browser url args)))
;;; Surfraw
;;
;; Need external program surfraw.
;; <http://surfraw.alioth.debian.org/>
(defvar anything-surfraw-default-browser-function nil
"*The browse url function you prefer to use with surfraw.
When nil, fallback to `browse-url-browser-function'.")
;; Internal
(defvar anything-surfraw-engines-history nil)
(defvar anything-surfraw-input-history nil)
(defun anything-c-build-elvi-list ()
"Return list of all engines and descriptions handled by surfraw."
(cdr
(with-temp-buffer
(call-process "surfraw" nil t nil
"-elvi")
(split-string (buffer-string) "\n"))))
;;; Emms
;;
;;
(defun anything-emms-stream-edit-bookmark (elm)
"Change the information of current emms-stream bookmark from anything."
(declare (special emms-stream-list))
(let* ((cur-buf anything-current-buffer)
(bookmark (assoc elm emms-stream-list))
(name (read-from-minibuffer "Description: "
(nth 0 bookmark)))
(url (read-from-minibuffer "URL: "
(nth 1 bookmark)))
(fd (read-from-minibuffer "Feed Descriptor: "
(int-to-string (nth 2 bookmark))))
(type (read-from-minibuffer "Type (url, streamlist, or lastfm): "
(format "%s" (car (last bookmark))))))
(save-window-excursion
(emms-streams)
(when (re-search-forward (concat "^" name) nil t)
(beginning-of-line)
(emms-stream-delete-bookmark)
(emms-stream-add-bookmark name url (string-to-number fd) type)
(emms-stream-save-bookmarks-file)
(emms-stream-quit)
(anything-c-switch-to-buffer cur-buf)))))
(defun anything-emms-stream-delete-bookmark (candidate)
"Delete emms-streams bookmarks from anything."
(let* ((cands (anything-marked-candidates))
(bmks (loop for bm in cands collect
(car (assoc bm emms-stream-list))))
(bmk-reg (mapconcat 'regexp-quote bmks "\\|^")))
(when (y-or-n-p (format "Really delete radios\n -%s: ? "
(mapconcat 'identity bmks "\n -")))
(save-window-excursion
(emms-streams)
(goto-char (point-min))
(loop while (re-search-forward bmk-reg nil t)
do (progn (beginning-of-line)
(emms-stream-delete-bookmark))
finally do (progn
(emms-stream-save-bookmarks-file)
(emms-stream-quit)))))))
(defvar anything-c-source-emms-streams
'((name . "Emms Streams")
(init . (lambda ()
(emms-stream-init)))
(candidates . (lambda ()
(declare (special emms-stream-list))
(mapcar 'car emms-stream-list)))
(action . (("Play" . (lambda (elm)
(declare (special emms-stream-list))
(let* ((stream (assoc elm emms-stream-list))
(fn (intern (concat "emms-play-" (symbol-name (car (last stream))))))
(url (second stream)))
(funcall fn url))))
("Delete" . anything-emms-stream-delete-bookmark)
("Edit" . anything-emms-stream-edit-bookmark)))
(filtered-candidate-transformer . anything-c-adaptive-sort)))
;; Don't forget to set `emms-source-file-default-directory'
(defvar anything-c-source-emms-dired
'((name . "Music Directory")
(candidates . (lambda ()
(cddr (directory-files emms-source-file-default-directory))))
(action .
(("Play Directory" . (lambda (item)
(emms-play-directory
(expand-file-name
item
emms-source-file-default-directory))))
("Open dired in file's directory" . (lambda (item)
(anything-c-open-dired
(expand-file-name
item
emms-source-file-default-directory))))))
(filtered-candidate-transformer . anything-c-adaptive-sort)))
(defun anything-c-emms-files-modifier (candidates source)
(let ((current-playlist (with-current-emms-playlist
(loop with cur-list = (emms-playlist-tracks-in-region
(point-min) (point-max))
for i in cur-list
for name = (assoc-default 'name i)
when name
collect name))))
(loop for i in candidates
if (member (cdr i) current-playlist)
collect (cons (propertize (car i)
'face 'anything-emms-playlist)
(cdr i)) into lis
else collect i into lis
finally return (reverse lis))))
(defun anything-c-emms-play-current-playlist ()
"Play current playlist."
(with-current-emms-playlist
(emms-playlist-first)
(emms-playlist-mode-play-smart)))
(defvar anything-c-source-emms-files
'((name . "Emms files")
(candidates . (lambda ()
(loop for v being the hash-values in emms-cache-db
for name = (assoc-default 'name v)
for artist = (or (assoc-default 'info-artist v) "unknown")
for genre = (or (assoc-default 'info-genre v) "unknown")
for tracknum = (or (assoc-default 'info-tracknumber v) "unknown")
for song = (or (assoc-default 'info-title v) "unknown")
for info = (concat artist " - " genre " - " tracknum ": " song)
unless (string-match "^\\(http\\|mms\\):" name)
collect (cons info name))))
(filtered-candidate-transformer . anything-c-emms-files-modifier)
(candidate-number-limit . 9999)
(action . (("Play file" . emms-play-file)
("Add to Playlist and play (C-u clear current)"
. (lambda (candidate)
(when anything-current-prefix-arg
(emms-playlist-current-clear))
(emms-playlist-new)
(mapc 'emms-add-playlist-file (anything-marked-candidates))
(unless emms-player-playing-p
(anything-c-emms-play-current-playlist))))))))
;;; Jabber Contacts (jabber.el)
(defun anything-c-jabber-online-contacts ()
"List online Jabber contacts."
(with-no-warnings
(let (jids)
(dolist (item (jabber-concat-rosters) jids)
(when (get item 'connected)
(push (if (get item 'name)
(cons (get item 'name) item)
(cons (symbol-name item) item)) jids))))))
(defvar anything-c-source-jabber-contacts
'((name . "Jabber Contacts")
(init . (lambda () (require 'jabber)))
(candidates . (lambda () (mapcar 'car (anything-c-jabber-online-contacts))))
(action . (lambda (x)
(jabber-chat-with
(jabber-read-account)
(symbol-name
(cdr (assoc x (anything-c-jabber-online-contacts)))))))))
;;; Call source.
(defvar anything-source-select-buffer "*anything source select*")
(defvar anything-c-source-call-source
`((name . "Call anything source")
(candidate-number-limit)
(candidates
. (lambda ()
(loop for vname in (all-completions "anything-c-source-" obarray)
for var = (intern vname)
for name = (ignore-errors (assoc-default 'name (symbol-value var)))
if name collect
(cons (format "%s `%s'"
name (propertize vname 'face 'font-lock-variable-name-face))
var))))
(action
. (("Invoke anything with selected source"
.
(lambda (candidate)
(setq anything-candidate-number-limit 9999)
(anything candidate nil nil nil nil
anything-source-select-buffer)))
("Describe variable" . describe-variable)
("Find variable" . find-variable)))
(persistent-action . describe-variable)
(persistent-help . "Show description of this source")))
(defun anything-call-source-from-anything ()
"Call anything source within `anything' session."
(interactive)
(setq anything-input-idle-delay 0)
(anything-set-sources '(anything-c-source-call-source)))
;;; Execute Preconfigured anything.
(defvar anything-c-source-anything-commands
'((name . "Preconfigured Anything")
(candidates . anything-c-anything-commands-candidates)
(type . command)
(candidate-number-limit)))
(defun anything-c-anything-commands-candidates ()
(loop for (cmd . desc) in (anything-c-list-preconfigured-anything)
collect (cons (if (where-is-internal cmd nil t)
(substitute-command-keys (format "M-x %s (\\[%s]) : %s" cmd cmd desc))
(substitute-command-keys (format "\\[%s] : %s" cmd desc)))
cmd)))
;;; Occur
;;
;;
(defun anything-c-occur-init ()
"Create the initial anything occur buffer.
If region is active use region as buffer contents
instead of whole buffer."
(with-current-buffer (anything-candidate-buffer 'global)
(erase-buffer)
(let ((buf-contents
(with-anything-current-buffer
(if (anything-region-active-p)
(buffer-substring (region-beginning) (region-end))
(buffer-substring (point-min) (point-max))))))
(insert buf-contents))))
(defun anything-c-occur-get-line (s e)
(format "%7d:%s" (line-number-at-pos (1- s)) (buffer-substring s e)))
(defun anything-c-occur-query-replace-regexp (candidate)
"Query replace regexp starting from CANDIDATE.
If region is active ignore CANDIDATE and replace only in region.
With a prefix arg replace only matches surrounded by word boundaries,
i.e Don't replace inside a word, regexp is surrounded with \\bregexp\\b."
(let ((regexp anything-input))
(unless (anything-region-active-p)
(anything-c-action-line-goto candidate))
(apply 'query-replace-regexp
(anything-c-query-replace-args regexp))))
(defun anything-occur-run-query-replace-regexp ()
"Run `query-replace-regexp' in anything occur from keymap."
(interactive)
(anything-c-quit-and-execute-action
'anything-c-occur-query-replace-regexp))
(defvar anything-c-source-occur
`((name . "Occur")
(init . anything-c-occur-init)
(candidates-in-buffer)
(migemo)
(get-line . anything-c-occur-get-line)
(display-to-real . anything-c-display-to-real-line)
(action . (("Go to Line" . anything-c-action-line-goto)
("Query replace regexp (C-u Not inside word.)"
. anything-c-occur-query-replace-regexp)))
(recenter)
(mode-line . anything-occur-mode-line)
(keymap . ,anything-occur-map)
(requires-pattern . 1)
(delayed)))
;;; Anything browse code.
(defun anything-c-browse-code-get-line (beg end)
"Select line if it match the regexp corresponding to current `major-mode'.
Line is parsed for BEG position to END position."
(let ((str-line (buffer-substring beg end))
(regexp (assoc-default major-mode
anything-c-browse-code-regexp-alist))
(num-line (if (string= anything-pattern "") beg (1- beg))))
(when (and regexp (string-match regexp str-line))
(format "%4d:%s" (line-number-at-pos num-line) str-line))))
(defvar anything-c-source-browse-code
'((name . "Browse code")
(init . (lambda ()
(anything-candidate-buffer anything-current-buffer)
(with-anything-current-buffer
(jit-lock-fontify-now))))
(candidate-number-limit . 9999)
(candidates-in-buffer)
(get-line . anything-c-browse-code-get-line)
(type . line)
(recenter)))
;; Do many actions for input
(defvar anything-c-source-create
'((name . "Create")
(dummy)
(action)
(action-transformer . anything-create--actions))
"Do many create actions from `anything-pattern'.
See also `anything-create--actions'.")
(defun anything-create-from-anything ()
"Run `anything-create' from `anything' as a fallback."
(interactive)
(anything-run-after-quit 'anything-create nil anything-pattern))
(defun anything-create--actions (&rest ignored)
"Default actions for `anything-create' / `anything-c-source-create'."
(remove-if-not
(lambda (pair) (and (consp pair) (functionp (cdr pair))))
(append anything-create--actions-private
'(("find-file" . find-file)
("find-file other window" . find-file-other-window)
("New buffer" . anything-c-switch-to-buffer)
("New buffer other window" . switch-to-buffer-other-window)
("Bookmark Set" . bookmark-set)
("Set Register" .
(lambda (x) (set-register (read-char "Register: ") x)))
("Insert Linkd star" . linkd-insert-star)
("Insert Linkd Tag" . linkd-insert-tag)
("Insert Linkd Link" . linkd-insert-link)
("Insert Linkd Lisp" . linkd-insert-lisp)
("Insert Linkd Wiki" . linkd-insert-wiki)
("Google Search" . google)))))
;; Minibuffer History
;;
;;
(defvar anything-c-source-minibuffer-history
'((name . "Minibuffer History")
(header-name . (lambda (name)
(format "%s (%s)" name minibuffer-history-variable)))
(candidates
. (lambda ()
(let ((history (loop for i in
(symbol-value minibuffer-history-variable)
unless (string= "" i) collect i)))
(if (consp (car history))
(mapcar 'prin1-to-string history)
history))))
(migemo)
(action . (lambda (candidate)
(delete-minibuffer-contents)
(insert candidate)))))
;;; Elscreen
;;
;;
(defvar anything-c-source-elscreen
'((name . "Elscreen")
(candidates
. (lambda ()
(if (cdr (elscreen-get-screen-to-name-alist))
(sort
(loop for sname in (elscreen-get-screen-to-name-alist)
append (list (format "[%d] %s" (car sname) (cdr sname))))
#'(lambda (a b) (compare-strings a nil nil b nil nil))))))
(action
. (("Change Screen" .
(lambda (candidate)
(elscreen-goto (- (aref candidate 1) (aref "0" 0)))))
("Kill Screen(s)" .
(lambda (candidate)
(dolist (i (anything-marked-candidates))
(elscreen-goto (- (aref i 1) (aref "0" 0)))
(elscreen-kill))))
("Only Screen" .
(lambda (candidate)
(elscreen-goto (- (aref candidate 1) (aref "0" 0)))
(elscreen-kill-others)))))))
;;;; <System>
;;; Top (process)
(defvar anything-c-top-command "COLUMNS=%s top -b -n 1"
"Top command (batch mode). %s is replaced with `frame-width'.")
(defvar anything-c-source-top
'((name . "Top (Press C-c C-u to refresh)")
(init . anything-c-top-init)
(candidates-in-buffer)
(display-to-real . anything-c-top-display-to-real)
(persistent-action . anything-c-top-sh-persistent-action)
(persistent-help . "SIGTERM")
(action
("kill (TERM)" . (lambda (pid)
(anything-c-top-sh (format "kill -TERM %s" pid))))
("kill (KILL)" . (lambda (pid)
(anything-c-top-sh (format "kill -KILL %s" pid))))
("Copy PID" . (lambda (pid) (kill-new pid))))))
(defun anything-c-top-sh (cmd)
(message "Executed %s\n%s" cmd (shell-command-to-string cmd)))
(defun anything-c-top-sh-persistent-action (pid)
(delete-other-windows)
(anything-c-top-sh (format "kill -TERM %s" pid))
(anything-force-update))
(defun anything-c-top-init ()
(with-current-buffer (anything-candidate-buffer 'global)
(call-process-shell-command
(format anything-c-top-command
(- (frame-width) (if anything-enable-digit-shortcuts 4 0)))
nil (current-buffer))))
(defun anything-c-top-display-to-real (line)
(car (split-string line)))
;;; Timers
(defvar anything-c-source-absolute-time-timers
'((name . "Absolute Time Timers")
(candidates . timer-list)
(type . timer)))
(defvar anything-c-source-idle-time-timers
'((name . "Idle Time Timers")
(candidates . timer-idle-list)
(type . timer)))
(defun anything-c-timer-real-to-display (timer)
(destructuring-bind (triggered t1 t2 t3 repeat-delay func args idle-delay)
(append timer nil) ;use `append' to convert vector->list
(format "%s repeat=%5S %s(%s)"
(let ((time (list t1 t2 t3)))
(if idle-delay
(format-time-string "idle-for=%5s" time)
(format-time-string "%m/%d %T" time)))
repeat-delay
func
(mapconcat 'prin1-to-string args " "))))
;;; X RandR resolution change
;;
;;
;;; FIXME I do not care multi-display.
(defun anything-c-xrandr-info ()
"Return a pair with current X screen number and current X display name."
(with-temp-buffer
(call-process "xrandr" nil (current-buffer) nil
"--current")
(let (screen output)
(goto-char (point-min))
(save-excursion
(when (re-search-forward "\\(^Screen \\)\\([0-9]\\):" nil t)
(setq screen (match-string 2))))
(when (re-search-forward "^\\(.*\\) connected" nil t)
(setq output (match-string 1)))
(list screen output))))
(defun anything-c-xrandr-screen ()
"Return current X screen number."
(car (anything-c-xrandr-info)))
(defun anything-c-xrandr-output ()
"Return current X display name."
(cadr (anything-c-xrandr-info)))
(defvar anything-c-source-xrandr-change-resolution
'((name . "Change Resolution")
(candidates
. (lambda ()
(with-temp-buffer
(call-process "xrandr" nil (current-buffer) nil
"--screen" (anything-c-xrandr-screen) "-q")
(goto-char 1)
(loop with modes = nil
while (re-search-forward " \\([0-9]+x[0-9]+\\)" nil t)
for mode = (match-string 1)
unless (member mode modes)
collect mode into modes
finally return modes))))
(action
("Change Resolution"
. (lambda (mode)
(call-process "xrandr" nil nil nil
"--screen" (anything-c-xrandr-screen)
"--output" (anything-c-xrandr-output)
"--mode" mode))))))
;;; Xfont selection
;;
;;
(defun anything-c-persistent-xfont-action (elm)
"Show current font temporarily"
(let ((current-font (cdr (assoc 'font (frame-parameters))))
(default-font elm))
(unwind-protect
(progn (set-frame-font default-font 'keep-size) (sit-for 2))
(set-frame-font current-font))))
(defvar anything-c-xfonts-cache nil)
(defvar anything-c-source-xfonts
'((name . "X Fonts")
(init . (lambda ()
(unless anything-c-xfonts-cache
(setq anything-c-xfonts-cache
(x-list-fonts "*")))))
(candidates . anything-c-xfonts-cache)
(action . (("Copy to kill ring" . (lambda (elm)
(kill-new elm)))
("Set Font" . (lambda (elm)
(kill-new elm)
(set-frame-font elm 'keep-size)
(message "New font have been copied to kill ring")))))
(persistent-action . anything-c-persistent-xfont-action)
(persistent-help . "Switch to this font temporarily")))
;;; 𝕌𝕔𝕤 𝕊𝕪𝕞𝕓𝕠𝕝 𝕔𝕠𝕞𝕡𝕝𝕖𝕥𝕚𝕠𝕟
;;
;;
(defvar anything-c-ucs-max-len 0)
(defun anything-c-calculate-ucs-max-len ()
"Calculate the length of longest `ucs-names' candidate."
(loop with count = 0
for (n . v) in (ucs-names)
for len = (length n)
if (> len count)
do (setq count len)
finally return count))
(defun anything-c-ucs-init ()
"Initialize an anything buffer with ucs symbols.
Only math* symbols are collected."
(unless (> anything-c-ucs-max-len 0)
(setq anything-c-ucs-max-len
(anything-c-calculate-ucs-max-len)))
(with-current-buffer (anything-candidate-buffer
(get-buffer-create "*anything ucs*"))
;; `ucs-names' fn will not run again, data is cached in
;; var `ucs-names'.
(loop for (n . v) in (ucs-names)
for len = (length n)
for diff = (+ (- anything-c-ucs-max-len len) 2)
unless (string= "" n)
do (progn (insert (concat
n ":"
(make-string
diff ? )))
(ucs-insert v)
(insert "\n")))))
(defun anything-c-ucs-forward-char (candidate)
(with-anything-current-buffer
(forward-char 1)))
(defun anything-c-ucs-backward-char (candidate)
(with-anything-current-buffer
(forward-char -1)))
(defun anything-c-ucs-delete-backward (candidate)
(with-anything-current-buffer
(delete-char -1)))
(defun anything-c-ucs-insert-char (candidate)
(with-anything-current-buffer
(insert
(replace-regexp-in-string
" " ""
(cadr (split-string candidate ":"))))))
(defun anything-c-ucs-persistent-insert ()
(interactive)
(anything-attrset 'action-insert 'anything-c-ucs-insert-char)
(anything-execute-persistent-action 'action-insert))
(defun anything-c-ucs-persistent-forward ()
(interactive)
(anything-attrset 'action-forward 'anything-c-ucs-forward-char)
(anything-execute-persistent-action 'action-forward))
(defun anything-c-ucs-persistent-backward ()
(interactive)
(anything-attrset 'action-back 'anything-c-ucs-backward-char)
(anything-execute-persistent-action 'action-back))
(defun anything-c-ucs-persistent-delete ()
(interactive)
(anything-attrset 'action-delete 'anything-c-ucs-delete-backward)
(anything-execute-persistent-action 'action-delete))
(defvar anything-c-source-ucs
'((name . "Ucs names")
(init . anything-c-ucs-init)
(candidate-number-limit . 9999)
(candidates-in-buffer)
(mode-line . anything-c-ucs-mode-line-string)
(action . (("Insert" . anything-c-ucs-insert-char)
("Forward char" . anything-c-ucs-forward-char)
("Backward char" . anything-c-ucs-backward-char)
("Delete char backward" . anything-c-ucs-delete-backward))))
"Source for collecting `ucs-names' math symbols.")
;;; Emacs process
;;
;;
(defvar anything-c-source-emacs-process
'((name . "Emacs Process")
(candidates . (lambda () (mapcar #'process-name (process-list))))
(persistent-action . (lambda (elm)
(delete-process (get-process elm))
(anything-delete-current-selection)))
(persistent-help . "Kill Process")
(action ("Kill Process" . (lambda (elm)
(delete-process (get-process elm)))))))
;;; World time
;;
;;
(defvar anything-c-source-time-world
'((name . "Time World List")
(init . (lambda ()
(let ((anything-buffer (anything-candidate-buffer 'global)))
(with-current-buffer anything-buffer
(display-time-world-display display-time-world-list)))))
(candidates-in-buffer)))
;;; Anything interface for Debian/Ubuntu packages (apt-*)
;;
;;
(defvar anything-c-source-apt
'((name . "APT")
(init . anything-c-apt-init)
(candidates-in-buffer)
(candidate-transformer anything-c-apt-candidate-transformer)
(display-to-real . anything-c-apt-display-to-real)
(requires-pattern . 2)
(update . anything-c-apt-refresh)
(action
("Show package description" . anything-c-apt-cache-show)
("Install package" . anything-c-apt-install)
("Reinstall package" . anything-c-apt-reinstall)
("Remove package" . anything-c-apt-uninstall)
("Purge package" . anything-c-apt-purge))
(persistent-action . anything-c-apt-persistent-action)
(persistent-help . "Show package description")))
(defvar anything-c-apt-query "emacs")
(defvar anything-c-apt-search-command "apt-cache search '%s'")
(defvar anything-c-apt-show-command "apt-cache show '%s'")
(defvar anything-c-apt-installed-packages nil)
(defvar anything-c-apt-all-packages nil)
(defvar anything-c-apt-input-history nil)
(defun anything-c-apt-refresh ()
"Refresh installed candidates list."
(setq anything-c-apt-installed-packages nil)
(setq anything-c-apt-all-packages nil))
(defun anything-c-apt-persistent-action (candidate)
"Persistent action for APT source."
(anything-c-apt-cache-show candidate))
(defun anything-c-apt-candidate-transformer (candidates)
"Show installed CANDIDATES and the ones to deinstall in a different color."
(loop for cand in candidates
for name = (anything-c-apt-display-to-real cand)
collect (cond ((string= (assoc-default
name anything-c-apt-installed-packages)
"deinstall")
(propertize cand 'face 'anything-apt-deinstalled))
((string= (assoc-default
name anything-c-apt-installed-packages)
"install")
(propertize cand 'face 'anything-apt-installed))
(t cand))))
(defun anything-c-apt-init ()
"Initialize list of debian packages."
(let ((query ""))
(unless (and anything-c-apt-installed-packages
anything-c-apt-all-packages)
(message "Loading package list...")
(setq anything-c-apt-installed-packages
(with-temp-buffer
(call-process-shell-command "dpkg --get-selections"
nil (current-buffer))
(loop for i in (split-string (buffer-string) "\n" t)
for p = (split-string i)
collect (cons (car p) (cadr p)))))
(setq anything-c-apt-all-packages
(with-current-buffer
(anything-candidate-buffer
(get-buffer-create (format "*anything-apt*")))
(erase-buffer)
(call-process-shell-command
(format anything-c-apt-search-command query)
nil (current-buffer))))
(message "Loading package list done")
(sit-for 0.5))))
(defun anything-c-apt-display-to-real (line)
"Return only name of a debian package.
LINE is displayed like:
package name - description."
(car (split-string line " - ")))
(defun anything-c-shell-command-if-needed (command)
"Run shell command COMMAND to describe package.
If a buffer named COMMAND already exists, just switch to it."
(let ((buf (get-buffer command)))
(anything-c-switch-to-buffer (get-buffer-create command))
(unless buf (insert (shell-command-to-string command)))))
(defun anything-c-apt-cache-show (package)
"Show information on apt package PACKAGE."
(anything-c-shell-command-if-needed
(format anything-c-apt-show-command package)))
(defun anything-c-apt-install (package)
"Run 'apt-get install' shell command on PACKAGE."
(anything-c-apt-generic-action :action 'install))
(defun anything-c-apt-reinstall (package)
"Run 'apt-get install --reinstall' shell command on PACKAGE."
(anything-c-apt-generic-action :action 'reinstall))
(defun anything-c-apt-uninstall (package)
"Run 'apt-get remove' shell command on PACKAGE."
(anything-c-apt-generic-action :action 'uninstall))
(defun anything-c-apt-purge (package)
"Run 'apt-get purge' shell command on PACKAGE."
(anything-c-apt-generic-action :action 'purge))
(defun* anything-c-apt-generic-action (&key action)
"Run 'apt-get ACTION'.
Support install, remove and purge actions."
(ansi-term (getenv "SHELL") "anything apt")
(term-line-mode)
(let ((command (case action
('install "sudo apt-get install ")
('reinstall "sudo apt-get install --reinstall ")
('uninstall "sudo apt-get remove ")
('purge "sudo apt-get purge ")
(t (error "Unknow action"))))
(beg (point))
end
(cand-list (mapconcat #'(lambda (x) (format "'%s'" x))
(anything-marked-candidates) " ")))
(goto-char (point-max))
(insert (concat command cand-list))
(setq end (point))
(if (y-or-n-p (format "%s package" (symbol-name action)))
(progn
(setq anything-c-external-commands-list nil)
(setq anything-c-apt-installed-packages nil)
(term-char-mode) (term-send-input))
(delete-region beg end) (term-send-eof) (kill-buffer))))
;; (anything-c-apt-install "jed")
;;; Anything UI for gentoo portage.
;;
;;
(defvar anything-c-gentoo-use-flags nil)
(defvar anything-c-gentoo-buffer "*anything-gentoo-output*")
(defvar anything-c-cache-gentoo nil)
(defvar anything-c-cache-world nil)
(defvar anything-c-source-gentoo
'((name . "Portage sources")
(init . (lambda ()
(get-buffer-create anything-c-gentoo-buffer)
(unless anything-c-cache-gentoo
(anything-c-gentoo-setup-cache))
(unless anything-c-cache-world
(setq anything-c-cache-world (anything-c-gentoo-get-world)))
(anything-c-gentoo-init-list)))
(candidates-in-buffer)
(match . identity)
(candidate-transformer anything-c-highlight-world)
(action . (("Show package" . (lambda (elm)
(anything-c-gentoo-eshell-action elm "eix")))
("Show history" . (lambda (elm)
(if (member elm anything-c-cache-world)
(anything-c-gentoo-eshell-action elm "genlop -qe")
(message "No infos on packages not yet installed"))))
("Copy in kill-ring" . kill-new)
("insert at point" . insert)
("Browse HomePage" . (lambda (elm)
(let ((urls (anything-c-gentoo-get-url elm)))
(browse-url (anything-comp-read "Url: " urls :must-match t)))))
("Show extra infos" . (lambda (elm)
(if (member elm anything-c-cache-world)
(anything-c-gentoo-eshell-action elm "genlop -qi")
(message "No infos on packages not yet installed"))))
("Show use flags" . (lambda (elm)
(anything-c-gentoo-default-action elm "equery" "-C" "u")
(font-lock-add-keywords nil '(("^\+.*" . font-lock-variable-name-face)))
(font-lock-mode 1)))
("Run emerge pretend" . (lambda (elm)
(anything-c-gentoo-eshell-action elm "emerge -p")))
("Emerge" . (lambda (elm)
(anything-gentoo-install elm :action 'install)))
("Unmerge" . (lambda (elm)
(anything-gentoo-install elm :action 'uninstall)))
("Show dependencies" . (lambda (elm)
(anything-c-gentoo-default-action elm "equery" "-C" "d")))
("Show related files" . (lambda (elm)
(anything-c-gentoo-default-action elm "equery" "files")))
("Refresh" . (lambda (elm)
(anything-c-gentoo-setup-cache)
(setq anything-c-cache-world (anything-c-gentoo-get-world))))))))
(defun* anything-gentoo-install (candidate &key action)
(setq anything-c-external-commands-list nil)
(ansi-term (getenv "SHELL") "Gentoo emerge")
(term-line-mode)
(let ((command (case action
('install "sudo emerge -av ")
('uninstall "sudo emerge -avC ")
(t (error "Unknow action"))))
(elms (mapconcat 'identity (anything-marked-candidates) " "))
(beg (point)) end)
(goto-char (point-max))
(insert (concat command elms))
(setq end (point))
(term-char-mode) (term-send-input)))
(defun anything-c-gentoo-default-action (elm command &rest args)
"Gentoo default action that use `anything-c-gentoo-buffer'."
(if (member elm anything-c-cache-world)
(progn
(anything-c-switch-to-buffer anything-c-gentoo-buffer)
(erase-buffer)
(let ((com-list (append args (list elm))))
(apply #'call-process command nil t nil
com-list)))
(message "No infos on packages not yet installed")))
(defvar anything-c-source-use-flags
'((name . "Use Flags")
(init . (lambda ()
(unless anything-c-gentoo-use-flags
(anything-c-gentoo-setup-use-flags-cache))
(anything-c-gentoo-get-use)))
(candidates-in-buffer)
(match . identity)
(candidate-transformer anything-c-highlight-local-use)
(action . (("Description"
. (lambda (elm)
(anything-c-switch-to-buffer anything-c-gentoo-buffer)
(erase-buffer)
(apply #'call-process "euse" nil t nil
`("-i"
,elm))
(font-lock-add-keywords nil `((,elm . font-lock-variable-name-face)))
(font-lock-mode 1)))
("Enable"
. (lambda (elm)
(anything-c-gentoo-eshell-action elm "*sudo -p Password: euse -E")))
("Disable"
. (lambda (elm)
(anything-c-gentoo-eshell-action elm "*sudo -p Password: euse -D")))
("Remove"
. (lambda (elm)
(anything-c-gentoo-eshell-action elm "*sudo -p Password: euse -P")))
("Show which dep use this flag"
. (lambda (elm)
(anything-c-switch-to-buffer anything-c-gentoo-buffer)
(erase-buffer)
(apply #'call-process "equery" nil t nil
`("-C"
"h"
,elm))))))))
(defun anything-c-gentoo-init-list ()
"Initialize buffer with all packages in Portage."
(let* ((portage-buf (get-buffer-create "*anything-gentoo*"))
(buf (anything-candidate-buffer 'portage-buf)))
(with-current-buffer buf
(dolist (i anything-c-cache-gentoo)
(insert (concat i "\n"))))))
(defun anything-c-gentoo-setup-cache ()
"Set up `anything-c-cache-gentoo'"
(setq anything-c-cache-gentoo
(split-string (with-temp-buffer
(call-process "eix" nil t nil
"--only-names")
(buffer-string)))))
(defun anything-c-gentoo-eshell-action (elm command)
(when (get-buffer "*EShell Command Output*")
(kill-buffer "*EShell Command Output*"))
(message "Wait searching...")
(let ((buf-fname (buffer-file-name anything-current-buffer)))
(if (and buf-fname (string-match tramp-file-name-regexp buf-fname))
(progn
(save-window-excursion
(pop-to-buffer "*scratch*")
(eshell-command (format "%s %s" command elm)))
(pop-to-buffer "*EShell Command Output*"))
(eshell-command (format "%s %s" command elm)))))
(defun anything-c-gentoo-get-use ()
"Initialize buffer with all use flags."
(let* ((use-buf (get-buffer-create "*anything-gentoo-use*"))
(buf (anything-candidate-buffer 'use-buf)))
(with-current-buffer buf
(dolist (i anything-c-gentoo-use-flags)
(insert (concat i "\n"))))))
(defun anything-c-gentoo-setup-use-flags-cache ()
"Setup `anything-c-gentoo-use-flags'"
(setq anything-c-gentoo-use-flags
(split-string (with-temp-buffer
(call-process "eix" nil t nil
"--print-all-useflags")
(buffer-string)))))
(defun anything-c-gentoo-get-url (elm)
"Return a list of urls from eix output."
(loop
with url-list = (split-string
(with-temp-buffer
(call-process "eix" nil t nil
elm "--format" "<homepage>\n")
(buffer-string)))
with all
for i in url-list
when (and (string-match "^http://.*" i)
(not (member i all)))
collect i into all
finally return all))
(defun anything-c-gentoo-get-world ()
"Return list of all installed package on your system."
(split-string (with-temp-buffer
(call-process "qlist" nil t nil
"-I")
(buffer-string))))
(defun anything-c-gentoo-get-local-use ()
(split-string (with-temp-buffer
(call-process "portageq" nil t nil
"envvar"
"USE")
(buffer-string))))
(defun anything-c-highlight-world (eix)
"Highlight all installed package."
(loop for i in eix
if (member i anything-c-cache-world)
collect (propertize i 'face 'anything-gentoo-match-face)
else
collect i))
(defun anything-c-highlight-local-use (use-flags)
(let ((local-uses (anything-c-gentoo-get-local-use)))
(loop for i in use-flags
if (member i local-uses)
collect (propertize i 'face 'anything-gentoo-match-face)
else
collect i)))
;;; Anything ratpoison UI
;;
;;
(defvar anything-c-source-ratpoison-commands
'((name . "Ratpoison Commands")
(init . anything-c-ratpoison-commands-init)
(candidates-in-buffer)
(action ("Execute the command" . anything-c-ratpoison-commands-execute))
(display-to-real . anything-c-ratpoison-commands-display-to-real)
(candidate-number-limit)))
(defun anything-c-ratpoison-commands-init ()
(unless (anything-candidate-buffer)
(with-current-buffer (anything-candidate-buffer 'global)
;; with ratpoison prefix key
(save-excursion
(call-process "ratpoison" nil (current-buffer) nil "-c" "help"))
(while (re-search-forward "^\\([^ ]+\\) \\(.+\\)$" nil t)
(replace-match "<ratpoison> \\1: \\2"))
(goto-char (point-max))
;; direct binding
(save-excursion
(call-process "ratpoison" nil (current-buffer) nil "-c" "help top"))
(while (re-search-forward "^\\([^ ]+\\) \\(.+\\)$" nil t)
(replace-match "\\1: \\2")))))
(defun anything-c-ratpoison-commands-display-to-real (display)
(and (string-match ": " display)
(substring display (match-end 0))))
(defun anything-c-ratpoison-commands-execute (candidate)
(call-process "ratpoison" nil nil nil "-ic" candidate))
;;; Anything `completing-read' replacement
;;
;;
(defun anything-comp-read-get-candidates (collection &optional test sort-fn alistp)
"Convert COLLECTION to list removing elements that don't match TEST.
See `anything-comp-read' about supported COLLECTION arguments.
SORT-FN is a predicate to sort COLLECTION.
ALISTP when non--nil will not use `all-completions' to collect
candidates because it doesn't handle alists correctly for anything.
i.e In `all-completions' the keys \(cars of elements\)
are the possible completions. In anything we want to use the cdr instead
like \(display . real\).
e.g
\(setq A '((a . 1) (b . 2) (c . 3)))
==>((a . 1) (b . 2) (c . 3))
\(anything-comp-read \"test: \" A :alistp nil
:exec-when-only-one t
:initial-input \"a\")
==>\"a\"
\(anything-comp-read \"test: \" A :alistp t
:exec-when-only-one t
:initial-input \"1\")
==>\"1\"
See docstring of `all-completions' for more info.
If COLLECTION is an `obarray', a TEST should be needed. See `obarray'."
(let ((cands
(cond ((and (eq collection obarray) test)
(all-completions "" collection test))
((and (vectorp collection) test)
(loop for i across collection when (funcall test i) collect i))
((vectorp collection)
(loop for i across collection collect i))
((and alistp test)
(loop for i in collection when (funcall test i) collect i))
((and (symbolp collection) (boundp collection))
(symbol-value collection))
(alistp collection)
((and collection test)
(all-completions "" collection test))
(t (all-completions "" collection)))))
(if sort-fn (sort cands sort-fn) cands)))
(defun anything-cr-default-transformer (candidates source)
"Default filter candidate function for `anything-comp-read'.
Do nothing, just return candidate list unmodified."
candidates)
(defun* anything-comp-read (prompt collection
&key
test
initial-input
default
preselect
(buffer "*Anything Completions*")
must-match
(requires-pattern 0)
(history nil)
input-history
(persistent-action nil)
(persistent-help "DoNothing")
(mode-line anything-mode-line-string)
(keymap anything-map)
(name "Anything Completions")
candidates-in-buffer
exec-when-only-one
(volatile t)
sort
(fc-transformer 'anything-cr-default-transformer)
(marked-candidates nil)
(alistp t))
"Read a string in the minibuffer, with anything completion.
It is anything `completing-read' equivalent.
- PROMPT is the prompt name to use.
- COLLECTION can be a list, vector, obarray or hash-table.
It can be also a function that receives three arguments:
the values string, predicate and t. See `all-completions' for more details.
Keys description:
- TEST: A predicate called with one arg i.e candidate.
- INITIAL-INPUT: Same as input arg in `anything'.
- PRESELECT: See preselect arg of `anything'.
- DEFAULT: This option is used only for compatibility with regular
Emacs `completing-read'.
- BUFFER: Name of anything-buffer.
- MUST-MATCH: Candidate selected must be one of COLLECTION.
- REQUIRES-PATTERN: Same as anything attribute, default is 0.
- HISTORY: A list containing specific history, default is nil.
When it is non--nil, all elements of HISTORY are displayed in
a special source before COLLECTION.
- INPUT-HISTORY: A symbol. the minibuffer input history will be
stored there, if nil or not provided, `minibuffer-history'
will be used instead.
- PERSISTENT-ACTION: A function called with one arg i.e candidate.
- PERSISTENT-HELP: A string to document PERSISTENT-ACTION.
- MODE-LINE: A string or list to display in mode line.
(See `anything-mode-line-string')
- KEYMAP: A keymap to use in this `anything-comp-read'.
(The keymap will be shared with history source)
- NAME: The name related to this local source.
- EXEC-WHEN-ONLY-ONE: Bound `anything-execute-action-at-once-if-one'
to non--nil. (possibles values are t or nil).
- VOLATILE: Use volatile attribute \(enabled by default\).
- SORT: A predicate to give to `sort' e.g `string-lessp'.
- FC-TRANSFORMER: A `filtered-candidate-transformer' function.
- MARKED-CANDIDATES: If non--nil return candidate or marked candidates as a list.
- ALISTP: \(default is non--nil\) See `anything-comp-read-get-candidates'.
- CANDIDATES-IN-BUFFER: when non--nil use a source build with
`anything-candidates-in-buffer' which is much faster.
Argument VOLATILE have no effect when CANDIDATES-IN-BUFFER is non--nil.
Any prefix args passed during `anything-comp-read' invocation will be recorded
in `anything-current-prefix-arg', otherwise if prefix args were given before
`anything-comp-read' invocation, the value of `current-prefix-arg' will be used.
That's mean you can pass prefix args before or after calling a command
that use `anything-comp-read' See `anything-M-x' for example."
(when (get-buffer anything-action-buffer)
(kill-buffer anything-action-buffer))
(flet ((action-fn (candidate)
(if marked-candidates
(anything-marked-candidates)
(identity candidate))))
;; Assume completion have been already required,
;; so always use 'confirm.
(when (eq must-match 'confirm-after-completion)
(setq must-match 'confirm))
(let* ((minibuffer-completion-confirm must-match)
(must-match-map (when must-match
(let ((map (make-sparse-keymap)))
(define-key map (kbd "RET")
'anything-confirm-and-exit-minibuffer)
map)))
(anything-map (if must-match-map
(make-composed-keymap
must-match-map (or keymap anything-map))
(or keymap anything-map)))
(src-hist `((name . ,(format "%s History" name))
(candidates
. (lambda ()
(let ((all (anything-comp-read-get-candidates
history nil nil ,alistp)))
(delete
""
(anything-fast-remove-dups
(if (and default (not (string= default "")))
(delq nil (cons default
(delete default all)))
all)
:test 'equal)))))
(filtered-candidate-transformer
. (lambda (candidates sources)
(loop for i in candidates
do (set-text-properties 0 (length i) nil i)
collect i)))
(persistent-action . ,persistent-action)
(persistent-help . ,persistent-help)
(mode-line . ,mode-line)
(action . ,'action-fn)))
(src `((name . ,name)
(candidates
. (lambda ()
(let ((cands (anything-comp-read-get-candidates
collection test sort alistp)))
(unless (or must-match (string= anything-pattern ""))
(setq cands (append (list anything-pattern) cands)))
(if (and default (not (string= default "")))
(delq nil (cons default (delete default cands)))
cands))))
(filtered-candidate-transformer ,fc-transformer)
(requires-pattern . ,requires-pattern)
(persistent-action . ,persistent-action)
(persistent-help . ,persistent-help)
(mode-line . ,mode-line)
(action . ,'action-fn)))
(src-1 `((name . ,name)
(init
. (lambda ()
(let ((cands (anything-comp-read-get-candidates
collection test sort alistp)))
(unless (or must-match (string= anything-pattern ""))
(setq cands (append (list anything-pattern) cands)))
(with-current-buffer (anything-candidate-buffer 'global)
(loop for i in
(if (and default (not (string= default "")))
(delq nil (cons default (delete default cands)))
cands)
do (insert (concat i "\n")))))))
(candidates-in-buffer)
(filtered-candidate-transformer ,fc-transformer)
(requires-pattern . ,requires-pattern)
(persistent-action . ,persistent-action)
(persistent-help . ,persistent-help)
(mode-line . ,mode-line)
(action . ,'action-fn)))
(src-list (list src-hist
(if candidates-in-buffer
src-1
(if volatile
(append src '((volatile)))
src))))
(anything-execute-action-at-once-if-one exec-when-only-one))
(or
(anything
:sources src-list
:input initial-input
:default default
:preselect preselect
:prompt prompt
:resume 'noresume
:keymap anything-map
:history (and (symbolp input-history) input-history)
:buffer buffer)
(when (and (eq anything-exit-status 0)
(eq must-match 'confirm))
;; Return empty string only if it is the DEFAULT
;; value and anything-pattern is empty.
;; otherwise return anything-pattern
(if (and (string= anything-pattern "") default)
default (identity anything-pattern)))
(unless (or (eq anything-exit-status 1)
must-match) ; FIXME this should not be needed now.
default)
(keyboard-quit)))))
;; Generic completing-read
;;
;; Support also function as collection.
;; e.g M-x man is supported.
;; Support hash-table and vectors as collection.
;; NOTE:
;; Some crap emacs functions may not be supported
;; like ffap-alternate-file (bad use of completing-read)
;; and maybe others.
;; Provide a mode `anything-completion-mode' which turn on
;; anything in all `completing-read' and `read-file-name' in Emacs.
;;
(defvar anything-completion-mode-string " AC")
(defvar anything-completion-mode-quit-message
"Anything completion disabled")
(defvar anything-completion-mode-start-message
"Anything completion enabled")
;;; Specialized handlers
;;
;;
(defun anything-completing-read-symbols
(prompt collection test require-match init
hist default inherit-input-method name buffer)
"Specialized function for fast symbols completion in `ac-mode'."
(or
(anything
:sources `((name . ,name)
(init . (lambda ()
(with-current-buffer (anything-candidate-buffer 'global)
(goto-char (point-min))
(when (and default (stringp default)
;; Some defaults args result as
;; (symbol-name nil) == "nil".
;; e.g debug-on-entry.
(not (string= default "nil"))
(not (string= default "")))
(insert (concat default "\n")))
(loop with all = (all-completions "" collection test)
for sym in all
unless (and default (eq sym default))
do (insert (concat sym "\n"))))))
(persistent-action . anything-lisp-completion-persistent-action)
(persistent-help . "Show brief doc in mode-line")
(candidates-in-buffer)
(action . identity))
:prompt prompt
:buffer buffer
:input init
:history hist
:resume 'noresume
:default (or default ""))
(keyboard-quit)))
;;; Generic completing read
;;
;;
(defun anything-completing-read-default-1
(prompt collection test require-match
init hist default inherit-input-method
name buffer &optional cands-in-buffer exec-when-only-one)
"Call `anything-comp-read' with same args as `completing-read'.
Extra optional arg CANDS-IN-BUFFER mean use `candidates-in-buffer'
method which is faster.
It should be used when candidate list don't need to rebuild dynamically."
(let ((history (or (car-safe hist) hist)))
(anything-comp-read
prompt collection
:test test
:history history
:input-history history
:must-match require-match
:alistp nil ; Be sure `all-completions' is used.
:name name
:requires-pattern (if (and (string= default "")
(or (eq require-match 'confirm)
(eq require-match
'confirm-after-completion)))
1 0)
:candidates-in-buffer cands-in-buffer
:exec-when-only-one exec-when-only-one
:buffer buffer
;; If DEF is not provided, fallback to empty string
;; to avoid `thing-at-point' to be appended on top of list
:default (or default "")
;; Use `regexp-quote' to fix initial input
;; with special characters (e.g nnimap+gmail:)
:initial-input (and (stringp init) (regexp-quote init)))))
(defun anything-completing-read-with-cands-in-buffer
(prompt collection test require-match
init hist default inherit-input-method
name buffer)
"Same as `anything-completing-read-default-1' but use candidates-in-buffer."
;; Some commands like find-tag may use `read-file-name' from inside
;; the calculation of collection. in this case it clash with
;; candidates-in-buffer that reuse precedent data (files) which is wrong.
;; So (re)calculate collection outside of main anything-session.
(let ((cands (all-completions "" collection)))
(anything-completing-read-default-1 prompt cands test require-match
init hist default inherit-input-method
name buffer t)))
(defun* anything-completing-read-default
(prompt collection &optional
predicate require-match
initial-input hist def
inherit-input-method)
"An anything replacement of `completing-read'.
This function should be used only as a `completing-read-function'.
Don't use it directly, use instead `anything-comp-read' in your programs.
See documentation of `completing-read' and `all-completions' for details."
(declare (special anything-completion-mode))
(let* ((current-command this-command)
(str-command (symbol-name current-command))
(buf-name (format "*ac-mode-%s*" str-command))
(entry (assq current-command
anything-completing-read-handlers-alist))
(def-com (cdr-safe entry))
(str-defcom (and def-com (symbol-name def-com)))
(def-args (list prompt collection predicate require-match
initial-input hist def inherit-input-method))
;; Append the two extra args needed to set the buffer and source name
;; in anything specialized functions.
(any-args (append def-args (list str-command buf-name)))
anything-completion-mode-start-message ; Be quiet
anything-completion-mode-quit-message
(minibuffer-completion-table collection)
(minibuffer-completion-predicate predicate)
;; Be sure this pesty *completion* buffer doesn't popup.
(minibuffer-setup-hook (remove 'minibuffer-completion-help
minibuffer-setup-hook)))
(when (eq def-com 'ido) (setq def-com 'ido-completing-read))
(unless (or (not entry) def-com)
;; An entry in *read-handlers-alist exists but have
;; a nil value, so we exit from here, disable `ac-mode'
;; and run the command again with it original behavior.
;; `ac-mode' will be restored on exit.
(return-from anything-completing-read-default
(unwind-protect
(progn
(ac-mode -1)
(apply completing-read-function def-args))
(ac-mode 1))))
;; If we use now `completing-read' we MUST turn off `ac-mode'
;; to avoid infinite recursion and CRASH. It will be reenabled on exit.
(when (or (eq def-com 'completing-read)
;; All specialized functions are prefixed by "anything"
(and (stringp str-defcom)
(not (string-match "^anything" str-defcom))))
(ac-mode -1))
(unwind-protect
(cond (;; An anything specialized function exists, run it.
(and def-com anything-completion-mode)
(apply def-com any-args))
(;; Try to handle `ido-completing-read' everywhere.
(and def-com (eq def-com 'ido-completing-read))
(setcar (memq collection def-args)
(all-completions "" collection predicate))
(apply def-com def-args))
(;; User set explicitely `completing-read' or something similar
;; in *read-handlers-alist, use this with exactly the same
;; args as in `completing-read'.
;; If we are here `anything-completion-mode' is now disabled.
def-com
(apply def-com def-args))
(t ; Fall back to classic `anything-comp-read'.
(anything-completing-read-default-1
prompt collection predicate require-match
initial-input hist def inherit-input-method
str-command buf-name)))
(ac-mode 1)
;; When exiting minibuffer, `this-command' is set to
;; `anything-exit-minibuffer', which is unwanted when starting
;; on another `completing-read', so restore `this-command' to
;; initial value when exiting.
(setq this-command current-command))))
(defun* anything-generic-read-file-name
(prompt &optional dir default-filename mustmatch initial predicate)
"An anything replacement of `read-file-name'."
(declare (special anything-completion-mode))
(let* ((default (and default-filename
(if (listp default-filename)
(car default-filename)
default-filename)))
(init (or default initial dir default-directory))
(ini-input (and init (expand-file-name init)))
(current-command this-command)
(str-command (symbol-name current-command))
(anything-file-completion-sources
(cons str-command
(remove str-command anything-file-completion-sources)))
(buf-name (format "*ac-mode-%s*" str-command))
(entry (assq current-command
anything-completing-read-handlers-alist))
(def-com (cdr-safe entry))
(str-defcom (symbol-name def-com))
(def-args (list prompt dir default-filename mustmatch initial predicate))
;; Append the two extra args needed to set the buffer and source name
;; in anything specialized functions.
(any-args (append def-args (list str-command buf-name)))
(ido-state ido-mode)
anything-completion-mode-start-message ; Be quiet
anything-completion-mode-quit-message ; Same here
fname)
;; Some functions that normally call `completing-read' can switch
;; brutally to `read-file-name' (e.g find-tag), in this case
;; the anything specialized function will fail because it is build
;; for `completing-read', so set it to 'incompatible to be sure
;; we switch to `anything-c-read-file-name' and don't try to call it
;; with wrong number of args.
(when (and def-com (> (length (help-function-arglist def-com)) 8))
(setq def-com 'incompatible))
(when (eq def-com 'ido) (setq def-com 'ido-read-file-name))
(unless (or (not entry) def-com)
(return-from anything-generic-read-file-name
(unwind-protect
(progn
(ac-mode -1)
(apply read-file-name-function def-args))
(ac-mode 1))))
;; If we use now `read-file-name' we MUST turn off `ac-mode'
;; to avoid infinite recursion and CRASH. It will be reenabled on exit.
(when (or (eq def-com 'read-file-name)
(eq def-com 'ido-read-file-name)
(and (stringp str-defcom)
(not (string-match "^anything" str-defcom))))
(ac-mode -1))
(unwind-protect
(setq fname
(cond (;; A specialized function exists, run it
;; with the two extra args specific to anything..
(and def-com anything-completion-mode
(not (eq def-com 'ido-read-file-name))
(not (eq def-com 'incompatible)))
(apply def-com any-args))
(;; Def-com value is `ido-read-file-name'
;; run it with default args.
(and def-com (eq def-com 'ido-read-file-name))
(ido-mode 1)
(apply def-com def-args))
(;; Def-com value is `read-file-name'
;; run it with default args.
(eq def-com 'read-file-name)
(apply def-com def-args))
(t ; Fall back to classic `anything-c-read-file-name'.
(anything-c-read-file-name
prompt
:name str-command
:buffer buf-name
:initial-input (expand-file-name init dir)
:alistp nil
:must-match mustmatch
:test predicate))))
(ac-mode 1)
(ido-mode (if ido-state 1 -1))
;; Same comment as in `anything-completing-read-default'.
(setq this-command current-command))
(if (and mustmatch (not (file-exists-p fname)))
(if (y-or-n-p "File does not exists, create buffer?")
fname (error "Abort file does not exists"))
fname)))
;;;###autoload
(define-minor-mode anything-completion-mode
"Toggle generic anything completion.
All functions in Emacs that use `completing-read'
or `read-file-name' and friends will use anything interface
when this mode is turned on.
However you can modify this behavior for functions of your choice
with `anything-completing-read-handlers-alist'.
Called with a positive arg, turn on unconditionally, with a
negative arg turn off.
You can turn it on with `ac-mode'.
Some crap emacs functions may not be supported,
e.g `ffap-alternate-file' and maybe others
You can add such functions to `anything-completing-read-handlers-alist'
with a nil value.
Note: This mode will work only partially on Emacs23."
:group 'anything
:global t
:lighter anything-completion-mode-string
(declare (special completing-read-function))
(if anything-completion-mode
(progn
(setq completing-read-function 'anything-completing-read-default
read-file-name-function 'anything-generic-read-file-name)
(message anything-completion-mode-start-message))
(setq completing-read-function (and (fboundp 'completing-read-default)
'completing-read-default)
read-file-name-function (and (fboundp 'read-file-name-default)
'read-file-name-default))
(message anything-completion-mode-quit-message)))
(defalias 'ac-mode 'anything-completion-mode)
;;; Eshell completion.
;;
;; Enable like this in .emacs:
;;
;; (add-hook 'eshell-mode-hook
;; #'(lambda ()
;; (define-key eshell-mode-map [remap pcomplete] 'anything-esh-pcomplete)))
;;
(defvar anything-c-source-esh
'((name . "Eshell completions")
(init . (lambda ()
(setq pcomplete-current-completions nil
pcomplete-last-completion-raw nil)
;; Eshell-command add this hook in all minibuffers
;; Remove it for the anything one. (Fixed in Emacs24)
(remove-hook 'minibuffer-setup-hook 'eshell-mode)))
(candidates . anything-esh-get-candidates)
(action . anything-ec-insert))
"Anything source for Eshell completion.")
;; Internal.
(defvar anything-ec-target "")
(defun anything-ec-insert (candidate)
"Replace text at point with CANDIDATE.
The function that call this should set `anything-ec-target' to thing at point.
This is the same as `ac-insert', just inlined here for compatibility."
(let ((pt (point)))
(when (and anything-ec-target
(search-backward anything-ec-target nil t)
(string= (buffer-substring (point) pt) anything-ec-target))
(delete-region (point) pt)))
(insert (anything-quote-whitespace candidate)))
(defun anything-esh-get-candidates ()
"Get candidates for eshell completion using `pcomplete'."
(catch 'pcompleted
(let* ((pcomplete-stub)
pcomplete-seen pcomplete-norm-func
pcomplete-args pcomplete-last pcomplete-index
(pcomplete-autolist pcomplete-autolist)
(pcomplete-suffix-list pcomplete-suffix-list))
(with-anything-current-buffer
(loop with table = (pcomplete-completions)
with entry = (condition-case nil
;; On Emacs24 `try-completion' return
;; pattern when more than one result.
;; Otherwise Emacs23 return nil, which
;; is wrong, in this case use pattern
;; to behave like Emacs24.
(or (try-completion anything-pattern
(pcomplete-entries))
anything-pattern)
;; In Emacs23 `pcomplete-entries' may fail
;; with error, so try this instead.
(error
nil
(let ((fc (car (last
(pcomplete-parse-arguments)))))
;; Check if last arg require fname completion.
(and (file-name-directory fc) fc))))
for i in (all-completions pcomplete-stub table)
for file-cand = (and entry
(if (file-remote-p i) i
(expand-file-name
i (file-name-directory entry))))
if (and file-cand (or (file-remote-p file-cand)
(file-exists-p file-cand)))
collect file-cand into ls
else collect i into ls
finally return
(if (and entry (not (string= entry "")) (file-exists-p entry))
(append (list (expand-file-name entry default-directory)) ls)
ls))))))
;;; Eshell history.
;;
;;
(defvar anything-c-source-eshell-history
`((name . "Eshell history")
(init . (lambda ()
(let (eshell-hist-ignoredups)
;; Write the content's of ring to file.
(eshell-write-history eshell-history-file-name t)
(with-current-buffer (anything-candidate-buffer 'global)
(insert-file-contents eshell-history-file-name)))
;; Same comment as in `anything-c-source-esh'
(remove-hook 'minibuffer-setup-hook 'eshell-mode)))
(candidates-in-buffer)
(keymap . ,anything-eshell-history-map)
(filtered-candidate-transformer . (lambda (candidates sources)
(reverse candidates)))
(candidate-number-limit . 9999)
(action . (lambda (candidate)
(eshell-kill-input)
(insert candidate))))
"Anything source for Eshell history.")
;;; Show completion - an alternative of anything-show-completion.el.
;;
;; Provide show completion with macro `with-anything-show-completion'.
;; Called each time cursor move in anything-buffer.
(defun anything-c-show-completion ()
(with-anything-current-buffer
(overlay-put anything-c-show-completion-overlay
'display (anything-get-selection))))
(defun anything-c-show-completion-init-overlay (beg end)
(and anything-c-turn-on-show-completion
(setq anything-c-show-completion-overlay (make-overlay beg end))
(overlay-put anything-c-show-completion-overlay
'face 'anything-lisp-show-completion)))
(defun anything-c-show-completion-display-function (buffer)
"A special resized anything window is used depending on position in BUFFER."
(with-selected-window (selected-window)
(let* ((screen-size (+ (count-screen-lines (window-start) (point) t)
1 ; mode-line
(if header-line-format 1 0))) ; header-line
(def-size (- (window-height)
anything-c-show-completion-min-window-height))
(upper-height (max window-min-height (min screen-size def-size)))
split-window-keep-point)
(recenter -1)
(set-window-buffer (if (active-minibuffer-window)
(minibuffer-selected-window)
(split-window nil upper-height))
buffer))))
(defmacro with-anything-show-completion (beg end &rest body)
"Show anything candidate in an overlay at point.
BEG and END are the beginning and end position of the current completion
in `anything-current-buffer'.
BODY is an anything call where we want to enable show completion.
If `anything-c-turn-on-show-completion' is nil just do nothing."
(declare (indent 2) (debug t))
`(let ((anything-move-selection-after-hook
(and anything-c-turn-on-show-completion
(append (list 'anything-c-show-completion)
anything-move-selection-after-hook))))
(unwind-protect
(progn
(anything-c-show-completion-init-overlay ,beg ,end)
(let ((anything-display-function
(if anything-c-show-completion-use-special-display
'anything-c-show-completion-display-function
'anything-default-display-buffer)))
,@body))
(and anything-c-turn-on-show-completion
(delete-overlay anything-c-show-completion-overlay)))))
;;; Lisp symbol completion.
;;
;;
;;;###autoload
(defun anything-lisp-completion-at-point ()
"Anything lisp symbol completion at point."
(interactive)
(let* ((data (lisp-completion-at-point))
(beg (car data))
(end (point)) ; 'cadr data' is wrong when no space after point.
(plist (nthcdr 3 data))
(pred (plist-get plist :predicate))
(lgst-len 0)
(target (and beg end (buffer-substring-no-properties beg end)))
(candidates (all-completions target (nth 2 data) pred))
(anything-quit-if-no-candidate t)
(anything-execute-action-at-once-if-one t)
(anything-match-plugin-enabled
(member 'anything-compile-source--match-plugin
anything-compile-source-functions)))
(if candidates
(with-anything-show-completion beg end
;; Overlay is initialized now in anything-current-buffer.
(anything
:sources
'((name . "Lisp completion")
(init . (lambda ()
(with-current-buffer (anything-candidate-buffer 'global)
(loop for sym in candidates
for len = (length sym)
when (> len lgst-len) do (setq lgst-len len)
do (insert (concat sym "\n"))))))
(candidates-in-buffer)
(persistent-action . anything-lisp-completion-persistent-action)
(persistent-help . "Show brief doc in mode-line")
(filtered-candidate-transformer anything-lisp-completion-transformer)
(action . (lambda (candidate)
(delete-region beg end)
(insert candidate))))
:input (if anything-match-plugin-enabled (concat target " ") target)))
(message "[No Match]"))))
(defun anything-lisp-completion-persistent-action (candidate)
(let ((cursor-in-echo-area t)
mode-line-in-non-selected-windows)
(anything-c-show-info-in-mode-line
(propertize
(anything-c-get-first-line-documentation
(intern candidate))
'face 'anything-lisp-completion-info))))
(defun anything-lisp-completion-transformer (candidates source)
"Anything candidates transformer for lisp completion."
(declare (special lgst-len))
(loop for c in candidates
for sym = (intern c)
for annot = (cond ((commandp sym) " (Com)")
((fboundp sym) " (Fun)")
((boundp sym) " (Var)")
((facep sym) " (Face)"))
for spaces = (make-string (- lgst-len (length c)) ? )
collect (cons (concat c spaces annot) c)))
(defun anything-c-get-first-line-documentation (sym)
"Return first line documentation of symbol SYM.
If SYM is not documented, return \"Not documented\"."
(let ((doc (cond ((fboundp sym)
(documentation sym t))
((boundp sym)
(documentation-property sym 'variable-documentation t))
((facep sym)
(face-documentation sym))
(t nil))))
(if (and doc (not (string= doc ""))
;; `documentation' return "\n\n(args...)"
;; for CL-style functions.
(not (string-match-p "^\n\n" doc)))
(car (split-string doc "\n"))
"Not documented")))
;;; File completion.
;;
;; Complete file name at point.
(defun anything-c-thing-before-point ()
"Get symbol name before point.
Borrowed from anything-complete.el, inlined here for compatibility."
(save-excursion
(let ((beg (point)))
;; older regexp "\(\\|\\s-\\|^\\|\\_<\\|\r\\|'\\|#'"
(when (re-search-backward
"\\_<" (field-beginning nil nil (point-at-bol)) t)
(buffer-substring-no-properties beg (match-end 0))))))
;;;###autoload
(defun anything-c-complete-file-name-at-point ()
"Complete file name at point."
(interactive)
(let* ((init (substring-no-properties (thing-at-point 'filename)))
(end (point))
(beg (- (point) (length init)))
(anything-quit-if-no-candidate t)
(anything-execute-action-at-once-if-one t)
completion)
(with-anything-show-completion beg end
(setq completion (anything-c-read-file-name "FileName: "
:initial-input init)))
(anything-c-insert-file-name-completion-at-point completion)))
;; Internal
(defvar anything-lisp-completion-counter 0)
;;;###autoload
(defun anything-lisp-completion-at-point-or-indent (arg)
"First call indent and second call complete lisp symbol.
The second call should happen before `anything-lisp-completion-or-indent-delay',
after this delay, next call will indent again.
After completion, next call is always indent.
See that like click and double mouse click.
One hit indent, two quick hits maybe indent and complete."
(interactive "P")
;; Be sure `indent-for-tab-command' will not try
;; to use `completion-at-point'.
(let ((tab-always-indent (if (eq tab-always-indent 'complete)
t tab-always-indent)))
(incf anything-lisp-completion-counter)
(unwind-protect
(if (> anything-lisp-completion-counter 1)
(anything-lisp-completion-or-file-name-at-point)
(indent-for-tab-command arg))
;; After `anything-lisp-completion-or-indent-delay' seconds
;; reset to 0.
(run-with-timer anything-lisp-completion-or-indent-delay nil
#'(lambda ()
(setq anything-lisp-completion-counter 0)))
;; Always reset to 0 at second hit.
(when (eq anything-lisp-completion-counter 2)
(setq anything-lisp-completion-counter 0)))))
;;;###autoload
(defun anything-lisp-completion-or-file-name-at-point ()
"Complete lisp symbol or filename at point.
Filename completion happen if filename is started in
or between double quotes."
(interactive)
(let ((tap (substring-no-properties (thing-at-point 'filename))))
(if (and tap (string-match "^\\(~/\\|/\\|[a-zA-Z]\:/\\).*" tap)
(save-excursion (search-backward "\"" (point-at-bol) t)))
(anything-c-complete-file-name-at-point)
(anything-lisp-completion-at-point))))
(defun anything-c-apropos-init (test default)
"Init candidates buffer for `anything-c-apropos' sources."
(with-current-buffer (anything-candidate-buffer 'global)
(goto-char (point-min))
(when (and default (stringp default)
;; Some defaults args result as
;; (symbol-name nil) == "nil".
;; e.g debug-on-entry.
(not (string= default "nil"))
(funcall test (intern default)))
(insert (concat default "\n")))
(loop with all = (all-completions "" obarray test)
for sym in all
unless (and default (eq sym default))
do (insert (concat sym "\n")))))
;;; Run Externals commands within Emacs with anything completion
;;
;;
(defvar anything-external-command-history nil)
(defun anything-c-external-commands-list-1 (&optional sort)
"Returns a list of all external commands the user can execute.
If `anything-c-external-commands-list' is non-nil it will
return its contents. Else it calculates all external commands
and sets `anything-c-external-commands-list'."
(if anything-c-external-commands-list
anything-c-external-commands-list
(setq anything-c-external-commands-list
(loop
with paths = (split-string (getenv "PATH") path-separator)
with completions = ()
for dir in paths
when (and (file-exists-p dir) (file-accessible-directory-p dir))
for lsdir = (loop for i in (directory-files dir t)
for bn = (file-name-nondirectory i)
when (and (not (member bn completions))
(not (file-directory-p i))
(file-executable-p i))
collect bn)
append lsdir into completions
finally return (if sort (sort completions 'string-lessp) completions)))))
(defun anything-run-or-raise (exe &optional file)
"Generic command that run asynchronously EXE.
If EXE is already running just jump to his window if `anything-raise-command'
is non--nil.
When FILE argument is provided run EXE with FILE.
In this case EXE must be provided as \"EXE %s\"."
(lexical-let* ((real-com (car (split-string (replace-regexp-in-string
"%s" "" exe))))
(proc (if file (concat real-com " " file) real-com)))
(if (get-process proc)
(if anything-raise-command
(shell-command (format anything-raise-command real-com))
(error "Error: %s is already running" real-com))
(when (loop for i in anything-c-external-commands-list thereis real-com)
(message "Starting %s..." real-com)
(if file
(start-process-shell-command
proc nil (format exe (shell-quote-argument
(if (eq system-type 'windows-nt)
(anything-w32-prepare-filename file)
file))))
(start-process-shell-command proc nil real-com))
(set-process-sentinel
(get-process proc)
#'(lambda (process event)
(when (and (string= event "finished\n")
anything-raise-command
(not (anything-c-get-pid-from-process-name real-com)))
(shell-command (format anything-raise-command "emacs")))
(message "%s process...Finished." process))))
(setq anything-c-external-commands-list
(cons real-com
(delete real-com anything-c-external-commands-list))))))
;;; Generic action functions
;;
;;
(defun anything-c-file-buffers (filename)
"Returns a list of buffer names corresponding to FILENAME."
(let ((name (expand-file-name filename))
(buf-list ()))
(dolist (buf (buffer-list) buf-list)
(let ((bfn (buffer-file-name buf)))
(when (and bfn (string= name bfn))
(push (buffer-name buf) buf-list))))))
(defun anything-revert-buffer (candidate)
(with-current-buffer candidate
(when (or (buffer-modified-p)
(not (verify-visited-file-modtime
(get-buffer candidate))))
(revert-buffer t t))))
(defun anything-revert-marked-buffers (ignore)
(mapc 'anything-revert-buffer (anything-marked-candidates)))
(defun anything-kill-marked-buffers (ignore)
(mapc 'kill-buffer (anything-marked-candidates)))
(defun anything-c-delete-file (file &optional error-if-dot-file-p)
"Delete the given file after querying the user.
Ask to kill buffers associated with that file, too."
(when (and error-if-dot-file-p
(anything-ff-dot-file-p file))
(error "Error: Cannot operate on `.' or `..'"))
(let ((buffers (anything-c-file-buffers file)))
(if (< emacs-major-version 24)
;; `dired-delete-file' in Emacs versions < 24
;; doesn't support delete-by-moving-to-trash
;; so use `delete-directory' and `delete-file'
;; that handle it.
(cond ((and (not (file-symlink-p file))
(file-directory-p file)
(directory-files file t dired-re-no-dot))
(when (y-or-n-p (format "Recursive delete of `%s'? " file))
(delete-directory file 'recursive)))
((and (not (file-symlink-p file))
(file-directory-p file))
(delete-directory file))
(t (delete-file file)))
(dired-delete-file
file 'dired-recursive-deletes delete-by-moving-to-trash))
(when buffers
(dolist (buf buffers)
(when (y-or-n-p (format "Kill buffer %s, too? " buf))
(kill-buffer buf))))))
(defun anything-get-mailcap-for-file (filename)
"Get the command to use for FILENAME from mailcap files.
The command is like <command %s> and is meant to use with `format'."
(mailcap-parse-mailcaps)
(let* ((ext (file-name-extension filename))
(mime (when ext (mailcap-extension-to-mime ext)))
(result (when mime (mailcap-mime-info mime))))
;; If elisp file have no associations in .mailcap
;; `mailcap-maybe-eval' is returned, in this case just return nil.
(when (stringp result) result)))
(defun anything-get-default-program-for-file (filename)
"Try to find a default program to open FILENAME.
Try first in `anything-c-external-programs-associations' and then in mailcap file
if nothing found return nil."
(let* ((ext (file-name-extension filename))
(def-prog (assoc-default ext anything-c-external-programs-associations)))
(cond ((and def-prog (not (string= def-prog "")))
(concat def-prog " %s"))
((and anything-c-default-external-file-browser
(file-directory-p filename))
(concat anything-c-default-external-file-browser " %s"))
(t (anything-get-mailcap-for-file filename)))))
(defun anything-c-open-file-externally (file)
"Open FILE with an external program.
Try to guess which program to use with `anything-get-default-program-for-file'.
If not found or a prefix arg is given query the user which tool to use."
(let* ((fname (expand-file-name file))
(collection (anything-c-external-commands-list-1 'sort))
(def-prog (anything-get-default-program-for-file fname))
(real-prog-name (if (or anything-current-prefix-arg (not def-prog))
;; Prefix arg or no default program.
(prog1
(anything-comp-read
"Program: " collection
:must-match t
:name "Open file Externally"
:history anything-external-command-history)
;; Always prompt to set this program as default.
(setq def-prog nil))
;; No prefix arg or default program exists.
(replace-regexp-in-string " %s\\| '%s'" "" def-prog)))
(program (concat real-prog-name " %s")))
(unless (or def-prog ; Association exists, no need to record it.
;; Don't try to record non--filenames associations (e.g urls).
(not (file-exists-p fname)))
(when
(y-or-n-p
(format
"Do you want to make `%s' the default program for this kind of files? "
real-prog-name))
(anything-aif (assoc (file-name-extension fname)
anything-c-external-programs-associations)
(setq anything-c-external-programs-associations
(delete it anything-c-external-programs-associations)))
(push (cons (file-name-extension fname)
(read-string
"Program (Add args maybe and confirm): " real-prog-name))
anything-c-external-programs-associations)
(customize-save-variable 'anything-c-external-programs-associations
anything-c-external-programs-associations)))
(anything-run-or-raise program file)
(setq anything-external-command-history
(cons real-prog-name
(delete real-prog-name
(loop for i in anything-external-command-history
when (executable-find i) collect i))))))
(defun anything-c-find-file-or-marked (candidate)
"Open file CANDIDATE or open anything marked files in background."
(let ((marked (anything-marked-candidates))
(ffap-newfile-prompt anything-ff-newfile-prompt-p)
(find-file-wildcards nil))
(if (> (length marked) 1)
;; Open all marked files in background and display
;; the first one.
(progn (mapc 'find-file-noselect (cdr marked))
(find-file (car marked)))
(if (and (not (file-exists-p candidate))
(and ffap-url-regexp
(not (string-match ffap-url-regexp candidate)))
(string-match "/$" candidate))
;; A a non--existing filename ending with /
;; Create a directory and jump to it.
(when (y-or-n-p (format "Create directory `%s'? " candidate))
(let ((dirfname (directory-file-name candidate)))
(if (file-exists-p dirfname)
(error "Mkdir: Unable to create directory `%s': file exists."
(anything-c-basename dirfname))
(make-directory candidate 'parent)))
(anything-find-files-1 candidate))
;; A non--existing filename NOT ending with / or
;; an existing filename, create or jump to it.
(find-file-at-point (car marked))))))
(defun anything-delete-marked-files (ignore)
(let* ((files (anything-marked-candidates))
(len (length files)))
(if (not (y-or-n-p
(format "Delete *%s File(s):\n%s"
len
(mapconcat (lambda (f) (format "- %s\n" f)) files ""))))
(message "(No deletions performed)")
(dolist (i files)
(set-text-properties 0 (length i) nil i)
(anything-c-delete-file i anything-ff-signal-error-on-dot-files))
(message "%s File(s) deleted" len))))
(defun anything-ediff-marked-buffers (candidate &optional merge)
"Ediff 2 marked buffers or CANDIDATE and `anything-current-buffer'.
With optional arg MERGE call `ediff-merge-buffers'."
(let ((lg-lst (length (anything-marked-candidates)))
buf1 buf2)
(case lg-lst
(0
(error "Error:You have to mark at least 1 buffer"))
(1
(setq buf1 anything-current-buffer
buf2 (first (anything-marked-candidates))))
(2
(setq buf1 (first (anything-marked-candidates))
buf2 (second (anything-marked-candidates))))
(t
(error "Error:To much buffers marked!")))
(if merge
(ediff-merge-buffers buf1 buf2)
(ediff-buffers buf1 buf2))))
(defun anything-ediff-marked-buffers-merge (candidate)
"Ediff merge `anything-current-buffer' with CANDIDATE.
See `anything-ediff-marked-buffers'."
(anything-ediff-marked-buffers candidate t))
(defun anything-bookmark-get-bookmark-from-name (bmk)
"Return bookmark name even if it is a bookmark with annotation.
e.g prepended with *.
Return nil if bmk is not a valid bookmark."
(let ((bookmark (replace-regexp-in-string "\*" "" bmk)))
(if (assoc bookmark bookmark-alist)
bookmark
(when (assoc bmk bookmark-alist)
bmk))))
(defun anything-delete-marked-bookmarks (ignore)
"Delete this bookmark or all marked bookmarks."
(dolist (i (anything-marked-candidates))
(bookmark-delete (anything-bookmark-get-bookmark-from-name i)
'batch)))
(defun anything-require-or-error (feature function)
(or (require feature nil t)
(error "Need %s to use `%s'." feature function)))
(defun anything-find-buffer-on-elscreen (candidate)
"Open buffer in new screen, if marked buffers open all in elscreens."
(anything-require-or-error 'elscreen 'anything-find-buffer-on-elscreen)
(anything-aif (anything-marked-candidates)
(dolist (i it)
(let ((target-screen (elscreen-find-screen-by-buffer
(get-buffer i) 'create)))
(elscreen-goto target-screen)))
(let ((target-screen (elscreen-find-screen-by-buffer
(get-buffer candidate) 'create)))
(elscreen-goto target-screen))))
(defun anything-elscreen-find-file (file)
(anything-require-or-error 'elscreen 'anything-elscreen-find-file)
(elscreen-find-file file))
(defun anything-w32-prepare-filename (file)
"Convert filename FILE to something usable by external w32 executables."
(replace-regexp-in-string ; For UNC paths
"/" "\\"
(replace-regexp-in-string ; Strip cygdrive paths
"/cygdrive/\\(.\\)" "\\1:"
file nil nil) nil t))
;;;###autoload
(defun anything-w32-shell-execute-open-file (file)
(interactive "fOpen file:")
(with-no-warnings
(w32-shell-execute "open" (anything-w32-prepare-filename file))))
(defun anything-c-open-file-with-default-tool (file)
"Open FILE with the default tool on this platform."
(if (eq system-type 'windows-nt)
(anything-w32-shell-execute-open-file file)
(start-process "anything-c-open-file-with-default-tool"
nil
(cond ((eq system-type 'gnu/linux)
"xdg-open")
((or (eq system-type 'darwin) ;; Mac OS X
(eq system-type 'macos)) ;; Mac OS 9
"open"))
file)))
(defun anything-c-open-dired (file)
"Opens a dired buffer in FILE's directory. If FILE is a
directory, open this directory."
(if (file-directory-p file)
(dired file)
(dired (file-name-directory file))
(dired-goto-file file)))
(defun anything-c-display-to-real-line (candidate)
(if (string-match "^ *\\([0-9]+\\):\\(.*\\)$" candidate)
(list (string-to-number (match-string 1 candidate)) (match-string 2 candidate))
(error "Line number not found")))
(defun anything-c-action-line-goto (lineno-and-content)
(apply #'anything-goto-file-line (anything-interpret-value (anything-attr 'target-file))
(append lineno-and-content
(list (if (and (anything-attr-defined 'target-file)
(not anything-in-persistent-action))
'find-file-other-window
'find-file)))))
(defun* anything-c-action-file-line-goto (file-line-content &optional (find-file-function #'find-file))
(apply #'anything-goto-file-line
(if (stringp file-line-content)
;; Case: filtered-candidate-transformer is skipped
(cdr (anything-c-filtered-candidate-transformer-file-line-1 file-line-content))
file-line-content)))
(require 'compile)
(defun anything-c-filtered-candidate-transformer-file-line (candidates source)
(delq nil (mapcar 'anything-c-filtered-candidate-transformer-file-line-1 candidates)))
(defun anything-c-filtered-candidate-transformer-file-line-1 (candidate)
(when (string-match "^\\(.+?\\):\\([0-9]+\\):\\(.*\\)$" candidate)
(let ((filename (match-string 1 candidate))
(lineno (match-string 2 candidate))
(content (match-string 3 candidate)))
(cons (format "%s:%s\n %s"
(propertize filename 'face compilation-info-face)
(propertize lineno 'face compilation-line-face)
content)
(list (expand-file-name
filename
(or (anything-interpret-value (anything-attr 'default-directory))
(and (anything-candidate-buffer)
(buffer-local-value
'default-directory (anything-candidate-buffer)))))
(string-to-number lineno) content)))))
(defun* anything-goto-file-line (file lineno content &optional (find-file-function #'find-file))
(anything-aif (anything-attr 'before-jump-hook)
(funcall it))
(when file (funcall find-file-function file))
(if (anything-attr-defined 'adjust)
(anything-c-goto-line-with-adjustment lineno content)
(anything-goto-line lineno))
(unless (anything-attr-defined 'recenter)
(set-window-start (get-buffer-window anything-current-buffer) (point)))
(anything-aif (anything-attr 'after-jump-hook)
(funcall it))
(when anything-in-persistent-action
(anything-match-line-color-current-line)))
(defun anything-find-file-as-root (candidate)
(find-file (concat "/" anything-su-or-sudo "::" (expand-file-name candidate))))
(defun anything-find-many-files (ignore)
(mapc 'find-file (anything-marked-candidates)))
;; borrowed from etags.el
;; (anything-c-goto-line-with-adjustment (line-number-at-pos) ";; borrowed from etags.el")
(defun anything-c-goto-line-with-adjustment (line line-content)
(let ((startpos)
offset found pat)
;; This constant is 1/2 the initial search window.
;; There is no sense in making it too small,
;; since just going around the loop once probably
;; costs about as much as searching 2000 chars.
(setq offset 1000
found nil
pat (concat (if (eq selective-display t)
"\\(^\\|\^m\\) *" "^ *") ;allow indent
(regexp-quote line-content)))
;; If no char pos was given, try the given line number.
(setq startpos (progn (anything-goto-line line) (point)))
(or startpos (setq startpos (point-min)))
;; First see if the tag is right at the specified location.
(goto-char startpos)
(setq found (looking-at pat))
(while (and (not found)
(progn
(goto-char (- startpos offset))
(not (bobp))))
(setq found
(re-search-forward pat (+ startpos offset) t)
offset (* 3 offset))) ; expand search window
(or found
(re-search-forward pat nil t)
(error "not found")))
;; Position point at the right place
;; if the search string matched an extra Ctrl-m at the beginning.
(and (eq selective-display t)
(looking-at "\^m")
(forward-char 1))
(beginning-of-line))
(anything-document-attribute 'default-directory "type . file-line"
"`default-directory' to interpret file.")
(anything-document-attribute 'before-jump-hook "type . file-line / line"
"Function to call before jumping to the target location.")
(anything-document-attribute 'after-jump-hook "type . file-line / line"
"Function to call after jumping to the target location.")
(anything-document-attribute 'adjust "type . file-line"
"Search around line matching line contents.")
(anything-document-attribute 'recenter "type . file-line / line"
"`recenter' after jumping.")
(anything-document-attribute 'target-file "type . line"
"Goto line of target-file.")
;;;###autoload
(defun anything-c-call-interactively (cmd-or-name)
"Execute CMD-OR-NAME as Emacs command.
It is added to `extended-command-history'.
`anything-current-prefix-arg' is used as the command's prefix argument."
(setq extended-command-history
(cons (anything-c-stringify cmd-or-name)
(delete (anything-c-stringify cmd-or-name) extended-command-history)))
(let ((current-prefix-arg anything-current-prefix-arg)
(cmd (anything-c-symbolify cmd-or-name)))
(if (stringp (symbol-function cmd))
(execute-kbd-macro (symbol-function cmd))
(setq this-command cmd)
(call-interactively cmd))))
;;;###autoload
(defun anything-c-set-variable (var)
"Set value to VAR interactively."
(interactive)
(let ((sym (anything-c-symbolify var)))
(set sym (eval-minibuffer (format "Set %s: " var)
(prin1-to-string (symbol-value sym))))))
;; (setq hh 12)
;; (anything-c-set-variable 'hh)
;;; Persistent Action Helpers
;;
;;
(defvar anything-match-line-overlay-face nil)
(defvar anything-match-line-overlay nil)
(defun anything-match-line-color-current-line (&optional start end buf face rec)
"Highlight and underline current position"
(let ((args (list (or start (line-beginning-position))
(or end (1+ (line-end-position)))
buf)))
(if (not anything-match-line-overlay)
(setq anything-match-line-overlay (apply 'make-overlay args))
(apply 'move-overlay anything-match-line-overlay args)))
(overlay-put anything-match-line-overlay
'face (or face anything-match-line-overlay-face))
(when rec
(goto-char start)
(recenter)))
(defalias 'anything-persistent-highlight-point 'anything-match-line-color-current-line)
(setq anything-match-line-overlay-face 'anything-overlay-line-face)
(defun anything-match-line-cleanup ()
(when anything-match-line-overlay
(delete-overlay anything-match-line-overlay)
(setq anything-match-line-overlay nil)))
(defun anything-match-line-update ()
(when anything-match-line-overlay
(delete-overlay anything-match-line-overlay)
(anything-match-line-color-current-line)))
(add-hook 'anything-cleanup-hook 'anything-match-line-cleanup)
(add-hook 'anything-after-persistent-action-hook 'anything-match-line-update)
;;; Actions Transformers
;;
;;
;;; Files
(defun anything-c-transform-file-load-el (actions candidate)
"Add action to load the file CANDIDATE if it is an emacs lisp
file. Else return ACTIONS unmodified."
(if (member (file-name-extension candidate) '("el" "elc"))
(append actions '(("Load Emacs Lisp File" . load-file)))
actions))
(defun anything-c-transform-file-browse-url (actions candidate)
"Add an action to browse the file CANDIDATE if it in a html
file or URL. Else return ACTIONS unmodified."
(let ((browse-action '("Browse with Browser" . browse-url)))
(cond ((string-match "^http\\|^ftp" candidate)
(cons browse-action actions))
((string-match "\\.html?$" candidate)
(append actions (list browse-action)))
(t actions))))
;;; Function
(defun anything-c-transform-function-call-interactively (actions candidate)
"Add an action to call the function CANDIDATE interactively if
it is a command. Else return ACTIONS unmodified."
(if (commandp (intern-soft candidate))
(append actions '(("Call Interactively"
.
anything-c-call-interactively)))
actions))
;;;; S-Expressions
(defun anything-c-transform-sexp-eval-command-sexp (actions candidate)
"If CANDIDATE's `car' is a command, then add an action to
evaluate it and put it onto the `command-history'."
(if (commandp (car (read candidate)))
;; Make it first entry
(cons '("Eval and put onto command-history" .
(lambda (sexp)
(let ((sym (read sexp)))
(eval sym)
(setq command-history
(cons sym command-history)))))
actions)
actions))
;;; Candidate Transformers
;;
;;
;;; Buffers
(defun anything-c-skip-boring-buffers (buffers)
(anything-c-skip-entries buffers anything-c-boring-buffer-regexp))
(defun anything-c-skip-current-buffer (buffers)
"[DEPRECATED] Skip current buffer in buffer lists.
This transformer should not be used as this is now handled directly
in `anything-c-buffer-list' and `anything-c-highlight-buffers'."
(if anything-allow-skipping-current-buffer
(remove (buffer-name anything-current-buffer) buffers)
buffers))
(defun anything-c-shadow-boring-buffers (buffers)
"Buffers matching `anything-c-boring-buffer-regexp' will be
displayed with the `file-name-shadow' face if available."
(anything-c-shadow-entries buffers anything-c-boring-buffer-regexp))
(defvar anything-c-buffer-display-string-functions
'(anything-c-buffer-display-string--compilation
anything-c-buffer-display-string--shell
anything-c-buffer-display-string--eshell)
"Functions to setup display string for buffer.
Function has one argument, buffer name.
If it returns string, use it.
If it returns nil, display buffer name.
See `anything-c-buffer-display-string--compilation' for example.")
(defun anything-c-transform-buffer-display-string (buffers)
"Setup display string for buffer candidates
using `anything-c-buffer-display-string-functions'."
(loop for buf in buffers
if (consp buf)
collect buf
else
for disp = (progn (set-buffer buf)
(run-hook-with-args-until-success
'anything-c-buffer-display-string-functions buf))
collect (if disp (cons disp buf) buf)))
(defun anything-c-buffer-display-string--compilation (buf)
(anything-aif (car compilation-arguments)
(format "%s: %s [%s]" buf it default-directory)))
(defun anything-c-buffer-display-string--eshell (buf)
(declare (special eshell-history-ring))
(when (eq major-mode 'eshell-mode)
(format "%s: %s [%s]" buf
(ignore-errors (ring-ref eshell-history-ring 0))
default-directory)))
(defun anything-c-buffer-display-string--shell (buf)
(when (eq major-mode 'shell-mode)
(format "%s: %s [%s]" buf
(ignore-errors (ring-ref comint-input-ring 0))
default-directory)))
;;; Files
(defun anything-c-shadow-boring-files (files)
"Files matching `anything-c-boring-file-regexp' will be
displayed with the `file-name-shadow' face if available."
(anything-c-shadow-entries files anything-c-boring-file-regexp))
(defun anything-c-skip-boring-files (files)
"Files matching `anything-c-boring-file-regexp' will be skipped."
(anything-c-skip-entries files anything-c-boring-file-regexp))
;; (anything-c-skip-boring-files '("README" "/src/.svn/hoge"))
(defun anything-c-skip-current-file (files)
"Current file will be skipped."
(remove (buffer-file-name anything-current-buffer) files))
(defun anything-c-w32-pathname-transformer (args)
"Change undesirable features of windows pathnames to ones more acceptable to
other candidate transformers."
(if (eq system-type 'windows-nt)
(anything-transform-mapcar
(lambda (x)
(replace-regexp-in-string
"/cygdrive/\\(.\\)" "\\1:"
(replace-regexp-in-string "\\\\" "/" x)))
args)
args))
(defun anything-c-shorten-home-path (files)
"Replaces /home/user with ~."
(let ((home (replace-regexp-in-string "\\\\" "/" ; stupid Windows...
(getenv "HOME"))))
(anything-transform-mapcar
(lambda (file)
(if (and (stringp file) (string-match home file))
(cons (replace-match "~" nil nil file) file)
file))
files)))
;;; Functions
(defun anything-c-mark-interactive-functions (functions)
"Mark interactive functions (commands) with (i) after the function name."
(let (list)
(loop for function in functions
do (push (cons (concat function
(when (commandp (intern-soft function)) " (i)"))
function)
list)
finally (return (nreverse list)))))
;;; Adaptive Sorting of Candidates
;;
;;
;; Internal
(defvar anything-c-adaptive-done nil
"nil if history information is not yet stored for the current
selection.")
(defvar anything-c-adaptive-history nil
"Contains the stored history information.
Format: ((SOURCE-NAME (SELECTED-CANDIDATE (PATTERN . NUMBER-OF-USE) ...) ...) ...)")
;; Should run at beginning of `anything-initial-setup'.
(add-hook 'anything-before-initialize-hook #'(lambda ()
(when anything-c-use-adaptative-sorting
(setq anything-c-adaptive-done nil))))
;; Should run at beginning of `anything-exit-minibuffer'.
(add-hook 'anything-before-action-hook #'(lambda ()
(when anything-c-use-adaptative-sorting
(anything-c-adaptive-store-selection))))
;; Should run at beginning of `anything-select-action'.
(add-hook 'anything-select-action-hook #'(lambda ()
(when anything-c-use-adaptative-sorting
(anything-c-adaptive-store-selection))))
(defun anything-c-source-use-adaptative-p (&optional source-name)
"Return current source only if it use adaptative history, nil otherwise."
(when anything-c-use-adaptative-sorting
(let* ((source (or source-name (anything-get-current-source)))
(adapt-source (or (assoc-default 'filtered-candidate-transformer
(assoc (assoc-default 'type source)
anything-type-attributes))
(assoc-default 'candidate-transformer
(assoc (assoc-default 'type source)
anything-type-attributes))
(assoc-default 'filtered-candidate-transformer source)
(assoc-default 'candidate-transformer source))))
(if (listp adapt-source)
(when (member 'anything-c-adaptive-sort adapt-source) source)
(when (eq adapt-source 'anything-c-adaptive-sort) source)))))
(defun anything-c-adaptive-store-selection ()
"Store history information for the selected candidate."
(unless anything-c-adaptive-done
(setq anything-c-adaptive-done t)
(let ((source (anything-c-source-use-adaptative-p)))
(when source
(let* ((source-name (or (assoc-default 'type source)
(assoc-default 'name source)))
(source-info (or (assoc source-name anything-c-adaptive-history)
(progn
(push (list source-name) anything-c-adaptive-history)
(car anything-c-adaptive-history))))
(selection (anything-get-selection))
(selection-info (progn
(setcdr source-info
(cons
(let ((found (assoc selection (cdr source-info))))
(if (not found)
;; new entry
(list selection)
;; move entry to the beginning of the
;; list, so that it doesn't get
;; trimmed when the history is
;; truncated
(setcdr source-info
(delete found (cdr source-info)))
found))
(cdr source-info)))
(cadr source-info)))
(pattern-info (progn
(setcdr selection-info
(cons
(let ((found (assoc anything-pattern (cdr selection-info))))
(if (not found)
;; new entry
(cons anything-pattern 0)
;; move entry to the beginning of the
;; list, so if two patterns used the
;; same number of times then the one
;; used last appears first in the list
(setcdr selection-info
(delete found (cdr selection-info)))
found))
(cdr selection-info)))
(cadr selection-info))))
;; increase usage count
(setcdr pattern-info (1+ (cdr pattern-info)))
;; truncate history if needed
(if (> (length (cdr selection-info)) anything-c-adaptive-history-length)
(setcdr selection-info
(subseq (cdr selection-info) 0 anything-c-adaptive-history-length))))))))
(defun anything-c-adaptative-maybe-load-history ()
(when (and anything-c-use-adaptative-sorting
(file-readable-p anything-c-adaptive-history-file))
(load-file anything-c-adaptive-history-file)))
(add-hook 'emacs-startup-hook 'anything-c-adaptative-maybe-load-history)
(add-hook 'kill-emacs-hook 'anything-c-adaptive-save-history)
(defun anything-c-adaptive-save-history (&optional arg)
"Save history information to file given by `anything-c-adaptive-history-file'."
(interactive "p")
(when anything-c-use-adaptative-sorting
(with-temp-buffer
(insert
";; -*- mode: emacs-lisp -*-\n"
";; History entries used for anything adaptive display.\n")
(prin1 `(setq anything-c-adaptive-history ',anything-c-adaptive-history)
(current-buffer))
(insert ?\n)
(write-region (point-min) (point-max) anything-c-adaptive-history-file nil
(unless arg 'quiet)))))
(defun anything-c-adaptive-sort (candidates source)
"Sort the CANDIDATES for SOURCE by usage frequency.
This is a filtered candidate transformer you can use for the
attribute `filtered-candidate-transformer' of a source in
`anything-sources' or a type in `anything-type-attributes'."
(let* ((source-name (or (assoc-default 'type source)
(assoc-default 'name source)))
(source-info (assoc source-name anything-c-adaptive-history)))
(if source-info
(let ((usage
;; ... assemble a list containing the (CANIDATE . USAGE-COUNT)
;; pairs
(mapcar (lambda (candidate-info)
(let ((count 0))
(dolist (pattern-info (cdr candidate-info))
(if (not (equal (car pattern-info)
anything-pattern))
(incf count (cdr pattern-info))
;; if current pattern is equal to the previously
;; used one then this candidate has priority
;; (that's why its count is boosted by 10000) and
;; it only has to compete with other candidates
;; which were also selected with the same pattern
(setq count (+ 10000 (cdr pattern-info)))
(return)))
(cons (car candidate-info) count)))
(cdr source-info)))
sorted)
(if (and usage (consp usage))
;; sort the list in descending order, so candidates with highest
;; priorty come first
(progn
(setq usage (sort usage (lambda (first second)
(> (cdr first) (cdr second)))))
;; put those candidates first which have the highest usage count
(dolist (info usage)
(when (member* (car info) candidates
:test 'anything-c-adaptive-compare)
(push (car info) sorted)
(setq candidates (remove* (car info) candidates
:test 'anything-c-adaptive-compare))))
;; and append the rest
(append (reverse sorted) candidates nil))
(message "Your `%s' is maybe corrupted or too old, \
you should reinitialize it with `anything-c-reset-adaptative-history'"
anything-c-adaptive-history-file)
(sit-for 1)
candidates))
;; if there is no information stored for this source then do nothing
candidates)))
;;;###autoload
(defun anything-c-reset-adaptative-history ()
"Delete all `anything-c-adaptive-history' and his file.
Useful when you have a old or corrupted `anything-c-adaptive-history-file'."
(interactive)
(when (y-or-n-p "Really delete all your `anything-c-adaptive-history'? ")
(setq anything-c-adaptive-history nil)
(delete-file anything-c-adaptive-history-file)))
(defun anything-c-adaptive-compare (x y)
"Compare candidates X and Y taking into account that the
candidate can be in (DISPLAY . REAL) format."
(equal (if (listp x)
(cdr x)
x)
(if (listp y)
(cdr y)
y)))
;;; Outliner
;;
;;
(defvar anything-outline-goto-near-line-flag t)
(defvar anything-outline-using nil)
(defun anything-after-update-hook--outline ()
(if (and (eq anything-outline-using t)
(eq anything-outline-goto-near-line-flag t))
(anything-outline-goto-near-line)))
(add-hook 'anything-after-update-hook 'anything-after-update-hook--outline)
(defun anything-outline-goto-near-line ()
(with-anything-window
;; TODO need consideration whether to update position by every input.
(when t ; (equal anything-pattern "")
(anything-goto-line 2)
(let ((lineno (with-anything-current-buffer
(line-number-at-pos (car anything-current-position)))))
(block exit
(while (<= (progn (skip-chars-forward " ")
(or (number-at-point) lineno))
lineno)
(forward-line 1)
(when (eobp)
(forward-line -1)
(return-from exit))))
(forward-line -1)
(and (bobp) (forward-line 1))
(and (anything-pos-header-line-p) (forward-line -2))
(anything-mark-current-line)))))
;;; Plug-in
;;
;;
;; Plug-in: info-index
(defun* anything-c-info-init (&optional (file (anything-attr 'info-file)))
(let (result)
(unless (anything-candidate-buffer)
(save-window-excursion
(info file)
(let (Info-history
(tobuf (anything-candidate-buffer 'global))
(infobuf (current-buffer))
s e)
(dolist (node (or (anything-attr 'index-nodes) (Info-index-nodes)))
(Info-goto-node node)
(goto-char (point-min))
(while (search-forward "\n* " nil t)
(unless (search-forward "Menu:\n" (1+ (point-at-eol)) t)
'(save-current-buffer (buffer-substring-no-properties (point-at-bol) (point-at-eol)) result)
(setq s (point-at-bol)
e (point-at-eol))
(with-current-buffer tobuf
(insert-buffer-substring infobuf s e)
(insert "\n"))))))))))
(defun anything-c-info-goto (node-line)
(Info-goto-node (car node-line))
(anything-goto-line (cdr node-line)))
(defun anything-c-info-display-to-real (line)
(and (string-match
;; This regexp is stolen from Info-apropos-matches
"\\* +\\([^\n]*.+[^\n]*\\):[ \t]+\\([^\n]*\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?" line)
(cons (format "(%s)%s" (anything-attr 'info-file) (match-string 2 line))
(string-to-number (or (match-string 3 line) "1")))))
(defun anything-c-make-info-source (source file)
`(,@source
(name . ,(concat "Info Index: " file))
(info-file . ,file)
(init . anything-c-info-init)
(display-to-real . anything-c-info-display-to-real)
(get-line . buffer-substring)
(candidates-in-buffer)
(action ("Goto node" . anything-c-info-goto))))
(defun anything-compile-source--info-index (source)
(anything-aif (anything-interpret-value (assoc-default 'info-index source))
(anything-c-make-info-source source it)
source))
(add-to-list 'anything-compile-source-functions 'anything-compile-source--info-index)
(anything-document-attribute 'info-index "info-index plugin"
"Create a source of info index very easily.
ex. (defvar anything-c-source-info-wget '((info-index . \"wget\"))")
(anything-document-attribute 'index-nodes "info-index plugin (optional)"
"Index nodes of info file.
If it is omitted, `Info-index-nodes' is used to collect index nodes.
Some info files are missing index specification.
ex. See `anything-c-source-info-screen'.")
;; Plug-in: candidates-file
(defun anything-compile-source--candidates-file (source)
(if (assoc-default 'candidates-file source)
`((init anything-p-candidats-file-init
,@(let ((orig-init (assoc-default 'init source)))
(cond ((null orig-init) nil)
((functionp orig-init) (list orig-init))
(t orig-init))))
(candidates-in-buffer)
,@source)
source))
(add-to-list 'anything-compile-source-functions 'anything-compile-source--candidates-file)
(defun anything-p-candidats-file-init ()
(destructuring-bind (file &optional updating)
(anything-mklist (anything-attr 'candidates-file))
(setq file (anything-interpret-value file))
(with-current-buffer (anything-candidate-buffer (find-file-noselect file))
(when updating
(buffer-disable-undo)
(font-lock-mode -1)
(auto-revert-mode 1)))))
(anything-document-attribute 'candidates-file "candidates-file plugin"
"Use a file as the candidates buffer.
1st argument is a filename, string or function name or variable name.
If optional 2nd argument is non-nil, the file opened with `auto-revert-mode'.")
;; Plug-in: headline
(defun anything-compile-source--anything-headline (source)
(if (assoc-default 'headline source)
(append '((init . anything-headline-init)
(get-line . buffer-substring)
(type . line))
source
'((candidates-in-buffer)
(persistent-help . "Show this line")))
source))
(add-to-list 'anything-compile-source-functions 'anything-compile-source--anything-headline)
(defun anything-headline-init ()
(when (and (anything-current-buffer-is-modified)
(with-anything-current-buffer
(eval (or (anything-attr 'condition) t))))
(anything-headline-make-candidate-buffer
(anything-interpret-value (anything-attr 'headline))
(anything-interpret-value (anything-attr 'subexp)))))
(anything-document-attribute 'headline "Headline plug-in"
"Regexp string for anything-headline to scan.")
(anything-document-attribute 'condition "Headline plug-in"
"A sexp representing the condition to use anything-headline.")
(anything-document-attribute 'subexp "Headline plug-in"
"Display (match-string-no-properties subexp).")
;; Le Wang: Note on how `anything-head-line-get-candidates' works with a list
;; of regexps.
;;
;; 1. Create list of ((title . start-of-match) . hiearchy)
;; 2. Sort this list by start-of-match.
;; 3. Go through sorted list and return titles that reflect full hiearchy.
;;
;; It's quite brilliantly written.
;;
(defun anything-headline-get-candidates (regexp subexp)
(with-anything-current-buffer
(save-excursion
(goto-char (point-min))
(if (functionp regexp) (setq regexp (funcall regexp)))
(let (hierarchy curhead)
(flet ((matched ()
(if (numberp subexp)
(cons (match-string-no-properties subexp) (match-beginning subexp))
(cons (buffer-substring (point-at-bol) (point-at-eol))
(point-at-bol))))
(hierarchies (headlines)
(1+ (loop for (_ . hierarchy) in headlines
maximize hierarchy)))
(vector-0-n (v n)
(loop for i from 0 to hierarchy
collecting (aref curhead i)))
(arrange (headlines)
(unless (null headlines) ; FIX headlines empty bug!
(loop with curhead = (make-vector (hierarchies headlines) "")
for ((str . pt) . hierarchy) in headlines
do (aset curhead hierarchy str)
collecting
(cons
(format "H%d:%s" (1+ hierarchy)
(mapconcat 'identity (vector-0-n curhead hierarchy) " / "))
pt)))))
(if (listp regexp)
(arrange
(sort
(loop for re in regexp
for hierarchy from 0
do (goto-char (point-min))
appending
(loop
while (re-search-forward re nil t)
collect (cons (matched) hierarchy)))
(lambda (a b) (> (cdar b) (cdar a)))))
(loop while (re-search-forward regexp nil t)
collect (matched))))))))
(defun anything-headline-make-candidate-buffer (regexp subexp)
(with-current-buffer (anything-candidate-buffer 'local)
(loop for (content . pos) in (anything-headline-get-candidates regexp subexp)
do (insert
(format "%5d:%s\n"
(with-anything-current-buffer
(line-number-at-pos pos))
content)))))
(defun anything-headline-goto-position (pos recenter)
(goto-char pos)
(unless recenter
(set-window-start (get-buffer-window anything-current-buffer) (point))))
;; Plug-in: persistent-help
(defun anything-compile-source--persistent-help (source)
(append source '((header-line . anything-persistent-help-string))))
(add-to-list 'anything-compile-source-functions 'anything-compile-source--persistent-help)
(defun anything-persistent-help-string ()
(substitute-command-keys
(concat "\\<anything-map>\\[anything-execute-persistent-action]: "
(or (anything-interpret-value (anything-attr 'persistent-help))
(anything-aif (or (assoc-default 'persistent-action
(anything-get-current-source))
(assoc-default 'action
(anything-get-current-source)))
(cond ((symbolp it) (symbol-name it))
((listp it) (or (ignore-errors (caar it)) ""))))
"")
" (keeping session)")))
(anything-document-attribute 'persistent-help "persistent-help plug-in"
"A string to explain persistent-action of this source.
It also accepts a function or a variable name.")
;;; (anything '(((name . "persistent-help test")(candidates "a")(persistent-help . "TEST"))))
;; Plug-in: Type customize
(defun anything-c-uniq-list (lst)
"Like `remove-duplicates' in CL.
But cut deeper duplicates and test by `equal'. "
(reverse (remove-duplicates (reverse lst) :test 'equal)))
(defvar anything-additional-type-attributes nil)
(defun anything-c-arrange-type-attribute (type spec)
"Override type attributes by `define-anything-type-attribute'.
The SPEC is like source. The symbol `REST' is replaced
with original attribute value.
Example: Set `play-sound-file' as default action
(anything-c-arrange-type-attribute 'file
'((action (\"Play sound\" . play-sound-file)
REST ;; Rest of actions (find-file, find-file-other-window, etc...)."
(add-to-list 'anything-additional-type-attributes
(cons type
(loop with typeattr = (assoc-default
type anything-type-attributes)
for (attr . value) in spec
if (listp value)
collect (cons attr
(anything-c-uniq-list
(loop for v in value
if (eq v 'REST)
append
(assoc-default attr typeattr)
else
collect v)))
else
collect (cons attr value)))))
(put 'anything-c-arrange-type-attribute 'lisp-indent-function 1)
(defun anything-compile-source--type-customize (source)
(anything-aif (assoc-default (assoc-default 'type source)
anything-additional-type-attributes)
(append it source)
source))
(add-to-list 'anything-compile-source-functions
'anything-compile-source--type-customize t)
;; Plug-in: default-action
(defun anything-compile-source--default-action (source)
(anything-aif (assoc-default 'default-action source)
(append `((action ,it ,@(remove it (assoc-default 'action source))))
source)
source))
(add-to-list 'anything-compile-source-functions
'anything-compile-source--default-action t)
(anything-document-attribute 'default-action "default-action plug-in"
"Default action.")
;;; Type Attributes
;;
;;
(define-anything-type-attribute 'buffer
`((action
("Switch to buffer" . anything-c-switch-to-buffer)
,(and (locate-library "popwin") '("Switch to buffer in popup window" . popwin:popup-buffer))
("Switch to buffer other window" . switch-to-buffer-other-window)
("Switch to buffer other frame" . switch-to-buffer-other-frame)
,(and (locate-library "elscreen") '("Display buffer in Elscreen" . anything-find-buffer-on-elscreen))
("Query replace regexp" . anything-c-buffer-query-replace-regexp)
("Query replace" . anything-c-buffer-query-replace)
("View buffer" . view-buffer)
("Display buffer" . display-buffer)
("Grep buffers (C-u grep all buffers)" . anything-c-zgrep-buffers)
("Revert buffer(s)" . anything-revert-marked-buffers)
("Insert buffer" . insert-buffer)
("Kill buffer(s)" . anything-kill-marked-buffers)
("Diff with file" . diff-buffer-with-file)
("Ediff Marked buffers" . anything-ediff-marked-buffers)
("Ediff Merge marked buffers" . (lambda (candidate)
(anything-ediff-marked-buffers candidate t))))
(persistent-help . "Show this buffer")
(candidate-transformer anything-c-skip-boring-buffers
anything-c-transform-buffer-display-string))
"Buffer or buffer name.")
(define-anything-type-attribute 'file
`((action
("Find file" . anything-find-many-files)
,(and (locate-library "popwin") '("Find file in popup window" . popwin:find-file))
("Find file as root" . anything-find-file-as-root)
("Find file other window" . find-file-other-window)
("Find file other frame" . find-file-other-frame)
("Open dired in file's directory" . anything-c-open-dired)
("Grep File(s) `C-u recurse'" . anything-find-files-grep)
("Zgrep File(s) `C-u Recurse'" . anything-ff-zgrep)
("Pdfgrep File(s)" . anything-ff-pdfgrep)
("Checksum File" . anything-ff-checksum)
("Ediff File" . anything-find-files-ediff-files)
("Ediff Merge File" . anything-find-files-ediff-merge-files)
("View file" . view-file)
("Insert file" . insert-file)
("Delete file(s)" . anything-delete-marked-files)
("Open file externally (C-u to choose)" . anything-c-open-file-externally)
("Open file with default tool" . anything-c-open-file-with-default-tool)
("Find file in hex dump" . hexl-find-file))
(persistent-help . "Show this file")
(action-transformer anything-c-transform-file-load-el
anything-c-transform-file-browse-url)
(candidate-transformer anything-c-w32-pathname-transformer
anything-c-skip-current-file
anything-c-skip-boring-files
anything-c-shorten-home-path))
"File name.")
(let ((actions '(("Describe command" . describe-function)
("Add command to kill ring" . anything-c-kill-new)
("Go to command's definition" . find-function)
("Debug on entry" . debug-on-entry)
("Cancel debug on entry" . cancel-debug-on-entry)
("Trace function" . trace-function)
("Trace function (background)" . trace-function-background)
("Untrace function" . untrace-function))))
(define-anything-type-attribute 'command
`((action ("Call interactively" . anything-c-call-interactively)
,@actions)
(coerce . anything-c-symbolify)
(persistent-action . describe-function))
"Command. (string or symbol)")
(define-anything-type-attribute 'function
`((action . ,actions)
(action-transformer anything-c-transform-function-call-interactively)
(candidate-transformer anything-c-mark-interactive-functions)
(coerce . anything-c-symbolify))
"Function. (string or symbol)"))
(define-anything-type-attribute 'variable
'((action ("Describe variable" . describe-variable)
("Add variable to kill ring" . anything-c-kill-new)
("Go to variable's definition" . find-variable)
("Set variable" . anything-c-set-variable))
(coerce . anything-c-symbolify))
"Variable.")
(define-anything-type-attribute 'sexp
'((action ("Eval s-expression" . (lambda (c) (eval (read c))))
("Add s-expression to kill ring" . kill-new))
(action-transformer anything-c-transform-sexp-eval-command-sexp))
"String representing S-Expressions.")
(define-anything-type-attribute 'bookmark
`((coerce . anything-bookmark-get-bookmark-from-name)
(action
("Jump to bookmark" . anything-c-bookmark-jump)
("Jump to BM other window" . bookmark-jump-other-window)
("Bookmark edit annotation" . bookmark-edit-annotation)
("Bookmark show annotation" . bookmark-show-annotation)
("Delete bookmark(s)" . anything-delete-marked-bookmarks)
,@(and (locate-library "bookmark-extensions")
`(("Edit Bookmark" . bmkext-edit-bookmark)))
("Rename bookmark" . bookmark-rename)
("Relocate bookmark" . bookmark-relocate))
(keymap . ,anything-c-bookmark-map)
(mode-line . anything-bookmark-mode-line-string))
"Bookmark name.")
(define-anything-type-attribute 'line
'((display-to-real . anything-c-display-to-real-line)
(action ("Go to Line" . anything-c-action-line-goto)))
"LINENO:CONTENT string, eg. \" 16:foo\".
Optional `target-file' attribute is a name of target file.
Optional `before-jump-hook' attribute is a function with no
arguments which is called before jumping to position.
Optional `after-jump-hook' attribute is a function with no
arguments which is called after jumping to position.
If `adjust' attribute is specified, searches the line whose
content is CONTENT near the LINENO.
If `recenter' attribute is specified, the line is displayed at
the center of window, otherwise at the top of window.
")
(define-anything-type-attribute 'file-line
`((filtered-candidate-transformer anything-c-filtered-candidate-transformer-file-line)
(multiline)
(action ("Go to" . anything-c-action-file-line-goto)))
"FILENAME:LINENO:CONTENT string, eg. \"~/.emacs:16:;; comment\".
Optional `default-directory' attribute is a default-directory
FILENAME is interpreted.
Optional `before-jump-hook' attribute is a function with no
arguments which is called before jumping to position.
Optional `after-jump-hook' attribute is a function with no
arguments which is called after jumping to position.
If `adjust' attribute is specified, searches the line whose
content is CONTENT near the LINENO.
If `recenter' attribute is specified, the line is displayed at
the center of window, otherwise at the top of window.
")
(define-anything-type-attribute 'timer
'((real-to-display . anything-c-timer-real-to-display)
(action ("Cancel Timer" . cancel-timer)
("Describe Function" . (lambda (tm) (describe-function (timer--function tm))))
("Find Function" . (lambda (tm) (find-function (timer--function tm)))))
(persistent-action . (lambda (tm) (describe-function (timer--function tm))))
(persistent-help . "Describe Function"))
"Timer.")
;;; Default `anything-sources'
;; Setting `anything-sources' is DEPRECATED, but it seems that newbies
;; tend to invoke M-x anything directly. So I offer default setting.
(setq anything-sources
'(anything-c-source-buffers-list
anything-c-source-recentf
anything-c-source-files-in-current-dir+))
;;; Preconfigured Anything
;;
;;
;;;###autoload
(defun anything-mini ()
"Preconfigured `anything' lightweight version \(buffer -> recentf\)."
(interactive)
(anything-other-buffer '(anything-c-source-buffers-list
anything-c-source-recentf
anything-c-source-buffer-not-found)
"*anything mini*"))
;;;###autoload
(defun anything-for-files ()
"Preconfigured `anything' for opening files.
ffap -> recentf -> buffer -> bookmark -> file-cache -> files-in-current-dir -> locate."
(interactive)
(anything-other-buffer anything-for-files-prefered-list "*anything for files*"))
;;;###autoload
(defun anything-recentf ()
"Preconfigured `anything' for `recentf'."
(interactive)
(anything-other-buffer 'anything-c-source-recentf "*anything recentf*"))
;;;###autoload
(defun anything-info-at-point (arg)
"Preconfigured `anything' for searching info at point.
With a prefix-arg insert symbol at point."
(interactive "P")
(let ((anything-c-google-suggest-default-function
'anything-c-google-suggest-emacs-lisp))
(anything :sources '(anything-c-source-info-elisp
anything-c-source-info-cl
anything-c-source-info-pages
anything-c-source-google-suggest)
:input (and arg (thing-at-point 'symbol))
:buffer "*anything info*")))
;;;###autoload
(defun anything-show-kill-ring ()
"Preconfigured `anything' for `kill-ring'.
It is drop-in replacement of `yank-pop'.
You may bind this command to M-y.
First call open the kill-ring browser, next calls move to next line."
(interactive)
(anything :sources 'anything-c-source-kill-ring
:buffer "*anything kill-ring*"))
;;;###autoload
(defun anything-minibuffer-history ()
"Preconfigured `anything' for `minibuffer-history'."
(interactive)
(let ((enable-recursive-minibuffers t))
(anything-other-buffer 'anything-c-source-minibuffer-history
"*anything minibuffer-history*")))
;;;###autoload
(defun anything-gentoo ()
"Preconfigured `anything' for gentoo linux."
(interactive)
(anything-other-buffer '(anything-c-source-gentoo
anything-c-source-use-flags)
"*anything gentoo*"))
;;;###autoload
(defun anything-imenu ()
"Preconfigured `anything' for `imenu'."
(interactive)
(anything :sources 'anything-c-source-imenu
:buffer "*anything imenu*"))
;;;###autoload
(defun anything-google-suggest ()
"Preconfigured `anything' for google search with google suggest."
(interactive)
(anything-other-buffer 'anything-c-source-google-suggest "*anything google*"))
;;;###autoload
(defun anything-yahoo-suggest ()
"Preconfigured `anything' for Yahoo searching with Yahoo suggest."
(interactive)
(anything-other-buffer 'anything-c-source-yahoo-suggest "*anything yahoo*"))
;;; Converted from anything-show-*-only
;;;###autoload
(defun anything-for-buffers ()
"Preconfigured `anything' for buffers."
(interactive)
(anything-other-buffer 'anything-c-source-buffers "*anything for buffers*"))
;;;###autoload
(defun anything-buffers-list ()
"Preconfigured `anything' to list buffers.
It is an enhanced version of `anything-for-buffers'."
(interactive)
(anything :sources '(anything-c-source-buffers-list
anything-c-source-buffer-not-found)
:buffer "*anything buffers*" :keymap anything-c-buffer-map))
(defalias 'anything-buffers+ 'anything-buffers-list
"Preconfigured `anything' to list buffers.
It is an alias of `anything-buffers-list'.")
;;;###autoload
(defun anything-bbdb ()
"Preconfigured `anything' for BBDB.
Needs BBDB.
http://bbdb.sourceforge.net/"
(interactive)
(anything-other-buffer 'anything-c-source-bbdb "*anything bbdb*"))
;;;###autoload
(defun anything-locate (arg)
"Preconfigured `anything' for Locate.
Note: you can add locate options after entering pattern.
See 'man locate' for valid options.
You can specify a specific database with prefix argument ARG \(C-u\).
Many databases can be used: navigate and mark them.
See also `anything-locate-with-db'.
To create a user specific db, use
\"updatedb -l 0 -o db_path -U directory\".
Where db_path is a filename matched by
`anything-locate-db-file-regexp'."
(interactive "P")
(setq anything-ff-default-directory default-directory)
(anything-locate-1 arg))
;;;###autoload
(defun anything-w3m-bookmarks ()
"Preconfigured `anything' for w3m bookmark.
Needs w3m and emacs-w3m.
http://w3m.sourceforge.net/
http://emacs-w3m.namazu.org/"
(interactive)
(anything-other-buffer 'anything-c-source-w3m-bookmarks
"*anything w3m bookmarks*"))
;;;###autoload
(defun anything-firefox-bookmarks ()
"Preconfigured `anything' for firefox bookmark.
You will have to enable html bookmarks in firefox:
open about:config in firefox and double click on this line to enable value \
to true:
user_pref(\"browser.bookmarks.autoExportHTML\", false);
You should have now:
user_pref(\"browser.bookmarks.autoExportHTML\", true);
After closing firefox, you will be able to browse you bookmarks.
"
(interactive)
(anything-other-buffer 'anything-c-source-firefox-bookmarks
"*Anything Firefox*"))
;;;###autoload
(defun anything-colors ()
"Preconfigured `anything' for color."
(interactive)
(anything-other-buffer
'(anything-c-source-colors anything-c-source-customize-face)
"*anything colors*"))
;;;###autoload
(defun anything-bookmarks ()
"Preconfigured `anything' for bookmarks."
(interactive)
(anything-other-buffer 'anything-c-source-bookmarks "*anything bookmarks*"))
;;;###autoload
(defun anything-c-pp-bookmarks ()
"Preconfigured `anything' for bookmarks (pretty-printed)."
(interactive)
(anything-other-buffer '(anything-c-source-bookmarks-local
anything-c-source-bookmarks-su
anything-c-source-bookmarks-ssh)
"*anything pp bookmarks*"))
;;;###autoload
(defun anything-c-insert-latex-math ()
"Preconfigured anything for latex math symbols completion."
(interactive)
(anything-other-buffer 'anything-c-source-latex-math "*anything latex*"))
;;;###autoload
(defun anything-register ()
"Preconfigured `anything' for Emacs registers."
(interactive)
(anything-other-buffer 'anything-c-source-register "*anything register*"))
;;;###autoload
(defun anything-man-woman ()
"Preconfigured `anything' for Man and Woman pages."
(interactive)
(anything-other-buffer 'anything-c-source-man-pages "*Anything man woman*"))
;;;###autoload
(defun anything-org-keywords ()
"Preconfigured `anything' for org keywords."
(interactive)
(anything-other-buffer 'anything-c-source-org-keywords "*org keywords*"))
;;;###autoload
(defun anything-emms ()
"Preconfigured `anything' for emms sources."
(interactive)
(anything :sources '(anything-c-source-emms-streams
anything-c-source-emms-files
anything-c-source-emms-dired)
:buffer "*Anything Emms*"))
;;;###autoload
(defun anything-eev-anchors ()
"Preconfigured `anything' for eev anchors."
(interactive)
(anything-other-buffer 'anything-c-source-eev-anchor "*Anything eev anchors*"))
;;;###autoload
(defun anything-bm-list ()
"Preconfigured `anything' for visible bookmarks.
Needs bm.el
http://cvs.savannah.gnu.org/viewvc/*checkout*/bm/bm/bm.el"
(interactive)
(let ((anything-outline-using t))
(anything-other-buffer 'anything-c-source-bm "*anything bm list*")))
;;;###autoload
(defun anything-timers ()
"Preconfigured `anything' for timers."
(interactive)
(anything-other-buffer '(anything-c-source-absolute-time-timers
anything-c-source-idle-time-timers)
"*anything timers*"))
;;;###autoload
(defun anything-list-emacs-process ()
"Preconfigured `anything' for emacs process."
(interactive)
(anything-other-buffer 'anything-c-source-emacs-process "*anything process*"))
;;;###autoload
(defun anything-occur ()
"Preconfigured Anything for Occur source.
If region is active, search only in region,
otherwise search in whole buffer."
(interactive)
(let ((anything-compile-source-functions
;; rule out anything-match-plugin because the input is one regexp.
(delq 'anything-compile-source--match-plugin
(copy-sequence anything-compile-source-functions))))
(anything :sources 'anything-c-source-occur
:buffer "*Anything Occur*"
:history 'anything-c-grep-history)))
;;;###autoload
(defun anything-browse-code ()
"Preconfigured anything to browse code."
(interactive)
(anything :sources 'anything-c-source-browse-code
:buffer "*anything browse code*"
:default (thing-at-point 'symbol)))
;;;###autoload
(defun anything-org-headlines ()
"Preconfigured anything to show org headlines."
(interactive)
(anything-other-buffer 'anything-c-source-org-headline "*org headlines*"))
;;;###autoload
(defun anything-regexp ()
"Preconfigured anything to build regexps.
`query-replace-regexp' can be run from there against found regexp."
(interactive)
(save-restriction
(let ((anything-compile-source-functions
;; rule out anything-match-plugin because the input is one regexp.
(delq 'anything-compile-source--match-plugin
(copy-sequence anything-compile-source-functions))))
(when (and (anything-region-active-p)
;; Don't narrow to region if buffer is already narrowed.
(not (anything-current-buffer-narrowed-p)))
(narrow-to-region (region-beginning) (region-end)))
(anything :sources anything-c-source-regexp
:buffer "*anything regexp*"
:prompt "Regexp: "
:history 'anything-build-regexp-history))))
;;;###autoload
(defun anything-c-copy-files-async ()
"Preconfigured anything to copy file list FLIST to DEST asynchronously."
(interactive)
(let* ((flist (anything-c-read-file-name
"Copy File async: "
:marked-candidates t))
(dest (anything-c-read-file-name
"Copy File async To: "
:preselect (car flist)
:initial-input (car anything-ff-history)
:history (anything-find-files-history :comp-read nil))))
(anything-c-copy-async-with-log flist dest)))
;;;###autoload
(defun anything-find-files (arg)
"Preconfigured `anything' for anything implementation of `find-file'.
Called with a prefix arg show history if some.
Don't call it from programs, use `anything-find-files-1' instead.
This is the starting point for nearly all actions you can do on files."
(interactive "P")
(let ((any-input (if (and arg anything-ff-history)
(anything-find-files-history)
(anything-find-files-initial-input)))
(presel (buffer-file-name (current-buffer))))
(when (and (eq major-mode 'org-agenda-mode)
org-directory
(not any-input))
(setq any-input (expand-file-name org-directory)))
(set-text-properties 0 (length any-input) nil any-input)
(if any-input
(anything-find-files-1 any-input)
(setq any-input (expand-file-name (anything-c-current-directory)))
(anything-find-files-1
any-input (if anything-ff-transformer-show-only-basename
(and presel (anything-c-basename presel))
presel)))))
;;;###autoload
(defun anything-write-file ()
"Preconfigured `anything' providing completion for `write-file'."
(interactive)
(let ((anything-mp-highlight-delay nil))
(anything :sources 'anything-c-source-write-file
:input (expand-file-name default-directory)
:prompt "Write buffer to file: "
:buffer "*Anything write file*")))
;;;###autoload
(defun anything-insert-file ()
"Preconfigured `anything' providing completion for `insert-file'."
(interactive)
(let ((anything-mp-highlight-delay nil))
(anything :sources 'anything-c-source-insert-file
:input (expand-file-name default-directory)
:prompt "Insert file: "
:buffer "*Anything insert file*")))
;;;###autoload
(defun anything-dired-rename-file ()
"Preconfigured `anything' to rename files from dired."
(interactive)
(anything-dired-do-action-on-file :action 'rename))
;;;###autoload
(defun anything-dired-copy-file ()
"Preconfigured `anything' to copy files from dired."
(interactive)
(anything-dired-do-action-on-file :action 'copy))
;;;###autoload
(defun anything-dired-symlink-file ()
"Preconfigured `anything' to symlink files from dired."
(interactive)
(anything-dired-do-action-on-file :action 'symlink))
;;;###autoload
(defun anything-dired-hardlink-file ()
"Preconfigured `anything' to hardlink files from dired."
(interactive)
(anything-dired-do-action-on-file :action 'hardlink))
;;;###autoload
(defun anything-do-grep ()
"Preconfigured anything for grep.
Contrarily to Emacs `grep' no default directory is given, but
the full path of candidates in ONLY.
That allow to grep different files not only in `default-directory' but anywhere
by marking them (C-<SPACE>). If one or more directory is selected
grep will search in all files of these directories.
You can use also wildcard in the base name of candidate.
If a prefix arg is given use the -r option of grep.
The prefix arg can be passed before or after start.
See also `anything-do-grep-1'."
(interactive)
(let ((only (anything-c-read-file-name
"Search in file(s): "
:marked-candidates t
:preselect (or (dired-get-filename nil t)
(buffer-file-name (current-buffer)))))
(prefarg (or current-prefix-arg anything-current-prefix-arg)))
(anything-do-grep-1 only prefarg)))
;;;###autoload
(defun anything-do-zgrep ()
"Preconfigured anything for zgrep."
(interactive)
(let ((prefarg (or current-prefix-arg anything-current-prefix-arg))
(ls (anything-c-read-file-name
"Search in file(s): "
:marked-candidates t
:preselect (or (dired-get-filename nil t)
(buffer-file-name (current-buffer))))))
(anything-ff-zgrep-1 ls prefarg)))
;;;###autoload
(defun anything-do-pdfgrep ()
"Preconfigured anything for pdfgrep."
(interactive)
(let ((only (anything-c-read-file-name
"Search in file(s): "
:marked-candidates t
:test #'(lambda (file)
(or (string= (file-name-extension file) "pdf")
(string= (file-name-extension file) "PDF")
(file-directory-p file)))
:preselect (or (dired-get-filename nil t)
(buffer-file-name (current-buffer)))))
(anything-c-grep-default-function 'anything-c-pdfgrep-init))
(anything-do-pdfgrep-1 only)))
;;;###autoload
(defun anything-c-etags-select (arg)
"Preconfigured anything for etags.
Called with one prefix arg use symbol at point as initial input.
Called with two prefix arg reinitialize cache.
If tag file have been modified reinitialize cache."
(interactive "P")
(let ((tag (anything-c-etags-get-tag-file))
(init (and (equal arg '(4)) (thing-at-point 'symbol)))
(anything-quit-if-no-candidate t)
(anything-execute-action-at-once-if-one t)
(anything-compile-source-functions
(if anything-c-etags-use-regexp-search
;; rule out anything-match-plugin because the input is one regexp.
(delq 'anything-compile-source--match-plugin
(copy-sequence anything-compile-source-functions))
anything-compile-source-functions)))
(when (or (equal arg '(16))
(and anything-c-etags-mtime-alist
(anything-c-etags-file-modified-p tag)))
(remhash tag anything-c-etags-cache))
(if (and tag (file-exists-p tag))
(anything :sources 'anything-c-source-etags-select
:keymap anything-c-etags-map
:input init
:buffer "*anything etags*")
(message "Error: No tag file found, please create one with etags shell command."))))
;;;###autoload
(defun anything-filelist ()
"Preconfigured `anything' to open files instantly.
See `anything-c-filelist-file-name' docstring for usage."
(interactive)
(anything-other-buffer 'anything-c-source-filelist "*anything file list*"))
;;;###autoload
(defun anything-filelist+ ()
"Preconfigured `anything' to open files/buffers/bookmarks instantly.
This is a replacement for `anything-for-files'.
See `anything-c-filelist-file-name' docstring for usage."
(interactive)
(anything-other-buffer
'(anything-c-source-ffap-line
anything-c-source-ffap-guesser
anything-c-source-buffers-list
anything-c-source-recentf
anything-c-source-bookmarks
anything-c-source-file-cache
anything-c-source-filelist)
"*anything file list*"))
;;;###autoload
(defun anything-M-x ()
"Preconfigured `anything' for Emacs commands.
It is `anything' replacement of regular `M-x' `execute-extended-command'."
(interactive)
(let* (in-help
help-cand
special-display-buffer-names
special-display-regexps
anything-persistent-action-use-special-display
(history (loop with hist
for i in extended-command-history
for com = (intern i)
when (fboundp com)
collect i into hist finally return hist)))
(flet ((pers-help (candidate)
(let ((hbuf (get-buffer (help-buffer))))
(if (and in-help (string= candidate help-cand))
(progn
;; When M-x is started from a help buffer,
;; Don't kill it as it is anything-current-buffer.
(unless (equal hbuf anything-current-buffer)
(kill-buffer hbuf))
(setq in-help nil))
;; Be sure anything-current-buffer
;; have not a dedicated window.
(set-window-dedicated-p
(get-buffer-window anything-current-buffer) nil)
(describe-function (intern candidate))
(message nil) ; Erase the new stupid message Type "q"[...]
(setq in-help t))
(setq help-cand candidate))))
(let* ((command (anything-comp-read
"M-x " obarray
:test 'commandp
:requires-pattern anything-M-x-requires-pattern
:name "Emacs Commands"
:buffer "*anything M-x*"
:persistent-action 'pers-help
:persistent-help "Describe this command"
:history history
:must-match t
:candidates-in-buffer t
:fc-transformer 'anything-M-x-transformer))
(sym-com (intern command)))
(unless current-prefix-arg
(setq current-prefix-arg anything-current-prefix-arg))
;; Avoid having `this-command' set to *exit-minibuffer.
(setq this-command sym-com)
(call-interactively sym-com)
(setq extended-command-history
(cons command (delete command history)))))))
;;;###autoload
(defun anything-manage-advice ()
"Preconfigured `anything' to disable/enable function advices."
(interactive)
(anything-other-buffer 'anything-c-source-advice "*anything advice*"))
;;;###autoload
(defun anything-bookmark-ext ()
"Preconfigured `anything' for bookmark-extensions sources.
Needs bookmark-ext.el:
<http://mercurial.intuxication.org/hg/emacs-bookmark-extension>.
Contain also `anything-c-source-google-suggest'."
(interactive)
(anything
:sources
'(anything-c-source-bookmark-files&dirs
anything-c-source-bookmark-w3m
anything-c-source-google-suggest
anything-c-source-bmkext-addressbook
anything-c-source-bookmark-gnus
anything-c-source-bookmark-info
anything-c-source-bookmark-man
anything-c-source-bookmark-images
anything-c-source-bookmark-su-files&dirs
anything-c-source-bookmark-ssh-files&dirs)
:prompt "SearchBookmark: "
:buffer "*anything bmkext*"))
;;;###autoload
(defun anything-simple-call-tree ()
"Preconfigured `anything' for simple-call-tree. List function relationships.
Needs simple-call-tree.el.
http://www.emacswiki.org/cgi-bin/wiki/download/simple-call-tree.el"
(interactive)
(anything-other-buffer
'(anything-c-source-simple-call-tree-functions-callers
anything-c-source-simple-call-tree-callers-functions)
"*anything simple-call-tree*"))
;;;###autoload
(defun anything-mark-ring ()
"Preconfigured `anything' for `anything-c-source-mark-ring'."
(interactive)
(anything :sources 'anything-c-source-mark-ring))
;;;###autoload
(defun anything-global-mark-ring ()
"Preconfigured `anything' for `anything-c-source-global-mark-ring'."
(interactive)
(anything :sources 'anything-c-source-global-mark-ring))
;;;###autoload
(defun anything-all-mark-rings ()
"Preconfigured `anything' for `anything-c-source-global-mark-ring' and \
`anything-c-source-mark-ring'."
(interactive)
(anything :sources '(anything-c-source-mark-ring
anything-c-source-global-mark-ring)))
;;;###autoload
(defun anything-yaoddmuse-emacswiki-edit-or-view ()
"Preconfigured `anything' to edit or view EmacsWiki page.
Needs yaoddmuse.el.
http://www.emacswiki.org/emacs/download/yaoddmuse.el"
(interactive)
(anything :sources 'anything-c-source-yaoddmuse-emacswiki-edit-or-view))
;;;###autoload
(defun anything-yaoddmuse-emacswiki-post-library ()
"Preconfigured `anything' to post library to EmacsWiki.
Needs yaoddmuse.el.
http://www.emacswiki.org/emacs/download/yaoddmuse.el"
(interactive)
(anything :sources 'anything-c-source-yaoddmuse-emacswiki-post-library))
;;;###autoload
(defun anything-eval-expression (arg)
"Preconfigured anything for `anything-c-source-evaluation-result'."
(interactive "P")
(anything :sources 'anything-c-source-evaluation-result
:input (when arg (thing-at-point 'sexp))
:buffer "*anything eval*"
:history 'anything-eval-expression-input-history
:keymap anything-eval-expression-map))
;;;###autoload
(defun anything-eval-expression-with-eldoc ()
"Preconfigured anything for `anything-c-source-evaluation-result' with `eldoc' support. "
(interactive)
(declare (special eldoc-idle-delay))
(let ((timer (run-with-idle-timer eldoc-idle-delay
'repeat 'anything-eldoc-show-in-eval))
(minibuffer-completing-symbol t) ; Enable lisp completion.
(completion-cycle-threshold t)) ; Always cycle, no pesty completion buffer (emacs24 only).
(unwind-protect
(minibuffer-with-setup-hook
'anything-eldoc-store-minibuffer
(call-interactively 'anything-eval-expression))
(and timer (cancel-timer timer))
(setq anything-eldoc-active-minibuffers-list
(cdr anything-eldoc-active-minibuffers-list)))))
;;;###autoload
(defun anything-calcul-expression ()
"Preconfigured anything for `anything-c-source-calculation-result'."
(interactive)
(anything-other-buffer 'anything-c-source-calculation-result "*anything calcul*"))
;;;###autoload
(defun anything-surfraw (pattern engine)
"Preconfigured `anything' to search PATTERN with search ENGINE."
(interactive (list (read-string "SearchFor: "
nil 'anything-surfraw-input-history)
(anything-comp-read
"Engine: "
(anything-c-build-elvi-list)
:must-match t
:name "Surfraw Search Engines"
:history anything-surfraw-engines-history)))
(let* ((engine-nodesc (car (split-string engine)))
(url (with-temp-buffer
(apply 'call-process "surfraw" nil t nil
;;JAVE
(append (list engine-nodesc "-p") (split-string pattern)))
(replace-regexp-in-string
"\n" "" (buffer-string))))
(browse-url-browser-function (or anything-surfraw-default-browser-function
browse-url-browser-function)))
(if (string= engine-nodesc "W")
(anything-c-browse-url anything-c-home-url)
(anything-c-browse-url url)
(setq anything-surfraw-engines-history
(cons engine (delete engine anything-surfraw-engines-history))))))
;;;###autoload
(defun anything-call-source ()
"Preconfigured `anything' to call anything source."
(interactive)
(anything :sources 'anything-c-source-call-source
:buffer anything-source-select-buffer))
;;;###autoload
(defun anything-execute-anything-command ()
"Preconfigured `anything' to execute preconfigured `anything'."
(interactive)
(anything-other-buffer 'anything-c-source-anything-commands
"*anything commands*"))
;;;###autoload
(defun anything-create (&optional string initial-input)
"Preconfigured `anything' to do many create actions from STRING.
See also `anything-create--actions'."
(interactive)
(setq string (or string (read-string "Create Anything: " initial-input)))
(anything :sources '(((name . "Anything Create")
(header-name . (lambda (_) (format "Action for \"%s\"" string)))
(candidates . anything-create--actions)
(candidate-number-limit)
(action . (lambda (func) (funcall func string)))))))
;;;###autoload
(defun anything-top ()
"Preconfigured `anything' for top command."
(interactive)
(let ((anything-samewindow t)
(anything-enable-shortcuts)
(anything-display-function 'anything-default-display-buffer)
(anything-candidate-number-limit 9999))
(save-window-excursion
(delete-other-windows)
(anything-other-buffer 'anything-c-source-top "*anything top*"))))
;;;###autoload
(defun anything-select-xfont ()
"Preconfigured `anything' to select Xfont."
(interactive)
(anything-other-buffer 'anything-c-source-xfonts "*anything select* xfont"))
;;;###autoload
(defun anything-world-time ()
"Preconfigured `anything' to show world time."
(interactive)
(anything-other-buffer 'anything-c-source-time-world "*anything world time*"))
;;;###autoload
(defun anything-apt (arg)
"Preconfigured `anything' : frontend of APT package manager.
With a prefix arg reload cache."
(interactive "P")
(let ((query (read-string "Search Package: " nil 'anything-c-apt-input-history)))
(when arg (anything-c-apt-refresh))
(anything :sources 'anything-c-source-apt
:prompt "Search Package: "
:input query
:history 'anything-c-apt-input-history)))
;;;###autoload
(defun anything-esh-pcomplete ()
"Preconfigured anything to provide anything completion in eshell."
(interactive)
(let* ((anything-quit-if-no-candidate t)
(anything-execute-action-at-once-if-one t)
(target (thing-at-point 'symbol))
(end (point))
(beg (or (and target (- end (length target)))
;; Nothing at point.
(progn (insert " ") (point)))))
(setq anything-ec-target (or target " "))
(with-anything-show-completion beg end
(anything :sources 'anything-c-source-esh
:buffer "*anything pcomplete*"
:input (anything-ff-set-pattern ; Handle tramp filenames.
(car (last (ignore-errors ; Needed in lisp symbols completion.
(pcomplete-parse-arguments)))))))))
;;;###autoload
(defun anything-eshell-history ()
"Preconfigured anything for eshell history."
(interactive)
(let* ((end (point))
(beg (save-excursion (eshell-bol) (point)))
(input (buffer-substring beg end))
flag-empty)
(when (eq beg end)
(insert " ")
(setq flag-empty t)
(setq end (point)))
(unwind-protect
(with-anything-show-completion beg end
(anything :sources 'anything-c-source-eshell-history
:buffer "*Eshell history*"
:input input))
(when (and flag-empty
(looking-back " "))
(delete-char -1)))))
;;;###autoload
(defun anything-c-run-external-command (program)
"Preconfigured `anything' to run External PROGRAM asyncronously from Emacs.
If program is already running exit with error.
You can set your own list of commands with
`anything-c-external-commands-list'."
(interactive (list
(anything-comp-read
"RunProgram: "
(anything-c-external-commands-list-1 'sort)
:must-match t
:name "External Commands"
:history anything-external-command-history)))
(anything-run-or-raise program)
(setq anything-external-command-history
(cons program (delete program
(loop for i in anything-external-command-history
when (executable-find i) collect i)))))
;;;###autoload
(defun anything-ratpoison-commands ()
"Preconfigured `anything' to execute ratpoison commands."
(interactive)
(anything-other-buffer 'anything-c-source-ratpoison-commands
"*anything ratpoison commands*"))
;;;###autoload
(defun anything-ucs ()
"Preconfigured anything for `ucs-names' math symbols."
(interactive)
(anything :sources 'anything-c-source-ucs
:keymap anything-c-ucs-map))
;;;###autoload
(defun anything-c-apropos ()
"Preconfigured anything to describe commands, functions, variables and faces."
(interactive)
(let ((default (thing-at-point 'symbol)))
(anything :sources
`(((name . "Commands")
(init . (lambda ()
(anything-c-apropos-init 'commandp ,default)))
(persistent-action . anything-lisp-completion-persistent-action)
(persistent-help . "Show brief doc in mode-line")
(candidates-in-buffer)
(action . (lambda (candidate)
(describe-function (intern candidate)))))
((name . "Functions")
(init . (lambda ()
(anything-c-apropos-init #'(lambda (x) (and (fboundp x)
(not (commandp x))))
,default)))
(persistent-action . anything-lisp-completion-persistent-action)
(persistent-help . "Show brief doc in mode-line")
(candidates-in-buffer)
(action . (lambda (candidate)
(describe-function (intern candidate)))))
((name . "Variables")
(init . (lambda ()
(anything-c-apropos-init 'boundp ,default)))
(persistent-action . anything-lisp-completion-persistent-action)
(persistent-help . "Show brief doc in mode-line")
(candidates-in-buffer)
(action . (lambda (candidate)
(describe-variable (intern candidate)))))
((name . "Faces")
(init . (lambda ()
(anything-c-apropos-init 'facep ,default)))
(persistent-action . anything-lisp-completion-persistent-action)
(persistent-help . "Show brief doc in mode-line")
(candidates-in-buffer)
(filtered-candidate-transformer . (lambda (candidates source)
(loop for c in candidates
collect (propertize c 'face (intern c)))))
(action . (lambda (candidate)
(describe-face (intern candidate)))))
((name . "Anything attributes")
(candidates . (lambda ()
(mapcar 'symbol-name anything-additional-attributes)))
(action . (lambda (candidate)
(with-output-to-temp-buffer "*Help*"
(princ (get (intern candidate) 'anything-attrdoc))))))))))
;;;###autoload
(defun anything-xrandr-set ()
(interactive)
(anything :sources 'anything-c-source-xrandr-change-resolution
:buffer "*anything xrandr*"))
;;; Unit tests are now in ../developer-tools/unit-test-anything-config.el.
(provide 'anything-config)
;; Local Variables:
;; coding: utf-8
;; End:
;;; anything-config.el ends here