update packages

This commit is contained in:
2025-06-22 17:08:08 +02:00
parent 54e5633369
commit 16a0a6db93
558 changed files with 68349 additions and 26568 deletions
+9 -13
View File
@@ -1,14 +1,10 @@
(define-package "ace-window" "20220911.358" "Quickly switch windows." ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "ace-window" "20220911.358"
"Quickly switch windows."
'((avy "0.5.0")) '((avy "0.5.0"))
:commit "77115afc1b0b9f633084cf7479c767988106c196" :authors :url "https://github.com/abo-abo/ace-window"
'(("Oleh Krehel" . "ohwoeowho@gmail.com")) :commit "77115afc1b0b9f633084cf7479c767988106c196"
:maintainers :revdesc "77115afc1b0b"
'(("Oleh Krehel" . "ohwoeowho@gmail.com")) :keywords '("window" "location")
:maintainer :authors '(("Oleh Krehel" . "ohwoeowho@gmail.com"))
'("Oleh Krehel" . "ohwoeowho@gmail.com") :maintainers '(("Oleh Krehel" . "ohwoeowho@gmail.com")))
:keywords
'("window" "location")
:url "https://github.com/abo-abo/ace-window")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -5,7 +5,8 @@
;; Author: Oleh Krehel <ohwoeowho@gmail.com> ;; Author: Oleh Krehel <ohwoeowho@gmail.com>
;; Maintainer: Oleh Krehel <ohwoeowho@gmail.com> ;; Maintainer: Oleh Krehel <ohwoeowho@gmail.com>
;; URL: https://github.com/abo-abo/ace-window ;; URL: https://github.com/abo-abo/ace-window
;; Version: 0.10.0 ;; Package-Version: 20220911.358
;; Package-Revision: 77115afc1b0b
;; Package-Requires: ((avy "0.5.0")) ;; Package-Requires: ((avy "0.5.0"))
;; Keywords: window, location ;; Keywords: window, location
@@ -1,16 +1,12 @@
(define-package "all-the-icons-ivy-rich" "20230420.1234" "Better experience with icons for ivy" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "25.1") (define-package "all-the-icons-ivy-rich" "20230420.1234"
(ivy-rich "0.1.0") "Better experience with icons for ivy."
'((emacs "25.1")
(ivy-rich "0.1.0")
(all-the-icons "2.2.0")) (all-the-icons "2.2.0"))
:commit "c098cc85123a401b0ab8f2afd3a25853e61d7d28" :authors :url "https://github.com/seagle0128/all-the-icons-ivy-rich"
'(("Vincent Zhang" . "seagle0128@gmail.com")) :commit "c098cc85123a401b0ab8f2afd3a25853e61d7d28"
:maintainers :revdesc "c098cc85123a"
'(("Vincent Zhang" . "seagle0128@gmail.com")) :keywords '("convenience" "icons" "ivy")
:maintainer :authors '(("Vincent Zhang" . "seagle0128@gmail.com"))
'("Vincent Zhang" . "seagle0128@gmail.com") :maintainers '(("Vincent Zhang" . "seagle0128@gmail.com")))
:keywords
'("convenience" "icons" "ivy")
:url "https://github.com/seagle0128/all-the-icons-ivy-rich")
;; Local Variables:
;; no-byte-compile: t
;; End:
@@ -4,7 +4,8 @@
;; Author: Vincent Zhang <seagle0128@gmail.com> ;; Author: Vincent Zhang <seagle0128@gmail.com>
;; Homepage: https://github.com/seagle0128/all-the-icons-ivy-rich ;; Homepage: https://github.com/seagle0128/all-the-icons-ivy-rich
;; Version: 1.9.0 ;; Package-Version: 20230420.1234
;; Package-Revision: c098cc85123a
;; Package-Requires: ((emacs "25.1") (ivy-rich "0.1.0") (all-the-icons "2.2.0")) ;; Package-Requires: ((emacs "25.1") (ivy-rich "0.1.0") (all-the-icons "2.2.0"))
;; Keywords: convenience, icons, ivy ;; Keywords: convenience, icons, ivy
+1 -2
View File
@@ -1,9 +1,8 @@
;;; all-the-icons-faces.el --- A module of faces for all-the-icons ;;; all-the-icons-faces.el --- A module of faces for all-the-icons -*- lexical-binding: t; -*-
;; Copyright (C) 2016 Dominic Charlesworth <dgc336@gmail.com> ;; Copyright (C) 2016 Dominic Charlesworth <dgc336@gmail.com>
;; Author: Dominic Charlesworth <dgc336@gmail.com> ;; Author: Dominic Charlesworth <dgc336@gmail.com>
;; Version: 1.0.0
;; Package-Requires: ((emacs "24.3")) ;; Package-Requires: ((emacs "24.3"))
;; URL: https://github.com/domtronn/all-the-icons.el ;; URL: https://github.com/domtronn/all-the-icons.el
;; Keywords: convenient, lisp ;; Keywords: convenient, lisp
+9 -13
View File
@@ -1,14 +1,10 @@
(define-package "all-the-icons" "20240623.1800" "A library for inserting Developer icons" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "all-the-icons" "20250527.927"
"A library for inserting Developer icons."
'((emacs "24.3")) '((emacs "24.3"))
:commit "39ef44f810c34e8900978788467cc675870bcd19" :authors :url "https://github.com/domtronn/all-the-icons.el"
'(("Dominic Charlesworth" . "dgc336@gmail.com")) :commit "4778632b29c8c8d2b7cd9ce69535d0be01d846f9"
:maintainers :revdesc "4778632b29c8"
'(("Dominic Charlesworth" . "dgc336@gmail.com")) :keywords '("convenient" "lisp")
:maintainer :authors '(("Dominic Charlesworth" . "dgc336@gmail.com"))
'("Dominic Charlesworth" . "dgc336@gmail.com") :maintainers '(("Dominic Charlesworth" . "dgc336@gmail.com")))
:keywords
'("convenient" "lisp")
:url "https://github.com/domtronn/all-the-icons.el")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -3,7 +3,8 @@
;; Copyright (C) 2016 Dominic Charlesworth <dgc336@gmail.com> ;; Copyright (C) 2016 Dominic Charlesworth <dgc336@gmail.com>
;; Author: Dominic Charlesworth <dgc336@gmail.com> ;; Author: Dominic Charlesworth <dgc336@gmail.com>
;; Version: 5.0.0 ;; Package-Version: 20250527.927
;; Package-Revision: 4778632b29c8
;; Package-Requires: ((emacs "24.3")) ;; Package-Requires: ((emacs "24.3"))
;; URL: https://github.com/domtronn/all-the-icons.el ;; URL: https://github.com/domtronn/all-the-icons.el
;; Keywords: convenient, lisp ;; Keywords: convenient, lisp
@@ -1,3 +1,5 @@
;; -*- lexical-binding: t -*-
(defvar all-the-icons-data/alltheicons-alist (defvar all-the-icons-data/alltheicons-alist
'( '(
+2
View File
@@ -1,3 +1,5 @@
;; -*- lexical-binding: t -*-
(defvar all-the-icons-data/fa-icon-alist (defvar all-the-icons-data/fa-icon-alist
'( '(
@@ -1,3 +1,5 @@
;; -*- lexical-binding: t -*-
(defvar all-the-icons-data/file-icon-alist (defvar all-the-icons-data/file-icon-alist
'( '(
+2
View File
@@ -1,3 +1,5 @@
;; -*- lexical-binding: t -*-
(defvar all-the-icons-data/material-icons-alist (defvar all-the-icons-data/material-icons-alist
'(("3d_rotation" . "\xe84d") '(("3d_rotation" . "\xe84d")
("ac_unit" . "\xeb3b") ("ac_unit" . "\xeb3b")
+2
View File
@@ -1,3 +1,5 @@
;; -*- lexical-binding: t -*-
(defvar all-the-icons-data/octicons-alist (defvar all-the-icons-data/octicons-alist
'( '(
@@ -1,3 +1,5 @@
;; -*- lexical-binding: t -*-
(defvar all-the-icons-data/weather-icons-alist (defvar all-the-icons-data/weather-icons-alist
'( '(
+11 -15
View File
@@ -1,16 +1,12 @@
(define-package "amx" "20230413.1210" "Alternative M-x with extra features." ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "amx" "20230413.1210"
"Alternative M-x with extra features."
'((emacs "24.4") '((emacs "24.4")
(s "0")) (s "0"))
:commit "1c2428d21e9d2ee8bee944b572a39ca8c91ca13b" :authors :url "http://github.com/DarwinAwardWinner/amx/"
'(("Ryan C. Thompson" . "rct@thompsonclan.org") :commit "1c2428d21e9d2ee8bee944b572a39ca8c91ca13b"
("Cornelius Mika" . "cornelius.mika@gmail.com")) :revdesc "1c2428d21e9d"
:maintainers :keywords '("convenience" "usability" "completion")
'(("Ryan C. Thompson" . "rct@thompsonclan.org")) :authors '(("Ryan C. Thompson" . "rct@thompsonclan.org")
:maintainer ("Cornelius Mika" . "cornelius.mika@gmail.com"))
'("Ryan C. Thompson" . "rct@thompsonclan.org") :maintainers '(("Ryan C. Thompson" . "rct@thompsonclan.org")))
:keywords
'("convenience" "usability" "completion")
:url "http://github.com/DarwinAwardWinner/amx/")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -9,7 +9,8 @@
;; Maintainer: Ryan C. Thompson <rct@thompsonclan.org> ;; Maintainer: Ryan C. Thompson <rct@thompsonclan.org>
;; URL: http://github.com/DarwinAwardWinner/amx/ ;; URL: http://github.com/DarwinAwardWinner/amx/
;; Package-Requires: ((emacs "24.4") (s "0")) ;; Package-Requires: ((emacs "24.4") (s "0"))
;; Version: 3.4 ;; Package-Version: 20230413.1210
;; Package-Revision: 1c2428d21e9d
;; Keywords: convenience, usability, completion ;; Keywords: convenience, usability, completion
;; This file is not part of GNU Emacs. ;; This file is not part of GNU Emacs.
+13 -17
View File
@@ -1,18 +1,14 @@
(define-package "anaconda-mode" "20250310.1512" "Code navigation, documentation lookup and completion for Python" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "25.1") (define-package "anaconda-mode" "20250430.227"
"Code navigation, documentation lookup and completion for Python."
'((emacs "25.1")
(pythonic "0.1.0") (pythonic "0.1.0")
(dash "2.6.0") (dash "2.6.0")
(s "1.9") (s "1.9")
(f "0.16.2")) (f "0.16.2"))
:commit "28b3e0088ac7113390aa006bf277c8aa14e561a2" :authors :url "https://github.com/proofit404/anaconda-mode"
'(("Artem Malyshev" . "proofit404@gmail.com")) :commit "ee1562c6b443be9208910c700e229824b2f1af7a"
:maintainers :revdesc "ee1562c6b443"
'(("Artem Malyshev" . "proofit404@gmail.com")) :keywords '("convenience" "anaconda")
:maintainer :authors '(("Artem Malyshev" . "proofit404@gmail.com"))
'("Artem Malyshev" . "proofit404@gmail.com") :maintainers '(("Artem Malyshev" . "proofit404@gmail.com")))
:keywords
'("convenience" "anaconda")
:url "https://github.com/proofit404/anaconda-mode")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -4,7 +4,8 @@
;; Author: Artem Malyshev <proofit404@gmail.com> ;; Author: Artem Malyshev <proofit404@gmail.com>
;; URL: https://github.com/proofit404/anaconda-mode ;; URL: https://github.com/proofit404/anaconda-mode
;; Version: 0.1.16 ;; Package-Version: 20250430.227
;; Package-Revision: ee1562c6b443
;; Package-Requires: ((emacs "25.1") (pythonic "0.1.0") (dash "2.6.0") (s "1.9") (f "0.16.2")) ;; Package-Requires: ((emacs "25.1") (pythonic "0.1.0") (dash "2.6.0") (s "1.9") (f "0.16.2"))
;; Keywords: convenience anaconda ;; Keywords: convenience anaconda
+2 -1
View File
@@ -77,7 +77,8 @@ def install_deps_pip():
import venv import venv
temp_dir = pathlib.Path(tempfile.mkdtemp()) temp_dir = pathlib.Path(tempfile.mkdtemp())
venv.create(temp_dir, with_pip=True) venv.create(temp_dir, with_pip=True)
cmd = [temp_dir / 'bin' / 'pip', 'install', '--target', server_directory] binname = 'Scripts' if sys.platform == 'win32' else 'bin'
cmd = [temp_dir / binname / 'pip', 'install', '--target', server_directory]
cmd.extend(missing_dependencies) cmd.extend(missing_dependencies)
try: try:
subprocess.check_call(cmd) subprocess.check_call(cmd)
+1 -1
View File
@@ -66,7 +66,7 @@ all packages are always compiled asynchronously."
"The variable used by `async-inject-variables' when (re)compiling async.") "The variable used by `async-inject-variables' when (re)compiling async.")
(defun async-bytecomp--file-to-comp-buffer (file-or-dir &optional quiet type) (defun async-bytecomp--file-to-comp-buffer (file-or-dir &optional quiet type)
(let ((bn (file-name-nondirectory file-or-dir)) (let ((bn (file-name-nondirectory (directory-file-name file-or-dir)))
(action-name (pcase type (action-name (pcase type
('file "File") ('file "File")
('directory "Directory")))) ('directory "Directory"))))
+9 -13
View File
@@ -1,14 +1,10 @@
(define-package "async" "20241126.810" "Asynchronous processing in Emacs" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "async" "20250325.509"
"Asynchronous processing in Emacs."
'((emacs "24.4")) '((emacs "24.4"))
:commit "b99658e831bc7e7d20ed4bb0a85bdb5c7dd74142" :authors :url "https://github.com/jwiegley/emacs-async"
'(("John Wiegley" . "jwiegley@gmail.com")) :commit "bb3f31966ed65a76abe6fa4f80a960a2917f554e"
:maintainers :revdesc "bb3f31966ed6"
'(("Thierry Volpiatto" . "thievol@posteo.net")) :keywords '("async")
:maintainer :authors '(("John Wiegley" . "jwiegley@gmail.com"))
'("Thierry Volpiatto" . "thievol@posteo.net") :maintainers '(("Thierry Volpiatto" . "thievol@posteo.net")))
:keywords
'("async")
:url "https://github.com/jwiegley/emacs-async")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -6,7 +6,8 @@
;; Maintainer: Thierry Volpiatto <thievol@posteo.net> ;; Maintainer: Thierry Volpiatto <thievol@posteo.net>
;; Created: 18 Jun 2012 ;; Created: 18 Jun 2012
;; Version: 1.9.9 ;; Package-Version: 20250325.509
;; Package-Revision: bb3f31966ed6
;; Package-Requires: ((emacs "24.4")) ;; Package-Requires: ((emacs "24.4"))
;; Keywords: async ;; Keywords: async
+10 -14
View File
@@ -1,15 +1,11 @@
(define-package "avy" "20241101.1357" "Jump to arbitrary positions in visible text and select text quickly." ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "24.1") (define-package "avy" "20241101.1357"
"Jump to arbitrary positions in visible text and select text quickly."
'((emacs "24.1")
(cl-lib "0.5")) (cl-lib "0.5"))
:commit "933d1f36cca0f71e4acb5fac707e9ae26c536264" :authors :url "https://github.com/abo-abo/avy"
'(("Oleh Krehel" . "ohwoeowho@gmail.com")) :commit "933d1f36cca0f71e4acb5fac707e9ae26c536264"
:maintainers :revdesc "933d1f36cca0"
'(("Oleh Krehel" . "ohwoeowho@gmail.com")) :keywords '("point" "location")
:maintainer :authors '(("Oleh Krehel" . "ohwoeowho@gmail.com"))
'("Oleh Krehel" . "ohwoeowho@gmail.com") :maintainers '(("Oleh Krehel" . "ohwoeowho@gmail.com")))
:keywords
'("point" "location")
:url "https://github.com/abo-abo/avy")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -4,7 +4,8 @@
;; Author: Oleh Krehel <ohwoeowho@gmail.com> ;; Author: Oleh Krehel <ohwoeowho@gmail.com>
;; URL: https://github.com/abo-abo/avy ;; URL: https://github.com/abo-abo/avy
;; Version: 0.5.0 ;; Package-Version: 20241101.1357
;; Package-Revision: 933d1f36cca0
;; Package-Requires: ((emacs "24.1") (cl-lib "0.5")) ;; Package-Requires: ((emacs "24.1") (cl-lib "0.5"))
;; Keywords: point, location ;; Keywords: point, location
+12 -16
View File
@@ -1,17 +1,13 @@
(define-package "biblio-core" "20230202.1721" "A framework for looking up and displaying bibliographic entries" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "24.3") (define-package "biblio-core" "20230202.1721"
"A framework for looking up and displaying bibliographic entries."
'((emacs "24.3")
(let-alist "1.0.4") (let-alist "1.0.4")
(seq "1.11") (seq "1.11")
(dash "2.12.1")) (dash "2.12.1"))
:commit "ee52f6cda82ea6fbc3b400e7b12132595cc0374c" :authors :url "https://github.com/cpitclaudel/biblio.el"
'(("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) :commit "ee52f6cda82ea6fbc3b400e7b12132595cc0374c"
:maintainers :revdesc "ee52f6cda82e"
'(("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) :keywords '("bib" "tex" "convenience" "hypermedia")
:maintainer :authors '(("Clément Pit-Claudel" . "clement.pitclaudel@live.com"))
'("Clément Pit-Claudel" . "clement.pitclaudel@live.com") :maintainers '(("Clément Pit-Claudel" . "clement.pitclaudel@live.com")))
:keywords
'("bib" "tex" "convenience" "hypermedia")
:url "https://github.com/cpitclaudel/biblio.el")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -3,7 +3,8 @@
;; Copyright (C) 2016 Clément Pit-Claudel ;; Copyright (C) 2016 Clément Pit-Claudel
;; Author: Clément Pit-Claudel <clement.pitclaudel@live.com> ;; Author: Clément Pit-Claudel <clement.pitclaudel@live.com>
;; Version: 0.3 ;; Package-Version: 20230202.1721
;; Package-Revision: ee52f6cda82e
;; Package-Requires: ((emacs "24.3") (let-alist "1.0.4") (seq "1.11") (dash "2.12.1")) ;; Package-Requires: ((emacs "24.3") (let-alist "1.0.4") (seq "1.11") (dash "2.12.1"))
;; Keywords: bib, tex, convenience, hypermedia ;; Keywords: bib, tex, convenience, hypermedia
;; URL: https://github.com/cpitclaudel/biblio.el ;; URL: https://github.com/cpitclaudel/biblio.el
+1 -1
View File
@@ -65,7 +65,7 @@
(defun biblio-dblp--url (query) (defun biblio-dblp--url (query)
"Create a DBLP url to look up QUERY." "Create a DBLP url to look up QUERY."
(format "https://dblp.uni-trier.de/search/publ/api?q=%s&format=xml" (url-encode-url query))) (format "https://dblp.org/search/publ/api?q=%s&format=xml" (url-encode-url query)))
;;;###autoload ;;;###autoload
(defun biblio-dblp-backend (command &optional arg &rest more) (defun biblio-dblp-backend (command &optional arg &rest more)
+10 -14
View File
@@ -1,15 +1,11 @@
(define-package "biblio" "20250102.1345" "Browse and import bibliographic references and BibTeX records from CrossRef, arXiv, DBLP, HAL, IEEE Xplore, Dissemin, and doi.org" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "24.3") (define-package "biblio" "20250409.2132"
"Browse and import bibliographic references and BibTeX records from CrossRef, arXiv, DBLP, HAL, IEEE Xplore, Dissemin, and doi.org."
'((emacs "24.3")
(biblio-core "0.3")) (biblio-core "0.3"))
:commit "b700f0f2929829b2ca971511c5ebe61c67027e9f" :authors :url "https://github.com/cpitclaudel/biblio.el"
'(("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) :commit "0314982c0ca03d0f8e0ddbe9fc20588c35021098"
:maintainers :revdesc "0314982c0ca0"
'(("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) :keywords '("bib" "tex" "convenience" "hypermedia")
:maintainer :authors '(("Clément Pit-Claudel" . "clement.pitclaudel@live.com"))
'("Clément Pit-Claudel" . "clement.pitclaudel@live.com") :maintainers '(("Clément Pit-Claudel" . "clement.pitclaudel@live.com")))
:keywords
'("bib" "tex" "convenience" "hypermedia")
:url "https://github.com/cpitclaudel/biblio.el")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -3,7 +3,8 @@
;; Copyright (C) 2016 Clément Pit-Claudel ;; Copyright (C) 2016 Clément Pit-Claudel
;; Author: Clément Pit-Claudel <clement.pitclaudel@live.com> ;; Author: Clément Pit-Claudel <clement.pitclaudel@live.com>
;; Version: 0.3 ;; Package-Version: 20250409.2132
;; Package-Revision: 0314982c0ca0
;; Package-Requires: ((emacs "24.3") (biblio-core "0.3")) ;; Package-Requires: ((emacs "24.3") (biblio-core "0.3"))
;; Keywords: bib, tex, convenience, hypermedia ;; Keywords: bib, tex, convenience, hypermedia
;; URL: https://github.com/cpitclaudel/biblio.el ;; URL: https://github.com/cpitclaudel/biblio.el
+15 -18
View File
@@ -1,19 +1,16 @@
(define-package "bibtex-completion" "20241116.726" "A BibTeX backend for completion frameworks" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "bibtex-completion" "20241116.726"
"A BibTeX backend for completion frameworks."
'((parsebib "6.0") '((parsebib "6.0")
(s "1.9.0") (s "1.9.0")
(dash "2.6.0") (dash "2.6.0")
(f "0.16.2") (f "0.16.2")
(cl-lib "0.5") (cl-lib "0.5")
(biblio "0.2") (biblio "0.2")
(emacs "26.1")) (emacs "26.1"))
:commit "6064e8625b2958f34d6d40312903a85c173b5261" :authors :url "https://github.com/tmalsburg/helm-bibtex"
'(("Titus von der Malsburg" . "malsburg@posteo.de") :commit "6064e8625b2958f34d6d40312903a85c173b5261"
("Justin Burkett" . "justin@burkett.cc")) :revdesc "6064e8625b29"
:maintainers :authors '(("Titus von der Malsburg" . "malsburg@posteo.de")
'(("Titus von der Malsburg" . "malsburg@posteo.de")) ("Justin Burkett" . "justin@burkett.cc"))
:maintainer :maintainers '(("Titus von der Malsburg" . "malsburg@posteo.de")))
'("Titus von der Malsburg" . "malsburg@posteo.de")
:url "https://github.com/tmalsburg/helm-bibtex")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -4,7 +4,8 @@
;; Justin Burkett <justin@burkett.cc> ;; Justin Burkett <justin@burkett.cc>
;; Maintainer: Titus von der Malsburg <malsburg@posteo.de> ;; Maintainer: Titus von der Malsburg <malsburg@posteo.de>
;; URL: https://github.com/tmalsburg/helm-bibtex ;; URL: https://github.com/tmalsburg/helm-bibtex
;; Version: 1.0.0 ;; Package-Version: 20241116.726
;; Package-Revision: 6064e8625b29
;; Package-Requires: ((parsebib "6.0") (s "1.9.0") (dash "2.6.0") (f "0.16.2") (cl-lib "0.5") (biblio "0.2") (emacs "26.1")) ;; Package-Requires: ((parsebib "6.0") (s "1.9.0") (dash "2.6.0") (f "0.16.2") (cl-lib "0.5") (biblio "0.2") (emacs "26.1"))
;; This program is free software; you can redistribute it and/or modify ;; This program is free software; you can redistribute it and/or modify
+11 -14
View File
@@ -1,15 +1,12 @@
(define-package "cfrs" "20220129.1149" "Child-frame based read-string" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "26.1") (define-package "cfrs" "20220129.1149"
(dash "2.11.0") "Child-frame based read-string."
(s "1.10.0") '((emacs "26.1")
(dash "2.11.0")
(s "1.10.0")
(posframe "0.6.0")) (posframe "0.6.0"))
:commit "f3a21f237b2a54e6b9f8a420a9da42b4f0a63121" :authors :url "https://github.com/Alexander-Miller/cfrs"
'(("Alexander Miller" . "alexanderm@web.de")) :commit "f3a21f237b2a54e6b9f8a420a9da42b4f0a63121"
:maintainers :revdesc "f3a21f237b2a"
'(("Alexander Miller" . "alexanderm@web.de")) :authors '(("Alexander Miller" . "alexanderm@web.de"))
:maintainer :maintainers '(("Alexander Miller" . "alexanderm@web.de")))
'("Alexander Miller" . "alexanderm@web.de")
:url "https://github.com/Alexander-Miller/cfrs")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -4,7 +4,8 @@
;; Author: Alexander Miller <alexanderm@web.de> ;; Author: Alexander Miller <alexanderm@web.de>
;; Package-Requires: ((emacs "26.1") (dash "2.11.0") (s "1.10.0") (posframe "0.6.0")) ;; Package-Requires: ((emacs "26.1") (dash "2.11.0") (s "1.10.0") (posframe "0.6.0"))
;; Package-Version: 1.6.0 ;; Package-Version: 20220129.1149
;; Package-Revision: f3a21f237b2a
;; Homepage: https://github.com/Alexander-Miller/cfrs ;; Homepage: https://github.com/Alexander-Miller/cfrs
;; This program is free software; you can redistribute it and/or modify ;; This program is free software; you can redistribute it and/or modify
+17 -21
View File
@@ -1,22 +1,18 @@
(define-package "citeproc" "20240722.1110" "A CSL 1.0.2 Citation Processor" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "26") (define-package "citeproc" "20250525.1011"
(dash "2.13.0") "A CSL 1.0.2 Citation Processor."
(s "1.12.0") '((emacs "26")
(f "0.18.0") (dash "2.13.0")
(queue "0.2") (s "1.12.0")
(f "0.18.0")
(queue "0.2")
(string-inflection "1.0") (string-inflection "1.0")
(org "9") (org "9")
(parsebib "2.4") (parsebib "2.4")
(compat "28.1")) (compat "28.1"))
:commit "54184baaff555b5c7993d566d75dd04ed485b5c0" :authors :url "https://github.com/andras-simonyi/citeproc-el"
'(("András Simonyi" . "andras.simonyi@gmail.com")) :commit "e3bf1f80bcd64edf4afef564c0d94d38aa567d61"
:maintainers :revdesc "e3bf1f80bcd6"
'(("András Simonyi" . "andras.simonyi@gmail.com")) :keywords '("bib")
:maintainer :authors '(("András Simonyi" . "andras.simonyi@gmail.com"))
'("András Simonyi" . "andras.simonyi@gmail.com") :maintainers '(("András Simonyi" . "andras.simonyi@gmail.com")))
:keywords
'("bib")
:url "https://github.com/andras-simonyi/citeproc-el")
;; Local Variables:
;; no-byte-compile: t
;; End:
+3 -1
View File
@@ -264,7 +264,9 @@ on any dominated branch for which PRED holds."
(if (and s (s-matches-p "</[[:alnum:]]+>" s)) (if (and s (s-matches-p "</[[:alnum:]]+>" s))
(let* ((parsed (citeproc-lib-parse-html-frag s)) (let* ((parsed (citeproc-lib-parse-html-frag s))
(body (cddr (cl-caddr parsed))) (body (cddr (cl-caddr parsed)))
(stripped (if (eq (caar body) 'p) (cl-cddar body) body))) (stripped (if (and (consp (car body)) (eq (caar body) 'p))
(cl-cddar body)
body)))
(if (= 1 (length stripped)) (if (= 1 (length stripped))
(citeproc-rt-from-html (car stripped)) (citeproc-rt-from-html (car stripped))
(cons nil (mapcar 'citeproc-rt-from-html stripped)))) (cons nil (mapcar 'citeproc-rt-from-html stripped))))
+2 -1
View File
@@ -7,7 +7,8 @@
;; URL: https://github.com/andras-simonyi/citeproc-el ;; URL: https://github.com/andras-simonyi/citeproc-el
;; Keywords: bib ;; Keywords: bib
;; Package-Requires: ((emacs "26") (dash "2.13.0") (s "1.12.0") (f "0.18.0") (queue "0.2") (string-inflection "1.0") (org "9") (parsebib "2.4")(compat "28.1")) ;; Package-Requires: ((emacs "26") (dash "2.13.0") (s "1.12.0") (f "0.18.0") (queue "0.2") (string-inflection "1.0") (org "9") (parsebib "2.4")(compat "28.1"))
;; Version: 0.9.3 ;; Package-Version: 20250525.1011
;; Package-Revision: e3bf1f80bcd6
;; This program is free software; you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
+9 -13
View File
@@ -1,14 +1,10 @@
(define-package "cl-libify" "20181130.230" "Update elisp code to use cl-lib instead of cl" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "cl-libify" "20181130.230"
"Update elisp code to use cl-lib instead of cl."
'((emacs "25")) '((emacs "25"))
:commit "e205b96f944a4f312fd523804cbbaf00027a3c8b" :authors :url "https://github.com/purcell/cl-libify"
'(("Steve Purcell" . "steve@sanityinc.com")) :commit "e205b96f944a4f312fd523804cbbaf00027a3c8b"
:maintainers :revdesc "e205b96f944a"
'(("Steve Purcell" . "steve@sanityinc.com")) :keywords '("lisp")
:maintainer :authors '(("Steve Purcell" . "steve@sanityinc.com"))
'("Steve Purcell" . "steve@sanityinc.com") :maintainers '(("Steve Purcell" . "steve@sanityinc.com")))
:keywords
'("lisp")
:url "https://github.com/purcell/cl-libify")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -6,7 +6,8 @@
;; Keywords: lisp ;; Keywords: lisp
;; Homepage: https://github.com/purcell/cl-libify ;; Homepage: https://github.com/purcell/cl-libify
;; Package-Requires: ((emacs "25")) ;; Package-Requires: ((emacs "25"))
;; Package-Version: 0 ;; Package-Version: 20181130.230
;; Package-Revision: e205b96f944a
;; This program is free software; you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
+14 -18
View File
@@ -1,19 +1,15 @@
(define-package "company-anaconda" "20230821.2126" "Anaconda backend for company-mode" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "25.1") (define-package "company-anaconda" "20230821.2126"
(company "0.8.0") "Anaconda backend for company-mode."
'((emacs "25.1")
(company "0.8.0")
(anaconda-mode "0.1.1") (anaconda-mode "0.1.1")
(cl-lib "0.5.0") (cl-lib "0.5.0")
(dash "2.6.0") (dash "2.6.0")
(s "1.9")) (s "1.9"))
:commit "14867265e474f7a919120bbac74870c3256cbacf" :authors :url "https://github.com/proofit404/anaconda-mode"
'(("Artem Malyshev" . "proofit404@gmail.com")) :commit "14867265e474f7a919120bbac74870c3256cbacf"
:maintainers :revdesc "14867265e474"
'(("Artem Malyshev" . "proofit404@gmail.com")) :keywords '("convenience" "company" "anaconda")
:maintainer :authors '(("Artem Malyshev" . "proofit404@gmail.com"))
'("Artem Malyshev" . "proofit404@gmail.com") :maintainers '(("Artem Malyshev" . "proofit404@gmail.com")))
:keywords
'("convenience" "company" "anaconda")
:url "https://github.com/proofit404/anaconda-mode")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -4,7 +4,8 @@
;; Author: Artem Malyshev <proofit404@gmail.com> ;; Author: Artem Malyshev <proofit404@gmail.com>
;; URL: https://github.com/proofit404/anaconda-mode ;; URL: https://github.com/proofit404/anaconda-mode
;; Version: 0.2.0 ;; Package-Version: 20230821.2126
;; Package-Revision: 14867265e474
;; Package-Requires: ((emacs "25.1") (company "0.8.0") (anaconda-mode "0.1.1") (cl-lib "0.5.0") (dash "2.6.0") (s "1.9")) ;; Package-Requires: ((emacs "25.1") (company "0.8.0") (anaconda-mode "0.1.1") (cl-lib "0.5.0") (dash "2.6.0") (s "1.9"))
;; Keywords: convenience company anaconda ;; Keywords: convenience company anaconda
+10 -14
View File
@@ -1,15 +1,11 @@
(define-package "company-ledger" "20210910.250" "Fuzzy auto-completion for Ledger & friends" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "24.3") (define-package "company-ledger" "20210910.250"
"Fuzzy auto-completion for Ledger & friends."
'((emacs "24.3")
(company "0.8.0")) (company "0.8.0"))
:commit "55fdddd6c5e9c061c685b474ef5e148a4ac9b576" :authors :url "https://github.com/debanjum/company-ledger"
'(("Debanjum Singh Solanky" . "debanjumATgmailDOTcom")) :commit "55fdddd6c5e9c061c685b474ef5e148a4ac9b576"
:maintainers :revdesc "55fdddd6c5e9"
'(("Debanjum Singh Solanky" . "debanjumATgmailDOTcom")) :keywords '("abbrev" "matching" "auto-complete" "beancount" "ledger" "company")
:maintainer :authors '(("Debanjum Singh Solanky" . "debanjumATgmailDOTcom"))
'("Debanjum Singh Solanky" . "debanjumATgmailDOTcom") :maintainers '(("Debanjum Singh Solanky" . "debanjumATgmailDOTcom")))
:keywords
'("abbrev" "matching" "auto-complete" "beancount" "ledger" "company")
:url "https://github.com/debanjum/company-ledger")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -5,7 +5,8 @@
;; Author: Debanjum Singh Solanky <debanjum AT gmail DOT com> ;; Author: Debanjum Singh Solanky <debanjum AT gmail DOT com>
;; Description: Fuzzy auto-completion for ledger & friends ;; Description: Fuzzy auto-completion for ledger & friends
;; Keywords: abbrev, matching, auto-complete, beancount, ledger, company ;; Keywords: abbrev, matching, auto-complete, beancount, ledger, company
;; Version: 0.1.0 ;; Package-Version: 20210910.250
;; Package-Revision: 55fdddd6c5e9
;; Package-Requires: ((emacs "24.3") (company "0.8.0")) ;; Package-Requires: ((emacs "24.3") (company "0.8.0"))
;; URL: https://github.com/debanjum/company-ledger ;; URL: https://github.com/debanjum/company-ledger
+10 -14
View File
@@ -1,16 +1,12 @@
(define-package "company-quickhelp" "20231026.1714" "Popup documentation for completion candidates" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "24.3") (define-package "company-quickhelp" "20231026.1714"
"Popup documentation for completion candidates."
'((emacs "24.3")
(company "0.8.9") (company "0.8.9")
(pos-tip "0.4.6")) (pos-tip "0.4.6"))
:commit "5bda859577582cc42d16fc0eaf5f7c8bedfd9e69" :authors :url "https://www.github.com/expez/company-quickhelp"
'(("Lars Andersen" . "expez@expez.com")) :commit "5bda859577582cc42d16fc0eaf5f7c8bedfd9e69"
:maintainers :revdesc "5bda85957758"
'(("Lars Andersen" . "expez@expez.com")) :keywords '("company" "popup" "documentation" "quickhelp")
:maintainer :authors '(("Lars Andersen" . "expez@expez.com"))
'("Lars Andersen" . "expez@expez.com") :maintainers '(("Lars Andersen" . "expez@expez.com")))
:keywords
'("company" "popup" "documentation" "quickhelp")
:url "https://www.github.com/expez/company-quickhelp")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -5,7 +5,8 @@
;; Author: Lars Andersen <expez@expez.com> ;; Author: Lars Andersen <expez@expez.com>
;; URL: https://www.github.com/expez/company-quickhelp ;; URL: https://www.github.com/expez/company-quickhelp
;; Keywords: company popup documentation quickhelp ;; Keywords: company popup documentation quickhelp
;; Version: 2.2.0 ;; Package-Version: 20231026.1714
;; Package-Revision: 5bda85957758
;; Package-Requires: ((emacs "24.3") (company "0.8.9") (pos-tip "0.4.6")) ;; Package-Requires: ((emacs "24.3") (company "0.8.9") (pos-tip "0.4.6"))
;; This file is not part of GNU Emacs. ;; This file is not part of GNU Emacs.
@@ -1,15 +1,11 @@
(define-package "company-statistics" "20170210.1933" "Sort candidates using completion history" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "24.3") (define-package "company-statistics" "20170210.1933"
"Sort candidates using completion history."
'((emacs "24.3")
(company "0.8.5")) (company "0.8.5"))
:commit "e62157d43b2c874d2edbd547c3bdfb05d0a7ae5c" :authors :url "https://github.com/company-mode/company-statistics"
'(("Ingo Lohmar" . "i.lohmar@gmail.com")) :commit "e62157d43b2c874d2edbd547c3bdfb05d0a7ae5c"
:maintainers :revdesc "e62157d43b2c"
'(("Ingo Lohmar" . "i.lohmar@gmail.com")) :keywords '("abbrev" "convenience" "matching")
:maintainer :authors '(("Ingo Lohmar" . "i.lohmar@gmail.com"))
'("Ingo Lohmar" . "i.lohmar@gmail.com") :maintainers '(("Ingo Lohmar" . "i.lohmar@gmail.com")))
:keywords
'("abbrev" "convenience" "matching")
:url "https://github.com/company-mode/company-statistics")
;; Local Variables:
;; no-byte-compile: t
;; End:
@@ -4,7 +4,8 @@
;; Author: Ingo Lohmar <i.lohmar@gmail.com> ;; Author: Ingo Lohmar <i.lohmar@gmail.com>
;; URL: https://github.com/company-mode/company-statistics ;; URL: https://github.com/company-mode/company-statistics
;; Version: 0.2.3 ;; Package-Version: 20170210.1933
;; Package-Revision: e62157d43b2c
;; Keywords: abbrev, convenience, matching ;; Keywords: abbrev, convenience, matching
;; Package-Requires: ((emacs "24.3") (company "0.8.5")) ;; Package-Requires: ((emacs "24.3") (company "0.8.5"))
+12 -16
View File
@@ -1,17 +1,13 @@
(define-package "company-web" "20220115.2146" "Company version of ac-html, complete for web,html,emmet,jade,slim modes" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((company "0.8.0") (define-package "company-web" "20220115.2146"
(dash "2.8.0") "Company version of ac-html, complete for web,html,emmet,jade,slim modes."
(cl-lib "0.5.0") '((company "0.8.0")
(dash "2.8.0")
(cl-lib "0.5.0")
(web-completion-data "0.1.0")) (web-completion-data "0.1.0"))
:commit "e0c6bfa3ae7006c73d0fdfc0fdb69816309baf1b" :authors :url "https://github.com/osv/company-web"
'(("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) :commit "e0c6bfa3ae7006c73d0fdfc0fdb69816309baf1b"
:maintainers :revdesc "e0c6bfa3ae70"
'(("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) :keywords '("html" "company")
:maintainer :authors '(("Olexandr Sydorchuk" . "olexandr.syd@gmail.com"))
'("Olexandr Sydorchuk" . "olexandr.syd@gmail.com") :maintainers '(("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")))
:keywords
'("html" "company")
:url "https://github.com/osv/company-web")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -3,7 +3,8 @@
;; Copyright (C) 2015 Olexandr Sydorchuk ;; Copyright (C) 2015 Olexandr Sydorchuk
;; Author: Olexandr Sydorchuk <olexandr.syd@gmail.com> ;; Author: Olexandr Sydorchuk <olexandr.syd@gmail.com>
;; Version: 2.1 ;; Package-Version: 20220115.2146
;; Package-Revision: e0c6bfa3ae70
;; Keywords: html, company ;; Keywords: html, company
;; Package-Requires: ((company "0.8.0") (dash "2.8.0") (cl-lib "0.5.0") (web-completion-data "0.1.0")) ;; Package-Requires: ((company "0.8.0") (dash "2.8.0") (cl-lib "0.5.0") (web-completion-data "0.1.0"))
;; URL: https://github.com/osv/company-web ;; URL: https://github.com/osv/company-web
-1
View File
@@ -3,7 +3,6 @@
;; Copyright (C) 2013-2015, 2017-2018, 2020, 2023 Free Software Foundation, Inc. ;; Copyright (C) 2013-2015, 2017-2018, 2020, 2023 Free Software Foundation, Inc.
;; Author: Chen Bin <chenbin DOT sh AT gmail> ;; Author: Chen Bin <chenbin DOT sh AT gmail>
;; Version: 0.2
;; This program is free software: you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
+5
View File
@@ -377,6 +377,11 @@
"new" "null" "object" "override" "package" "private" "protected" "new" "null" "object" "override" "package" "private" "protected"
"return" "sealed" "super" "this" "throw" "trait" "true" "try" "type" "val" "return" "sealed" "super" "this" "throw" "trait" "true" "try" "type" "val"
"var" "while" "with" "yield") "var" "while" "with" "yield")
(sh-mode
"break" "case" "continue" "do" "done" "elif" "else" "esac" "eval"
"exec" "exit" "export" "false" "fi" "for" "function" "if" "in" "readonly"
"return" "set" "shift" "test" "then" "time" "times" "trap" "true" "unset"
"until" "while")
(swift-mode (swift-mode
"Protocol" "Self" "Type" "and" "as" "assignment" "associatedtype" "Protocol" "Self" "Type" "and" "as" "assignment" "associatedtype"
"associativity" "available" "break" "case" "catch" "class" "column" "continue" "associativity" "available" "break" "case" "catch" "class" "column" "continue"
+8 -11
View File
@@ -1,12 +1,9 @@
(define-package "company" "20250228.258" "Modular text completion framework" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "company" "20250426.1319"
"Modular text completion framework."
'((emacs "26.1")) '((emacs "26.1"))
:commit "8d599ebc8a9aca27c0a6157aeb31c5b7f05ed0a3" :maintainers :url "http://company-mode.github.io/"
'(("Dmitry Gutov" . "dmitry@gutov.dev")) :commit "41f07c7d401c1374a76f3004a3448d3d36bdf347"
:maintainer :revdesc "41f07c7d401c"
'("Dmitry Gutov" . "dmitry@gutov.dev") :keywords '("abbrev" "convenience" "matching")
:keywords :maintainers '(("Dmitry Gutov" . "dmitry@gutov.dev")))
'("abbrev" "convenience" "matching")
:url "http://company-mode.github.io/")
;; Local Variables:
;; no-byte-compile: t
;; End:
+13 -10
View File
@@ -5,7 +5,8 @@
;; Author: Nikolaj Schumacher ;; Author: Nikolaj Schumacher
;; Maintainer: Dmitry Gutov <dmitry@gutov.dev> ;; Maintainer: Dmitry Gutov <dmitry@gutov.dev>
;; URL: http://company-mode.github.io/ ;; URL: http://company-mode.github.io/
;; Version: 1.0.2 ;; Package-Version: 20250426.1319
;; Package-Revision: 41f07c7d401c
;; Keywords: abbrev, convenience, matching ;; Keywords: abbrev, convenience, matching
;; Package-Requires: ((emacs "26.1")) ;; Package-Requires: ((emacs "26.1"))
@@ -1408,11 +1409,13 @@ be recomputed when this value changes."
(car backends))) (car backends)))
(entity (company--force-sync backend '(prefix) backend)) (entity (company--force-sync backend '(prefix) backend))
(prefix (company--prefix-str entity)) (prefix (company--prefix-str entity))
(suffix (company--suffix-str entity))) (suffix (company--suffix-str entity))
(setq args (list arg prefix suffix)) (company-backend backend))
(or (or
(apply backend command args) (company-call-backend 'adjust-boundaries arg prefix suffix)
(cons prefix suffix)))))) (if (company--proper-suffix-p arg prefix suffix)
(cons prefix suffix)
(cons prefix "")))))))
(`expand-common (`expand-common
(apply #'company--multi-expand-common (apply #'company--multi-expand-common
backends backends
@@ -2616,12 +2619,12 @@ For more details see `company-insertion-on-trigger' and
(defsubst company-keep (command) (defsubst company-keep (command)
(and (symbolp command) (get command 'company-keep))) (and (symbolp command) (get command 'company-keep)))
(defun company--proper-suffix-p (candidate) (defun company--proper-suffix-p (candidate prefix suffix)
(and (and
(>= (length candidate) (>= (length candidate)
(+ (length company-prefix) (+ (length prefix)
(length company-suffix))) (length suffix)))
(string-suffix-p company-suffix candidate (string-suffix-p suffix candidate
(company-call-backend 'ignore-case)))) (company-call-backend 'ignore-case))))
(defun company--boundaries (&optional candidate) (defun company--boundaries (&optional candidate)
@@ -2633,7 +2636,7 @@ For more details see `company-insertion-on-trigger' and
company-prefix company-suffix) company-prefix company-suffix)
(and (and
;; Default to replacing the suffix only if the completion ends with it. ;; Default to replacing the suffix only if the completion ends with it.
(company--proper-suffix-p candidate) (company--proper-suffix-p candidate company-prefix company-suffix)
(cons company-prefix company-suffix)) (cons company-prefix company-suffix))
(cons company-prefix ""))) (cons company-prefix "")))
+77 -1
View File
@@ -2,6 +2,82 @@
#+link: compat-gh https://github.com/emacs-compat/compat/issues/ #+link: compat-gh https://github.com/emacs-compat/compat/issues/
#+options: toc:nil num:nil author:nil #+options: toc:nil num:nil author:nil
* Release of "Compat" Version 30.1.0.1
- compat-28: Fix =named-let= tail recursion.
(Release <2025-06-19 Thu>)
* Release of "Compat" Version 30.1.0.0
- compat-30: Add oklab color functions.
(Release <2025-04-02 Wed>)
* Release of "Compat" Version 30.0.2.0
- compat-30: Rename =trusted-files= to =trusted-content=.
(Release <2025-01-04 Sat>)
* Release of "Compat" Version 30.0.1.0
- compat-30: New variable =untrusted-content=.
- compat-30: New variable =trusted-files=.
- compat-30: New function =trusted-content-p=.
(Release <2024-12-15 Sun>)
* Release of "Compat" Version 30.0.0.0
- compat-28: Mark =subr-native-elisp-p= as obsolete (renamed in Emacs 30).
- compat-30: New function =char-to-name=.
- compat-30: New function =obarray-clear=.
- compat-30: New function =interpreted-function-p=.
- compat-30: New function =primitive-function-p=.
- compat-30: New function =closurep=.
- compat-30: Add extended function =sort= with keyword arguments.
- compat-30: New function =value<=.
- compat-30: Add extended =copy-tree= with support for copying records with
non-nil optional second argument.
- compat-30: New macro =static-if=.
- compat-30: New alias =drop=.
- compat-30: New function =merge-ordered-lists=.
- compat-30: New variables =completion-lazy-hilit= and =completion-lazy-hilit-fn=
and new function =completion-lazy-hilit=.
- compat-30: New function =require-with-check=.
- compat-30: New functions =find-buffer= and =get-truename-buffer=.
- compat-30: Add extended =completion-metadata-get= with support for
=completion-category-overrides= and =completion-extra-properties=.
(Release <2024-07-08 Mon>)
* Release of "Compat" Version 29.1.4.5
- Minor optimization of ~plist-get~ and ~plist-put~.
- Minor compatibility adjustments for the Emacs 30 development version.
- A minimal version of =compat.el= will be part of Emacs 30. Emacs :core packages
can directly ~(require 'compat)~ without the ~NOERROR~ flag. Furthermore Compat
will not be installed unnecessarily. If a package depending on Emacs 25.1 and
Compat 29.1 is installed on Emacs 30.1, Compat 29.1 will not be installed from
ELPA, since Emacs 30.1 already provides the required functionality.
(Release <2024-03-16 Sat>)
* Release of "Compat" Version 29.1.4.4
- Fix ~Package-Requires~ header in compat.el
- Fix ~Maintainer~ header in compat.el
(Release <2023-11-13 Mon>)
* Release of "Compat" Version 29.1.4.3
- compat-29: Add function =char-uppercase-p=.
- compat-29: Add function =window-configuration-equal-p=.
(Release <2023-11-04 Sat>)
* Release of "Compat" Version 29.1.4.2 * Release of "Compat" Version 29.1.4.2
- compat-28: Improve =make-separator-line= visuals on graphic displays. - compat-28: Improve =make-separator-line= visuals on graphic displays.
@@ -265,7 +341,7 @@ directly (see [[compat-srht:2]]).
* Release of "Compat" Version 28.1.1.0 * Release of "Compat" Version 28.1.1.0
This release mostly fixes a number of smaller bugs that were not This release mostly fixes a number of smaller bugs that were not
identified as of 28.1.0.0. Nevertheless these warrent a version bump, identified as of 28.1.0.0. Nevertheless these warrant a version bump,
as some of these changes a functional. These include: as some of these changes a functional. These include:
- The addition of the =file-attribute-*= accessor functions. - The addition of the =file-attribute-*= accessor functions.
+7 -18
View File
@@ -1,6 +1,6 @@
;;; compat-25.el --- Functionality added in Emacs 25.1 -*- lexical-binding: t; -*- ;;; compat-25.el --- Functionality added in Emacs 25.1 -*- lexical-binding: t; -*-
;; Copyright (C) 2021-2023 Free Software Foundation, Inc. ;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
;; This program is free software; you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
@@ -40,23 +40,6 @@ usage: (bool-vector &rest OBJECTS)"
i (1+ i))) i (1+ i)))
vec)) vec))
;;;; Defined in fns.c
(compat-defun sort (seq predicate) ;; <compat-tests:sort>
"Handle vector SEQ."
:extended t
(cond
((listp seq)
(sort seq predicate))
((vectorp seq)
(let* ((list (sort (append seq nil) predicate))
(p list) (i 0))
(while p
(aset seq i (car p))
(setq i (1+ i) p (cdr p)))
(apply #'vector list)))
((signal 'wrong-type-argument 'list-or-vector-p))))
;;;; Defined in editfns.c ;;;; Defined in editfns.c
(compat-defalias format-message format) ;; <compat-tests:format-message> (compat-defalias format-message format) ;; <compat-tests:format-message>
@@ -267,5 +250,11 @@ itself or not."
form)))))))) form))))))))
(t form))) (t form)))
;;;; Defined in minibuffer.el
(compat-defun completion--category-override (category tag) ;; <compat-tests:completion-metadata-get>
"Return completion category override for CATEGORY and TAG."
(assq tag (cdr (assq category completion-category-overrides))))
(provide 'compat-25) (provide 'compat-25)
;;; compat-25.el ends here ;;; compat-25.el ends here
+2 -2
View File
@@ -1,6 +1,6 @@
;;; compat-26.el --- Functionality added in Emacs 26.1 -*- lexical-binding: t; -*- ;;; compat-26.el --- Functionality added in Emacs 26.1 -*- lexical-binding: t; -*-
;; Copyright (C) 2021-2023 Free Software Foundation, Inc. ;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
;; This program is free software; you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
@@ -75,7 +75,7 @@ see `region-noncontiguous-p' and `extract-rectangle-bounds'."
;;;; Defined in subr.el ;;;; Defined in subr.el
(compat-defun provided-mode-derived-p (mode &rest modes) ;; <compat-tests:provided-derived-mode-p> (compat-defun provided-mode-derived-p (mode &rest modes) ;; <compat-tests:provided-mode-derived-p>
"Non-nil if MODE is derived from one of MODES. "Non-nil if MODE is derived from one of MODES.
Uses the `derived-mode-parent' property of the symbol to trace backwards. Uses the `derived-mode-parent' property of the symbol to trace backwards.
If you just want to check `major-mode', use `derived-mode-p'." If you just want to check `major-mode', use `derived-mode-p'."
+1 -1
View File
@@ -1,6 +1,6 @@
;;; compat-27.el --- Functionality added in Emacs 27.1 -*- lexical-binding: t; -*- ;;; compat-27.el --- Functionality added in Emacs 27.1 -*- lexical-binding: t; -*-
;; Copyright (C) 2021-2023 Free Software Foundation, Inc. ;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
;; This program is free software; you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
+21 -18
View File
@@ -1,6 +1,6 @@
;;; compat-28.el --- Functionality added in Emacs 28.1 -*- lexical-binding: t; -*- ;;; compat-28.el --- Functionality added in Emacs 28.1 -*- lexical-binding: t; -*-
;; Copyright (C) 2021-2023 Free Software Foundation, Inc. ;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
;; This program is free software; you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@
;; FIXME Should handle multibyte regular expressions ;; FIXME Should handle multibyte regular expressions
(compat-defun string-search (needle haystack &optional start-pos) ;; <compat-tests:string-search> (compat-defun string-search (needle haystack &optional start-pos) ;; <compat-tests:string-search>
"Search for the string NEEDLE in the strign HAYSTACK. "Search for the string NEEDLE in the string HAYSTACK.
The return value is the position of the first occurrence of The return value is the position of the first occurrence of
NEEDLE in HAYSTACK, or nil if no match was found. NEEDLE in HAYSTACK, or nil if no match was found.
@@ -52,9 +52,8 @@ issues are inherited."
(when (and start-pos (or (< (length haystack) start-pos) (when (and start-pos (or (< (length haystack) start-pos)
(< start-pos 0))) (< start-pos 0)))
(signal 'args-out-of-range (list start-pos))) (signal 'args-out-of-range (list start-pos)))
(save-match-data (let (case-fold-search)
(let ((case-fold-search nil)) (string-match-p (regexp-quote needle) haystack start-pos)))
(string-match (regexp-quote needle) haystack start-pos))))
(compat-defun length= (sequence length) ;; [[compat-tests:length=]] (compat-defun length= (sequence length) ;; [[compat-tests:length=]]
"Returns non-nil if SEQUENCE has a length equal to LENGTH." "Returns non-nil if SEQUENCE has a length equal to LENGTH."
@@ -66,7 +65,7 @@ issues are inherited."
t)) t))
((arrayp sequence) ((arrayp sequence)
(= (length sequence) length)) (= (length sequence) length))
((signal 'wrong-type-argument sequence)))) (t (signal 'wrong-type-argument (list 'sequencep sequence)))))
(compat-defun length< (sequence length) ;; [[compat-tests:length<]] (compat-defun length< (sequence length) ;; [[compat-tests:length<]]
"Returns non-nil if SEQUENCE is shorter than LENGTH." "Returns non-nil if SEQUENCE is shorter than LENGTH."
@@ -76,7 +75,7 @@ issues are inherited."
(null (nthcdr (1- length) sequence))) (null (nthcdr (1- length) sequence)))
((arrayp sequence) ((arrayp sequence)
(< (length sequence) length)) (< (length sequence) length))
((signal 'wrong-type-argument sequence)))) (t (signal 'wrong-type-argument (list 'sequencep sequence)))))
(compat-defun length> (sequence length) ;; [[compat-tests:length>]] (compat-defun length> (sequence length) ;; [[compat-tests:length>]]
"Returns non-nil if SEQUENCE is longer than LENGTH." "Returns non-nil if SEQUENCE is longer than LENGTH."
@@ -85,7 +84,7 @@ issues are inherited."
(and (nthcdr length sequence) t)) (and (nthcdr length sequence) t))
((arrayp sequence) ((arrayp sequence)
(> (length sequence) length)) (> (length sequence) length))
((signal 'wrong-type-argument sequence)))) (t (signal 'wrong-type-argument (list 'sequencep sequence)))))
;;;; Defined in fileio.c ;;;; Defined in fileio.c
@@ -191,7 +190,7 @@ and BLUE, is normalized to have its value in [0,65535]."
;; The "RGBi" (RGB Intensity) specification is defined by ;; The "RGBi" (RGB Intensity) specification is defined by
;; XCMS[0], see [1] for the implementation in Xlib. ;; XCMS[0], see [1] for the implementation in Xlib.
;; ;;
;; [0] http://www.nic.funet.fi/pub/X11/X11R4/DOCS/color/Xcms.text ;; [0] https://www.nic.funet.fi/pub/X11/X11R4/DOCS/color/Xcms.text
;; [1] https://gitlab.freedesktop.org/xorg/lib/libx11/-/blob/master/src/xcms/LRGB.c#L1392 ;; [1] https://gitlab.freedesktop.org/xorg/lib/libx11/-/blob/master/src/xcms/LRGB.c#L1392
((string-match ((string-match
;; (rx bos "rgbi:" (* space) ;; (rx bos "rgbi:" (* space)
@@ -355,11 +354,10 @@ REPLACEMENT can use the following special elements:
(compat-defun buffer-local-boundp (symbol buffer) ;; <compat-tests:buffer-local-boundp> (compat-defun buffer-local-boundp (symbol buffer) ;; <compat-tests:buffer-local-boundp>
"Return non-nil if SYMBOL is bound in BUFFER. "Return non-nil if SYMBOL is bound in BUFFER.
Also see `local-variable-p'." Also see `local-variable-p'."
(catch 'fail (condition-case nil
(condition-case nil (progn (buffer-local-value symbol buffer)
(buffer-local-value symbol buffer) t)
(void-variable nil (throw 'fail nil))) (void-variable nil)))
t))
(compat-defmacro with-existing-directory (&rest body) ;; <compat-tests:with-existing-directory> (compat-defmacro with-existing-directory (&rest body) ;; <compat-tests:with-existing-directory>
"Execute BODY with `default-directory' bound to an existing directory. "Execute BODY with `default-directory' bound to an existing directory.
@@ -398,7 +396,8 @@ not a list, return a one-element list containing OBJECT."
;;;; Defined in data.c ;;;; Defined in data.c
(compat-defalias subr-native-elisp-p ignore) ;; <compat-tests:subr-native-elisp-p> ;; Renamed in Emacs 30 to `native-comp-function-p'.
(compat-defalias subr-native-elisp-p ignore :obsolete t) ;; <compat-tests:obsolete-subr-native-elisp-p>
;;;; Defined in subr-x.el ;;;; Defined in subr-x.el
@@ -519,7 +518,11 @@ as the new values of the bound variables in the recursive invocation."
(cons (car handler) (cons (car handler)
(funcall tco-progn (cdr handler)))) (funcall tco-progn (cdr handler))))
(nthcdr 3 expr)))) (nthcdr 3 expr))))
((memq (car-safe expr) '(and progn)) ((eq (car-safe expr) 'and)
(if (cddr expr)
(funcall tco `(if ,(cadr expr) ,(cons 'and (cddr expr))))
(funcall tco (cadr expr))))
((eq (car-safe expr) 'progn)
(cons (car expr) (funcall tco-progn (cdr expr)))) (cons (car expr) (funcall tco-progn (cdr expr))))
((memq (car-safe expr) '(let let*)) ((memq (car-safe expr) '(let let*))
(append (list (car expr) (cadr expr)) (append (list (car expr) (cadr expr))
@@ -784,7 +787,7 @@ Other uses risk returning non-nil value that point to the wrong file."
;;;; Defined in env.el ;;;; Defined in env.el
(compat-defmacro with-environment-variables (variables &rest body) ;; <compat-tests:with-environment-variables> (compat-defmacro with-environment-variables (variables &rest body) ;; <compat-tests:with-environment-variables>
"Set VARIABLES in the environent and execute BODY. "Set VARIABLES in the environment and execute BODY.
VARIABLES is a list of variable settings of the form (VAR VALUE), VARIABLES is a list of variable settings of the form (VAR VALUE),
where VAR is the name of the variable (a string) and VALUE where VAR is the name of the variable (a string) and VALUE
is its value (also a string). is its value (also a string).
@@ -837,7 +840,7 @@ function will never return nil."
;;;; Defined in button.el ;;;; Defined in button.el
;; Obsolete Alias since 29 ;; Obsolete Alias since 29
(compat-defalias button-buttonize buttonize :obsolete t) ;; <compat-tests:button-buttonize> (compat-defalias button-buttonize buttonize :obsolete t) ;; <compat-tests:obsolete-button-buttonize>
;;;; Defined in wid-edit.el ;;;; Defined in wid-edit.el
+39 -25
View File
@@ -1,6 +1,6 @@
;;; compat-29.el --- Functionality added in Emacs 29.1 -*- lexical-binding: t; -*- ;;; compat-29.el --- Functionality added in Emacs 29.1 -*- lexical-binding: t; -*-
;; Copyright (C) 2021-2023 Free Software Foundation, Inc. ;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
;; This program is free software; you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
@@ -37,6 +37,10 @@
(locate-file "simple" load-path (get-load-suffixes)))) (locate-file "simple" load-path (get-load-suffixes))))
"Directory where Emacs's own *.el and *.elc Lisp files are installed.") "Directory where Emacs's own *.el and *.elc Lisp files are installed.")
;;;; Defined in window.c
(compat-defalias window-configuration-equal-p compare-window-configurations) ;; <compat-tests:window-configuration-equal-p>
;;;; Defined in xdisp.c ;;;; Defined in xdisp.c
(compat-defun get-display-property (position prop &optional object properties) ;; <compat-tests:get-display-property> (compat-defun get-display-property (position prop &optional object properties) ;; <compat-tests:get-display-property>
@@ -98,38 +102,40 @@ Unibyte strings are converted to multibyte for comparison."
(compat-defun plist-get (plist prop &optional predicate) ;; <compat-tests:plist-get> (compat-defun plist-get (plist prop &optional predicate) ;; <compat-tests:plist-get>
"Handle optional argument PREDICATE." "Handle optional argument PREDICATE."
:extended t :extended t
(if (or (null predicate) (eq predicate 'eq)) (pcase predicate
(plist-get plist prop) ((or `nil `eq) (plist-get plist prop))
(catch 'found (`equal (lax-plist-get plist prop))
(while (consp plist) (_ (catch 'found
(when (funcall predicate prop (car plist)) (while (consp plist)
(throw 'found (cadr plist))) (when (funcall predicate prop (car plist))
(setq plist (cddr plist)))))) (throw 'found (cadr plist)))
(setq plist (cddr plist)))))))
(compat-defun plist-put (plist prop val &optional predicate) ;; <compat-tests:plist-get> (compat-defun plist-put (plist prop val &optional predicate) ;; <compat-tests:plist-get>
"Handle optional argument PREDICATE." "Handle optional argument PREDICATE."
:extended t :extended t
(if (or (null predicate) (eq predicate 'eq)) (pcase predicate
(plist-put plist prop val) ((or `nil `eq) (plist-put plist prop val))
(catch 'found (`equal (lax-plist-put plist prop val))
(let ((tail plist)) (_ (catch 'found
(while (consp tail) (let ((tail plist))
(when (funcall predicate prop (car tail)) (while (consp tail)
(setcar (cdr tail) val) (when (funcall predicate prop (car tail))
(throw 'found plist)) (setcar (cdr tail) val)
(setq tail (cddr tail)))) (throw 'found plist))
(nconc plist (list prop val))))) (setq tail (cddr tail))))
(nconc plist (list prop val))))))
(compat-defun plist-member (plist prop &optional predicate) ;; <compat-tests:plist-get> (compat-defun plist-member (plist prop &optional predicate) ;; <compat-tests:plist-get>
"Handle optional argument PREDICATE." "Handle optional argument PREDICATE."
:extended t :extended t
(if (or (null predicate) (eq predicate 'eq)) (pcase predicate
(plist-member plist prop) ((or `nil `eq) (plist-member plist prop))
(catch 'found (_ (catch 'found
(while (consp plist) (while (consp plist)
(when (funcall predicate prop (car plist)) (when (funcall predicate prop (car plist))
(throw 'found plist)) (throw 'found plist))
(setq plist (cddr plist)))))) (setq plist (cddr plist)))))))
;;;; Defined in gv.el ;;;; Defined in gv.el
@@ -506,6 +512,14 @@ thus overriding the value of the TIMEOUT argument to that function.")
;;;; Defined in simple.el ;;;; Defined in simple.el
(compat-defun char-uppercase-p (char) ;; <compat-tests:char-uppercase-p>
"Return non-nil if CHAR is an upper-case character.
If the Unicode tables are not yet available, e.g. during bootstrap,
then gives correct answers only for ASCII characters."
(cond ((unicode-property-table-internal 'lowercase)
(characterp (get-char-code-property char 'lowercase)))
((and (>= char ?A) (<= char ?Z)))))
(compat-defun use-region-noncontiguous-p () ;; <compat-tests:region-noncontiguous-p> (compat-defun use-region-noncontiguous-p () ;; <compat-tests:region-noncontiguous-p>
"Return non-nil for a non-contiguous region if `use-region-p'." "Return non-nil for a non-contiguous region if `use-region-p'."
(and (use-region-p) (region-noncontiguous-p))) (and (use-region-p) (region-noncontiguous-p)))
+474
View File
@@ -0,0 +1,474 @@
;;; compat-30.el --- Functionality added in Emacs 30 -*- lexical-binding: t; -*-
;; Copyright (C) 2023-2025 Free Software Foundation, Inc.
;; 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 <https://www.gnu.org/licenses/>.
;;; Commentary:
;; Functionality added in Emacs 30, needed by older Emacs versions.
;;; Code:
(eval-when-compile (load "compat-macs.el" nil t t))
(compat-require compat-29 "29.1")
(compat-version "29.3")
(compat-defvar untrusted-content nil ;; <compat-tests:untrusted-content>
"Non-nil means that current buffer originated from an untrusted source.
Email clients and some other modes may set this non-nil to mark the
buffer contents as untrusted.
This variable might be subject to change without notice."
:local permanent)
(compat-version "30.1")
;;;; Defined in lread.c
(compat-defun obarray-clear (ob) ;; <compat-tests:obarray-clear>
"Remove all symbols from obarray OB."
(fillarray ob 0))
;;;; Defined in buffer.c
(compat-defun find-buffer (variable value) ;; <compat-tests:find-buffer>
"Return the buffer with buffer-local VARIABLE equal to VALUE.
If there is no such live buffer, return nil."
(cl-loop for buffer the buffers
if (equal (buffer-local-value variable buffer) value)
return buffer))
(compat-defun get-truename-buffer (filename) ;; <compat-tests:get-truename-buffer>
"Return the buffer with `file-truename' equal to FILENAME (a string).
If there is no such live buffer, return nil.
See also `find-buffer-visiting'."
(find-buffer 'buffer-file-truename filename))
;;;; Defined in files.el
(compat-defvar trusted-content nil ;; <compat-tests:trusted-content>
"List of files and directories whose content we trust.
Be extra careful here since trusting means that Emacs might execute the
code contained within those files and directories without an explicit
request by the user.
One important case when this might happen is when `flymake-mode' is
enabled (for example, when it is added to a mode hook).
Each element of the list should be a string:
- If it ends in \"/\", it is considered as a directory name and means that
Emacs should trust all the files whose name has this directory as a prefix.
- else it is considered as a file name.
Use abbreviated file names. For example, an entry \"~/mycode\" means
that Emacs will trust all the files in your directory \"mycode\".
This variable can also be set to `:all', in which case Emacs will trust
all files, which opens a gaping security hole."
:risky t)
(compat-defun trusted-content-p () ;; <compat-tests:trusted-content-p>
"Return non-nil if we trust the contents of the current buffer.
Here, \"trust\" means that we are willing to run code found inside of it.
See also `trusted-content'."
(and (not untrusted-content)
(or
(eq trusted-content :all)
(and
buffer-file-truename
(with-demoted-errors "trusted-content-p: %S"
(let ((exists (file-exists-p buffer-file-truename)))
(or
(if (and exists user-init-file)
(file-equal-p buffer-file-truename user-init-file)
(equal buffer-file-truename user-init-file))
(let ((file (abbreviate-file-name buffer-file-truename))
(trusted nil))
(dolist (tf trusted-content)
(when (or (if exists (file-equal-p tf file) (equal tf file))
(and (string-suffix-p "/" tf)
(string-prefix-p tf file)))
(setq trusted t)))
trusted))))))))
(compat-defun require-with-check (feature &optional filename noerror) ;; <compat-tests:require-with-check>
"If FEATURE is not already loaded, load it from FILENAME.
This is like `require' except if FEATURE is already a member of the list
`features, then check if it was provided by a different file than the
one that is about to be loaded now (presumably because `load-path' has
been changed since FILENAME was loaded). If that is the case, either
signal an error (the default), or forcibly reload the new file (if
NOERROR is equal to `reload'), or otherwise emit a warning."
(let ((lh load-history)
(res (require feature filename (if (eq noerror 'reload) nil noerror))))
;; If the `feature' was not yet provided, `require' just loaded the right
;; file, so we're done.
(when (and res (eq lh load-history))
;; If `require' did nothing, we need to make sure that was warranted.
(let* ((fn (locate-file (or filename (symbol-name feature))
load-path (get-load-suffixes) nil
)) ;; load-prefer-newer
;; We used to look for `fn' in `load-history' with `assoc'
;; which works in most cases, but in some cases (e.g. when
;; `load-prefer-newer' is set) `locate-file' can return a
;; different file than the file that `require' would load,
;; so the file won't be found in `load-history' even though
;; we did load "it". (bug#74040)
;; So use a "permissive" search which doesn't pay attention to
;; differences between file extensions.
(prefix (if (string-match
(concat (regexp-opt (get-load-suffixes)) "\\'") fn)
(concat (substring fn 0 (match-beginning 0)) ".")
fn))
(lh load-history))
(while (and lh (let ((file (car-safe (car lh))))
(not (and file (string-prefix-p prefix file)))))
(setq lh (cdr lh)))
(cond
(lh nil) ;We loaded the right file.
((eq noerror 'reload) (load fn nil 'nomessage))
((and fn (memq feature features))
(funcall (if noerror #'warn #'error)
"Feature `%S' is now provided by a different file %s"
feature fn))
(fn
(funcall (if noerror #'warn #'error)
"Could not load file %s" fn))
(t
(funcall (if noerror #'warn #'error)
"Could not locate file %s in load path"
(or filename (symbol-name feature)))))))
res))
;;;; Defined in minibuffer.el
(compat-defun completion--metadata-get-1 (metadata prop) ;; <compat-tests:completion-metadata-get>
"Helper function.
See for `completion-metadata-get' for METADATA and PROP arguments."
(or (alist-get prop metadata)
(plist-get completion-extra-properties
(or (get prop 'completion-extra-properties--keyword)
(put prop 'completion-extra-properties--keyword
(intern (concat ":" (symbol-name prop))))))))
(compat-defun completion-metadata-get (metadata prop) ;; <compat-tests:completion-metadata-get>
"Get property PROP from completion METADATA.
If the metadata specifies a completion category, the variables
`completion-category-overrides' and
`completion-category-defaults' take precedence for
category-specific overrides. If the completion metadata does not
specify the property, the `completion-extra-properties' plist is
consulted. Note that the keys of the
`completion-extra-properties' plist are keyword symbols, not
plain symbols."
:extended t
(if-let ((cat (and (not (eq prop 'category))
(completion--metadata-get-1 metadata 'category)))
(over (completion--category-override cat prop)))
(cdr over)
(completion--metadata-get-1 metadata prop)))
(compat-defvar completion-lazy-hilit nil ;; <compat-tests:completion-lazy-hilit>
"If non-nil, request lazy highlighting of completion candidates.
Lisp programs (a.k.a. \"front ends\") that present completion
candidates may opt to bind this variable to a non-nil value when
calling functions (such as `completion-all-completions') which
produce completion candidates. This tells the underlying
completion styles that they do not need to fontify (i.e.,
propertize with the `face' property) completion candidates in a
way that highlights the matching parts. Then it is the front end
which presents the candidates that becomes responsible for this
fontification. The front end does that by calling the function
`completion-lazy-hilit' on each completion candidate that is to be
displayed to the user.
Note that only some completion styles take advantage of this
variable for optimization purposes. Other styles will ignore the
hint and fontify eagerly as usual. It is still safe for a
front end to call `completion-lazy-hilit' in these situations.
To author a completion style that takes advantage of this variable,
see `completion-lazy-hilit-fn' and `completion-pcm--hilit-commonality'.")
(compat-defvar completion-lazy-hilit-fn nil ;; <compat-tests:completion-lazy-hilit>
"Fontification function set by lazy-highlighting completions styles.
When a given style wants to enable support for `completion-lazy-hilit'
\(which see), that style should set this variable to a function of one
argument. It will be called with each completion candidate, a string, to
be displayed to the user, and should destructively propertize these
strings with the `face' property.")
(compat-defun completion-lazy-hilit (str) ;; <compat-tests:completion-lazy-hilit>
"Return a copy of completion candidate STR that is `face'-propertized.
See documentation of the variable `completion-lazy-hilit' for more
details."
(if (and completion-lazy-hilit completion-lazy-hilit-fn)
(funcall completion-lazy-hilit-fn (copy-sequence str))
str))
;;;; Defined in color.el
(compat-defun color-oklab-to-xyz (l a b) ;; <compat-tests:color-oklab-to-xyz>
"Convert the OkLab color represented by L A B to CIE XYZ.
Oklab is a perceptual color space created by Björn Ottosson
<https://bottosson.github.io/posts/oklab/>. It has the property that
changes in the hue and saturation of a color can be made while maintaining
the same perceived lightness."
:feature color
(let ((ll (expt (+ (* 1.0 l) (* 0.39633779 a) (* 0.21580376 b)) 3))
(mm (expt (+ (* 1.00000001 l) (* -0.10556134 a) (* -0.06385417 b)) 3))
(ss (expt (+ (* 1.00000005 l) (* -0.08948418 a) (* -1.29148554 b)) 3)))
(list (+ (* ll 1.22701385) (* mm -0.55779998) (* ss 0.28125615))
(+ (* ll -0.04058018) (* mm 1.11225687) (* ss -0.07167668))
(+ (* ll -0.07638128) (* mm -0.42148198) (* ss 1.58616322)))))
(compat-defun color-xyz-to-oklab (x y z) ;; <compat-tests:color-xyz-to-oklab>
"Convert the CIE XYZ color represented by X Y Z to Oklab."
:feature color
(let ((ll (+ (* x 0.8189330101) (* y 0.3618667424) (* z -0.1288597137)))
(mm (+ (* x 0.0329845436) (* y 0.9293118715) (* z 0.0361456387)))
(ss (+ (* x 0.0482003018) (* y 0.2643662691) (* z 0.6338517070))))
(let*
((cube-root (lambda (f)
(if (< f 0)
(- (expt (- f) (/ 1.0 3.0)))
(expt f (/ 1.0 3.0)))))
(lll (funcall cube-root ll))
(mmm (funcall cube-root mm))
(sss (funcall cube-root ss)))
(list (+ (* lll 0.2104542553) (* mmm 0.7936177850) (* sss -0.0040720468))
(+ (* lll 1.9779984951) (* mmm -2.4285922050) (* sss 0.4505937099))
(+ (* lll 0.0259040371) (* mmm 0.7827717662) (* sss -0.8086757660))))))
(compat-defun color-oklab-to-srgb (l a b) ;; <compat-tests:color-oklab-to-srgb>
"Convert the Oklab color represented by L A B to sRGB."
:feature color
(apply #'color-xyz-to-srgb (color-oklab-to-xyz l a b)))
(compat-defun color-srgb-to-oklab (r g b) ;; <compat-tests:color-srgb-to-oklab>
"Convert the sRGB color R G B to Oklab."
:feature color
(apply #'color-xyz-to-oklab (color-srgb-to-xyz r g b)))
;;;; Defined in subr.el
(compat-defmacro static-if (condition then-form &rest else-forms) ;; <compat-tests:static-if>
"A conditional compilation macro.
Evaluate CONDITION at macro-expansion time. If it is non-nil,
expand the macro to THEN-FORM. Otherwise expand it to ELSE-FORMS
enclosed in a `progn' form. ELSE-FORMS may be empty."
(declare (indent 2) (debug (sexp sexp &rest sexp)))
(if (eval condition lexical-binding)
then-form
(cons 'progn else-forms)))
(compat-defun closurep (object) ;; <compat-tests:closurep>
"Return t if OBJECT is a function of type closure."
(declare (side-effect-free error-free))
(eq (car-safe object) 'closure))
(compat-defalias interpreted-function-p closurep) ;; <compat-tests:closurep>
(compat-defun primitive-function-p (object) ;; <compat-tests:primitive-function-p>
"Return t if OBJECT is a built-in primitive function.
This excludes special forms, since they are not functions."
(declare (side-effect-free error-free))
(and (subrp object)
(not (or (with-no-warnings (subr-native-elisp-p object))
(special-form-p object)))))
(compat-defalias drop nthcdr) ;; <compat-tests:drop>
(compat-defun merge-ordered-lists (lists &optional error-function) ;; <compat-tests:merge-ordered-lists>
"Merge LISTS in a consistent order.
LISTS is a list of lists of elements.
Merge them into a single list containing the same elements (removing
duplicates), obeying their relative positions in each list.
The order of the (sub)lists determines the final order in those cases where
the order within the sublists does not impose a unique choice.
Equality of elements is tested with `eql'.
If a consistent order does not exist, call ERROR-FUNCTION with
a remaining list of lists that we do not know how to merge.
It should return the candidate to use to continue the merge, which
has to be the head of one of the lists.
By default we choose the head of the first list."
(let ((result '()))
(setq lists (remq nil lists))
(while (cdr (setq lists (delq nil lists)))
(let* ((next nil)
(tail lists))
(while tail
(let ((candidate (caar tail))
(other-lists lists))
(while other-lists
(if (not (memql candidate (cdr (car other-lists))))
(setq other-lists (cdr other-lists))
(setq candidate nil)
(setq other-lists nil)))
(if (not candidate)
(setq tail (cdr tail))
(setq next candidate)
(setq tail nil))))
(unless next
(setq next (funcall (or error-function #'caar) lists))
(unless (funcall
(eval-when-compile (if (fboundp 'compat--assoc) 'compat--assoc 'assoc))
next lists #'eql)
(error "Invalid candidate returned by error-function: %S" next)))
(push next result)
(setq lists
(mapcar (lambda (l) (if (eql (car l) next) (cdr l) l))
lists))))
(if (null result) (car lists)
(append (nreverse result) (car lists)))))
(compat-defun copy-tree (tree &optional vectors-and-records) ;; <compat-tests:copy-tree>
"Handle copying records when optional arg is non-nil."
:extended t
(declare (side-effect-free error-free))
(if (fboundp 'recordp)
(if (consp tree)
(let (result)
(while (consp tree)
(let ((newcar (car tree)))
(if (or (consp (car tree))
(and vectors-and-records
(or (vectorp (car tree)) (recordp (car tree)))))
(setq newcar (compat--copy-tree (car tree) vectors-and-records)))
(push newcar result))
(setq tree (cdr tree)))
(nconc (nreverse result)
(if (and vectors-and-records (or (vectorp tree) (recordp tree)))
(compat--copy-tree tree vectors-and-records)
tree)))
(if (and vectors-and-records (or (vectorp tree) (recordp tree)))
(let ((i (length (setq tree (copy-sequence tree)))))
(while (>= (setq i (1- i)) 0)
(aset tree i (compat--copy-tree (aref tree i) vectors-and-records)))
tree)
tree))
(copy-tree tree vectors-and-records)))
;;;; Defined in fns.c
(compat-defun value< (a b) ;; <compat-tests:value<>
"Return non-nil if A precedes B in standard value order.
A and B must have the same basic type.
Numbers are compared with <.
Strings and symbols are compared with string-lessp.
Lists, vectors, bool-vectors and records are compared lexicographically.
Markers are compared lexicographically by buffer and position.
Buffers and processes are compared by name.
Other types are considered unordered and the return value will be nil."
(cond
((or (and (numberp a) (numberp b))
(and (markerp a) (markerp b)))
(< a b))
((or (and (stringp a) (stringp b))
(and (symbolp a) (symbolp b)))
(string< a b))
((and (listp a) (listp b))
(while (and (consp a) (consp b) (equal (car a) (car b)))
(setq a (cdr a) b (cdr b)))
(cond
((not b) nil)
((not a) t)
((and (consp a) (consp b)) (value< (car a) (car b)))
(t (value< a b))))
((and (vectorp a) (vectorp b))
(let* ((na (length a))
(nb (length b))
(n (min na nb))
(i 0))
(while (and (< i n) (equal (aref a i) (aref b i)))
(cl-incf i))
(if (< i n) (value< (aref a i) (aref b i)) (< n nb))))
((and (bufferp a) (bufferp b))
;; `buffer-name' is nil for killed buffers.
(setq a (buffer-name a)
b (buffer-name b))
(cond
((and a b) (string< a b))
(b t)))
((and (processp a) (processp b))
(string< (process-name a) (process-name b)))
;; TODO Add support for more types here.
;; Other values of equal type are considered unordered (return value nil).
((eq (type-of a) (type-of b)) nil)
;; Different types.
(t (error "value< type mismatch: %S %S" a b))))
(compat-defun sort (seq &optional lessp &rest rest) ;; <compat-tests:sort>
"Sort function with support for keyword arguments.
The following arguments are defined:
:key FUNC -- FUNC is a function that takes a single element from SEQ and
returns the key value to be used in comparison. If absent or nil,
`identity' is used.
:lessp FUNC -- FUNC is a function that takes two arguments and returns
non-nil if the first element should come before the second.
If absent or nil, `value<' is used.
:reverse BOOL -- if BOOL is non-nil, the sorting order implied by FUNC is
reversed. This does not affect stability: equal elements still retain
their order in the input sequence.
:in-place BOOL -- if BOOL is non-nil, SEQ is sorted in-place and returned.
Otherwise, a sorted copy of SEQ is returned and SEQ remains unmodified;
this is the default.
For compatibility, the calling convention (sort SEQ LESSP) can also be used;
in this case, sorting is always done in-place."
:extended t
(let ((in-place t) (reverse nil) (orig-seq seq))
(when (or (not lessp) rest)
(setq
rest (if lessp (cons lessp rest) rest)
in-place (plist-get rest :in-place)
reverse (plist-get rest :reverse)
lessp (let ((key (plist-get rest :key))
(< (or (plist-get rest :lessp) #'value<)))
(if key
(lambda (a b) (funcall < (funcall key a) (funcall key b)))
<))
seq (if (or (and (eval-when-compile (< emacs-major-version 25)) (vectorp orig-seq))
in-place)
seq
(copy-sequence seq))))
;; Emacs 24 does not support vectors. Convert to list.
(when (and (eval-when-compile (< emacs-major-version 25)) (vectorp orig-seq))
(setq seq (append seq nil)))
(setq seq (if reverse
(nreverse (sort (nreverse seq) lessp))
(sort seq lessp)))
;; Emacs 24: Convert back to vector.
(if (and (eval-when-compile (< emacs-major-version 25)) (vectorp orig-seq))
(if in-place
(cl-loop for i from 0 for x in seq
do (aset orig-seq i x)
finally return orig-seq)
(apply #'vector seq))
seq)))
;;;; Defined in mule-cmds.el
(compat-defun char-to-name (char) ;; <compat-tests:char-to-name>
"Return the Unicode name for CHAR, if it has one, else nil.
Return nil if CHAR is not a character."
(and (characterp char)
(or (get-char-code-property char 'name)
(get-char-code-property char 'old-name))))
(provide 'compat-30)
;;; compat-30.el ends here
+17 -10
View File
@@ -1,6 +1,6 @@
;;; compat-macs.el --- Compatibility Macros -*- lexical-binding: t; no-byte-compile: t; -*- ;;; compat-macs.el --- Compatibility Macros -*- lexical-binding: t; no-byte-compile: t; -*-
;; Copyright (C) 2021-2023 Free Software Foundation, Inc. ;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
;; This program is free software; you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
@@ -17,12 +17,13 @@
;;; Commentary: ;;; Commentary:
;; This file provides *internal* macros, which are used by Compat to ;; WARNING: This file provides *internal* macros. The macros are used
;; facilitate the definition of compatibility functions, macros and ;; by Compat to facilitate the definition of compatibility functions,
;; variables. The `compat-macs' feature should never be loaded at ;; compatibility macros and compatibility variables. The
;; runtime in your Emacs and will only be used during byte ;; `compat-macs' feature should never be loaded at runtime in your
;; compilation. Every definition provided here should be considered ;; Emacs and will only be used during byte compilation. Every
;; internal and may change any time between Compat releases. ;; definition provided here is internal, may change any time between
;; Compat releases and must not be used by other packages.
;;; Code: ;;; Code:
@@ -141,7 +142,7 @@ REST are attributes and the function BODY."
(defmacro compat-guard (cond &rest rest) (defmacro compat-guard (cond &rest rest)
"Guard definition with a runtime COND and a version check. "Guard definition with a runtime COND and a version check.
The runtime condition must make sure that no definition is The runtime condition must make sure that no definition is
overriden. REST is an attribute plist followed by the definition overridden. REST is an attribute plist followed by the definition
body. The attributes specify the conditions under which the body. The attributes specify the conditions under which the
definition is generated. definition is generated.
@@ -220,6 +221,8 @@ definition is generated.
- :constant :: Mark the variable as constant if t. - :constant :: Mark the variable as constant if t.
- :risky :: Mark the variable as risky if t.
- :local :: Make the variable buffer-local if t. If the value is - :local :: Make the variable buffer-local if t. If the value is
`permanent' make the variable additionally permanently local. `permanent' make the variable additionally permanently local.
@@ -231,15 +234,18 @@ definition is generated.
(doc-string 3) (indent 2)) (doc-string 3) (indent 2))
(compat-macs--guard (compat-macs--guard
attrs (list :constant #'booleanp attrs (list :constant #'booleanp
:risky #'booleanp
:local (lambda (x) (memq x '(nil t permanent))) :local (lambda (x) (memq x '(nil t permanent)))
:obsolete (lambda (x) (or (booleanp x) (stringp x)))) :obsolete (lambda (x) (or (booleanp x) (stringp x))))
(lambda (constant local obsolete) (lambda (constant risky local obsolete)
(compat-macs--strict (not (boundp name)) "%s already defined" name) (compat-macs--strict (not (boundp name)) "%s already defined" name)
(compat-macs--assert (not (and constant local)) "Both :constant and :local") (compat-macs--assert (not (and constant local)) "Both :constant and :local")
(compat-macs--assert (not (and local risky)) "Both :risky and :local")
;; The boundp check is performed at runtime to make sure that we never ;; The boundp check is performed at runtime to make sure that we never
;; redefine an existing definition if Compat is loaded on a newer Emacs ;; redefine an existing definition if Compat is loaded on a newer Emacs
;; version. ;; version.
`((unless (boundp ',name) `((defvar ,name)
(unless (boundp ',name)
(,(if constant 'defconst 'defvar) (,(if constant 'defconst 'defvar)
,name ,initval ,name ,initval
,(compat-macs--docstring 'variable name docstring)) ,(compat-macs--docstring 'variable name docstring))
@@ -248,6 +254,7 @@ definition is generated.
',name ,(if (stringp obsolete) obsolete "No substitute") ',name ,(if (stringp obsolete) obsolete "No substitute")
,compat-macs--version)))) ,compat-macs--version))))
,@(and local `((make-variable-buffer-local ',name))) ,@(and local `((make-variable-buffer-local ',name)))
,@(and risky `((put ',name 'risky-local-variable t)))
,@(and (eq local 'permanent) `((put ',name 'permanent-local t))))))) ,@(and (eq local 'permanent) `((put ',name 'permanent-local t)))))))
(defmacro compat-version (version) (defmacro compat-version (version)
+1 -1
View File
@@ -1,2 +1,2 @@
;; Generated package description from compat.el -*- no-byte-compile: t -*- ;; Generated package description from compat.el -*- no-byte-compile: t -*-
(define-package "compat" "29.1.4.2" "Emacs Lisp Compatibility Library" '((emacs "24.4") (seq "2.3")) :commit "74300f16a1630a33a86710aa20c1fc26f5f89f75" :authors '(("Philip Kaludercic" . "philipk@posteo.net") ("Daniel Mendler" . "mail@daniel-mendler.de")) :maintainer '(("Daniel Mendler" . "mail@daniel-mendler.de") ("Compat Development" . "~pkal/compat-devel@lists.sr.ht")) :keywords '("lisp" "maint") :url "https://github.com/emacs-compat/compat") (define-package "compat" "30.1.0.1" "Emacs Lisp Compatibility Library" '((emacs "24.4") (seq "2.23")) :commit "cccd41f549fa88031a32deb26253b462021d7e12" :authors '(("Philip Kaludercic" . "philipk@posteo.net") ("Daniel Mendler" . "mail@daniel-mendler.de")) :maintainer '("Compat Development" . "~pkal/compat-devel@lists.sr.ht") :keywords '("lisp" "maint") :url "https://github.com/emacs-compat/compat")
+9 -9
View File
@@ -1,12 +1,12 @@
;;; compat.el --- Emacs Lisp Compatibility Library -*- lexical-binding: t; -*- ;;; compat.el --- Emacs Lisp Compatibility Library -*- lexical-binding: t; -*-
;; Copyright (C) 2021-2023 Free Software Foundation, Inc. ;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
;; Author: Philip Kaludercic <philipk@posteo.net>, Daniel Mendler <mail@daniel-mendler.de> ;; Author: Philip Kaludercic <philipk@posteo.net>, Daniel Mendler <mail@daniel-mendler.de>
;; Maintainer: Daniel Mendler <mail@daniel-mendler.de>, Compat Development <~pkal/compat-devel@lists.sr.ht> ;; Maintainer: Compat Development <~pkal/compat-devel@lists.sr.ht>
;; Version: 29.1.4.2 ;; Version: 30.1.0.1
;; URL: https://github.com/emacs-compat/compat ;; URL: https://github.com/emacs-compat/compat
;; Package-Requires: ((emacs "24.4") (seq "2.3")) ;; Package-Requires: ((emacs "24.4") (seq "2.23"))
;; Keywords: lisp, maint ;; Keywords: lisp, maint
;; This program is free software; you can redistribute it and/or modify ;; This program is free software; you can redistribute it and/or modify
@@ -49,11 +49,11 @@
;; Ensure that the newest compatibility layer is required at compile ;; Ensure that the newest compatibility layer is required at compile
;; time and runtime, but only if needed. ;; time and runtime, but only if needed.
(eval-when-compile (eval-when-compile
(defmacro compat--maybe-require-29 () (defmacro compat--maybe-require ()
(when (version< emacs-version "29.1") (when (version< emacs-version "30.1")
(require 'compat-29) (require 'compat-30)
'(require 'compat-29)))) '(require 'compat-30))))
(compat--maybe-require-29) (compat--maybe-require)
;;;; Macros for extended compatibility function calls ;;;; Macros for extended compatibility function calls
+640 -290
View File
File diff suppressed because it is too large Load Diff
+12 -16
View File
@@ -1,16 +1,12 @@
(define-package "counsel" "20250304.939" "Various completion functions using Ivy" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "24.5") (define-package "counsel" "20250329.1401"
(ivy "0.15.0") "Various completion functions using Ivy."
(swiper "0.15.0")) '((emacs "24.5")
:commit "db61f55bc281c28beb723ef17cfe74f59580d2f4" :authors (ivy "0.15.1")
'(("Oleh Krehel" . "ohwoeowho@gmail.com")) (swiper "0.15.1"))
:maintainers :url "https://github.com/abo-abo/swiper"
'(("Basil L. Contovounesios" . "basil@contovou.net")) :commit "e33b028ed4b1258a211c87fd5fe801bed25de429"
:maintainer :revdesc "e33b028ed4b1"
'("Basil L. Contovounesios" . "basil@contovou.net") :keywords '("convenience" "matching" "tools")
:keywords :authors '(("Oleh Krehel" . "ohwoeowho@gmail.com"))
'("convenience" "matching" "tools") :maintainers '(("Basil L. Contovounesios" . "basil@contovou.net")))
:url "https://github.com/abo-abo/swiper")
;; Local Variables:
;; no-byte-compile: t
;; End:
+550 -316
View File
File diff suppressed because it is too large Load Diff
+10 -11
View File
@@ -13,8 +13,7 @@
• Comint derivatives integration (experimental) • Comint derivatives integration (experimental)
[CRDT] [CRDT] https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type
<https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type>
2 Usage 2 Usage
@@ -129,7 +128,7 @@
─────────────── ───────────────
Visualizing author of parts of the document Visualizing author of parts of the document
Turn on `crdt-visualize-author-mode' to color text based on Turn on `crdt-visualize-author-mode' to color text based on
which user authored it. which user authored it.
Synchronizing Org folding status Synchronizing Org folding status
@@ -138,11 +137,11 @@
enabling this minor mode are unaffected. enabling this minor mode are unaffected.
Comint integration Comint integration
Just go ahead and share you comint REPL buffer! Tested: `shell' Just go ahead and share you comint REPL buffer! Tested:
and `cmuscheme'. By default, when sharing a comint buffer, `shell' and `cmuscheme'. By default, when sharing a comint
`crdt.el' temporarily reset input history (as in `M-n' `M-p') so buffer, `crdt.el' temporarily reset input history (as in `M-n'
others don't spy into your `.bash_history' and alike. You can `M-p') so others don't spy into your `.bash_history' and alike.
customize this behavior using variable You can customize this behavior using variable
`crdt-comint-share-input-history'. `crdt-comint-share-input-history'.
@@ -194,8 +193,8 @@
└──── └────
[tuntox] <https://gitlab.com/gjedeer/tuntox> [tuntox] https://gitlab.com/gjedeer/tuntox
[Tox] <https://tox.chat> [Tox] https://tox.chat
[their website] <https://www.remlab.net/miredo/> [their website] https://www.remlab.net/miredo/
+10 -14
View File
@@ -1,15 +1,11 @@
(define-package "ctable" "20210128.629" "Table component for Emacs Lisp" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((emacs "24.3") (define-package "ctable" "20210128.629"
"Table component for Emacs Lisp."
'((emacs "24.3")
(cl-lib "0.5")) (cl-lib "0.5"))
:commit "48b73742757a3ae5736d825fe49e00034cc453b5" :authors :url "https://github.com/kiwanami/emacs-ctable"
'(("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) :commit "48b73742757a3ae5736d825fe49e00034cc453b5"
:maintainers :revdesc "48b73742757a"
'(("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) :keywords '("table")
:maintainer :authors '(("SAKURAI Masashi" . "m.sakuraiatkiwanami.net"))
'("SAKURAI Masashi" . "m.sakuraiatkiwanami.net") :maintainers '(("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")))
:keywords
'("table")
:url "https://github.com/kiwanami/emacs-ctable")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -4,7 +4,8 @@
;; Author: SAKURAI Masashi <m.sakurai at kiwanami.net> ;; Author: SAKURAI Masashi <m.sakurai at kiwanami.net>
;; URL: https://github.com/kiwanami/emacs-ctable ;; URL: https://github.com/kiwanami/emacs-ctable
;; Version: 0.1.3 ;; Package-Version: 20210128.629
;; Package-Revision: 48b73742757a
;; Package-Requires: ((emacs "24.3") (cl-lib "0.5")) ;; Package-Requires: ((emacs "24.3") (cl-lib "0.5"))
;; Keywords: table ;; Keywords: table
+9 -13
View File
@@ -1,14 +1,10 @@
(define-package "dash" "20240510.1327" "A modern list library for Emacs" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "dash" "20250312.1307"
"A modern list library for Emacs."
'((emacs "24")) '((emacs "24"))
:commit "1de9dcb83eacfb162b6d9a118a4770b1281bcd84" :authors :url "https://github.com/magnars/dash.el"
'(("Magnar Sveen" . "magnars@gmail.com")) :commit "fcb5d831fc08a43f984242c7509870f30983c27c"
:maintainers :revdesc "fcb5d831fc08"
'(("Magnar Sveen" . "magnars@gmail.com")) :keywords '("extensions" "lisp")
:maintainer :authors '(("Magnar Sveen" . "magnars@gmail.com"))
'("Magnar Sveen" . "magnars@gmail.com") :maintainers '(("Basil L. Contovounesios" . "basil@contovou.net")))
:keywords
'("extensions" "lisp")
:url "https://github.com/magnars/dash.el")
;; Local Variables:
;; no-byte-compile: t
;; End:
+77 -48
View File
@@ -1,12 +1,14 @@
;;; dash.el --- A modern list library for Emacs -*- lexical-binding: t -*- ;;; dash.el --- A modern list library for Emacs -*- lexical-binding: t -*-
;; Copyright (C) 2012-2024 Free Software Foundation, Inc. ;; Copyright (C) 2012-2025 Free Software Foundation, Inc.
;; Author: Magnar Sveen <magnars@gmail.com> ;; Author: Magnar Sveen <magnars@gmail.com>
;; Version: 2.19.1 ;; Maintainer: Basil L. Contovounesios <basil@contovou.net>
;; Package-Version: 20250312.1307
;; Package-Revision: fcb5d831fc08
;; Package-Requires: ((emacs "24")) ;; Package-Requires: ((emacs "24"))
;; Keywords: extensions, lisp ;; Keywords: extensions, lisp
;; Homepage: https://github.com/magnars/dash.el ;; URL: https://github.com/magnars/dash.el
;; This program is free software: you can redistribute it and/or modify ;; 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 ;; it under the terms of the GNU General Public License as published by
@@ -30,6 +32,15 @@
;;; Code: ;;; Code:
(eval-when-compile (eval-when-compile
(unless (fboundp 'static-if)
(defmacro static-if (condition then-form &rest else-forms)
"Expand to THEN-FORM or ELSE-FORMS based on compile-time CONDITION.
Polyfill for Emacs 30 `static-if'."
(declare (debug (sexp sexp &rest sexp)) (indent 2))
(if (eval condition lexical-binding)
then-form
(cons 'progn else-forms))))
;; TODO: Emacs 24.3 first introduced `gv', so remove this and all ;; TODO: Emacs 24.3 first introduced `gv', so remove this and all
;; calls to `defsetf' when support for earlier versions is dropped. ;; calls to `defsetf' when support for earlier versions is dropped.
(unless (fboundp 'gv-define-setter) (unless (fboundp 'gv-define-setter)
@@ -784,19 +795,24 @@ See also: `-flatten'"
list) list)
(defalias '-concat #'append (defalias '-concat #'append
"Concatenate all the arguments and make the result a list. "Concatenate all SEQUENCES and make the result a list.
The result is a list whose elements are the elements of all the arguments. The result is a list whose elements are the elements of all the arguments.
Each argument may be a list, vector or string. Each argument may be a list, vector or string.
All arguments except the last argument are copied. The last argument All arguments except the last argument are copied. The last argument
is just used as the tail of the new list. is just used as the tail of the new list. If the last argument is not
a list, this results in a dotted list.
As an exception, if all the arguments except the last are nil, and the
last argument is not a list, the return value is that last argument
unaltered, not a list.
\(fn &rest SEQUENCES)") \(fn &rest SEQUENCES)")
(defalias '-copy #'copy-sequence (defalias '-copy #'copy-sequence
"Create a shallow copy of LIST. "Create a shallow copy of LIST.
The elements of LIST are not copied; they are shared with the original.
\(fn LIST)") \n(fn LIST)")
(defmacro --splice (pred form list) (defmacro --splice (pred form list)
"Splice lists generated by FORM in place of items satisfying PRED in LIST. "Splice lists generated by FORM in place of items satisfying PRED in LIST.
@@ -1036,13 +1052,9 @@ See also: `-first-item', etc."
(declare (pure t) (side-effect-free t)) (declare (pure t) (side-effect-free t))
(car (last list))) (car (last list)))
;; Use `with-no-warnings' to suppress unbound `-last-item' or (static-if (fboundp 'gv-define-setter)
;; undefined `gv--defsetter' warnings arising from both (gv-define-setter -last-item (val x) `(setcar (last ,x) ,val))
;; `gv-define-setter' and `defsetf' in certain Emacs versions. (defsetf -last-item (x) (val) `(setcar (last ,x) ,val)))
(with-no-warnings
(if (fboundp 'gv-define-setter)
(gv-define-setter -last-item (val x) `(setcar (last ,x) ,val))
(defsetf -last-item (x) (val) `(setcar (last ,x) ,val))))
(defun -butlast (list) (defun -butlast (list)
"Return a list of all items in list except for the last." "Return a list of all items in list except for the last."
@@ -1241,6 +1253,17 @@ For another variant, see also `-take-while'."
(declare (important-return-value t)) (declare (important-return-value t))
(--drop-while (funcall pred it) list)) (--drop-while (funcall pred it) list))
;; Added in Emacs 29.
(static-if (fboundp 'take)
(defun dash--take (n list)
"Return the first N elements of LIST.
Like `take', but ensure result is fresh."
(let ((prefix (take n list)))
(if (eq prefix list)
;; If same list is returned, make a copy.
(copy-sequence prefix)
prefix))))
(defun -take (n list) (defun -take (n list)
"Return a copy of the first N items in LIST. "Return a copy of the first N items in LIST.
Return a copy of LIST if it contains N items or fewer. Return a copy of LIST if it contains N items or fewer.
@@ -1248,7 +1271,9 @@ Return nil if N is zero or less.
See also: `-take-last'." See also: `-take-last'."
(declare (side-effect-free t)) (declare (side-effect-free t))
(--take-while (< it-index n) list)) (static-if (fboundp 'dash--take)
(dash--take n list)
(--take-while (< it-index n) list)))
(defun -take-last (n list) (defun -take-last (n list)
"Return a copy of the last N items of LIST in order. "Return a copy of the last N items of LIST in order.
@@ -1274,7 +1299,9 @@ Return nil if LIST contains N items or fewer.
See also: `-drop'." See also: `-drop'."
(declare (side-effect-free t)) (declare (side-effect-free t))
(nbutlast (copy-sequence list) n)) (static-if (fboundp 'dash--take)
(dash--take (- (length list) n) list)
(nbutlast (copy-sequence list) n)))
(defun -split-at (n list) (defun -split-at (n list)
"Split LIST into two sublists after the Nth element. "Split LIST into two sublists after the Nth element.
@@ -2440,7 +2467,7 @@ Similar to &hash but check whether the map is not nil."
`(let ((,src ,source)) `(let ((,src ,source))
(when ,src (gethash ,key ,src))))) (when ,src (gethash ,key ,src)))))
(defalias 'dash-expand:&keys 'dash-expand:&plist) (defalias 'dash-expand:&keys #'dash-expand:&plist)
(defun dash--match-kv-1 (match-form source type) (defun dash--match-kv-1 (match-form source type)
"Match MATCH-FORM against SOURCE of type TYPE. "Match MATCH-FORM against SOURCE of type TYPE.
@@ -2901,16 +2928,14 @@ example:
(let ((cmp -compare-fn)) (let ((cmp -compare-fn))
(cond ((memq cmp '(nil equal)) #'assoc) (cond ((memq cmp '(nil equal)) #'assoc)
((eq cmp #'eq) #'assq) ((eq cmp #'eq) #'assq)
;; Since Emacs 26, `assoc' accepts a custom `testfn'. ((lambda (key alist)
;; Version testing would be simpler here, but feature ;; Since Emacs 26, `assoc' accepts a custom `testfn'.
;; testing gets more brownie points, I guess. ;; Version testing would be simpler here, but feature
((condition-case nil ;; testing gets more brownie points, I guess.
(with-no-warnings (assoc nil () #'eql)) (static-if (condition-case nil
(wrong-number-of-arguments t)) (assoc nil () #'eql)
(lambda (key alist) (wrong-number-of-arguments t))
(--first (and (consp it) (funcall cmp (car it) key)) alist))) (--first (and (consp it) (funcall cmp (car it) key)) alist)
((with-no-warnings
(lambda (key alist)
(assoc key alist cmp))))))) (assoc key alist cmp)))))))
(defun dash--hash-test-fn () (defun dash--hash-test-fn ()
@@ -3298,9 +3323,10 @@ Return the sorted list. LIST is NOT modified by side effects.
COMPARATOR is called with two elements of LIST, and should return non-nil COMPARATOR is called with two elements of LIST, and should return non-nil
if the first element should sort before the second." if the first element should sort before the second."
(declare (important-return-value t)) (declare (important-return-value t))
;; Not yet worth changing to (sort list :lessp comparator); (static-if (condition-case nil (sort []) (wrong-number-of-arguments))
;; still seems as fast or slightly faster. ;; Since Emacs 30.
(sort (copy-sequence list) comparator)) (sort list :lessp comparator)
(sort (copy-sequence list) comparator)))
(defmacro --sort (form list) (defmacro --sort (form list)
"Anaphoric form of `-sort'." "Anaphoric form of `-sort'."
@@ -3635,7 +3661,13 @@ structure such as plist or alist."
;;; Combinators ;;; Combinators
(defalias '-partial #'apply-partially) (defalias '-partial #'apply-partially
"Return a function that is a partial application of FUN to ARGS.
ARGS is a list of the first N arguments to pass to FUN.
The result is a new function which does the same as FUN, except that
the first N arguments are fixed at the values with which this function
was called.
\n(fn FUN &rest ARGS)")
(defun -rpartial (fn &rest args) (defun -rpartial (fn &rest args)
"Return a function that is a partial application of FN to ARGS. "Return a function that is a partial application of FN to ARGS.
@@ -3801,11 +3833,9 @@ See also: `-orfn' and `-not'."
;; Open-code for speed. ;; Open-code for speed.
(cond ((cdr preds) (lambda (&rest args) (--every (apply it args) preds))) (cond ((cdr preds) (lambda (&rest args) (--every (apply it args) preds)))
(preds (car preds)) (preds (car preds))
;; As a `pure' function, this runtime check may generate ((static-if (fboundp 'always)
;; backward-incompatible bytecode for `(-andfn)' at compile-time, #'always
;; but I doubt that's a problem in practice (famous last words). (lambda (&rest _) t)))))
((fboundp 'always) #'always)
((lambda (&rest _) t))))
(defun -iteratefn (fn n) (defun -iteratefn (fn n)
"Return a function FN composed N times with itself. "Return a function FN composed N times with itself.
@@ -3925,13 +3955,13 @@ This function satisfies the following laws:
`(;; TODO: Do not fontify the following automatic variables `(;; TODO: Do not fontify the following automatic variables
;; globally; detect and limit to their local anaphoric scope. ;; globally; detect and limit to their local anaphoric scope.
(,(rx symbol-start (| "acc" "it" "it-index" "other") symbol-end) (,(rx symbol-start (| "acc" "it" "it-index" "other") symbol-end)
0 font-lock-variable-name-face) . 'font-lock-variable-name-face)
;; Macros in dev/examples.el. Based on `lisp-mode-symbol-regexp'. ;; Macros in dev/examples.el. Based on `lisp-mode-symbol-regexp'.
(,(rx ?\( (group (| "defexamples" "def-example-group")) symbol-end (,(rx ?\( (group (| "defexamples" "def-example-group")) symbol-end
(+ (in "\t ")) (+ (in "\t "))
(group (* (| (syntax word) (syntax symbol) (: ?\\ nonl))))) (group (* (| (syntax word) (syntax symbol) (: ?\\ nonl)))))
(1 font-lock-keyword-face) (1 'font-lock-keyword-face)
(2 font-lock-function-name-face)) (2 'font-lock-function-name-face))
;; Symbols in dev/examples.el. ;; Symbols in dev/examples.el.
,(rx symbol-start (| "=>" "~>" "!!>") symbol-end) ,(rx symbol-start (| "=>" "~>" "!!>") symbol-end)
;; Elisp macro fontification was static prior to Emacs 25. ;; Elisp macro fontification was static prior to Emacs 25.
@@ -4067,15 +4097,14 @@ See also `dash-fontify-mode-lighter' and
(if dash-fontify-mode (if dash-fontify-mode
(font-lock-add-keywords nil dash--keywords t) (font-lock-add-keywords nil dash--keywords t)
(font-lock-remove-keywords nil dash--keywords)) (font-lock-remove-keywords nil dash--keywords))
(cond ((fboundp 'font-lock-flush) ;; Added in Emacs 25. (static-if (fboundp 'font-lock-flush)
(font-lock-flush)) ;; Added in Emacs 25.
;; `font-lock-fontify-buffer' unconditionally enables (font-lock-flush)
;; `font-lock-mode' and is marked `interactive-only' in later (when font-lock-mode
;; Emacs versions which have `font-lock-flush', so we guard ;; Unconditionally enables `font-lock-mode' and is marked
;; and pacify as needed, respectively. ;; `interactive-only' in later Emacs versions which have
(font-lock-mode ;; `font-lock-flush'.
(with-no-warnings (font-lock-fontify-buffer))))
(font-lock-fontify-buffer)))))
(defun dash--turn-on-fontify-mode () (defun dash--turn-on-fontify-mode ()
"Enable `dash-fontify-mode' if in an Emacs Lisp buffer." "Enable `dash-fontify-mode' if in an Emacs Lisp buffer."
+219 -213
View File
@@ -1,8 +1,8 @@
This is dash.info, produced by makeinfo version 7.1.1 from dash.texi. This is dash.info, produced by makeinfo version 7.1.1 from dash.texi.
This manual is for Dash version 2.19.1. This manual is for Dash version 2.20.0.
Copyright © 2012-2024 Free Software Foundation, Inc. Copyright © 2012-2025 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, document under the terms of the GNU Free Documentation License,
@@ -22,9 +22,9 @@ File: dash.info, Node: Top, Next: Installation, Up: (dir)
Dash Dash
**** ****
This manual is for Dash version 2.19.1. This manual is for Dash version 2.20.0.
Copyright © 2012-2024 Free Software Foundation, Inc. Copyright © 2012-2025 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, document under the terms of the GNU Free Documentation License,
@@ -110,7 +110,7 @@ File: dash.info, Node: Using in a package, Next: Fontification of special vari
If you use Dash in your own package, be sure to list it as a dependency If you use Dash in your own package, be sure to list it as a dependency
in the library's headers as follows (*note (elisp)Library Headers::). in the library's headers as follows (*note (elisp)Library Headers::).
;; Package-Requires: ((dash "2.19.1")) ;; Package-Requires: ((dash "2.20.0"))
 
File: dash.info, Node: Fontification of special variables, Next: Info symbol lookup, Prev: Using in a package, Up: Installation File: dash.info, Node: Fontification of special variables, Next: Info symbol lookup, Prev: Using in a package, Up: Installation
@@ -353,7 +353,8 @@ The results are collected in order and returned as a new list.
⇒ (0 1 0 2 0 3) ⇒ (0 1 0 2 0 3)
-- Function: -copy (list) -- Function: -copy (list)
Create a shallow copy of LIST. Create a shallow copy of LIST. The elements of LIST are not
copied; they are shared with the original.
(-copy '(1 2 3)) (-copy '(1 2 3))
⇒ (1 2 3) ⇒ (1 2 3)
@@ -639,12 +640,17 @@ Functions returning a modified copy of the input list.
⇒ (40 50 60) ⇒ (40 50 60)
-- Function: -concat (&rest sequences) -- Function: -concat (&rest sequences)
Concatenate all the arguments and make the result a list. The Concatenate all SEQUENCES and make the result a list. The result
result is a list whose elements are the elements of all the is a list whose elements are the elements of all the arguments.
arguments. Each argument may be a list, vector or string. Each argument may be a list, vector or string.
All arguments except the last argument are copied. The last All arguments except the last argument are copied. The last
argument is just used as the tail of the new list. argument is just used as the tail of the new list. If the last
argument is not a list, this results in a dotted list.
As an exception, if all the arguments except the last are nil,
and the last argument is not a list, the return value is that last
argument unaltered, not a list.
(-concat '(1)) (-concat '(1))
⇒ (1) ⇒ (1)
@@ -4550,8 +4556,8 @@ Index
(line 445) (line 445)
* -fixfn: Function combinators. * -fixfn: Function combinators.
(line 224) (line 224)
* -flatten: List to list. (line 38) * -flatten: List to list. (line 43)
* -flatten-n: List to list. (line 60) * -flatten-n: List to list. (line 65)
* -flip: Function combinators. * -flip: Function combinators.
(line 95) (line 95)
* -fourth-item: Other list operations. * -fourth-item: Other list operations.
@@ -4563,7 +4569,7 @@ Index
* -if-let: Binding. (line 34) * -if-let: Binding. (line 34)
* -if-let*: Binding. (line 45) * -if-let*: Binding. (line 45)
* -inits: Reductions. (line 222) * -inits: Reductions. (line 222)
* -insert-at: List to list. (line 114) * -insert-at: List to list. (line 119)
* -interleave: Other list operations. * -interleave: Other list operations.
(line 56) (line 56)
* -interpose: Other list operations. * -interpose: Other list operations.
@@ -4636,16 +4642,16 @@ Index
* -reductions-r: Reductions. (line 154) * -reductions-r: Reductions. (line 154)
* -reductions-r-from: Reductions. (line 118) * -reductions-r-from: Reductions. (line 118)
* -remove: Sublist selection. (line 26) * -remove: Sublist selection. (line 26)
* -remove-at: List to list. (line 151) * -remove-at: List to list. (line 156)
* -remove-at-indices: List to list. (line 170) * -remove-at-indices: List to list. (line 175)
* -remove-first: Sublist selection. (line 44) * -remove-first: Sublist selection. (line 44)
* -remove-item: Sublist selection. (line 84) * -remove-item: Sublist selection. (line 84)
* -remove-last: Sublist selection. (line 65) * -remove-last: Sublist selection. (line 65)
* -repeat: Unfolding. (line 44) * -repeat: Unfolding. (line 44)
* -replace: List to list. (line 72) * -replace: List to list. (line 77)
* -replace-at: List to list. (line 125) * -replace-at: List to list. (line 130)
* -replace-first: List to list. (line 86) * -replace-first: List to list. (line 91)
* -replace-last: List to list. (line 100) * -replace-last: List to list. (line 105)
* -rotate: Other list operations. * -rotate: Other list operations.
(line 8) (line 8)
* -rotate-args: Function combinators. * -rotate-args: Function combinators.
@@ -4701,7 +4707,7 @@ Index
(line 215) (line 215)
* -unzip-lists: Other list operations. * -unzip-lists: Other list operations.
(line 196) (line 196)
* -update-at: List to list. (line 137) * -update-at: List to list. (line 142)
* -when-let: Binding. (line 9) * -when-let: Binding. (line 9)
* -when-let*: Binding. (line 21) * -when-let*: Binding. (line 21)
* -zip: Other list operations. * -zip: Other list operations.
@@ -4746,199 +4752,199 @@ Ref: -splice10052
Ref: -splice-list11125 Ref: -splice-list11125
Ref: -mapcat11584 Ref: -mapcat11584
Ref: -copy11957 Ref: -copy11957
Node: Sublist selection12145 Node: Sublist selection12223
Ref: -filter12338 Ref: -filter12416
Ref: -remove12889 Ref: -remove12967
Ref: -remove-first13436 Ref: -remove-first13514
Ref: -remove-last14280 Ref: -remove-last14358
Ref: -remove-item15008 Ref: -remove-item15086
Ref: -non-nil15408 Ref: -non-nil15486
Ref: -slice15690 Ref: -slice15768
Ref: -take16219 Ref: -take16297
Ref: -take-last16637 Ref: -take-last16715
Ref: -drop17074 Ref: -drop17152
Ref: -drop-last17521 Ref: -drop-last17599
Ref: -take-while17953 Ref: -take-while18031
Ref: -drop-while18578 Ref: -drop-while18656
Ref: -select-by-indices19209 Ref: -select-by-indices19287
Ref: -select-columns19716 Ref: -select-columns19794
Ref: -select-column20419 Ref: -select-column20497
Node: List to list20882 Node: List to list20960
Ref: -keep21074 Ref: -keep21152
Ref: -concat21650 Ref: -concat21728
Ref: -flatten22178 Ref: -flatten22508
Ref: -flatten-n22938 Ref: -flatten-n23268
Ref: -replace23322 Ref: -replace23652
Ref: -replace-first23783 Ref: -replace-first24113
Ref: -replace-last24278 Ref: -replace-last24608
Ref: -insert-at24766 Ref: -insert-at25096
Ref: -replace-at25091 Ref: -replace-at25421
Ref: -update-at25478 Ref: -update-at25808
Ref: -remove-at26019 Ref: -remove-at26349
Ref: -remove-at-indices26646 Ref: -remove-at-indices26976
Node: Reductions27336 Node: Reductions27666
Ref: -reduce-from27532 Ref: -reduce-from27862
Ref: -reduce-r-from28254 Ref: -reduce-r-from28584
Ref: -reduce29515 Ref: -reduce29845
Ref: -reduce-r30264 Ref: -reduce-r30594
Ref: -reductions-from31540 Ref: -reductions-from31870
Ref: -reductions-r-from32342 Ref: -reductions-r-from32672
Ref: -reductions33168 Ref: -reductions33498
Ref: -reductions-r33875 Ref: -reductions-r34205
Ref: -count34616 Ref: -count34946
Ref: -sum34846 Ref: -sum35176
Ref: -running-sum35034 Ref: -running-sum35364
Ref: -product35355 Ref: -product35685
Ref: -running-product35563 Ref: -running-product35893
Ref: -inits35904 Ref: -inits36234
Ref: -tails36149 Ref: -tails36479
Ref: -common-prefix36394 Ref: -common-prefix36724
Ref: -common-suffix36688 Ref: -common-suffix37018
Ref: -min36982 Ref: -min37312
Ref: -min-by37208 Ref: -min-by37538
Ref: -max37729 Ref: -max38059
Ref: -max-by37954 Ref: -max-by38284
Ref: -frequencies38480 Ref: -frequencies38810
Node: Unfolding39095 Node: Unfolding39425
Ref: -iterate39336 Ref: -iterate39666
Ref: -unfold39783 Ref: -unfold40113
Ref: -repeat40588 Ref: -repeat40918
Ref: -cycle40872 Ref: -cycle41202
Node: Predicates41269 Node: Predicates41599
Ref: -some41446 Ref: -some41776
Ref: -every41873 Ref: -every42203
Ref: -any?42585 Ref: -any?42915
Ref: -all?42934 Ref: -all?43264
Ref: -none?43674 Ref: -none?44004
Ref: -only-some?43994 Ref: -only-some?44324
Ref: -contains?44539 Ref: -contains?44869
Ref: -is-prefix?45045 Ref: -is-prefix?45375
Ref: -is-suffix?45377 Ref: -is-suffix?45707
Ref: -is-infix?45709 Ref: -is-infix?46039
Ref: -cons-pair?46069 Ref: -cons-pair?46399
Node: Partitioning46400 Node: Partitioning46730
Ref: -split-at46588 Ref: -split-at46918
Ref: -split-with47252 Ref: -split-with47582
Ref: -split-on47892 Ref: -split-on48222
Ref: -split-when48563 Ref: -split-when48893
Ref: -separate49206 Ref: -separate49536
Ref: -partition49740 Ref: -partition50070
Ref: -partition-all50189 Ref: -partition-all50519
Ref: -partition-in-steps50614 Ref: -partition-in-steps50944
Ref: -partition-all-in-steps51160 Ref: -partition-all-in-steps51490
Ref: -partition-by51674 Ref: -partition-by52004
Ref: -partition-by-header52052 Ref: -partition-by-header52382
Ref: -partition-after-pred52653 Ref: -partition-after-pred52983
Ref: -partition-before-pred53104 Ref: -partition-before-pred53434
Ref: -partition-before-item53489 Ref: -partition-before-item53819
Ref: -partition-after-item53796 Ref: -partition-after-item54126
Ref: -group-by54098 Ref: -group-by54428
Node: Indexing54531 Node: Indexing54861
Ref: -elem-index54733 Ref: -elem-index55063
Ref: -elem-indices55220 Ref: -elem-indices55550
Ref: -find-index55679 Ref: -find-index56009
Ref: -find-last-index56346 Ref: -find-last-index56676
Ref: -find-indices56995 Ref: -find-indices57325
Ref: -grade-up57755 Ref: -grade-up58085
Ref: -grade-down58162 Ref: -grade-down58492
Node: Set operations58576 Node: Set operations58906
Ref: -union58759 Ref: -union59089
Ref: -difference59189 Ref: -difference59519
Ref: -intersection59617 Ref: -intersection59947
Ref: -powerset60046 Ref: -powerset60376
Ref: -permutations60323 Ref: -permutations60653
Ref: -distinct60761 Ref: -distinct61091
Ref: -same-items?61155 Ref: -same-items?61485
Node: Other list operations61764 Node: Other list operations62094
Ref: -rotate61989 Ref: -rotate62319
Ref: -cons*62342 Ref: -cons*62672
Ref: -snoc62764 Ref: -snoc63094
Ref: -interpose63176 Ref: -interpose63506
Ref: -interleave63470 Ref: -interleave63800
Ref: -iota63836 Ref: -iota64166
Ref: -zip-with64319 Ref: -zip-with64649
Ref: -zip-pair65125 Ref: -zip-pair65455
Ref: -zip-lists65691 Ref: -zip-lists66021
Ref: -zip-lists-fill66489 Ref: -zip-lists-fill66819
Ref: -zip67199 Ref: -zip67529
Ref: -zip-fill68226 Ref: -zip-fill68556
Ref: -unzip-lists69140 Ref: -unzip-lists69470
Ref: -unzip69763 Ref: -unzip70093
Ref: -pad70756 Ref: -pad71086
Ref: -table71241 Ref: -table71571
Ref: -table-flat72027 Ref: -table-flat72357
Ref: -first73030 Ref: -first73360
Ref: -last73561 Ref: -last73891
Ref: -first-item73907 Ref: -first-item74237
Ref: -second-item74319 Ref: -second-item74649
Ref: -third-item74736 Ref: -third-item75066
Ref: -fourth-item75111 Ref: -fourth-item75441
Ref: -fifth-item75489 Ref: -fifth-item75819
Ref: -last-item75864 Ref: -last-item76194
Ref: -butlast76225 Ref: -butlast76555
Ref: -sort76470 Ref: -sort76800
Ref: -list76964 Ref: -list77294
Ref: -fix77533 Ref: -fix77863
Node: Tree operations78022 Node: Tree operations78352
Ref: -tree-seq78218 Ref: -tree-seq78548
Ref: -tree-map79079 Ref: -tree-map79409
Ref: -tree-map-nodes79519 Ref: -tree-map-nodes79849
Ref: -tree-reduce80383 Ref: -tree-reduce80713
Ref: -tree-reduce-from81265 Ref: -tree-reduce-from81595
Ref: -tree-mapreduce81865 Ref: -tree-mapreduce82195
Ref: -tree-mapreduce-from82724 Ref: -tree-mapreduce-from83054
Ref: -clone84009 Ref: -clone84339
Node: Threading macros84347 Node: Threading macros84677
Ref: ->84572 Ref: ->84902
Ref: ->>85060 Ref: ->>85390
Ref: -->85563 Ref: -->85893
Ref: -as->86120 Ref: -as->86450
Ref: -some->86574 Ref: -some->86904
Ref: -some->>86959 Ref: -some->>87289
Ref: -some-->87406 Ref: -some-->87736
Ref: -doto87973 Ref: -doto88303
Node: Binding88526 Node: Binding88856
Ref: -when-let88733 Ref: -when-let89063
Ref: -when-let*89194 Ref: -when-let*89524
Ref: -if-let89723 Ref: -if-let90053
Ref: -if-let*90089 Ref: -if-let*90419
Ref: -let90712 Ref: -let91042
Ref: -let*96788 Ref: -let*97118
Ref: -lambda97725 Ref: -lambda98055
Ref: -setq98531 Ref: -setq98861
Node: Side effects99332 Node: Side effects99662
Ref: -each99526 Ref: -each99856
Ref: -each-while100051 Ref: -each-while100381
Ref: -each-indexed100671 Ref: -each-indexed101001
Ref: -each-r101263 Ref: -each-r101593
Ref: -each-r-while101705 Ref: -each-r-while102035
Ref: -dotimes102349 Ref: -dotimes102679
Node: Destructive operations102900 Node: Destructive operations103230
Ref: !cons103118 Ref: !cons103448
Ref: !cdr103322 Ref: !cdr103652
Node: Function combinators103515 Node: Function combinators103845
Ref: -partial103719 Ref: -partial104049
Ref: -rpartial104237 Ref: -rpartial104567
Ref: -juxt104885 Ref: -juxt105215
Ref: -compose105337 Ref: -compose105667
Ref: -applify105944 Ref: -applify106274
Ref: -on106374 Ref: -on106704
Ref: -flip107138 Ref: -flip107468
Ref: -rotate-args107660 Ref: -rotate-args107990
Ref: -const108289 Ref: -const108619
Ref: -cut108631 Ref: -cut108961
Ref: -not109111 Ref: -not109441
Ref: -orfn109655 Ref: -orfn109985
Ref: -andfn110448 Ref: -andfn110778
Ref: -iteratefn111235 Ref: -iteratefn111565
Ref: -fixfn111937 Ref: -fixfn112267
Ref: -prodfn113511 Ref: -prodfn113841
Node: Development114638 Node: Development114968
Node: Contribute114927 Node: Contribute115257
Node: Contributors115935 Node: Contributors116265
Node: FDL118028 Node: FDL118358
Node: GPL143147 Node: GPL143477
Node: Index180693 Node: Index181023
 
End Tag Table End Tag Table
+10 -14
View File
@@ -1,15 +1,11 @@
(define-package "dashboard" "20250227.121" "A startup screen extracted from Spacemacs" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "dashboard" "20250521.900"
"A startup screen extracted from Spacemacs."
'((emacs "27.1")) '((emacs "27.1"))
:commit "9616e5b5e793c3d8228a8fccf7b9ef7ace365005" :authors :url "https://github.com/emacs-dashboard/emacs-dashboard"
'(("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) :commit "f07661b39bec3683cf9edb7b1c58f6e658b6f764"
:maintainers :revdesc "f07661b39bec"
'(("Jen-Chieh" . "jcs090218@gmail.com") :keywords '("startup" "screen" "tools" "dashboard")
("Ricardo Arredondo" . "ricardo.richo@gmail.com")) :authors '(("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com"))
:maintainer :maintainers '(("Jen-Chieh" . "jcs090218@gmail.com")
'("Jen-Chieh" . "jcs090218@gmail.com") ("Ricardo Arredondo" . "ricardo.richo@gmail.com")))
:keywords
'("startup" "screen" "tools" "dashboard")
:url "https://github.com/emacs-dashboard/emacs-dashboard")
;; Local Variables:
;; no-byte-compile: t
;; End:
+72 -57
View File
@@ -135,13 +135,6 @@ See `create-image' and Info node `(elisp)Image Descriptors'."
(make-obsolete-variable 'dashboard-set-navigator (make-obsolete-variable 'dashboard-set-navigator
'dashboard-startupify-list "1.9.0") 'dashboard-startupify-list "1.9.0")
(defcustom dashboard-set-init-info t
"When non nil, init info will be displayed under the banner."
:type 'boolean
:group 'dashboard)
(make-obsolete-variable 'dashboard-set-init-info
'dashboard-startupify-list "1.9.0")
(defcustom dashboard-set-footer t (defcustom dashboard-set-footer t
"When non nil, a footer will be displayed at the bottom." "When non nil, a footer will be displayed at the bottom."
:type 'boolean :type 'boolean
@@ -159,7 +152,7 @@ See `create-image' and Info node `(elisp)Image Descriptors'."
"While any text editor can save your files, only Emacs can save your soul" "While any text editor can save your files, only Emacs can save your soul"
"I showed you my source code, pls respond") "I showed you my source code, pls respond")
"A list of messages, one of which dashboard chooses to display." "A list of messages, one of which dashboard chooses to display."
:type '(list string) :type '(repeat string)
:group 'dashboard) :group 'dashboard)
(defcustom dashboard-icon-type (and (or dashboard-set-heading-icons (defcustom dashboard-icon-type (and (or dashboard-set-heading-icons
@@ -194,10 +187,14 @@ The value can be one of: `all-the-icons', `nerd-icons'."
(projects . "nf-oct-rocket") (projects . "nf-oct-rocket")
(registers . "nf-oct-database")))) (registers . "nf-oct-database"))))
"Association list for the icons of the heading sections. "Association list for the icons of the heading sections.
Will be of the form `(list-type . icon-name-string)`. Will be of the form `(SECTION . ICON)`, where SECTION could be any dashboard
If nil it is disabled. Possible values for list-type are: section, for example: `recents' `bookmarks' `projects' `agenda' `registers'.
`recents' `bookmarks' `projects' `agenda' `registers'"
:type '(alist :key-type symbol :value-type string) ICON could be the name of the icon belonging to `octicon' family
or (ICON-FUNCTION ICON-NAME), for example: \"nf-oct-file\" using
nerd-icons or (all-the-icons-faicon \"newspaper-o\") using all-the-icons."
:type '(alist :key-type symbol
:value-type (choice string (cons function string)))
:group 'dashboard) :group 'dashboard)
(defcustom dashboard-heading-icon-height 1.2 (defcustom dashboard-heading-icon-height 1.2
@@ -288,24 +285,45 @@ Example:
(const nil))))) (const nil)))))
:group 'dashboard) :group 'dashboard)
(defcustom dashboard-init-info (defcustom dashboard-init-info #'dashboard-init--info
(lambda () "Custom function that must return a string to place instead of init-info."
(let ((package-count 0) (time (emacs-init-time))) :type 'function
(when (bound-and-true-p package-alist)
(setq package-count (length package-activated-list)))
(when (boundp 'straight--profile-cache)
(setq package-count (+ (hash-table-count straight--profile-cache) package-count)))
(when (fboundp 'elpaca--queued)
(setq time (format "%f seconds" (float-time (time-subtract elpaca-after-init-time
before-init-time))))
(setq package-count (length (elpaca--queued))))
(if (zerop package-count)
(format "Emacs started in %s" time)
(format "%d packages loaded in %s" package-count time))))
"Init info with packages loaded and init time."
:type '(function string)
:group 'dashboard) :group 'dashboard)
(defun dashboard-init--time ()
"Return Emacs starting time in string including seconds ending."
(if (fboundp 'elpaca--queued)
(format "%s seconds"
(float-time (time-subtract elpaca-after-init-time
before-init-time)))
(emacs-init-time)))
(defun dashboard-init--packages-count ()
"Get the intalled package count depending on package manager.
Supported package managers are: package.el, straight.el and elpaca.el."
(let* ((package-count (if (bound-and-true-p package-alist)
(length package-activated-list)
0))
(straight-count (if (boundp 'straight--profile-cache)
(hash-table-count straight--profile-cache)
0))
(elpaca-count (if (fboundp 'elpaca--queued)
(length (elpaca--queued))
0)))
(+ package-count straight-count elpaca-count)))
(defun dashboard-init--info ()
"Format init message.
Use `dashboard-init--time' and `dashboard-init--package-count' to generate
init message."
(let ((init-time (dashboard-init--time))
(packages-count (dashboard-init--packages-count)))
(if (zerop packages-count)
(format "Emacs started in %s" init-time)
(format "%d packages installed. Emacs started in %s."
packages-count init-time))))
(defcustom dashboard-display-icons-p #'display-graphic-p (defcustom dashboard-display-icons-p #'display-graphic-p
"Predicate to determine whether dashboard should show icons. "Predicate to determine whether dashboard should show icons.
Can be nil to not show icons and any truthy value to show them. When set to a Can be nil to not show icons and any truthy value to show them. When set to a
@@ -653,30 +671,8 @@ When called with TIMES return a function that insert TIMES number of newlines."
(defun dashboard-insert-heading (heading &optional shortcut icon) (defun dashboard-insert-heading (heading &optional shortcut icon)
"Insert a widget HEADING in dashboard buffer, adding SHORTCUT, ICON if provided." "Insert a widget HEADING in dashboard buffer, adding SHORTCUT, ICON if provided."
(when (and (dashboard-display-icons-p) dashboard-set-heading-icons) (when (and (dashboard-display-icons-p) dashboard-set-heading-icons icon)
(let ((args `( :height ,dashboard-heading-icon-height (insert icon " "))
:v-adjust ,dashboard-heading-icon-v-adjust
:face dashboard-heading)))
(insert
(pcase heading
("Recent Files:"
(apply #'dashboard-octicon (cdr (assoc 'recents dashboard-heading-icons)) args))
("Bookmarks:"
(apply #'dashboard-octicon (cdr (assoc 'bookmarks dashboard-heading-icons)) args))
((or "Agenda for today:"
"Agenda for the coming week:")
(apply #'dashboard-octicon (cdr (assoc 'agenda dashboard-heading-icons)) args))
("Registers:"
(apply #'dashboard-octicon (cdr (assoc 'registers dashboard-heading-icons)) args))
("Projects:"
(apply #'dashboard-octicon (cdr (assoc 'projects dashboard-heading-icons)) args))
("List Directories:"
(apply #'dashboard-octicon (cdr (assoc 'ls-directories dashboard-heading-icons)) args))
("List Files:"
(apply #'dashboard-octicon (cdr (assoc 'ls-files dashboard-heading-icons)) args))
(_
(if (null icon) " " icon))))
(insert " ")))
(insert (propertize heading 'face 'dashboard-heading)) (insert (propertize heading 'face 'dashboard-heading))
@@ -876,10 +872,15 @@ Argument IMAGE-PATH path to the image."
;;; Initialize info ;;; Initialize info
(defun dashboard-insert-init-info () (defun dashboard-insert-init-info ()
"Insert init info." "Insert init info."
(let ((init-info (if (functionp dashboard-init-info) (let ((init-info (cond ((stringp dashboard-init-info)
(funcall dashboard-init-info) dashboard-init-info)
dashboard-init-info))) ((functionp dashboard-init-info)
(dashboard-insert-center (propertize init-info 'face 'font-lock-comment-face)))) (funcall dashboard-init-info))
(t
(user-error "Unknown init info type (%s): %s"
(type-of dashboard-init-info) dashboard-init-info)))))
(dashboard-insert-center
(propertize init-info 'face 'font-lock-comment-face))))
(defun dashboard-insert-navigator () (defun dashboard-insert-navigator ()
"Insert Navigator of the dashboard." "Insert Navigator of the dashboard."
@@ -930,7 +931,8 @@ WIDGET-PARAMS are passed to the \"widget-create\" function."
(when (and ,list (when (and ,list
,shortcut-char ,shortcut-char
dashboard-show-shortcuts) dashboard-show-shortcuts)
,shortcut-char)) ,shortcut-char)
(dashboard-heading-icon ,shortcut-id))
(if ,list (if ,list
(when (and (dashboard-insert-section-list (when (and (dashboard-insert-section-list
,section-name ,section-name
@@ -941,6 +943,19 @@ WIDGET-PARAMS are passed to the \"widget-create\" function."
(dashboard-insert-shortcut ,shortcut-id ,shortcut-char ,section-name)) (dashboard-insert-shortcut ,shortcut-id ,shortcut-char ,section-name))
(insert (propertize "\n --- No items ---" 'face 'dashboard-no-items-face))))) (insert (propertize "\n --- No items ---" 'face 'dashboard-no-items-face)))))
(defun dashboard-heading-icon (section)
"Get the icon for SECTION from `dashboard-heading-icons'.
Return a space if icon is not found."
(let ((args (list :height dashboard-heading-icon-height
:v-adjust dashboard-heading-icon-v-adjust
:face 'dashboard-heading))
(icon (assoc section dashboard-heading-icons)))
(if icon (cond
((stringp (cdr icon)) (apply #'dashboard-octicon (cdr icon) args))
((listp (cdr icon)) (apply (cadr icon) (caddr icon) args))
(t (error "Bad value %s in `dashboard-heading-icons'" icon)))
" ")))
;; ;;
;;; Section list ;;; Section list
+2 -1
View File
@@ -12,7 +12,8 @@
;;; License: GPLv3 ;;; License: GPLv3
;; ;;
;; Created: October 05, 2016 ;; Created: October 05, 2016
;; Package-Version: 1.9.0-SNAPSHOT ;; Package-Version: 20250521.900
;; Package-Revision: f07661b39bec
;; Keywords: startup, screen, tools, dashboard ;; Keywords: startup, screen, tools, dashboard
;; Package-Requires: ((emacs "27.1")) ;; Package-Requires: ((emacs "27.1"))
+10 -12
View File
@@ -1,12 +1,10 @@
(define-package "deft" "20240524.1524" "quickly browse, filter, and edit plain text notes" 'nil :commit "b369d7225d86551882568788a23c5497b232509c" :authors ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'(("Jason R. Blevins" . "jrblevin@xbeta.org")) (define-package "deft" "20240524.1524"
:maintainers "Quickly browse, filter, and edit plain text notes."
'(("Jason R. Blevins" . "jrblevin@xbeta.org")) ()
:maintainer :url "https://jblevins.org/projects/deft/"
'("Jason R. Blevins" . "jrblevin@xbeta.org") :commit "b369d7225d86551882568788a23c5497b232509c"
:keywords :revdesc "b369d7225d86"
'("plain text" "notes" "simplenote" "notational velocity") :keywords '("plain text" "notes" "simplenote" "notational velocity")
:url "https://jblevins.org/projects/deft/") :authors '(("Jason R. Blevins" . "jrblevin@xbeta.org"))
;; Local Variables: :maintainers '(("Jason R. Blevins" . "jrblevin@xbeta.org")))
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -26,7 +26,8 @@
;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
;; POSSIBILITY OF SUCH DAMAGE. ;; POSSIBILITY OF SUCH DAMAGE.
;;; Version: 0.8 ;; Package-Version: 20240524.1524
;; Package-Revision: b369d7225d86
;;; Author: Jason R. Blevins <jrblevin@xbeta.org> ;;; Author: Jason R. Blevins <jrblevin@xbeta.org>
;;; Keywords: plain text, notes, Simplenote, Notational Velocity ;;; Keywords: plain text, notes, Simplenote, Notational Velocity
;;; URL: https://jblevins.org/projects/deft/ ;;; URL: https://jblevins.org/projects/deft/
+2 -1
View File
@@ -154,7 +154,8 @@ FOOTER are showed at start and end."
diff-hl-inline-popup--current-footer))) diff-hl-inline-popup--current-footer)))
;; https://debbugs.gnu.org/38563, `company--replacement-string'. ;; https://debbugs.gnu.org/38563, `company--replacement-string'.
(add-face-text-property 0 (length str) 'default t str) (add-face-text-property 0 (length str) 'default t str)
(overlay-put diff-hl-inline-popup--current-popup 'after-string str)))) (put-text-property 0 1 'cursor 0 str)
(overlay-put diff-hl-inline-popup--current-popup 'before-string str))))
(defun diff-hl-inline-popup--popup-down() (defun diff-hl-inline-popup--popup-down()
"Scrolls one line down." "Scrolls one line down."
+9 -1
View File
@@ -1,6 +1,6 @@
;;; diff-hl-margin.el --- Highlight buffer changes on margins -*- lexical-binding: t -*- ;;; diff-hl-margin.el --- Highlight buffer changes on margins -*- lexical-binding: t -*-
;; Copyright (C) 2012-2017 Free Software Foundation, Inc. ;; Copyright (C) 2012-2025 Free Software Foundation, Inc.
;; This file is part of GNU Emacs. ;; This file is part of GNU Emacs.
@@ -147,7 +147,15 @@ You probably shouldn't use this function directly."
,(propertize char 'face ,(propertize char 'face
(intern (format "diff-hl-margin-%s" type))))))))) (intern (format "diff-hl-margin-%s" type)))))))))
(defun diff-hl-margin-ensure-visible ()
(let ((width-var (intern (format "%s-margin-width" diff-hl-side))))
(when (zerop (symbol-value width-var))
(set width-var 1)
(dolist (win (get-buffer-window-list))
(set-window-buffer win (current-buffer))))))
(defun diff-hl-highlight-on-margin (ovl type _shape) (defun diff-hl-highlight-on-margin (ovl type _shape)
(diff-hl-margin-ensure-visible)
(let ((spec (cdr (assoc (cons type diff-hl-side) (let ((spec (cdr (assoc (cons type diff-hl-side)
(diff-hl-margin-spec-cache))))) (diff-hl-margin-spec-cache)))))
(overlay-put ovl 'before-string spec))) (overlay-put ovl 'before-string spec)))
+10 -14
View File
@@ -1,15 +1,11 @@
(define-package "diff-hl" "20250223.2320" "Highlight uncommitted changes using VC" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "diff-hl" "20250613.2144"
"Highlight uncommitted changes using VC."
'((cl-lib "0.2") '((cl-lib "0.2")
(emacs "25.1")) (emacs "26.1"))
:commit "685e99135001da13caecdff71acea1ee20bed373" :authors :url "https://github.com/dgutov/diff-hl"
'(("Dmitry Gutov" . "dmitry@gutov.dev")) :commit "830b05253ba8f35b80448e5de2201aecb6943840"
:maintainers :revdesc "830b05253ba8"
'(("Dmitry Gutov" . "dmitry@gutov.dev")) :keywords '("vc" "diff")
:maintainer :authors '(("Dmitry Gutov" . "dmitry@gutov.dev"))
'("Dmitry Gutov" . "dmitry@gutov.dev") :maintainers '(("Dmitry Gutov" . "dmitry@gutov.dev")))
:keywords
'("vc" "diff")
:url "https://github.com/dgutov/diff-hl")
;; Local Variables:
;; no-byte-compile: t
;; End:
+10 -16
View File
@@ -76,15 +76,7 @@ Customize it to change the base properties of the text.")
(interactive) (interactive)
(diff-hl-show-hunk-posframe--transient-mode -1) (diff-hl-show-hunk-posframe--transient-mode -1)
(when (frame-live-p diff-hl-show-hunk--frame) (when (frame-live-p diff-hl-show-hunk--frame)
(make-frame-invisible diff-hl-show-hunk--frame)) (make-frame-invisible diff-hl-show-hunk--frame)))
(when diff-hl-show-hunk--original-frame
(when (frame-live-p diff-hl-show-hunk--original-frame)
(let ((frame diff-hl-show-hunk--original-frame))
(select-frame-set-input-focus frame)
;; In Gnome, sometimes the input focus is not restored to the
;; original frame, so we try harder in a while
(run-with-timer 0.1 nil (lambda () (select-frame-set-input-focus frame)))))
(setq diff-hl-show-hunk--original-frame nil)))
(defvar diff-hl-show-hunk-posframe--transient-mode-map (defvar diff-hl-show-hunk-posframe--transient-mode-map
(let ((map (make-sparse-keymap))) (let ((map (make-sparse-keymap)))
@@ -179,7 +171,6 @@ The button calls an ACTION."
(user-error (user-error
"Package `posframe' is not workable. Please customize diff-hl-show-hunk-function")) "Package `posframe' is not workable. Please customize diff-hl-show-hunk-function"))
(diff-hl-show-hunk--posframe-hide)
(setq diff-hl-show-hunk--hide-function #'diff-hl-show-hunk--posframe-hide) (setq diff-hl-show-hunk--hide-function #'diff-hl-show-hunk--posframe-hide)
;; put an overlay to override read-only-mode keymap ;; put an overlay to override read-only-mode keymap
@@ -192,10 +183,14 @@ The button calls an ACTION."
'keymap diff-hl-show-hunk-posframe--transient-mode-map))) 'keymap diff-hl-show-hunk-posframe--transient-mode-map)))
(setq posframe-mouse-banish nil) (setq posframe-mouse-banish nil)
(setq diff-hl-show-hunk--original-frame last-event-frame) (setq diff-hl-show-hunk--original-frame (selected-frame))
(let* ((hunk-overlay diff-hl-show-hunk--original-overlay) (let* ((overlay diff-hl-show-hunk--original-overlay)
(position (overlay-end hunk-overlay))) (type (overlay-get overlay 'diff-hl-hunk-type))
(position (save-excursion
(goto-char (overlay-end overlay))
(forward-line -1)
(point))))
(setq (setq
diff-hl-show-hunk--frame diff-hl-show-hunk--frame
(posframe-show buffer (posframe-show buffer
@@ -207,12 +202,12 @@ The button calls an ACTION."
:internal-border-color diff-hl-show-hunk-posframe-internal-border-color :internal-border-color diff-hl-show-hunk-posframe-internal-border-color
:hidehandler nil :hidehandler nil
;; Sometimes, header-line is not taken into account, so put a min height and a min width ;; Sometimes, header-line is not taken into account, so put a min height and a min width
:min-height (when diff-hl-show-hunk-posframe-show-header-line 10)
:min-width (when diff-hl-show-hunk-posframe-show-header-line :min-width (when diff-hl-show-hunk-posframe-show-header-line
(length (diff-hl-show-hunk-posframe--header-line))) (length (diff-hl-show-hunk-posframe--header-line)))
:respect-header-line diff-hl-show-hunk-posframe-show-header-line :respect-header-line diff-hl-show-hunk-posframe-show-header-line
:respect-tab-line nil :respect-tab-line nil
:respect-mode-line nil :respect-mode-line nil
:y-pixel-offset (if (eq type 'delete) (- (default-line-height)))
:override-parameters diff-hl-show-hunk-posframe-parameters))) :override-parameters diff-hl-show-hunk-posframe-parameters)))
(set-frame-parameter diff-hl-show-hunk--frame 'drag-internal-border t) (set-frame-parameter diff-hl-show-hunk--frame 'drag-internal-border t)
@@ -231,8 +226,7 @@ The button calls an ACTION."
(setq cursor-type 'box) (setq cursor-type 'box)
;; Recenter around point ;; Recenter around point
(recenter))) (recenter))))
(select-frame-set-input-focus diff-hl-show-hunk--frame))
(provide 'diff-hl-show-hunk-posframe) (provide 'diff-hl-show-hunk-posframe)
;;; diff-hl-show-hunk-posframe.el ends here ;;; diff-hl-show-hunk-posframe.el ends here
+5 -6
View File
@@ -132,6 +132,7 @@ point in that buffer to the corresponding line of the original
buffer." buffer."
(defvar vc-sentinel-movepoint) (defvar vc-sentinel-movepoint)
(let* ((buffer (or (buffer-base-buffer) (current-buffer))) (let* ((buffer (or (buffer-base-buffer) (current-buffer)))
(diff-hl-update-async nil)
(line (line-number-at-pos)) (line (line-number-at-pos))
(dest-buffer diff-hl-show-hunk-diff-buffer-name)) (dest-buffer diff-hl-show-hunk-diff-buffer-name))
(with-current-buffer buffer (with-current-buffer buffer
@@ -338,7 +339,8 @@ end of the OVERLAY, so posframe/inline is placed below the hunk."
(set-window-start nil (point))) (set-window-start nil (point)))
((> (point) pt) ((> (point) pt)
(redisplay)))) (redisplay))))
(goto-char (1- (overlay-end overlay))))) (goto-char (1- (overlay-end overlay)))
(forward-line 0)))
;;;###autoload ;;;###autoload
(defun diff-hl-show-hunk-next () (defun diff-hl-show-hunk-next ()
@@ -347,7 +349,8 @@ end of the OVERLAY, so posframe/inline is placed below the hunk."
(let* ((point (if diff-hl-show-hunk--original-overlay (let* ((point (if diff-hl-show-hunk--original-overlay
(overlay-start diff-hl-show-hunk--original-overlay) (overlay-start diff-hl-show-hunk--original-overlay)
nil)) nil))
(next-overlay (diff-hl-show-hunk--next-hunk nil point))) (next-overlay (diff-hl-show-hunk--next-hunk nil point))
(inhibit-redisplay t))
(if (not next-overlay) (if (not next-overlay)
(message "There is no next change") (message "There is no next change")
(diff-hl-show-hunk-hide) (diff-hl-show-hunk-hide)
@@ -361,10 +364,6 @@ end of the OVERLAY, so posframe/inline is placed below the hunk."
The backend is determined by `diff-hl-show-hunk-function'." The backend is determined by `diff-hl-show-hunk-function'."
(interactive) (interactive)
;; Close any previous hunk
(save-excursion
(diff-hl-show-hunk-hide))
(unless (vc-backend buffer-file-name) (unless (vc-backend buffer-file-name)
(user-error "The buffer is not under version control")) (user-error "The buffer is not under version control"))
+102 -30
View File
@@ -1,12 +1,13 @@
;;; diff-hl.el --- Highlight uncommitted changes using VC -*- lexical-binding: t -*- ;;; diff-hl.el --- Highlight uncommitted changes using VC -*- lexical-binding: t -*-
;; Copyright (C) 2012-2024 Free Software Foundation, Inc. ;; Copyright (C) 2012-2025 Free Software Foundation, Inc.
;; Author: Dmitry Gutov <dmitry@gutov.dev> ;; Author: Dmitry Gutov <dmitry@gutov.dev>
;; URL: https://github.com/dgutov/diff-hl ;; URL: https://github.com/dgutov/diff-hl
;; Keywords: vc, diff ;; Keywords: vc, diff
;; Version: 1.10.0 ;; Package-Version: 20250613.2144
;; Package-Requires: ((cl-lib "0.2") (emacs "25.1")) ;; Package-Revision: 830b05253ba8
;; Package-Requires: ((cl-lib "0.2") (emacs "26.1"))
;; This file is part of GNU Emacs. ;; This file is part of GNU Emacs.
@@ -116,6 +117,20 @@
:group 'diff-hl :group 'diff-hl
:type 'boolean) :type 'boolean)
(defcustom diff-hl-fallback-to-margin t
"Non-nil to use margin instead of fringe on non-graphic displays.
This resizes the margin to 1 if it's not visible."
:group 'diff-hl
:type 'boolean)
(defcustom diff-hl-autohide-margin nil
"Non-nil to reset margin width to 0 when no indicators shown.
When you use it, it's recommended to verify first that other enabled
features don't use margin for their indicators."
:type 'boolean)
(defcustom diff-hl-highlight-function 'diff-hl-highlight-on-fringe (defcustom diff-hl-highlight-function 'diff-hl-highlight-on-fringe
"Function to highlight the current line. Its arguments are "Function to highlight the current line. Its arguments are
overlay, change type and position within a hunk." overlay, change type and position within a hunk."
@@ -147,6 +162,12 @@
(set-default var value) (set-default var value)
(when on (global-diff-hl-mode 1))))) (when on (global-diff-hl-mode 1)))))
(defcustom diff-hl-bmp-max-width 16
"Maximum width of the fringe indicator bitmaps, in pixels.
The bitmap width is decided by comparing this value with the current width
of the fringe. When the fringe is hidden, this value is also used."
:type 'integer)
(defcustom diff-hl-highlight-revert-hunk-function (defcustom diff-hl-highlight-revert-hunk-function
#'diff-hl-revert-narrow-to-hunk #'diff-hl-revert-narrow-to-hunk
"Function to emphasize the current hunk in `diff-hl-revert-hunk'. "Function to emphasize the current hunk in `diff-hl-revert-hunk'.
@@ -230,8 +251,8 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
(truncate (* (frame-char-height) spacing)) (truncate (* (frame-char-height) spacing))
spacing))) spacing)))
(w (min (frame-parameter nil (intern (format "%s-fringe" diff-hl-side))) (w (min (frame-parameter nil (intern (format "%s-fringe" diff-hl-side)))
16)) diff-hl-bmp-max-width))
(_ (when (zerop w) (setq w 16))) (_ (when (zerop w) (setq w diff-hl-bmp-max-width)))
(middle (make-vector h (expt 2 (1- w)))) (middle (make-vector h (expt 2 (1- w))))
(ones (1- (expt 2 w))) (ones (1- (expt 2 w)))
(top (copy-sequence middle)) (top (copy-sequence middle))
@@ -302,6 +323,7 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
(defvar vc-svn-diff-switches) (defvar vc-svn-diff-switches)
(defvar vc-fossil-diff-switches) (defvar vc-fossil-diff-switches)
(defvar vc-jj-diff-switches)
(defmacro diff-hl-with-diff-switches (body) (defmacro diff-hl-with-diff-switches (body)
`(let ((vc-git-diff-switches `(let ((vc-git-diff-switches
@@ -317,6 +339,7 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
(vc-hg-diff-switches nil) (vc-hg-diff-switches nil)
(vc-svn-diff-switches nil) (vc-svn-diff-switches nil)
(vc-fossil-diff-switches '("-c" "0")) (vc-fossil-diff-switches '("-c" "0"))
(vc-jj-diff-switches '("--git" "--context=0"))
(vc-diff-switches '("-U0")) (vc-diff-switches '("-U0"))
,@(when (boundp 'vc-disable-async-diff) ,@(when (boundp 'vc-disable-async-diff)
'((vc-disable-async-diff t)))) '((vc-disable-async-diff t))))
@@ -342,21 +365,24 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
(if (and (eq backend 'Git) (if (and (eq backend 'Git)
(not diff-hl-reference-revision) (not diff-hl-reference-revision)
(not diff-hl-show-staged-changes)) (not diff-hl-show-staged-changes))
(apply #'vc-git-command buffer 1 (apply #'vc-git-command buffer
(if (diff-hl--use-async-p) 'async 1)
(list file) (list file)
"diff-files" "diff-files"
(cons "-p" (vc-switches 'git 'diff))) (cons "-p" (vc-switches 'git 'diff)))
(condition-case err (condition-case err
(vc-call-backend backend 'diff (list file) (vc-call-backend backend 'diff (list file)
diff-hl-reference-revision nil diff-hl-reference-revision nil
buffer) buffer
(diff-hl--use-async-p))
(error (error
;; https://github.com/dgutov/diff-hl/issues/117 ;; https://github.com/dgutov/diff-hl/issues/117
(when (string-match-p "\\`Failed (status 128)" (error-message-string err)) (when (string-match-p "\\`Failed (status 128)" (error-message-string err))
(vc-call-backend backend 'diff (list file) (vc-call-backend backend 'diff (list file)
"4b825dc642cb6eb9a060e54bf8d69288fbee4904" "4b825dc642cb6eb9a060e54bf8d69288fbee4904"
nil nil
buffer))))) buffer
(diff-hl--use-async-p))))))
buffer) buffer)
(defun diff-hl-changes () (defun diff-hl-changes ()
@@ -373,14 +399,19 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
((eq state 'removed) ((eq state 'removed)
`((1 ,(line-number-at-pos (point-max)) delete)))))))) `((1 ,(line-number-at-pos (point-max)) delete))))))))
(defun diff-hl-process-wait (buf)
(let ((proc (get-buffer-process buf)))
(while (process-live-p proc)
(accept-process-output proc 0.01))))
(defun diff-hl-changes-from-buffer (buf) (defun diff-hl-changes-from-buffer (buf)
(diff-hl-process-wait buf)
(with-current-buffer buf (with-current-buffer buf
(let (res) (let (res)
(goto-char (point-min)) (goto-char (point-min))
(unless (eobp) (unless (eobp)
;; TODO: When 27.1 is the minimum requirement, we can drop ;; TODO: When 27.1 is the minimum requirement, we can drop
;; these bindings: that version, in addition to switching over ;; these bindings: that version, in addition to switching over
;; to the diff-refine var, also added the
;; called-interactively-p check, so refinement can't be ;; called-interactively-p check, so refinement can't be
;; triggered by code calling the navigation functions, only by ;; triggered by code calling the navigation functions, only by
;; direct interactive invocations. ;; direct interactive invocations.
@@ -407,14 +438,30 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
(push (list line len type) res))))) (push (list line len type) res)))))
(nreverse res)))) (nreverse res))))
(defun diff-hl--use-async-p ()
(and diff-hl-update-async
(not
(run-hook-with-args-until-success 'diff-hl-async-inhibit-functions
default-directory))))
(defun diff-hl-update () (defun diff-hl-update ()
"Updates the diff-hl overlay." "Updates the diff-hl overlay."
(if (and diff-hl-update-async (if (diff-hl--use-async-p)
(not
(run-hook-with-args-until-success 'diff-hl-async-inhibit-functions
default-directory)))
;; TODO: debounce if a thread is already running. ;; TODO: debounce if a thread is already running.
(make-thread 'diff-hl--update-safe "diff-hl--update-safe") (let ((buf (current-buffer))
(temp-buffer
(if (< emacs-major-version 28)
(generate-new-buffer " *temp*")
(generate-new-buffer " *temp*" t))))
;; Switch buffer temporarily, to "unlock" it for other threads.
(with-current-buffer temp-buffer
(make-thread
(lambda ()
(kill-buffer temp-buffer)
(when (buffer-live-p buf)
(set-buffer buf)
(diff-hl--update-safe)))
"diff-hl--update-safe")))
(diff-hl--update))) (diff-hl--update)))
(defun diff-hl-with-editor-p (_dir) (defun diff-hl-with-editor-p (_dir)
@@ -433,6 +480,8 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
(let ((changes (diff-hl-changes)) (let ((changes (diff-hl-changes))
(current-line 1)) (current-line 1))
(diff-hl-remove-overlays) (diff-hl-remove-overlays)
(when (not changes)
(diff-hl--autohide-margin))
(save-excursion (save-excursion
(save-restriction (save-restriction
(widen) (widen)
@@ -463,6 +512,16 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
(overlay-put h 'insert-in-front-hooks hook) (overlay-put h 'insert-in-front-hooks hook)
(overlay-put h 'insert-behind-hooks hook))))))))) (overlay-put h 'insert-behind-hooks hook)))))))))
(defun diff-hl--autohide-margin ()
(let ((width-var (intern (format "%s-margin-width" diff-hl-side))))
(when (and diff-hl-autohide-margin
(> (symbol-value width-var) 0))
(if (eql (default-value width-var) 0)
(kill-local-variable width-var)
(set width-var 0))
(dolist (win (get-buffer-window-list))
(set-window-buffer win (current-buffer))))))
(defvar-local diff-hl--modified-tick nil) (defvar-local diff-hl--modified-tick nil)
(put 'diff-hl--modified-tick 'permanent-local t) (put 'diff-hl--modified-tick 'permanent-local t)
@@ -478,9 +537,14 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
(funcall diff-hl-highlight-function o type shape) (funcall diff-hl-highlight-function o type shape)
o)) o))
(autoload 'diff-hl-highlight-on-margin "diff-hl-margin")
(defun diff-hl-highlight-on-fringe (ovl type shape) (defun diff-hl-highlight-on-fringe (ovl type shape)
(overlay-put ovl 'before-string (diff-hl-fringe-spec type shape (if (and diff-hl-fallback-to-margin
diff-hl-side))) (not (display-graphic-p)))
(diff-hl-highlight-on-margin ovl type shape)
(overlay-put ovl 'before-string (diff-hl-fringe-spec type shape
diff-hl-side))))
(defun diff-hl-remove-overlays (&optional beg end) (defun diff-hl-remove-overlays (&optional beg end)
(save-restriction (save-restriction
@@ -526,7 +590,11 @@ It can be a relative expression as well, such as \"HEAD^\" with Git, or
(let ((revs (diff-hl-diff-read-revisions rev1))) (let ((revs (diff-hl-diff-read-revisions rev1)))
(setq rev1 (car revs) (setq rev1 (car revs)
rev2 (cdr revs)))) rev2 (cdr revs))))
(vc-diff-internal t (vc-deduce-fileset) rev1 rev2 t) (vc-diff-internal
(if (boundp 'vc-allow-async-diff)
vc-allow-async-diff
t)
(vc-deduce-fileset) rev1 rev2 t)
(vc-run-delayed (if (< (line-number-at-pos (point-max)) 3) (vc-run-delayed (if (< (line-number-at-pos (point-max)) 3)
(with-current-buffer buffer (diff-hl-remove-overlays)) (with-current-buffer buffer (diff-hl-remove-overlays))
(when (or (not rev2) diff-hl-goto-hunk-old-revisions) (when (or (not rev2) diff-hl-goto-hunk-old-revisions)
@@ -615,6 +683,7 @@ in the source file, or the last line of the hunk above it."
(let* ((diff-buffer (get-buffer-create (let* ((diff-buffer (get-buffer-create
(generate-new-buffer-name "*diff-hl*"))) (generate-new-buffer-name "*diff-hl*")))
(buffer (current-buffer)) (buffer (current-buffer))
(diff-hl-update-async nil)
(line (save-excursion (line (save-excursion
(diff-hl-find-current-hunk) (diff-hl-find-current-hunk)
(line-number-at-pos))) (line-number-at-pos)))
@@ -755,7 +824,7 @@ its end position."
(user-error "Only Git supports staging; this file is controlled by %s" backend)))) (user-error "Only Git supports staging; this file is controlled by %s" backend))))
(defun diff-hl-stage-diff (orig-buffer) (defun diff-hl-stage-diff (orig-buffer)
(let ((patchfile (make-temp-file "diff-hl-stage-patch")) (let ((patchfile (make-nearby-temp-file "diff-hl-stage-patch"))
success) success)
(write-region (point-min) (point-max) patchfile (write-region (point-min) (point-max) patchfile
nil 'silent) nil 'silent)
@@ -763,7 +832,7 @@ its end position."
(with-current-buffer orig-buffer (with-current-buffer orig-buffer
(with-output-to-string (with-output-to-string
(vc-git-command standard-output 0 (vc-git-command standard-output 0
patchfile (file-local-name patchfile)
"apply" "--cached" ) "apply" "--cached" )
(setq success t))) (setq success t)))
(delete-file patchfile)) (delete-file patchfile))
@@ -786,7 +855,9 @@ Only supported with Git."
(with-current-buffer dest-buffer (with-current-buffer dest-buffer
(let ((inhibit-read-only t)) (let ((inhibit-read-only t))
(erase-buffer))) (erase-buffer)))
(diff-hl-diff-buffer-with-reference file dest-buffer nil 3) (let (diff-hl-reference-revision
diff-hl-update-async)
(diff-hl-diff-buffer-with-reference file dest-buffer nil 3))
(with-current-buffer dest-buffer (with-current-buffer dest-buffer
(with-no-warnings (with-no-warnings
(let (diff-auto-refine-mode) (let (diff-auto-refine-mode)
@@ -961,7 +1032,8 @@ The value of this variable is a mode line template as in
(remove-hook 'magit-revert-buffer-hook 'diff-hl-update t) (remove-hook 'magit-revert-buffer-hook 'diff-hl-update t)
(remove-hook 'magit-not-reverted-hook 'diff-hl-update t) (remove-hook 'magit-not-reverted-hook 'diff-hl-update t)
(remove-hook 'text-scale-mode-hook 'diff-hl-maybe-redefine-bitmaps t) (remove-hook 'text-scale-mode-hook 'diff-hl-maybe-redefine-bitmaps t)
(diff-hl-remove-overlays))) (diff-hl-remove-overlays)
(diff-hl--autohide-margin)))
(defun diff-hl-after-checkin () (defun diff-hl-after-checkin ()
(let ((fileset (vc-deduce-fileset t))) (let ((fileset (vc-deduce-fileset t)))
@@ -1096,6 +1168,11 @@ the user should be returned."
(declare-function diff-no-select "diff") (declare-function diff-no-select "diff")
(defvar diff-hl-temporary-directory (if (and (eq system-type 'gnu/linux)
(file-directory-p "/dev/shm/"))
"/dev/shm/"
temporary-file-directory))
(defun diff-hl-diff-buffer-with-reference (file &optional dest-buffer backend context-lines) (defun diff-hl-diff-buffer-with-reference (file &optional dest-buffer backend context-lines)
"Compute the diff between the current buffer contents and reference in BACKEND. "Compute the diff between the current buffer contents and reference in BACKEND.
The diffs are computed in the buffer DEST-BUFFER. This requires The diffs are computed in the buffer DEST-BUFFER. This requires
@@ -1106,10 +1183,7 @@ CONTEXT-LINES is the size of the unified diff context, defaults to 0."
(save-current-buffer (save-current-buffer
(let* ((dest-buffer (or dest-buffer "*diff-hl-diff-buffer-with-reference*")) (let* ((dest-buffer (or dest-buffer "*diff-hl-diff-buffer-with-reference*"))
(backend (or backend (vc-backend file))) (backend (or backend (vc-backend file)))
(temporary-file-directory (temporary-file-directory diff-hl-temporary-directory)
(if (and (eq system-type 'gnu/linux) (file-directory-p "/dev/shm/"))
"/dev/shm/"
temporary-file-directory))
(rev (rev
(if (and (eq backend 'Git) (if (and (eq backend 'Git)
(not diff-hl-reference-revision) (not diff-hl-reference-revision)
@@ -1122,12 +1196,10 @@ CONTEXT-LINES is the size of the unified diff context, defaults to 0."
(or (diff-hl-resolved-reference-revision backend) (or (diff-hl-resolved-reference-revision backend)
(diff-hl-working-revision file backend))))) (diff-hl-working-revision file backend)))))
(switches (format "-U %d --strip-trailing-cr" (or context-lines 0)))) (switches (format "-U %d --strip-trailing-cr" (or context-lines 0))))
(diff-no-select rev (current-buffer) switches 'noasync (diff-no-select rev (current-buffer) switches (not (diff-hl--use-async-p))
(get-buffer-create dest-buffer)) (get-buffer-create dest-buffer))
(with-current-buffer dest-buffer ;; Function `diff-sentinel' adds a summary line, but that seems fine.
(let ((inhibit-read-only t)) ;; In all commands which use exact text we call it synchronously.
;; Function `diff-sentinel' adds a final line, so remove it
(delete-matching-lines "^Diff finished.*")))
(get-buffer-create dest-buffer)))) (get-buffer-create dest-buffer))))
(defun diff-hl-resolved-reference-revision (backend) (defun diff-hl-resolved-reference-revision (backend)
+9 -13
View File
@@ -1,14 +1,10 @@
(define-package "dim" "20160818.949" "Change mode-line names of major/minor modes" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "dim" "20160818.949"
"Change mode-line names of major/minor modes."
'((emacs "24.4")) '((emacs "24.4"))
:commit "110624657fec0c8a7b3589108230e6a635302ae0" :authors :url "https://github.com/alezost/dim.el"
'(("Alex Kost" . "alezost@gmail.com")) :commit "110624657fec0c8a7b3589108230e6a635302ae0"
:maintainers :revdesc "110624657fec"
'(("Alex Kost" . "alezost@gmail.com")) :keywords '("convenience")
:maintainer :authors '(("Alex Kost" . "alezost@gmail.com"))
'("Alex Kost" . "alezost@gmail.com") :maintainers '(("Alex Kost" . "alezost@gmail.com")))
:keywords
'("convenience")
:url "https://github.com/alezost/dim.el")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -4,7 +4,8 @@
;; Author: Alex Kost <alezost@gmail.com> ;; Author: Alex Kost <alezost@gmail.com>
;; Created: 24 Dec 2015 ;; Created: 24 Dec 2015
;; Version: 0.1 ;; Package-Version: 20160818.949
;; Package-Revision: 110624657fec
;; URL: https://github.com/alezost/dim.el ;; URL: https://github.com/alezost/dim.el
;; Keywords: convenience ;; Keywords: convenience
;; Package-Requires: ((emacs "24.4")) ;; Package-Requires: ((emacs "24.4"))
+10 -13
View File
@@ -1,14 +1,11 @@
(define-package "elisp-refs" "20230920.201" "find callers of elisp functions or macros" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "elisp-refs" "20230920.201"
"Find callers of elisp functions or macros."
'((dash "2.12.0") '((dash "2.12.0")
(s "1.11.0")) (s "1.11.0"))
:commit "541a064c3ce27867872cf708354a65d83baf2a6d" :authors :url "https://github.com/Wilfred/elisp-refs"
'(("Wilfred Hughes" . "me@wilfred.me.uk")) :commit "541a064c3ce27867872cf708354a65d83baf2a6d"
:maintainers :revdesc "541a064c3ce2"
'(("Wilfred Hughes" . "me@wilfred.me.uk")) :keywords '("lisp")
:maintainer :authors '(("Wilfred Hughes" . "me@wilfred.me.uk"))
'("Wilfred Hughes" . "me@wilfred.me.uk") :maintainers '(("Wilfred Hughes" . "me@wilfred.me.uk")))
:keywords
'("lisp"))
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -3,7 +3,8 @@
;; Copyright (C) 2016-2020 Wilfred Hughes <me@wilfred.me.uk> ;; Copyright (C) 2016-2020 Wilfred Hughes <me@wilfred.me.uk>
;; Author: Wilfred Hughes <me@wilfred.me.uk> ;; Author: Wilfred Hughes <me@wilfred.me.uk>
;; Version: 1.6 ;; Package-Version: 20230920.201
;; Package-Revision: 541a064c3ce2
;; Keywords: lisp ;; Keywords: lisp
;; Package-Requires: ((dash "2.12.0") (s "1.11.0")) ;; Package-Requires: ((dash "2.12.0") (s "1.11.0"))
+434
View File
@@ -0,0 +1,434 @@
# EmacSQL
EmacSQL is a high-level Emacs Lisp front-end for SQLite.
PostgreSQL and MySQL are also supported, but use of these connectors
is not recommended.
Any [readable lisp value][readable] can be stored as a value in
EmacSQL, including numbers, strings, symbols, lists, vectors, and
closures. EmacSQL has no concept of "TEXT" values; it's all just lisp
objects. The lisp object `nil` corresponds 1:1 with `NULL` in the
database.
Requires Emacs 26 or later.
[![Compile](https://github.com/magit/emacsql/actions/workflows/compile.yml/badge.svg)](https://github.com/magit/emacsql/actions/workflows/compile.yml)
[![Test](https://github.com/magit/emacsql/actions/workflows/test.yml/badge.svg)](https://github.com/magit/emacsql/actions/workflows/test.yml)
[![NonGNU ELPA](https://emacsair.me/assets/badges/nongnu-elpa.svg)](https://elpa.nongnu.org/nongnu-devel/emacsql.html)
[![MELPA Stable](https://stable.melpa.org/packages/emacsql-badge.svg)](https://stable.melpa.org/#/emacsql)
[![MELPA](https://melpa.org/packages/emacsql-badge.svg)](https://melpa.org/#/emacsql)
### FAQ
#### Why are all values stored as strings?
EmacSQL is not intended to interact with arbitrary databases, but to
be an ACID-compliant database for Emacs extensions. This means that
EmacSQL cannot be used with a regular SQL database used by other
non-Emacs clients.
All database values must be s-expressions. When EmacSQL stores a
value — string, symbol, cons, etc. — it is printed and written to
the database in its printed form. Strings are wrapped in quotes
and escaped as necessary. That means "bare" symbols in the database
generally look like strings. The only exception is `nil`, which is
stored as `NULL`.
#### Will EmacSQL ever support arbitrary databases?
The author of EmacSQL [thinks][mistake] that it was probably a
design mistake to restrict it to Emacs by storing only printed values,
and that it would be a lot more useful if it just handled primitive
database types.
However, EmacSQL is in maintenance mode and there are no plans to
make any fundamental changes, not least because they would break all
existing packages and databases that rely on the current EmacSQL
behavior.
### Windows Issues
Emacs `start-process-shell-command` function is not supported on
Windows. Since both `emacsql-mysql` and `emacsql-psql` rely on this
function, neither of these connection types are supported on Windows.
## Example Usage
```el
(defvar db (emacsql-sqlite-open "~/company.db"))
;; Create a table. Table and column identifiers are symbols.
(emacsql db [:create-table people ([name id salary])])
;; Or optionally provide column constraints.
(emacsql db [:create-table people
([name (id integer :primary-key) (salary float)])])
;; Insert some data:
(emacsql db [:insert :into people
:values (["Jeff" 1000 60000.0] ["Susan" 1001 64000.0])])
;; Query the database for results:
(emacsql db [:select [name id]
:from people
:where (> salary 62000)])
;; => (("Susan" 1001))
;; Queries can be templates, using $1, $2, etc.:
(emacsql db [:select [name id]
:from people
:where (> salary $s1)]
50000)
;; => (("Jeff" 1000) ("Susan" 1001))
```
When editing these prepared SQL s-expression statements, the `M-x
emacsql-show-last-sql` command (think `eval-last-sexp`) is useful for
seeing what the actual SQL expression will become when compiled.
## Schema
A table schema is a list whose first element is a vector of column
specifications. The rest of the list specifies table constraints. A
column identifier is a symbol and a column's specification can either
be just this symbol or it can include constraints as a list. Because
EmacSQL stores entire lisp objects as values, the only relevant (and
allowed) types are `integer`, `float`, and `object` (default).
([(<column>) ...] (<table-constraint> ...) ...])
Dashes in identifiers are converted into underscores when compiled
into SQL. This allows for lisp-style identifiers to be used in SQL.
Constraints follow the compilation rules below.
```el
;; No constraints schema with four columns:
([name id building room])
;; Add some column constraints:
([(name :unique) (id integer :primary-key) building room])
;; Add some table constraints:
([(name :unique) (id integer :primary-key) building room]
(:unique [building room])
(:check (> id 0)))
```
Here's an example using foreign keys.
```el
;; "subjects" table schema
([(id integer :primary-key) subject])
;; "tag" table references subjects
([(subject-id integer) tag]
(:foreign-key [subject-id] :references subjects [id]
:on-delete :cascade))
```
Foreign key constraints are enabled by default in EmacSQL.
## Operators
Expressions are written lisp-style, with the operator first. If it
looks like an operator EmacSQL treats it like an operator. However,
several operators are special.
<= >= funcall quote
The `<=` and `>=` operators accept 2 or 3 operands, transforming into
a SQL `_ BETWEEN _ AND _` operator as appropriate.
For function-like "operators" like `count` and `max` use the `funcall`
"operator."
```el
[:select (funcall max age) :from people]
```
With `glob` and `like` SQL operators keep in mind that they're
matching the *printed* representations of these values, even if the
value is a string.
The `||` concatenation operator is unsupported because concatenating
printed representations breaks an important constraint: all values must
remain readable within SQLite.
## Quoting
Inside expressions, EmacSQL cannot tell the difference between symbol
literals and column references. If you're talking about the symbol
itself, just quote it as you would in normal Elisp. Note that this
does not "escape" `$tn` parameter symbols.
```el
(emacsql db [... :where (= category 'hiking)])
```
Quoting a string makes EmacSQL handle it as a "raw string." These raw
strings are not printed when being assembled into a query. These are
intended for use in special circumstances like filenames (`ATTACH`) or
pattern matching (`LIKE`). It is vital that raw strings are not
returned as results.
```el
(emacsql db [... :where (like name '"%foo%")])
(emacsql db [:attach '"/path/to/foo.db" :as foo])
```
Since template parameters include their type they never need to be
quoted.
## Prepared Statements
The database is interacted with via prepared SQL s-expression
statements. You shouldn't normally be concatenating strings on your
own. (And it leaves out any possibility of a SQL injection!) See the
"Usage" section above for examples. A statement is a vector of
keywords and other lisp object.
Prepared EmacSQL s-expression statements are compiled into SQL
statements. The statement compiler is memorized so that using the same
statement multiple times is fast. To assist in this, the statement can
act as a template -- using `$i1`, `$s2`, etc. -- working like the
Elisp `format` function.
### Compilation Rules
Rather than the typical uppercase SQL keywords, keywords in a prepared
EmacSQL statement are literally just that: lisp keywords. EmacSQL only
understands a very small amount of SQL's syntax. The compiler follows
some simple rules to convert an s-expression into SQL.
#### All prepared statements are vectors.
A prepared s-expression statement is a vector beginning with a keyword
followed by a series of keywords and special values. This includes
most kinds of sub-queries.
```el
[:select ... :from ...]
[:select tag :from tags
:where (in tag [:select ...])]
```
#### Keywords are split and capitalized.
Dashes are converted into spaces and the keyword gets capitalized. For
example, `:if-not-exists` becomes `IF NOT EXISTS`. How you choose to
combine keywords is up to your personal taste (e.g., `:drop :table` vs.
`:drop-table`).
#### Standalone symbols are identifiers.
EmacSQL doesn't know what symbols refer to identifiers and what
symbols should be treated as values. Use quotes to mark a symbol as a
value. For example, `people` here will be treated as an identifier.
```el
[:insert-into people :values ...]
```
#### Row-oriented information is always represented as vectors.
This includes rows being inserted, and sets of columns in a query. If
you're talking about a row-like thing then put it in a vector.
```el
[:select [id name] :from people]
```
Note that `*` is actually a SQL keyword, so don't put it in a vector.
```el
[:select * :from ...]
```
#### Lists are treated as expressions.
This is true even within row-oriented vectors.
```el
[... :where (= name "Bob")]
[:select [(/ seconds 60) count] :from ...]
```
Some things that are traditionally keywords -- particularly those that
are mixed in with expressions -- have been converted into operators
(`AS`, `ASC`, `DESC`).
```el
[... :order-by [(asc b), (desc a)]] ; "ORDER BY b ASC, a DESC"
[:select p:name :from (as people p)] ; "SELECT p.name FROM people AS p"
```
#### The `:values` keyword is special.
What follows `:values` is always treated like a vector or list of
vectors. Normally this sort of thing would appear to be a column
reference.
```el
[... :values [1 2 3]]
[... :values ([1 2 3] [4 5 6])] ; insert multiple rows
```
#### A list whose first element is a vector is a table schema.
This is to distinguish schemata from everything else. With the
exception of what follows `:values`, nothing else is shaped like this.
```el
[:create-table people ([(id :primary-key) name])]
```
### Templates
To make statement compilation faster, and to avoid making you build up
statements dynamically, you can insert `$tn` parameters in place of
identifiers and values. These refer to the argument's type and its
argument position after the statement in the `emacsql` function,
one-indexed.
```el
(emacsql db [:select * :from $i1 :where (> salary $s2)] 'employees 50000)
(emacsql db [:select * :from employees :where (like name $r1)] "%Smith%")
```
The letter before the number is the type.
* `i` : identifier
* `s` : scalar
* `v` : vector (or multiple vectors)
* `r` : raw, unprinted strings
* `S` : schema
When combined with `:values`, the vector type can refer to lists of
rows.
```el
(emacsql db [:insert-into favorite-characters :values $v1]
'([0 "Calvin"] [1 "Hobbes"] [3 "Susie"]))
```
This is why rows must be vectors and not lists.
### Ignored Features
EmacSQL doesn't cover all of SQLite's features. Here are a list of
things that aren't supported, and probably will never be.
* Collating. SQLite has three built-in collation functions: BINARY
(default), NOCASE, and RTRIM. EmacSQL values never have right-hand
whitespace, so RTRIM won't be of any use. NOCASE is broken
(ASCII-only) and there's little reason to use it.
* Text manipulation functions. Like collating this is incompatible
with EmacSQL s-expression storage.
* Date and time. These are incompatible with the printed values
stored by EmacSQL and therefore have little use.
## Limitations
EmacSQL is *not* intended to play well with other programs accessing
the SQLite database. Non-numeric values are stored encoded as
s-expressions TEXT values. This avoids ambiguities in parsing output
from the command line and allows for storage of Emacs richer data
types. This is an efficient, ACID-compliant database specifically for
Emacs.
## Emacs Lisp Indentation Annoyance
By default, `emacs-lisp-mode` indents vectors as if they were regular
function calls.
```el
;; Ugly indentation!
(emacsql db [:select *
:from people
:where (> age 60)])
```
Calling the function `emacsql-fix-vector-indentation` (interactive)
advises the major mode to fix this annoyance.
```el
;; Such indent!
(emacsql db [:select *
:from people
:where (> age 60)])
```
## Contributing and Extending
To run the test suite, clone the `pg` and `sqlite3` packages into
sibling directories. The Makefile will automatically put these paths on
the Emacs load path (override `LDFLAGS` if your situation is different).
```shell
git clone https://github.com/emarsden/pg-el ../pg
git clone https://github.com/pekingduck/emacs-sqlite3-api ../sqlite3
```
Or set `LOAD_PATH` to point at these packages elsewhere:
```shell
make LOAD_PATH='-L path/to/pg -L path/to/sqlite3'
```
Then invoke make:
```shell
make test
```
If the environment variable `PGDATABASE` is present then the unit
tests will also be run with PostgreSQL (emacsql-psql). Provide
`PGHOST`, `PGPORT`, and `PGUSER` if needed. If `PGUSER` is provided,
the pg.el back-end (emacsql-pg) will also be tested.
If the environment variable `MYSQL_DBNAME` is present then the unit
tests will also be run with MySQL in the named database. Note that
this is not an official MySQL variable, just something made up for
EmacSQL.
### Creating a New Front-end
EmacSQL uses EIEIO so that interactions with a connection occur
through generic functions. You need to define a new class that
inherits from `emacsql-connection`.
* Implement `emacsql-send-message`, `emacsql-waiting-p`,
`emacsql-parse`, and `emacsql-close`.
* Provide a constructor that initializes the connection and calls
`emacsql-register` (for automatic connection cleanup).
* Provide `emacsql-types` if needed (hint: use a class-allocated slot).
* Ensure that you properly read NULL as nil (hint: ask your back-end
to print it that way).
* Register all reserved words with `emacsql-register-reserved`.
* Preferably provide `emacsql-reconnect` if possible.
* Set the default isolation level to *serializable*.
* Enable autocommit mode by default.
* Prefer ANSI syntax (value escapes, identifier escapes, etc.).
* Enable foreign key constraints by default.
The goal of the autocommit, isolation, parsing, and foreign key
configuration settings is to normalize the interface as much as
possible. The connection's user should have the option to be agnostic
about which back-end is actually in use.
The provided implementations should serve as useful examples. If your
back-end outputs data in a clean, standard way you may be able to use
the emacsql-protocol-mixin class to do most of the work.
## See Also
* [SQLite Documentation](https://www.sqlite.org/docs.html)
[readable]: http://nullprogram.com/blog/2013/12/30/#almost_everything_prints_readably
[mistake]: https://github.com/magit/emacsql/issues/35#issuecomment-346352439
<!-- LocalWords: EIEIO Elisp EmacSQL MELPA Makefile NOCASE RTRIM -->
<!-- LocalWords: SQL's autocommit el emacsql unprinted whitespace -->
+8 -11
View File
@@ -1,12 +1,9 @@
(define-package "emacsql" "20250301.1637" "High-level SQL database front-end" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "emacsql" "20250601.1009"
"High-level SQL database front-end."
'((emacs "26.1")) '((emacs "26.1"))
:commit "f111b0acc79eadeeb3c6c1332d943f11fd6932ff" :authors :url "https://github.com/magit/emacsql"
'(("Christopher Wellons" . "wellons@nullprogram.com")) :commit "ced062890061b6e4fbe4d00c0617f7ff84fff25c"
:maintainers :revdesc "ced062890061"
'(("Jonas Bernoulli" . "emacs.emacsql@jonas.bernoulli.dev")) :authors '(("Christopher Wellons" . "wellons@nullprogram.com"))
:maintainer :maintainers '(("Jonas Bernoulli" . "emacs.emacsql@jonas.bernoulli.dev")))
'("Jonas Bernoulli" . "emacs.emacsql@jonas.bernoulli.dev")
:url "https://github.com/magit/emacsql")
;; Local Variables:
;; no-byte-compile: t
;; End:
+3 -5
View File
@@ -16,10 +16,9 @@
(require 'emacsql-sqlite) (require 'emacsql-sqlite)
(require 'sqlite nil t) (declare-function sqlite-open "sqlite.c")
(declare-function sqlite-open "sqlite") (declare-function sqlite-select "sqlite.c")
(declare-function sqlite-select "sqlite") (declare-function sqlite-close "sqlite.c")
(declare-function sqlite-close "sqlite")
(emacsql-register-reserved emacsql-sqlite-reserved) (emacsql-register-reserved emacsql-sqlite-reserved)
@@ -28,7 +27,6 @@
(cl-defmethod initialize-instance :after (cl-defmethod initialize-instance :after
((connection emacsql-sqlite-builtin-connection) &rest _) ((connection emacsql-sqlite-builtin-connection) &rest _)
(require (quote sqlite))
(oset connection handle (oset connection handle
(sqlite-open (oref connection file))) (sqlite-open (oref connection file)))
(emacsql-sqlite-set-busy-timeout connection) (emacsql-sqlite-set-busy-timeout connection)
-22
View File
@@ -1,22 +0,0 @@
;;; emacsql-sqlite-common.el --- Transitional library that should not be loaded -*- lexical-binding:t -*-
;; This is free and unencumbered software released into the public domain.
;; Author: Jonas Bernoulli <emacs.emacsql@jonas.bernoulli.dev>
;; Maintainer: Jonas Bernoulli <emacs.emacsql@jonas.bernoulli.dev>
;; SPDX-License-Identifier: Unlicense
;;; Commentary:
;; Transitional library that should not be loaded. If your package still
;; requires this library, change it to require `emacsql-sqlite' instead.
;;; Code:
(require 'emacsql-sqlite)
(provide 'emacsql-sqlite-common)
;;; emacsql-sqlite-common.el ends here
+2 -2
View File
@@ -1,4 +1,4 @@
;;; emacsql-sqlite.el --- Code used by multiple SQLite back-ends -*- lexical-binding:t -*- ;;; emacsql-sqlite.el --- Code used by both SQLite back-ends -*- lexical-binding:t -*-
;; This is free and unencumbered software released into the public domain. ;; This is free and unencumbered software released into the public domain.
@@ -9,7 +9,7 @@
;;; Commentary: ;;; Commentary:
;; This library contains code that is used by multiple SQLite back-ends. ;; This library contains code that is used by both SQLite back-ends.
;;; Code: ;;; Code:
+13 -39
View File
@@ -6,7 +6,8 @@
;; Maintainer: Jonas Bernoulli <emacs.emacsql@jonas.bernoulli.dev> ;; Maintainer: Jonas Bernoulli <emacs.emacsql@jonas.bernoulli.dev>
;; Homepage: https://github.com/magit/emacsql ;; Homepage: https://github.com/magit/emacsql
;; Package-Version: 4.2.0 ;; Package-Version: 20250601.1009
;; Package-Revision: ced062890061
;; Package-Requires: ((emacs "26.1")) ;; Package-Requires: ((emacs "26.1"))
;; SPDX-License-Identifier: Unlicense ;; SPDX-License-Identifier: Unlicense
@@ -32,17 +33,13 @@
"The EmacSQL SQL database front-end." "The EmacSQL SQL database front-end."
:group 'comm) :group 'comm)
(defconst emacsql-version "4.2.0") (defconst emacsql-version "4.3.1")
(defvar emacsql-global-timeout 30 (defvar emacsql-global-timeout 30
"Maximum number of seconds to wait before bailing out on a SQL command. "Maximum number of seconds to wait before bailing out on a SQL command.
If nil, wait forever. This is used by the `mysql', `pg', `psql' and If nil, wait forever. This is used by the `mysql', `pg' and `psql'. It
`sqlite' back-ends. It is not being used by the `sqlite-builtin' and is not being used by the `sqlite-builtin' and `sqlite-module' back-ends,
`sqlite-module' back-ends, which only use `emacsql-sqlite-busy-timeout'.") which respect `emacsql-sqlite-busy-timeout' instead.")
(defvar emacsql-data-root
(file-name-directory (or load-file-name buffer-file-name))
"Directory where EmacSQL is installed.")
;;; Database connection ;;; Database connection
@@ -101,29 +98,6 @@ MESSAGE should not have a newline on the end."
(goto-char (point-max)) (goto-char (point-max))
(princ (concat message "\n") buffer))))) (princ (concat message "\n") buffer)))))
(cl-defgeneric emacsql-process (this)
"Access internal `handle' slot directly, which you shouldn't do.
Using this function to do it anyway, means additionally using a
misnamed and obsolete accessor function."
(and (slot-boundp this 'handle)
(oref this handle)))
(cl-defmethod (setf emacsql-process) (value (this emacsql-connection))
(oset this handle value))
(make-obsolete 'emacsql-process "underlying slot is for internal use only."
"EmacSQL 4.0.0")
(cl-defmethod slot-missing ((connection emacsql-connection)
slot-name operation &optional new-value)
"Treat removed `process' slot-name as an alias for internal `handle' slot."
(pcase (list operation slot-name)
('(oref process)
(message "EmacSQL: Slot `process' is obsolete")
(oref connection handle))
('(oset process)
(message "EmacSQL: Slot `process' is obsolete")
(oset connection handle new-value))
(_ (cl-call-next-method))))
;;; Sending and receiving ;;; Sending and receiving
(cl-defgeneric emacsql-send-message (connection message) (cl-defgeneric emacsql-send-message (connection message)
@@ -159,8 +133,8 @@ misnamed and obsolete accessor function."
(defun emacsql-compile (connection sql &rest args) (defun emacsql-compile (connection sql &rest args)
"Compile s-expression SQL for CONNECTION into a string." "Compile s-expression SQL for CONNECTION into a string."
(let* ((mask (and connection (emacsql-types connection))) (let ((emacsql-type-map (or (and connection (emacsql-types connection))
(emacsql-type-map (or mask emacsql-type-map))) emacsql-type-map)))
(concat (apply #'emacsql-format (emacsql-prepare sql) args) ";"))) (concat (apply #'emacsql-format (emacsql-prepare sql) args) ";")))
(cl-defgeneric emacsql (connection sql &rest args) (cl-defgeneric emacsql (connection sql &rest args)
@@ -205,14 +179,12 @@ specific error conditions."
(goto-char (point-min)) (goto-char (point-min))
(let* ((standard-input (current-buffer)) (let* ((standard-input (current-buffer))
(value (read))) (value (read)))
(if (eql value 'error) (if (eq value 'error)
(emacsql-handle connection (read) (read)) (emacsql-handle connection (read) (read))
(prog1 value (prog1 value
(unless (eq 'success (read)) (unless (eq (read) 'success)
(emacsql-handle connection (read) (read)))))))) (emacsql-handle connection (read) (read))))))))
(provide 'emacsql) ; end of generic function declarations
;;; Automatic connection cleanup ;;; Automatic connection cleanup
(defun emacsql-register (connection) (defun emacsql-register (connection)
@@ -306,7 +278,7 @@ Each column must be a plain symbol, no expressions allowed here."
(args (and (not (vectorp sql-and-args)) (cdr sql-and-args)))) (args (and (not (vectorp sql-and-args)) (cdr sql-and-args))))
(cl-assert (eq :select (elt sql 0))) (cl-assert (eq :select (elt sql 0)))
(let ((vars (elt sql 1))) (let ((vars (elt sql 1)))
(when (eq '* vars) (when (eq vars '*)
(error "Must explicitly list columns in `emacsql-with-bind'")) (error "Must explicitly list columns in `emacsql-with-bind'"))
(cl-assert (cl-every #'symbolp vars)) (cl-assert (cl-every #'symbolp vars))
`(let ((emacsql--results (emacsql ,connection ,sql ,@args)) `(let ((emacsql--results (emacsql ,connection ,sql ,@args))
@@ -402,4 +374,6 @@ Once activated, vector contents no longer indent like lists."
(advice-add 'calculate-lisp-indent :around (advice-add 'calculate-lisp-indent :around
#'emacsql--calculate-vector-indent)) #'emacsql--calculate-vector-indent))
(provide 'emacsql)
;;; emacsql.el ends here ;;; emacsql.el ends here
+11 -15
View File
@@ -1,16 +1,12 @@
(define-package "emojify" "20210108.1111" "Display emojis in Emacs" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
'((seq "1.11") (define-package "emojify" "20210108.1111"
(ht "2.0") "Display emojis in Emacs."
'((seq "1.11")
(ht "2.0")
(emacs "24.3")) (emacs "24.3"))
:commit "cfa00865388809363df3f884b4dd554a5d44f835" :authors :url "https://github.com/iqbalansari/emacs-emojify"
'(("Iqbal Ansari" . "iqbalansari02@yahoo.com")) :commit "cfa00865388809363df3f884b4dd554a5d44f835"
:maintainers :revdesc "cfa008653888"
'(("Iqbal Ansari" . "iqbalansari02@yahoo.com")) :keywords '("multimedia" "convenience")
:maintainer :authors '(("Iqbal Ansari" . "iqbalansari02@yahoo.com"))
'("Iqbal Ansari" . "iqbalansari02@yahoo.com") :maintainers '(("Iqbal Ansari" . "iqbalansari02@yahoo.com")))
:keywords
'("multimedia" "convenience")
:url "https://github.com/iqbalansari/emacs-emojify")
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -5,7 +5,8 @@
;; Author: Iqbal Ansari <iqbalansari02@yahoo.com> ;; Author: Iqbal Ansari <iqbalansari02@yahoo.com>
;; Keywords: multimedia, convenience ;; Keywords: multimedia, convenience
;; URL: https://github.com/iqbalansari/emacs-emojify ;; URL: https://github.com/iqbalansari/emacs-emojify
;; Version: 1.2.1 ;; Package-Version: 20210108.1111
;; Package-Revision: cfa008653888
;; Package-Requires: ((seq "1.11") (ht "2.0") (emacs "24.3")) ;; Package-Requires: ((seq "1.11") (ht "2.0") (emacs "24.3"))
;; This program is free software; you can redistribute it and/or modify ;; This program is free software; you can redistribute it and/or modify
+10 -11
View File
@@ -1,12 +1,11 @@
(define-package "ess-R-data-view" "20130509.1158" "Data viewer for GNU R" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "ess-R-data-view" "20130509.1158"
"Data viewer for GNU R."
'((ctable "20130313.1743") '((ctable "20130313.1743")
(popup "20130324.1305") (popup "20130324.1305")
(ess "20130225.1754")) (ess "20130225.1754"))
:commit "d6e98d3ae1e2a2ea39a56eebcdb73e99d29562e9" :authors :url "https://github.com/myuhe/ess-R-data-view.el"
'(("myuhe" . "yuhei.maeda_at_gmail.com")) :commit "d6e98d3ae1e2a2ea39a56eebcdb73e99d29562e9"
:keywords :revdesc "d6e98d3ae1e2"
'("convenience") :keywords '("convenience")
:url "https://github.com/myuhe/ess-R-data-view.el") :authors '(("myuhe" . "yuhei.maeda_at_gmail.com")))
;; Local Variables:
;; no-byte-compile: t
;; End:
+2 -1
View File
@@ -3,7 +3,8 @@
;; Author: myuhe <yuhei.maeda_at_gmail.com> ;; Author: myuhe <yuhei.maeda_at_gmail.com>
;; Maintainer: myuhe ;; Maintainer: myuhe
;; URL: https://github.com/myuhe/ess-R-data-view.el ;; URL: https://github.com/myuhe/ess-R-data-view.el
;; Version: 0.1 ;; Package-Version: 20130509.1158
;; Package-Revision: d6e98d3ae1e2
;; Created: 2013-05-09 ;; Created: 2013-05-09
;; Keywords: convenience ;; Keywords: convenience
;; Package-Requires: ((ctable "20130313.1743") (popup "20130324.1305") (ess "20130225.1754")) ;; Package-Requires: ((ctable "20130313.1743") (popup "20130324.1305") (ess "20130225.1754"))
+2 -2
View File
@@ -64,8 +64,8 @@ Users whose default is not \\='sh, but are accessing a remote machine with
`telnet' or `ssh', should have the following in their init file: `telnet' or `ssh', should have the following in their init file:
(setq-default ess-bugs-batch-method \\='sh)" (setq-default ess-bugs-batch-method \\='sh)"
:group 'ess-bugs :group 'ess-bugs
:type '(choice (const sh :tag "Bourne/C-like Unix Shell") :type '(choice (const :tag "Bourne/C-like Unix Shell" sh)
(const dos :tag "DOS-like Windows shell"))) (const :tag "DOS-like Windows shell" dos)))
(defcustom ess-bugs-batch-post-command (defcustom ess-bugs-batch-post-command
(if (equal ess-bugs-batch-method 'sh) "&" " ") (if (equal ess-bugs-batch-method 'sh) "&" " ")
+1 -1
View File
@@ -329,7 +329,7 @@ process. If a symbol, the symbol's value should be a directory.
For example, the following setting would always start the process For example, the following setting would always start the process
in the directory of the current file: in the directory of the current file:
(setq ess-startup-directory ''default-directory) (setq ess-startup-directory \\='default-directory)
If `ess-startup-directory' is nil (the default) and If `ess-startup-directory' is nil (the default) and
`ess-startup-directory-function' is non-nil, the value returned `ess-startup-directory-function' is non-nil, the value returned
+1 -1
View File
@@ -714,7 +714,7 @@ nil otherwise."
(save-excursion (save-excursion
(goto-char (point-min)) (goto-char (point-min))
(while (search-forward "_" nil t) (while (search-forward "_" nil t)
(backward-delete-char 2) (delete-char -2)
(put-text-property (point) (1+ (point)) 'face 'underline)))) (put-text-property (point) (1+ (point)) 'face 'underline))))
;;*;; Link to Info ;;*;; Link to Info
+19 -22
View File
@@ -1,23 +1,20 @@
(define-package "ess" "20250110.1437" "Emacs Speaks Statistics" ;; -*- no-byte-compile: t; lexical-binding: nil -*-
(define-package "ess" "20250606.831"
"Emacs Speaks Statistics."
'((emacs "25.1")) '((emacs "25.1"))
:commit "0eb240bcb6d0e933615f6cfaa9761b629ddbabdd" :authors :url "https://ess.r-project.org/"
'(("David Smith" . "dsmith@stats.adelaide.edu.au") :commit "cd85d1e1f0e897b409a948a3a4afdaffe032812e"
("A.J. Rossini" . "blindglobe@gmail.com") :revdesc "cd85d1e1f0e8"
("Richard M. Heiberger" . "rmh@temple.edu") :authors '(("David Smith" . "dsmith@stats.adelaide.edu.au")
("Kurt Hornik" . "Kurt.Hornik@R-project.org") ("A.J. Rossini" . "blindglobe@gmail.com")
("Martin Maechler" . "maechler@stat.math.ethz.ch") ("Richard M. Heiberger" . "rmh@temple.edu")
("Rodney A. Sparapani" . "rsparapa@mcw.edu") ("Kurt Hornik" . "Kurt.Hornik@R-project.org")
("Stephen Eglen" . "stephen@gnu.org") ("Martin Maechler" . "maechler@stat.math.ethz.ch")
("Sebastian P. Luque" . "spluque@gmail.com") ("Rodney A. Sparapani" . "rsparapa@mcw.edu")
("Henning Redestig" . "henning.red@googlemail.com") ("Stephen Eglen" . "stephen@gnu.org")
("Vitalie Spinu" . "spinuvit@gmail.com") ("Sebastian P. Luque" . "spluque@gmail.com")
("Lionel Henry" . "lionel.hry@gmail.com") ("Henning Redestig" . "henning.red@googlemail.com")
("J. Alexander Branham" . "alex.branham@gmail.com")) ("Vitalie Spinu" . "spinuvit@gmail.com")
:maintainers ("Lionel Henry" . "lionel.hry@gmail.com")
'(("ESS Core Team" . "ESS-core@r-project.org")) ("J. Alexander Branham" . "alex.branham@gmail.com"))
:maintainer :maintainers '(("ESS Core Team" . "ESS-core@r-project.org")))
'("ESS Core Team" . "ESS-core@r-project.org")
:url "https://ess.r-project.org/")
;; Local Variables:
;; no-byte-compile: t
;; End:
+5 -5
View File
@@ -62,7 +62,7 @@
"Default linters to use. "Default linters to use.
Can be either a string with R expression to be used as Can be either a string with R expression to be used as
is (e.g. `lintr::default_linters'). Or a list of strings where is (e.g. `lintr::default_linters'). Or a list of strings where
each element is passed as argument to `lintr::with_defaults'." each element is passed as argument to `lintr::linters_with_defaults'."
:group 'ess-R :group 'ess-R
:type '(choice string (repeat string)) :type '(choice string (repeat string))
:package-version '(ess . "18.10")) :package-version '(ess . "18.10"))
@@ -85,8 +85,8 @@ each element is passed as argument to `lintr::with_defaults'."
if (!suppressWarnings(require(lintr, quietly=T))) { if (!suppressWarnings(require(lintr, quietly=T))) {
cat('@@error: @@`lintr` package not installed') cat('@@error: @@`lintr` package not installed')
} else { } else {
if (packageVersion('lintr') <= '1.0.3') { if (packageVersion('lintr') <= '3.0.0') {
cat('@@error: @@Need `lintr` version > v1.0.3') cat('@@error: @@Need `lintr` version > v3.0.0')
} else { } else {
tryCatch(lintr::lint(commandArgs(TRUE), ...), tryCatch(lintr::lint(commandArgs(TRUE), ...),
error = function(e) { error = function(e) {
@@ -120,12 +120,12 @@ we couldn't find a .lintr file."
(defun ess-r--flymake-linters () (defun ess-r--flymake-linters ()
"If `ess-r-flymake-linters' is a string, use that. "If `ess-r-flymake-linters' is a string, use that.
Otherwise, construct a string to pass to lintr::with_defaults." Otherwise, construct a string to pass to lintr::linters_with_defaults."
(replace-regexp-in-string (replace-regexp-in-string
"[\n\t ]+" " " "[\n\t ]+" " "
(if (stringp ess-r-flymake-linters) (if (stringp ess-r-flymake-linters)
ess-r-flymake-linters ess-r-flymake-linters
(concat "lintr::with_defaults(" (concat "lintr::linters_with_defaults("
(mapconcat #'identity (mapconcat #'identity
ess-r-flymake-linters ess-r-flymake-linters
", ") ", ")

Some files were not shown because too many files have changed in this diff Show More