;;; filesets.el --- handle group of files
-;; Copyright (C) 2002-2012 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2016 Free Software Foundation, Inc.
;; Author: Thomas Link <sanobast-emacs@yahoo.de>
-;; Maintainer: FSF
+;; Maintainer: emacs-devel@gnu.org
;; Keywords: filesets convenience
;; This file is part of GNU Emacs.
;; inclusion group (i.e. a base file including other files).
;; Usage:
-;; 1. Put (require 'filesets) and (filesets-init) in your .emacs file.
+;; 1. Put (require 'filesets) and (filesets-init) in your init file.
;; 2. Type ;; M-x filesets-edit or choose "Edit Filesets" from the menu.
;; 3. Save your customizations.
file -- before loading filesets.el.
So, when should you think about setting this value to t? If filesets.el
-is loaded before user customizations. Thus, if (require 'filesets)
+is loaded before user customizations. Thus, if (require \\='filesets)
precedes the `custom-set-variables' command or, for XEmacs, if init.el
is loaded before custom.el, set this variable to t.")
(defun filesets-filter-list (lst cond-fn)
"Remove all elements not conforming to COND-FN from list LST.
COND-FN takes one argument: the current element."
-; (remove* 'dummy lst :test (lambda (dummy elt)
+; (cl-remove 'dummy lst :test (lambda (dummy elt)
; (not (funcall cond-fn elt)))))
(let ((rv nil))
(dolist (elt lst rv)
(let ((fss-rv (funcall fss-pred fss-this)))
(when fss-rv
(throw 'exit fss-rv))))))
-;(fset 'filesets-some 'some) ;; or use the cl function
+;(fset 'filesets-some 'cl-some) ;; or use the cl function
(defun filesets-member (fsm-item fsm-lst &rest fsm-keys)
"Find the first occurrence of FSM-ITEM in FSM-LST.
(filesets-ormap (lambda (fsm-this)
(funcall fsm-test fsm-item fsm-this))
fsm-lst)))
-;(fset 'filesets-member 'member*) ;; or use the cl function
+;(fset 'filesets-member 'cl-member) ;; or use the cl function
(defun filesets-sublist (lst beg &optional end)
"Get the sublist of LST from BEG to END - 1."
(defun filesets-which-command-p (cmd)
"Call \"which CMD\" and return non-nil if the command was found."
- (when (string-match (format "\\(/[^/]+\\)?/%s" cmd)
- (filesets-which-command cmd))
+ (when (string-match-p (format "\\(/[^/]+\\)?/%s" cmd)
+ (filesets-which-command cmd))
cmd))
(defun filesets-message (level &rest args)
(sexp :tag "Other" :value nil)))
:group 'filesets)
-(defcustom filesets-cache-fill-content-hooks nil
- "Hooks to run when writing the contents of filesets' cache file.
+(define-obsolete-variable-alias 'filesets-cache-fill-content-hooks
+ 'filesets-cache-fill-content-hook "24.3")
+(defcustom filesets-cache-fill-content-hook nil
+ "Hook run when writing the contents of filesets' cache file.
The hook is called with the cache file as current buffer and the cursor
at the last position. I.e. each hook has to make sure that the cursor is
Possible uses: If you don't want to save `filesets-data' in your normal
configuration file, you can add a something like this
- \(lambda ()
- \(insert (format \"(setq-default filesets-data '%S)\"
+ (lambda ()
+ (insert (format \"(setq-default filesets-data \\='%S)\"
filesets-data))
- \(newline 2))
+ (newline 2))
to this hook.
to which level the directory structure should be scanned/listed,
i.e. how deep the menu should be. Try something like
- \(\"HOME -- only one level\"
- \(:tree \"~\" \"^[^.].*[^~]$\")
- \(:tree-max-level 1)
- \(:filter-dirs-flag t))
- \(\"HOME -- up to 3 levels\"
- \(:tree \"~\" \"^[^.].*[^~]$\")
- \(:tree-max-level 3)
- \(:filter-dirs-flag t))
+ (\"HOME -- only one level\"
+ (:tree \"~\" \"^[^.].*[^~]$\")
+ (:tree-max-level 1)
+ (:filter-dirs-flag t))
+ (\"HOME -- up to 3 levels\"
+ (:tree \"~\" \"^[^.].*[^~]$\")
+ (:tree-max-level 3)
+ (:filter-dirs-flag t))
and it should become clear what this option is about. In any case,
including directory trees to the menu can take a lot of memory."
In order to view pdf or rtf files in an Emacs buffer, you could use these:
- \(\"^.+\\\\.pdf\\\\'\" \"pdftotext\"
- \((:capture-output t)
- \(:args (\"%S - | fmt -w \" window-width))
- \(:ignore-on-read-text t)
- \(:constraintp (lambda ()
- \(and \(filesets-which-command-p \"pdftotext\")
- \(filesets-which-command-p \"fmt\"))))))
- \(\"^.+\\\\.rtf\\\\'\" \"rtf2htm\"
- \((:capture-output t)
- \(:args (\"%S 2> /dev/null | w3m -dump -T text/html\"))
- \(:ignore-on-read-text t)
- \(:constraintp (lambda ()
- \(and (filesets-which-command-p \"rtf2htm\")
- \(filesets-which-command-p \"w3m\"))))))"
+ (\"^.+\\\\.pdf\\\\\\='\" \"pdftotext\"
+ ((:capture-output t)
+ (:args (\"%S - | fmt -w \" window-width))
+ (:ignore-on-read-text t)
+ (:constraintp (lambda ()
+ (and (filesets-which-command-p \"pdftotext\")
+ (filesets-which-command-p \"fmt\"))))))
+ (\"^.+\\\\.rtf\\\\\\='\" \"rtf2htm\"
+ ((:capture-output t)
+ (:args (\"%S 2> /dev/null | w3m -dump -T text/html\"))
+ (:ignore-on-read-text t)
+ (:constraintp (lambda ()
+ (and (filesets-which-command-p \"rtf2htm\")
+ (filesets-which-command-p \"w3m\"))))))"
:set (function filesets-set-default)
:type '(repeat :tag "Viewer"
(list :tag "Definition"
(defcustom filesets-ingroup-patterns
'(("^.+\\.tex$" t
(((:name "Package")
- (:pattern "\\\\usepackage\\W*\\(\\[[^\]]*\\]\\W*\\)?{\\W*\\(.+\\)\\W*}")
+ (:pattern "\\\\usepackage\\W*\\(\\[[^]]*\\]\\W*\\)?{\\W*\\(.+\\)\\W*}")
(:match-number 2)
(:stub-flag t)
(:get-file-name (lambda (master file)
(:match-number 2)
(:get-file-name (lambda (master file)
(filesets-which-file master file load-path))))))
- ("^\\([A-ZÄÖÜ][a-zäöüß]+\\([A-ZÄÖÜ][a-zäöüß]+\\)+\\)$" t
- (((:pattern "\\<\\([A-ZÄÖÜ][a-zäöüß]+\\([A-ZÄÖÜ][a-zäöüß]+\\)+\\)\\>")
+ ("^\\([A-ZÄÖÜ][a-zäöüß]+\\([A-ZÄÖÜ][a-zäöüß]+\\)+\\)$" t
+ (((:pattern "\\<\\([A-ZÄÖÜ][a-zäöüß]+\\([A-ZÄÖÜ][a-zäöüß]+\\)+\\)\\>")
(:scan-depth 5)
(:stubp (lambda (a b) (not (filesets-files-in-same-directory-p a b))))
(:case-sensitive t)
Caveat: Fileset names have to be unique.
Example definition:
- '\(\(\"My Wiki\"
- \(:ingroup \"~/Etc/My-Wiki/WikiContents\"))
- \(\"My Homepage\"
- \(:pattern \"~/public_html/\" \"^.+\\\\.html$\")
- \(:open filesets-find-file))
- \(\"User Configuration\"
- \(:files \"~/.xinitrc\"
+ \\='((\"My Wiki\"
+ (:ingroup \"~/Etc/My-Wiki/WikiContents\"))
+ (\"My Homepage\"
+ (:pattern \"~/public_html/\" \"^.+\\\\.html$\")
+ (:open filesets-find-file))
+ (\"User Configuration\"
+ (:files \"~/.xinitrc\"
\"~/.bashrc\"
\"~/.bash_profile\"))
- \(\"HOME\"
- \(:tree \"~\" \"^[^.].*[^~]$\")
- \(:filter-dirs-flag t)))
+ (\"HOME\"
+ (:tree \"~\" \"^[^.].*[^~]$\")
+ (:filter-dirs-flag t)))
`filesets-data' is a list of (NAME-AS-STRING . DEFINITION), DEFINITION
being an association list with the fields:
:pattern DIR PATTERN ... a base directory and a regexp matching
files in that directory. Usually,
- PATTERN has the form '^REGEXP$'. Unlike
+ PATTERN has the form `^REGEXP$'. Unlike
:tree, this form does not descend
recursively into subdirectories.
(require 'easymenu)
- (defun filesets-error (class &rest args)
+ (defun filesets-error (_class &rest args)
"`error' wrapper."
(error "%s" (mapconcat 'identity args " ")))
If NEGATIVE is non-nil, remove all directory names."
(filesets-filter-list lst
(lambda (x)
- (and (not (string-match "^\\.+/$" x))
+ (and (not (string-match-p "^\\.+/$" x))
(if negative
- (not (string-match "[:/\\]$" x))
- (string-match "[:/\\]$" x))))))
+ (not (string-match-p "[:/\\]$" x))
+ (string-match-p "[:/\\]$" x))))))
(defun filesets-conditional-sort (lst &optional access-fn)
"Return a sorted copy of LST, LST being a list of strings.
(dirs nil))
(dolist (this (file-name-all-completions "" dir))
(cond
- ((string-match "^\\.+/$" this)
+ ((string-match-p "^\\.+/$" this)
nil)
- ((string-match "[:/\\]$" this)
+ ((string-match-p "[:/\\]$" this)
(when (or (not match-dirs-flag)
(not pattern)
- (string-match pattern this))
+ (string-match-p pattern this))
(filesets-message 5 "Filesets: matched dir %S with pattern %S"
this pattern)
(setq dirs (cons this dirs))))
(t
(when (or (not pattern)
- (string-match pattern this))
+ (string-match-p pattern this))
(filesets-message 5 "Filesets: matched file %S with pattern %S"
this pattern)
(setq files (cons (if full-flag
(let ((filename (file-name-nondirectory file)))
(filesets-some
(lambda (entry)
- (when (and (string-match (nth 0 entry) filename)
+ (when (and (string-match-p (nth 0 entry) filename)
(filesets-eviewer-constraint-p entry))
entry))
filesets-external-viewers)))
n name)))
(dolist (this files nil)
(filesets-file-open open-function this))
- (message "Filesets: cancelled")))
+ (message "Filesets: canceled")))
(filesets-error 'error "Filesets: Unknown fileset: " name))))
(defun filesets-close (&optional mode name lookup-name)
(current-buffer)))
(name (or name
(completing-read
- (format "Add '%s' to fileset: " buffer)
+ (format-message "Add `%s' to fileset: " buffer)
filesets-data nil)))
(entry (or (assoc name filesets-data)
(when (y-or-n-p
(progn
(add-to-list 'filesets-data (list name '(:files)))
(message
- "Fileset %s created. Call `M-x filesets-save-config' to save."
+ (substitute-command-keys
+ "Fileset %s created. Call `\\[filesets-save-config]' to save.")
name)
(car filesets-data))))))
(if entry
:test 'filesets-files-equalp)))
(cond
(inlist
- (message "Filesets: '%s' is already in '%s'" this name))
+ (message "Filesets: `%s' is already in `%s'" this name))
((and (equal (filesets-entry-mode entry) ':files)
this)
(filesets-entry-set-files entry (cons this files) t)
(filesets-set-config name 'filesets-data filesets-data))
(t
- (message "Filesets: Can't add '%s' to fileset '%s'" this name)))))))
+ (message "Filesets: Can't add `%s' to fileset `%s'" this name)))))))
(defun filesets-remove-buffer (&optional name buffer)
"Remove BUFFER (or current buffer) to fileset NAME.
(current-buffer)))
(name (or name
(completing-read
- (format "Remove '%s' from fileset: " buffer)
+ (format-message "Remove `%s' from fileset: " buffer)
filesets-data nil t)))
(entry (assoc name filesets-data)))
(if entry
(let ((new (list (cons ':files (delete (car inlist) files)))))
(setcdr entry new)
(filesets-set-config name 'filesets-data filesets-data))
- (message "Filesets: Can't remove '%s' from fileset '%s'"
+ (message "Filesets: Can't remove `%s' from fileset `%s'"
this
name))))))
(fn (or fun (lambda (a b)
(and (stringp a)
(stringp b)
- (string-match a b))))))
+ (string-match-p a b))))))
(filesets-some (lambda (x)
(if (funcall fn (car x) masterfile)
(nth pos x)
(when filesets-cache-hostname-flag
(insert (format "(setq filesets-cache-hostname %S)" (system-name)))
(newline 2))
- (run-hooks 'filesets-cache-fill-content-hooks)
+ (run-hooks 'filesets-cache-fill-content-hook)
(write-file filesets-menu-cache-file))
(setq filesets-has-changed-flag nil)
(setq filesets-update-cache-file-flag nil)))
(filesets-menu-cache-file-load))
(defun filesets-update-pre010505 ()
- (let ((msg
+ (let ((msg (format-message
"Filesets: manual editing of user data required!
Filesets has detected that you were using an older version before,
-which requires some manual updating. Type 'y' for editing the startup
+which requires some manual updating. Type `y' for editing the startup
file now.
The layout of `filesets-data' has changed. Please delete your cache file
1. `filesets-data': Edit all :pattern filesets in your startup file and
transform all entries as shown in this example:
- \(\"Test\" (:pattern \"~/dir/^pattern$\"))
- --> \(\"Test\" (:pattern \"~/dir/\" \"^pattern$\"))
+ (\"Test\" (:pattern \"~/dir/^pattern$\"))
+ --> (\"Test\" (:pattern \"~/dir/\" \"^pattern$\"))
2. `filesets-data': Change all occurrences of \":document\" to \":ingroup\":
- \(\(\"Test\" \(:document \"~/dir/file\"))
- --> \(\(\"Test\" \(:ingroup \"~/dir/file\"))
+ ((\"Test\" (:document \"~/dir/file\"))
+ --> ((\"Test\" (:ingroup \"~/dir/file\"))
3. `filesets-subdocument-patterns': If you already modified the variable
previously called `filesets-subdocument-patterns', change its name to
5. Type M-x filesets-update-cleanup and restart Emacs.
-We apologize for the inconvenience."))
+We apologize for the inconvenience.")))
(let* ((cf (or custom-file user-init-file)))
(switch-to-buffer-other-frame "*Filesets update*")
(insert msg)