From 3790c91768f5b4e5fa6192ab2067017efbc4311a Mon Sep 17 00:00:00 2001 From: KemoNine Date: Fri, 26 Aug 2022 12:46:14 -0400 Subject: [PATCH] remove notdeft --- .../diredfl-20220508.805/diredfl-autoloads.el | 69 + code/elpa/diredfl-20220508.805/diredfl-pkg.el | 2 + code/elpa/diredfl-20220508.805/diredfl.el | 382 +++ common/_global.el | 73 +- .../diredfl-20220508.805/diredfl-autoloads.el | 69 + org/elpa/diredfl-20220508.805/diredfl-pkg.el | 2 + org/elpa/diredfl-20220508.805/diredfl.el | 382 +++ org/init.el | 18 - org/notdeft/.gitignore | 14 - org/notdeft/Makefile | 30 - org/notdeft/README.org | 54 - org/notdeft/extras/notdeft-example.el | 112 - .../notdeft-screenshot-query-and-filter.png | Bin 51087 -> 0 bytes org/notdeft/notdeft-global.el | 52 - org/notdeft/notdeft-install.el | 68 - org/notdeft/notdeft-org.el | 227 -- org/notdeft/notdeft-org8.el | 36 - org/notdeft/notdeft-org9.el | 32 - org/notdeft/notdeft-path.el | 79 - org/notdeft/notdeft-xapian-make.el | 150 - org/notdeft/notdeft-xapian.el | 196 -- org/notdeft/notdeft.el | 2890 ----------------- org/notdeft/web/notdeft-homepage.org | 792 ----- org/notdeft/xapian/GPL-2 | 339 -- org/notdeft/xapian/Makefile | 16 - org/notdeft/xapian/notdeft-xapian.cc | 805 ----- 26 files changed, 910 insertions(+), 5979 deletions(-) create mode 100644 code/elpa/diredfl-20220508.805/diredfl-autoloads.el create mode 100644 code/elpa/diredfl-20220508.805/diredfl-pkg.el create mode 100644 code/elpa/diredfl-20220508.805/diredfl.el create mode 100644 org/elpa/diredfl-20220508.805/diredfl-autoloads.el create mode 100644 org/elpa/diredfl-20220508.805/diredfl-pkg.el create mode 100644 org/elpa/diredfl-20220508.805/diredfl.el delete mode 100644 org/notdeft/.gitignore delete mode 100644 org/notdeft/Makefile delete mode 100644 org/notdeft/README.org delete mode 100644 org/notdeft/extras/notdeft-example.el delete mode 100644 org/notdeft/images/notdeft-screenshot-query-and-filter.png delete mode 100644 org/notdeft/notdeft-global.el delete mode 100644 org/notdeft/notdeft-install.el delete mode 100644 org/notdeft/notdeft-org.el delete mode 100644 org/notdeft/notdeft-org8.el delete mode 100644 org/notdeft/notdeft-org9.el delete mode 100644 org/notdeft/notdeft-path.el delete mode 100644 org/notdeft/notdeft-xapian-make.el delete mode 100644 org/notdeft/notdeft-xapian.el delete mode 100644 org/notdeft/notdeft.el delete mode 100644 org/notdeft/web/notdeft-homepage.org delete mode 100644 org/notdeft/xapian/GPL-2 delete mode 100644 org/notdeft/xapian/Makefile delete mode 100644 org/notdeft/xapian/notdeft-xapian.cc diff --git a/code/elpa/diredfl-20220508.805/diredfl-autoloads.el b/code/elpa/diredfl-20220508.805/diredfl-autoloads.el new file mode 100644 index 0000000..bf75f23 --- /dev/null +++ b/code/elpa/diredfl-20220508.805/diredfl-autoloads.el @@ -0,0 +1,69 @@ +;;; diredfl-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "diredfl" "diredfl.el" (0 0 0 0)) +;;; Generated autoloads from diredfl.el + +(autoload 'diredfl-mode "diredfl" "\ +Enable additional font locking in `dired-mode'. + +This is a minor mode. If called interactively, toggle the +`Diredfl mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `diredfl-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +\(fn &optional ARG)" t nil) + +(put 'diredfl-global-mode 'globalized-minor-mode t) + +(defvar diredfl-global-mode nil "\ +Non-nil if Diredfl-Global mode is enabled. +See the `diredfl-global-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `diredfl-global-mode'.") + +(custom-autoload 'diredfl-global-mode "diredfl" nil) + +(autoload 'diredfl-global-mode "diredfl" "\ +Toggle Diredfl mode in all buffers. +With prefix ARG, enable Diredfl-Global mode if ARG is positive; +otherwise, disable it. + +If called from Lisp, toggle the mode if ARG is `toggle'. +Enable the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +Diredfl mode is enabled in all buffers where `(lambda nil (when +\(derived-mode-p 'dired-mode) (diredfl-mode)))' would do it. + +See `diredfl-mode' for more information on Diredfl mode. + +\(fn &optional ARG)" t nil) + +(register-definition-prefixes "diredfl" '("diredfl-")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; diredfl-autoloads.el ends here diff --git a/code/elpa/diredfl-20220508.805/diredfl-pkg.el b/code/elpa/diredfl-20220508.805/diredfl-pkg.el new file mode 100644 index 0000000..7f72686 --- /dev/null +++ b/code/elpa/diredfl-20220508.805/diredfl-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from diredfl.el -*- no-byte-compile: t -*- +(define-package "diredfl" "20220508.805" "Extra font lock rules for a more colourful dired" '((emacs "24")) :commit "62b559e1d6b69834a56a57eb1832ac6ad4d2e5d0" :authors '(("Steve Purcell" . "steve@sanityinc.com")) :maintainer '("Steve Purcell" . "steve@sanityinc.com") :keywords '("faces") :url "https://github.com/purcell/diredfl") diff --git a/code/elpa/diredfl-20220508.805/diredfl.el b/code/elpa/diredfl-20220508.805/diredfl.el new file mode 100644 index 0000000..3440657 --- /dev/null +++ b/code/elpa/diredfl-20220508.805/diredfl.el @@ -0,0 +1,382 @@ +;;; diredfl.el --- Extra font lock rules for a more colourful dired -*- lexical-binding: t; -*- + +;; Copyright (C) 2017 Steve Purcell + +;; Author: Steve Purcell +;; Author: Drew Adams +;; Keywords: faces +;; Package-Commit: 62b559e1d6b69834a56a57eb1832ac6ad4d2e5d0 +;; URL: https://github.com/purcell/diredfl +;; Package-Requires: ((emacs "24")) +;; Package-Version: 20220508.805 +;; Package-X-Original-Version: 0 + +;; 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 of the License, 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. If not, see . + +;;; Commentary: + +;; This is adapted from the extra font lock rules provided by Drew +;; Adams' `dired+' package, but published via a modern means, and with +;; support for older Emacsen removed. + +;; Enable in all Dired buffers by calling or customising `diredfl-global-mode'. + +;; Alternatively: + +;; (add-hook 'dired-mode-hook 'diredfl-mode) + +;;; Code: + +(require 'dired) + +(defgroup diredfl () + "Extra font lock rules for a more colourful Dired." + :group 'dired) + +(defcustom diredfl-compressed-extensions '(".tar" ".taz" ".tgz" ".arj" ".lzh" + ".lzma" ".xz" ".zip" ".z" ".Z" ".gz" ".bz2") + "*List of compressed-file extensions, for highlighting." + :type '(repeat string) :group 'diredfl) + +(defcustom diredfl-ignore-compressed-flag t + "*Non-nil means to font-lock names of compressed files as ignored files. +This applies to filenames whose extensions are in +`diredfl-compressed-extensions'. If nil they are highlighted using +face `diredfl-compressed-file-name'." + :type 'boolean :group 'diredfl) + +(defface diredfl-autofile-name + '((((background dark)) (:background "#111313F03181")) ; Very dark blue + (t (:background "#EEECEC0FCE7E"))) ; Very pale goldenrod + "*Face used in Dired for names of files that are autofile bookmarks." + :group 'diredfl) +(defvar diredfl-autofile-name 'diredfl-autofile-name) + +(defface diredfl-compressed-file-name + '((((background dark)) (:foreground "Blue")) + (t (:foreground "Brown"))) + "*Face used for compressed file names." + :group 'diredfl) +(defvar diredfl-compressed-file-name 'diredfl-compressed-file-name) + +(defface diredfl-compressed-file-suffix + '((((background dark)) (:foreground "Blue")) + (t (:foreground "Yellow"))) + "*Face used for compressed file suffixes in Dired buffers. +This means the `.' plus the file extension. Example: `.zip'." + :group 'diredfl) +(defvar diredfl-compressed-file-suffix 'diredfl-compressed-file-suffix) + +(defface diredfl-date-time + '((((background dark)) (:foreground "#74749A9AF7F7")) ; ~ med blue + (t (:foreground "DarkGoldenrod4"))) + "*Face used for date and time in Dired buffers." + :group 'diredfl) +(defvar diredfl-date-time 'diredfl-date-time) + +(defface diredfl-deletion + '((t (:foreground "Yellow" :background "Red"))) + "*Face used for deletion flags (D) in Dired buffers." + :group 'diredfl) +(defvar diredfl-deletion 'diredfl-deletion) + +(defface diredfl-deletion-file-name + '((t (:foreground "Red"))) + "*Face used for names of deleted files in Dired buffers." + :group 'diredfl) +(defvar diredfl-deletion-file-name 'diredfl-deletion-file-name) + +(defface diredfl-dir-heading + '((((background dark)) (:foreground "Yellow" :background "#00003F3F3434")) ; ~ dark green + (t (:foreground "Blue" :background "Pink"))) + "*Face used for directory headings in Dired buffers." + :group 'diredfl) +(defvar diredfl-dir-heading 'diredfl-dir-heading) + +(defface diredfl-dir-name + '((((background dark)) + (:foreground "#7474FFFFFFFF" :background "#2C2C2C2C2C2C")) ; ~ cyan, dark gray + (t (:foreground "DarkRed" :background "LightGray"))) + "*Face used for directory names." + :group 'diredfl) +(defvar diredfl-dir-name 'diredfl-dir-name) + +(defface diredfl-dir-priv + '((((background dark)) + (:foreground "#7474FFFFFFFF" :background "#2C2C2C2C2C2C")) ; ~ cyan, dark gray + (t (:foreground "DarkRed" :background "LightGray"))) + "*Face used for directory privilege indicator (d) in Dired buffers." + :group 'diredfl) +(defvar diredfl-dir-priv 'diredfl-dir-priv) + +(defface diredfl-exec-priv + '((((background dark)) (:background "#4F4F3B3B2121")) ; ~ dark brown + (t (:background "LightSteelBlue"))) + "*Face used for execute privilege indicator (x) in Dired buffers." + :group 'diredfl) +(defvar diredfl-exec-priv 'diredfl-exec-priv) + +;; For this to show up, you need `F' among the options in `dired-listing-switches'. +;; For example, I use "-alF" for `dired-listing-switches'. +(defface diredfl-executable-tag + '((t (:foreground "Red"))) + "*Face used for executable tag (*) on file names in Dired buffers." + :group 'diredfl) +(defvar diredfl-executable-tag 'diredfl-executable-tag) + +(defface diredfl-file-name + '((((background dark)) (:foreground "Yellow")) + (t (:foreground "Blue"))) + "*Face used for file names (without suffixes) in Dired buffers. +This means the base name. It does not include the `.'." + :group 'diredfl) +(defvar diredfl-file-name 'diredfl-file-name) + +(defface diredfl-file-suffix + '((((background dark)) (:foreground "#7474FFFF7474")) ; ~ light green + (t (:foreground "DarkMagenta"))) + "*Face used for file suffixes in Dired buffers. +This means the `.' plus the file extension. Example: `.elc'." + :group 'diredfl) +(defvar diredfl-file-suffix 'diredfl-file-suffix) + +(defface diredfl-flag-mark + '((((background dark)) (:foreground "Blue" :background "#7575D4D41D1D")) ; ~ olive green + (t (:foreground "Yellow" :background "Blueviolet"))) + "*Face used for flags and marks (except D) in Dired buffers." + :group 'diredfl) +(defvar diredfl-flag-mark 'diredfl-flag-mark) + +(defface diredfl-flag-mark-line + '((((background dark)) (:background "#787831311414")) ; ~ dark red brown + (t (:background "Skyblue"))) + "*Face used for flagged and marked lines in Dired buffers." + :group 'diredfl) +(defvar diredfl-flag-mark-line 'diredfl-flag-mark-line) + +(defface diredfl-ignored-file-name + '(;; (((background dark)) (:foreground "#FFFF921F921F")) ; ~ salmon + ;; (((background dark)) (:foreground "#A71F5F645F64")) ; ~ dark salmon + (((background dark)) (:foreground "#C29D6F156F15")) ; ~ salmon + (t (:foreground "#00006DE06DE0"))) ; ~ dark cyan + "*Face used for ignored file names in Dired buffers." + :group 'diredfl) +(defvar diredfl-ignored-file-name 'diredfl-ignored-file-name) + +(defface diredfl-link-priv + '((((background dark)) (:foreground "#00007373FFFF")) ; ~ blue + (t (:foreground "DarkOrange"))) + "*Face used for link privilege indicator (l) in Dired buffers." + :group 'diredfl) +(defvar diredfl-link-priv 'diredfl-link-priv) + +(defface diredfl-no-priv + '((((background dark)) (:background "#2C2C2C2C2C2C")) ; ~ dark gray + (t (:background "LightGray"))) + "*Face used for no privilege indicator (-) in Dired buffers." + :group 'diredfl) +(defvar diredfl-no-priv 'diredfl-no-priv) + +(defface diredfl-number + '((((background dark)) (:foreground "#FFFFFFFF7474")) ; ~ light yellow + (t (:foreground "DarkBlue"))) + "*Face used for numerical fields in Dired buffers. +In particular, inode number, number of hard links, and file size." + :group 'diredfl) +(defvar diredfl-number 'diredfl-number) + +(defface diredfl-other-priv + '((((background dark)) (:background "#111117175555")) ; ~ dark blue + (t (:background "PaleGoldenrod"))) + "*Face used for l,s,S,t,T privilege indicators in Dired buffers." + :group 'diredfl) +(defvar diredfl-other-priv 'diredfl-other-priv) + +(defface diredfl-rare-priv + '((((background dark)) (:foreground "Green" :background "#FFFF00008080")) ; ~ hot pink + (t (:foreground "Magenta" :background "SpringGreen"))) + "*Face used for rare privilege indicators (b,c,s,m,p,S) in Dired buffers." + :group 'diredfl) +(defvar diredfl-rare-priv 'diredfl-rare-priv) + +(defface diredfl-read-priv + '((((background dark)) (:background "#999932325555")) ; ~ burgundy / dark magenta + (t (:background "MediumAquamarine"))) + "*Face used for read privilege indicator (w) in Dired buffers." + :group 'diredfl) +(defvar diredfl-read-priv 'diredfl-read-priv) + +(defface diredfl-symlink + '((((background dark)) (:foreground "#00007373FFFF")) ; ~ blue + (t (:foreground "DarkOrange"))) + "*Face used for symbolic links in Dired buffers." + :group 'diredfl) +(defvar diredfl-symlink 'diredfl-symlink) + +(defface diredfl-tagged-autofile-name + '((((background dark)) (:background "#328C0411328C")) ; Very dark magenta + (t (:background "#CD73FBEECD73"))) ; Very pale green + "*Face used in Dired for names of files that are autofile bookmarks." + :group 'diredfl) +(defvar diredfl-tagged-autofile-name 'diredfl-tagged-autofile-name) + +(defface diredfl-write-priv + '((((background dark)) (:background "#25258F8F2929")) ; ~ dark green + (t (:background "Orchid"))) + "*Face used for write privilege indicator (w) in Dired buffers." + :group 'diredfl) +(defvar diredfl-write-priv 'diredfl-write-priv) + +(defun diredfl-match-ignored-extensions (limit) + "A matcher of ignored filename extensions for use in `font-lock-keywords'. +LIMIT is the extent of the search." + (let ((ignored-extensions + (append (if (boundp 'dired-omit-extensions) + dired-omit-extensions + completion-ignored-extensions) + (when diredfl-ignore-compressed-flag + diredfl-compressed-extensions)))) + (when ignored-extensions + (re-search-forward + (concat "^ \\(.*" + (regexp-opt ignored-extensions) + ;; Optional executable flag + "[*]?\\)$") + limit + t)))) + +;;; Define second level of fontifying. +(defconst diredfl-font-lock-keywords-1 + (list + '("^ \\(.+:\\)$" 1 diredfl-dir-heading) ; Directory headers + '("^ wildcard.*$" 0 'default) ; Override others, e.g. `l' for `diredfl-other-priv'. + '("^ (No match).*$" 0 'default) ; Override others, e.g. `t' for `diredfl-other-priv'. + '("[^ .]\\(\\.[^. /]+\\)$" 1 diredfl-file-suffix) ; Suffix, including `.'. + '("\\([^ ]+\\) -> .+$" 1 diredfl-symlink) ; Symbolic links + + ;; 1) Date/time and 2) filename w/o suffix. + ;; This is a bear, and it is fragile - Emacs can change `dired-move-to-filename-regexp'. + `(,dired-move-to-filename-regexp + (7 diredfl-date-time t t) ; Date/time, locale (western or eastern) + (2 diredfl-date-time t t) ; Date/time, ISO + (,(concat "\\(.+\\)\\(" (concat (funcall #'regexp-opt diredfl-compressed-extensions) + "\\)[*]?$")) + nil nil (0 diredfl-compressed-file-name keep t))) ; Compressed-file suffix + `(,dired-move-to-filename-regexp + (7 diredfl-date-time t t) ; Date/time, locale (western or eastern) + (2 diredfl-date-time t t) ; Date/time, ISO + ("\\(.+\\)$" nil nil (0 diredfl-file-name keep t))) ; Filename (not a compressed file) + + ;; Files to ignore + '(diredfl-match-ignored-extensions 1 diredfl-ignored-file-name t) + + ;; Compressed-file (suffix) + (list (concat "\\(" (concat (funcall #'regexp-opt diredfl-compressed-extensions) "\\)[*]?$")) + 1 diredfl-compressed-file-suffix t) + '("\\([*]\\)$" 1 diredfl-executable-tag t) ; Executable (*) + + ;; Inode, hard-links, & file size (. and , are for the decimal point, depending on locale) + ;; See comment for `directory-listing-before-filename-regexp' in `files.el' or `files+.el'. + '("\\_<\\(\\([0-9]+\\([.,][0-9]+\\)?\\)[BkKMGTPEZY]?[ /]?\\)" 1 'diredfl-number) + + ;; Directory names - exclude d:/..., Windows drive letter in a dir heading. + (list (concat dired-re-maybe-mark dired-re-inode-size "\\(d\\)[^:]") + '(1 diredfl-dir-priv t) '(".+" (dired-move-to-filename) nil (0 diredfl-dir-name t))) + + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]........\\(x\\)") ; o x + '(1 diredfl-exec-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]........\\([lsStT]\\)") ; o misc + '(1 diredfl-other-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].......\\(w\\).") ; o w + '(1 diredfl-write-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]......\\(r\\)..") ; o r + '(1 diredfl-read-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].....\\(x\\)...") ; g x + '(1 diredfl-exec-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].....\\([lsStT]\\)...") ; g misc + '(1 diredfl-other-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]....\\(w\\)....") ; g w + '(1 diredfl-write-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]...\\(r\\).....") ; g r + '(1 diredfl-read-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]..\\(x\\)...") ; u x + '(1 diredfl-exec-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]..\\([lsStT]\\)...") ; u misc + '(1 diredfl-other-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].\\(w\\)....") ; u w + '(1 diredfl-write-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]\\(r\\).....") ; u r + '(1 diredfl-read-priv)) + + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]........\\([-rwxlsStT]\\)") ; o - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].......\\([-rwxlsStT]\\).") ; g - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]......\\([-rwxlsStT]\\)..") ; u - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].....\\([-rwxlsStT]\\)...") ; o - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]....\\([-rwxlsStT]\\)....") ; g - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]...\\([-rwxlsStT]\\).....") ; u - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]..\\([-rwxlsStT]\\)......") ; o - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].\\([-rwxlsStT]\\).......") ; g - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]\\([-rwxlsStT]\\)........") ; u - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "\\(-\\)") + '(1 diredfl-no-priv keep)) + + (list (concat dired-re-maybe-mark dired-re-inode-size "\\([bcsmpS]\\)") ; (rare) + '(1 diredfl-rare-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "\\(l\\)[-rwxlsStT]") ; l + '(1 diredfl-rare-priv keep)) + + (list (concat "^\\([^\n " (char-to-string dired-del-marker) "].*$\\)") + '(1 diredfl-flag-mark-line prepend)) ; Flag/mark lines + (list (concat "^\\([^\n " (char-to-string dired-del-marker) "]\\)") ; Flags, marks (except D) + '(1 diredfl-flag-mark prepend)) + + (list (concat "^\\([" (char-to-string dired-del-marker) "].*$\\)") ; Deletion-flagged lines + '(1 diredfl-deletion-file-name prepend)) + (list (concat "^\\([" (char-to-string dired-del-marker) "]\\)") ; Deletion flags (D) + '(1 diredfl-deletion prepend))) + "2nd level of Dired highlighting. See `font-lock-maximum-decoration'.") + + +;;;###autoload +(define-minor-mode diredfl-mode + "Enable additional font locking in `dired-mode'." + :global nil + (setq font-lock-defaults + (if diredfl-mode + '((dired-font-lock-keywords + dired-font-lock-keywords + diredfl-font-lock-keywords-1) + t nil nil beginning-of-line) + '(dired-font-lock-keywords t nil nil beginning-of-line))) + (font-lock-refresh-defaults)) + +;;;###autoload +(define-globalized-minor-mode diredfl-global-mode diredfl-mode + (lambda () + (when (derived-mode-p 'dired-mode) + (diredfl-mode))) + :require 'diredfl) + + +(provide 'diredfl) +;;; diredfl.el ends here diff --git a/common/_global.el b/common/_global.el index 05f4947..73319f7 100644 --- a/common/_global.el +++ b/common/_global.el @@ -56,75 +56,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; dired adjustments -(use-package dired-rainbow - :defer 4 - :config - (dired-rainbow-define-chmod directory "#0074d9" "d.*") - (dired-rainbow-define html "#eb5286" - ("css" "less" "sass" "scss" "htm" "html" "jhtm" "mht" - "eml" "mustache" "xhtml")) - (dired-rainbow-define xml "#f2d024" - ("xml" "xsd" "xsl" "xslt" "wsdl" "bib" "json" "msg" - "pgn" "rss" "yaml" "yml" "rdata" "sln" "csproj" - "meta" "unity" "tres" "tscn" "import" "godot")) - (dired-rainbow-define document "#9561e2" - ("docm" "doc" "docx" "odb" "odt" "pdb" "pdf" "ps" - "rtf" "djvu" "epub" "odp" "ppt" "pptx" "xls" "xlsx" - "vsd" "vsdx" "plantuml")) - (dired-rainbow-define markdown "#4dc0b5" - ("org" "org_archive" "etx" "info" "markdown" "md" - "mkd" "nfo" "pod" "rst" "tex" "texi" "textfile" "txt")) - (dired-rainbow-define database "#6574cd" - ("xlsx" "xls" "csv" "accdb" "db" "mdb" "sqlite" "nc")) - (dired-rainbow-define media "#de751f" - ("mp3" "mp4" "MP3" "MP4" "avi" "mpeg" "mpg" "flv" - "ogg" "mov" "mid" "midi" "wav" "aiff" "flac" "mkv")) - (dired-rainbow-define image "#f66d9b" - ("tiff" "tif" "cdr" "gif" "ico" "jpeg" "jpg" "png" - "psd" "eps" "svg")) - (dired-rainbow-define log "#c17d11" - ("log" "log.1" "log.2" "log.3" "log.4" "log.5" "log.6" - "log.7" "log.8" "log.9")) - (dired-rainbow-define shell "#f6993f" - ("awk" "bash" "bat" "fish" "sed" "sh" "zsh" "vim")) - (dired-rainbow-define interpreted "#38c172" - ("py" "ipynb" "hy" "rb" "pl" "t" "msql" "mysql" - "pgsql" "sql" "r" "clj" "cljs" "cljc" "cljx" "edn" - "scala" "js" "jsx" "lua" "fnl" "gd")) - (dired-rainbow-define compiled "#6cb2eb" - ("asm" "cl" "lisp" "el" "c" "h" "c++" "h++" "hpp" - "hxx" "m" "cc" "cs" "cp" "cpp" "go" "f" "for" "ftn" - "f90" "f95" "f03" "f08" "s" "rs" "active" "hs" - "pyc" "java")) - (dired-rainbow-define executable "#8cc4ff" - ("com" "exe" "msi")) - (dired-rainbow-define compressed "#51d88a" - ("7z" "zip" "bz2" "tgz" "txz" "gz" "xz" "z" "Z" "jar" - "war" "ear" "rar" "sar" "xpi" "apk" "xz" "tar" "rar")) - (dired-rainbow-define packaged "#faad63" - ("deb" "rpm" "apk" "jad" "jar" "cab" "pak" "pk3" "vdf" - "vpk" "bsp")) - (dired-rainbow-define encrypted "#f2d024" - ("gpg" "pgp" "asc" "bfe" "enc" "signature" "sig" "p12" - "pem")) - (dired-rainbow-define fonts "#f6993f" - ("afm" "fon" "fnt" "pfb" "pfm" "ttf" "otf" "woff" - "woff2" "eot")) - (dired-rainbow-define partition "#e3342f" - ("dmg" "iso" "bin" "nrg" "qcow" "toast" "vcd" "vmdk" - "bak")) - (dired-rainbow-define vc "#6cb2eb" - ("git" "gitignore" "gitattributes" "gitmodules")) - (dired-rainbow-define config "#5040e2" - ("cfg" "conf")) - (dired-rainbow-define certificate "#6cb2eb" - ("cer" "crt" "pfx" "p7b" "csr" "req" "key")) - (dired-rainbow-define junk "#7F7D7D" - ("DS_Store" "projectile")) - (dired-rainbow-define icloud "#e3342f" ("icloud")) - (dired-rainbow-define-chmod executable-unix "#38c172" "-.*x.*") -) - ; use single buffer for nav damnit (require 'dired-single) (defun my-dired-init () @@ -151,6 +82,10 @@ (interactive) (all-the-icons-dired-mode 1) (hl-line-mode 1))) +(use-package diredfl + :commands diredfl-global-mode + :init + (diredfl-global-mode)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; origami config diff --git a/org/elpa/diredfl-20220508.805/diredfl-autoloads.el b/org/elpa/diredfl-20220508.805/diredfl-autoloads.el new file mode 100644 index 0000000..bf75f23 --- /dev/null +++ b/org/elpa/diredfl-20220508.805/diredfl-autoloads.el @@ -0,0 +1,69 @@ +;;; diredfl-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "diredfl" "diredfl.el" (0 0 0 0)) +;;; Generated autoloads from diredfl.el + +(autoload 'diredfl-mode "diredfl" "\ +Enable additional font locking in `dired-mode'. + +This is a minor mode. If called interactively, toggle the +`Diredfl mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `diredfl-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +\(fn &optional ARG)" t nil) + +(put 'diredfl-global-mode 'globalized-minor-mode t) + +(defvar diredfl-global-mode nil "\ +Non-nil if Diredfl-Global mode is enabled. +See the `diredfl-global-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `diredfl-global-mode'.") + +(custom-autoload 'diredfl-global-mode "diredfl" nil) + +(autoload 'diredfl-global-mode "diredfl" "\ +Toggle Diredfl mode in all buffers. +With prefix ARG, enable Diredfl-Global mode if ARG is positive; +otherwise, disable it. + +If called from Lisp, toggle the mode if ARG is `toggle'. +Enable the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +Diredfl mode is enabled in all buffers where `(lambda nil (when +\(derived-mode-p 'dired-mode) (diredfl-mode)))' would do it. + +See `diredfl-mode' for more information on Diredfl mode. + +\(fn &optional ARG)" t nil) + +(register-definition-prefixes "diredfl" '("diredfl-")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; diredfl-autoloads.el ends here diff --git a/org/elpa/diredfl-20220508.805/diredfl-pkg.el b/org/elpa/diredfl-20220508.805/diredfl-pkg.el new file mode 100644 index 0000000..7f72686 --- /dev/null +++ b/org/elpa/diredfl-20220508.805/diredfl-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from diredfl.el -*- no-byte-compile: t -*- +(define-package "diredfl" "20220508.805" "Extra font lock rules for a more colourful dired" '((emacs "24")) :commit "62b559e1d6b69834a56a57eb1832ac6ad4d2e5d0" :authors '(("Steve Purcell" . "steve@sanityinc.com")) :maintainer '("Steve Purcell" . "steve@sanityinc.com") :keywords '("faces") :url "https://github.com/purcell/diredfl") diff --git a/org/elpa/diredfl-20220508.805/diredfl.el b/org/elpa/diredfl-20220508.805/diredfl.el new file mode 100644 index 0000000..3440657 --- /dev/null +++ b/org/elpa/diredfl-20220508.805/diredfl.el @@ -0,0 +1,382 @@ +;;; diredfl.el --- Extra font lock rules for a more colourful dired -*- lexical-binding: t; -*- + +;; Copyright (C) 2017 Steve Purcell + +;; Author: Steve Purcell +;; Author: Drew Adams +;; Keywords: faces +;; Package-Commit: 62b559e1d6b69834a56a57eb1832ac6ad4d2e5d0 +;; URL: https://github.com/purcell/diredfl +;; Package-Requires: ((emacs "24")) +;; Package-Version: 20220508.805 +;; Package-X-Original-Version: 0 + +;; 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 of the License, 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. If not, see . + +;;; Commentary: + +;; This is adapted from the extra font lock rules provided by Drew +;; Adams' `dired+' package, but published via a modern means, and with +;; support for older Emacsen removed. + +;; Enable in all Dired buffers by calling or customising `diredfl-global-mode'. + +;; Alternatively: + +;; (add-hook 'dired-mode-hook 'diredfl-mode) + +;;; Code: + +(require 'dired) + +(defgroup diredfl () + "Extra font lock rules for a more colourful Dired." + :group 'dired) + +(defcustom diredfl-compressed-extensions '(".tar" ".taz" ".tgz" ".arj" ".lzh" + ".lzma" ".xz" ".zip" ".z" ".Z" ".gz" ".bz2") + "*List of compressed-file extensions, for highlighting." + :type '(repeat string) :group 'diredfl) + +(defcustom diredfl-ignore-compressed-flag t + "*Non-nil means to font-lock names of compressed files as ignored files. +This applies to filenames whose extensions are in +`diredfl-compressed-extensions'. If nil they are highlighted using +face `diredfl-compressed-file-name'." + :type 'boolean :group 'diredfl) + +(defface diredfl-autofile-name + '((((background dark)) (:background "#111313F03181")) ; Very dark blue + (t (:background "#EEECEC0FCE7E"))) ; Very pale goldenrod + "*Face used in Dired for names of files that are autofile bookmarks." + :group 'diredfl) +(defvar diredfl-autofile-name 'diredfl-autofile-name) + +(defface diredfl-compressed-file-name + '((((background dark)) (:foreground "Blue")) + (t (:foreground "Brown"))) + "*Face used for compressed file names." + :group 'diredfl) +(defvar diredfl-compressed-file-name 'diredfl-compressed-file-name) + +(defface diredfl-compressed-file-suffix + '((((background dark)) (:foreground "Blue")) + (t (:foreground "Yellow"))) + "*Face used for compressed file suffixes in Dired buffers. +This means the `.' plus the file extension. Example: `.zip'." + :group 'diredfl) +(defvar diredfl-compressed-file-suffix 'diredfl-compressed-file-suffix) + +(defface diredfl-date-time + '((((background dark)) (:foreground "#74749A9AF7F7")) ; ~ med blue + (t (:foreground "DarkGoldenrod4"))) + "*Face used for date and time in Dired buffers." + :group 'diredfl) +(defvar diredfl-date-time 'diredfl-date-time) + +(defface diredfl-deletion + '((t (:foreground "Yellow" :background "Red"))) + "*Face used for deletion flags (D) in Dired buffers." + :group 'diredfl) +(defvar diredfl-deletion 'diredfl-deletion) + +(defface diredfl-deletion-file-name + '((t (:foreground "Red"))) + "*Face used for names of deleted files in Dired buffers." + :group 'diredfl) +(defvar diredfl-deletion-file-name 'diredfl-deletion-file-name) + +(defface diredfl-dir-heading + '((((background dark)) (:foreground "Yellow" :background "#00003F3F3434")) ; ~ dark green + (t (:foreground "Blue" :background "Pink"))) + "*Face used for directory headings in Dired buffers." + :group 'diredfl) +(defvar diredfl-dir-heading 'diredfl-dir-heading) + +(defface diredfl-dir-name + '((((background dark)) + (:foreground "#7474FFFFFFFF" :background "#2C2C2C2C2C2C")) ; ~ cyan, dark gray + (t (:foreground "DarkRed" :background "LightGray"))) + "*Face used for directory names." + :group 'diredfl) +(defvar diredfl-dir-name 'diredfl-dir-name) + +(defface diredfl-dir-priv + '((((background dark)) + (:foreground "#7474FFFFFFFF" :background "#2C2C2C2C2C2C")) ; ~ cyan, dark gray + (t (:foreground "DarkRed" :background "LightGray"))) + "*Face used for directory privilege indicator (d) in Dired buffers." + :group 'diredfl) +(defvar diredfl-dir-priv 'diredfl-dir-priv) + +(defface diredfl-exec-priv + '((((background dark)) (:background "#4F4F3B3B2121")) ; ~ dark brown + (t (:background "LightSteelBlue"))) + "*Face used for execute privilege indicator (x) in Dired buffers." + :group 'diredfl) +(defvar diredfl-exec-priv 'diredfl-exec-priv) + +;; For this to show up, you need `F' among the options in `dired-listing-switches'. +;; For example, I use "-alF" for `dired-listing-switches'. +(defface diredfl-executable-tag + '((t (:foreground "Red"))) + "*Face used for executable tag (*) on file names in Dired buffers." + :group 'diredfl) +(defvar diredfl-executable-tag 'diredfl-executable-tag) + +(defface diredfl-file-name + '((((background dark)) (:foreground "Yellow")) + (t (:foreground "Blue"))) + "*Face used for file names (without suffixes) in Dired buffers. +This means the base name. It does not include the `.'." + :group 'diredfl) +(defvar diredfl-file-name 'diredfl-file-name) + +(defface diredfl-file-suffix + '((((background dark)) (:foreground "#7474FFFF7474")) ; ~ light green + (t (:foreground "DarkMagenta"))) + "*Face used for file suffixes in Dired buffers. +This means the `.' plus the file extension. Example: `.elc'." + :group 'diredfl) +(defvar diredfl-file-suffix 'diredfl-file-suffix) + +(defface diredfl-flag-mark + '((((background dark)) (:foreground "Blue" :background "#7575D4D41D1D")) ; ~ olive green + (t (:foreground "Yellow" :background "Blueviolet"))) + "*Face used for flags and marks (except D) in Dired buffers." + :group 'diredfl) +(defvar diredfl-flag-mark 'diredfl-flag-mark) + +(defface diredfl-flag-mark-line + '((((background dark)) (:background "#787831311414")) ; ~ dark red brown + (t (:background "Skyblue"))) + "*Face used for flagged and marked lines in Dired buffers." + :group 'diredfl) +(defvar diredfl-flag-mark-line 'diredfl-flag-mark-line) + +(defface diredfl-ignored-file-name + '(;; (((background dark)) (:foreground "#FFFF921F921F")) ; ~ salmon + ;; (((background dark)) (:foreground "#A71F5F645F64")) ; ~ dark salmon + (((background dark)) (:foreground "#C29D6F156F15")) ; ~ salmon + (t (:foreground "#00006DE06DE0"))) ; ~ dark cyan + "*Face used for ignored file names in Dired buffers." + :group 'diredfl) +(defvar diredfl-ignored-file-name 'diredfl-ignored-file-name) + +(defface diredfl-link-priv + '((((background dark)) (:foreground "#00007373FFFF")) ; ~ blue + (t (:foreground "DarkOrange"))) + "*Face used for link privilege indicator (l) in Dired buffers." + :group 'diredfl) +(defvar diredfl-link-priv 'diredfl-link-priv) + +(defface diredfl-no-priv + '((((background dark)) (:background "#2C2C2C2C2C2C")) ; ~ dark gray + (t (:background "LightGray"))) + "*Face used for no privilege indicator (-) in Dired buffers." + :group 'diredfl) +(defvar diredfl-no-priv 'diredfl-no-priv) + +(defface diredfl-number + '((((background dark)) (:foreground "#FFFFFFFF7474")) ; ~ light yellow + (t (:foreground "DarkBlue"))) + "*Face used for numerical fields in Dired buffers. +In particular, inode number, number of hard links, and file size." + :group 'diredfl) +(defvar diredfl-number 'diredfl-number) + +(defface diredfl-other-priv + '((((background dark)) (:background "#111117175555")) ; ~ dark blue + (t (:background "PaleGoldenrod"))) + "*Face used for l,s,S,t,T privilege indicators in Dired buffers." + :group 'diredfl) +(defvar diredfl-other-priv 'diredfl-other-priv) + +(defface diredfl-rare-priv + '((((background dark)) (:foreground "Green" :background "#FFFF00008080")) ; ~ hot pink + (t (:foreground "Magenta" :background "SpringGreen"))) + "*Face used for rare privilege indicators (b,c,s,m,p,S) in Dired buffers." + :group 'diredfl) +(defvar diredfl-rare-priv 'diredfl-rare-priv) + +(defface diredfl-read-priv + '((((background dark)) (:background "#999932325555")) ; ~ burgundy / dark magenta + (t (:background "MediumAquamarine"))) + "*Face used for read privilege indicator (w) in Dired buffers." + :group 'diredfl) +(defvar diredfl-read-priv 'diredfl-read-priv) + +(defface diredfl-symlink + '((((background dark)) (:foreground "#00007373FFFF")) ; ~ blue + (t (:foreground "DarkOrange"))) + "*Face used for symbolic links in Dired buffers." + :group 'diredfl) +(defvar diredfl-symlink 'diredfl-symlink) + +(defface diredfl-tagged-autofile-name + '((((background dark)) (:background "#328C0411328C")) ; Very dark magenta + (t (:background "#CD73FBEECD73"))) ; Very pale green + "*Face used in Dired for names of files that are autofile bookmarks." + :group 'diredfl) +(defvar diredfl-tagged-autofile-name 'diredfl-tagged-autofile-name) + +(defface diredfl-write-priv + '((((background dark)) (:background "#25258F8F2929")) ; ~ dark green + (t (:background "Orchid"))) + "*Face used for write privilege indicator (w) in Dired buffers." + :group 'diredfl) +(defvar diredfl-write-priv 'diredfl-write-priv) + +(defun diredfl-match-ignored-extensions (limit) + "A matcher of ignored filename extensions for use in `font-lock-keywords'. +LIMIT is the extent of the search." + (let ((ignored-extensions + (append (if (boundp 'dired-omit-extensions) + dired-omit-extensions + completion-ignored-extensions) + (when diredfl-ignore-compressed-flag + diredfl-compressed-extensions)))) + (when ignored-extensions + (re-search-forward + (concat "^ \\(.*" + (regexp-opt ignored-extensions) + ;; Optional executable flag + "[*]?\\)$") + limit + t)))) + +;;; Define second level of fontifying. +(defconst diredfl-font-lock-keywords-1 + (list + '("^ \\(.+:\\)$" 1 diredfl-dir-heading) ; Directory headers + '("^ wildcard.*$" 0 'default) ; Override others, e.g. `l' for `diredfl-other-priv'. + '("^ (No match).*$" 0 'default) ; Override others, e.g. `t' for `diredfl-other-priv'. + '("[^ .]\\(\\.[^. /]+\\)$" 1 diredfl-file-suffix) ; Suffix, including `.'. + '("\\([^ ]+\\) -> .+$" 1 diredfl-symlink) ; Symbolic links + + ;; 1) Date/time and 2) filename w/o suffix. + ;; This is a bear, and it is fragile - Emacs can change `dired-move-to-filename-regexp'. + `(,dired-move-to-filename-regexp + (7 diredfl-date-time t t) ; Date/time, locale (western or eastern) + (2 diredfl-date-time t t) ; Date/time, ISO + (,(concat "\\(.+\\)\\(" (concat (funcall #'regexp-opt diredfl-compressed-extensions) + "\\)[*]?$")) + nil nil (0 diredfl-compressed-file-name keep t))) ; Compressed-file suffix + `(,dired-move-to-filename-regexp + (7 diredfl-date-time t t) ; Date/time, locale (western or eastern) + (2 diredfl-date-time t t) ; Date/time, ISO + ("\\(.+\\)$" nil nil (0 diredfl-file-name keep t))) ; Filename (not a compressed file) + + ;; Files to ignore + '(diredfl-match-ignored-extensions 1 diredfl-ignored-file-name t) + + ;; Compressed-file (suffix) + (list (concat "\\(" (concat (funcall #'regexp-opt diredfl-compressed-extensions) "\\)[*]?$")) + 1 diredfl-compressed-file-suffix t) + '("\\([*]\\)$" 1 diredfl-executable-tag t) ; Executable (*) + + ;; Inode, hard-links, & file size (. and , are for the decimal point, depending on locale) + ;; See comment for `directory-listing-before-filename-regexp' in `files.el' or `files+.el'. + '("\\_<\\(\\([0-9]+\\([.,][0-9]+\\)?\\)[BkKMGTPEZY]?[ /]?\\)" 1 'diredfl-number) + + ;; Directory names - exclude d:/..., Windows drive letter in a dir heading. + (list (concat dired-re-maybe-mark dired-re-inode-size "\\(d\\)[^:]") + '(1 diredfl-dir-priv t) '(".+" (dired-move-to-filename) nil (0 diredfl-dir-name t))) + + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]........\\(x\\)") ; o x + '(1 diredfl-exec-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]........\\([lsStT]\\)") ; o misc + '(1 diredfl-other-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].......\\(w\\).") ; o w + '(1 diredfl-write-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]......\\(r\\)..") ; o r + '(1 diredfl-read-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].....\\(x\\)...") ; g x + '(1 diredfl-exec-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].....\\([lsStT]\\)...") ; g misc + '(1 diredfl-other-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]....\\(w\\)....") ; g w + '(1 diredfl-write-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]...\\(r\\).....") ; g r + '(1 diredfl-read-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]..\\(x\\)...") ; u x + '(1 diredfl-exec-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]..\\([lsStT]\\)...") ; u misc + '(1 diredfl-other-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].\\(w\\)....") ; u w + '(1 diredfl-write-priv)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]\\(r\\).....") ; u r + '(1 diredfl-read-priv)) + + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]........\\([-rwxlsStT]\\)") ; o - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].......\\([-rwxlsStT]\\).") ; g - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]......\\([-rwxlsStT]\\)..") ; u - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].....\\([-rwxlsStT]\\)...") ; o - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]....\\([-rwxlsStT]\\)....") ; g - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]...\\([-rwxlsStT]\\).....") ; u - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]..\\([-rwxlsStT]\\)......") ; o - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl].\\([-rwxlsStT]\\).......") ; g - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "[-dl]\\([-rwxlsStT]\\)........") ; u - + '(1 diredfl-no-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "\\(-\\)") + '(1 diredfl-no-priv keep)) + + (list (concat dired-re-maybe-mark dired-re-inode-size "\\([bcsmpS]\\)") ; (rare) + '(1 diredfl-rare-priv keep)) + (list (concat dired-re-maybe-mark dired-re-inode-size "\\(l\\)[-rwxlsStT]") ; l + '(1 diredfl-rare-priv keep)) + + (list (concat "^\\([^\n " (char-to-string dired-del-marker) "].*$\\)") + '(1 diredfl-flag-mark-line prepend)) ; Flag/mark lines + (list (concat "^\\([^\n " (char-to-string dired-del-marker) "]\\)") ; Flags, marks (except D) + '(1 diredfl-flag-mark prepend)) + + (list (concat "^\\([" (char-to-string dired-del-marker) "].*$\\)") ; Deletion-flagged lines + '(1 diredfl-deletion-file-name prepend)) + (list (concat "^\\([" (char-to-string dired-del-marker) "]\\)") ; Deletion flags (D) + '(1 diredfl-deletion prepend))) + "2nd level of Dired highlighting. See `font-lock-maximum-decoration'.") + + +;;;###autoload +(define-minor-mode diredfl-mode + "Enable additional font locking in `dired-mode'." + :global nil + (setq font-lock-defaults + (if diredfl-mode + '((dired-font-lock-keywords + dired-font-lock-keywords + diredfl-font-lock-keywords-1) + t nil nil beginning-of-line) + '(dired-font-lock-keywords t nil nil beginning-of-line))) + (font-lock-refresh-defaults)) + +;;;###autoload +(define-globalized-minor-mode diredfl-global-mode diredfl-mode + (lambda () + (when (derived-mode-p 'dired-mode) + (diredfl-mode))) + :require 'diredfl) + + +(provide 'diredfl) +;;; diredfl.el ends here diff --git a/org/init.el b/org/init.el index e034214..810bbe5 100644 --- a/org/init.el +++ b/org/init.el @@ -114,24 +114,6 @@ (setq org-habit-following-days 7) (setq org-agenda-span 1) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; notdeft search -; (add-to-list 'load-path "~/.emacs.d.profiles/org/notdeft") -; (add-to-list 'load-path "~/.emacs.d.profiles/org/notdeft/extras") -; (require 'notdeft-autoloads) -; (require 'notdeft-org9) -; (setq notdeft-allow-org-property-drawers t) -; (add-hook 'org-mode-hook 'notdeft-note-mode) -; (setq notdeft-extension "org") -; (setq notdeft-secondary-extensions '("md" "txt")) -; (setq notdeft-directories '("~/org" -; "~/org/blog" -; "~/org/culinary" -; "~/org/health" -; "~/org/photography" -; "~/org/reading" -; )) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ui tuning (diminish 'projectile-mode) diff --git a/org/notdeft/.gitignore b/org/notdeft/.gitignore deleted file mode 100644 index 24513d8..0000000 --- a/org/notdeft/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*~ -\#* -.\#* -*.swp -.DS_Store -/xapian/notdeft-xapian -*.elc -notdeft-autoloads.el -local.mk -/README.html -.dir-locals.el -/download/ -/PKGNAMEVER -.notdeft-db/ diff --git a/org/notdeft/Makefile b/org/notdeft/Makefile deleted file mode 100644 index 4f6ccef..0000000 --- a/org/notdeft/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -default : clean install - -# Override this to add custom load paths to the required libraries, or perhaps to load the init file with "emacs --batch -l ~/.emacs". -EMACS_BATCH := emacs --batch - --include local.mk - -install : - $(EMACS_BATCH) -L . -l notdeft-install -f notdeft-install-autoloads -f notdeft-install-bytecode - -exe : - $(MAKE) -C xapian - -clean : - -rm notdeft-autoloads.el *.elc extras/*.elc - -PKGVER := $(shell date --utc +%Y%m%d.%H%M) -PKGNAMEVER := notdeft-$(PKGVER) -PKGTMPDIR := /tmp/$(PKGNAMEVER) -PKGMANIFEST := $(PKGTMPDIR)/notdeft-pkg.el - -package : - mkdir -p download - -rm -r $(PKGTMPDIR) - mkdir -p $(PKGTMPDIR) - cp -ri ./ $(PKGTMPDIR)/ - ( cd $(PKGTMPDIR) && git clean -dxffq && rm -rf .git && rm .gitignore Makefile ) - echo '(define-package "notdeft" "'$(PKGVER)'"' > $(PKGMANIFEST) - echo ' "Note manager and search engine")' >> $(PKGMANIFEST) - ( tar --create --file download/$(PKGNAMEVER).tar -C /tmp $(PKGNAMEVER) ) diff --git a/org/notdeft/README.org b/org/notdeft/README.org deleted file mode 100644 index 62efa94..0000000 --- a/org/notdeft/README.org +++ /dev/null @@ -1,54 +0,0 @@ -#+TITLE: NotDeft -#+AUTHOR: Tero Hasu -#+OPTIONS: toc:nil - -/NotDeft/ is a spin-off of [[https://jblevins.org/projects/deft/][Deft]], an “Emacs mode for quickly browsing, filtering, and editing directories of plain text notes.” NotDeft retains functionality similar to Deft's, albeit with less configurability. In addition, NotDeft features efficient, local, [[https://xapian.org/][Xapian]]-engine-based free-text search over potentially very large numbers of note files; in that respect it is like the [[https://notmuchmail.org/][Notmuch]] Emacs mode for managing email. - -NotDeft is not as deft in note management as Deft. One reason for this is that NotDeft is designed to support managing of multiple directories of notes. Another complication is that locating the desired notes is a two-stage process, as it entails both searching for a set of notes by entering a query, and then further narrowing down the result set through interactive filtering. - -[[file:images/notdeft-screenshot-query-and-filter.png]] - -NotDeft does not aim for the user interaction simplicity of applications like Deft and Notational Velocity---instead, it intends to provide global note search and manipulation functionality, accessible from various Emacs buffers and Emacs-based applications. - -* Quick Start - -Open a terminal, and =cd= into your home directory. Download the source code into some directory with -: git clone https://github.com/hasu/notdeft.git - -Then prepare NotDeft's Emacs Lisp files for use with the commands -: cd notdeft -: make -where =make= is assumed to invoke GNU Make. - -Then build the Xapian backend by doing -: cd xapian -: make -If the =make= command fails, then you will need to ensure that you have the required libraries installed, and find the right C++ compiler incantation for building the =notdeft-xapian= program on your system. A notable library requirement for compiling the program is [[http://tclap.sourceforge.net/][TCLAP]]. - -To make NotDeft loadable in Emacs, add the following code to your Emacs startup file (e.g., “~/.emacs”): -#+BEGIN_SRC emacs-lisp - (add-to-list 'load-path "~/notdeft") - (add-to-list 'load-path "~/notdeft/extras") - (load "notdeft-example") -#+END_SRC -The [[./extras/notdeft-example.el][notdeft-example.el]] file is a sample configuration for NotDeft, which sets up NotDeft for use with Org mode based note files, also enabling some optional components of NotDeft, and setting up some keybindings. It may be a useful starting point for a personal configuration. - -Create a “~/.deft” directory, and copy some “.org” files there. - -Launch Emacs with -: emacs -f notdeft - -Press =TAB= to enter a search query, and type characters to do further filtering of the results. Press =RET= to select a file to open. Use =C-c f1= to see other available commands. - -To configure =notdeft-note-mode= minor mode for use automatically in note buffers, add the required directory local variable to “~/.deft” by entering the command =f6 a d l v=, and by saving the resulting file. - -For other ways to install, configure, and use NotDeft, see the [[https://tero.hasu.is/notdeft/][documentation]]. - -* See Also - -- https://tero.hasu.is/notdeft/ :: documentation -- https://tero.hasu.is/notdeft/download/ :: installable Emacs packages -- https://tero.hasu.is/tags/notdeft/ :: related blog posts -- https://github.com/hasu/notdeft :: source code repository -- [[./notdeft.el][“notdeft.el”]] :: some more documentation (in comments) -- [[https://xapian.org/][Xapian]] and [[https://jblevins.org/projects/deft/][Deft]] :: related software diff --git a/org/notdeft/extras/notdeft-example.el b/org/notdeft/extras/notdeft-example.el deleted file mode 100644 index 3f3fa9c..0000000 --- a/org/notdeft/extras/notdeft-example.el +++ /dev/null @@ -1,112 +0,0 @@ -;; Autoloads for NotDeft commands. -(require 'notdeft-autoloads) - -;; Full path of "notdeft-xapian" executable. -(let ((x - (let ((default-directory - (file-name-directory - (file-truename (locate-library "notdeft"))))) - (file-truename "xapian/notdeft-xapian")))) - (setq notdeft-xapian-program - (and (file-executable-p x) x))) - -;; As an alternative to the above, you can try building and -;; configuring "notdeft-xapian" on demand, but on most systems this -;; will not succeed out of the box. -;(add-hook 'notdeft-load-hook 'notdeft-xapian-make-program-when-uncurrent) - -(defun run-local-variables-mode-hooks () - "Run hooks for `major-mode' with locals set. -Like `run-mode-hooks', but run later, with any buffer and -directory local variables set." - (run-hooks (intern (concat (symbol-name major-mode) - "-local-variables-hook")))) -(add-hook 'hack-local-variables-hook 'run-local-variables-mode-hooks) - -;; A variable determining whether to enable minor mode. -(defcustom notdeft-note-mode-auto-enable nil - "Whether to enable NotDeft Note minor mode for a buffer." - :type 'boolean - :safe 'booleanp) -(make-variable-buffer-local 'notdeft-note-mode-auto-enable) - -;; Define a hook for conditionally enabling the NotDeft minor mode. -(defun default-notdeft-hook () - "Conditionally enable `notdeft-note-mode'. -Enable when the buffer local variable -`notdeft-note-mode-auto-enable' is set to a non-nil value." - (when notdeft-note-mode-auto-enable - (notdeft-note-mode 1))) - -;; Have Org mode files respect the flag. A hook like this should be -;; set for all NotDeft note file types, and no others. -(add-hook 'org-mode-local-variables-hook 'default-notdeft-hook) - -(defun my-notdeft-add-directory-local-variables () - "Add `notdeft-note-mode-auto-enable' flag. -Add it for all `notdeft-directories'." - (interactive) - (require 'notdeft) ;; for `notdeft-directories' - (dolist (dir notdeft-directories) - (make-directory dir t) - (let ((default-directory dir)) - (add-dir-local-variable nil 'notdeft-note-mode-auto-enable t)))) - -;; Org mode "deft:" and "notdeft:" link support. -(eval-after-load 'org - (lambda () - (let ((ver (ignore-errors - (car (version-to-list org-version))))) - (require (if (and ver (< ver 9)) - 'notdeft-org8 - 'notdeft-org9))))) - -;; Add global bindings for NotDeft. To do that, bind a custom keymap -;; that inherits from NotDeft's, one that we can use to override and -;; add to the predefined set of bindings. -(require 'notdeft-global) -(defvar my-notdeft-global-map - (let ((map (make-sparse-keymap))) - (define-key map [(a) (d) (l) (v)] - #'my-notdeft-add-directory-local-variables) - (define-key map [(l)] #'notdeft-org-link-existing-note) ;; l for link - (define-key map [(n)] #'notdeft-org-link-new-file) ;; n for new - (define-key map [(s)] #'org-store-link) ;; s for store - (define-key map [(S)] #'notdeft-org-store-deft-link) ;; s for store - (define-key map [(*)] #'notdeft-org-open-heading-as-query) - (set-keymap-parent map 'notdeft-global-map) - map) - "Custom keymap for accessing NotDeft functionality. - -\\{my-notdeft-global-map}") -(fset 'my-notdeft-global-map my-notdeft-global-map) -(global-set-key [f6] 'my-notdeft-global-map) - -;; Add Org-specific bindings that are also usable in a NotDeft buffer. -(add-hook 'notdeft-load-hook - (lambda () - (define-key notdeft-mode-map (kbd "C-c S") - #'notdeft-org-store-deft-link))) - -(require 'hydra nil t) -(when (featurep 'hydra) - ;; Augment `notdeft-mode' bindings with a hydra. - (autoload 'notdeft-mode-hydra/body "notdeft-mode-hydra" nil t) - (add-hook 'notdeft-load-hook - (lambda () - (define-key notdeft-mode-map (kbd "C-c h") - #'notdeft-mode-hydra/body))) - - ;; Augment the global NotDeft keymap with a hydra also. - (autoload 'notdeft-global-hydra/body "notdeft-global-hydra" nil t) - (define-key my-notdeft-global-map [(h)] #'notdeft-global-hydra/body)) - -(require 'ivy nil t) -(when (featurep 'ivy) - ;; Do minibuffer note selection by search and then Ivy choice list. - (require 'notdeft-ivy) - (add-to-list 'ivy-re-builders-alist - '(notdeft-ivy-completing-read . ivy--regex-ignore-order)) - (setq notdeft-completing-read-function 'notdeft-ivy-completing-read) - (setq notdeft-select-note-file-by-search t) - (setq notdeft-select-note-file-all t)) diff --git a/org/notdeft/images/notdeft-screenshot-query-and-filter.png b/org/notdeft/images/notdeft-screenshot-query-and-filter.png deleted file mode 100644 index 5def54cbe4b543ac0d5559a0d30044035362c321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51087 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 VVak?M4oWZa}tOm7k9_Gv?Q#3uC5z zO2EGD`pOEp*umSvleB1C1K4xBK6J+=6Bc}lh3V--S6$m%CC={z>IJX-Z$~TKYDi!O z_=qu@(RHT5LRZ&ogNBKjd3SgB-Nq!OJop3B1J*tumY~@U3o8sc^)F!Bp91tNI1z5fGm&dWMn(do3fg=CR?-Jd!OYaw_7%cK zYHH%-vy^jGF#S=LQxq6rPL`#6gpbJ{hjkpL$r5;&s-9^_?4&#r5}-uugndmGDuJ># z%517qPQNWo?7x1&Gvh`^N9kg_Uoypnhs&#~Mo*HzVkfT94AxG03Nx@gRU}k;BlfsA z$8a%wCM}GNu4AYGuGPInLPUg5K+rmdNpNSB98fo?-}!LYM{-p`etC5$ZW0JM__pXy z!)JW(U}0q-9hfwmr=jujQvjVT_rz!M8JvO~0cnO<5d?)Ny59Zt9B#D8WQ6dmqvMwm zB>R+neC|_Rh)74JC4q+rmqF(*+1!*Aq_9_cvg6&~^@kt2euH(!FCd_GiR`~ripu1~ z0xVS!Oo``llCD8tt?)!;2@(%(_%O(6=K8ZZEc}d>v=S8zq*XR;S|9%}b5buJ!M~Py8xzy#xe08U!O_tG7uAu$j1p7ts<+uD zTa-LJN6;oh6weGDA6kFPZNPlN>jP_f1-pey!zS}DcrSRUZ8?L0!T~EjDgymkvB!-B zqVY1pzjMq`r*v@(!4x(qanv+!EG^`cY6WT?Chhvq@>zhz#>L0q4Fm9X>*j1nYSJ)H z6;JVy2bv4&wQIgGQ57|wyn+7sc?^?i7W({w%QnDxRh5;Emh!=r(g1;CJ$lH>dIe3U zI$Q5>oOdH*ZKwzh-c8M7kqo6dyO<$!F7sk5s7^eMR{(a4?G4o$qR28HJ_4LXrGtIWda|R{jMaJEpYsbk}3Q-giDA@f*p| zOJwyweKC>WQXBcnF4-;cze>$N`_)TPWdnF4*J57;*|^Wl6cMNR#`LA+`k^X3)R>%c}YJDMy2}dhQKV(>1_mQHscF-9Z47ga$^t+%$5{ z@uDFV`1bX+wU5#?PF{|Hy=|?~MoPyPY08|P{*Ax55b|VM{Xq+8Y>f1c_4)c zTPxszub)X$MIs0sM3t2Xu+10V&cPC#XmocCG-GtnP+;&AOZ|w&mBaEFCKPIFYVg&7 zRS8YBpThAoyZ1YPKa^`}&uEU`9qva>MN?W?2?4cqn4VV4@i(#yTjMq0{q!!C)HPzM zL1AHJkM;e4)r^i-1;-K)4Y{ACX`pz;6%<$kIYhv!Jv};_N#jK+4f{$1MnMs;#zqgA z$l^JHi-DdSEUlWrl}M($pYM;&u+=?xl?){kRce8PH=^oCuLGPb)b70R{r$!F3+%09 z^sN7^TRPhpg2n~>wtxTr-PwWcgk3;YjZI8mYiJ|@G55^&?|2D&++R4z6R|%1`##S) z4GkdNBmvOQHQBIyH1^&MFHm5ZEucm9MrH_`Ie?D?5>XQ zIvQ2h{HUemj=a&wCg{1Sz{v*Ah#a;`V7Lq0Q4mjbSVc50CzZ5 zi@^(+NUktrFqF^2q=|EIz4NBPac+J-Cl^--IjgCKMSfP+A(y>bE|x2Y&KG*V8$O^y zu?LauN+Q(D&!349FX#et&p`g6M<|xjsCb>6IH8jHWho6E-5=lz=rrWH=YRdeqoC+B zE`zxWZWM>{PnfmkpFN9X(-SLt=s*3G>CSVuSrQ;`Qx%@U&60QkbQYcn{&uKUN$slm z)~7*`NY*%Ryn>~js_;1`CcriYW&j}nm^7=eKuv@V;=14r1BNbL`0RA6=^85Pr^YW( zL17jJcv0s0bI+rNz}8kV&KwxIK$wY!fdOi9!1bVyr-HfBybD&C@bT}vNHd(FFy4rZ ziS<+Hw^wU!g3J(%%RooMObzS;eYDKnw;!?tgQ$ptDJNzaIzrjx5ndZpc>p)BS00`$ z;j%aX#JpNf4e`49?_cbn9)q|q=x1kT;bA?lr%7LM$S{%b{I+O_?!x+1FwM}oQwgSd zCr-G(za~>9=8cu$3MlK)kwb8euVpEi*r4HrnQAQmrSJYcIGm{=g=x0l8Mz8PVQoD6 z1qmWa>_(W3U}JlL7yRAO7Hqc=o_W>;GFF&uXsI$-w#V(DMT8>2PK0#?llEgEjpTaA z}+h?hldeCK?*zED(dP0<6Z?Jbs5&y)SLrX z$Yvxi4uCVoud(Qa1OYg9A!hNa|13E<*r>Cb;agb-g3^MEIdg|q{B3r(0Eq2fPdB zJvCbn$GCTAx@8kEdM4hmR}#{Q2XqJw(ZHjDa}n^O_aPzB&wY#nESD1o#-01Y8cflE zMdv`n*cT*Ar}*8F-Cs5pSo^E{frwB=GBh-xdcy;P7+|MD#u&T+3@a_gJ5^#M!b10L zS>A9i1k(V_W$605eCB@mFSN-;m+rj00ATdCom)hay)qgM?D&;mhK%qypJEQUMYEb zw;tl3rGC_a0;j=-N4sNTE7(}98aW5>y2blsD6hi&5}SG)r^2mg5&{eIC{^565*cM1$_PxOGuwB7M% zZ47d-oix|AIj!4L;n0Ztl51en$O`)cl{Qw|qpU21E>b?6LdRii zHs|Ku0}>+A;!4TgAXU*c1*Wqz1flN;69tKR; zmvz|go|zBm!kb3U!dsriKs6=9=7LoOAc*tw@gU6r9BLl|K!>1JW4n|dAyisfNe=O4 zkS8_rV`K`U8AiN-x%eWVWsqn9ZhOQFx(6%@p)+W|VZ}jQ9T=-^92@|g_R|L*7XXXx z6Ic|GQ!!Ivt`12%(loWsyT(dNct}cGS}SyNFbzR`r2u(RNy$GbW8f+VP!~uM?eTLMSj1K;jMOD8m8*4>y=|fb|2I^?b8#i*nB8 z->>TkB?reUbQqrHxyLF#{Ph5#=Pg={hZ#9Ry4nVK2 zL&9SNNq`R_aROMErpr^|a_)BEtx|V)6iaJBNtl`nEb4c|QXtZqS}d)t`?}%DjZRlG z?-?iwahd^?FpNp0et4*YxlhZWl%v9c-#S4Rtl>lZm^}`HO2LHvoCXgPM$!i)s1)HE z85z+smVvtsm?gNLV4j8@4)2JRzKU-E0tcwFYA_1`)Pjb+N_&^#EghXWX|&7ttlDTd^e=u$>GOM> zeW-wE`A}?3ES}}|-3kiNe9IGHWtFVeBtJS>x_4Mb{sa@T@fc;&w%YVs>K48@e;4I_ z&AQ;Fo!$PLr?idp@s=;f+)VuhpiFNAv9JFfe_(DcytbirxpIfm;IfN8>P2EHF?YC` zzAY=&udO%^2MY^y&(nh7s;c5b`6s@rIXNGEvVF`AIR1^7JT&QDnVh;`TbI}StmgW4 z#g)CupFf4A!fA#~52EP0+J8OLaUao8Ncq}o-%m*rNNx2-NjifDv)y2!wJ$14Yx(D@ zV;`8eFp+H!cRol$H38zw)E&Te_%BEll@C)pJ3Ar6%E-_V*p1Q&ix)5YfV{F#-?9Ie z1n3`xQt9PH7(*HzAIPF0e-k^9!(zO6Z*Q;a>kUt0;FC%!D`PqrEvKvho%h9(NYF#} z3G`@uRVBNYKzzOhco9b!c6@eD4%9s75vS%)0{^Q8;I6kH9$K|O0vT;B6sw5PT4D$~ zY!abN88DT36d)N!0?4Rmi#LDZw=0=KL?^%7QE^O+8q^)&6nrQVFW_9kDbS2f&CXs5 zxqys}K(;8u%$)3gKur1=K42Z-Cs(N$qbDaWK2GB zf$N4RdlKSGS!>7RIO1OcqW=42jD1XD|K zsbxqR1$XClg!9Rhk+HFN53j}HBF!^14G`mXa$DO9rf#66TgJ4R2mnz2A0iR)YPvYN zg}yicvo5pW`Iun>7?8gk8$jb=n0z^Q6FPVT8N>LPfHYorv2VjG5ql6Q?#6?4FL?6) zaoEz5(UXc18unEq-g@#-*$gE(M<75C7;rLD(uBlBkW1)2NM{GaQPg1b?EHKNUenVE z0zE5KXZRTdqlO^pApjM|hrRVN9Iiz8U3XkRF^k3y932L<`*?v{dd|NQCNjwwO~>gXcWXqh6ds9*^S3c)vgK-s4B zeSWM7j$N<5fZNKwNe;=vb8pv%ZwBHVCi3nsBneUpQJmQJVxYf|kM}JtJEx{1rF-ER zC+OO-)a@cKUo}>EZj$u<#}B<9_`xES`2_{ty-BfAiQZ=%5y_mR373~Oe!)8pgSu&}v$ z-^fM5b+?9601i6X2l^#Wz|JTR2=0Eq**4Ul6XOglO` zY0OalaMXPTMsDi|$&k6??C$T3G;eP^bayV2pMF3>j$#o)^~D0@`ojHXz$@zF5R;?~G2X z-vY9S;EaY0Up)*-Q|mz6Ab_Q(8h7L&*<)l`m1Aaj*iQ<5L^^$dFOG3-tcW67=3YoU zkZ_lKLof8cKzMJIG!2wRDBCc+^XwMhv41I)-Gd--kOS;_qz#-RA&ZL? zg`CIzp+nh7EfJTp#N=qwXV_|H3BjufUq^PXS zVKvQ@s&I5T=Lt#2f7Jn2Y(QO8A}x=K=`w_Y7X~3xL>I6i4s_i5;8jB_%y zLA}i@mGyl7jPRAv(eCWsc~%Oh9x+zkj)6G-m9O6a+VO%V=%R8vNC2HrOCvl!b_Q8a zL4i+Z2VI6FsVx%=a;!DE@8YwBj^pO z*FyB2aFUj(f7KbCWy#L}OGuh8kk0L5KRVlB8!W*>po59Ye)x~rFE}k4<{|-Sc8hL; z?Grn*yc}&J04S(b-wg0V)~wYreU|Dz)L^-g)LGZB*3P z{v)`=5N>)GVWzLoYcVct&n%djnw1r3CY(1kgyO?VK(NNoTk$DI$%RV|+FfD}V_9?a zbqK(nRy7`i;eSm#IVrEGsH(J7>7Crokaj#w|NaRq_cYLN*dXYDnij)}f$ez;L`qMx zaMS&RAc-{S>wCUDd7g9GnsZD2@XX~00L?J!HM$+M?@5|hnr)O~m8k98lt^3ud44-> zac%8~E}I0^007WnO7_|J=w8}^O!^abhEV{Z4{Aw(Am^vrjmzeSBM<5N)wNa=rJP^%?Oq)Gkm@r2 zbST2^&1VK(vXU-Jm?Q@qn;X=~*js)HC34EWftBmYD$qks}gOwKU1TDER5}3lg1|Fo}ow#y~5F>z7`hO(gn0>f>iRI-AGp z{1Kg;>|f4YyoB@b)*c*a1gJzsic&@WV_Gf*o9W>`tpf?c%f!gkxhmH5^!C~jGqXS9 zf%>ZIGj%3^7JcQ4*`Gw4>9Y&7zR-B>Iy`mS(kE;{ob>8@Umpd(BMkBlcFW=49#P;C z0BQ?CW>7I~h$y3F?BFQ_k0&*$zV*6MyHeW859BEj3yY-W=3=rJ0k8%- zM-R}cfFio2xLCwM$mL3nMPRQbrRd54>1>;`4UY&yUH~k+Juf=0oW@T9V#ROGTR@AG zM?ex~ak?R3SmQW}fNn7{6QfH$h*mZWn;Y zK;SOCPWM)o)zt|}Ntq(03pH!5q}QPQT$%KyEduFMRu&M9Ah>Y^1{;joYB`_aJy5hm zLPD;d2C#%c^4XPO3E-0kn*|?0^TEOzEcTd~t+{RL{&_k(kqWRKQ}O3(8I+M-bl1=! zt@JqFVckQ(ZT#nyD}2|7W@et6O-YIhxa8zkplAGoebT9B^7@ViUr1iA8ug76Zi{ub zo=T$VoE$@D=6tEIn+qU}uE88A+1^d>Uwt=P(9LVl077a9ovo~^GYn~e_Dmxts>WP> zq`{Ti2T>!_O%VZ9qVJDCp44x0mTvD3aj~)4IFMZoy?8fT)EOYZCk%vCj-kQ+V_yy|3F+XiMWV0mGL*85s8n16S= zQu+yuhST2nccH>=gU(zA)rJ}8hbo{KFl9V{JQbcw$^cH@!V-uGA%~WM1{Z+Fag4a= z=%v-wVC6Bua3P)&r6_vPn-@|QeYGBjw1Xr6j)mxFSx7G?$LfT~Rlt{gcw|qt3yKr4 za4arTubHla>ftt^W-#Z#9x}zU2JLrQ*)B8{3bh}=2)VG}O~2)21EO}G{XE%@uHR53 zTG={!yR*v6RivaaCM}GO)wHxMt*m-=+4}$7v*JzxQ5WtF$gD><`*GpxO317+_>A^! z{Wk>Ul?rJnkXFBm_Lyt@ zm6^GAdU)$af(ZWmIQ1g2QdNg7ZCCMcJ*s)*1O(T_#r1v}`(hZVw{sH`!bpK2K07<+ z&tr}*wy*7-uS`y)h8EOh2gN4i)O6RZ4$b)bkY>vJ+XdP1CpeN9Z4c+<>9{Wuk_+h` z+t!B5!}s0gFkxZUB>UTHP}%`W(9ucWt8U5bi|0D6Fyp=0n68VTrW;n^?X zE=UI7EG%YFA9Quyy#E}k3J?t-e5eCgIS4~_fGzs^^(sR%H_Av$;Th?H2t?dYjF0DQ z*5Fx&4?m4P21ykxoSlFFh#|-y%D1TKmG3j~Ti1^tN|-SlH7pfB`r&&AY(NM`ixJY$Ka=ow5d|1T; z=nf)be}4a-otMXjT}ez7EbWHO^lWFJ45*WH2%>LF94sN&o+^ z+{3*CXu-15QfQ(fL%|nXSU6)qoMbk%K2^RraF3WcCnE!#p@*IT3_uwqhUeHojImn5 zD@f&~1&t3Vk;WgQBGsBK)6$s*1z|nL0O*jBC4x>3sDT9=$^qvntoi`dTnTv8%<9UD zNK*!=_-OdB(8bl&W4|rf@Q|)}K`@B_^X={5WLci@Y@Qr;Yl0B}4mL+^Aut;OS6Kn_ z572ku;WI}6pW41WoXWO+SEX8|Sfa>Ghz1l185c^CS&~dCLs6y-A(gqzDI#NvQbaNj zX)-0NkV2FpLz(A!pHJ`p_V@kq9mj9~vG+QT_jpxU&w8HwzOU;#uk$>wjq34legc+) zQ8+G0Zm&>#ncL1ycYQqk`hGX=bGo0PUZ= z&>4MpeJfYnDaWGI(MG8=oq0B=FE8s1fHf0flPq&jBR@Cywa25koP5q^4XwaJc2Fe2+gOAG(MfIZ_-n@E6t*;lAEgkuAPdhRrXKXfz z(V>$Qfw}kKCCbVdzc+z7bVb>Ie$l2S0arDaey(@_$+%_z^s80w3CtX)m(M>FpyAmm zBC=D2o-k`Uby8pDk*;|D|EwHNo#)y%>wgY1rF_hKC;^^CJ+VnR@JL7m8|v$+Di6Zrh$~-Ntr% zu0u2T--s)9P7bZUR}2_w=ell*7Mt*ve29U^031a?77oLx6fy}98k8Ht7&UZNfK{E? zzga8|-Y5ztxDsaam!R9j*b1nzLgDJ*eSlwgydUgUT5FZCb&(h|74s8#GNyf8TiMca zyOiON5ZA(-)ki)|^3+oGhq|n$jjgR4Th{14ZYogWlz2#|L}rb&f-Q!qrSyo7 zp0SRjwA9z$TcY|#uwRxT%ClCT+0|fgbSP`Dto0ym*iiHFV;FGCu&~23=Q$3XXD+^! zn4K*etkMcA&}rsE_**JH-qXF9-J)o-X9@|x>dNY2d3(c#~+bcEzG zG7(?=$ByRJQqt9^y!=+JxU`6x=+%K2#Kq~f5}VHC4Cdwz=DrABnCbI+-spi3uF~hb z3U34D_Pu-GV0eHNgXWOo_ZF5y^gRn%mfMsS6%~QD0%6qCyA6;OksM5>s*vpyW*LWZ z9Tq&Gum1<*C5=6OYC2bhE8P10`PR_Js0}W`J$H8F-BlD!P4cSGza`y$EPUmN2!_ST zpWem1n&zX|yf9DX;l;^Do)7mJh-bll^mQN?*f6i+lTU=uU!Peuq7_0<+^r2ktpA4# z^Pf}~vI>N||Bz(A63IHOz=NG`vuUMKkrcmJZ z6X1r(wULglbLGn_r3m!07}R`hE)gnfgq;*J&>P6d%p2C;|0o z&DC?^KL8&hOXfZy*V5cPWZICH&*!;t4UD>LM-ADnE7UY(&CflIsJSBaz_C62W@^s2 z#9J(xyL}Z#5nvFtesd-4~+z0qF#jvm8_abjM7k%9ob_&nns4K33t&L112a*6SdJ79`Q7 z_w1t)-Q}y){AC?~)WZs&zNn%=2ECUr@6b>E2?(+JbVBd8b3gURNJVTb z(!f<8-c&++g9lv>ZFyj;Xvru|k93CTiuY_qV`(4MhiJ+R5<*G%rC@jfo!&LlrcHjm zP}BP?3>Ba{f9;zm#9Vu@)64fJ8v95L&@ioj{rW~-FW?ePVZq)>E4fxFU}a^+7fC9c z!-N=j+PoJpoRL{8D$>N%U3PGYJ>+)L$Y}enyZ7&h$gIPoM`Zv?H-;ynJjP?wu8cL!Si=S(1jv5=cH8-QawPmauE{vx4yM(k#yKZtp&3WzhVg1x zEf^lOiB$}f_3WWyM{DS-3y5PUvQ7{5^;uuI0C{;3ZW~xBAZ-^F7h@JdVMa#vn>TN; zUqRTFljBs1z{*0t8w*x9DBX>qTo^q!zg|#KfN7I>B_(lx;gT(;&UC@yA6$+}5XhXI zkV6uLNBvGH0=ALK=2lkuP_O!3+b9y~$M5cG_~=n0goWYdS3~YJKUlN=`RXm#lb_|g zh9`E+eS6_QH8rZWi}{Jb?Oa#k2bJ)~&*y>C;+vFDzJgS(PcDBn2N!oT-b+ zF8dakVBP0xEiXRt;k2cyYM)(encEGXCmp35%*y6hCa1#dYPn+WZ00zWpVoaT15M1U zZzp(m8)l^mqNMHWEDinXubm|HD4KG+#UqC`b*%+#K*=4)gzEp zyMXzG$fma!V1ObSsUNbqyMgsQfLm( z>#)pDjW>$VxQ8W!EoKrAmceIx`atDGR8T2*EkLv%2vJM2th}){ZF_>}$gY&eVdt*~ z^68HrMFr2ElXv(*vn;e@hjJ%(TyJB_4DxDc60c;u$;p$X+QYO-mA+b2gO{PY&Zv*? zrstAXa7fs=N}RZ8Y&p+1@OxGBGDOO}>L2OL{Y9~Qjw`-|jomVJEw2&eO#_k!k485zgp z_lulXgL*#g=FONedS2$`g#A?q;`^#n&!c6BNZ1q&3LGTDZh4WWxo3$PkRZK1d9us5 zl2y{~BnZbl@27QZ8TP8Cdlk!OOV&n&DX@aGe|lmPNpW)pd>y(SqzH!5P5&^dG%7YZ z9G{SzA|b$VC-_8tklCfp?A{w`m$wNL{P! zbC)~;x-8$upIp1zzGJlDMKNFu83UA*2$`&KDXQzzW@oRk$-UkR=iLg0Lhtk$4D4LD!9yXNlPo;Qn|RPyB8)OFiEpyT=a4?>rzn%(B5P6g(=1u0e#lfF zQH3tl^lct!Iogukp-LxC6z^wc(a?yK*U$D~;40*ccJ6+kw9df5gOM@vcS{Lhw8vOi z+o;20wv6aV_ATmjUQ*X^lt30q?vUe+ICtl1JHvGk#=3Lf6nCA0H*^lwgOhDuxX;pU zNap>|rkLnFM_>D|d7dNBw*2hxzeyfZZb)asM5md7#v>4-pJmp=h$h&gHbon~u);Q> zGiEZdm-q}q9!QtC`2YKf`#3?uWs~VBJsMpx$SqH3M9!tu|y0drCchX6a3xX!6025NRCtRkw4%K znX}Xq8lz_wzknxybPf2R_l3s)xzD~; z!Y=~!#US=wmxenos|Lxi+;;8`*iG5`?VJ9K1%)LSU8ABQix5})j|?2MRk8c{)-}k< znK15RW`Fn8dq!ko{M>M$?J>u=%*^ke)6CqPQ!gp^b;MsdzXc{UmLFn~7bXri|Bmwa zj|mG)&v#9yD=jQ^$F9XE=(=luvnU;WKpxp=Dd^*noM~5F%Pqq!cXdxodU$I=XOytO zh7BBuS>e9}Q+H}fe5lunr(UYwV^K=C8sO1 z>|$W*Qk(w0wD^Ah(wul&Ld{|mB?5dYWIPzb=M3do%mU=te%b)VA%`ko7%pij>`Hk< zIbv#B4%UzR3DutHiVB6WON0Z$)%`%=jqT0RIYQgWOZ8=XB?ep25D?@&quC^H?49e>2`Yz3f^i_~42nc77f70>k?`aO6 zp_rI(auZ|5_51UhntD2l8V8@)mT~+1ITfEZ9w<1%r7&!7HLWwj&5|zf#IM|yT_$K&Xxp*=*FD`DeijvMJ{z7(#a^q{t3FQaPnPVX0 zamvZK59m7jt8_m4?imiZ#H)IZpC>1|cJ1<$QPs$L;0e>EGgel=z}1874){C_ zDMT-dnZLR=IywrlaFJ`wy%gDirkzi7h0h9nJLHqJHp`vWz55!i^>Ulz0z3Sw$L!+% z{lxCNE>*%C2Sp2r3vU<{A~@Z1zdXs#CY-0S0BTfl%Q3yHVYf@arb*<~EJlux&PHJh zqbBCKyb>;4|2Q=@Dk({nd1GT^BP?A)?7{Wbr0+hWq5@vi^KXCfcNplRciijn0&*8s}{FK=(m6dU~UgZimbCPh1_V$=Eik7t_JcwPET*}kmhGJ1Lx3u@08#83EKHIwadH2OCCCUE5m_v~VKZf>~A=?p7X zN5?GEIg{ea7Vi8!eI3Evfv<025OkAjf9TNpbJ6aT8M`Ua<~FJKsvhp5{$d&*e>u|e za?qnI$MRxS6ra3Hb->3mPw$C(fnyREy=@;iMDS*jw(jJ2$;*I-52eed&6_c?wEA95 z3-_b+Uf2pf+_uqRY_U3w>0Pe?rG#uv5>(2 zxcTnOmlLvz#2n%lg=+=}N-919ioIdb2@*VP9BB-&C zah*lp@-k$UEfpD+Zq*=Ic}ir|PY;CKWVP2mRU>aY4gi6X0?gc=#K{O_snO$%v^k)O zJFWpwa&Xf*prPMH(^DTmKAKg0GbDt6DqC$XB6NE~X{$&d-W)1pr=AHYHfB$rIu*A` z$l}Gf9=>TwJ8;3^yOE)ul_7QLkfqV1j0`ow;=)4OwQD0M%9>>ez(wn!38*r;=3P8&>be%sGxl&Azha+lEIv=}8~lZc4E0#-Oz6_B;@nQBrW;NgZX7;o(+jR4fJWbWh`CnvKsDt ze(gAM`?G)zTbYlp6XB6R#=j6 zZ_}}Wm0;+XDrsN4i4@e4+nbggxW2vn;H&}@o?SF8r zb17UsjVuehws>TN38%)JB$1k1R&y@R-Y<;CR_7d2*)g3)p-1ZIa+@U}B-UIb4QsqIoBKFFiB!Ruzq;eXHMY zo9)~00XhaVGM5vA9tr6i2-;v)6UNmkDV2~$Ob$$d(gHd3Em>y?NYpDgE8E%*r2B=T z6ApY9?f0;-F!YSL&P~0=B7Jv+4r@&H{^RUy1(<*U9z_E&HMI*gE11mf&K*7|C-)uh zMtXXB5Y{#|F&{c?{{e@+t2Bbu{!%dH$_fivk9-Fzfzh8oHyi;iT=%Yb?O`J$X;>Oz zOkHs>{pEV`4jqhf4)Yq8<_H6%4i-v{?Qv8Rx^)GfBQAjK@mMYy!~&+F3MU~RW=$2r zRS5%;F-B5Z+457WD%!Cp#kaGub#0dJFJ+OKNL?|7f172^%X4+xBBWwb6+MrYsdIuHh2@(|7q=Z$llJ^_r&4G|?C{rJ_HESC znSk-}Hdj}!n>W*&o3o9LS>C;qn;CaHCl)4lPt@0UfaNkw;xa2F3JmN%c|ym5Ry6p7 zgm492zOm3Pn2;#YQ2;=W(dP%iCd?8A=N=_gXYjKkoB2iok58gW7;EZU7f}vfA1(Sp zDByPQF31TF19MmXp2EY6Q7u_;3ZPm<7%voDZ%;4yvA7FVdg`Z7k25pD8++iIJvJMN z=2zIKlz=$6&JLT8pQ%`YCDkiiHKT;DglX_Rde@{H4~7M+{6 zF}t6)HCn&kO~Nn3fbUDz*73O$)(y+Y*=c4sb|f&QFx!uo`Ys5Iuh6YcfBN*#uV4A+ zn|Hwg^}vNM5qfKAl_EY_07XT%v@$uelZjSGR~IXF*6S+jxqSP!=bq2P;#|bb-+Qhc z^d5d)O1rueatcNYh>7d&Oc)7iswtADBo7QlWgbt{7+c}QyIy*|7~b9o+sIPqWD(uO_{@wCP$@vY z(9EsB++LwI@WNU&+w@LUq_DcCi26|-PRXaC4|Qp178})cW3GE|blN=BLg!l(Geb-i}IJuweQ~F(=(R4GP~oDnDz-}<%u_!+-PX1lJ19M zUFWwve8|Z}v*ORnNkhEKy_SPnIr~Rf5r3fCuS!`%d_hC{=U-{aGJpR_!{hSL{}o{h zMZB(2|Na0C&Hv}`PhR886NGF^2sZC{6>mq&DFpc`$i9k3fB%YFPgqrJnEVePz>K6J zw3>#OpG*QI3I;6-RbBptJqGrqUQy09z z^KirY4{b`&*AGah;A2Uvbh^a#8P1O8-_#u2cn|HSN7|1s@#t`*3ZUnIlurDAWJIRtKPiisGQ(*{+By&hZO`ag=Gkf~_ZVThL5q>4O_`Q4f$haK=+=ApP_xW>hXYV7f0gVC&;kZxv zS?opJr~UJLNi>T)C=lJcq2dSC6;0a(Nb51LgJOef77qkZ2u=lrZ)ehPV4HZt;Qq3) zu>plFEi1!0Dt~Sdo*0=_exL6)JP)U;4N@PTSyikbaO#Fs?04}3no&?(81|m-W+}L>NG9f9_4_r*qlm8yS znO%~3>sDy?QBmi@*a(LcWR>I`9n@fkhDS*6-oL+k>@99QJ0bx5HDJbsrG-)HcsWUN zfVQCZE#}T0==soH#KfR{@!7dJ7ljx^d{E@6V1gtYtdozY4t#pB{%)J^Iv{a2WK9V%F$`SAtp~1) z{`I3)_>)kYvmzVYkT!t6{E4|^KI7A1kLd=3-ajjqPEX4s^Ill6H1WqdV%ioE7LIheN|OoUmu-61t}96g0SlXy~7TL(oq8xOrU6nlHpg} zqrI6+C;q?%VAxP5C!$Y)F{j>MUZ~eGG@0-RB&zcmAh;cnKY}O5&c;?g_lq5kCD1ek zZyz1xhs1Sq(q(ZUrnZ93i$em}4`OC-=1L!BC zpkT&B2A16N@#DwOpQEn4L_B~>3zlIbF}JdV$tXCCF_u@Y9IPmqoZybPfyIpBBG+$FqA1cxCXZuV0O*>t-NU|DQFW`AYon{1IU6q zj26_wX#w2HJF&5|vtyQM9HCSPZFJi$ReRoyHN5bciGvv`{8=^mwcrv4KpOZ*1b~Nw}pD0LZP@EKMZ{(3R8HW zBXbOY=;P!x4lX(jhHxHAacDw2@bcvWql@T~@vpeTryeL!(o=_fAJC#hHfRFPCLJg4 z(C_RD?4)qkeZ+_)80g}6z!4V6F2>SUmgju?LvUr9nusU?J~7Vb+4DWKN79!VEr49& zz>{+7sZLh%MZ@$K69U_tGdXZiLBQ9Tb^>vH1;k1?_h79)Klv2hSR~?}D1X;MtqhhW zAVzE#>gUhUcNMyioxxtg3~%>xoWIbwZDwFFD|WHXHZ4oGSXWM;BJS|x72>2{1iGTL zM)vkYSbEQ(Y?qZ?#C-sl9i{U&TUL(0F9(J-45P8}@jmaPzz*R~Y5-#SC@^q+mOPFT zb=MKKuXfX5#)8{}+l6yp(8+aWdFf>DQ_PIUp@5?liw#p2A7^BIMe7%L|DMJpFfE1m zs7Y~zRma{V0Z2i+1@_-w@+&YzgjRiKauR&Gh`V>?VN?Nv8zTiJKMYeF{xbHE{k^?W z11Is66bs}FMn*>HJ+u`%J^*-rkHy=^=B}1oFQOsL8DZ;<7wFlOq3j2VC}vC*UC$NX zH#{tlWs1t_Jjc<3IT^64*>#F>AmJCG^;e4H6(@}9$15Hl=d7*K!%2u9*L$P^Hu)>L zJcKL2Oduj44xvCqh(fD9ved5RwwZ>YGw9)0fGkV+Y-nY z-;2+I(I_`JN(WSe~g^@%QtK=%t}C zE2iT6>cE|c?+JeSEP+Ib*OV0DYzo^?B4_fFN4P{ zg5yPq>W>~pC+!NjL?$MfE!)UQ!PdMlX0iJCOm(8Rfx%WKGS(j{1uhdpyLNTidSaj^ zz9wv&WMr;Di06JXsL~ur-;Zy~g13eD|NQ*m2*dm`%H4|?pkR9b{2;Oi$GmbFOvAkb zCxHw)<)U8*@aW)y1B67y`05U91PbY;iAn$9AWERN#zs9^2`L$wQ($1qmyU=WQhVR*m8eT!U}R&vN#+Zj-v{Hcl~livI16xEz}~e2 z?**O&Zk|6KOIJi6cnE%Q(0K=rukp}5ugm7=I`O@(#*?UOAs!F7zllO3>_GMPi6gz; zR9$^HJ}g|@F!+3=(D2l$+A}$$yQ{>cH8Z!zd6%rRtU1^|a zX7b;IaSkFrg8Mtzbl%IW6g?H(RRo6$vH}VUgyR#&#+exzIO*G(np}p_p6~k@xel6_ z1*Abu>XfoWmu^K)fcn>UD);hMx5el%vKhIXZ>SL5aL8^<@z`(GA2^3?Q znq(Cf6+hHq?hOM_U7PY+jTNh$ zlZf&l!H3+usjI8oiWIecwGtUIWA+AeM{updrao)@z;%hJneL!wgfhA9>sKLRVI5U_ zb8~YwwQ3ZrxKeIzW_dO`C7F5U+puVHHAuYL!t9huFl|H8 ze)CVg6qrrWvS57-zH&Hw7UqB3uG-hA006*dL`P?uV>C=9sr8~V582(*lZBZ%qWL@M ziGUPpsSYVLH0ypHRZ-FhL0gq?2Fn!<7MVQzBPffQv9U2Bs1Wu;y1G%-4)he#CDy~u zk(h3>M@T67%V%sEq&{FBuOGHSR3ZG3QEww^;w0>n#iSLE<)49)Q8fVi7uU?BDw1HFX(Et%3_JB7WLP z^$^*SRh6Eti2}{_u!>4hh|W(F8#MdydOS6b&QJA5eF_C}gAvz(hYl1hZ97-{74)Zo z?>XMY8ohj_`qiszvQv#(3Rv(^bpA9sh!eObi;JE?g@o}0P(?=m<^ka1aQYM8@bRu^ z_CCvXxV1?CR1FM}c|Zfm-5`q+<TKt*77t>GKYB%?i=*R;F3jw z4uM{Wg$2QHL4^WQa*1^V*PSzm{eqj|l zJMNTwN6u&23&#>9n+2U$fA{q8%O}pgjKB;yAg1ld@QdId<^;_&k^!7%80!cmsu>4o zjzGteKBWKfqM}u@v9-k_*O~cLiL)8U?@j>$96m(jr=OTq=!(X_hTx0m&w)5IW_MI= z40v~DYNXQ#5*P%fru<_<%-|6qqh3I$#Vx~=zzKvrmB4fy>s85bk+M4mNd!aef`ZeL zgO3vnZG@pnTFSQ){P{`?8D!SLoKBuV9b{VM96HlUF}cHT@$ln8D<WJ({aX!AT&kxnHC^v50h@$q*CrxDIQW8}}mH6BN zB@@Uqcn-L!h*&7^QZC!xGWOu@Es z6AJwp85cK*&+zAu20hKn1G~0-xQ#*0y@O9zFxa(c>{qkQ#TU~O|$`Ur&5Ia!3#nI8X3SCmozv%5FF33 zj1yA{(S1@&W2SN0N?^M*#oV}jR4h}IlYXhmTJTWC_17dtkr)_6g@qm6+*Z;j5cJxi z?^sOTIm)nV-#_5Cix$t}^#qoDZFrL}4=K`n=r6ELQ@je*V+cS!*CCmL_5a}FG~WG- zqn{?iXRcmgi7m#P($FNgt)~3*;}_}ni2nWR#|3~;<<%bkJ};Nj`RCpKuc3LG|Ht3&#kI`6Z}u78%ulJE#3de8)l|u%nBVwcz}**Z diff --git a/org/notdeft/notdeft-global.el b/org/notdeft/notdeft-global.el deleted file mode 100644 index 4cfb80a..0000000 --- a/org/notdeft/notdeft-global.el +++ /dev/null @@ -1,52 +0,0 @@ -;;; notdeft-global.el --- Global NotDeft keymap -*- lexical-binding: t; -*- - -;; Copyright (C) 2017 by the author. -;; All rights reserved. -;; Author: Tero Hasu -;; See "notdeft.el" for licensing information. - -;;; Commentary: -;; A keymap of NotDeft commands usable from outside `notdeft-mode'. It is -;; bound both as a variable and a function, to the name -;; `notdeft-global-map'. - -;;; Code: - -(defvar notdeft-global-map - (let ((map (make-sparse-keymap))) - ;; file management - (define-key map (kbd "C-n") #'notdeft-new-file) - (define-key map (kbd "C-m") #'notdeft-new-file-named) - (define-key map (kbd "C-x C-f") #'notdeft-find-file) - (define-key map (kbd "C-x C-w") #'notdeft-save-buffer) - (define-key map (kbd "C-d") #'notdeft-delete-file) - (define-key map (kbd "C-r") #'notdeft-rename-file) - (define-key map (kbd "C-v") #'notdeft-move-file) - (define-key map (kbd "C-x s") #'notdeft-move-into-subdir) - (define-key map (kbd "C-x e") #'notdeft-change-file-extension) - (define-key map (kbd "C-a") #'notdeft-archive-file) - (define-key map (kbd "C-i") #'notdeft-show-file-directory) - (define-key map (kbd "C-x d") #'notdeft-open-in-deft) - ;; state - (define-key map (kbd "C-j") #'notdeft-chdir) - (define-key map (kbd "C-x g") #'notdeft-refresh) - (define-key map (kbd "C-x c") #'notdeft-gc) - (define-key map (kbd "C-x r") #'notdeft-reindex) - ;; search - (define-key map (kbd "C-o") #'notdeft-open-query) - (define-key map (kbd "C-f") #'notdeft-query-select-find-file) - (define-key map (kbd "C-x o") #'notdeft-lucky-find-file) - ;; movement - (define-key map (kbd "C-x b") #'notdeft-switch-to-note-buffer) - (define-key map (kbd "C-x B") #'notdeft-switch-to-buffer) - ;; other - (define-key map (kbd "C-c") #'notdeft) - map) - "Global keymap for NotDeft. - -\\{notdeft-global-map}") -(fset 'notdeft-global-map notdeft-global-map) - -(provide 'notdeft-global) - -;;; notdeft-global.el ends here diff --git a/org/notdeft/notdeft-install.el b/org/notdeft/notdeft-install.el deleted file mode 100644 index 85066c6..0000000 --- a/org/notdeft/notdeft-install.el +++ /dev/null @@ -1,68 +0,0 @@ -;;; notdeft-install.el --- NotDeft installer -*- lexical-binding: t; -*- - -;; Copyright (C) 2020 by the authors. -;; All rights reserved. -;; Author: Tero Hasu -;; See "notdeft.el" for licensing information. - -;;; Commentary: -;; Functionality for setting up NotDeft from its source distribution, -;; without using a package manager. -;; -;; Suggested use: -;; (require 'notdeft-install) -;; (notdeft-install) - -;;; Code: - -(require 'autoload) -(require 'bytecomp) - -(declare-function notdeft-xapian-make-program "notdeft-xapian-make") - -(defun notdeft-install-autoloads () - "Generate NotDeft autoloads and load them." - (let ((home (file-name-directory - (locate-library "notdeft-install")))) - (let ((generated-autoload-file - (expand-file-name "notdeft-autoloads.el" home))) - (update-directory-autoloads home)) - (load "notdeft-autoloads.el" nil nil t))) - -(defun notdeft-install-bytecode (&optional force) - "Generate NotDeft Emacs Lisp \".elc\" files. -Optionally FORCE byte-compilation even when existing bytecode -files appear to be up-to-date." - (let ((dir (file-name-directory - (locate-library "notdeft-install")))) - (notdeft-install--byte-compile dir "./" t force) - (notdeft-install--byte-compile dir "extras/" nil force))) - -(defun notdeft-install--byte-compile (dir subdir must force) - "Byte-compile NotDeft sources in DIR SUBDIR. -If so indicated, the directory MUST exist. Optionally FORCE the -compilation." - (let ((home (expand-file-name subdir dir))) - (when (or must (file-exists-p home)) - (let ((files (directory-files home nil "^notdeft.*\\.el$"))) - (dolist (file files) - (unless (member file '("notdeft-autoloads.el" - "notdeft-example.el")) - (let ((file (concat home file))) - (byte-recompile-file file force 0)))))))) - -;;;###autoload -(defun notdeft-install (&optional force) - "Generate NotDeft autoloads and binaries. -Optionally FORCE byte-compilation even when existing bytecode -files appear to be up-to-date." - (interactive "P") - (notdeft-install-autoloads) - (require 'notdeft-autoloads) - (notdeft-install-bytecode force) - (require 'notdeft-xapian-make) - (notdeft-xapian-make-program force)) - -(provide 'notdeft-install) - -;;; notdeft-install.el ends here diff --git a/org/notdeft/notdeft-org.el b/org/notdeft/notdeft-org.el deleted file mode 100644 index 610b1f4..0000000 --- a/org/notdeft/notdeft-org.el +++ /dev/null @@ -1,227 +0,0 @@ -;;; notdeft-org.el --- some support for Org format NotDeft notes -*- lexical-binding: t; -*- - -;; Copyright (C) 2017-2020 by the author. -;; All rights reserved. -;; Author: Tero Hasu -;; See "notdeft.el" for licensing information. - -;;; Commentary: -;; Some NotDeft-specific support for `org-mode'. For Org mode version -;; 8 and higher. -;; -;; This feature requires no specific setup, as the public commands and -;; functions of this feature are autoloadable. However, see also -;; `notdeft-org8' and `notdeft-org9', which are optional extensions to -;; this feature, and do require setting up for use. - -;;; Code: - -(require 'org) -(require 'notdeft) - -;;;###autoload -(defun notdeft-org-open-deft-link (link) - "Visit the NotDeft note specified by LINK. -The argument is a non-directory filename, possibly followed by -search options (see the fourth argument of `org-open-file'). This -function defines the opening of Org \"deft:\" links." - (let ((name link) search) - (save-match-data - (when (string-match "::\\(.+\\)\\'" link) - (setq search (match-string 1 link) - name (substring link 0 (match-beginning 0))))) - (let ((path (notdeft-file-by-basename name))) - (if (not path) - (message "No NotDeft note %S" name) - (org-open-file path t nil search))))) - -(defun notdeft-org-read-deft-link-name () - "Query for a \"deft:\" link name. -Do so interactively. Return the name component of a link, without -the \"deft:\" prefix." - (let ((name-lst (notdeft-make-basename-list))) - ;; `ido` has been a part of Emacs since version 22 - (when name-lst - (ido-completing-read "NotDeft note: " name-lst)))) - -;;;###autoload -(defun notdeft-org-complete-deft-link (&optional prefix) - "Define completion for Org \"deft:\" links. -The optional PREFIX argument is ignored." - (ignore prefix) - (let* ((file (notdeft-select-note-file)) - (name (when file - (file-name-nondirectory file)))) - (concat "deft:" (or name "")))) - -(defvar notdeft-describe-link 'notdeft-title-from-file-content - "Function to determine NotDeft note file link description. -The function is given the file name as its sole argument. -Used by `notdeft-select-make-org-link'.") - -(defun notdeft-org-read-link-description (&optional desc) - "Read a link description, interactively. -If DESC is provided, it is used as the initial input. Returns a -string, or nil if no non-whitespace description was provided." - (notdeft-chomp-nullify - (read-string "Description: " desc nil nil t))) - -(defun notdeft-make-deft-link (name &optional desc) - "Turn NAME and DESC into a \"deft:\" link. -NAME should be a non-directory file name with extension." - (org-make-link-string (concat "deft:" name) desc)) - -;;;###autoload -(defun notdeft-org-store-deft-link () - "Store a \"deft:\" link for the current note. -Like `org-store-link', store the link into `org-stored-links'." - (interactive) - (let ((old-file (notdeft-current-filename t t))) - (when old-file - (let* ((name (file-name-nondirectory old-file)) - (link (concat "deft:" name)) - (desc (notdeft-title-from-file-content old-file))) - (push (list link desc) org-stored-links) - (message "Stored: %s" (or desc link)))))) - -;;;###autoload -(defun notdeft-org-link-existing-note (notename &optional desc region) - "Create a \"deft:\" link to an existing note. -Link to a note by NOTENAME, inserting a link description if DESC -is non-nil. Insert the created link at point, unless REGION in -specified \(as a list of two positions), in which case replace -that region. When called interactively: offer a list of notes -from which to choose the link target; query for a note -description, offering to use the text of any active region as the -title, or the result of calling `notdeft-describe-link' -otherwise; use any active region as REGION; if one -\\[universal-argument] is given, then insert a link without DESC; -and if two \\[universal-argument]s are given, use the title of -any note as the description. If multiple notes have the same -NOTENAME, pick any one of them for deriving a description." - (interactive - (progn - (barf-if-buffer-read-only) - (let* ((pfx (prefix-numeric-value current-prefix-arg)) - (region (when mark-active - (list (region-beginning) (region-end)))) - (desc (and region (= pfx 1) - (apply #'buffer-substring-no-properties region))) - (file - ;; Select note before prompting for any description. - ;; Provide any region text as a selection hint. - (let ((notdeft-select-note-file-query desc) - (notdeft-xapian-order-by-time nil)) - (notdeft-select-note-file))) - (desc - (when (and file (/= pfx 4)) - (notdeft-org-read-link-description - (or desc - (pcase pfx - (1 (notdeft-chomp-nullify - (funcall notdeft-describe-link file))) - (16 (notdeft-title-from-file-content file))))))) - (notename (when file - (file-name-nondirectory file)))) - (list notename desc region)))) - (when notename - (when region - (apply #'delete-region region)) - (insert (notdeft-make-deft-link notename desc)))) - -(defalias 'notdeft-insert-org-link - #'notdeft-org-link-existing-note - "Deprecated. Use `notdeft-org-link-existing-note'.") - -;;;###autoload -(defun notdeft-org-link-new-file (&optional dir notename ext data desc region) - "Create a \"deft:\" link to a new note. -Return the filename of the created file. The arguments DIR, -NOTENAME, EXT, and DATA are as for `notdeft-create-file'. Use -DESC, if any, as the link description. Insert an Org \"deft:\" -link to the newly created note at point, except if REGION is -non-nil, in which case replace that buffer region \(specified as -a list of two position values) with the link. When called -interactively: query for a note title, offering to use the text -of any active region as the title; use any active region as -REGION; derive a NOTENAME based on the title, as usual; use the -default filename extension as EXT; if one \\[universal-argument] -is given, then insert a link without DESC; if two -\\[universal-argument]s are given, the query for a target DIR for -the new note." - (interactive - (progn - (barf-if-buffer-read-only) - (let* ((pfx (prefix-numeric-value current-prefix-arg)) - (region (when mark-active - (list (region-beginning) (region-end)))) - (title - (notdeft-chomp-nullify - (read-string "Title: " - (when region - (notdeft-chomp - (apply #'buffer-substring-no-properties region))) - nil nil t))) - (desc (unless (= pfx 4) - (notdeft-org-read-link-description title)))) - (list (and (= pfx 16) 'dir) ;; dir - (and title `(title, title)) ;; notename - nil ;; ext - title ;; data - desc - region)))) - (let* ((buf (current-buffer)) - (name (file-name-nondirectory - (notdeft-create-file dir notename ext data)))) - (switch-to-buffer buf) - (when region - (apply #'delete-region region)) - (insert (notdeft-make-deft-link name desc)))) - -(defalias 'notdeft-link-new-file - #'notdeft-org-link-new-file - "Deprecated. Use `notdeft-org-link-new-file'.") - -(eval-when-compile - (defvar notdeft-xapian-query)) - -;;;###autoload -(defun notdeft-org-open-notdeft-link (query) - "Open the NotDeft search specified by QUERY. -This defines the opening of Org \"notdeft:\" links." - (notdeft-open-query query)) - -;;;###autoload -(defun notdeft-org-store-notdeft-link () - "Store the current NotDeft search as an Org link. -Use `org-store-link' to invoke this function in a `notdeft-mode' -buffer. Return nil if not in `notdeft-mode', or if there is no -current query." - (when (and (eq major-mode 'notdeft-mode) - notdeft-xapian-query) - (org-store-link-props - :type "notdeft" - :link (concat "notdeft:" notdeft-xapian-query)))) - -;;;###autoload -(defun notdeft-org-open-heading-as-query (&optional rank negate) - "Query for current Org heading text. -The RANK and NEGATE arguments are as for `notdeft-open-query'. -When called interactively, any prefix arguments are also -interpreted in the `notdeft-open-query' sense." - (interactive - (let ((prefix current-prefix-arg)) - (list (equal prefix 1) - (equal prefix '(4))))) - (let ((title - (save-excursion - (org-back-to-heading t) - (nth 4 (org-heading-components))))) - (when title - (let ((title (notdeft-chomp title))) - (unless (string-equal title "") - (notdeft-open-phrase-as-query title rank negate)))))) - -(provide 'notdeft-org) - -;;; notdeft-org.el ends here diff --git a/org/notdeft/notdeft-org8.el b/org/notdeft/notdeft-org8.el deleted file mode 100644 index abf4e24..0000000 --- a/org/notdeft/notdeft-org8.el +++ /dev/null @@ -1,36 +0,0 @@ -;;; notdeft-org8.el --- Org link support for NotDeft notes -*- lexical-binding: t; -*- - -;; Copyright (C) 2019 by the author. -;; All rights reserved. -;; Author: Tero Hasu -;; See "notdeft.el" for licensing information. - -;;; Commentary: -;; Support for "deft:" and "notdeft:" links for `org-mode' version 8. -;; The `org-add-link-type' API is obsolete since Org version 9. -;; -;; Suggested use: -;; (eval-after-load 'org (lambda () (require 'notdeft-org8))) - -;;; Code: - -(require 'org) - -(org-add-link-type - "deft" - #'notdeft-org-open-deft-link) ;; follow - -(defun org-deft-complete-link () - "Complete a \"deft:\" link. -Just call `notdeft-org-complete-deft-link'. Defined for -`org-link-try-special-completion', which expects a specific name -for the link-type-specific completion function." - (notdeft-org-complete-deft-link)) - -(org-add-link-type - "notdeft" - #'notdeft-org-open-notdeft-link) ;; follow - -(provide 'notdeft-org8) - -;;; notdeft-org8.el ends here diff --git a/org/notdeft/notdeft-org9.el b/org/notdeft/notdeft-org9.el deleted file mode 100644 index 56dc8ad..0000000 --- a/org/notdeft/notdeft-org9.el +++ /dev/null @@ -1,32 +0,0 @@ -;;; notdeft-org9.el --- Org link support for NotDeft notes -*- lexical-binding: t; -*- - -;; Copyright (C) 2017 by the author. -;; All rights reserved. -;; Author: Tero Hasu -;; See "notdeft.el" for licensing information. - -;;; Commentary: -;; Support for "deft:" and "notdeft:" links for `org-mode' version 9. -;; The `org-link-set-parameters' API is available since Org version 9, -;; in the `org' feature. -;; -;; Suggested use: -;; (eval-after-load 'org (lambda () (require 'notdeft-org9))) - -;;; Code: - -(require 'org) - -(org-link-set-parameters - "deft" - :follow #'notdeft-org-open-deft-link - :complete #'notdeft-org-complete-deft-link) - -(org-link-set-parameters - "notdeft" - :follow #'notdeft-org-open-notdeft-link - :store #'notdeft-org-store-notdeft-link) - -(provide 'notdeft-org9) - -;;; notdeft-org9.el ends here diff --git a/org/notdeft/notdeft-path.el b/org/notdeft/notdeft-path.el deleted file mode 100644 index 8003b56..0000000 --- a/org/notdeft/notdeft-path.el +++ /dev/null @@ -1,79 +0,0 @@ -;;; notdeft-path.el --- NotDeft directory dynamic resolution -*- lexical-binding: t; -*- - -;; Copyright (C) 2018 by the author. -;; All rights reserved. -;; Author: Tero Hasu -;; See "notdeft.el" for licensing information. - -;;; Commentary: -;; A system for resolving `notdeft-directories' dynamically, based on -;; a configurable `notdeft-path' specification. Might be useful when -;; storing some NotDeft directories on removable filesystems, allowing -;; the command `notdeft-refresh' to be used to update the available -;; `notdeft-directories' list. The function -;; `notdeft-refresh-directories' should be called where necessary to -;; ensure that the list is kept up to date. -;; -;; Suggested use: -;; (require 'notdeft-path) -;; (notdeft-refresh-directories) -;; (add-hook 'notdeft-pre-refresh-hook 'notdeft-refresh-directories) - -;;; Code: - -(require 'cl-lib) - -(defcustom notdeft-path '("~/.deft/") - "NotDeft directory search path. -A list of strings, or a function returning a list of strings. The -strings should name directories, which may or may not exist." - :type '(choice - (repeat (string :tag "Directory")) - (function :tag "Function")) - :safe (lambda (lst) (cl-every #'stringp lst)) - :group 'notdeft) - -(defvar notdeft-directories-changed-hook nil - "Hook run after each refresh of `notdeft-directories'. -It is called by `notdeft-refresh-directories'.") - -(defun notdeft-existing-directories (dirs) - "Return a list of existing directories DIRS." - (mapcar #'file-name-as-directory - (cl-remove-if-not #'file-directory-p dirs))) - -(defun notdeft-resolve-directories () - "Resolve directories from `notdeft-path'. -Return the result as a list of strings that are syntactically -directory names, and name existing directories." - (let ((lst (if (functionp notdeft-path) - (funcall notdeft-path) - notdeft-path))) - (unless (listp lst) - (error "Expected a list: %S" lst)) - (dolist (elem lst) - (unless (stringp elem) - (error "Expected a string: %S" elem))) - (notdeft-existing-directories lst))) - -(eval-when-compile - (defvar notdeft-directories) - (defvar notdeft-directory)) - -(defun notdeft-refresh-directories () - "Update `notdeft-directories' based on `notdeft-path'. -Only include existing directories. Also clear `notdeft-directory' -if it is no longer one of the `notdeft-directories'." - (setq notdeft-directories (notdeft-resolve-directories)) - (when (and (boundp 'notdeft-directory) notdeft-directory) - (unless (and (file-directory-p notdeft-directory) - (cl-some (lambda (dir) - (file-equal-p notdeft-directory dir)) - notdeft-directories)) - (setq notdeft-directory nil))) - (run-hooks 'notdeft-directories-changed-hook) - notdeft-directories) - -(provide 'notdeft-path) - -;;; notdeft-path.el ends here diff --git a/org/notdeft/notdeft-xapian-make.el b/org/notdeft/notdeft-xapian-make.el deleted file mode 100644 index 4e0ff7a..0000000 --- a/org/notdeft/notdeft-xapian-make.el +++ /dev/null @@ -1,150 +0,0 @@ -;;; notdeft-xapian-make.el --- Xapian backend auto-installer -*- lexical-binding: t; -*- - -;; Copyright (C) 2020 by the authors. -;; All rights reserved. -;; Author: MaxSt -;; Author: Tero Hasu -;; See "notdeft.el" for licensing information. - -;;; Commentary: -;; Functionality for compiling the C++ code for the NotDeft Xapian -;; backend, automatically or otherwise. -;; -;; Instead of setting the `notdeft-xapian-program' variable yourself, -;; you may instead load this `notdeft-xapian-make' feature to have the -;; program built and configured automatically. You may additionally -;; need to set the `notdeft-xapian-program-compile-command-format' to -;; something that produces a suitable compiler invocation for your -;; platform. -;; -;; Suggested use: -;; (add-hook 'notdeft-load-hook 'notdeft-xapian-make-program-when-uncurrent) - -;;; Code: - -(defcustom notdeft-xapian-program-compile-command-format - "c++ -o %s %s -std=c++11 -Wall `pkg-config --cflags --libs tclap` `xapian-config --cxxflags --libs`" - "Compilation shell command. -Can be a `format' string with two \"%s\" directives, or a -function of two arguments, with the first directive or argument -specifying the executable path for the program, and the second -specifying the C++ source file for the notdeft-xapian program. If -it is a function, it should do any necessary shell escaping of -the arguments." - :type '(choice - (string :tag "Format string") - (function :tag "Function")) - :group 'notdeft) - -(defcustom notdeft-xapian-program-install-path - "notdeft-xapian" - "Path for the notdeft-xapian executable to build. -If the path is not absolute, it is considered relative to -`notdeft-xapian-home'." - :type 'string - :safe #'stringp - :group 'notdeft) - -(defvar notdeft-xapian-home - (expand-file-name "xapian/" - (file-name-directory - (file-truename (locate-library "notdeft")))) - "Directory path for notdeft-xapian sources. -Must specify an absolute path.") - -(defvar notdeft-xapian-compile-buffer-name "*Compile notdeft-xapian*" - "Name of the buffer used for compiling notdeft-xapian.") - -(defun notdeft-xapian-program-current-p (&optional program) - "Whether the notdeft-xapian PROGRAM is current. -It is uncurrent if it does not exist as an executable, or if its -source file is newer. PROGRAM defaults to -`notdeft-xapian-program-install-path'." - (let ((exe-file (expand-file-name - (or program notdeft-xapian-program-install-path) - notdeft-xapian-home))) - (when (file-executable-p exe-file) - (let ((cxx-file (expand-file-name - "notdeft-xapian.cc" - notdeft-xapian-home))) - (when (file-exists-p cxx-file) - (not (time-less-p - (nth 5 (file-attributes exe-file)) - (nth 5 (file-attributes cxx-file))))))))) - -;;;###autoload -(defun notdeft-xapian-compile-program (&optional program) - "Compile the notdeft-xapian program. -Use notdeft-xapian sources in `notdeft-xapian-home', and build -the PROGRAM, which defaults to `notdeft-xapian-program-install-path'. -On success, return the path of the built executable." - (interactive) - (unless (file-directory-p notdeft-xapian-home) - (error "Cannot locate notdeft-xapian sources")) - (let* ((exe-file (expand-file-name - (or program notdeft-xapian-program-install-path) - notdeft-xapian-home)) - (cxx-file (expand-file-name - "notdeft-xapian.cc" - notdeft-xapian-home)) - (compile-command - (if (functionp notdeft-xapian-program-compile-command-format) - (funcall notdeft-xapian-program-compile-command-format - exe-file cxx-file) - (format notdeft-xapian-program-compile-command-format - (shell-quote-argument exe-file) - (shell-quote-argument cxx-file)))) - (buffer (get-buffer-create notdeft-xapian-compile-buffer-name))) - (pop-to-buffer notdeft-xapian-compile-buffer-name) - (let ((exit-code - (call-process - "sh" nil buffer t "-c" compile-command))) - (unless (zerop exit-code) - (error "Compilation of notdeft-xapian failed: %s (%d)" - compile-command exit-code)) - (unless (file-executable-p exe-file) - (error (concat "Compilation of notdeft-xapian failed: " - "Executable %S not created") - exe-file)) - (message "Compilation of notdeft-xapian succeeded: %S" exe-file) - exe-file))) - -(defun notdeft-xapian-make-program (&optional force) - "Compile notdeft-xapian program. -Only do that if the source directory `notdeft-xapian-home' -exists, and the target path `notdeft-xapian-program-install-path' -is non-nil. In that case generate the executable with the target -path, but only if any existing executable appears to be -uncurrent, or if the FORCE flag is non-nil. Return the absolute -target path if it is known, even if the program could not be -compiled." - (when notdeft-xapian-program-install-path - (when (and notdeft-xapian-home - (file-directory-p notdeft-xapian-home)) - (let ((exe-file (expand-file-name - notdeft-xapian-program-install-path - notdeft-xapian-home))) - (when (or force (not (notdeft-xapian-program-current-p exe-file))) - (notdeft-xapian-compile-program exe-file)) - exe-file)))) - -(eval-when-compile - (defvar notdeft-xapian-program)) - -;;;###autoload -(defun notdeft-xapian-make-program-when-uncurrent () - "Compile notdeft-xapian program when it is uncurrent. -Do that as for `notdeft-xapian-make-program', but fail silently -if compilation fails. Set `notdeft-xapian-program' to the -program's absolute path, or to nil if the program does not exist -even after any compilation attempt." - (setq notdeft-xapian-program - (let ((exe-file - (ignore-errors - (notdeft-xapian-make-program nil)))) - (when (and exe-file (file-executable-p exe-file)) - exe-file)))) - -(provide 'notdeft-xapian-make) - -;;; notdeft-xapian-make.el ends here diff --git a/org/notdeft/notdeft-xapian.el b/org/notdeft/notdeft-xapian.el deleted file mode 100644 index 17afb74..0000000 --- a/org/notdeft/notdeft-xapian.el +++ /dev/null @@ -1,196 +0,0 @@ -;;; notdeft-xapian.el --- Xapian backend for NotDeft -*- lexical-binding: t; -*- - -;; Copyright (C) 2017 by the author. -;; All rights reserved. -;; Author: Tero Hasu -;; See "notdeft.el" for licensing information. - -;;; Commentary: -;; Xapian-specific functionality for NotDeft. - -;;; Code: - -(defcustom notdeft-xapian-program nil - "Xapian backend's executable program path. -Specified as an absolute path. When nil, the Xapian backend is -disabled, and filtering does not concern search results, but all -notes in `notdeft-directories'." - :type '(choice (const :tag "None" nil) - (file :tag "Path")) - :safe #'string-or-null-p - :group 'notdeft) - -(defcustom notdeft-xapian-max-results 100 - "Maximum number of Xapian query results. -\(I.e., '--max-count' for `notdeft-xapian-program'.) -No limit if 0." - :type 'integer - :safe #'integerp - :group 'notdeft) - -(defcustom notdeft-xapian-language "en" - "Stemming language to use in Xapian indexing and searching. -See Xapian documentation for a list of supported language names -and abbreviations. May be specified as \"none\" for no stemming. -The language identifier may be followed by the string \":cjk\" to -enable generation of n-grams from CJK text. The CJK option is -ignored unless a recent enough version of Xapian is used." - :type 'string - :safe #'stringp - :group 'notdeft) - -(defcustom notdeft-xapian-order-by-time t - "Whether to order file list by decreasing modification time. -Otherwise order by decreasing relevance, unless overridden by -a query modifier." - :type 'boolean - :safe #'booleanp - :group 'notdeft) - -(defcustom notdeft-xapian-boolean-any-case t - "Whether to allow query operators in any case. -That is, whether the operator syntax also allows -lowercase characters (e.g., \"and\" and \"or\")." - :type 'boolean - :safe #'booleanp - :group 'notdeft) - -(defcustom notdeft-xapian-pure-not t - "Whether to allow \"NOT\" in queries. -Using such queries is costly on performance." - :type 'boolean - :safe #'booleanp - :group 'notdeft) - -(defface notdeft-xapian-query-face - '((t :inherit font-lock-string-face :bold t)) - "Face for NotDeft Xapian queries." - :group 'notdeft-faces) - -(defvar notdeft-xapian-query-history nil - "Xapian query string history. -Not cleared between invocations of `notdeft-mode'.") - -(defun notdeft-xapian-read-query (&optional initial) - "Read a Xapian query string, interactively. -Use and update `notdeft-xapian-query-history' in querying. -Optionally fill in the specified INITIAL input. Return the read -string, or nil if no query is given." - (let* ((hist (if (not initial) - 'notdeft-xapian-query-history - (setq notdeft-xapian-query-history - (cons initial - notdeft-xapian-query-history)) - '(notdeft-xapian-query-history . 1))) - (s (read-from-minibuffer - "Query: " ;; PROMPT - initial nil nil ;; INITIAL-CONTENTS KEYMAP READ - hist ;; HIST - nil ;; DEFAULT-VALUE - t ;; INHERIT-INPUT-METHOD - ))) - (when (and s (not (string= s ""))) - s))) - -(eval-when-compile - (defvar notdeft-extension) - (defvar notdeft-secondary-extensions) - (defvar notdeft-allow-org-property-drawers)) - -(defun notdeft-xapian-index-dirs (dirs &optional recreate) - "Create or update a Xapian index for DIRS. -Each element of DIRS must be either a directory path string, or a -list of the form (directory-path . relative-file-path-list). With -RECREATE, truncate any existing index files." - (with-temp-buffer - (dolist (dir dirs) - (if (stringp dir) - (insert ":idir\n" (file-relative-name dir "~") "\n") - (let ((dir (car dir)) - (files (cdr dir))) - (insert ":ifiles\n" (file-relative-name dir "~") "\n") - (insert (format "%d\n" (length files))) - (dolist (file files) - (insert file "\n"))))) - (let ((ret - (apply - #'call-process-region - (point-min) ;; START - (point-max) ;; END - notdeft-xapian-program ;; PROGRAM - t ;; DELETE (delete input) - t ;; BUFFER (output to current buffer) - nil ;; DISPLAY (do not refresh) - `("index" - "--chdir" ,(expand-file-name "." "~") - ,@(when recreate '("--recreate")) - ,@(apply #'append - (mapcar - (lambda (ext) - `("--extension" ,(concat "." ext))) - (cons notdeft-extension - notdeft-secondary-extensions))) - "--lang" ,(or notdeft-xapian-language "none") - ,@(when notdeft-allow-org-property-drawers - '("--allow-org-property-drawers")) - "--input")))) - (when (/= 0 ret) - (error "Index generation failed: %s (%d): %s" - notdeft-xapian-program ret (buffer-string)))))) - -(defun notdeft-xapian-search (dirs &optional query) - "On the Xapian indexes in DIRS, perform the search QUERY. -I.e., perform the query in terms of the Xapian indexes in the -specified DIRS. Where a query is not specified, use a query that -matches any file, and in that case consider -`notdeft-xapian-order-by-time' to be true. Return at most -`notdeft-xapian-max-results' results, as pathnames of the -matching files. Sort by relevance, modification time, or -non-directory filename, all descending, based on the -`notdeft-xapian-order-by-time' setting and any query modifiers." - (let ((time-sort (if query notdeft-xapian-order-by-time t)) - (max-results notdeft-xapian-max-results) - name-sort) - (when query - (save-match-data - (while (string-match "^ *!\\([[:alpha:]]+\\)\\>" query) - (let ((opt (match-string 1 query))) - (setq query (substring query (match-end 0))) - (pcase (downcase opt) - ("time" (setq time-sort t)) - ("rank" (setq time-sort nil)) - ("all" (setq max-results 0)) - ("file" (setq name-sort t))))))) - (let* ((query (notdeft-chomp-nullify query)) - (s (shell-command-to-string - (concat - (shell-quote-argument notdeft-xapian-program) " search" - (if name-sort " --name-sort" "") - (if time-sort " --time-sort" "") - " --lang " (shell-quote-argument - (or notdeft-xapian-language "none")) - (if notdeft-xapian-boolean-any-case - " --boolean-any-case" "") - (if notdeft-xapian-pure-not - " --pure-not" "") - (if (> max-results 0) - (format " --max-count %d" max-results) - "") - (if query - (concat " --query " (shell-quote-argument query)) - "") - " " (mapconcat - (lambda (dir) - (shell-quote-argument - (expand-file-name dir "~"))) - dirs " ")))) - (files - (mapcar - (lambda (file) - (expand-file-name file "~")) - (split-string s "\n" t)))) - files))) - -(provide 'notdeft-xapian) - -;;; notdeft-xapian.el ends here diff --git a/org/notdeft/notdeft.el b/org/notdeft/notdeft.el deleted file mode 100644 index 65f2066..0000000 --- a/org/notdeft/notdeft.el +++ /dev/null @@ -1,2890 +0,0 @@ -;;; notdeft.el --- Note manager and search engine -*- lexical-binding: t; -*- - -;; Copyright (C) 2011 Jason R. Blevins -;; Copyright (C) 2011-2020 Tero Hasu -;; All rights reserved. - -;; Author: Tero Hasu -;; Jason R. Blevins -;; Maintainer: Tero Hasu -;; Homepage: https://tero.hasu.is/notdeft/ -;; Keywords: files text notes search -;; Package-Requires: ((emacs "24.3")) - -;; This file is not part of GNU Emacs. - -;; Redistribution and use in source and binary forms, with or without -;; modification, are permitted provided that the following conditions -;; are met: -;; 1. Redistributions of source code must retain the above copyright -;; notice, this list of conditions and the following disclaimer. -;; 2. Redistributions in binary form must reproduce the above -;; copyright notice, this list of conditions and the following -;; disclaimer in the documentation and/or other materials provided -;; with the distribution. -;; 3. Neither the names of the copyright holders nor the names of any -;; contributors may be used to endorse or promote products derived -;; from this software without specific prior written permission. - -;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -;; FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -;; COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -;; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -;; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -;; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -;; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -;; OF THE POSSIBILITY OF SUCH DAMAGE. - -;;; Commentary: - -;; NotDeft is an Emacs mode for quickly browsing, filtering, and -;; editing directories of plain text notes. It was designed for -;; increased productivity when writing and taking notes by making it -;; fast to find the right file at the right time. - -;; NotDeft is open source software and may be freely distributed and -;; modified under the BSD license. This version is a fork of -;; Deft version 0.3, which was released on September 11, 2011. - -;; File Browser - -;; The NotDeft buffer is simply a local search engine result browser -;; which lists the titles of all text files matching a search query -;; (entered by first pressing TAB or `C-c C-o`), followed by short -;; summaries and last modified times. The title is taken to be the -;; first line of the file (or as specified by an Org "TITLE" file -;; property) and the summary is extracted from the text that follows. -;; By default, files are sorted in terms of the last modified date, -;; from newest to oldest. - -;; All NotDeft files or notes are simple plain text files (e.g., Org -;; markup files). As an example, the following directory structure -;; generated the screenshot above. -;; -;; % ls ~/.deft -;; about.org browser.org directory.org operations.org -;; ack.org completion.org extensions.org text-mode.org -;; binding.org creation.org filtering.org -;; -;; % cat ~/.deft/about.org -;; About -;; -;; An Emacs mode for slicing and dicing plain text files. - -;; Searching and Filtering - -;; NotDeft's primary operations are searching and filtering. The list -;; of files matching a search query can be further narrowed down using -;; a filter string, which will match both the title and the body text. -;; To initiate a filter, simply start typing. Filtering happens on the -;; fly. As you type, the file browser is updated to include only files -;; that match the current string. - -;; To open the first matching file, simply press `RET`. If no files -;; match your filter string, pressing `RET` will create a new file -;; using the string as the title. This is a very fast way to start -;; writing new notes. The filename will be generated automatically. - -;; To open files other than the first match, navigate up and down -;; using `C-p` and `C-n` and press `RET` on the file you want to open. - -;; Press `C-c C-c` to clear the filter string and display all files -;; and `C-c C-x g` to refresh the file browser using the current -;; filter string. - -;; Static filtering is also possible by pressing `C-c C-l`. This is -;; sometimes useful on its own, and it may be preferable in some -;; situations, such as over slow connections or on older systems, -;; where interactive filtering performance is poor. - -;; Common file operations can also be carried out from within a -;; NotDeft buffer. Files can be renamed using `C-c C-r` or deleted -;; using `C-c C-d`. New files can also be created using `C-c C-n` for -;; quick creation or `C-c C-m` for a filename prompt. You can leave a -;; `notdeft-mode' buffer at any time with `C-c C-q`, which buries the -;; buffer, or kills it with a prefix argument `C-u`. - -;; Archiving unused files can be carried out by pressing `C-c C-a`. -;; Files will be moved to `notdeft-archive-directory' under the note -;; file's NotDeft data directory. The archive directory is by default -;; named so that it gets excluded from searches. - -;; Instead of the above mode of operation, it is also possible to use -;; NotDeft's search functionality without a NotDeft buffer, by -;; invoking NotDeft's variants of the `find-file' command from any -;; major mode. The `notdeft-lucky-find-file' opens the "best" search -;; query match directly, whereas `notdeft-query-select-find-file' -;; presents the matches for selection in the minibuffer. - -;; Getting Started - -;; To start using NotDeft, place it somewhere in your Emacs -;; `load-path' and add the line -;; -;; (require 'notdeft-autoloads) -;; -;; in your `.emacs` file. Then run `M-x notdeft` to start. -;; Alternatively, you may find it convenient to execute `M-x -;; notdeft-open-query` to enter a search query from anywhere, which -;; then also opens a `notdeft-mode' buffer for displaying the results. - -;; To actually use NotDeft's search engine to get search results, you -;; must first compile the `notdeft-xapian` program, which is -;; responsible for accessing the search index(es). The variable -;; `notdeft-xapian-program' must specify the location of the compiled -;; executable in order for NotDeft to use it. - -;; You should preferably also have the `notdeft-note-mode' minor mode -;; enabled for all of your note file buffers, in order to get NotDeft -;; to automatically update the search index according to changes made, -;; no matter how the buffers were opened. The minor mode is best -;; enabled for the relevant file formats and directories only, which -;; can be arranged by enabling it only when a certain directory-local -;; variable has been set to indicate note-containing directories. For -;; example, the `add-dir-local-variable' command can be used to set -;; such variables for the relevant modes and directories, and the -;; minor mode can then be enabled based on their values: -;; -;; (defvar-local notdeft-note-mode-auto-enable nil) -;; -;; (add-hook -;; 'hack-local-variables-hook -;; (lambda () -;; (when notdeft-note-mode-auto-enable -;; (notdeft-note-mode 1)))) - -;; One useful way to use NotDeft is to keep a directory of notes in a -;; synchronized folder. This can be used with other applications and -;; mobile devices, for example, Notational Velocity or Simplenote -;; on OS X, Elements on iOS, or Epistle on Android. - -;; Customization - -;; Customize the `notdeft` group to change the functionality. -;; -;; (customize-group "notdeft") - -;; By default, NotDeft looks for notes by searching for files with the -;; extension `.org` in the `~/.deft` directory. You can customize -;; both the file extension and the NotDeft note search path by running -;; `M-x customize-group` and typing `notdeft`. Alternatively, you can -;; configure them in your `.emacs` file: -;; -;; (setq notdeft-directories '("~/.deft/" "~/Dropbox/notes/")) -;; (setq notdeft-extension "txt") -;; (setq notdeft-secondary-extensions '("md" "scrbl")) -;; -;; The variable `notdeft-extension' specifies the default extension -;; for new notes. There can be `notdeft-secondary-extensions' for -;; files that are also considered to be NotDeft notes. - -;; While you can choose a `notdeft-extension' that is not ".org", -;; NotDeft is somewhat optimized to working with files in Org format. -;; Refer to the `notdeft-org` feature for NotDeft's Org-specific -;; commands. - -;; To enable the `notdeft-xapian` program to be compiled from within -;; Emacs, you may specify a suitable shell command by setting the -;; variable `notdeft-xapian-program-compile-command-format'. After -;; that you can use the command `notdeft-xapian-compile-program' to -;; build the program. It even possible to instruct the compilation to -;; happen transparently, by having your configuration include -;; -;; (add-hook 'notdeft-load-hook -;; 'notdeft-xapian-make-program-when-uncurrent) - -;; It can be useful to create a global keybinding for the `notdeft' -;; function (e.g., a function key) to start it quickly. You can easily -;; set up such a binding. For example, to bind `notdeft' to F8, add -;; the following code to your `.emacs` file: -;; -;; (global-set-key [f8] 'notdeft) - -;; NotDeft also comes with a predefined `notdeft-global-map' keymap of -;; commands, and that keymap can also be given a global keybinding to -;; make its commands accessible quickly. Both `notdeft' and -;; `notdeft-open-query' are included in the keymap, among other -;; commands that may be useful outside a NotDeft buffer. - -;; The faces used for highlighting various parts of the screen can -;; also be customized. By default, these faces inherit their -;; properties from the standard font-lock faces defined by your current -;; color theme. - -;;; History: - -;; NotDeft: - -;; * Most notably, add a Xapian-based query engine. -;; * Add support for multiple notes directories. - -;; Deft version 0.3 (2011-09-11): - -;; * Internationalization: support filtering with multibyte characters. - -;; Deft version 0.2 (2011-08-22): - -;; * Match filenames when filtering. -;; * Automatically save opened files (optional). -;; * Address some byte-compilation warnings. - -;; Deft was originally written by Jason Blevins. -;; The initial version, 0.1, was released on August 6, 2011. - -;;; Code: - -(require 'cl-lib) -(require 'widget) -(require 'wid-edit) - -;; Customization - -;;;###autoload -(defgroup notdeft nil - "Emacs NotDeft mode." - :group 'local) - -(defcustom notdeft-directories '("~/.deft/") - "NotDeft directories. -Each element must be a directory path string. -Each named directory may or may not exist." - :type '(repeat string) - :safe (lambda (lst) (cl-every 'stringp lst)) - :group 'notdeft) - -(defcustom notdeft-directory nil - "Default or previously selected NotDeft data directory. -One of the `notdeft-directories', or nil if none. The value may -be modified locally for each NotDeft mode buffer. The global -default is customizable." - :type '(choice (string :tag "Default directory") - (const :tag "None" nil)) - :safe #'string-or-null-p - :group 'notdeft) - -(defcustom notdeft-extension "org" - "Default NotDeft file extension." - :type 'string - :safe #'stringp - :group 'notdeft) - -(defcustom notdeft-secondary-extensions nil - "Additional NotDeft file extensions." - :type '(repeat string) - :safe (lambda (lst) (cl-every 'stringp lst)) - :group 'notdeft) - -(defcustom notdeft-sparse-directories nil - "Directories indexed only for specified files. -Complements `notdeft-directories', with the difference that -sparse directory contents are not managed, other than being -searchable and tracked. The elements of the directory list are of -the form (DIR . (FILE ...)) where each FILE is a path string -relative to DIR." - :type '(repeat (cons file (repeat string))) - :group 'notdeft) - -(defcustom notdeft-notename-function 'notdeft-default-title-to-notename - "Function for deriving a note name from a title. -Returns nil if no name can be derived from the argument." - :type 'function - :group 'notdeft) - -(defcustom notdeft-select-note-file-by-search nil - "Whether to do a search when selecting a note file. -Ignored if `notdeft-select-note-file-function' is non-nil, in -which case that function defines how selection is done." - :type 'boolean - :safe #'booleanp - :group 'notdeft) - -(defcustom notdeft-archive-directory "_archive" - "Sub-directory name for archived notes. -Should begin with '.', '_', or '#' to be excluded from -indexing for Xapian searches." - :type 'string - :safe #'stringp - :group 'notdeft) - -(defcustom notdeft-time-format " %Y-%m-%d %H:%M" - "Format string for modification times in the NotDeft browser. -Set to nil to hide." - :type '(choice (string :tag "Time format") - (const :tag "Hide" nil)) - :safe #'string-or-null-p - :group 'notdeft) - -(defcustom notdeft-file-display-function nil - "Formatter for file names in the NotDeft browser. -If a function, it must accept the filename and a maximum -width (as for `string-width') as its two arguments. Set to nil to -have no file information displayed." - :type '(choice (function :tag "Formatting function") - (const :tag "Hide" nil)) - :safe #'null - :group 'notdeft) - -(defcustom notdeft-allow-org-property-drawers t - "Whether to recognize Org property drawers. -If non-nil, then buffer-level Org \"PROPERTIES\" drawers are -treated as being part of the header of the note, which in -practice means that they are treated the same as comments." - :type 'boolean - :safe #'booleanp - :group 'notdeft) - -(defcustom notdeft-open-query-in-new-buffer nil - "Whether to open query results in a new buffer. -More specifically, when this variable is non-nil, the -`notdeft-open-query' command shows its matches in a freshly -created NotDeft buffer." - :type 'boolean - :safe #'booleanp - :group 'notdeft) - -(defcustom notdeft-cache-compaction-factor 20 - "Indicates file cache compaction frequency. -If nil, then no compaction takes place. If it is 0, then -compaction happens after every query. Otherwise the value should -be an integer specifying a limit for the cache size as a factor -of the maximum result set size. This value is ignored if the -Xapian backend is not in use, as in that case filtering requires -information about all files at all times." - :type '(choice (integer :tag "Times maximum") - (const :tag "Unlimited" nil)) - :safe (lambda (v) (or (not v) (numberp v))) - :group 'notdeft) - -;; Faces - -(defgroup notdeft-faces nil - "Faces used in NotDeft mode" - :group 'notdeft - :group 'faces) - -(defface notdeft-header-face - '((t :inherit font-lock-keyword-face :bold t)) - "Face for NotDeft header." - :group 'notdeft-faces) - -(defface notdeft-filter-string-face - '((t :inherit font-lock-string-face)) - "Face for NotDeft filter string." - :group 'notdeft-faces) - -(defface notdeft-title-face - '((t :inherit font-lock-function-name-face :bold t)) - "Face for NotDeft file titles." - :group 'notdeft-faces) - -(defface notdeft-separator-face - '((t :inherit font-lock-comment-delimiter-face)) - "Face for NotDeft separator string." - :group 'notdeft-faces) - -(defface notdeft-summary-face - '((t :inherit font-lock-comment-face)) - "Face for NotDeft file summary strings." - :group 'notdeft-faces) - -(defface notdeft-time-face - '((t :inherit font-lock-variable-name-face)) - "Face for NotDeft last modified times." - :group 'notdeft-faces) - -;; Internal requires - -(require 'notdeft-global) -(require 'notdeft-xapian) - -;; Constants - -(defconst notdeft-buffer "*NotDeft*" - "NotDeft buffer name.") - -(defconst notdeft-separator " --- " - "Text used to separate file titles and summaries.") - -;; Global variables - -(defvar notdeft-new-file-data-function 'notdeft-new-file-data - "Function for computing a new note's name and content. -Will be called for all new notes, but not ones that are renamed -or moved. Must return the note data as a (file-name . -content-data) pair, where the data part can be nil for an empty -note. The function must accept the parameters (DIR NOTENAME EXT -DATA TITLE). DIR is a non-nil directory path for the name. -NOTENAME may be nil if one has not been given for the new note. -EXT is a non-nil file name extension for the note. Note content -text DATA may be given for the new note, possibly for further -manipulation, but will be nil for an empty note. TITLE may be nil -if one has not been provided. Uniqueness of the constructed file -name should be ensured if desired, as otherwise note creation -will fail due to a naming conflict. See `notdeft-new-file-data' -for an example implementation.") - -(defvar notdeft-completing-read-history nil - "History of selected NotDeft note files. -May be used by `notdeft-completing-read-function' as the history -variable.") - -(defvar notdeft-completing-read-function - 'notdeft-ido-completing-read - "Function to use for note file selection. -The function is used in the sense of `completing-read' to pick a -file from a list. The function must take a list of file paths, -and an optional prompt. See `notdeft-ido-completing-read' for an -example implementation.") - -(defvar notdeft-select-note-file-query nil - "A note file selection option. -Some implementations of `notdeft-select-note-file-function' may -check the value of this variable. If it is non-nil it should be a -search query string.") - -(defvar notdeft-select-note-file-all nil - "Whether to select a note from all matches. -Setting this variable to a non-nil indicates that -`notdeft-select-note-file-function' should preferably offer all -the relevant notes for selection rather than just the most highly -ranked ones.") - -(defvar notdeft-select-note-file-function nil - "Function for selecting a note file. -Used generally when another operation needs a note file to be -selected, probably interactively. The function is called without -arguments. For example implementations, see -`notdeft-ido-select-note-file' and -`notdeft-search-select-note-file'.") - -(defvar notdeft-load-hook nil - "Hook run immediately after `notdeft' feature load.") - -(defvar notdeft-mode-hook nil - "Hook run when entering NotDeft mode.") - -(defvar notdeft-pre-refresh-hook nil - "Hook run before each `notdeft-refresh'.") - -(defvar notdeft-post-refresh-hook nil - "Hook run after each `notdeft-refresh'.") - -(defvar notdeft-xapian-query nil - "Current Xapian query string. -Where `notdeft-xapian-program' is available, it determines the -contents of `notdeft-all-files' for a NotDeft buffer. Local to -NotDeft mode buffers.") - -(defvar notdeft-filter-string nil - "Current filter string used by NotDeft. -A string that is treated as a list of whitespace-separated -strings (not regular expressions) that are required to match. -Local to a NotDeft mode buffer.") - -(defvar notdeft-dirlist-cache (make-hash-table :test 'equal) - "A cache of lists of notes in NotDeft directories. -NotDeft directory names as keys, in their -`notdeft-canonicalize-root' form. Lists of full note file names -as values. Only used with the dirlist backend, in which case this -data structure gets built instead of a search index.") - -(defvar notdeft-all-files nil - "List of all files to list or filter. -Local to a NotDeft mode buffer.") - -(defvar notdeft-current-files nil - "List of files matching current filter. -Local to a NotDeft mode buffer.") - -(defvar notdeft-hash-entries (make-hash-table :test 'equal) - "Hash containing file information, keyed by filename. -Each value is of the form (MTIME CONTENT TITLE SUMMARY).") - -(defvar notdeft-buffer-width nil - "Width of NotDeft buffer, as currently drawn, or nil. -Local to a NotDeft mode buffer.") - -(defvar notdeft-pending-reindex t - "Whether to do initial, one-off search indexing. -This is a global flag referenced by `notdeft-global-do-pending'. -For the search index to stay current for subsequent queries, use -only NotDeft mode, NotDeft note mode, and NotDeft commands for -making changes to a note collection.") - -(defvar notdeft-pending-updates 'requery - "Whether there are pending updates for a NotDeft buffer. -Either nil for no pending updates, the symbol `redraw' for a -pending redrawing of the buffer, the symbol `refilter' for a -pending recomputation of `notdeft-current-files', or the symbol -`requery' for a pending querying of `notdeft-all-files'. Local to -a NotDeft mode buffer.") - -;;; NotDeft directory information cache - -(defvar notdeft-dcache--cache nil - "A cache of directory information. -When set, contains a vector of form [MDIRS SDIRS ADIRS -SDIRS-FILES DIR-MAP], where all pathnames are canonicalized and -absolute, and where directory names are such also syntactically. -SDIRS-FILES is of the form ((SDIR . FILES) ...).") - -(defun notdeft-canonicalize-root (path) - "Canonicalize NotDeft directory PATH. -Converts the NotDeft directore PATH into the internal -representation used in `notdeft-dcache--cache'." - (file-name-as-directory (expand-file-name path))) - -(defun notdeft-dcache (&optional refresh) - "Get the value of the variable `notdeft-dcache--cache'. -Compute it if not yet done, or if REFRESH is true." - (when (or (not notdeft-dcache--cache) refresh) - (let* ((mdirs (mapcar #'notdeft-canonicalize-root notdeft-directories)) - (sfiles (mapcar (lambda (x) - (let* ((sdir (notdeft-canonicalize-root (car x))) - (files (mapcar - (lambda (file) - (expand-file-name file sdir)) - (cdr x)))) - (cons sdir files))) - notdeft-sparse-directories)) - (sdirs (mapcar #'car sfiles)) - (adirs (append mdirs sdirs)) - (dirmap (append - (mapcar (lambda (dir) - (cons (notdeft-canonicalize-root dir) dir)) - notdeft-directories) - (mapcar (lambda (dir) - (let ((dir (car dir))) - (cons (notdeft-canonicalize-root dir) dir))) - notdeft-sparse-directories)))) - (setq notdeft-dcache--cache (vector mdirs sdirs adirs sfiles dirmap)))) - notdeft-dcache--cache) - -(defun notdeft-dcache--root-to-original (root cache) - "Translate NotDeft ROOT to configured form. -Use information in CACHE to do that. That is, given a NotDeft -directory path in any form, return the form that it has in either -`notdeft-directories' or `notdeft-sparse-directories', or nil if -it does not." - (cdr (assoc (notdeft-canonicalize-root root) - (aref cache 4)))) - -(defun notdeft-dcache--roots (cache) - "Return all NotDeft roots in the CACHE. -The result includes both managed and sparse directory paths in -their canonical form." - (aref cache 2)) - -(defun notdeft-dcache--filter-roots (dirs cache) - "Filter NotDeft roots in DIRS. -Use information in CACHE. That is, functionally drop all DIRS -that are not NotDeft root directories. Return a filtered list -of directory paths in canonical form." - (let ((roots (aref cache 2))) - (delete nil - (mapcar (lambda (dir) - (let ((dir (notdeft-canonicalize-root dir))) - (when (member dir roots) - dir))) - dirs)))) - -(defun notdeft-dcache--expand-sparse-root (dir cache) - "Expand NotDeft root path DIR. -Use information in CACHE. Expand the DIR path into a -specification for the sparse directory. Return nil if it is not a -sparse root." - (assoc (notdeft-canonicalize-root dir) - (aref cache 3))) - -(defun notdeft-dcache--sparse-file-root (file cache) - "Resolve sparse FILE root directory. -More specifically, if FILE is a sparse NotDeft directory note -file, return its NotDeft directory in an absolute and canonical -form. Otherwise return nil. Assume FILE to be in an absolute, -canonical form. Use CACHE information for resolution." - (let ((sdirs-files (aref cache 3))) - (cl-some - (lambda (sdir-files) - (when (member file (cdr sdir-files)) - (car sdir-files))) - sdirs-files))) - -(defun notdeft-dcache--managed-file-root (file cache) - "Resolve managed FILE root directory. -Do this syntactically, using information in CACHE. More -specifically, if FILE names a managed NotDeft directory note -file, return its NotDeft directory in an absolute and canonical -form. Otherwise return nil. FILE must be in an absolute, -canonical form. The FILE name extension is not checked against -`notdeft-extension' and `notdeft-secondary-extensions', which may -be done separately on the argument if required. Also, it is not -checked that FILE is strictly under the returned root, rather -than the root itself, and that may also be done separately." - (let ((mdirs (aref cache 0))) - (cl-some - (lambda (dir) - (when (string-prefix-p dir file) - dir)) - mdirs))) - -(defun notdeft-dcache--strict-managed-file-root (file cache) - "Resolve managed FILE root, strictly, syntactically. -Return nil if FILE has no root, or if it itself names the root. -Otherwise return the root. Assume FILE to be in an absolute, -canonical form. Use CACHE information for resolution." - (let ((root (notdeft-dcache--managed-file-root file cache))) - (when (and root - (not (string= root (file-name-as-directory file)))) - root))) - -(defun notdeft-dcache--managed-file-subdir (file cache) - "Resolve managed FILE subdirectory. -That is, if FILE is syntactically in a subdirectory of a managed -NotDeft root, return the absolute and canonical directory path of -that subdirectory. Otherwise return nil. The result need not be -an immediate subdirectory of a NotDeft root. Assume FILE to be in -an absolute, canonical form. Use CACHE information for -resolution." - (let ((root (notdeft-dcache--strict-managed-file-root file cache))) - (when root - (let ((dir (file-name-as-directory - (file-name-directory file)))) - (unless (string= root dir) - dir))))) - -(defun notdeft-dcache--file-root (file cache) - "Resolve note FILE root, syntactically. -Return the NotDeft root directory, or nil if FILE is neither -under a managed or sparse NotDeft directory. Assume FILE to be in -an absolute, canonical form. Use CACHE information for -resolution." - (or (notdeft-dcache--strict-managed-file-root file cache) - (notdeft-dcache--sparse-file-root file cache))) - -(defun notdeft-dcache--sparse-file-by-basename (name cache) - "Resolve sparse note file by NAME. -Return the file's absolute, canonical pathname. If multiple such -files exist, return one of them. If none exist, return nil. NAME -is assumed to be without leading directory components, but with -any extension. Use CACHE information for resolution." - (let ((sdirs-files (aref cache 3))) - (cl-some - (lambda (sdir-files) - (let ((files (cdr sdir-files))) - (cl-some - (lambda (file) - (when (string= name (file-name-nondirectory file)) - file)) - files))) - sdirs-files))) - -;; File processing - -(defun notdeft-title-to-notename (str) - "Call `notdeft-notename-function' on STR." - (funcall notdeft-notename-function str)) - -(defun notdeft-default-title-to-notename (str) - "Turn a title string STR to a note name string. -Return that string, or nil if no usable name can be derived." - (save-match-data - (when (string-match "^[^a-zA-Z0-9-]+" str) - (setq str (replace-match "" t t str))) - (when (string-match "[^a-zA-Z0-9-]+$" str) - (setq str (replace-match "" t t str))) - (while (string-match "[`'“”\"]" str) - (setq str (replace-match "" t t str))) - (while (string-match "[^a-zA-Z0-9-]+" str) - (setq str (replace-match "-" t t str))) - (setq str (downcase str)) - (and (not (string= "" str)) str))) - -(defun notdeft-format-time-for-filename (tm) - "Format time TM suitably for filenames." - (format-time-string "%Y-%m-%d-%H-%M-%S" tm t)) ; UTC - -(defun notdeft-generate-notename () - "Generate a notename, and return it. -The generated name is not guaranteed to be unique. Format with -the format string \"Deft--%s\", whose placeholder is filled in -with a current time string, as formatted with -`notdeft-format-time-for-filename'. This is the NotDeft detault -naming for notes that are created without a title." - (let* ((ctime (current-time)) - (ctime-s (notdeft-format-time-for-filename ctime)) - (base-filename (format "Deft--%s" ctime-s))) - base-filename)) - -(defun notdeft-make-filename (notename &optional ext dir in-subdir) - "Derive a filename from NotDeft note name NOTENAME. -The filename shall have the extension EXT, defaulting to -`notdeft-extension'. The file shall reside in the directory -DIR (or a default directory computed by `notdeft-get-directory'), -except that IN-SUBDIR indicates that the file should be given its -own subdirectory." - (let ((root (or dir (notdeft-get-directory)))) - (concat (file-name-as-directory root) - (if in-subdir (file-name-as-directory notename) "") - notename "." (or ext notdeft-extension)))) - -(defun notdeft-generate-filename (&optional ext dir) - "Generate a new unique filename. -Do so without being given any information about note title or -content. Have the file have the extension EXT, and be in -directory DIR \(their defaults are as for -`notdeft-make-filename')." - (let (filename) - (while (or (not filename) - (file-exists-p filename)) - (let ((base-filename (notdeft-generate-notename))) - (setq filename (notdeft-make-filename base-filename ext dir)))) - filename)) - -(defun notdeft-new-file-data (dir notename ext data title) - "Generate a file name and data for a new note. -Use the directory path DIR, a note basename NOTENAME, and file -name extension EXT to construct a complete file name. Use DATA as -the note content, or just the TITLE if there is no other content. -Use NOTENAME as specified, or derive it from any TITLE with -`notdeft-title-to-notename'. Without either NOTENAME or TITLE, -use the current date and time to derive a name for a note, -attempting to construct a unique name." - (let* ((notename (or notename - (when title - (notdeft-title-to-notename title)))) - (file (if notename - (notdeft-make-filename notename ext dir) - (notdeft-generate-filename ext dir)))) - (cons file (or data title)))) - -(defun notdeft-make-file-re () - "Return a regexp matching strings with a NotDeft extension." - (let ((exts (cons notdeft-extension notdeft-secondary-extensions))) - (concat "\\.\\(?:" - (mapconcat #'regexp-quote exts "\\|") - "\\)$"))) - -(defun notdeft-strip-extension (file) - "Strip any NotDeft filename extension from FILE." - (replace-regexp-in-string (notdeft-make-file-re) "" file)) - -(defun notdeft-base-filename (file) - "Strip the leading path and NotDeft extension from filename FILE. -Use `file-name-directory' to get the directory component. -Strip any extension with `notdeft-strip-extension'." - (let* ((file (file-name-nondirectory file)) - (file (notdeft-strip-extension file))) - file)) - -(defun notdeft-file-equal-p (x y) - "Whether X and Y are the same file. -Compare based on path names only, without consulting the -filesystem, unlike `file-equal-p'. Disregard directory syntax, so -that \"x\" is equal to \"x/\"." - (string= (file-name-as-directory (expand-file-name x)) - (file-name-as-directory (expand-file-name y)))) - -(defun notdeft-file-in-directory-p (file dir) - "Whether FILE is in DIR, syntactically. -A directory is considered to be in itself. -Compare based on path names only, without consulting the -filesystem, unlike `file-in-directory-p'." - (let ((dir (file-name-as-directory (expand-file-name dir))) - (file (file-name-as-directory (expand-file-name file)))) - (string-prefix-p dir file))) - -(defun notdeft-file-strictly-in-directory-p (file dir) - "Whether FILE is strictly in DIR, syntactically. -Like `notdeft-file-in-directory-p', but a directory is not -considered to be in itself." - (let ((dir (file-name-as-directory (expand-file-name dir))) - (file (file-name-as-directory (expand-file-name file)))) - (and (string-prefix-p dir file) - (not (string= dir file))))) - -(defun notdeft-file-member (file list) - "Whether FILE is a member of LIST. -Comparisons are syntactic only. -Return the matching member of the list, or nil." - (cl-some (lambda (elem) - (when (notdeft-file-equal-p file elem) - elem)) - list)) - -(defun notdeft-dir-of-file (file) - "Return the NotDeft directory for FILE, or nil. -FILE may not itself be one of the NotDeft roots. -Compare syntactically, without consulting the file system." - (notdeft-dcache--file-root - (expand-file-name file) (notdeft-dcache))) - -(defun notdeft-file-sparse-p (file) - "Whether FILE is in a sparse NotDeft directory." - (notdeft-dcache--sparse-file-root - (expand-file-name file) (notdeft-dcache))) - -(defun notdeft-file-in-subdir-p (file) - "Whether FILE is in a NotDeft sub-directory. -More accurately, whether FILE syntactically names a file or -directory that is not an immediate child of one of the -`notdeft-directories'. FILE need not actually exist for this -predicate to hold, nor does the containing NotDeft directory." - (notdeft-dcache--managed-file-subdir - (expand-file-name file) (notdeft-dcache))) - -(defun notdeft-file-readable-p (file) - "Whether FILE is a readable non-directory." - (and (file-readable-p file) - (not (file-directory-p file)))) - -(defun notdeft-read-file (file) - "Return the contents of FILE as a string." - (with-temp-buffer - (insert-file-contents file) - (buffer-string))) - -(defun notdeft-title-from-file-content (file) - "Extract a title from FILE content. -Return nil on failure." - (when (notdeft-file-readable-p file) - (let* ((contents (notdeft-read-file file)) - (title (notdeft-parse-title contents))) - title))) - -(defun notdeft-chomp (str) - "Trim leading and trailing whitespace from STR." - (replace-regexp-in-string - "\\(\\`[[:space:]\n\r]+\\|[[:space:]\n\r]+\\'\\)" - "" str)) - -;;;###autoload -(defun notdeft-chomp-nullify (str &optional trim) - "Return string STR if non-empty, otherwise return nil. -Optionally, use function TRIM to trim any result string." - (when str - (let ((str (notdeft-chomp str))) - (unless (string= "" str) - (if trim (funcall trim str) str))))) - -(defvar notdeft-directory-files-regexp "^[^._#/][^/]*$" - "A match regexp for `directory-files'. -The regular expression to use as the third argument when calling -`directory-files' to look for notes and note subdirectories from -the file system. This should be specified to that it is -consistent with the Xapian program's filtering of readdir -results.") - -(defun notdeft-root-find-file (file-p root) - "Find a file matching predicate FILE-P under ROOT. -FILE-P is called with the file path name \(including the ROOT -component) as its sole argument. ROOT is assumed to be a NotDeft -root, which need not exist. Return nil if no matching file is -found." - (and - (file-readable-p root) - (file-directory-p root) - (let ((root (file-name-as-directory root)) - (files (directory-files root nil - notdeft-directory-files-regexp t)) - result) - (while (and files (not result)) - (let* ((abs-file (concat root (car files)))) - (setq files (cdr files)) - (cond - ((file-directory-p abs-file) - (setq result (notdeft-root-find-file file-p abs-file))) - ((funcall file-p abs-file) - (setq result abs-file))))) - result))) - -(defun notdeft-file-by-basename (name) - "Resolve a NotDeft note NAME to a full pathname. -NAME is a non-directory filename, with extension. Resolve it to -the path of a file under `notdeft-directories' or -`notdeft-sparse-directories', if such a note file does exist. If -multiple such files exist, return one of them. If none exist, -return nil." - (or (notdeft-managed-file-by-basename name) - (notdeft-dcache--sparse-file-by-basename - name (notdeft-dcache)))) - -(defun notdeft-managed-file-by-basename (name) - "Resolve managed note file by basename NAME." - (let* ((file-p (lambda (pn) - (string= name (file-name-nondirectory pn)))) - (cand-roots notdeft-directories) - result) - (while (and cand-roots (not result)) - (let ((abs-root (expand-file-name (car cand-roots)))) - (setq cand-roots (cdr cand-roots)) - (setq result (notdeft-root-find-file file-p abs-root)))) - result)) - -(defun notdeft-glob (root &optional dir result file-re) - "Return a list of all NotDeft files in a directory tree. -List the NotDeft files under the specified NotDeft ROOT and its -directory DIR, with DIR given as a path relative to the directory -ROOT. If DIR is nil, then list NotDeft files under ROOT. Add to -the RESULT list in undefined order, and return the resulting -value. Only include files whose non-directory names match the -regexp FILE-RE, defaulting to the result of -`notdeft-make-file-re'. If ROOT does not exist, return nil." - (let* ((root (file-name-as-directory (expand-file-name root))) - (dir (file-name-as-directory (or dir "."))) - (abs-dir (expand-file-name dir root))) - (and - (file-readable-p abs-dir) - (file-directory-p abs-dir) - (let* ((files (directory-files abs-dir nil - notdeft-directory-files-regexp t)) - (file-re (or file-re (notdeft-make-file-re)))) - (dolist (file files result) - (let* ((rel-file (file-relative-name - (expand-file-name file abs-dir) - root)) - (abs-file (concat root rel-file))) - (cond - ((file-directory-p abs-file) - (setq result (notdeft-glob root rel-file result file-re))) - ((string-match-p file-re file) - (setq result (cons rel-file result)))))))))) - -(defun notdeft-glob--absolute (root &optional dir result file-re) - "Like `notdeft-glob', but return the results as absolute paths. -The arguments ROOT, DIR, RESULT, and FILE-RE are the same." - (mapcar - (lambda (rel) - (expand-file-name rel root)) - (notdeft-glob root dir result file-re))) - -(defun notdeft-find-all-files-in-dir (dir full) - "Return a list of all NotDeft files under DIR. -The specified directory must be a NotDeft root. -Return an empty list if there is no readable directory. -Return the files' absolute paths if FULL is true." - (if full - (notdeft-glob--absolute dir) - (notdeft-glob dir))) - -(defun notdeft-make-basename-list () - "Return the names of all NotDeft notes. -Search all existing `notdeft-directories', and include all -existing `notdeft-sparse-directories' files. The result list is -sorted by the `string-lessp' relation, and it may contain -duplicates." - (let ((fn-lst '())) - (dolist (dir notdeft-directories) - (setq fn-lst - (append fn-lst - (notdeft-find-all-files-in-dir dir t)))) - (dolist (sdir-files notdeft-sparse-directories) - (let ((dir (car sdir-files)) - (files (cdr sdir-files))) - (dolist (file files) - (let ((file (expand-file-name file dir))) - (when (file-exists-p file) - (setq fn-lst (cons file fn-lst))))))) - ;; `sort` may modify `name-lst` - (let ((name-lst (mapcar #'file-name-nondirectory fn-lst))) - (sort name-lst 'string-lessp)))) - -(defun notdeft-parse-title (contents) - "Parse the given file CONTENTS and determine the title. -The title is taken to be the first non-empty line of a file. -Org comments are skipped, and \"#+TITLE\" syntax is recognized, -and may also be used to define the title. -Returns nil if there is no non-empty, not-just-whitespace -title in CONTENTS." - (let* ((res (with-temp-buffer - (insert contents) - (notdeft-parse-buffer))) - (title (car res))) - title)) - -(defun notdeft-condense-whitespace (str) - "Condense whitespace in STR into a single space." - (replace-regexp-in-string "[[:space:]\n\r]+" " " str)) - -(defun notdeft-parse-buffer () - "Parse the file contents in the current buffer. -Extract a title and summary. -The summary is a string extracted from the contents following the -title. The result is a list (TITLE SUMMARY KEYWORDS) where any -component may be nil. The result list may include additional, -undefined components." - (let (title summary keywords dbg (end (point-max))) - (save-match-data - (save-excursion - (goto-char (point-min)) - (while (and (< (point) end) (not (and title summary))) - ;;(message "%S" (list (point) title summary)) - (cond - ((looking-at "^\\(?:%\\|@;\\|