add helpful.el for a better help buffer
This commit is contained in:
863
lisp/elisp-refs.el
Normal file
863
lisp/elisp-refs.el
Normal file
@@ -0,0 +1,863 @@
|
||||
;;; elisp-refs.el --- find callers of elisp functions or macros -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2016-2020 Wilfred Hughes <me@wilfred.me.uk>
|
||||
|
||||
;; Author: Wilfred Hughes <me@wilfred.me.uk>
|
||||
;; Version: 1.4
|
||||
;; Package-Version: 20211009.1531
|
||||
;; Package-Commit: c06aec4486c034d0d4efae98cb7054749f9cc0ec
|
||||
;; Keywords: lisp
|
||||
;; Package-Requires: ((dash "2.12.0") (s "1.11.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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; elisp-refs.el is an Emacs package for finding references to
|
||||
;; functions, macros or variables. Unlike a dumb text search,
|
||||
;; elisp-refs.el actually parses the code, so it's never confused by
|
||||
;; comments or `foo-bar' matching `foo'.
|
||||
;;
|
||||
;; See https://github.com/Wilfred/refs.el/blob/master/README.md for
|
||||
;; more information.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'dash)
|
||||
(require 's)
|
||||
(require 'format)
|
||||
(eval-when-compile (require 'cl-lib))
|
||||
|
||||
;;; Internal
|
||||
|
||||
(defvar elisp-refs-verbose t)
|
||||
|
||||
(defun elisp-refs--format-int (integer)
|
||||
"Format INTEGER as a string, with , separating thousands."
|
||||
(let ((number (abs integer))
|
||||
(parts nil))
|
||||
(while (> number 999)
|
||||
(push (format "%03d" (mod number 1000))
|
||||
parts)
|
||||
(setq number (/ number 1000)))
|
||||
(push (format "%d" number) parts)
|
||||
(concat
|
||||
(if (< integer 0) "-" "")
|
||||
(s-join "," parts))))
|
||||
|
||||
(defsubst elisp-refs--start-pos (end-pos)
|
||||
"Find the start position of form ending at END-POS
|
||||
in the current buffer."
|
||||
(let ((parse-sexp-ignore-comments t))
|
||||
(scan-sexps end-pos -1)))
|
||||
|
||||
(defun elisp-refs--sexp-positions (buffer start-pos end-pos)
|
||||
"Return a list of start and end positions of all the sexps
|
||||
between START-POS and END-POS (inclusive) in BUFFER.
|
||||
|
||||
Positions exclude quote characters, so given 'foo or `foo, we
|
||||
report the position of the f.
|
||||
|
||||
Not recursive, so we don't consider subelements of nested sexps."
|
||||
(let ((positions nil))
|
||||
(with-current-buffer buffer
|
||||
(condition-case _err
|
||||
(catch 'done
|
||||
(while t
|
||||
(let* ((sexp-end-pos (let ((parse-sexp-ignore-comments t))
|
||||
(scan-sexps start-pos 1))))
|
||||
;; If we've reached a sexp beyond the range requested,
|
||||
;; or if there are no sexps left, we're done.
|
||||
(when (or (null sexp-end-pos) (> sexp-end-pos end-pos))
|
||||
(throw 'done nil))
|
||||
;; Otherwise, this sexp is in the range requested.
|
||||
(push (list (elisp-refs--start-pos sexp-end-pos) sexp-end-pos)
|
||||
positions)
|
||||
(setq start-pos sexp-end-pos))))
|
||||
;; Terminate when we see "Containing expression ends prematurely"
|
||||
(scan-error nil)))
|
||||
(nreverse positions)))
|
||||
|
||||
(defun elisp-refs--read-buffer-form ()
|
||||
"Read a form from the current buffer, starting at point.
|
||||
Returns a list:
|
||||
\(form form-start-pos form-end-pos symbol-positions read-start-pos)
|
||||
|
||||
SYMBOL-POSITIONS are 0-indexed, relative to READ-START-POS."
|
||||
(let* ((read-with-symbol-positions t)
|
||||
(read-start-pos (point))
|
||||
(form (read (current-buffer)))
|
||||
(end-pos (point))
|
||||
(start-pos (elisp-refs--start-pos end-pos)))
|
||||
(list form start-pos end-pos read-symbol-positions-list read-start-pos)))
|
||||
|
||||
(defvar elisp-refs--path nil
|
||||
"A buffer-local variable used by `elisp-refs--contents-buffer'.
|
||||
Internal implementation detail.")
|
||||
|
||||
(defun elisp-refs--read-all-buffer-forms (buffer)
|
||||
"Read all the forms in BUFFER, along with their positions."
|
||||
(with-current-buffer buffer
|
||||
(goto-char (point-min))
|
||||
(let ((forms nil))
|
||||
(condition-case err
|
||||
(while t
|
||||
(push (elisp-refs--read-buffer-form) forms))
|
||||
(error
|
||||
(if (or (equal (car err) 'end-of-file)
|
||||
;; TODO: this shouldn't occur in valid elisp files,
|
||||
;; but it's happening in helm-utils.el.
|
||||
(equal (car err) 'scan-error))
|
||||
;; Reached end of file, we're done.
|
||||
(nreverse forms)
|
||||
;; Some unexpected error, propagate.
|
||||
(error "Unexpected error whilst reading %s position %s: %s"
|
||||
(abbreviate-file-name elisp-refs--path) (point) err)))))))
|
||||
|
||||
(defun elisp-refs--proper-list-p (val)
|
||||
"Is VAL a proper list?"
|
||||
(if (fboundp 'format-proper-list-p)
|
||||
;; Emacs stable.
|
||||
(with-no-warnings (format-proper-list-p val))
|
||||
;; Function was renamed in Emacs master:
|
||||
;; http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=2fde6275b69fd113e78243790bf112bbdd2fe2bf
|
||||
(with-no-warnings (proper-list-p val))))
|
||||
|
||||
(defun elisp-refs--walk (buffer form start-pos end-pos symbol match-p &optional path)
|
||||
"Walk FORM, a nested list, and return a list of sublists (with
|
||||
their positions) where MATCH-P returns t. FORM is traversed
|
||||
depth-first (pre-order traversal, left-to-right).
|
||||
|
||||
MATCH-P is called with three arguments:
|
||||
\(SYMBOL CURRENT-FORM PATH).
|
||||
|
||||
PATH is the first element of all the enclosing forms of
|
||||
CURRENT-FORM, innermost first, along with the index of the
|
||||
current form.
|
||||
|
||||
For example if we are looking at h in (e f (g h)), PATH takes the
|
||||
value ((g . 1) (e . 2)).
|
||||
|
||||
START-POS and END-POS should be the position of FORM within BUFFER."
|
||||
(cond
|
||||
((funcall match-p symbol form path)
|
||||
;; If this form matches, just return it, along with the position.
|
||||
(list (list form start-pos end-pos)))
|
||||
;; Otherwise, recurse on the subforms.
|
||||
((consp form)
|
||||
(let ((matches nil)
|
||||
;; Find the positions of the subforms.
|
||||
(subforms-positions
|
||||
(if (eq (car-safe form) '\`)
|
||||
;; Kludge: `elisp-refs--sexp-positions' excludes the ` when
|
||||
;; calculating positions. So, to find the inner
|
||||
;; positions when walking from `(...) to (...), we
|
||||
;; don't need to increment the start position.
|
||||
(cons nil (elisp-refs--sexp-positions buffer start-pos end-pos))
|
||||
;; Calculate the positions after the opening paren.
|
||||
(elisp-refs--sexp-positions buffer (1+ start-pos) end-pos))))
|
||||
;; For each subform, recurse if it's a list, or a matching symbol.
|
||||
(--each (-zip form subforms-positions)
|
||||
(-let [(subform subform-start subform-end) it]
|
||||
(when (or
|
||||
(and (consp subform) (elisp-refs--proper-list-p subform))
|
||||
(and (symbolp subform) (eq subform symbol)))
|
||||
(-when-let (subform-matches
|
||||
(elisp-refs--walk
|
||||
buffer subform
|
||||
subform-start subform-end
|
||||
symbol match-p
|
||||
(cons (cons (car-safe form) it-index) path)))
|
||||
(push subform-matches matches)))))
|
||||
|
||||
;; Concat the results from all the subforms.
|
||||
(apply #'append (nreverse matches))))))
|
||||
|
||||
;; TODO: condition-case (condition-case ... (error ...)) is not a call
|
||||
;; TODO: (cl-destructuring-bind (foo &rest bar) ...) is not a call
|
||||
;; TODO: letf, cl-letf, -let, -let*
|
||||
(defun elisp-refs--function-p (symbol form path)
|
||||
"Return t if FORM looks like a function call to SYMBOL."
|
||||
(cond
|
||||
((not (consp form))
|
||||
nil)
|
||||
;; Ignore (defun _ (SYMBOL ...) ...)
|
||||
((or (equal (car path) '(defsubst . 2))
|
||||
(equal (car path) '(defun . 2))
|
||||
(equal (car path) '(defmacro . 2))
|
||||
(equal (car path) '(cl-defun . 2)))
|
||||
nil)
|
||||
;; Ignore (lambda (SYMBOL ...) ...)
|
||||
((equal (car path) '(lambda . 1))
|
||||
nil)
|
||||
;; Ignore (let (SYMBOL ...) ...)
|
||||
;; and (let* (SYMBOL ...) ...)
|
||||
((or
|
||||
(equal (car path) '(let . 1))
|
||||
(equal (car path) '(let* . 1)))
|
||||
nil)
|
||||
;; Ignore (let ((SYMBOL ...)) ...)
|
||||
((or
|
||||
(equal (cl-second path) '(let . 1))
|
||||
(equal (cl-second path) '(let* . 1)))
|
||||
nil)
|
||||
;; Ignore (declare-function NAME (ARGS...))
|
||||
((equal (car path) '(declare-function . 3))
|
||||
nil)
|
||||
;; (SYMBOL ...)
|
||||
((eq (car form) symbol)
|
||||
t)
|
||||
;; (foo ... #'SYMBOL ...)
|
||||
((--any-p (equal it (list 'function symbol)) form)
|
||||
t)
|
||||
;; (funcall 'SYMBOL ...)
|
||||
((and (eq (car form) 'funcall)
|
||||
(equal `',symbol (cl-second form)))
|
||||
t)
|
||||
;; (apply 'SYMBOL ...)
|
||||
((and (eq (car form) 'apply)
|
||||
(equal `',symbol (cl-second form)))
|
||||
t)))
|
||||
|
||||
(defun elisp-refs--macro-p (symbol form path)
|
||||
"Return t if FORM looks like a macro call to SYMBOL."
|
||||
(cond
|
||||
((not (consp form))
|
||||
nil)
|
||||
;; Ignore (defun _ (SYMBOL ...) ...)
|
||||
((or (equal (car path) '(defsubst . 2))
|
||||
(equal (car path) '(defun . 2))
|
||||
(equal (car path) '(defmacro . 2)))
|
||||
nil)
|
||||
;; Ignore (lambda (SYMBOL ...) ...)
|
||||
((equal (car path) '(lambda . 1))
|
||||
nil)
|
||||
;; Ignore (let (SYMBOL ...) ...)
|
||||
;; and (let* (SYMBOL ...) ...)
|
||||
((or
|
||||
(equal (car path) '(let . 1))
|
||||
(equal (car path) '(let* . 1)))
|
||||
nil)
|
||||
;; Ignore (let ((SYMBOL ...)) ...)
|
||||
((or
|
||||
(equal (cl-second path) '(let . 1))
|
||||
(equal (cl-second path) '(let* . 1)))
|
||||
nil)
|
||||
;; (SYMBOL ...)
|
||||
((eq (car form) symbol)
|
||||
t)))
|
||||
|
||||
;; Looking for a special form is exactly the same as looking for a
|
||||
;; macro.
|
||||
(defalias 'elisp-refs--special-p 'elisp-refs--macro-p)
|
||||
|
||||
(defun elisp-refs--variable-p (symbol form path)
|
||||
"Return t if this looks like a variable reference to SYMBOL.
|
||||
We consider parameters to be variables too."
|
||||
(cond
|
||||
((consp form)
|
||||
nil)
|
||||
;; Ignore (defun _ (SYMBOL ...) ...)
|
||||
((or (equal (car path) '(defsubst . 1))
|
||||
(equal (car path) '(defun . 1))
|
||||
(equal (car path) '(defmacro . 1))
|
||||
(equal (car path) '(cl-defun . 1)))
|
||||
nil)
|
||||
;; (let (SYMBOL ...) ...) is a variable, not a function call.
|
||||
((or
|
||||
(equal (cl-second path) '(let . 1))
|
||||
(equal (cl-second path) '(let* . 1)))
|
||||
t)
|
||||
;; (lambda (SYMBOL ...) ...) is a variable
|
||||
((equal (cl-second path) '(lambda . 1))
|
||||
t)
|
||||
;; (let ((SYMBOL ...)) ...) is also a variable.
|
||||
((or
|
||||
(equal (cl-third path) '(let . 1))
|
||||
(equal (cl-third path) '(let* . 1)))
|
||||
t)
|
||||
;; Ignore (SYMBOL ...) otherwise, we assume it's a function/macro
|
||||
;; call.
|
||||
((equal (car path) (cons symbol 0))
|
||||
nil)
|
||||
((eq form symbol)
|
||||
t)))
|
||||
|
||||
;; TODO: benchmark building a list with `push' rather than using
|
||||
;; mapcat.
|
||||
(defun elisp-refs--read-and-find (buffer symbol match-p)
|
||||
"Read all the forms in BUFFER, and return a list of all forms that
|
||||
contain SYMBOL where MATCH-P returns t.
|
||||
|
||||
For every matching form found, we return the form itself along
|
||||
with its start and end position."
|
||||
(-non-nil
|
||||
(--mapcat
|
||||
(-let [(form start-pos end-pos symbol-positions _read-start-pos) it]
|
||||
;; Optimisation: don't bother walking a form if contains no
|
||||
;; references to the symbol we're looking for.
|
||||
(when (assq symbol symbol-positions)
|
||||
(elisp-refs--walk buffer form start-pos end-pos symbol match-p)))
|
||||
(elisp-refs--read-all-buffer-forms buffer))))
|
||||
|
||||
(defun elisp-refs--read-and-find-symbol (buffer symbol)
|
||||
"Read all the forms in BUFFER, and return a list of all
|
||||
positions of SYMBOL."
|
||||
(-non-nil
|
||||
(--mapcat
|
||||
(-let [(_ _ _ symbol-positions read-start-pos) it]
|
||||
(--map
|
||||
(-let [(sym . offset) it]
|
||||
(when (eq sym symbol)
|
||||
(-let* ((start-pos (+ read-start-pos offset))
|
||||
(end-pos (+ start-pos (length (symbol-name sym)))))
|
||||
(list sym start-pos end-pos))))
|
||||
symbol-positions))
|
||||
|
||||
(elisp-refs--read-all-buffer-forms buffer))))
|
||||
|
||||
(defun elisp-refs--filter-obarray (pred)
|
||||
"Return a list of all the items in `obarray' where PRED returns t."
|
||||
(let (symbols)
|
||||
(mapatoms (lambda (symbol)
|
||||
(when (and (funcall pred symbol)
|
||||
(not (equal (symbol-name symbol) "")))
|
||||
(push symbol symbols))))
|
||||
symbols))
|
||||
|
||||
(defun elisp-refs--loaded-paths ()
|
||||
"Return a list of all files that have been loaded in Emacs.
|
||||
Where the file was a .elc, return the path to the .el file instead."
|
||||
(let ((elc-paths (-non-nil (mapcar #'-first-item load-history))))
|
||||
(-non-nil
|
||||
(--map
|
||||
(let ((el-name (format "%s.el" (file-name-sans-extension it)))
|
||||
(el-gz-name (format "%s.el.gz" (file-name-sans-extension it))))
|
||||
(cond ((file-exists-p el-name) el-name)
|
||||
((file-exists-p el-gz-name) el-gz-name)
|
||||
;; Ignore files where we can't find a .el file.
|
||||
(t nil)))
|
||||
elc-paths))))
|
||||
|
||||
(defun elisp-refs--contents-buffer (path)
|
||||
"Read PATH into a disposable buffer, and return it.
|
||||
Works around the fact that Emacs won't allow multiple buffers
|
||||
visiting the same file."
|
||||
(let ((fresh-buffer (generate-new-buffer (format " *refs-%s*" path)))
|
||||
;; Be defensive against users overriding encoding
|
||||
;; configurations (Helpful bugs #75 and #147).
|
||||
(coding-system-for-read nil)
|
||||
(file-name-handler-alist
|
||||
'(("\\(?:\\.dz\\|\\.txz\\|\\.xz\\|\\.lzma\\|\\.lz\\|\\.g?z\\|\\.\\(?:tgz\\|svgz\\|sifz\\)\\|\\.tbz2?\\|\\.bz2\\|\\.Z\\)\\(?:~\\|\\.~[-[:alnum:]:#@^._]+\\(?:~[[:digit:]]+\\)?~\\)?\\'" .
|
||||
jka-compr-handler)
|
||||
("\\`/:" . file-name-non-special))))
|
||||
(with-current-buffer fresh-buffer
|
||||
(setq-local elisp-refs--path path)
|
||||
(insert-file-contents path)
|
||||
;; We don't enable emacs-lisp-mode because it slows down this
|
||||
;; function significantly. We just need the syntax table for
|
||||
;; scan-sexps to do the right thing with comments.
|
||||
(set-syntax-table emacs-lisp-mode-syntax-table))
|
||||
fresh-buffer))
|
||||
|
||||
(defvar elisp-refs--highlighting-buffer
|
||||
nil
|
||||
"A temporary buffer used for highlighting.
|
||||
Since `elisp-refs--syntax-highlight' is a hot function, we
|
||||
don't want to create lots of temporary buffers.")
|
||||
|
||||
(defun elisp-refs--syntax-highlight (str)
|
||||
"Apply font-lock properties to a string STR of Emacs lisp code."
|
||||
;; Ensure we have a highlighting buffer to work with.
|
||||
(unless (and elisp-refs--highlighting-buffer
|
||||
(buffer-live-p elisp-refs--highlighting-buffer))
|
||||
(setq elisp-refs--highlighting-buffer
|
||||
(generate-new-buffer " *refs-highlighting*"))
|
||||
(with-current-buffer elisp-refs--highlighting-buffer
|
||||
(delay-mode-hooks (emacs-lisp-mode))))
|
||||
|
||||
(with-current-buffer elisp-refs--highlighting-buffer
|
||||
(erase-buffer)
|
||||
(insert str)
|
||||
(if (fboundp 'font-lock-ensure)
|
||||
(font-lock-ensure)
|
||||
(with-no-warnings
|
||||
(font-lock-fontify-buffer)))
|
||||
(buffer-string)))
|
||||
|
||||
(defun elisp-refs--replace-tabs (string)
|
||||
"Replace tabs in STRING with spaces."
|
||||
;; This is important for unindenting, as we may unindent by less
|
||||
;; than one whole tab.
|
||||
(s-replace "\t" (s-repeat tab-width " ") string))
|
||||
|
||||
(defun elisp-refs--lines (string)
|
||||
"Return a list of all the lines in STRING.
|
||||
'a\nb' -> ('a\n' 'b')"
|
||||
(let ((lines nil))
|
||||
(while (> (length string) 0)
|
||||
(let ((index (s-index-of "\n" string)))
|
||||
(if index
|
||||
(progn
|
||||
(push (substring string 0 (1+ index)) lines)
|
||||
(setq string (substring string (1+ index))))
|
||||
(push string lines)
|
||||
(setq string ""))))
|
||||
(nreverse lines)))
|
||||
|
||||
(defun elisp-refs--map-lines (string fn)
|
||||
"Execute FN for each line in string, and join the result together."
|
||||
(let ((result nil))
|
||||
(dolist (line (elisp-refs--lines string))
|
||||
(push (funcall fn line) result))
|
||||
(apply #'concat (nreverse result))))
|
||||
|
||||
(defun elisp-refs--unindent-rigidly (string)
|
||||
"Given an indented STRING, unindent rigidly until
|
||||
at least one line has no indent.
|
||||
|
||||
STRING should have a 'elisp-refs-start-pos property. The returned
|
||||
string will have this property updated to reflect the unindent."
|
||||
(let* ((lines (s-lines string))
|
||||
;; Get the leading whitespace for each line.
|
||||
(indents (--map (car (s-match (rx bos (+ whitespace)) it))
|
||||
lines))
|
||||
(min-indent (-min (--map (length it) indents))))
|
||||
(propertize
|
||||
(elisp-refs--map-lines
|
||||
string
|
||||
(lambda (line) (substring line min-indent)))
|
||||
'elisp-refs-unindented min-indent)))
|
||||
|
||||
(defun elisp-refs--containing-lines (buffer start-pos end-pos)
|
||||
"Return a string, all the lines in BUFFER that are between
|
||||
START-POS and END-POS (inclusive).
|
||||
|
||||
For the characters that are between START-POS and END-POS,
|
||||
propertize them."
|
||||
(let (expanded-start-pos expanded-end-pos)
|
||||
(with-current-buffer buffer
|
||||
;; Expand START-POS and END-POS to line boundaries.
|
||||
(goto-char start-pos)
|
||||
(beginning-of-line)
|
||||
(setq expanded-start-pos (point))
|
||||
(goto-char end-pos)
|
||||
(end-of-line)
|
||||
(setq expanded-end-pos (point))
|
||||
|
||||
;; Extract the rest of the line before and after the section we're interested in.
|
||||
(let* ((before-match (buffer-substring expanded-start-pos start-pos))
|
||||
(after-match (buffer-substring end-pos expanded-end-pos))
|
||||
;; Concat the extra text with the actual match, ensuring we
|
||||
;; highlight the match as code, but highlight the rest as as
|
||||
;; comments.
|
||||
(text (concat
|
||||
(propertize before-match
|
||||
'face 'font-lock-comment-face)
|
||||
(elisp-refs--syntax-highlight (buffer-substring start-pos end-pos))
|
||||
(propertize after-match
|
||||
'face 'font-lock-comment-face))))
|
||||
(-> text
|
||||
(elisp-refs--replace-tabs)
|
||||
(elisp-refs--unindent-rigidly)
|
||||
(propertize 'elisp-refs-start-pos expanded-start-pos
|
||||
'elisp-refs-path elisp-refs--path))))))
|
||||
|
||||
(defun elisp-refs--find-file (button)
|
||||
"Open the file referenced by BUTTON."
|
||||
(find-file (button-get button 'path))
|
||||
(goto-char (point-min)))
|
||||
|
||||
(define-button-type 'elisp-refs-path-button
|
||||
'action 'elisp-refs--find-file
|
||||
'follow-link t
|
||||
'help-echo "Open file")
|
||||
|
||||
(defun elisp-refs--path-button (path)
|
||||
"Return a button that navigates to PATH."
|
||||
(with-temp-buffer
|
||||
(insert-text-button
|
||||
(abbreviate-file-name path)
|
||||
:type 'elisp-refs-path-button
|
||||
'path path)
|
||||
(buffer-string)))
|
||||
|
||||
(defun elisp-refs--describe (button)
|
||||
"Show *Help* for the symbol referenced by BUTTON."
|
||||
(let ((symbol (button-get button 'symbol))
|
||||
(kind (button-get button 'kind)))
|
||||
(cond ((eq kind 'symbol)
|
||||
(describe-symbol symbol))
|
||||
((eq kind 'variable)
|
||||
(describe-variable symbol))
|
||||
(t
|
||||
;; Emacs uses `describe-function' for functions, macros and
|
||||
;; special forms.
|
||||
(describe-function symbol)))))
|
||||
|
||||
(define-button-type 'elisp-refs-describe-button
|
||||
'action 'elisp-refs--describe
|
||||
'follow-link t
|
||||
'help-echo "Describe")
|
||||
|
||||
(defun elisp-refs--describe-button (symbol kind)
|
||||
"Return a button that shows *Help* for SYMBOL.
|
||||
KIND should be 'function, 'macro, 'variable, 'special or 'symbol."
|
||||
(with-temp-buffer
|
||||
(insert (symbol-name kind) " ")
|
||||
(insert-text-button
|
||||
(symbol-name symbol)
|
||||
:type 'elisp-refs-describe-button
|
||||
'symbol symbol
|
||||
'kind kind)
|
||||
(buffer-string)))
|
||||
|
||||
(defun elisp-refs--pluralize (number thing)
|
||||
"Human-friendly description of NUMBER occurrences of THING."
|
||||
(format "%s %s%s"
|
||||
(elisp-refs--format-int number)
|
||||
thing
|
||||
(if (equal number 1) "" "s")))
|
||||
|
||||
(defun elisp-refs--format-count (symbol ref-count file-count
|
||||
searched-file-count prefix)
|
||||
(let* ((file-str (if (zerop file-count)
|
||||
""
|
||||
(format " in %s" (elisp-refs--pluralize file-count "file"))))
|
||||
(found-str (format "Found %s to %s%s."
|
||||
(elisp-refs--pluralize ref-count "reference")
|
||||
symbol
|
||||
file-str))
|
||||
(searched-str (if prefix
|
||||
(format "Searched %s in %s."
|
||||
(elisp-refs--pluralize searched-file-count "loaded file")
|
||||
(elisp-refs--path-button (file-name-as-directory prefix)))
|
||||
(format "Searched all %s loaded in Emacs."
|
||||
(elisp-refs--pluralize searched-file-count "file")))))
|
||||
(s-word-wrap 70 (format "%s %s" found-str searched-str))))
|
||||
|
||||
;; TODO: if we have multiple matches on one line, we repeatedly show
|
||||
;; that line. That's slightly confusing.
|
||||
(defun elisp-refs--show-results (symbol description results
|
||||
searched-file-count prefix)
|
||||
"Given a RESULTS list where each element takes the form \(forms . buffer\),
|
||||
render a friendly results buffer."
|
||||
(let ((buf (get-buffer-create (format "*refs: %s*" symbol))))
|
||||
(switch-to-buffer buf)
|
||||
(let ((inhibit-read-only t))
|
||||
(erase-buffer)
|
||||
(save-excursion
|
||||
;; Insert the header.
|
||||
(insert
|
||||
(elisp-refs--format-count
|
||||
description
|
||||
(-sum (--map (length (car it)) results))
|
||||
(length results)
|
||||
searched-file-count
|
||||
prefix)
|
||||
"\n\n")
|
||||
;; Insert the results.
|
||||
(--each results
|
||||
(-let* (((forms . buf) it)
|
||||
(path (with-current-buffer buf elisp-refs--path)))
|
||||
(insert
|
||||
(propertize "File: " 'face 'bold)
|
||||
(elisp-refs--path-button path) "\n")
|
||||
(--each forms
|
||||
(-let [(_ start-pos end-pos) it]
|
||||
(insert (elisp-refs--containing-lines buf start-pos end-pos)
|
||||
"\n")))
|
||||
(insert "\n")))
|
||||
;; Prepare the buffer for the user.
|
||||
(elisp-refs-mode)))
|
||||
;; Cleanup buffers created when highlighting results.
|
||||
(kill-buffer elisp-refs--highlighting-buffer)))
|
||||
|
||||
(defun elisp-refs--loaded-bufs ()
|
||||
"Return a list of open buffers, one for each path in `load-path'."
|
||||
(mapcar #'elisp-refs--contents-buffer (elisp-refs--loaded-paths)))
|
||||
|
||||
(defun elisp-refs--search-1 (bufs match-fn)
|
||||
"Call MATCH-FN on each buffer in BUFS, reporting progress
|
||||
and accumulating results.
|
||||
|
||||
BUFS should be disposable: we make no effort to preserve their
|
||||
state during searching.
|
||||
|
||||
MATCH-FN should return a list where each element takes the form:
|
||||
\(form start-pos end-pos)."
|
||||
(let* (;; Our benchmark suggests we spend a lot of time in GC, and
|
||||
;; performance improves if we GC less frequently.
|
||||
(gc-cons-percentage 0.8)
|
||||
(total-bufs (length bufs)))
|
||||
(let ((searched 0)
|
||||
(forms-and-bufs nil))
|
||||
(dolist (buf bufs)
|
||||
(let* ((matching-forms (funcall match-fn buf)))
|
||||
;; If there were any matches in this buffer, push the
|
||||
;; matches along with the buffer into our results
|
||||
;; list.
|
||||
(when matching-forms
|
||||
(push (cons matching-forms buf) forms-and-bufs))
|
||||
;; Give feedback to the user on our progress, because
|
||||
;; searching takes several seconds.
|
||||
(when (and (zerop (mod searched 10))
|
||||
elisp-refs-verbose)
|
||||
(message "Searched %s/%s files" searched total-bufs))
|
||||
(cl-incf searched)))
|
||||
(when elisp-refs-verbose
|
||||
(message "Searched %s/%s files" total-bufs total-bufs))
|
||||
forms-and-bufs)))
|
||||
|
||||
(defun elisp-refs--search (symbol description match-fn &optional path-prefix)
|
||||
"Find references to SYMBOL in all loaded files; call MATCH-FN on each buffer.
|
||||
When PATH-PREFIX, limit to loaded files whose path starts with that prefix.
|
||||
|
||||
Display the results in a hyperlinked buffer.
|
||||
|
||||
MATCH-FN should return a list where each element takes the form:
|
||||
\(form start-pos end-pos)."
|
||||
(let* ((loaded-paths (elisp-refs--loaded-paths))
|
||||
(matching-paths (if path-prefix
|
||||
(--filter (s-starts-with? path-prefix it) loaded-paths)
|
||||
loaded-paths))
|
||||
(loaded-src-bufs (mapcar #'elisp-refs--contents-buffer matching-paths)))
|
||||
;; Use unwind-protect to ensure we always cleanup temporary
|
||||
;; buffers, even if the user hits C-g.
|
||||
(unwind-protect
|
||||
(progn
|
||||
(let ((forms-and-bufs
|
||||
(elisp-refs--search-1 loaded-src-bufs match-fn)))
|
||||
(elisp-refs--show-results symbol description forms-and-bufs
|
||||
(length loaded-src-bufs) path-prefix)))
|
||||
;; Clean up temporary buffers.
|
||||
(--each loaded-src-bufs (kill-buffer it)))))
|
||||
|
||||
(defun elisp-refs--completing-read-symbol (prompt &optional filter)
|
||||
"Read an interned symbol from the minibuffer,
|
||||
defaulting to the symbol at point. PROMPT is the string to prompt
|
||||
with.
|
||||
|
||||
If FILTER is given, only offer symbols where (FILTER sym) returns
|
||||
t."
|
||||
(let ((filter (or filter (lambda (_) t))))
|
||||
(read
|
||||
(completing-read prompt
|
||||
(elisp-refs--filter-obarray filter)
|
||||
nil nil nil nil
|
||||
(-if-let (sym (thing-at-point 'symbol))
|
||||
(when (funcall filter (read sym))
|
||||
sym))))))
|
||||
|
||||
;;; Commands
|
||||
|
||||
;;;###autoload
|
||||
(defun elisp-refs-function (symbol &optional path-prefix)
|
||||
"Display all the references to function SYMBOL, in all loaded
|
||||
elisp files.
|
||||
|
||||
If called with a prefix, prompt for a directory to limit the search.
|
||||
|
||||
This searches for functions, not macros. For that, see
|
||||
`elisp-refs-macro'."
|
||||
(interactive
|
||||
(list (elisp-refs--completing-read-symbol "Function: " #'functionp)
|
||||
(when current-prefix-arg
|
||||
(read-directory-name "Limit search to loaded files in: "))))
|
||||
(when (not (functionp symbol))
|
||||
(if (macrop symbol)
|
||||
(user-error "%s is a macro. Did you mean elisp-refs-macro?"
|
||||
symbol)
|
||||
(user-error "%s is not a function. Did you mean elisp-refs-symbol?"
|
||||
symbol)))
|
||||
(elisp-refs--search symbol
|
||||
(elisp-refs--describe-button symbol 'function)
|
||||
(lambda (buf)
|
||||
(elisp-refs--read-and-find buf symbol #'elisp-refs--function-p))
|
||||
path-prefix))
|
||||
|
||||
;;;###autoload
|
||||
(defun elisp-refs-macro (symbol &optional path-prefix)
|
||||
"Display all the references to macro SYMBOL, in all loaded
|
||||
elisp files.
|
||||
|
||||
If called with a prefix, prompt for a directory to limit the search.
|
||||
|
||||
This searches for macros, not functions. For that, see
|
||||
`elisp-refs-function'."
|
||||
(interactive
|
||||
(list (elisp-refs--completing-read-symbol "Macro: " #'macrop)
|
||||
(when current-prefix-arg
|
||||
(read-directory-name "Limit search to loaded files in: "))))
|
||||
(when (not (macrop symbol))
|
||||
(if (functionp symbol)
|
||||
(user-error "%s is a function. Did you mean elisp-refs-function?"
|
||||
symbol)
|
||||
(user-error "%s is not a function. Did you mean elisp-refs-symbol?"
|
||||
symbol)))
|
||||
(elisp-refs--search symbol
|
||||
(elisp-refs--describe-button symbol 'macro)
|
||||
(lambda (buf)
|
||||
(elisp-refs--read-and-find buf symbol #'elisp-refs--macro-p))
|
||||
path-prefix))
|
||||
|
||||
;;;###autoload
|
||||
(defun elisp-refs-special (symbol &optional path-prefix)
|
||||
"Display all the references to special form SYMBOL, in all loaded
|
||||
elisp files.
|
||||
|
||||
If called with a prefix, prompt for a directory to limit the search."
|
||||
(interactive
|
||||
(list (elisp-refs--completing-read-symbol "Special form: " #'special-form-p)
|
||||
(when current-prefix-arg
|
||||
(read-directory-name "Limit search to loaded files in: "))))
|
||||
(elisp-refs--search symbol
|
||||
(elisp-refs--describe-button symbol 'special-form)
|
||||
(lambda (buf)
|
||||
(elisp-refs--read-and-find buf symbol #'elisp-refs--special-p))
|
||||
path-prefix))
|
||||
|
||||
;;;###autoload
|
||||
(defun elisp-refs-variable (symbol &optional path-prefix)
|
||||
"Display all the references to variable SYMBOL, in all loaded
|
||||
elisp files.
|
||||
|
||||
If called with a prefix, prompt for a directory to limit the search."
|
||||
(interactive
|
||||
;; This is awkward. We don't want to just offer defvar variables,
|
||||
;; because then we can't search for code which uses `let' to bind
|
||||
;; symbols. There doesn't seem to be a good way to only offer
|
||||
;; variables that have been bound at some point.
|
||||
(list (elisp-refs--completing-read-symbol "Variable: " )
|
||||
(when current-prefix-arg
|
||||
(read-directory-name "Limit search to loaded files in: "))))
|
||||
(elisp-refs--search symbol
|
||||
(elisp-refs--describe-button symbol 'variable)
|
||||
(lambda (buf)
|
||||
(elisp-refs--read-and-find buf symbol #'elisp-refs--variable-p))
|
||||
path-prefix))
|
||||
|
||||
;;;###autoload
|
||||
(defun elisp-refs-symbol (symbol &optional path-prefix)
|
||||
"Display all the references to SYMBOL in all loaded elisp files.
|
||||
|
||||
If called with a prefix, prompt for a directory to limit the
|
||||
search."
|
||||
(interactive
|
||||
(list (elisp-refs--completing-read-symbol "Symbol: " )
|
||||
(when current-prefix-arg
|
||||
(read-directory-name "Limit search to loaded files in: "))))
|
||||
(elisp-refs--search symbol
|
||||
(elisp-refs--describe-button symbol 'symbol)
|
||||
(lambda (buf)
|
||||
(elisp-refs--read-and-find-symbol buf symbol))
|
||||
path-prefix))
|
||||
|
||||
;;; Mode
|
||||
|
||||
(defvar elisp-refs-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
;; TODO: it would be nice for TAB to navigate to file buttons too,
|
||||
;; like *Help* does.
|
||||
(set-keymap-parent map special-mode-map)
|
||||
(define-key map (kbd "<tab>") #'elisp-refs-next-match)
|
||||
(define-key map (kbd "<backtab>") #'elisp-refs-prev-match)
|
||||
(define-key map (kbd "n") #'elisp-refs-next-match)
|
||||
(define-key map (kbd "p") #'elisp-refs-prev-match)
|
||||
(define-key map (kbd "q") #'kill-this-buffer)
|
||||
(define-key map (kbd "RET") #'elisp-refs-visit-match)
|
||||
map)
|
||||
"Keymap for `elisp-refs-mode'.")
|
||||
|
||||
(define-derived-mode elisp-refs-mode special-mode "Refs"
|
||||
"Major mode for refs results buffers.")
|
||||
|
||||
(defun elisp-refs-visit-match ()
|
||||
"Go to the search result at point."
|
||||
(interactive)
|
||||
(let* ((path (get-text-property (point) 'elisp-refs-path))
|
||||
(pos (get-text-property (point) 'elisp-refs-start-pos))
|
||||
(unindent (get-text-property (point) 'elisp-refs-unindented))
|
||||
(column-offset (current-column))
|
||||
(line-offset -1))
|
||||
(when (null path)
|
||||
(user-error "No match here"))
|
||||
|
||||
;; If point is not on the first line of the match, work out how
|
||||
;; far away the first line is.
|
||||
(save-excursion
|
||||
(while (equal pos (get-text-property (point) 'elisp-refs-start-pos))
|
||||
(forward-line -1)
|
||||
(cl-incf line-offset)))
|
||||
|
||||
(find-file path)
|
||||
(goto-char pos)
|
||||
;; Move point so we're on the same char in the buffer that we were
|
||||
;; on in the results buffer.
|
||||
(forward-line line-offset)
|
||||
(beginning-of-line)
|
||||
(let ((target-offset (+ column-offset unindent))
|
||||
(i 0))
|
||||
(while (< i target-offset)
|
||||
(if (looking-at "\t")
|
||||
(cl-incf i tab-width)
|
||||
(cl-incf i))
|
||||
(forward-char 1)))))
|
||||
|
||||
(defun elisp-refs--move-to-match (direction)
|
||||
"Move point one match forwards.
|
||||
If DIRECTION is -1, moves backwards instead."
|
||||
(let* ((start-pos (point))
|
||||
(match-pos (get-text-property start-pos 'elisp-refs-start-pos))
|
||||
current-match-pos)
|
||||
(condition-case _err
|
||||
(progn
|
||||
;; Move forward/backwards until we're on the next/previous match.
|
||||
(catch 'done
|
||||
(while t
|
||||
(setq current-match-pos
|
||||
(get-text-property (point) 'elisp-refs-start-pos))
|
||||
(when (and current-match-pos
|
||||
(not (equal match-pos current-match-pos)))
|
||||
(throw 'done nil))
|
||||
(forward-char direction)))
|
||||
;; Move to the beginning of that match.
|
||||
(while (equal (get-text-property (point) 'elisp-refs-start-pos)
|
||||
(get-text-property (1- (point)) 'elisp-refs-start-pos))
|
||||
(forward-char -1))
|
||||
;; Move forward until we're on the first char of match within that
|
||||
;; line.
|
||||
(while (or
|
||||
(looking-at " ")
|
||||
(eq (get-text-property (point) 'face)
|
||||
'font-lock-comment-face))
|
||||
(forward-char 1)))
|
||||
;; If we're at the last result, don't move point.
|
||||
(end-of-buffer
|
||||
(progn
|
||||
(goto-char start-pos)
|
||||
(signal 'end-of-buffer nil))))))
|
||||
|
||||
(defun elisp-refs-prev-match ()
|
||||
"Move to the previous search result in the Refs buffer."
|
||||
(interactive)
|
||||
(elisp-refs--move-to-match -1))
|
||||
|
||||
(defun elisp-refs-next-match ()
|
||||
"Move to the next search result in the Refs buffer."
|
||||
(interactive)
|
||||
(elisp-refs--move-to-match 1))
|
||||
|
||||
(provide 'elisp-refs)
|
||||
;;; elisp-refs.el ends here
|
||||
2906
lisp/helpful.el
Normal file
2906
lisp/helpful.el
Normal file
File diff suppressed because it is too large
Load Diff
235
lisp/versions
235
lisp/versions
@@ -1,120 +1,122 @@
|
||||
# -*- mode: org -*-
|
||||
| package | | current Version | Package-Version | previous Version | Package-Version | |
|
||||
|-----------------------------+-----------+-----------------+-----------------+------------------+-----------------+------------------------------------------------------------------------------------|
|
||||
| ace-window.el | [[https://melpa.org/#/ace-window][melpa]] | 0.10.0 | 20200606.1259 | 0.9.0 | - | |
|
||||
| adaptive-wrap | [[https://melpa.org/#/ace-window][elpa]] | 0.8 | - | 0.7 | - | required by virtual-auto-fill |
|
||||
| all-the-icons | [[https://melpa.org/#/all-the-icons][melpa]] | 5.0.0 | 20211225.506 | 4.0.0 | 20210106.1227 | required by dashboard, requires memoize, run M-x all-the-icons-install-fonts |
|
||||
| amx.el | [[https://melpa.org/#/amx][melpa]] | 3.4 | 20210305.118 | 3.3 | 20210101.1921 | requires ivy or ido, imporves M-x saving history, etc. |
|
||||
| anaconda-mode | [[https://melpa.org/#/anaconda-mode][melpa]] | 0.1.15 | 20211122.817 | 0.1.13 | 20200912.239 | |
|
||||
| async | [[https://melpa.org/#/async][melpa]] | 1.9.5 | 20210823.528 | 1.9.4 | 20200809.501 | required by ob-async |
|
||||
| avy.el | [[https://melpa.org/#/avy][melpa]] | 0.5.0 | 20220102.805 | 0.5.0 | 20201226.1734 | required by org-ref |
|
||||
| awesome-tray.el | [[https://github.com/manateelazycat/awesome-tray][GitHub]] | 4.2 | 20211129.311 | 4.2 | 20200618.2102 | modeline in echo area |
|
||||
| biblio | [[https://melpa.org/#/biblio][melpa]] | 0.2 | 20210418.406 | 0.2 | 20200416.1407 | required by bibtex-completion |
|
||||
| biblio-core.el | [[https://melpa.org/#/biblio-core][melpa]] | 0.2.1 | 20210418.406 | 0.2.1 | 20200416.307 | required by biblio |
|
||||
| bibtex-completion.el | [[https://melpa.org/#/bibtex-completion][melpa]] | 1.0.0 | 20211019.1306 | 1.0.0 | 20200908.1017 | required by ivy-bibtex, org-ref |
|
||||
| bind-key.el | [[https://melpa.org/#/bind-key][melpa]] | 2.4 | 20210210.1609 | 2.4 | 20200805.1727 | required by use-package |
|
||||
| cl-libify.el | [[https://melpa.org/#/cl-libify][melpa]] | 0 | 20181130.230 | | | prevent: Package cl is deprecated |
|
||||
| citeproc | [[https://melpa.org/#/citeproc][melpa]] | 0.9 | 20220101.1527 | | | |
|
||||
| company | [[https://melpa.org/#/company][melpa]] | 0.9.13 | 20220103.351 | 0.9.13 | 20210103.1124 | completion framework |
|
||||
| company-anaconda.el | [[https://melpa.org/#/company-anaconda][melpa]] | 0.2.0 | 20200404.1859 | 0.2.0 | 20181025.1305 | |
|
||||
| company-ledger.el | [[https://melpa.org/#/company-ledger][melpa]] | 0.1.0 | 20210910.250 | 0.1.0 | 20200726.1825 | |
|
||||
| company-quickhelp.el | [[https://melpa.org/#/company-quickhelp][melpa]] | 2.2.0 | 20211115.1335 | 2.2.0 | 20201208.2308 | |
|
||||
| company-web | [[https://melpa.org/#/company-web][melpa]] | 2.1 | 20180402.1155 | | | requires cl-lib company dash web-completion-data |
|
||||
| counsel.el | [[https://melpa.org/#/counsel][melpa]] | 0.13.4 | 20211230.1909 | 0.13.0 | 20201227.1327 | |
|
||||
| crdt.el | [[https://code.librehq.com/qhong/crdt.el/][librehq]] | 0.2.7 | 2021.12.06 | 0.0.0 | 2020.12.28 | Collaborative editing using Conflict-free Replicated Data Types |
|
||||
| ctable.el | [[https://melpa.org/#/ctable][melpa]] | 0.1.3 | 20210128.629 | 0.1.2 | 20171006.11 | |
|
||||
| dash | [[https://melpa.org/#/dash][melpa]] | 2.19.1 | 20210826.1149 | 2.17.0 | 20210106.2158 | |
|
||||
| dashboard | [[https://melpa.org/#/dashboard][melpa]] | 1.8.0-SNAPSHOT | 20211221.2005 | 1.8.0-SNAPSHOT | 20210104.1605 | requires page-break-lines, (all-the-icons) |
|
||||
| deft.el | [[https://melpa.org/#/deft][melpa]] | 0.8 | 20210707.1633 | 0.8 | 20210101.1519 | |
|
||||
| delight.el | [[https://elpa.gnu.org/packages/delight.html][elpa]] | 1.7 | - | | | mode-line |
|
||||
| dialog.el | [[https://www.emacswiki.org/emacs/Dialog][emacswiki]] | 0.2 | 2019.10.10 | | | |
|
||||
| diff-hl | [[https://melpa.org/#/diff-hl][melpa]] | 1.8.8 | 20211106.2353 | 1.8.8 | 20210107.220 | |
|
||||
| dim.el | [[https://melpa.org/#/dim][melpa]] | 0.1 | 20160818.949 | | | mode-line |
|
||||
| emojify | [[https://melpa.org/#/emojify][melpa]] | 1.2.1 | 20210108.1111 | 1.2.1 | 20201130.1116 | |
|
||||
| ess | [[https://melpa.org/#/ess][melpa]] | 18.10.3snapshot | 20211231.1746 | 18.10.3snapshot | 20210106.1141 | |
|
||||
| ess-R-data-view.el | [[https://melpa.org/#/ess-R-data-view][melpa]] | 0.1 | 20130509.1158 | | | |
|
||||
| f.el | [[https://melpa.org/#/f][melpa]] | 0.20.0 | 20210624.1103 | 0.20.0 | 20191110.1357 | required by org-ref |
|
||||
| flycheck | [[https://melpa.org/#/flycheck][melpa]] | 32-cvs | 20210825.1804 | 32-cvs | 20201228.2104 | |
|
||||
| flycheck-ledger.el | [[https://melpa.org/#/flycheck-ledger][melpa]] | DEV | 20200304.2204 | DEV | 20180819.321 | |
|
||||
| flycheck-pos-tip.el | [[https://melpa.org/#/flycheck-pos-tip][melpa]] | 0.4-cvs | 20200516.1600 | 0.4-cvs | 20180610.1615 | |
|
||||
| focus | [[https://melpa.org/#/focus][melpa]] | 1.0.0 | 20191209.2210 | | | |
|
||||
| git-commit | [[https://melpa.org/#/git-commit][melpa]] | - | 20201222.1527 | - | 20200608.928 | required by magit |
|
||||
| git-messenger.el | [[https://melpa.org/#/git-messenger][melpa]] | 0.18 | 20201202.1637 | 0.18 | 20200321.2337 | |
|
||||
| gnuplot | [[https://melpa.org/#/gnuplot][melpa]] | 0.8.0 | 20220102.1637 | 0.8.0 | 20210104.1052 | |
|
||||
| gnuplot-mode.el | [[https://melpa.org/#/gnuplot-mode][melpa]] | 1.2.0 | 20171013.1616 | | | |
|
||||
| ht.el | [[https://melpa.org/#/ht][melpa]] | 2.4 | 20210119.741 | 2.3 | 20201119.518 | hash table library |
|
||||
| htmlize.el | [[https://melpa.org/#/htmlize][melpa]] | 1.57 | 20210825.2150 | 1.56 | 20200816.746 | required by org-ref |
|
||||
| hydra | [[https://melpa.org/#/hydra][melpa]] | 0.15.0 | 20220102.803 | 0.15.0 | 20201115.1055 | required by org-ref |
|
||||
| indent-guide.el | [[https://melpa.org/#/indent-guide][melpa]] | 2.3.1 | 20210115.400 | 2.3.1 | 20191106.240 | |
|
||||
| iscroll.el | [[https://melpa.org/#/iscroll][melpa]] | 1.0.0 | 20210128.1938 | | | |
|
||||
| ivy | [[https://melpa.org/#/ivy][melpa]] | 0.13.4 | 20211231.1730 | 0.13.0 | 20210105.2002 | |
|
||||
| ivy-bibtex | [[https://melpa.org/#/ivy-bibtex][melpa]] | 1.0.1 | 20210927.1205 | 1.0.1 | 20201014.803 | |
|
||||
| ivy-rich | [[https://melpa.org/#/ivy-rich][melpa]] | 0.1.6 | 20210409.931 | | | |
|
||||
| js2-mode | [[https://melpa.org/#/js2-mode][melpa]] | 20211229 | 20211229.135 | 20201220 | 20201220.1718 | |
|
||||
| key-chord.el | [[https://melpa.org/#/key-chord][melpa]] | 0.6 | 20201222.2030 | | | required by org-ref |
|
||||
| langtool | [[https://melpa.org/#/langtool][melpa]] | 2.2.1 | 20200529.230 | | | |
|
||||
| ledger-mode | [[https://melpa.org/#/ledger-mode][melpa]] | 4.0.0 | 20211214.1449 | 4.0.0 | 20210106.227 | |
|
||||
| lv | [[https://melpa.org/#/lv][melpa]] | - | 20200507.1518 | | | required by hydra |
|
||||
| magit | [[https://melpa.org/#/magit][melpa]] | 3.3.0 | 20220102.1825 | 3.0.0 | 20210105.1030 | IMPORTANT do not delete and change in magit-version.el the version, see also below |
|
||||
| markdown-mode.el | [[https://melpa.org/#/markdown-mode][melpa]] | 2.5-dev | 20211022.55 | 2.5-dev | 20210107.101 | |
|
||||
| memoize.el | [[https://melpa.org/#/memoize][melpa]] | 1.1 | 20200103.2036 | | | required by all-the-icons |
|
||||
| mu4e-maildirs-extension.el | [[https://melpa.org/#/mu4e-maildirs-extension][melpa]] | 0.1 | 20201028.921 | 0.1 | 20200508.712 | |
|
||||
| multiple-cursors | [[https://melpa.org/#/multiple-cursors][melpa]] | 1.4.0 | 20211112.2223 | 1.4.0 | 20201215.1559 | |
|
||||
| ob-async.el | [[https://melpa.org/#/ob-async][melpa]] | 0.1 | 20210428.2052 | 0.1 | 20190916.1537 | |
|
||||
| org | [[https://elpa.gnu.org/packages/org.html][elpa]] | 9.5.2 | - | 9.4.4 | - | |
|
||||
| org-appear.el | [[https://melpa.org/#/org-appear][melpa]] | 0.2.4 | 20211202.604 | | | |
|
||||
| org-brain.el | [[https://melpa.org/#/org-brain][melpa]] | 0.94 | 20210706.1519 | 0.94 | 20201214.822 | |
|
||||
| org-contrib | [[https://elpa.nongnu.org/nongnu/org-contrib.html][elpa]] | 0.3 | - | | | |
|
||||
| org-cliplink | [[https://melpa.org/#/org-cliplink][melpa]] | 0.2 | 20201126.1020 | | 20190608.2134 | |
|
||||
| org-drill | [[https://melpa.org/#/org-drill][melpa]] | 2.7.0 | 20210427.2003 | 2.7.0 | 20200412.1812 | (alternatives anki-mode, anki-editor) |
|
||||
| org-fancy-priorities.el | [[https://melpa.org/#/org-fancy-priorities][melpa]] | 1.1 | 20210830.1657 | 1.1 | 20180328.2331 | |
|
||||
| org-fragtog | [[https://github.com/io12/org-fragtog][melpa]] | 0.4.0 | 20220106.758 | | | |
|
||||
| org-ref | [[https://melpa.org/#/org-ref][mepla]] | 3.0 | 20220101.1941 | 1.1.1 | 20210108.1415 | uses ivy key-chord |
|
||||
| org-sticky-header.el | [[https://melpa.org/#/org-sticky-header][melpa]] | 1.1 | 20201223.143 | 1.1-pre | 20191117.549 | instead of org-bullets.el (last version used 20200317.1740) |
|
||||
| org-superstar.el | [[https://melpa.org/#/org-superstar][melpa]] | 1.5.1 | 20210915.1934 | 1.4.0 | 20200818.2257 | |
|
||||
| org-table-sticky-header.el | [[https://melpa.org/#/org-table-sticky-header][melpa]] | 0.1.0 | 20190924.506 | | | (alternative orgtbl-show-header) |
|
||||
| orgit.el | [[https://melpa.org/#/orgit][mepla]] | 1.6.0 | 20210620.1943 | 1.6.0 | 20200714.1943 | |
|
||||
| ov.el | [[https://melpa.org/#/ov][melpa]] | 1.0.6 | 20200326.1042 | | | |
|
||||
| ox-reveal.el | [[https://melpa.org/#/ox-reveal][melpa]] | 1.0 | 20211128.1509 | 1.0 | 20201211.1518 | requires https://github.com/hakimel/reveal.js |
|
||||
| ox-tufte.el | [[https://melpa.org/#/ox-tufte][melpa]] | 1.0.0 | 20160926.1607 | | | |
|
||||
| page-break-lines.el | [[https://melpa.org/#/page-break-lines][melpa]] | 0 | 20210104.2224 | 0 | 20200305.244 | required by dashboard |
|
||||
| parsebib.el | [[https://melpa.org/#/parsebib][melpa]] | 3.0 | 20211208.2335 | 2.3 | 20200513.2352 | required by org-ref |
|
||||
| pdf-tools | [[https://melpa.org/#/pdf-tools][melpa]] | 1.0.0snapshot | 20220103.308 | 1.0 | 20200512.1524 | |
|
||||
| persist | [[https://elpa.gnu.org/packages/persist.html][elpa]] | 0.4 | - | | | required by org-drill |
|
||||
| pfuture.el | [[https://melpa.org/#/pfuture][melpa]] | 1.10.2 | 20211229.1513 | 1.9 | 20200425.1357 | |
|
||||
| php-mode | [[https://melpa.org/#/php-mode][mepla]] | 1.24.0 | 20210808.1745 | 1.23.0 | 20210103.1738 | |
|
||||
| plantuml-mode.el | [[https://melpa.org/#/plantuml-mode][melpa]] | 1.2.9 | 20191102.2056 | 1.2.9 | 20190905.838 | |
|
||||
| polymode | [[https://melpa.org/#/polymode][melpa]] | 0.2.2 | 20211124.913 | 0.2.2 | 20200606.1106 | |
|
||||
| popup.el | [[https://melpa.org/#/popup][melpa]] | 0.5.9 | 20211231.1823 | 0.5.8 | 20200610.317 | |
|
||||
| popwin.el | [[https://melpa.org/#/popwin][melpa]] | 1.0.2 | 20210215.1849 | 1.0.2 | 20200908.816 | |
|
||||
| pos-tip.el | [[https://melpa.org/#/pos-tip][melpa]] | 0.4.6 | 20191227.1356 | 0.4.6 | 20150318.1513 | |
|
||||
| powershell.el | [[https://melpa.org/#/powershell][melpa]] | 0.3 | 20220103.925 | 0.3 | 20201005.1642 | |
|
||||
| pythonic.el | [[https://melpa.org/#/pythonic][melpa]] | 0.2 | 20210122.1247 | 0.1.1 | 20200806.434 | |
|
||||
| queue.el | [[https://elpa.gnu.org/packages/queue.html][elpa]] | 0.2 | - | | | required by citeproc |
|
||||
| rainbow-mode.el | [[https://elpa.gnu.org/packages/rainbow-mode.html][elpa]] | 1.0.5 | - | 1.0.4 | - | |
|
||||
| restart-emacs.el | [[https://melpa.org/#/restart-emacs][melpa]] | 0.1.1 | 20201127.1425 | 0.1.1 | 20180601.1031 | |
|
||||
| s.el | [[https://melpa.org/#/s][melpa]] | 1.12.0 | 20210616.619 | 1.12.0 | 20180406.808 | required by emacs-application-framework, org-ref |
|
||||
| spacemancs-theme | [[https://melpa.org/#/spacemacs-theme][melpa]] | 0.1 | 20210924.1220 | 0.1 | 20200825.1818 | |
|
||||
| sphinx-doc.el | [[https://melpa.org/#/sphinx-doc][melpa]] | 0.3.0 | 20210213.1250 | 0.3.0 | 20160116.1117 | |
|
||||
| sql-indent | [[https://elpa.gnu.org/packages/sql-indent.html][elpa]] | 1.6 | - | 1.5 | - | |
|
||||
| srefactor | [[https://melpa.org/#/srefactor][melpa]] | 0.3 | 20180703.1810 | | | |
|
||||
| stickyfunc-enhance.el | [[https://melpa.org/#/stickyfunc-enhance][melpa]] | 0.1 | 20150429.1814 | | | |
|
||||
| string-inflection.el | [[https://melpa.org/#/string-inflection][melpa]] | 1.0.16 | 20210918.419 | | | required by citeproc |
|
||||
| swiper.el | [[https://melpa.org/#/swiper][melpa]] | 0.13.4 | 20210919.1221 | 0.13.0 | 20201208.1419 | |
|
||||
| systemd | [[https://melpa.org/#/systemd][melpa]] | 1.6 | 20210209.2052 | | 20191219.2304 | |
|
||||
| transient | [[https://melpa.org/#/transient][melpa]] | 0.3.7 | 20220104.1601 | 0.2.0 | 20210103.1546 | |
|
||||
| treemacs | [[https://melpa.org/#/treemacs][melpa]] | 2.9.5 | 20220104.1302 | 2.8 | 20210107.1251 | |
|
||||
| treemacs-magit.el | [[https://melpa.org/#/treemacs-magit][melpa]] | 0 | 20211010.1005 | 0 | 20201025.957 | |
|
||||
| use-package | [[https://melpa.org/#/use-package][melpa]] | 2.4.1 | 20210207.1926 | 2.4.1 | 20210106.2145 | |
|
||||
| virtual-auto-fill | [[https://melpa.org/#/virtual-auto-fill][melpa]] | 0.1 | 20200906.2038 | 0.1 | 20200217.2333 | requires visual-line-mode (builtin) adaptive-wrap visual-fill-column |
|
||||
| visual-fill-column | [[https://melpa.org/#/visual-fill-column][melpa]] | 2.4 | 20211118.33 | 2.2 | 20201229.2303 | best with visual-line-mode, required by virtual-auto-fill |
|
||||
| vterm | [[https://melpa.org/#/vterm][melpa]] | 0.0.1 | 20211226.817 | | | |
|
||||
| web-completion-data | [[https://melpa.org/#/web-completion-data][melpa]] | 0.2 | 20160318.848 | | | required by company-web |
|
||||
| web-mode.el | [[https://melpa.org/#/web-mode][melpa]] | 17.0.4 | 20220104.1504 | 17.0.4 | 20201227.1048 | |
|
||||
| which-key.el | [[https://melpa.org/#/which-key][melpa]] | 3.5.1 | 20220102.1433 | 3.5.0 | 20201216.1720 | |
|
||||
| with-editor | [[https://melpa.org/#/with-editor][melpa]] | 3.0.5 | 20220101.1316 | 2.9.4 | 20201030.1232 | |
|
||||
| yasnippet.el | [[https://melpa.org/#/yasnippet][melpa]] | 0.14.0 | 20200604.246 | 0.14.0 | 20200524.2215 | |
|
||||
| yasnippet-snippets | [[https://melpa.org/#/yasnippet-snippets][melpa]] | 1.0 | 20210910.1959 | 0.2 | 20200606.1149 | exlude some snippets, see below |
|
||||
| package | | current Version | Package-Version | previous Version | Package-Version | |
|
||||
|----------------------------+-----------+-----------------+-----------------+------------------+-----------------+------------------------------------------------------------------------------------|
|
||||
| ace-window.el | [[https://melpa.org/#/ace-window][melpa]] | 0.10.0 | 20200606.1259 | 0.9.0 | - | |
|
||||
| adaptive-wrap | [[https://melpa.org/#/ace-window][elpa]] | 0.8 | - | 0.7 | - | required by virtual-auto-fill |
|
||||
| all-the-icons | [[https://melpa.org/#/all-the-icons][melpa]] | 5.0.0 | 20211225.506 | 4.0.0 | 20210106.1227 | required by dashboard, requires memoize, run M-x all-the-icons-install-fonts |
|
||||
| amx.el | [[https://melpa.org/#/amx][melpa]] | 3.4 | 20210305.118 | 3.3 | 20210101.1921 | requires ivy or ido, imporves M-x saving history, etc. |
|
||||
| anaconda-mode | [[https://melpa.org/#/anaconda-mode][melpa]] | 0.1.15 | 20211122.817 | 0.1.13 | 20200912.239 | |
|
||||
| async | [[https://melpa.org/#/async][melpa]] | 1.9.5 | 20210823.528 | 1.9.4 | 20200809.501 | required by ob-async |
|
||||
| avy.el | [[https://melpa.org/#/avy][melpa]] | 0.5.0 | 20220102.805 | 0.5.0 | 20201226.1734 | required by org-ref |
|
||||
| awesome-tray.el | [[https://github.com/manateelazycat/awesome-tray][GitHub]] | 4.2 | 20211129.311 | 4.2 | 20200618.2102 | modeline in echo area |
|
||||
| biblio | [[https://melpa.org/#/biblio][melpa]] | 0.2 | 20210418.406 | 0.2 | 20200416.1407 | required by bibtex-completion |
|
||||
| biblio-core.el | [[https://melpa.org/#/biblio-core][melpa]] | 0.2.1 | 20210418.406 | 0.2.1 | 20200416.307 | required by biblio |
|
||||
| bibtex-completion.el | [[https://melpa.org/#/bibtex-completion][melpa]] | 1.0.0 | 20211019.1306 | 1.0.0 | 20200908.1017 | required by ivy-bibtex, org-ref |
|
||||
| bind-key.el | [[https://melpa.org/#/bind-key][melpa]] | 2.4 | 20210210.1609 | 2.4 | 20200805.1727 | required by use-package |
|
||||
| cl-libify.el | [[https://melpa.org/#/cl-libify][melpa]] | 0 | 20181130.230 | | | prevent: Package cl is deprecated |
|
||||
| citeproc | [[https://melpa.org/#/citeproc][melpa]] | 0.9 | 20220101.1527 | | | |
|
||||
| company | [[https://melpa.org/#/company][melpa]] | 0.9.13 | 20220103.351 | 0.9.13 | 20210103.1124 | completion framework |
|
||||
| company-anaconda.el | [[https://melpa.org/#/company-anaconda][melpa]] | 0.2.0 | 20200404.1859 | 0.2.0 | 20181025.1305 | |
|
||||
| company-ledger.el | [[https://melpa.org/#/company-ledger][melpa]] | 0.1.0 | 20210910.250 | 0.1.0 | 20200726.1825 | |
|
||||
| company-quickhelp.el | [[https://melpa.org/#/company-quickhelp][melpa]] | 2.2.0 | 20211115.1335 | 2.2.0 | 20201208.2308 | |
|
||||
| company-web | [[https://melpa.org/#/company-web][melpa]] | 2.1 | 20180402.1155 | | | requires cl-lib company dash web-completion-data |
|
||||
| counsel.el | [[https://melpa.org/#/counsel][melpa]] | 0.13.4 | 20211230.1909 | 0.13.0 | 20201227.1327 | |
|
||||
| crdt.el | [[https://code.librehq.com/qhong/crdt.el/][librehq]] | 0.2.7 | 2021.12.06 | 0.0.0 | 2020.12.28 | Collaborative editing using Conflict-free Replicated Data Types |
|
||||
| ctable.el | [[https://melpa.org/#/ctable][melpa]] | 0.1.3 | 20210128.629 | 0.1.2 | 20171006.11 | |
|
||||
| dash | [[https://melpa.org/#/dash][melpa]] | 2.19.1 | 20210826.1149 | 2.17.0 | 20210106.2158 | |
|
||||
| dashboard | [[https://melpa.org/#/dashboard][melpa]] | 1.8.0-SNAPSHOT | 20211221.2005 | 1.8.0-SNAPSHOT | 20210104.1605 | requires page-break-lines, (all-the-icons) |
|
||||
| deft.el | [[https://melpa.org/#/deft][melpa]] | 0.8 | 20210707.1633 | 0.8 | 20210101.1519 | |
|
||||
| delight.el | [[https://elpa.gnu.org/packages/delight.html][elpa]] | 1.7 | - | | | mode-line |
|
||||
| dialog.el | [[https://www.emacswiki.org/emacs/Dialog][emacswiki]] | 0.2 | 2019.10.10 | | | |
|
||||
| diff-hl | [[https://melpa.org/#/diff-hl][melpa]] | 1.8.8 | 20211106.2353 | 1.8.8 | 20210107.220 | |
|
||||
| dim.el | [[https://melpa.org/#/dim][melpa]] | 0.1 | 20160818.949 | | | mode-line |
|
||||
| elisp-refs | [[https://melpa.org/#/elisp-refs][melpa]] | 1.4 | 20211009.1531 | | | required by helpful |
|
||||
| emojify | [[https://melpa.org/#/emojify][melpa]] | 1.2.1 | 20210108.1111 | 1.2.1 | 20201130.1116 | |
|
||||
| ess | [[https://melpa.org/#/ess][melpa]] | 18.10.3snapshot | 20211231.1746 | 18.10.3snapshot | 20210106.1141 | |
|
||||
| ess-R-data-view.el | [[https://melpa.org/#/ess-R-data-view][melpa]] | 0.1 | 20130509.1158 | | | |
|
||||
| f.el | [[https://melpa.org/#/f][melpa]] | 0.20.0 | 20210624.1103 | 0.20.0 | 20191110.1357 | required by org-ref |
|
||||
| flycheck | [[https://melpa.org/#/flycheck][melpa]] | 32-cvs | 20210825.1804 | 32-cvs | 20201228.2104 | |
|
||||
| flycheck-ledger.el | [[https://melpa.org/#/flycheck-ledger][melpa]] | DEV | 20200304.2204 | DEV | 20180819.321 | |
|
||||
| flycheck-pos-tip.el | [[https://melpa.org/#/flycheck-pos-tip][melpa]] | 0.4-cvs | 20200516.1600 | 0.4-cvs | 20180610.1615 | |
|
||||
| focus | [[https://melpa.org/#/focus][melpa]] | 1.0.0 | 20191209.2210 | | | |
|
||||
| git-commit | [[https://melpa.org/#/git-commit][melpa]] | - | 20201222.1527 | - | 20200608.928 | required by magit |
|
||||
| git-messenger.el | [[https://melpa.org/#/git-messenger][melpa]] | 0.18 | 20201202.1637 | 0.18 | 20200321.2337 | |
|
||||
| gnuplot | [[https://melpa.org/#/gnuplot][melpa]] | 0.8.0 | 20220102.1637 | 0.8.0 | 20210104.1052 | |
|
||||
| gnuplot-mode.el | [[https://melpa.org/#/gnuplot-mode][melpa]] | 1.2.0 | 20171013.1616 | | | |
|
||||
| helpful.el | [[https://melpa.org/#/elisp-refs][melpa]] | 0.19 | 20211226.1843 | | | better *Help* |
|
||||
| ht.el | [[https://melpa.org/#/ht][melpa]] | 2.4 | 20210119.741 | 2.3 | 20201119.518 | hash table library |
|
||||
| htmlize.el | [[https://melpa.org/#/htmlize][melpa]] | 1.57 | 20210825.2150 | 1.56 | 20200816.746 | required by org-ref |
|
||||
| hydra | [[https://melpa.org/#/hydra][melpa]] | 0.15.0 | 20220102.803 | 0.15.0 | 20201115.1055 | required by org-ref |
|
||||
| indent-guide.el | [[https://melpa.org/#/indent-guide][melpa]] | 2.3.1 | 20210115.400 | 2.3.1 | 20191106.240 | |
|
||||
| iscroll.el | [[https://melpa.org/#/iscroll][melpa]] | 1.0.0 | 20210128.1938 | | | |
|
||||
| ivy | [[https://melpa.org/#/ivy][melpa]] | 0.13.4 | 20211231.1730 | 0.13.0 | 20210105.2002 | |
|
||||
| ivy-bibtex | [[https://melpa.org/#/ivy-bibtex][melpa]] | 1.0.1 | 20210927.1205 | 1.0.1 | 20201014.803 | |
|
||||
| ivy-rich | [[https://melpa.org/#/ivy-rich][melpa]] | 0.1.6 | 20210409.931 | | | |
|
||||
| js2-mode | [[https://melpa.org/#/js2-mode][melpa]] | 20211229 | 20211229.135 | 20201220 | 20201220.1718 | |
|
||||
| key-chord.el | [[https://melpa.org/#/key-chord][melpa]] | 0.6 | 20201222.2030 | | | required by org-ref |
|
||||
| langtool | [[https://melpa.org/#/langtool][melpa]] | 2.2.1 | 20200529.230 | | | |
|
||||
| ledger-mode | [[https://melpa.org/#/ledger-mode][melpa]] | 4.0.0 | 20211214.1449 | 4.0.0 | 20210106.227 | |
|
||||
| lv | [[https://melpa.org/#/lv][melpa]] | - | 20200507.1518 | | | required by hydra |
|
||||
| magit | [[https://melpa.org/#/magit][melpa]] | 3.3.0 | 20220102.1825 | 3.0.0 | 20210105.1030 | IMPORTANT do not delete and change in magit-version.el the version, see also below |
|
||||
| markdown-mode.el | [[https://melpa.org/#/markdown-mode][melpa]] | 2.5-dev | 20211022.55 | 2.5-dev | 20210107.101 | |
|
||||
| memoize.el | [[https://melpa.org/#/memoize][melpa]] | 1.1 | 20200103.2036 | | | required by all-the-icons |
|
||||
| mu4e-maildirs-extension.el | [[https://melpa.org/#/mu4e-maildirs-extension][melpa]] | 0.1 | 20201028.921 | 0.1 | 20200508.712 | |
|
||||
| multiple-cursors | [[https://melpa.org/#/multiple-cursors][melpa]] | 1.4.0 | 20211112.2223 | 1.4.0 | 20201215.1559 | |
|
||||
| ob-async.el | [[https://melpa.org/#/ob-async][melpa]] | 0.1 | 20210428.2052 | 0.1 | 20190916.1537 | |
|
||||
| org | [[https://elpa.gnu.org/packages/org.html][elpa]] | 9.5.2 | - | 9.4.4 | - | |
|
||||
| org-appear.el | [[https://melpa.org/#/org-appear][melpa]] | 0.2.4 | 20211202.604 | | | |
|
||||
| org-brain.el | [[https://melpa.org/#/org-brain][melpa]] | 0.94 | 20210706.1519 | 0.94 | 20201214.822 | |
|
||||
| org-contrib | [[https://elpa.nongnu.org/nongnu/org-contrib.html][elpa]] | 0.3 | - | | | |
|
||||
| org-cliplink | [[https://melpa.org/#/org-cliplink][melpa]] | 0.2 | 20201126.1020 | | 20190608.2134 | |
|
||||
| org-drill | [[https://melpa.org/#/org-drill][melpa]] | 2.7.0 | 20210427.2003 | 2.7.0 | 20200412.1812 | (alternatives anki-mode, anki-editor) |
|
||||
| org-fancy-priorities.el | [[https://melpa.org/#/org-fancy-priorities][melpa]] | 1.1 | 20210830.1657 | 1.1 | 20180328.2331 | |
|
||||
| org-fragtog | [[https://github.com/io12/org-fragtog][melpa]] | 0.4.0 | 20220106.758 | | | |
|
||||
| org-ref | [[https://melpa.org/#/org-ref][mepla]] | 3.0 | 20220101.1941 | 1.1.1 | 20210108.1415 | uses ivy key-chord |
|
||||
| org-sticky-header.el | [[https://melpa.org/#/org-sticky-header][melpa]] | 1.1 | 20201223.143 | 1.1-pre | 20191117.549 | instead of org-bullets.el (last version used 20200317.1740) |
|
||||
| org-superstar.el | [[https://melpa.org/#/org-superstar][melpa]] | 1.5.1 | 20210915.1934 | 1.4.0 | 20200818.2257 | |
|
||||
| org-table-sticky-header.el | [[https://melpa.org/#/org-table-sticky-header][melpa]] | 0.1.0 | 20190924.506 | | | (alternative orgtbl-show-header) |
|
||||
| orgit.el | [[https://melpa.org/#/orgit][mepla]] | 1.6.0 | 20210620.1943 | 1.6.0 | 20200714.1943 | |
|
||||
| ov.el | [[https://melpa.org/#/ov][melpa]] | 1.0.6 | 20200326.1042 | | | |
|
||||
| ox-reveal.el | [[https://melpa.org/#/ox-reveal][melpa]] | 1.0 | 20211128.1509 | 1.0 | 20201211.1518 | requires https://github.com/hakimel/reveal.js |
|
||||
| ox-tufte.el | [[https://melpa.org/#/ox-tufte][melpa]] | 1.0.0 | 20160926.1607 | | | |
|
||||
| page-break-lines.el | [[https://melpa.org/#/page-break-lines][melpa]] | 0 | 20210104.2224 | 0 | 20200305.244 | required by dashboard |
|
||||
| parsebib.el | [[https://melpa.org/#/parsebib][melpa]] | 3.0 | 20211208.2335 | 2.3 | 20200513.2352 | required by org-ref |
|
||||
| pdf-tools | [[https://melpa.org/#/pdf-tools][melpa]] | 1.0.0snapshot | 20220103.308 | 1.0 | 20200512.1524 | |
|
||||
| persist | [[https://elpa.gnu.org/packages/persist.html][elpa]] | 0.4 | - | | | required by org-drill |
|
||||
| pfuture.el | [[https://melpa.org/#/pfuture][melpa]] | 1.10.2 | 20211229.1513 | 1.9 | 20200425.1357 | |
|
||||
| php-mode | [[https://melpa.org/#/php-mode][mepla]] | 1.24.0 | 20210808.1745 | 1.23.0 | 20210103.1738 | |
|
||||
| plantuml-mode.el | [[https://melpa.org/#/plantuml-mode][melpa]] | 1.2.9 | 20191102.2056 | 1.2.9 | 20190905.838 | |
|
||||
| polymode | [[https://melpa.org/#/polymode][melpa]] | 0.2.2 | 20211124.913 | 0.2.2 | 20200606.1106 | |
|
||||
| popup.el | [[https://melpa.org/#/popup][melpa]] | 0.5.9 | 20211231.1823 | 0.5.8 | 20200610.317 | |
|
||||
| popwin.el | [[https://melpa.org/#/popwin][melpa]] | 1.0.2 | 20210215.1849 | 1.0.2 | 20200908.816 | |
|
||||
| pos-tip.el | [[https://melpa.org/#/pos-tip][melpa]] | 0.4.6 | 20191227.1356 | 0.4.6 | 20150318.1513 | |
|
||||
| powershell.el | [[https://melpa.org/#/powershell][melpa]] | 0.3 | 20220103.925 | 0.3 | 20201005.1642 | |
|
||||
| pythonic.el | [[https://melpa.org/#/pythonic][melpa]] | 0.2 | 20210122.1247 | 0.1.1 | 20200806.434 | |
|
||||
| queue.el | [[https://elpa.gnu.org/packages/queue.html][elpa]] | 0.2 | - | | | required by citeproc |
|
||||
| rainbow-mode.el | [[https://elpa.gnu.org/packages/rainbow-mode.html][elpa]] | 1.0.5 | - | 1.0.4 | - | |
|
||||
| restart-emacs.el | [[https://melpa.org/#/restart-emacs][melpa]] | 0.1.1 | 20201127.1425 | 0.1.1 | 20180601.1031 | |
|
||||
| s.el | [[https://melpa.org/#/s][melpa]] | 1.12.0 | 20210616.619 | 1.12.0 | 20180406.808 | required by emacs-application-framework, org-ref |
|
||||
| spacemancs-theme | [[https://melpa.org/#/spacemacs-theme][melpa]] | 0.1 | 20210924.1220 | 0.1 | 20200825.1818 | |
|
||||
| sphinx-doc.el | [[https://melpa.org/#/sphinx-doc][melpa]] | 0.3.0 | 20210213.1250 | 0.3.0 | 20160116.1117 | |
|
||||
| sql-indent | [[https://elpa.gnu.org/packages/sql-indent.html][elpa]] | 1.6 | - | 1.5 | - | |
|
||||
| srefactor | [[https://melpa.org/#/srefactor][melpa]] | 0.3 | 20180703.1810 | | | |
|
||||
| stickyfunc-enhance.el | [[https://melpa.org/#/stickyfunc-enhance][melpa]] | 0.1 | 20150429.1814 | | | |
|
||||
| string-inflection.el | [[https://melpa.org/#/string-inflection][melpa]] | 1.0.16 | 20210918.419 | | | required by citeproc |
|
||||
| swiper.el | [[https://melpa.org/#/swiper][melpa]] | 0.13.4 | 20210919.1221 | 0.13.0 | 20201208.1419 | |
|
||||
| systemd | [[https://melpa.org/#/systemd][melpa]] | 1.6 | 20210209.2052 | | 20191219.2304 | |
|
||||
| transient | [[https://melpa.org/#/transient][melpa]] | 0.3.7 | 20220104.1601 | 0.2.0 | 20210103.1546 | |
|
||||
| treemacs | [[https://melpa.org/#/treemacs][melpa]] | 2.9.5 | 20220104.1302 | 2.8 | 20210107.1251 | |
|
||||
| treemacs-magit.el | [[https://melpa.org/#/treemacs-magit][melpa]] | 0 | 20211010.1005 | 0 | 20201025.957 | |
|
||||
| use-package | [[https://melpa.org/#/use-package][melpa]] | 2.4.1 | 20210207.1926 | 2.4.1 | 20210106.2145 | |
|
||||
| virtual-auto-fill | [[https://melpa.org/#/virtual-auto-fill][melpa]] | 0.1 | 20200906.2038 | 0.1 | 20200217.2333 | requires visual-line-mode (builtin) adaptive-wrap visual-fill-column |
|
||||
| visual-fill-column | [[https://melpa.org/#/visual-fill-column][melpa]] | 2.4 | 20211118.33 | 2.2 | 20201229.2303 | best with visual-line-mode, required by virtual-auto-fill |
|
||||
| vterm | [[https://melpa.org/#/vterm][melpa]] | 0.0.1 | 20211226.817 | | | |
|
||||
| web-completion-data | [[https://melpa.org/#/web-completion-data][melpa]] | 0.2 | 20160318.848 | | | required by company-web |
|
||||
| web-mode.el | [[https://melpa.org/#/web-mode][melpa]] | 17.0.4 | 20220104.1504 | 17.0.4 | 20201227.1048 | |
|
||||
| which-key.el | [[https://melpa.org/#/which-key][melpa]] | 3.5.1 | 20220102.1433 | 3.5.0 | 20201216.1720 | |
|
||||
| with-editor | [[https://melpa.org/#/with-editor][melpa]] | 3.0.5 | 20220101.1316 | 2.9.4 | 20201030.1232 | |
|
||||
| yasnippet.el | [[https://melpa.org/#/yasnippet][melpa]] | 0.14.0 | 20200604.246 | 0.14.0 | 20200524.2215 | |
|
||||
| yasnippet-snippets | [[https://melpa.org/#/yasnippet-snippets][melpa]] | 1.0 | 20210910.1959 | 0.2 | 20200606.1149 | exlude some snippets, see below |
|
||||
|
||||
Install
|
||||
- emacs-application-framework
|
||||
@@ -201,7 +203,6 @@ origami.el
|
||||
ob-http
|
||||
org-autolist
|
||||
org-edit-latex
|
||||
org-fragtog
|
||||
org-pdftools
|
||||
org-sidebar
|
||||
org-special-block-extras
|
||||
|
||||
@@ -318,6 +318,33 @@ Version 2016-07-13"
|
||||
(setq transient-values-file (concat user-cache-directory "transient/values.el"))
|
||||
(setq transient-history-file (concat user-cache-directory "transient/history.el")))
|
||||
|
||||
;; A better *Help* buffer
|
||||
(use-package helpful
|
||||
:bind
|
||||
(;; Note that the built-in `describe-function' includes both functions
|
||||
;; and macros. `helpful-function' is functions only, so we provide
|
||||
;; `helpful-callable' as a drop-in replacement to include `helpful-macro'.
|
||||
("C-h f" . helpful-callable)
|
||||
("C-h v" . helpful-variable)
|
||||
("C-h k" . helpful-key)
|
||||
;; Lookup the current symbol at point. C-c C-d is a common keybinding
|
||||
;; for this in lisp modes.
|
||||
("C-c C-d" . helpful-at-point)
|
||||
;; Look up *F*unctions (excludes macros).
|
||||
;; By default, C-h F is bound to `Info-goto-emacs-command-node'. Helpful
|
||||
;; already links to the manual, if a function is referenced there.
|
||||
("C-h F" . helpful-function)
|
||||
;; Look up *C*ommands.
|
||||
;; By default, C-h C is bound to describe `describe-coding-system'. I
|
||||
;; don't find this very useful, but it's frequently useful to only
|
||||
;; look at interactive functions.
|
||||
("C-h C" . helpful-command))
|
||||
:config
|
||||
(with-eval-after-load 'ivy
|
||||
;; Ivy users can use Helpful with counsel commands:
|
||||
(setq counsel-describe-function-function #'helpful-callable)
|
||||
(setq counsel-describe-variable-function #'helpful-variable)))
|
||||
|
||||
;;
|
||||
;; keyboard
|
||||
;;
|
||||
|
||||
Reference in New Issue
Block a user