+++ /dev/null
-((color-luminance-dark-limit completion-lazy-hilit completion-lazy-hilit-fn file-has-changed-p--hash-table gensym-counter lisp-directory major-mode--suspended mounted-file-systems mouse-select-region-move-to-beginning read-answer-short read-char-from-minibuffer-map read-char-from-minibuffer-map-hash read-char-history regexp-unmatchable set-transient-map-timeout set-transient-map-timer text-quoting-style trusted-content untrusted-content) add-display-text-property alist-get always and-let* assoc assoc-delete-all bignump bool-vector bounds-of-thing-at-mouse buffer-hash buffer-local-boundp buffer-local-restore-state buffer-local-set-state buffer-local-set-state--get buffer-match-p button--properties button-buttonize buttonize buttonize-region caaaar caaadrnbsp;xor)
\ No newline at end of file
+++ /dev/null
-(((24 1)
- (functions
- (removed *table--cell-conter-region ad-Orig-gdb-invalidate-frames ad-define-subr-args ad-get-subr-args ad-subr-arglist ad-subr-args-defined-p ad-undefine-subr-args ada-after-change-function ada-handle-syntax-table-properties ada-initialize-syntax-table-properties ada-set-syntax-table-properties allout-auto-save-hook-handler allout-create-encryption-passphrase-verifier allout-encrypted-key-info allout-get-encryption-passphrase-verifier allout-obtain-passphrase allout-setup-mode-map allout-update-passphrase-mnemonic-aids allout-ut-buffer x-setup-function-keys)
- (added *table--cell-center-region 5x5-defvar-local 5x5-grid-to-vec 5x5-log 5x5-log-init 5x5-solve-rotate-left 5x5-solve-rotate-right 5x5-solve-suggest 5x5-solver 5x5-vec-to-grid Footnote-unicode Info-isearch-end Man-bookmark-jump Man-bookmark-make-record Man-default-bookmark-title Man-page-from-arguments abbrev-edit-save-buffer abbrev-edit-save-to-file abbrev-table-empty-p ad-Orig-dnd-insert-text ad-Orig-dnd-open-file ad-Orig-find-tag ad-Orig-idlwave-shell-electric-debug-mode ad-Orig-org-format-latex-as-mathml ad-Orig-outline-end-of-subtree ad-Orig-save-place-find-file-hook ad-Orig-server-visit-files ad-Orig-visit-tags-table align--set-marker allout-auto-activation-helper allout-body-modification-handler allout-called-interactively-p allout-chart-exposure-contour-ow-sizable-p window-size-fixed-p window-split-min-size window-state-get window-state-put window-top-child window-top-line window-total-height window-total-size window-total-width window-use-time window-valid-p window-with-parameter with-org-lparse-preserve-paragraph-state woman-bookmark-jump woman-bookmark-make-record word-search-regexp x-dnd-more-than-3-from-flags x-dnd-version-from-flags xmodmap-generic-mode xselect--encode-string xselect-convert-to-save-targets y-or-n-minibuffer))
- (variables
- (removed --dolist-tail-- --dotimes-limit-- OOOOscore OOOscore OOscore Oscore XXXXscore XXXscore XXscore Xscore after-find-file-from-revert-buffer allout-keybindings-list allout-passphrase-hint-handling allout-passphrase-verifier-handling allout-v18/19tramp-root-regexp translations ucs-completions url-cache-expired url-current-referer vc-header-alist vc-path verilog-fork-wait-re widget-complete-field x-alternatives-map x-menu-assoc-buffer x-menu-item-spacing x-menu-item-width x-menu-items-alist x-menu-items-per-line x-menu-max-width x-select-enable-clipboard)
- (added *org-babel-use-quick-and-dirty-noweb-expansion* *org-bibtex-entries* *orgtbl-default-fmt* *orgtbl-efmt* *orgtbl-fmt* *orgtbl-hline* *orgtbl-lend* *orgtbl-lfmt* *orgtbl-llend* *orgtbl-llfmt* *orgtbl-llstart* *orgtbl-lstart* *orgtbl-rtn* *orgtbl-sep* *orgtbl-table* 5x5-solver-output Info-history-skip-intermediate-nodes Info-isearch-initial-history Info-isearch-initial-history-list Info-mode-syntax-table Man-name-local-regexp ada-on-ms-windows allout-after-copsp;vip-mode-map vip-startup-file viper-always viper-custom-file-name viper-emacs-state-mode-list viper-insert-state-mode-list viper-major-mode-modifier-list viper-mode viper-new-major-mode-buffer-list viper-saved-non-viper-variables viper-vi-state-mode-list w3m-minor-mode-hook w3m-mode-hook window-combination-limit window-combination-resize window-persistent-parameters window-safe-min-height window-safe-min-width window-sides window-sides-slots window-sides-vertical window-state-put-list xesam-all-fields xesam-debug xesam-fulltext-query xesam-hits-per-page xesam-interface-search xesam-path-search xesam-query-type xesam-service-search xesam-user-query))
- (features
- (removed cl-19 earcon eieio-comp font-setting gdb-ui gnus-audio gnus-move gnus-nocem gnus-soup imap-hash mldrag nndb nnkiboze nnlistserv nnslashdot nnsoup nnultimate nnwarchive nnwfm rnews rnewspost sc tramp-fish tramp-imap x-menu)
- (added allout-widgets cc-guess cconv cfengine3 color cus-theme ede ede/base ede/files ede/speedbar em-alias em-basic em-dirs em-hist em-script em-unix ert ert-x esh-groups esh-mode esh-module eshell filesets gdb-mi gnus-gravatar gnus-html gnus-registry gnus-sync gnutls gravatar gssapi idlw-complete-structtag idlw-shell idlwave idlwave-shell ido image-dired kkc network-stream newst-backend newst-plainview newst-reader newst-ticker newst-treeview newsticker nnregistry notifications ob obp;org-html org-icalendar org-id org-indent org-info org-infojs org-inlinetask org-irc org-jsinfo org-latex org-lparse org-mac-message org-mew org-mhe org-mks org-mobile org-mouse org-odt org-pcomplete org-plot org-protocol org-publish org-remember org-rmail org-special-blocks org-table org-taskjuggler org-timer org-vm org-w3m org-wl org-xoxo package package-x pcase pcvs pcvs-defs plstore ps-bdf quickurl recentf registry remember rtree savehist saveplace server shr shr-color soap-client soap-inspect strokes tabulated-list thumbs timeclock todo-mode tramp-loaddefs tramp-sh type-break url url-cache url-future url-http url-queue vc-dav vip viper)))
- ((24 2)
- (functions
- (removed)
- (added rcirc-split-message))
- (variables
- (removed)
- (added))
- (features
- (removed)
- (added bug-reference misearch multi-isearch)))
- ((24 3)
- (functions
- (removed Buffer-menu-buffer+size Buffer-menu-make-sort-button Buffer-menu-revert-function Buffer-menu-sort-by-column ad-Orig-comment-region ad-Orig-move-overlay ad-Orig-process-filter ad-Orig-set-process-filter ad-Orig-sit-for ad-copy-tree ad-n-p viper-inactivate-input-method viper-inactivate-input-method-action w32-init-info window--display-buffer-1 window--display-buffer-2 window--size-ignore window-point-1 with-connection-property with-file-property xml-parse-fragment xscheme-modeline-initialize zone-hiding-modeline)
- (added Buffer-menu--pretty-file-name Buffer-menu--pretty-name Buffer-menu-info-node-description ange-ftp-ignore-errors-if-non-essential ansi-color--find-face ansi-color-parse-sequence archive-extract-by-file auth-source--aget auth-source--aput auth-source--aput-1 auth-source-backend-list-p auth-source-macos-keychain-create auth-source-macos-keychain-result-append auth-source-macos-keychain-search auth-source-macos-keychain-search-items autoload-do-load autoloadp bbdb-buffer bbdb-create-internal bbdb-gethash bindings--defined-event-sequence-1000 xterm-mouse--read-event-sequence-1006 xterm-mouse-translate-1 xterm-mouse-translate-extended yank-handle-category-property yank-handle-font-lock-face-property zone-hiding-mode-line))
- (variables
- (removed *gensym-counter* *org-bibtex-entries* *random-state* Buffer-menu--buffers Buffer-menu-buffer-column Buffer-menu-short-ellipsis Buffer-menu-sort-button-map Buffer-menu-sort-column Info-next-link-keymap Info-prev-link-keymap Info-up-link-keymap Man-overstrike-face Man-refpages-alist Man-reverse-face Man-sections-alist Man-underline-face activate-menubar-hook apropos-keybinding-face apropos-label-face apropos-property-face apropos-symbol-face autoload-make-program byte-debug-flag bytecomp-load-hook check-markers-debug-flag cl-active-block-names&nbsnout-menu this tramp-default-password-end-of-line unread-command-char url-cookie-two-dot-domains vc-bzr-error-regex-alist vc-bzr-sha1-program vc-checkout-carefully vc-ignore-vc-files vc-master-templates vhdl-93-attributes vhdl-93-enum-values vhdl-93-functions vhdl-93-keywords vhdl-93-packages vhdl-93-types xml-name-regexp)
- (added Buffer-menu-name-width Buffer-menu-size-width Info-file-attributes Man--last-refpage Man--last-section Man--refpages Man--sections Man-ansi-color-map allout-exposure-change-functions allout-structure-added-functions allout-structure-deleted-functions allout-structure-shifted-functions archive-extract-hook async-shell-command-buffer battery--linux-sysfs-regexp byte-compile-root-dir c-parse-state-point c-prepare-bug-report-hook c-state-old-cpp-beg-marker c-state-re-save-font-hook verilog-save-font-mod-hooked verilog-warn-fatal vhdl-02-attributes vhdl-02-enum-values vhdl-02-functions vhdl-02-keywords vhdl-02-packages vhdl-02-types vhdl-ams-constants vhdl-array-index-record-field-in-sensitivity-list vhdl-comment-display-line-char vhdl-compile-absolute-path vhdl-compile-post-command vhdl-constants-regexp vhdl-indent-comment-like-next-code-line vhdl-makefile-default-targets wdired-keep-marker-rename winner-mode-off-hook x-last-selected-text xml-default-ns xml-entity-expansion-limit xml-entity-or-char-ref-re xml-parameter-entity-alist yank-handled-properties))
- (features
- (removed ob-C ob-asymptote ob-awk ob-clojure ob-fortran ob-haskell ob-java ob-latex org-install python-21 reftex-vcr)
- (added cl-lib cl-macs erc-desktop-notifications gnus-notifications gv mm-archive ob-scala org-element org-loaddefs org-version profiler url-domsuf w32-common-fns)))
- ((24 4)
- (functions
- (removed Command-history-setup ad-Orig-copy-region-as-kill ad-Orig-create-file-buffer ad-Orig-dnd-insert-text ad-Orig-dnd-open-file ad-Orig-find-tag ad-Orig-idlwave-shell-electric-debug-mode ad-Orig-newline ad-Orig-org-format-latex-as-mathml ad-Orig-outline-end-of-subtree ad-Orig-rename-buffer ad-Orig-save-place-find-file-hook ad-Orig-server-visit-files ad-Orig-visit-tags-table ad-Orig-yank ad-activate-internal-off ad-advised-definition-p ad-clear-orig-definition ad-handle-definition ad-macro-p ad-make-advised-definitse-p xterm-mouse-event-read)
- (added Buffer-menu--unmark Buffer-menu-multi-occur Info--search-loop Info-build-node-completions-1 Info-next-reference-or-link Info-prev-reference-or-link Man-parse-man-k Man-start-calling Man-update-manpage abbrev--default-expand abbrev--symbol ad--defalias-fset ad--make-advised-docstring ad-Advice-c-backward-sws ad-Advice-c-beginning-of-macro ad-Advice-c-forward-sws ad-Advice-dnd-insert-text ad-Advice-dnd-open-file ad-Advice-find-tag ad-Advice-idlwave-shell-electric-debug-mode ad-Advice-save-place-find-file-hook ad-Advice-server-visit-files ad-Advice-visit-tags-table ad-clear-advicefunname-definition ad-make-advicefunname add-face-text-property add-function advice--add-function advice--buffer-local advice--called-interactively-skip advice--car advice--cd*r advice--cdow-pixel-width window-resizable-p window-resize-apply-total window-resize-no-error window-right-divider-width window-safe-min-pixel-height window-safe-min-pixel-size window-safe-min-pixel-width window-safe-min-size window-screen-lines window-scroll-bar-width window-size window-text-pixel-size window-text-width with-current-buffer-window with-eval-after-load with-isearch-suspended woman-mark-horizontal-position x-focus-frame x-popup-dialog xesam-buffer-name xesam-dbus-call-method xesam-delete-search-engine xesam-get-cached-property xesam-get-hits xesam-get-property xesam-highlight-string xesam-kill-buffer-function xesam-minor-mode xesam-mode xesam-new-search xesam-refresh-entry xesam-refresh-search-buffer xesam-search-engines xesam-set-cached-property xesam-set-property xesam-signal-handler))
- (variables
- (removed *org-babel-use-quick-and-dirty-noweb-expansion* Info-enable-edit ad-activate-on-top-level add-log-c-like-modes add-log-lisp-like-modes add-log-tex-like-modes allout-encryption-text-removal-regexps bookmark-bmenu-header-height bubbles--neighbourhood-score buffer-file-type c-awk-one-line-non-syn-ws*-re c-awk-one-line-possibly-open-regexp-re c-awk-one-line-possibly-open-string-re c-awk-regexp-one-line-possibly-open-char-list-re c-standard-font-lock-fontify-region-function cl-declare-stack cl-not-toplevel cl-optimize-safety cl-optimize-speed cl-proclaim-history cl-proclaims-deferred class-children class-class-allocation-a class-class-allocation-custom class-class-allocation-custom-group class-class-allocation-custom-label class-class-allocation-doc class-class-allocation-printer class-class-allocation-prby-keyword-end-re saved-overriding-map set-mark-default-inactive show-paren-idle-timer show-paren-overlay show-paren-overlay-1 sieve-manage-stream-alist sieve-manage-streams sql-output-by-send thing-at-point-url-regexp tramp-completion-file-name-regexp-url tramp-file-name-regexp-url tramp-message-show-progress-reporter-message universal-argument-num-events vc-diff-knows-L verilog-mode-release-date vhdl-speedbar-key-map whitespace-font-lock whitespace-font-lock-mode xmltok-dependent-regions)
- (added *org-babel-gnuplot-missing* *org-babel-gnuplot-terms* 5x5-mode-abbrev-table 5x5-mode-syntax-table Buffer-menu-mode-hook Edit-options-mode-abbrev-table Edit-options-mode-hook Edit-options-mode-syntax-table Info-edit-mode-abbrev-table Info-edit-mode-map Info-edit-mode-syntax-table Info-file-completions Man-man-k-us;whitespace-newline-mode-hook widget-minor-mode-hook window-resize-pixelwise window-state-put-stale-windows wordstar-mode-abbrev-table wordstar-mode-hook wordstar-mode-syntax-table xesam-count xesam-current xesam-dbus-unique-names xesam-engine xesam-minibuffer-query-history xesam-minibuffer-vendor-history xesam-minor-mode xesam-minor-mode-hook xesam-mode-abbrev-table xesam-mode-hook xesam-mode-map xesam-mode-syntax-table xesam-notify-function xesam-objects xesam-query xesam-refreshing xesam-search xesam-search-engines xesam-to xesam-type xesam-vendor xesam-xml-string xterm-mouse-mode-hook))
- (features
- (removed advice-preload delphi find-gc octave-inf octave-mod org-ascii org-beamer org-docbook org-exp org-exp-blocks org-export-latex org-freemind org-html org-icalendar org-infojs org-jsinfo org-latex org-lparse org-mac-message org-mew org-mks org-odt org-publish org-remember org-special-blocks org-taskjuggler org-vm org-wl org-xoxo)
- (added bat-mode cl-indent cl-loaddefs cus-dep dos-vars eieio-core elec-pair em-tramp erc-list eudcb-bbdb eww filenotify frameset gnus-icalendar gnus-vm inotify nadvice ob-C ob-asymptote ob-awk ob-clojure ob-core ob-fortran ob-haskell ob-io ob-java ob-latex ob-makefile octave opascal org-macro ox ox-ascii ox-beamer ox-html ox-icalendar ox-latex ox-man ox-md ox-odt ox-org ox-publish ox-texinfo pcmpl-x prog-mode smiley subr-x sup-mouse superword tpu-extras tramp-adb xesam)))
- ((24 5)
- (functions
- (removed browse-url-firefox-sentinel cua-repeat-replace-region python-indent-toggle-levels tramp-time-less-p tramp-time-subtract)
- (added c--macroexpand-all c-macro-is-genuine-p delete-selection-repeat-replace-region erc-channel-user-admin erc-channel-user-admin-p erc-channel-user-halfop erc-channel-user-halfop-p erc-channel-user-owner erc-channel-user-owner-p erc-get-user-mode-prefix erc-quit/part-reason-default file-notify--descriptor python-indent--calculate-indentation python-indent--calculate-levels python-indent--previous-level python-info-encoding python-info-encoding-from-cookie python-syntax-closing-paren-p reftex--prepare-syntax-tables todo-revert-buffer))
- (variables
- (removed cua--last-deleted-region-pos cua--last-deleted-region-text cua--repeat-replace-text ispell-hunspell-dictionary-equivs-alist python--use-fake-loc)
- (added delete-selection-save-to-register delsel--replace-text-or-position erc-rename-buffers ispell-dicts-name2locale-equivs-alist mml2015-display-key-image python-shell-unbuffered vc-hg-log-graph))
- (features
- (removed)
- (added cl-extra)))
- ((25 1)
- (functions
- (removed ada-convert-file-name add-to-diary-list american-calendar authors authors-admin-size woman-mapcan would-be-symbol x-selection-owner-p x-valid-simple-selection-p xterm-mouse--read-event-sequence-1000 xterm-mouse--read-event-sequence-1006)
- (added \(setf\ ede-object-keybindings\) \(setf\ ede-object-menu\) \(setf\ ede-object-sourcecode\) \(setf\ gnus-icalendar-event:description\) \(setf\ gnus-icalendar-event:end-time\) \(setf\ gnus-icalendar-event:location\) \(setf\ gnus-icalendar-event:method\) \(setf\ gnus-icalendar-event:opt-participants\) \(setf\ gnus-icalendar-event:organizer\) \(setf\ gnus-icalendar-event:participation-type\) \(setf\ gnus-icalendar-event:recur\) \(setf\ gnus-icalendar-event:req-participants\) \(setf\ gnus-icalendar-event:rsvp\) \(setf\ gnus-icalendar-event:start-time\) \(setf\ gnus-icalendar-event:summary\) \(setf\ gnus-icalendar-evbkit-fit-width xwidget-webkit-get-selection xwidget-webkit-goto-url xwidget-webkit-insert-string xwidget-webkit-last-session xwidget-webkit-mode xwidget-webkit-new-session xwidget-webkit-reload xwidget-webkit-scroll-backward xwidget-webkit-scroll-down xwidget-webkit-scroll-forward xwidget-webkit-scroll-up xwidget-webkit-show-id-element xwidget-webkit-show-id-or-named-element xwidget-webkit-show-named-element zerop--anon-cmacro))
- (variables
- (removed abbreviated-calendar-year all-bahai-calendar-holidays all-christian-calendar-holidays all-hebrew-calendar-holidays all-islamic-calendar-holidays american-calendar-display-form american-date-diary-pattern authors-aliases authors-ambiguous-files authors-coding-system authors-fixed-case authors-fixed-entries authors-ignored-files authors-lber-of-diary-entries octave-begin-keywords octave-else-keywords octave-end-keywords octave-operator-table octave-smie-bnf-table oriental-holidays other-holidays parse-time-digits print-diary-entries-hook ps-mode-auto-indent python-shell-output-syntax-table sexp-diary-entry-symbol shr-inhibit-decoration shr-state solar-holidays table-cell-entered-state tildify-count today-invisible-calendar-hook today-visible-calendar-hook tool-bar-originally-present uniquify-ask-about-buffer-names-p vc-default-init-revision vc-disable-async-diff vc-keep-workfiles vc-mcvs-diff-switches vc-mcvs-global-switches vc-mcvs-header vc-mcvs-register-switches vc-mcvs-use-edit vc-mistrust-permissions vc-stay-local view-calendar-holidays-initially view-diary-entries-initially window-system-initialization-alist x-last-selected-text)
- ast-session-buffer xwidget-webkit-mode-abbrev-table xwidget-webkit-mode-hook xwidget-webkit-mode-map xwidget-webkit-mode-syntax-table))
- (features
- (removed authors gnus-setup vc-mcvs w32-common-fns)
- (added bruce char-fold charscript cl-generic cl-preloaded cl-seq cp51932 cursor-sensor dom ede/detect eieio-compat elisp-mode eucjp-ms generator gnus-cloud inline let-alist map nsm obarray pinentry project sasl-scram-rfc sasl-scram-sha-1 seq thunk url-tramp vc-filewise vc-src xref xwidget)))
- ((25 2)
- (functions
- (removed electric--insertable-p)
- (added term--xterm-paste tex-handle-newline))
- (variables
- (removed)
- (added inhibit-compacting-font-caches))
- (features
- (removed)
- (added)))
- ((25 3)
- (functions
- (removed)
- (added))
- (variables
- (removed)
- (added))
- (features
- (removed)
- (added)))
- ((26 1)
- (functions
- (removed 8859-1-map 8859-to-swascii-buffer Buffer-menu-info-node-description Man-quit ad-Advice-find-tag auto-source--symbol-keyword autoload-ensure-default-file c-clear-cpp-delimiters c-comment-out-cpps c-neutralize-syntax-in-and-mark-CPP c-set-cpp-delimiters c-state-semi-safe-place c-uncomment-out-cpps c-with-all-but-one-cpps-commented-out c-with-cpps-commented-out check-declare-errmsg cl-struct-avl-tree- cl-struct-avl-tree--node cl-struct-avl-tree--stack cl-struct-cl--class cl-struct-cl--generic cl-struct-cl--generic-generalizer cl-struct-cl--generic-method cl-struct-cl-slot-descriptor cl-struct-cl-structure-class cl-struct-cl-structure-object cl-struct-compilation--message cl-struct-cvs-fileinfo cl-struct-cvs-flags cl-struct-cvs-qtypedesc p-set-auto-save-file-modes tramp-sh-handle-dired-recursive-delete-directory tramp-sh-handle-insert-file-contents-literally tramp-user-error undo-auto--undoable-change-no-timer url-cookie-quit verilog-save-font-mods verilog-save-no-change-functions whitespace-ensure-local-variables window--major-non-side-window window--major-side-window window--side-check window--side-window-p window-dot woman-pop woman-push xmltok-forward-special xwidget-webkit-execute-script-rv y-or-n-minibuffer)
- (added Buffer-menu-unmark-all Buffer-menu-unmark-all-buffers Info-node-description ad-Advice-exchange-point-and-mark ad-Advice-pop-global-mark ad-Advice-pop-to-mark-command ad-Advice-xref-find-definitions add-variable-watcher advice--where all-threads allout-count-trailing-whitespace-region allout-nullify-prefix-data allout-produce-moel-width-before-size-change window-swap-states window-toggle-side-windows with-connection-local-profiles with-mutex xdg--dir-home xdg--substitute-home-env xdg--user-dirs-parse-file xdg--user-dirs-parse-line xdg-cache-home xdg-config-dirs xdg-config-home xdg-data-dirs xdg-data-home xdg-desktop-read-file xdg-desktop-read-group xdg-desktop-strings xdg-runtime-dir xdg-thumb-mtime xdg-thumb-name xdg-thumb-uri xdg-user-dir xref--regexp-syntax-dependent-p xref-quit-and-goto-xref xwidget-webkit-adjust-size-in-frame xwidget-webkit-auto-adjust-size xwidget-webkit-scroll-bottom xwidget-webkit-scroll-top xwidget-webkit-show-element xwidget-webkit-zoom-in xwidget-webkit-zoom-out))
- (variables
- (removed *orgtbl-default-fmt* *orgtbl-efmt* *orgtbl-fmt* *orgtbl-hline* *ange-functions woman-justify-list xref--window)
- (added Buffer-menu-del-char Buffer-menu-marker-char Man-coding-system align-regexp-history ansi-color-control-seq-regexp arabic-shape-log arabic-shaper-ZWNJ-handling async-shell-command-display-buffer attempt-orderly-shutdown-on-fatal-signal attempt-stack-overflow-recovery auth-source-backend-parser-functions auth-source-pass-backend auto-save--timer auto-save-visited-interval auto-save-visited-mode auto-save-visited-mode-hook autoload--non-timestamp autoload-compute-prefixes autoload-def-prefixes-max-entries autoload-def-prefixes-max-length autoload-timestamps battery-linux-sysfs-regexp battery-upower-device bidi-paragraph-separate-re bidi-paragraph-start-re bookmark-file-coding-system browse-url-man-function byte-compile-cond-use-jump-table byte-compile-jump-tabc-hg-use-file-version-for-mode-line-version vc-revision-history verilog-auto-inst-param-value-type verilog-auto-wire-comment verilog-default-clocking-re verilog-diff-ignore-regexp verilog-font-lock-grouping-keywords-face viper--advice-list viper--undo-change-group-handle wdired-create-parent-directories while-no-input-ignore-events window--sides-inhibit-check window--sides-shown window-sides-reversed woman-justify-styles woman-mode-abbrev-table woman-mode-hook woman-mode-syntax-table xdg-desktop-entry-regexp xdg-desktop-group-regexp xdg-line-regexp xdg-user-dirs xref--original-window xref--original-window-intent))
- (features
- (removed awk-mode gnus-ems gnus-sync iso-acc iso-insert iso-swed messcompat mh-acros nxml-glyph nxml-uchnm ob-scala ob-sh pinentry resume scribe spell swedish sym-comp tramp-gw)
- (added auth-source-pass charprop cl-print composite dired-loaddefs display-line-numbers eieio-loaddefs flymake-proc gnus-rfc1843 htmlfontify-loaddefs ibuffer-loaddefs isearch less-css-mode mhtml-mode ob-J ob-abc ob-coq ob-ebnf ob-forth ob-groovy ob-hledger ob-lua ob-processing ob-sed ob-shell ob-stan ob-vala org-duration org-eww org-lint pixel-scroll ps-print-loaddefs puny radix-tree reftex-loaddefs replace rmail-loaddefs rmc svg term/tty-colors text-mode timer-list xdg)))
- ((26 2)
- (functions
- (removed dired--yes-no-all-quit-help shadow-get-user shadow-make-cluster shadow-parse-fullname)
- (added assoc-delete-all calc-graph-w32-p copy-shadow-cluster ibuffer-do-toggle-lock make-shadow-cluster make-shadow-cluster--cmacro package--user-installed-p read-answer shadow-cluster-name--cmacro shadow-cluster-p shadow-cluster-p--cmacro shadow-cluster-primary--cmacro shadow-cluster-regexp--cmacro shadow-name-site shadow-site-name soap-type-of term--bash-needs-EMACSp term-watch-for-password-prompt thread-live-p))
- (variables
- (removed dired-delete-help last--line-number-width prolog-hungry-delete-key-flag)
- (added byte-compile--default-val cl-print--depth cl-struct-shadow-cluster-tags ido-fallback read-answer-map--memoize read-answer-short term--bash-needs-EMACS-status xft-ignore-color-fonts))
- (features
- (removed)
- (added threads)))
- ((26 3)
- (functions
- (removed gnus-summary-sort-by-mark)
- (added dir-locals--get-sort-score dir-locals--sort-variables gnus-summary-sort-by-marks package--buffer-string package--cs))
- (variables
- (removed)
- (added help-enable-completion-auto-load))
- (features
- (removed)
- (added)))
- ((27 1)
- (functions
- (removed Edit-options-mode Edit-options-modify Edit-options-nil Edit-options-set Edit-options-t Edit-options-toggle Footnote-add-footnote Footnote-assoc-index Footnote-back-to-message Footnote-current-regexp Footnote-cycle-style Footnote-delete-footnote Footnote-english-lower Footnote-english-upper Footnote-goto-char-point-max Footnote-goto-footnote Footnote-index-to-string Footnote-insert-footnote Footnote-insert-numbered-footnote Footnote-insert-pointer-marker Footnote-insert-text-marker Footnote-latin Footnote-make-hole Footnote-narrow-to-footnotes Footnote-numeric Footnote-refresh-footnotes Footnote-renumber Footnote-renumber-footnotes Footnote-roman-common Footnote-roman-lower Footnote-roman-upper Footnote-set-style Fxesam-highlight-string xesam-kill-buffer-function xesam-minor-mode xesam-mode xesam-new-search xesam-refresh-entry xesam-refresh-search-buffer xesam-search xesam-search-engines xesam-set-cached-property xesam-set-property xesam-signal-handler xref--find-buffer-visiting xref--pop-to-location)
- (added \(setf\ jsonrpc--deferred-actions\) \(setf\ jsonrpc--events-buffer\) \(setf\ jsonrpc--events-buffer-scrollback-size\) \(setf\ jsonrpc--expected-bytes\) \(setf\ jsonrpc--next-request-id\) \(setf\ jsonrpc--notification-dispatcher\) \(setf\ jsonrpc--on-shutdown\) \(setf\ jsonrpc--process\) \(setf\ jsonrpc--request-continuations\) \(setf\ jsonrpc--request-dispatcher\) \(setf\ jsonrpc-last-error\) \(setf\ jsonrpc-name\) Info-history-back-menu Info-history-forward-menu Info-histps xdg-mime-apps-files xdg-mime-collect-associations xml-remove-comments xref--create-fetcher xref--display-buffer-in-other-window xref--display-buffer-in-window xref--find-file-buffer xref--imenu-extract-index-name xref--imenu-prev-index-position xref--not-found-error xref--push-markers xref--show-common-initialize xref--show-defs xref--show-defs-buffer xref--show-defs-buffer-at-bottom xref--transient-buffer-mode xref-backend-identifier-completion-ignore-case xref-find-definitions-at-mouse xref-matches-in-directory xref-matches-in-files xref-pop-to-location xref-references-in-directory xref-revert-buffer xref-set-marker-ring-length y-or-n-p-insert-n y-or-n-p-insert-other y-or-n-p-insert-y))
- (variables
- (removed * ** *** *1 *2 *3 Edit-options-mode-abbrev-tasp;xesam-search-engines xesam-service-search xesam-to xesam-type xesam-user-query xesam-vendor xesam-xml-string xref--last-visiting-buffer)
- (added Man--window-state-change-timer Man-columns Man-width-max add-log-dont-create-changelog-file after-delete-frame-functions after-focus-change-function after-set-visited-file-name-hook amalgamating-undo-limit apropos--current async-shell-command-width auth-source--session-nonce auth-source-pass-filename auth-source-pass-port-separator authinfo-hidden authinfo-mode-abbrev-table authinfo-mode-hook authinfo-mode-map authinfo-mode-syntax-table auto-raise-tab-bar-buttons auto-resize-tab-bars auto-revert--buffers-by-watch-descriptor auto-revert--global-mode auto-revert--lockout-interval auto-revert--lockout-timer auto-revert-avoid-polling auto-revert-debug autoonf-service-type-browser-handler-running))
- (features
- (removed ada-mode ada-prj ada-stmt ada-xref ob-keys options org-bbdb org-bibtex org-docview org-eshell org-eww org-gnus org-info org-irc org-mhe org-rmail org-w3m xesam)
- (added backtrace display-fill-column-indicator erc-loaddefs exif faceup fileloop flymake-cc image-converter info-edit iso8601 jsonrpc ob-eshell ol ol-bbdb ol-bibtex ol-docview ol-eshell ol-eww ol-gnus ol-info ol-irc ol-mhe ol-rmail ol-w3m org-attach-git org-goto org-keys org-num org-tempo pinyin so-long tab-bar tab-line text-property-search thread tramp-archive tramp-gvfs tramp-integration tramp-rclone tramp-sudoedit)))
- ((27 2)
- (functions
- (removed org--property-global-value org--setup-collect-keywords org-attach-expand-link org-attach-export-link org-attach-open-link org-attach-store-link org-babel-clojure-cider-current-ns org-babel-clojure-initiate-session org-babel-clojure-var-to-clojure org-babel-prep-session:clojure org-babel-variable-assignments:clojure org-columns-set-tags-or-toggle org-encrypt-string)
- (added backtrace--to-string dbus-get-other-registered-property dbus-get-this-registered-property debug-help-follow debugger-insert-backtrace debugger-toggle-locals fit-frame-to-buffer-1 fit-mini-frame-to-buffer ob-clojure-eval-with-cider ob-clojure-eval-with-inf-clojure ob-clojure-evaable-header-set-header org-table-row-get-visible-string org-toggle-radio-button org-up-heading-or-point-min tramp-adb-get-signal-strings tramp-get-remote-awk tramp-get-remote-busybox tramp-get-remote-hexdump tramp-get-remote-od tramp-sh-get-signal-strings tramp-unquote-file-local-name))
- (variables
- (removed org-babel-clojure-sync-nrepl-timeout org-dcst org-export-special-keywords org-f org-file-properties org-hide-leading-stars-before-indent-mode org-l org-m org-remove-priority-next-time tramp-awk-coding-test)
- (added c-recognize-bare-brace-inits finder-buffer org-agenda-filter-hook org-agenda-loop-over-headlines-in-active-region org-agenda-sort-noeffort-is-high org-agenda-sort-notime-is-late org-archive-subtree-save-file-p org-babel-defaultw-config org-startup-numerated org-table-header-line-mode org-table-header-line-mode-hook org-table-header-line-p org-table-header-overlay org-ts--internal-regexp tramp-compat-emacs-compiled-version tramp-gvfs-unload-hook tramp-hexdump-awk-encode tramp-hexdump-encode tramp-od-awk-encode tramp-od-encode tramp-smb-options tramp-system-name))
- (features
- (removed)
- (added org-refile)))
- ((28 1)
- (functions
- (removed Math-natnum-lessp add-menu add-menu-item add-menu-item-1 advertised-xscheme-send-previous-expression allocate-event allout-init allout-run-unit-tests allout-setup-menubar allout-test-range-overlaps allout-test-resumptionuffer-location-list-p xref-etags-location xref-etags-location--anon-cmacro xref-etags-location--eieio-childp xref-etags-location-child-p xref-etags-location-list-p xref-file-location xref-file-location--anon-cmacro xref-file-location--eieio-childp xref-file-location-child-p xref-file-location-list-p xref-item xref-item--anon-cmacro xref-item--eieio-childp xref-item-child-p xref-item-list-p xref-location xref-location--anon-cmacro xref-location--eieio-childp xref-location-child-p xref-location-list-p xref-location-p xref-match-item xref-match-item--anon-cmacro xref-match-item--eieio-childp xref-match-item-child-p xref-match-item-list-p)
- (added \(setf\ xref-item-location\) \(setf\ xref-item-summary\) \(setf\ xref-match-item-length\) \(setf\ xref-match-item-location\) \(setf\ xref-match-it;xref-make-etags-apropos-location--cmacro xref-make-etags-location--cmacro xref-make-file-location--cmacro xref-match-item-length xref-match-item-location xref-match-item-summary xref-next-group xref-next-line-no-show xref-prev-group xref-prev-line-no-show xref-quit-and-pop-marker-stack xref-select-and-show-xref xref-show-definitions-buffer xref-show-definitions-buffer-at-bottom xref-show-definitions-completing-read xterm-mouse--handle-mouse-movement xwidget-webkit-clone-and-split-below xwidget-webkit-clone-and-split-right xwidget-webkit-forward xwidget-webkit-save-as-file xwidget-webkit-scroll-down-line xwidget-webkit-scroll-up-line xwidget-window-inside-pixel-height xwidget-window-inside-pixel-width yank-from-kill-ring))
- (variables
- (removed GOLD-map add-menu-item-count allout-run-unit-tesxref-item xref-location xref-match-item)
- (added Buffer-menu-mode-menu Info--current-index-alternative Info-warn-on-index-alternatives-wrap Man-ansi-color-basic-faces-vector abbrev--suggest-saved-recommendations abbrev-suggest abbrev-suggest-hint-threshold ansi-color-basic-faces-vector ansi-color-bold-is-bright ansi-color-bright-colors-vector ansi-color-for-compilation-mode ansi-color-normal-colors-vector archive-alternate-hidden-columns archive-hidden-columns archive-squashfs-extract asm-mode-menu authinfo--keywords authinfo-hide-elements auto-composition-emoji-eligible-codepoints auto-revert--buffer-by-watch-descriptor backtrace-on-error-noninteractive battery--upower-signals battery-upower-device-interface battery-upower-device-path battery-upower-interface battery-upower-path battery-upower-service battery-upowerult-keybindings windmove-mode windmove-mode-hook windmove-mode-map windmove-swap-states-default-keybindings word-wrap-by-category world-clock--timer world-clock-buffer-name world-clock-list world-clock-mode-abbrev-table world-clock-mode-hook world-clock-mode-map world-clock-mode-syntax-table world-clock-time-format world-clock-timer-enable world-clock-timer-second xml-invalid-characters-re xref-after-update-hook xref-auto-jump-to-first-definition xref-auto-jump-to-first-xref xref-search-program xref-search-program-alist xref-truncation-width xwidget-webkit-bookmark-jump-new-session xwidget-webkit-download-dir y-or-n-p-use-read-key yank-from-kill-ring-rotate))
- (features
- (removed ledit levents lmenu lucid ob-J ob-abc ob-asymptote ob-coq ob-ebnf ob-hledger ob-io ob-ledger ob-mscgen ob-picolisp ob-shen ob-stan ob-vala)
- (added cl-font-lock comp comp-cstr dictionary dictionary-connection dynamic-setting emoji-zwj erc-status-sidebar etc-authors-mode eudcb-macos-contacts gnus-dbus gnus-search hierarchy kinsoku memory-report nnselect ob-julia oc oc-basic oc-biblatex oc-csl oc-natbib ol-doi ol-man org-link-doi ox-koma-letter rfc6068 sasl-scram-sha256 shortdoc texinfo-loaddefs tramp-crypt tramp-fuse tramp-sshfs transient window)))
- ((28 2)
- (functions
- (removed kdb-macro-redisplay)
- (added describe-function--helper describe-key--helper desktop--on-kill gdb-breakpoints--add-breakpoint-row kmacro-redisplay org-file-has-changed-p org-replace-buffer-contents tramp-adb-tolerate-tilde tramp-fuse-remove-hidden-files tramp-get-remote-dev-tty tramp-scp-force-scp-protocol tramp-sshfs-handle-file-writable-p tramp-sshfs-handle-set-file-times tramp-sshfs-tolerate-tilde))
- (variables
- (removed)
- (added org-cite-basic--file-id-cache org-file-has-changed-p--hash-table tramp-adb-unload-hook tramp-fuse-remove-hidden-files tramp-lock-pid tramp-scp-force-scp-protocol tramp-sshfs-unload-hook tramp-tolerate-tilde))
- (features
- (removed)
- (added)))
- ((29 1)
- (functions
- (removed Electric-buffer-menu-mode PC-bindings PC-chop-word PC-chunk-after PC-complete PC-complete-and-exit PC-complete-as-file-name PC-complete-space PC-complete-word PC-completion-help PC-do-complete-and-exit PC-do-completion PC-force-complete-and-exit PC-include-file-all-completions PC-include-file-path PC-lisp-complete-symbol PC-look-for-include-file PC-read-file-name-internal PC-temp-minibuffer-message PC-try-completion PC-was-meta-key ad-Advice-dnd-insert-text ad-Advice-dnd-open-file ad-Advice-exchange-point-and-mark ad-Advice-pop-global-mark ad-Advice-pop-to-mark-command ad-Advice-save-place-find-file-hook ad-Advice-server-visit-files ad-Advice-visit-tags-table ad-Advice-xref-find-definitions add-custom-printer adelete advice--make-1 aelecs with-js x-dnd-get-drop-width-height x-dnd-get-drop-x-y x-selection)
- (added \(setf\ eglot--capabilities\) \(setf\ eglot--file-watches\) \(setf\ eglot--inferior-process\) \(setf\ eglot--inhibit-autoreconnect\) \(setf\ eglot--language-id\) \(setf\ eglot--major-modes\) \(setf\ eglot--managed-buffers\) \(setf\ eglot--progress-reporters\) \(setf\ eglot--project\) \(setf\ eglot--project-nickname\) \(setf\ eglot--saved-initargs\) \(setf\ eglot--server-info\) \(setf\ eglot--shutdown-requested\) \(setf\ kmacro--counter\) \(setf\ vtable-actions\) \(setf\ vtable-column-colors\) \(setf\ vtable-columns\) \(setf\ vtable-displayer\) \(setf\ vtable-divider\) \(setf\ vtable-ellipsis\) \(setf\ vtable-face\) \(setf\ vtable-formatter\) \(seebkit-import-widget xwidget-webkit-isearch--update xwidget-webkit-isearch-backward xwidget-webkit-isearch-erasing-char xwidget-webkit-isearch-exit xwidget-webkit-isearch-forward xwidget-webkit-isearch-mode xwidget-webkit-isearch-printing-char xwidget-webkit-isearch-printing-char-with-input-method xwidget-webkit-isearch-with-input-method xwidget-webkit-isearch-yank-kill xwidget-webkit-pass-command-event xwidget-webkit-pass-command-event-with-input-method xwidget-webkit-stop yaml-ts-mode yank-in-context yank-in-context--transform yank-media yank-media--find-matching-media yank-media--get-selection yank-media--utf-16-p yank-media-handler yank-media-types yank-media-types--format))
- (variables
- (removed Buffer-menu-buffer+size-width Info-edit-map PC-completion-as-file-name-predicate PC-default-bies-buffer todo-top-priorities-overrides todo-undo-item-omit-comment todo-use-only-highlighted-region todo-visited todo-wrap-lines todo-y-with-space tooltip-use-echo-area tramp-completion-file-name-regexp-alist tramp-completion-file-name-regexp-default tramp-completion-file-name-regexp-separate tramp-completion-file-name-regexp-simplified tramp-file-missing transient--source-buffer try-complete-erc-nick-window-configuration unify-8859-on-decoding-mode unify-8859-on-decoding-mode-hook unify-8859-on-encoding-mode unify-8859-on-encoding-mode-hook vc-arch-command view-remove-frame-by-deleting view-return-to-alist whitespace-font-lock-refontify window-system-version winner-mode-leave-hook xref--marker-ring)
- (added Buffer-menu-buffer-list Buffer-menu-filter-predicate Info-minibuf-history advice--how-alist after-pdump-load-is-reverse xwidget-webkit-isearch--read-string-buffer xwidget-webkit-isearch--string xwidget-webkit-isearch-mode xwidget-webkit-isearch-mode-hook xwidget-webkit-isearch-mode-map xwidget-webkit-tool-bar-map yaml-ts-mode--font-lock-settings yaml-ts-mode--syntax-table yaml-ts-mode-abbrev-table yaml-ts-mode-hook yaml-ts-mode-map yank-media--registered-handlers yank-menu-max-items yank-transform-functions))
- (features
- (removed abbrevlist assoc complete cust-print eieio-loaddefs erc-hecomplete etc-authors-mode fast-lock hol-loaddefs htmlfontify-loaddefs lazy-lock mailpost mouse-sel pc-mode pc-select rmail-loaddefs s-region sregex)
- (added ansi-osc bind-key c-ts-common c-ts-mode cmake-ts-mode csharp;sqlite-mode string-edit tai-viet-util textsec textsec-check theme-loaddefs toml-ts-mode tramp-container treesit typescript-ts-mode uni-confusable uni-scripts use-package use-package-bind-key use-package-core use-package-delight use-package-diminish use-package-ensure use-package-ensure-system-package use-package-jump use-package-lint vtable wallpaper word-wrap-mode yaml-ts-mode yank-media)))
- ((29 2)
- (functions
- (removed face-remap--copy-face internal--unlabel-restriction js--treesit-property-not-function-p js-jsx--treesit-font-lock-compatibility-bb1f97b python--treesit-fontify-string-interpolation ruby-ts--parser-after-change tramp-docker--completion-function transient--ensure-infix-command transient--suffix-command transient--suffix-symbol)
- (added c-ts-mode--else-heuristic c-ts-mode--emacs-defun-body-p c-ts-mode--first-sibling custom-icon-action custom-icon-mark-to-reset-standard custom-icon-mark-to-save custom-icon-reset-saved custom-icon-reset-standard custom-icon-save custom-icon-state-set-and-redraw emacs-lisp-native-compile internal--labeled-widen js-ts--syntax-propertize org-babel--variable-assignments:fish python--treesit-fontify-dotted-decorator python--treesit-fontify-union-types python--treesit-fontify-union-types-strict python--treesit-syntax-propertize rust-ts-mode--comment-docstring tramp-action-otp-password tramp-compat-length< tramp-compat-length= tramp-compat-length> tramp-completion-handle-expand-file-name tramp-completion-handle-file-exists-p tramp-completion-handle-file-name-directory tramp-completion-handle-file-name-nondirectory tramp-container--completion-function tramp-crypt-handle-file-exists-p tramp-fuse-handle-file-exists-p tramp-skeleton-file-exists-p tramp-skeleton-file-name-all-completions tramp-ssh-option-exists-p tramp-string-empty-or-nil-p transient--wrap-command-29 transient--wrap-command-30 treesit--pre-redisplay treesit--pre-syntax-ppss treesit--syntax-propertize-notifier tsx-ts--syntax-propertize tsx-ts--syntax-propertize-captures typescript-ts--syntax-propertize))
- (variables
- (removed tramp-device-escape-sequence-regexp tramp-display-escape-sequence-regexp)
- (added custom-icon-extended-menu js-ts--s-p-query python--treesit-builtin-types python--treesit-type-regex tramp-otp-password-prompt-regexp tramp-show-ad-hoc-proxies treesit--pre-redisplay-tick treesit--syntax-propertize-start tsx-ts--s-p-query typescript-ts--s-p-query))
- (features
- (removed)
- (added c++-ts-mode)))
- ((29 3)
- (functions
- (removed cmake-ts-mode--imenu cmake-ts-mode--imenu-1 dockerfile-ts-mode--imenu dockerfile-ts-mode--imenu-1)
- (added cmake-ts-mode--function-name dockerfile-ts-mode--stage-name js--treesit-font-lock-compatibility-definition-feature tramp-crypt-cleanup-connection tsx-ts-mode--font-lock-compatibility-function-expression))
- (variables
- (removed)
- (added org--latex-preview-when-risky tramp-pipe-stty-settings tramp-security-key-pin-regexp untrusted-content))
- (features
- (removed)
- (added)))
- ((29 4)
- (functions
- (removed)
- (added go-ts-mode--method-elem-supported-p))
- (variables
- (removed)
- (added))
- (features
- (removed)
- (added)))
- ((30 1)
- (functions
- (removed \(setf\ egloredicate-for transient--prefix-color transient--semantic-coloring-p transient--suffix-color transient--wrap-command-29 transient--wrap-command-30 transient-plist-to-alist transient-popup-navigation-help treesit--font-lock-notifier treesit--navigate-thing treesit--syntax-propertize-notifier treesit--thing-unpack-pattern treesit--things-around treesit--top-level-thing uniquify-item-original-dirname uniquify-item-original-dirname--cmacro url-future-cancelled-p--inliner vc-cvs-parse-uhp vc-deduce-fileset-1)
- (added \(setf\ built-in-class-docstring\) \(setf\ built-in-class-index-table\) \(setf\ built-in-class-name\) \(setf\ built-in-class-parents\) \(setf\ built-in-class-slots\) \(setf\ eglot--languages\) \(setf\ jsonrpc--continuations\) \(setf\ jsonrpc--sync-request-alist\) Buffer-menu--selectionhift-select-p window-tool-bar--get-keymap window-tool-bar--ignore window-tool-bar--insert-memory-use window-tool-bar--keymap-entry-to-string window-tool-bar--last-command-triggers-refresh-p window-tool-bar--make-keymap-1 window-tool-bar--memory-use-avg-step1 window-tool-bar--memory-use-avg-step2 window-tool-bar--static-if window-tool-bar--turn-on window-tool-bar--use-images window-tool-bar-debug-show-memory-use window-tool-bar-mode window-tool-bar-mode-set-explicitly window-tool-bar-string with--track-changes with-peg-rules with-tramp-debug-message with-tramp-suspended-timers with-tramp-timeout without-remote-files xref--revert-buffer xref-revert-buffer-restore-point yaml-ts-mode--fill-paragraph))
- (variables
- (removed advice--buffer-local-function-sample apropos-item bs--window-config-comingbsp;verilog-declaration-re-1-no-macro verilog-declaration-re-2-macro verilog-declaration-re-2-no-macro verilog-symbol-re)
- (added Buffer-menu-group-by Buffer-menu-group-sort-by Buffer-menu-show-internal Custom-dirlocals-menu Info--dont-hide-references Info-url-alist Man-prefer-synchronous-call Man-support-remote-systems ambiguous-width-chars android-fonts-enumerated async-shell-command-mode auto-coding-file-name blink-matching-paren-highlight-offscreen bounds-of-thing-at-point-provider-alist browse-url-android-share bs-default-action-list buffer-match-p--past-warnings byte-compile--docstrings bytecomp--inhibit-lexical-cookie-warning c-block-stmt-with-key c-escaped-newline-takes-precedence c-generic-key c-negation-op-re c-paren-clause-key c-ts-mode--feature-list c-ts-mode--thing-settings c-warn-ids-with-dollar cade whitespace-mode-set-explicitly widget-skip-inactive window-point-context-set-function window-point-context-use-function window-restore-killed-buffer-windows window-state-put-kept-windows window-state-put-selected-window window-tool-bar--allow-images window-tool-bar--button-keymap window-tool-bar--graphical-separator window-tool-bar--ignored-event-types window-tool-bar--memory-use-delta-step1 window-tool-bar--memory-use-delta-step2 window-tool-bar--refresh-done-count window-tool-bar--refresh-skipped-count window-tool-bar-mode window-tool-bar-mode-hook window-tool-bar-mode-major-mode window-tool-bar-mode-set-explicitly window-tool-bar-string--cache xref--hits-file-prefix xref-mode-line-matches xref-num-matches-face xref-num-matches-found yes-or-no-prompt))
- (features
- (removed esh-groups legacy-gnus-agent)
- (added comp-common comp-run compat completion-preview editorconfig editorconfig-conf-mode editorconfig-core editorconfig-core-handle editorconfig-fnmatch editorconfig-tools elixir-ts-mode erc-nicks ert-font-lock esh-module-loaddefs etags-regen heex-ts-mode html-ts-mode indent-aux lua-ts-mode nnatom nnfeed org-element-ast peg php-ts-mode touch-screen track-changes tramp-androidsu tramp-message visual-wrap which-key window-tool-bar))))
-
-;; Local Variables:
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; End:
+++ /dev/null
-;;; package-lint-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*-
-;; Generated by the `loaddefs-generate' function.
-
-;; This file is part of GNU Emacs.
-
-;;; Code:
-
-(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path)))
-
-
-\f
-;;; Generated autoloads from package-lint.el
-
-(autoload 'package-lint-describe-symbol-history "package-lint" "\
-Show the version history of SYM, if any.
-
-(fn SYM)" t)
-(autoload 'package-lint-buffer "package-lint" "\
-Get linter errors and warnings for BUFFER.
-
-Returns a list, each element of which is list of
-
- (LINE COL TYPE MESSAGE)
-
-where TYPE is either `warning' or `error'.
-
-Current buffer is used if none is specified.
-
-(fn &optional BUFFER)")
-(autoload 'package-lint-current-buffer "package-lint" "\
-Display lint errors and warnings for the current buffer." t)
-(autoload 'package-lint-batch-and-exit "package-lint" "\
-Run `package-lint-buffer' on the files remaining on the command line.
-Use this only with -batch, it won't work interactively.
-
-When done, exit Emacs with status 1 in case of any errors, otherwise exit
-with status 0. The variable `package-lint-batch-fail-on-warnings' controls
-whether or not warnings alone produce a non-zero exit code.")
-(autoload 'package-lint-looks-like-a-package-p "package-lint" "\
-Return non-nil if the current buffer appears to be intended as a package.")
-(register-definition-prefixes "package-lint" '("package-lint-"))
-\f
-;;; End of scraped data
-
-(provide 'package-lint-autoloads)
-
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; no-native-compile: t
-;; coding: utf-8-emacs-unix
-;; End:
-
-;;; package-lint-autoloads.el ends here
+++ /dev/null
-;; -*- no-byte-compile: t; lexical-binding: nil -*-
-(define-package "package-lint" "20250418.1425"
- "A linting library for elisp package authors."
- '((emacs "24.4")
- (let-alist "1.0.6"))
- :url "https://github.com/purcell/package-lint"
- :commit "2dc48e5fb9c37390d9290d4f5ab371c39b7a3829"
- :revdesc "2dc48e5fb9c3"
- :keywords '("lisp")
- :authors '(("Steve Purcell" . "steveNOSPAMsanityinc.com")
- ("Fanael Linithien" . "fanael4NOSPAMgmail.com"))
- :maintainers '(("Steve Purcell" . "steveNOSPAMsanityinc.com")
- ("Fanael Linithien" . "fanael4NOSPAMgmail.com")))
+++ /dev/null
-;;; package-lint.el --- A linting library for elisp package authors -*- lexical-binding: t -*-
-
-;; Copyright (C) 2014-2020 Steve Purcell, Fanael Linithien
-
-;; Author: Steve Purcell <steveNOSPAMsanityinc.com>
-;; Fanael Linithien <fanael4NOSPAMgmail.com>
-;; URL: https://github.com/purcell/package-lint
-;; Keywords: lisp
-;; Package-Version: 20250418.1425
-;; Package-Revision: 2dc48e5fb9c3
-;; Package-Requires: ((emacs "24.4") (let-alist "1.0.6"))
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Provides a list of issues with the package metadata of a file,
-;; e.g. the package dependencies it requires.
-
-;; See function `package-lint-buffer'.
-
-;; Checks will currently be enabled only if a "Package-Requires:" or
-;; "Package-Version:" header is present in the file.
-
-;;; Code:
-
-(eval-when-compile (require 'pcase)) ; `pcase-dolist' is not autoloaded
-(require 'cl-lib)
-(require 'package)
-(require 'lisp-mnt)
-(require 'finder)
-(require 'imenu)
-(require 'let-alist)
-(require 'rx)
-
-
-(defvar package-lint-main-file nil
- "For multi-file packages, set this to the main .el or -pkg.el file.
-
-When set, the package prefix and dependencies are obtained from
-that file instead of the buffer being linted. This allows
-package-lint to operate on secondary files in a package.
-
-The path can be absolute or relative to that of the linted file.")
-(put 'package-lint-main-file 'safe-local-variable #'stringp)
-
-\f
-;;; Compatibility
-
-(defalias 'package-lint--package-desc-summary
- (if (fboundp 'package-desc-summary)
- 'package-desc-summary
- 'package-desc-doc))
-
-(defalias 'package-lint--package-desc-name
- (if (fboundp 'package-desc-name)
- 'package-desc-name
- (lambda (desc) (intern (elt desc 0)))))
-
-(defalias 'package-lint--package-desc-from-define
- (if (fboundp 'package-desc-from-define)
- 'package-desc-from-define
- (lambda (_name-string version-string &optional docstring requirements &rest _args)
- (vector
- (version-to-list version-string)
- (mapcar
- (lambda (x)
- (list (nth 0 x) (version-to-list (nth 1 x))))
- (nth 1 requirements))
- docstring))))
-
-\f
-;;; Machinery
-
-(defvar package-lint--errors nil
- "List of errors and warnings for the current buffer.
-This is bound dynamically while the checks run.")
-
-(defconst package-lint-emacs-head-version '(31)
- "Version of Emacs HEAD.")
-
-(defconst package-lint-backport-libraries
- (list (list 'cl-lib "\\`cl-")
- (list 'cl-generic "\\`cl-\\(?:def\\)?generic")
- (list 'cl-print "\\`cl-print")
- (list 'compat "\\`compat-'")
- (list 'jsonrpc "\\`jsonrpc-")
- (list 'map "\\`map-")
- (list 'nadvice "\\`advice-")
- (list 'ol "\\`org-link-" 'org "9.3")
- (list 'seq "\\`seq-")
- (list 'transient "\\`transient-")
- (list 'hierarchy "\\`hierarchy-")
- (list 'let-alist "\\`let-alist"))
- "A sequence of (FEATURE SYMBOL-NAME-MATCH) for backport libraries.
-These are libraries that are built into newer Emacsen and also
-published in ELPA for use by older Emacsen.
-
-Alternatively, items can take a form of (FEATURE
-SYMBOL-NAME-MATCH PACKAGE VERSION?) where PACKAGE is the name of
-a backport library shipping the feature and VERSION is an
-optional minimum version containing the feature.")
-
-(defun package-lint--load-data (file)
- "Load sexp data from FILE."
- (with-temp-buffer
- (insert-file-contents
- (expand-file-name file
- (if load-file-name
- (file-name-directory load-file-name)
- default-directory)))
- (read (current-buffer))))
-
-(defconst package-lint-symbol-info
- (let* ((stdlib-changes (package-lint--load-data "data/stdlib-changes"))
- (info (make-hash-table)))
- (pcase-dolist (`(,version . ,data) stdlib-changes)
- (pcase-dolist (`(,syms . ,action)
- (let-alist data
- (list (cons .variables.added 'variable-added)
- (cons .variables.removed 'variable-removed)
- (cons .features.added 'library-added)
- (cons .features.removed 'library-removed)
- (cons .functions.added 'function-added)
- (cons .functions.removed 'function-removed))))
- (dolist (sym syms)
- (puthash sym (cons (cons action version) (gethash sym info)) info))))
- info)
- "A hash table from SYMBOL to a list of events in its history.
-Each event is of the form (ACTION . EMACS-VER), where ACTION is a
-symbol such as `variable-added'.")
-
-(defun package-lint-symbol-info (sym)
- "Retrieve information about SYM, as an alist of (ACTION . EMACS-VER)."
- (gethash (cl-etypecase sym
- (string (intern sym))
- (symbol sym))
- package-lint-symbol-info))
-
-(defun package-lint--read-known-symbol (prompt)
- "Read a symbol `package-lint-symbol-info' with PROMPT."
- (let* ((at-point (symbol-at-point))
- (s (completing-read
- prompt
- (cl-loop for k being the hash-keys of package-lint-symbol-info collect k)
- nil
- t
- (when at-point (symbol-name at-point)))))
- (when s (intern s))))
-
-;;;###autoload
-(defun package-lint-describe-symbol-history (sym)
- "Show the version history of SYM, if any."
- (interactive (list (package-lint--read-known-symbol "Show history of symbol: ")))
- (message
- (concat (format "History of %s:\n" sym)
- (mapconcat (lambda (info)
- (pcase-let ((`(,action . ,version) info))
- (format "* %s in Emacs %s"
- action (mapconcat 'number-to-string version "."))))
- (sort (package-lint-symbol-info sym)
- (lambda (a b) (version-list-<= (cdr a) (cdr b))))
- "\n"))))
-
-(defun package-lint--added-or-removed-function-p (sym)
- "Return t if SYM is a function added/removed in any known Emacs version."
- (let-alist (package-lint-symbol-info sym)
- (or .function-added .function-removed)))
-
-(defconst package-lint--compat-symbols
- (package-lint--load-data "data/compat-symbols")
- "A cons cell of (VARS . FUNCTIONS) supported by \"compat\".")
-
-(defun package-lint--supported-by-compat (type sym)
- "Return non-nil if SYM is supported by the \"compat\" package.
-TYPE is `function' or `variable'."
- (memq sym (pcase type
- (`function (cdr package-lint--compat-symbols))
- (_ nil))))
-
-(defconst package-lint--sane-prefixes
- (rx
- string-start
- (or
- "org-dblock-write:"
- "org-babel-execute:"
- "org-babel-expand-body:"
- "org-babel-header-args:"
- "org-babel-prep-session:"
- "org-babel-variable-assignments:"
- "org-babel-default-header-args:"
- "pcomplete/"
- "use-package-normalize/"
- "use-package-handler/"
- "use-package-autoloads/"))
- "A regexp matching whitelisted non-standard symbol prefixes.")
-
-(defvar package-lint--allowed-prefix-mappings
- '(("ob-" . ("org-"))
- ("oc-" . ("org-"))
- ("ol-" . ("org-"))
- ("ox-" . ("org-")))
- "Alist containing mappings of package prefixes to symbol prefixes.")
-
-(defun package-lint--main-file-p ()
- "Return non-nil if the current buffer corresponds to the package's main file."
- (or (null package-lint-main-file)
- (null (buffer-file-name))
- (string= (file-truename (expand-file-name package-lint-main-file))
- (file-truename (buffer-file-name)))))
-
-(defun package-lint--check-all ()
- "Return a list of errors/warnings for the current buffer."
- (let ((package-lint--errors '())
- (case-fold-search nil))
- (save-match-data
- (save-excursion
- (save-restriction
- (widen)
- (let (prefix deps)
- (if (package-lint--main-file-p)
- (progn
- ;; TODO: handle when the main file is a -pkg.el file
- (setq prefix (package-lint--get-package-prefix))
- (let ((desc (package-lint--check-package-el-can-parse)))
- (when desc
- (package-lint--check-package-summary desc)
- (package-lint--check-provide-form desc)
- (package-lint--check-no-emacs-in-package-name desc)))
- (setq deps (package-lint--check-dependency-list))
-
- (package-lint--check-url-header)
- (package-lint--check-package-version-present)
- (package-lint--check-commentary-existence))
- ;; Need to look at the main file to find prefix and dependencies
- (setq prefix (replace-regexp-in-string
- "\\(-mode\\)?\\(-pkg\\)?\\'" ""
- (file-name-sans-extension
- (file-name-nondirectory package-lint-main-file))))
- (let ((main-file package-lint-main-file))
- (if (string-match-p "-pkg\\.el\\'" main-file)
- (let ((expr (with-temp-buffer
- (insert-file-contents (expand-file-name main-file))
- (read (current-buffer)))))
- (if (eq (car-safe expr) 'define-package)
- (setq deps (package-desc-reqs (apply #'package-lint--package-desc-from-define (cdr expr))))
- (package-lint--error-at-bob 'error (format "Malformed package descriptor file \"%s\"" main-file))))
- (when (package-lint--goto-header "Package-Requires")
- (package-lint--error-at-bol 'error "Package-Requires outside the main file have no effect."))
- (package-lint--check-provide-form-secondary-file)
- (condition-case err
- (with-temp-buffer
- (insert-file-contents (expand-file-name main-file))
- (setq deps (package-desc-reqs (package-lint--liberal-package-buffer-info))))
- (error
- (package-lint--error-at-bob
- 'error
- (format "Error parsing main package file \"%s\": %s" main-file err)))))))
-
- ;; Source code checks
- (package-lint--check-keywords-list)
- (package-lint--check-lexical-binding-is-on-first-line)
- (package-lint--check-reserved-keybindings)
- (when prefix
- (package-lint--check-objects-by-regexp
- (concat "(" (regexp-opt '("defalias" "defvaralias")) "\\s-")
- (apply-partially #'package-lint--check-defalias prefix)))
- (package-lint--check-objects-by-regexp
- "(define-minor-mode\\s-"
- #'package-lint--check-minor-mode)
- (package-lint--check-objects-by-regexp
- "(define-global\\(?:ized\\)?-minor-mode\\s-"
- #'package-lint--check-globalized-minor-mode)
- (package-lint--check-objects-by-regexp
- "(defgroup\\s-" #'package-lint--check-defgroup)
-
- (package-lint--check-no-use-of-cl)
- (package-lint--check-no-use-of-cl-lib-sublibraries)
- (package-lint--check-eval-after-load)
- (package-lint--check-lexical-binding-requires-emacs-24 deps)
- (package-lint--check-libraries-available-in-emacs deps)
- (package-lint--check-libraries-removed-from-emacs)
- (package-lint--check-macros-functions-available-in-emacs deps)
- (package-lint--check-macros-functions-removed-from-emacs deps)
- (package-lint--check-objects-by-regexp
- (concat "(" (regexp-opt '("format" "message" "error")) "\\s-")
- (apply-partially #'package-lint--check-format-string deps))
- (package-lint--check-for-literal-emacs-path)
- (let ((definitions (package-lint--get-defs)))
- (package-lint--check-autoloads-on-private-functions definitions)
- (when prefix
- (package-lint--check-defs-prefix prefix definitions))
- (package-lint--check-symbol-separators definitions)))
- (package-lint--check-lonely-parens))))
- (sort package-lint--errors
- (lambda (a b)
- (pcase-let ((`(,a-line ,a-column ,_ ,a-message) a)
- (`(,b-line ,b-column ,_ ,b-message) b))
- (cond
- ((/= a-line b-line) (< a-line b-line))
- ((/= a-column b-column) (< a-column b-column))
- (t
- (string-lessp a-message b-message))))))))
-
-(defun package-lint--error (line col type message)
- "Construct a datum for error at LINE and COL with TYPE and MESSAGE."
- (push (list line col type message) package-lint--errors))
-
-(defun package-lint--error-at-point (type message &optional pos)
- "Construct a datum for error at POS with TYPE and MESSAGE.
-POS defaults to `point'."
- (save-excursion
- (when pos
- (goto-char pos))
- (package-lint--error (line-number-at-pos) (- (point) (line-beginning-position)) type message)))
-
-(defun package-lint--error-at-bol (type message)
- "Construct an error at the beginning of the current line with TYPE and MESSAGE."
- (package-lint--error (line-number-at-pos) 0 type message))
-
-(defun package-lint--error-at-bob (type message)
- "Construct an error at the beginning of the buffer with TYPE and MESSAGE."
- (package-lint--error 1 0 type message))
-
-\f
-;;; Checks
-
-(defun package-lint--check-reserved-keybindings ()
- "Warn about reserved keybindings."
- (let ((re (rx "(" (*? space) (or "kbd" "global-set-key" "local-set-key" "define-key") symbol-end)))
- (goto-char (point-min))
- (while (re-search-forward re nil t)
- (unless (nth 8 (save-match-data (syntax-ppss)))
- ;; Read form and get key-sequence
- (goto-char (match-beginning 0))
- (let ((seq (package-lint--extract-key-sequence
- (read (current-buffer)))))
- (when seq
- (let ((message (package-lint--test-keyseq seq)))
- (when message
- (package-lint--error-at-point 'error message)))))))))
-
-(defun package-lint--check-commentary-existence ()
- "Warn about nonexistent or empty commentary section."
- (let ((start (lm-commentary-start)))
- (if (null start)
- (package-lint--error-at-bob
- 'error
- "Package should have a ;;; Commentary section.")
- ;; Skip over the section header.
- (goto-char start)
- (forward-line)
- (when (package-lint--region-empty-p (point) (lm-commentary-end))
- (package-lint--error-at-point
- 'error
- "Package should have a non-empty ;;; Commentary section."
- start)))))
-
-(defun package-lint--check-autoloads-on-private-functions (definitions)
- "Verify that private functions DEFINITIONS don't have autoload cookies."
- (pcase-dolist (`(,symbol . ,position) definitions)
- (when (string-match-p (rx "--") symbol)
- (goto-char position)
- (forward-line -1)
- (when (looking-at-p (rx ";;;###autoload"))
- (package-lint--error-at-point
- 'warning
- "Private functions generally should not be autoloaded.")))))
-
-(defun package-lint--check-for-literal-emacs-path ()
- "Verify package does not refer to \"\.emacs\.d\" literally.
-Instead it should use `user-emacs-directory' or `locate-user-emacs-file'."
- (goto-char (point-min))
- ;; \b won't find a word boundary between a symbol and the "." in
- ;; ".emacs.d". / is a valid symbol constituent in Emacs Lisp, so
- ;; must be explicitly blacklisted.
- (while (re-search-forward "\\(?:\\_<\\|/\\)\\.emacs\\.d\\b" nil t)
- (unless (nth 4 (syntax-ppss))
- ;; Not in a comment
- (package-lint--error-at-point
- 'warning
- "Use variable `user-emacs-directory' or function `locate-user-emacs-file' instead of a literal path to the Emacs user directory or files."))))
-
-(defun package-lint--check-keywords-list ()
- "Verify that package keywords are listed in `finder-known-keywords'."
- (when (package-lint--goto-header "Keywords")
- (let ((err-pos (point)))
- (let ((keywords (lm-keywords-list)))
- (unless (cl-some (lambda (keyword) (assoc (intern keyword) finder-known-keywords)) keywords)
- (package-lint--error-at-point
- 'warning
- (format "You should include standard keywords: see the variable `finder-known-keywords'.")
- err-pos))))))
-
-(defun package-lint--check-url-header ()
- "Verify that the package has an HTTPS or HTTP Homepage/URL header."
- (if (package-lint--goto-header "\\(?:URL\\|Homepage\\)")
- (progn
- (when (looking-at "<.*>$")
- (forward-char 1))
- (let ((url (thing-at-point 'url)))
- (unless (and url (string-match-p "^https?://" url))
- (package-lint--error-at-point
- 'error
- "Package URLs should be a single HTTPS or HTTP URL."
- (point)))))
- (package-lint--error-at-bob
- 'error
- "Package should have a Homepage or URL header.")))
-
-(defun package-lint--check-dependency-list ()
- "Check the contents of the \"Package-Requires\" header.
-Return a list of well-formed dependencies, same as
-`package-lint--check-well-formed-dependencies'."
- (let ((deps (package-lint--goto-header "Package-Requires")))
- (when deps
- (let ((position (point)))
- (condition-case err
- (pcase-let ((`(,parsed-deps . ,parse-end-pos) (read-from-string deps)))
- (unless (= parse-end-pos (length deps))
- (package-lint--error-at-bol
- 'error
- "More than one expression provided."))
- (let ((deps (package-lint--check-well-formed-dependencies position parsed-deps)))
- (package-lint--check-emacs-version deps)
- (package-lint--check-packages-installable deps)
- (package-lint--check-deps-use-non-snapshot-version deps)
- (package-lint--check-deps-do-not-use-zero-versions deps)
- (package-lint--check-cl-lib-version deps)
- deps))
- (error
- (package-lint--error-at-bol
- 'error
- (format "Couldn't parse \"Package-Requires\" header: %s" (error-message-string err)))
- nil))))))
-
-(defun package-lint--check-well-formed-dependencies (position parsed-deps)
- "Check that dependencies listed at POSITION are well-formed.
-These PARSED-DEPS must have the format (name \"version\").
-Return a list of well-formed dependencies, where each element is of
-the form (PACKAGE-NAME PACKAGE-VERSION DEP-POSITION)."
- (let (valid-deps)
- (dolist (entry parsed-deps)
- (pcase entry
- ((or (and `(,package-name ,package-version)
- (guard (symbolp package-name))
- (guard (stringp package-version)))
- (and `(,package-name)
- (guard (symbolp package-name)))
- (and package-name
- (guard (symbolp package-name))))
- ;; Find the column at which the dependency is declared so we can
- ;; properly report the position of errors.
- (let ((dep-pos
- (save-excursion
- (goto-char position)
- (let* ((symbol-pattern
- (format "\\(%s\\)"
- (regexp-quote (symbol-name package-name))))
- (list-pattern
- (format "( *%s\\(?:[^[:alnum:]_\\-].*?\\)?)"
- symbol-pattern)))
- (if (or (re-search-forward list-pattern (line-end-position) t)
- (re-search-forward symbol-pattern (line-end-position) t))
- (match-beginning 1)
- position)))))
- (unless package-version
- (setq package-version "0"))
- (if (ignore-errors (version-to-list package-version))
- (push (list package-name
- (version-to-list package-version)
- dep-pos)
- valid-deps)
- (package-lint--error-at-point
- 'error
- (format "%S is not a valid version string: see `version-to-list'."
- package-version)
- dep-pos))))
- (_
- (package-lint--error-at-bol
- 'error
- (format "Expected (package-name \"version-num\"), but found %S." entry)))))
- valid-deps))
-
-(defun package-lint--check-package-installable (archive-entry package-version dep-pos)
- "Check that ARCHIVE-ENTRY is installable from a configured package archive.
-
-Check that package described by ARCHIVE-ENTRY can be installed at
-required version PACKAGE-VERSION. If not, raise an error for DEP-POS."
- (let* ((package-name (car archive-entry))
- (best-version (package-lint--highest-installable-version-of package-name)))
- (when (version-list-< best-version package-version)
- (package-lint--error-at-point
- 'warning
- (format "Version dependency for %s appears too high: try %s" package-name
- (package-version-join best-version))
- dep-pos))))
-
-(defun package-lint--check-emacs-version (valid-deps)
- "Check that all VALID-DEPS are available for installation."
- (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps)
- (when (eq 'emacs package-name)
- (cond
- ((version-list-< package-version '(24))
- (package-lint--error-at-point
- 'error
- "You can only depend on Emacs version 24 or greater: package.el for Emacs 23 does not support the \"emacs\" pseudopackage."
- dep-pos))
- ((version-list-<= package-lint-emacs-head-version package-version)
- (package-lint--error-at-point
- 'warning
- "This makes the package uninstallable in all released Emacs versions."
- dep-pos))))))
-
-(defun package-lint--check-packages-installable (valid-deps)
- "Check that all VALID-DEPS are available for installation."
- (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps)
- (unless (eq 'emacs package-name)
- (let ((archive-entry (append (assq package-name package-archive-contents)
- (assq package-name package-alist))))
- (if archive-entry
- (package-lint--check-package-installable archive-entry package-version dep-pos)
- (package-lint--error-at-point
- 'error
- (format "Package %S is not installable." package-name)
- dep-pos))))))
-
-(defun package-lint--check-deps-use-non-snapshot-version (valid-deps)
- "Warn about any VALID-DEPS on snapshot versions of packages."
- (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps)
- (unless (version-list-< package-version '(19001201 1))
- (package-lint--error-at-point
- 'warning
- (format "Use a non-snapshot version number for dependency on \"%S\" if possible."
- package-name)
- dep-pos))))
-
-(defun package-lint--check-deps-do-not-use-zero-versions (valid-deps)
- "Warn about VALID-DEPS on \"0\" versions of packages."
- (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps)
- (when (equal package-version '(0))
- (package-lint--error-at-point
- 'warning
- (format "Use a properly versioned dependency on \"%S\" if possible."
- package-name)
- dep-pos))))
-
-(defun package-lint--check-lexical-binding-requires-emacs-24 (valid-deps)
- "Warn about use of `lexical-binding' when Emacs 24.1 is not among VALID-DEPS."
- (goto-char (point-min))
- (when (package-lint--lexical-binding-declared-in-header-line-p)
- (unless (assq 'emacs valid-deps)
- (package-lint--error-at-point
- 'warning
- "You should depend on (emacs \"24.1\") if you need lexical-binding."
- (match-beginning 1)))))
-
-(defun package-lint--inside-comment-or-string-p ()
- "Return non-nil if point is inside a comment or string."
- (let ((ppss (save-match-data (syntax-ppss))))
- (or (nth 3 ppss) (nth 4 ppss))))
-
-(defun package-lint--seen-fboundp-check-for (sym)
- "Return non-nil if a `fboundp' check for SYM is present before point."
- (save-excursion
- (save-match-data
- (and (re-search-backward
- (concat "(" (regexp-opt '("fboundp" "macrop")) "\\s-+#?'" (regexp-quote sym) "\\_>") (point-min) t)
- (not (package-lint--inside-comment-or-string-p))))))
-
-(defun package-lint--map-regexp-match (regexp callback)
- "For every match of REGEXP, call CALLBACK with the first match group.
-If callback returns non-nil, the return value - which must be a
-list - will be applied to `package-lint--error-at-point'. If
-REGEXP doesn't produce a match group 1, then match group
-0 (ie. the whole match string string) will be passed to
-CALLBACK."
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward regexp nil t)
- (let ((sym (or (match-string-no-properties 1)
- (match-string-no-properties 0))))
- (save-excursion
- (goto-char (or (match-beginning 1)
- (match-beginning 0)))
- (let ((err (funcall callback sym)))
- (when err
- ;; Check this as late as possible, just before reporting,
- ;; because otherwise the checking process is extremely slow,
- ;; being bottlenecked by `syntax-ppss'.
- (unless (package-lint--inside-comment-or-string-p)
- (apply #'package-lint--error-at-point err)))))))))
-
-(defun package-lint--quick-up-list ()
- (if (eq ?\( (char-before))
- (backward-char 1)
- (backward-up-list)))
-
-(defun package-lint--is-a-let-binding ()
- "Return non-nil if point is on a symbol being introduced by a let binding."
- (let ((binding-pat (rx "(" (or "let" "let*" "cl-let") symbol-end)))
- (condition-case _
- (save-excursion
- (save-match-data
- (let ((was-first (eq ?\( (char-before))))
- (package-lint--quick-up-list)
- (package-lint--quick-up-list)
- (or (looking-at binding-pat)
- (when was-first
- (package-lint--quick-up-list)
- (looking-at binding-pat))))))
- (scan-error nil))))
-
-(defun package-lint--check-version-regexp-list (valid-deps symbol-regexp type)
- "Warn if symbols matched by SYMBOL-REGEXP are unavailable in the target Emacs.
-The target Emacs version is taken from VALID-DEPS, which are the
-declared dependencies of this package. TYPE is the
-type of the symbol, either FUNCTION or FEATURE."
- (let ((emacs-version-dep (or (cadr (assq 'emacs valid-deps)) '(0))))
- (package-lint--map-regexp-match
- symbol-regexp
- (lambda (sym)
- (let-alist (package-lint-symbol-info sym)
- (let ((added-in-version (pcase type
- (`function .function-added)
- (`feature .library-added))))
- (when (and added-in-version (version-list-< emacs-version-dep added-in-version))
- (let* ((available-backport-with-ver
- (pcase type
- (`feature
- (cl-some (lambda (bp)
- (when (string= (car bp) sym)
- (or (cddr bp)
- (list (car bp)))))
- package-lint-backport-libraries))
- (`function
- (cl-some (lambda (bp)
- (when (string-match-p (nth 1 bp) sym)
- (or (cddr bp)
- (list (car bp)))))
- package-lint-backport-libraries))))
- (available-backport (car available-backport-with-ver))
- (required-backport-version (cadr available-backport-with-ver))
- (matching-dep (when available-backport
- (assoc available-backport valid-deps)))
- (compat-support (package-lint--supported-by-compat type (intern sym)))
- (compat-in-deps (assoc 'compat valid-deps)))
- (unless (or
- (and compat-support compat-in-deps)
- (and matching-dep
- (or (not required-backport-version)
- (version-list-<= (version-to-list required-backport-version)
- (cadr matching-dep))))
- (and (eq type 'function)
- (or (package-lint--seen-fboundp-check-for sym)
- (package-lint--is-a-let-binding))))
- (list
- 'error
- (format "You should depend on (emacs \"%s\")%s%s if you need `%s'."
- (mapconcat #'number-to-string added-in-version ".")
- (if available-backport
- (format " or the %s package"
- (if required-backport-version
- (format "(%s \"%s\")"
- available-backport
- required-backport-version)
- available-backport))
- "")
- (if compat-support " or the compat package" "")
- sym)))))))))))
-
-(defun package-lint--check-eval-after-load ()
- "Warn about use of `eval-after-load' and co."
- (package-lint--map-regexp-match
- "(\\s-*?\\(\\(?:with-\\)?eval-after-load\\)\\_>"
- (lambda (match)
- (list 'warning
- (format "`%s' is for use in configurations, and should rarely be used in packages." match)))))
-
-(defun package-lint--check-no-use-of-cl ()
- "Warn about use of deprecated `cl' library."
- (package-lint--map-regexp-match
- "(\\s-*?require\\s-*?'\\(cl\\)\\_>"
- (lambda (_)
- (list
- 'warning
- "Replace deprecated `cl' with `cl-lib'. The `cl-libify' package can help with this."))))
-
-(defun package-lint--check-no-use-of-cl-lib-sublibraries ()
- "Warn about use of `cl-macs', `cl-seq' etc."
- (package-lint--map-regexp-match
- "(\\s-*?require\\s-*?'\\(cl-macs\\|cl-seq\\)\\_>"
- (lambda (_)
- (list
- 'warning
- "This file is not in the `cl-lib' ELPA compatibility package: require `cl-lib' instead."))))
-
-(defconst package-lint--unconditional-require-regexp
- ;; Match the ending paren so we can be sure it's a single argument
- ;; `require'. If there are additional arguments, we don't want to warn,
- ;; because (require 'foo nil t) indicates an optional dependency and
- ;; (require 'foo "filename") is very uncommon.
- "(\\s-*?require\\s-*?'\\_<\\(.*?\\)\\_>\\s-*?)"
- "Regexp to match unconditional `require' forms.")
-
-(defun package-lint--check-libraries-available-in-emacs (valid-deps)
- "Warn about use of libraries that are not available.
-The check is performed against the Emacs version in VALID-DEPS."
- (package-lint--check-version-regexp-list
- valid-deps
- package-lint--unconditional-require-regexp
- 'feature))
-
-(defun package-lint--check-libraries-removed-from-emacs ()
- "Warn about use of libraries that have been removed from Emacs."
- (package-lint--map-regexp-match
- package-lint--unconditional-require-regexp
- (lambda (sym)
- (let-alist (package-lint-symbol-info sym)
- (let ((removed-in-version .library-removed))
- (when removed-in-version
- (list
- 'error
- (format "The `%s' library was removed in Emacs version %s."
- sym (mapconcat #'number-to-string removed-in-version ".")))))))))
-
-(defconst package-lint--function-name-regexp
- (rx
- (seq
- (or "#'"
- (seq "(" (* (syntax whitespace))
- (? (seq
- (or "funcall" "apply" "advice-add")
- (+
- (syntax whitespace))
- "'"))))
- (group
- (*\? nonl))
- symbol-end))
- "Regexp to match function names.")
-
-(defun package-lint--check-macros-functions-available-in-emacs (valid-deps)
- "Warn about use of unavailable functions/macros that are not available.
-The check is performed against the Emacs version in VALID-DEPS."
- (package-lint--check-version-regexp-list
- valid-deps
- package-lint--function-name-regexp
- 'function))
-
-(defun package-lint--check-macros-functions-removed-from-emacs (valid-deps)
- "Warn about use of functions/macros that have been removed from Emacs.
-If an Emacs version is specified in VALID-DEPS, don't warn about
-functions/macros that were removed and later re-added, as long as
-the Emacs dependency matches the re-addition."
- (package-lint--map-regexp-match
- package-lint--function-name-regexp
- (lambda (sym)
- (let-alist (package-lint-symbol-info sym)
- (let ((removed-in-version .function-removed))
- (when removed-in-version
- (let ((emacs-version-dep (or (cadr (assq 'emacs valid-deps)) '(0))))
- (unless (or (package-lint--seen-fboundp-check-for sym)
- (and .function-added (version-list-<= .function-added emacs-version-dep)))
- (list
- 'error
- (format "`%s' was removed in Emacs version %s."
- sym (mapconcat #'number-to-string removed-in-version ".")))))))))))
-
-(defun package-lint--check-lexical-binding-is-on-first-line ()
- "Check that any `lexical-binding' declaration is on the first line of the file."
- (cl-block return
- (let ((original-buffer (current-buffer)))
- (with-temp-buffer
- (let ((lexical-binding-found-at-end nil))
- (insert-buffer-substring-no-properties original-buffer)
- (condition-case err
- (cl-letf (((symbol-function #'hack-local-variables-apply) #'ignore)
- ((symbol-function #'hack-local-variables-filter)
- (lambda (variables _dir-name)
- (setq file-local-variables-alist variables)))
- ;; Silence any messages Emacs may want to share with the user.
- ;; There's no user.
- ((symbol-function #'display-warning) #'ignore)
- ((symbol-function #'message) #'ignore))
- ;; HACK: this is an internal variable!
- ;; Unfortunately, Emacsen that have this variable also have
- ;; `hack-local-variables' that doesn't store `lexical-binding'
- ;; in `file-local-variables-alist'.
- (defvar enable-dir-local-variables)
- (defvar hack-local-variables--warned-lexical)
- (let ((hack-local-variables--warned-lexical nil)
- (enable-dir-local-variables nil)
- (enable-local-variables t)
- (local-enable-local-variables t))
- (hack-local-variables)
- (setq lexical-binding-found-at-end
- hack-local-variables--warned-lexical)))
- (error
- (package-lint--error-at-bob 'error (error-message-string err))
- (cl-return-from return nil)))
- (when (or lexical-binding-found-at-end
- ;; In case this is an Emacs from before `hack-local-variables'
- ;; started to warn about `lexical-binding' on a line other
- ;; than the first.
- (and (cdr (assq 'lexical-binding file-local-variables-alist))
- (not (package-lint--lexical-binding-declared-in-header-line-p))))
- (package-lint--error-at-bob
- 'error
- "`lexical-binding' must be set in the first line.")))))))
-
-(defun package-lint--check-cl-lib-version (valid-deps)
- "Check dependencies in VALID-DEPS on \"cl-lib\".
-The specified versions must be remotely available for installation."
- (let ((emacs-version-dep (or (nth 1 (assq 'emacs valid-deps)) '(0)))
- (cl-lib-dep (assq 'cl-lib valid-deps)))
- (when cl-lib-dep
- (let ((cl-lib-version (nth 1 cl-lib-dep)))
- (cond ((and emacs-version-dep
- (version-list-<= '(24 3) emacs-version-dep)
- (version-list-<= cl-lib-version '(1 0)))
- (package-lint--error-at-point
- 'warning
- "An explicit dependency on cl-lib <= 1.0 is not needed on Emacs >= 24.3."))
- ((version-list-<= '(1) cl-lib-version)
- (package-lint--error-at-point
- 'error
- (format "Depend on the latest 0.x version of cl-lib rather than on version \"%S\".
-Alternatively, depend on (emacs \"24.3\") or greater, in which cl-lib is bundled."
- cl-lib-version)
- (nth 2 cl-lib-dep))))))))
-
-(defun package-lint--check-package-version-present ()
- "Check that a valid \"Version\" header is present."
- (let ((version (package-lint--goto-header (rx (? "Package-") "Version"))))
- (if version
- (unless (ignore-errors (version-to-list version))
- (package-lint--error-at-point
- 'warning
- (format "\"%s\" is not a valid version. MELPA will handle this, but other archives will not." version)
- (point)))
- (package-lint--error-at-bob
- 'warning
- "\"Version:\" or \"Package-Version:\" header is missing. MELPA will handle this, but other archives will not."))))
-
-(defun package-lint--liberal-package-buffer-info ()
- "Like `package-buffer-info', but tolerate missing version header."
- (let ((orig-buffer (current-buffer)))
- ;; We've reported version header issues separately, so rule them out here
- (with-temp-buffer
- (insert-buffer-substring-no-properties orig-buffer)
- (goto-char (point-min))
- (package-lint--update-or-insert-version "0")
- (let ((info (package-buffer-info)))
- ;; Pedantically check for the footer comment
- ;; In Emacs 29 this became a soft failure, but for packages to
- ;; be installable with the package.el in older Emacsen, the
- ;; footer comment must be there nonetheless.
- (goto-char (point-min))
- (search-forward (format ";;; %s.el ends here" (package-lint--package-desc-name info)))
- info))))
-
-(defun package-lint--check-package-el-can-parse ()
- "Check that `package-buffer-info' can read metadata from this file.
-If it can, return the read metadata."
- (condition-case err
- (package-lint--liberal-package-buffer-info)
- (error
- (package-lint--error-at-bob
- 'error
- (format "package.el cannot parse this buffer: %s" (error-message-string err)))
- nil)))
-
-(defun package-lint--check-package-summary (desc)
- "Check the summary for package with descriptor DESC.
-DESC is a struct as returned by `package-buffer-info'."
- (let ((summary (package-lint--package-desc-summary desc)))
- (cond
- ((string= summary "")
- (package-lint--error-at-bob
- 'error
- "Package should have a non-empty summary."))
- (t
- (unless (let ((case-fold-search nil))
- (string-match-p "^[A-Z0-9]" summary))
- (package-lint--error-at-bob
- 'warning
- "The package summary should start with an uppercase letter or a digit."))
- (when (> (length summary) 60)
- (package-lint--error-at-bob
- 'warning
- "The package summary is too long. It should be at most 60 characters."))
- (when (string-match "\\.\\'" summary)
- (package-lint--error-at-bob
- 'warning
- "The package summary should not end with a period."))
- (when (save-match-data
- (let ((case-fold-search t))
- (and (string-match "[^.]\\<emacs\\>" summary)
- (not (string-match-p "[[:space:]]+lisp"
- summary (match-end 0))))))
- (package-lint--error-at-bob
- 'warning
- "Including \"Emacs\" in the package summary is usually redundant."))))))
-
-(defun package-lint--check-provide-form (desc)
- "Check the provide form for package with descriptor DESC.
-DESC is a struct as returned by `package-buffer-info'."
- (let ((name (symbol-name (package-lint--package-desc-name desc))))
- (if (string-match-p "-theme\\'" name)
- (let ((theme-name (replace-regexp-in-string "-theme\\'" "" name))
- (provided-theme (package-lint--provided-theme)))
- (unless (string-equal theme-name provided-theme)
- (package-lint--error-at-bob
- 'error
- (format "There is no (provide-theme '%s) form." theme-name))))
- (let ((feature (package-lint--provided-feature)))
- (unless (string-equal name feature)
- (package-lint--error-at-bob
- 'error
- (format "There is no (provide '%s) form." name)))))))
-
-(defun package-lint--check-provide-form-secondary-file ()
- "Check there is a provide form."
- ;; We don't require that the provided feature have a name consistent
- ;; with the overall package prefix, but this check may later be added.
- (unless (package-lint--provided-feature)
- (package-lint--error-at-bob
- 'error
- "There is no `provide' form.")))
-
-(defun package-lint--check-no-emacs-in-package-name (desc)
- "Check that the package name doesn't contain \"emacs\".
-DESC is a struct as returned by `package-buffer-info'."
- (let ((name (package-lint--package-desc-name desc)))
- (when (string-match-p "emacs" (symbol-name name))
- (package-lint--error-at-bob
- 'warning
- "The word \"emacs\" is redundant in Emacs package names."))))
-
-(defun package-lint--check-symbol-separators (definitions)
- "Check that symbol DEFINITIONS don't contain non-standard separators."
- (pcase-dolist (`(,name . ,position) definitions)
- (when (and (string-match "[:/]" name)
- (not (string-match-p package-lint--sane-prefixes name)))
- (let ((match-pos (match-beginning 0)))
- ;; As a special case, allow `/=' or `/' when at the end of a symbol.
- (when (or (not (string-match (rx "/" (optional "=") string-end) name))
- (/= match-pos (match-beginning 0)))
- (goto-char position)
- (package-lint--error
- (line-number-at-pos) 0 'error
- (format "`%s' contains a non-standard separator `%s', use hyphens instead (see Elisp Coding Conventions)."
- name (substring-no-properties name match-pos (1+ match-pos)))))))))
-
-(defun package-lint--valid-prefix-mapping-p (short-prefix prefix name)
- "Check if NAME corresponds to a valid mappings for PREFIX.
-Check is done according to the definitions in
-`package-lint--allowed-prefix-mappings' for SHORT-PREFIX."
- (let ((regexp (concat "^" (regexp-opt
- (cdr (assoc short-prefix package-lint--allowed-prefix-mappings))))))
- (string-prefix-p prefix (replace-regexp-in-string regexp short-prefix name))))
-
-(defun package-lint--valid-definition-name-p (name prefix &optional position)
- "Return non-nil if NAME denotes a valid definition name.
-
-Valid definition names are:
-
-- a NAME starting with PREFIX, a string representing the current
- package prefix,
-
-- a NAME matching `package-lint--sane-prefixes', or
-
-- a NAME whose POSITION in the buffer denotes a global definition."
- (or (string-match-p (rx-to-string `(seq string-start ,prefix (or string-end (not alpha)))) name)
- (string-match-p package-lint--sane-prefixes name)
- (string-match-p (rx-to-string `(seq string-start (or "define" "defun" "defvar" "defface" "with") "-" ,prefix)) name)
- (string-match-p (rx-to-string `(seq string-start "global-" ,prefix (or "-mode" (seq "-" (* any) "-mode")) string-end)) name)
- (let ((short-prefix (car (cl-remove-if-not (lambda (e) (string-prefix-p e prefix))
- (mapcar #'car package-lint--allowed-prefix-mappings)))))
- (when short-prefix
- (package-lint--valid-prefix-mapping-p short-prefix prefix name)))
- (when position
- (goto-char position)
- (looking-at-p (rx (*? space) "(" (*? space)
- (or "defadvice" "cl-defmethod" "define-advice" "defalias" "defvaralias" (seq "define-obsolete-" (or "face" "function" "variable") "-alias"))
- symbol-end)))))
-
-(defun package-lint--check-defs-prefix (prefix definitions)
- "Verify that symbol DEFINITIONS start with package PREFIX."
- (pcase-dolist (`(,name . ,position) definitions)
- (unless (package-lint--valid-definition-name-p name prefix position)
- (if (package-lint--added-or-removed-function-p name)
- (package-lint--error-at-point
- 'error
- (format "Define compatibility functions with a prefix, e.g. \"%s--%s\", and use `defalias' where they exist."
- prefix name)
- position)
- (package-lint--error-at-point
- 'error
- (format "\"%s\" doesn't start with package's prefix \"%s\"."
- name prefix)
- position)))))
-
-(defun package-lint--check-minor-mode (def)
- "Offer up concerns about the minor mode definition DEF."
- (when (cl-search '(:global t) def)
- (package-lint--check-globalized-minor-mode def)))
-
-(defun package-lint--check-globalized-minor-mode (def)
- "Offer up concerns about the global minor mode definition DEF."
- (let ((feature-name (package-lint--provided-feature)))
- (when feature-name
- (let ((feature (intern feature-name))
- (autoloaded (save-excursion
- (forward-line -1)
- (beginning-of-line)
- (looking-at ";;;###autoload"))))
- (unless (or autoloaded
- (cl-search `(:require ',feature) def :test #'equal))
- (package-lint--error-at-point
- 'error
- (format
- "Global minor modes should be autoloaded or, rarely, `:require' their defining file (i.e. \":require '%s\"), to support the customization variable of the same name." feature)))))))
-
-(defun package-lint--check-defgroup (def)
- "Offer up concerns about the customization group definition DEF."
- (when (symbolp (cadr def))
- (let ((group-name (symbol-name (cadr def))))
- (when (string-match "\\(.*\\)-mode$" group-name)
- (let ((parent (intern (match-string 1 group-name))))
- (unless (cl-search `(:group ',parent) def :test #'equal)
- (package-lint--error-at-point
- 'error
- "Customization groups should not end in \"-mode\" unless that name would conflict with their parent group."))))))
-
- (unless (memq :group def)
- (package-lint--error-at-point
- 'error
- "Customization groups should specify a parent via `:group'.")))
-
-(defun package-lint--check-defalias (prefix def)
- "Offer up concerns about the customization group definition DEF.
-PREFIX is the package prefix."
- (pcase (cadr def)
- ((and `(quote ,alias) (guard (symbolp alias)))
- (unless (package-lint--valid-definition-name-p (symbol-name alias) prefix)
- (package-lint--error-at-point
- 'error
- (concat "Aliases should start with the package's prefix \"" prefix "\"."))))))
-
-(defun package-lint--check-format-string (valid-deps def)
- "Offer up concerns about the format string used in DEF, depending on VALID-DEPS."
- (let ((emacs-version-dep (or (cadr (assq 'emacs valid-deps)) '(0))))
- (when (consp (cdr def))
- (let ((fmt-str (cadr def)))
- (when (and (version-list-< emacs-version-dep '(26 1))
- ;; We give up on trying to warn about format strings that are
- ;; evaluated at runtime.
- (stringp fmt-str)
- ;; The usual regexp strategy for finding unescaped matches
- ;; requires negative lookbehind:
- ;; (?<!%)(?:%%)*[0-9]+\$
- ;; So instead we make sure the count of escape chars is odd
- (string-match "\\(%+\\)[0-9]+\\$" fmt-str)
- (cl-oddp (length (match-string 1 fmt-str))))
- (package-lint--error-at-point
- 'error
- "You should depend on (emacs \"26.1\") if you need format field numbers."))))))
-
-(defun package-lint--check-lonely-parens ()
- "Warn about dangling closing parens."
- (package-lint--map-regexp-match
- "^\\s-*?\\()\\)"
- (lambda (_)
- ;; Allow dangling parentheses if the preceding line ends with a comment, as
- ;; it's not uncommon even in idiomatic lisp.
- (when (save-excursion
- (end-of-line 0)
- (not (nth 4 (syntax-ppss))))
- (list 'warning
- "Closing parens should not be wrapped onto new lines.")))))
-
-
-\f
-;;; Helpers
-
-(defun package-lint--extract-key-sequence (form)
- "Extract the key sequence from FORM."
- (pcase form
- (`(kbd ,seq)
- (package-lint--extract-key-sequence seq))
- ((or `(global-set-key ,seq ,_) `(local-set-key ,seq ,_))
- (package-lint--extract-key-sequence seq))
- (`(define-key ,_ ,seq ,_)
- (package-lint--extract-key-sequence seq))
- ((pred stringp)
- (listify-key-sequence (read-kbd-macro form)))
- ((pred vectorp)
- (unless (listp (elt form 0))
- (listify-key-sequence form)))))
-
-(defun package-lint--test-keyseq (lks)
- "Return a message if the listified key sequence LKS is invalid, otherwise nil."
- (let* ((modifiers (event-modifiers lks))
- (basic-type (event-basic-type lks)))
- (when (or (and (> (length lks) 1) (equal (car (last lks)) ?\C-g))
- (and (equal (car (last lks)) ?\e)
- (not (equal (nthcdr (- (length lks) 2) lks)
- '(?\e ?\e))))
- (equal (car (last lks)) ?\C-h)
- (and (equal modifiers '(control))
- (equal ?c basic-type)
- (cdr lks)
- (let ((v (event-basic-type (cdr lks)))
- (m (event-modifiers (cdr lks))))
- (and (numberp v)
- (<= v ?z)
- (>= v ?a)
- (or (null m) (equal '(shift) m)))))
- (member basic-type '(f5 f6 f7 f8 f9)))
- "This key sequence is reserved (see Key Binding Conventions in the Emacs Lisp manual)")))
-
-(defun package-lint--region-empty-p (start end)
- "Return t iff the region between START and END has no non-empty lines.
-
-Lines consisting only of whitespace or empty comments are considered empty."
- (save-excursion
- (save-restriction
- (save-match-data
- (narrow-to-region start end)
- (goto-char start)
- (while (and (looking-at "^[[:space:]]*;*[[:space:]]*$")
- (= 0 (forward-line))))
- (eobp)))))
-
-(defun package-lint--highest-installable-version-of (package)
- "Return the highest version of PACKAGE available for installation."
- (let ((descriptors (append (cdr (assq package package-archive-contents))
- (cdr (assq package package-alist)))))
- (if (fboundp 'package-desc-version)
- (car (sort (mapcar 'package-desc-version descriptors)
- (lambda (v1 v2) (not (version-list-< v1 v2)))))
- (aref descriptors 0))))
-
-(defun package-lint--goto-header (header-name &optional multiline)
- "Move to the first occurrence of HEADER-NAME in the file.
-If the return value is non-nil, then point will be at the
-beginning of the header's value, and the second and third match
-groups will contain the name and value of the header with any
-leading or trailing whitespace removed.
-
-If MULTILINE is non-nil, allow the header value to span lines, and return
-them as a list of strings."
- (goto-char (point-min))
- (when (re-search-forward (concat (lm-get-header-re header-name) "\\(.*?\\) *$") (lm-code-mark) t)
- (let ((start-pos (match-beginning 3))
- (val (match-string-no-properties 3)))
- (when multiline
- (setq val (list val))
- (forward-line 1)
- (while (looking-at "^;+\\(\t\\|[\t\s]\\{2,\\}\\)\\(.+\\)")
- (push (match-string-no-properties 2) val)
- (forward-line 1))
- (nreverse val))
- (goto-char start-pos)
- val)))
-
-(defun package-lint--update-or-insert-version (version)
- "Ensure current buffer has a \"Version: VERSION\" header."
- (if (package-lint--goto-header "Version")
- (move-beginning-of-line nil)
- (forward-line))
- (insert (format ";; Version: %s" version))
- (newline))
-
-(defun package-lint--get-header-line-file-local-variables ()
- "Return local variables specified in the -*- line.
-Returns an alist of elements (VAR . VAL), where VAR is a variable
-and VAL is the specified value.
-
-For details, see `hack-local-variables-prop-line'."
- (cl-letf (((symbol-function #'message) #'ignore))
- (hack-local-variables-prop-line)))
-
-(defun package-lint--lexical-binding-declared-in-header-line-p ()
- "Test if `lexical-binding' is declared in the -*- line."
- ;; Test the `cdr' to see if it's actually true, because
- ;; -*- lexical-binding: nil -*-
- ;; is legal, if silly.
- (cdr (assq 'lexical-binding (package-lint--get-header-line-file-local-variables))))
-
-(defvar semantic-imenu-summary-function)
-
-(defun package-lint--get-defs ()
- "Return a list of all variables and functions defined in the current buffer.
-
-The returned list is of the form (SYMBOL-NAME . POSITION)."
- ;; We probably could use Semantic instead, but it's a *global* minor mode and
- ;; it tends to be quite heavy, so use Imenu instead; if the user has Semantic
- ;; enabled, Imenu will use its index anyway.
- (let ((result '())
- (index
- (save-excursion
- ;; Use the default imenu expression list so that we're not confused
- ;; by user customizations.
- (let ((imenu-generic-expression (default-value 'lisp-imenu-generic-expression))
- ;; In case it's actually Semantic, tell it not to decorate
- ;; symbol names.
- (semantic-imenu-summary-function 'semantic-format-tag-name))
- (funcall imenu-create-index-function)))))
- (dolist (entry index)
- (pcase entry
- ((and `(,submenu-name . ,submenu-elements)
- (guard (consp submenu-elements)))
- (when (member submenu-name '("Variables" "Defuns" "Types"))
- (setq result (nconc (reverse submenu-elements) result))))
- (_
- (push entry result))))
- ;; If it's Semantic, then it returns overlays, not positions. Convert
- ;; them.
- (dolist (entry result)
- (when (overlayp (cdr entry))
- (setcdr entry (overlay-start (cdr entry)))))
- (nreverse result)))
-
-(defun package-lint--provided-feature ()
- "Return the last-provided feature name, as a string, or nil if none."
- (save-excursion
- (goto-char (point-max))
- (cond ((re-search-backward (rx "(provide '" (group (1+ (or (syntax word) (syntax symbol))))) nil t)
- (match-string-no-properties 1))
- ((re-search-backward "(provide-me)" nil t)
- (file-name-sans-extension (file-name-nondirectory buffer-file-name))))))
-
-(defun package-lint--provided-theme ()
- "Return the last-provided theme name, as a string, or nil if none."
- (save-excursion
- (goto-char (point-max))
- (when (re-search-backward (rx "(provide-theme '" (group (1+ (or (syntax word) (syntax symbol))))) nil t)
- (match-string-no-properties 1))))
-
-(defun package-lint--get-package-prefix ()
- "Return package prefix string (i.e. the symbol the package `provide's).
-Prefix is returned without any `-mode' suffix."
- (let ((feature (package-lint--provided-feature)))
- (when feature
- (replace-regexp-in-string "-mode\\'" "" feature))))
-
-(defun package-lint--check-objects-by-regexp (regexp function)
- "Check all objects with the literal printed form matching REGEXP.
-
-The objects are parsed with `read'. The FUNCTION is passed the
-read object, with the point at the beginning of the match.
-
-S-expressions in comments or comments, partial s-expressions, or
-otherwise invalid read forms are ignored."
- (goto-char (point-min))
- (while (re-search-forward regexp nil t)
- (save-excursion
- (goto-char (match-beginning 0))
- (let ((obj (unless (package-lint--inside-comment-or-string-p)
- (save-excursion
- (ignore-errors (read (current-buffer)))))))
- (when obj (funcall function obj))))))
-
-\f
-;;; Public interface
-
-;;;###autoload
-(defun package-lint-buffer (&optional buffer)
- "Get linter errors and warnings for BUFFER.
-
-Returns a list, each element of which is list of
-
- (LINE COL TYPE MESSAGE)
-
-where TYPE is either `warning' or `error'.
-
-Current buffer is used if none is specified."
- (with-current-buffer (or buffer (current-buffer))
- (unless (derived-mode-p 'emacs-lisp-mode)
- (error "Buffer must be in emacs-lisp-mode"))
- (package-lint--check-all)))
-
-;;;###autoload
-(defun package-lint-current-buffer ()
- "Display lint errors and warnings for the current buffer."
- (interactive)
- (let ((errs (package-lint-buffer))
- (buf "*Package-Lint*"))
- (with-current-buffer (get-buffer-create buf)
- (let ((buffer-read-only nil))
- (erase-buffer)
- (cond
- ((null errs) (insert "No issues found."))
- ((null (cdr errs)) (insert "1 issue found:\n\n"))
- (t (insert (format "%d issues found:\n\n" (length errs)))))
- (pcase-dolist (`(,line ,col ,type ,message) errs)
- (insert (format "%d:%d: %s: %s\n" line col type message))))
- (special-mode)
- (view-mode 1))
- (display-buffer buf)))
-
-(defgroup package-lint nil
- "A linting library for elisp package authors."
- :group 'development)
-
-(defcustom package-lint-batch-fail-on-warnings t
- "When non-nil, make warnings fatal for `package-lint-batch-and-exit'."
- :group 'package-lint
- :type 'boolean)
-
-(defun package-lint-batch-and-exit-1 (filenames)
- "Internal helper function for `package-lint-batch-and-exit'.
-
-Checks FILENAMES using package-lint.
-
-The main loop is this separate function so it's easier to test."
- ;; Make sure package.el is initialized so we can query its database.
- (package-initialize)
- (let ((success t) (last-directory nil) (text-quoting-style 'grave))
- (dolist (file filenames success)
- (let* ((file (expand-file-name file))
- (file-directory (file-name-directory file))
- (base (file-name-nondirectory file)))
- (with-temp-buffer
- (insert-file-contents file t)
- (emacs-lisp-mode)
- (let ((checking-result (package-lint-buffer))
- (fail-on (cons 'error (when package-lint-batch-fail-on-warnings '(warning)))))
- (when (cl-some (lambda (err) (memq (nth 2 err) fail-on)) checking-result)
- (setq success nil)
- (unless (equal last-directory file-directory)
- (setq last-directory file-directory)
- (message "Entering directory '%s'" file-directory))
- (pcase-dolist (`(,line ,col ,type ,message) checking-result)
- (message "%s:%d:%d: %s: %s"
- base line col type message)))))))))
-
-;;;###autoload
-(defun package-lint-batch-and-exit ()
- "Run `package-lint-buffer' on the files remaining on the command line.
-Use this only with -batch, it won't work interactively.
-
-When done, exit Emacs with status 1 in case of any errors, otherwise exit
-with status 0. The variable `package-lint-batch-fail-on-warnings' controls
-whether or not warnings alone produce a non-zero exit code."
- (unless noninteractive
- (error "`package-lint-batch-and-exit' is to be used only with -batch"))
- (let ((success (package-lint-batch-and-exit-1 command-line-args-left)))
- (kill-emacs (if success 0 1))))
-
-;;;###autoload
-(defun package-lint-looks-like-a-package-p ()
- "Return non-nil if the current buffer appears to be intended as a package."
- (or package-lint-main-file
- (save-match-data
- (save-excursion
- (save-restriction
- (widen)
- (goto-char (point-min))
- (re-search-forward
- (lm-get-header-re (rx (or "Version" "Package-Version" "Package-Requires")))
- nil t))))))
-
-(provide 'package-lint)
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-;;; package-lint.el ends here
--- /dev/null
+((color-luminance-dark-limit completion-lazy-hilit completion-lazy-hilit-fn file-has-changed-p--hash-table gensym-counter lisp-directory major-mode--suspended mounted-file-systems mouse-select-region-move-to-beginning read-answer-short read-char-from-minibuffer-map read-char-from-minibuffer-map-hash read-char-history regexp-unmatchable set-transient-map-timeout set-transient-map-timer text-quoting-style trusted-content untrusted-content) add-display-text-property alist-get always and-let* assoc assoc-delete-all bignump bool-vector bounds-of-thing-ed-if-unchanged with-delayed-message with-environment-variables with-existing-directory with-file-modes with-memoization with-minibuffer-selected-window with-restriction with-suppressed-warnings with-window-non-dedicated without-restriction xor)
\ No newline at end of file
--- /dev/null
+(((24 1)
+ (functions
+ (removed *table--cell-conter-region ad-Orig-gdb-invalidate-frames ad-define-subr-args ad-get-subr-args ad-subr-arglist ad-subr-args-deess-reporter with-timeout-handler x-frob-font-slant x-frob-font-weight x-get-cut-buffer x-make-font-bold x-make-font-bold-italic x-make-font-demibold x-make-font-italic x-make-font-oblique x-make-font-unbold x-make-font-unitalic x-menu-activate x-menu-add-item x-menu-change-associated-buffer x-menu-create-menu x-menu-delete-item x-menu-mode x-menu-pick-entry x-set-cut-buffer x-setup-function-keys)
+ (added *table--cell-center-region 5x5-defvar-local 5x5-grid-to-vec 5x5-log 5x5-log-init 5x5-solve-rotate-left 5x5-solve-rotate-right 5x5-solve-suggest 5x5-solver 5x5-vec-to-grid Footnote-unicode Info-isearch-end Man-bookmark-jump Man-bookmark-make-record Man-default-bookmark-title Man-page-from-arguments abbrev-edit-save-buffer abbrev-edit-save-to-file abbrev-table-empty-p save-targets y-or-n-minibuffer))
+ (variables
+ (removed --dolist-tail-- --dotimes-limit-- OOOOscore OOOscore OOscore Oscore XXXXscore XXXscore XXscore Xscore after-find-file-from-revert-buffer allout-keybindings-list allout-passphrase-hint-handling allout-passphrase-verifier-handling allout-v18/19-file-var-hack allout-view-change-hook appt-issue-message appt-msg-window appt-now-displayed appt-visible argval auth-source-cache auth-source-hide-passwords autoconf-font-lock-syntactic-keywords bibtex-entry-menu byte-compile-not-obsolete-var byte-compile-outbuffer byte-interactive-p byte-save-window-excursion byte-temp-output-buffer-setup byte-temp-output-buffer-show c-before-font-lock-function c-get-state-before-change-function c-in-literal-cache c-state tramp-cache-inhibit-cache tramp-file-name-handler-alist tramp-fish-continue-prompt-regexp tramp-fish-error-prompt-regexp tramp-fish-file-name-handler-alist tramp-fish-method tramp-fish-ok-prompt-regexp tramp-fish-start-fish-server-command tramp-imap-file-name-handler-alist tramp-imap-method tramp-imap-passphrase tramp-imap-passphrase-cache tramp-imap-subject-marker tramp-imaps-method tramp-root-regexp translations ucs-completions url-cache-expired url-current-referer vc-header-alist vc-path verilog-fork-wait-re widget-complete-field x-alternatives-map x-menu-assoc-buffer x-menu-item-spacing x-menu-item-width x-menu-items-alist x-menu-items-per-line x-menu-max-width x-select-enable-clipboard)
+ (added *org-babel-use-quick-and-dirty-noweb-expansion* *org-bibtex-entries* *orgtbl-default-fmt* *or-vertical window-state-put-list xesam-all-fields xesam-debug xesam-fulltext-query xesam-hits-per-page xesam-interface-search xesam-path-search xesam-query-type xesam-service-search xesam-user-query))
+ (features
+ (removed cl-19 earcon eieio-comp font-setting gdb-ui gnus-audio gnus-move gnus-nocem gnus-soup imap-hash mldrag nndb nnkiboze nnlistserv nnslashdot nnsoup nnultimate nnwarchive nnwfm rnews rnewspost sc tramp-fish tramp-imap x-menu)
+ (added allout-widgets cc-guess cconv cfengine3 color cus-theme ede ede/base ede/files ede/speedbar em-alias em-basic em-dirs em-hist em-script em-unix ert ert-x esh-groups s plstore ps-bdf quickurl recentf registry remember rtree savehist saveplace server shr shr-color soap-client soap-inspect strokes tabulated-list thumbs timeclock todo-mode tramp-loaddefs tramp-sh type-break url url-cache url-future url-http url-queue vc-dav vip viper)))
+ ((24 2)
+ (functions
+ (removed)
+ (added rcirc-split-message))
+ (variables
+ (removed)
+ (added))
+ (features
+ (removed)
+ (added bug-reference misearch multi-isearch)))
+ ((24 3)
+ (functions
+ (removed Buffer-menu-buffer+size Buffer-menu-make-sort-button Buffer-menu-revert-function Buffer-menu-sort-by-column ad-Orig-comment-region ad-Orig-move-overlay ad-Orig-process-filter ad-Orig-set-process-filter ad-Orig-sit-for ad-copy-tree ad-do-return ad-dolist ad-prognify ansi-color-get-face article-translate-characters battery-yeeloong-sysfs bookmark-insert-current-bookmark bookmark-read-search-input brm-init bruce byte-compile-const-symbol-p byte-compile-constp byte-compile-defalias-warn byte-compile-defmacro byte-compile-defmacro-declaration byte-compile-defun byte-compile-file-form-defmacro byte-compile-file-form-defun byte-optimize-featurep c-get-fallback-scan-pos calendar-hide-window&nbsrguments sieve-bury-buffer snarf-bruces solitaire-build-modeline string-to-sequence table-apply table-call-interactively table-funcall table-initialize-table-fixed-width-mode table-set-table-fixed-width-mode term-fake-pager-disable term-fake-pager-enable tmm-delete-map tramp-enter-password tramp-with-progress-reporter turn-off-pdbtrack turn-on-pdbtrack verilog-in-struct-region-p viper-inactivate-input-method viper-inactivate-input-method-action w32-init-info window--display-buffer-1 window--display-buffer-2 window--size-ignore window-point-1 with-connection-property with-file-property xml-parse-fragment xscheme-modeline-initialize zone-hiding-modeline)
+ (added Buffer-menu--pretty-file-name Buffer-menu--pretty-name Buffer-menu-info-node-description ange-ftp-ignore-errors-if-non-essential ansi-colore-raise-frame window--size-ignore-p window-system-for-display wisent-grammar-mode with-temp-buffer-window with-tramp-connection-property with-tramp-file-property with-tramp-progress-reporter woman-break-table x-apply-session-resources x-get-selection-value x-selection-value xml--entity-replacement-text xml--parse-buffer xml-parse-tag-1 xscheme-mode-line-initialize xterm-mouse--read-event-sequence-1000 xterm-mouse--read-event-sequence-1006 xterm-mouse-translate-1 xterm-mouse-translate-extended yank-handle-category-property yank-handle-font-lock-face-property zone-hiding-mode-line))
+ (variables
+ (removed *gensym-counter* *org-bibtex-entries* *random-state* Buffer-menu--buffers Buffer-menu-buffer-column Buffer-menu-short-ellipsis Buffer-menu-sort-button-map Buffer-menu-sort-columnace rst-level-face-base-color rst-level-face-base-light rst-level-face-format-light rst-level-face-max rst-level-face-step-light rst-mode-lazy rst-new-decoration-down rst-re-bullets rst-re-items rst-section-text-regexp rst-shift-fill-region rst-toc-return-buffer rst-use-char-classes sc-version scoped-class sha1-program term-bold-attribute term-completion-menu term-inout-menu this tramp-default-password-end-of-line unread-command-char url-cookie-two-dot-domains vc-bzr-error-regex-alist vc-bzr-sha1-program vc-checkout-carefully vc-ignore-vc-files vc-master-templates vhdl-93-attributes vhdl-93-enum-values vhdl-93-functions vhdl-93-keywords vhdl-93-packages vhdl-93-types xml-name-regexp)
+ (added Buffer-menu-name-width Buffer-menu-size-width Info-file-attributes Man--last-refpaast-selected-text xml-default-ns xml-entity-expansion-limit xml-entity-or-char-ref-re xml-parameter-entity-alist yank-handled-properties))
+ (features
+ (removed ob-C ob-asymptote ob-awk ob-clojure ob-fortran ob-haskell ob-java ob-latex org-install python-21 reftex-vcr)
+ (added cl-lib cl-macs erc-desktop-notifications gnus-notifications gv mm-archive ob-scala org-element org-loaddefs org-version profiler url-domsuf w32-common-fns)))
+ ((24 4)
+ (functions
+ (removed Command-history-setup ad-Orig-copy-region-as-kill ad-Orig-create-file-buffer ad-Orig-dnd-insert-text ad-Orig-dnd-open-file ad-untranslated-canonical-name untranslated-file-p vc-process-sentinel verilog-get-beg-of-defun verilog-get-list verilog-sk-uvm-class verilog-type-completion vhdl-mode-syntax-table-init viper-envelop-ESC-key widget-remove-if winner-hook-installed-p with-org-lparse-preserve-paragraph-state woman-mark-horizonal-position xmltok-add-dependent xmltok-semi-closed-reparse-p xmltok-unclosed-reparse-p xterm-mouse-event-read)
+ (added Buffer-menu--unmark Buffer-menu-multi-occur Info--search-loop Info-build-node-completions-1 Info-next-reference-or-link Info-prev-reference-or-link Man-parse-man-k Man-start-calling Man-update-manpage abbrev--default-expand abbrev--symbol ad--defalias-fset ad--make-advised-docstring ad-Advice-c-backward-sws ad-Advice-c-beginning-of-macro ad-Advice-c-forward-sws ad-Advice-dnd-insert-tex xesam-dbus-call-method xesam-delete-search-engine xesam-get-cached-property xesam-get-hits xesam-get-property xesam-highlight-string xesam-kill-buffer-function xesam-minor-mode xesam-mode xesam-new-search xesam-refresh-entry xesam-refresh-search-buffer xesam-search-engines xesam-set-cached-property xesam-set-property xesam-signal-handler))
+ (variables
+ (removed *org-babel-use-quick-and-dirty-noweb-expansion* Info-enable-edit ad-activate-on-top-level add-log-c-like-modes add-log-lisp-like-modes add-log-tex-like-modes allout-encryption-text-removal-regexps bookmark-bmenu-header-height bubbles--neighbourhood-score buffer-file-type c-awk-one-line-non-syn-ws*-re c-awk-one-line-possibly-open-regexp-re c-awk-one-line-possibly-open-string-re c-awk-regexp-one-line-possibly-open-char-libsp;xmltok-dependent-regions)
+ (added *org-babel-gnuplot-missing* *org-babel-gnuplot-terms* 5x5-mode-abbrev-table 5x5-mode-syntax-table Buffer-menu-mode-hook Edit-options-mode-abbrev-table Edit-options-mode-hook Edit-options-mode-syntax-table Info-edit-mode-abbrev-table Info-edit-mode-map Info-edit-mode-syntax-table Info-file-completions Man-man-k-use-anchor Man-mode-abbrev-table Man-mode-syntax-table abbrev-expand-function abbrev-mode-hook advice--buffer-local-function-sample advice--bytecodes advice--where-alist allout-widgets-mode-hook archive-7z-program array-mode-abbrev-table array-mode-hook array-mode-syntax-table artist-mode-hook asm-mode-hook authors-lax-changelogs authors-no-scan-regexps auto-composition-mode-hook auto-compression-mode-hook auto-encryption-mode-hook auto-fill-mode-hook aunbsp;xesam-query xesam-refreshing xesam-search xesam-search-engines xesam-to xesam-type xesam-vendor xesam-xml-string xterm-mouse-mode-hook))
+ (features
+ (removed advice-preload delphi find-gc octave-inf octave-mod org-ascii org-beamer org-docbook org-exp org-exp-blocks org-export-latex org-freemind org-html org-icalendar org-infojs org-jsinfo org-latex org-lparse org-mac-message org-mew org-mks org-odt org-publish org-remember org-special-blocks org-taskjuggler org-vm org-wl org-xoxo)
+ (added bat-mode cl-indent cl-loaddefs cus-dep dos-vars eieio-core elec-pair em-tramp erc-list eudcb-bbdb eww filenotify frameset gnus-icalendar gnus-vm inotify nadvice ob-C ob-asymptote ob-awk ob-clojure ob-core ob-fortran ob-haskell ob-io ob-java ob-latex ob-makefile octave opascal org-macro ox ox-ascii ox-beamer ox-html ox-icalendar ox-latex ox-man ox-md ox-odt ox-org ox-publish ox-texinfo pcmpl-x prog-mode smiley subr-x sup-mouse superword tpu-extras tramp-adb xesam)))
+ ((24 5)
+ (functions
+ (removed browse-url-firefox-sentinel cua-repeat-replace-region python-indent-toggle-levels tramp-time-less-p tramp-time-subtract)
+ (added c--macroexpand-all c-macro-is-genuine-p delete-selection-repeat-replace-region erc-channel-user-admin erc-channel-user-admin-p erc-channel-user-halfop erc-channel-user-halfop-p erc-channel-user-owner erc-channel-user-owner-p erc-get-user-mode-prefix erc-quit/part-reason-default file-notify--descriptor python-indent--calculate-indentation python-indent--calculate-levels python-indent--previous-level python-info-encoding python-info-encoding-from-cookie python-syntax-closing-paren-p reftex--prepare-syntax-tables todo-revert-buffer))
+ (variables
+ (removed cua--last-deleted-region-pos cua--last-deleted-region-text cua--repeat-replace-text ispell-hunspell-dictionary-equivs-alist python--use-fake-loc)
+ (added delete-selection-save-to-register delsel--replace-text-or-position erc-rename-buffers ispell-dicts-name2locale-equivs-alist mml2015-display-key-image python-shell-unbuffered vc-hg-log-graph))
+ (features
+ (removed)
+ (added cl-extra)))
+ ((25 1)
+ (functions
+ (removed ada-convert-file-name add-to-diary-list american-calendar authors authors-add authors-add-fixed-entries authors-add-to-author-list authors-canonical-author-name authors-canonical-file-name authors-disambiguate-file-name authors-lax-changelog-p authors-no-scan-file-p authors-obsolete-file-p authors-public-domain-p authors-scan-change-log authors-scan-el batch-update-authors byte-compile-file-form-define-abbrev-table byte-compile-track-mouse byte-optimize-zerop c-change-set-fl-decl-start c-context-set-fl-decl-start c-set-fl-decl-start calbsp;vc-rcs-state-heuristic vc-rollback vc-sccs-dir-status vc-sccs-rollback vc-sccs-state-heuristic vc-stay-local-p vc-svn-could-register vc-svn-dir-status vc-svn-repository-hostname vc-svn-state-heuristic vc-workfile-unchanged-p vhdl-goto-line view-other-diary-entries w3-parse-buffer w32-using-nt w32-version window--even-window-heights window--size-ignore-p window-split-min-size woman-mapcan would-be-symbol x-selection-owner-p x-valid-simple-selection-p xterm-mouse--read-event-sequence-1000 xterm-mouse--read-event-sequence-1006)
+ (added \(setf\ ede-object-keybindings\) \(setf\ ede-object-menu\) \(setf\ ede-object-sourcecode\) \(setf\ gnus-icalendar-event:description\) \(setf\ gnus-icalendar-event:end-time\) \(setf\ gnus-icalendar-event:location\) \(setf\ gnus-icalendar-event:me-dispatch xwidget-webkit-adjust-size-to-content xwidget-webkit-adjust-size-to-window xwidget-webkit-back xwidget-webkit-begin-edit-textarea xwidget-webkit-bookmark-make-record xwidget-webkit-browse-url xwidget-webkit-callback xwidget-webkit-copy-selection-as-kill xwidget-webkit-current-session xwidget-webkit-current-url xwidget-webkit-end-edit-textarea xwidget-webkit-execute-script-rv xwidget-webkit-fit-width xwidget-webkit-get-selection xwidget-webkit-goto-url xwidget-webkit-insert-string xwidget-webkit-last-session xwidget-webkit-mode xwidget-webkit-new-session xwidget-webkit-reload xwidget-webkit-scroll-backward xwidget-webkit-scroll-down xwidget-webkit-scroll-forward xwidget-webkit-scroll-up xwidget-webkit-show-id-element xwidget-webkit-show-id-or-named-element xwidget-webkit-show-named-element zerop--anon-cmacro))
+ (variables
+ (removed abbreviated-calendar-year all-bahai-calendar-holidays all-christian-calendar-holidays all-hebrew-calendar-holidays all-islamic-calendar-holidays american-calendar-display-form american-date-diary-pattern authors-aliases authors-ambiguous-files authors-coding-system authors-fixed-case authors-fixed-entries authors-ignored-files authors-lax-changelogs authors-many-files authors-no-scan-regexps authors-obsolete-files-regexps authors-public-domain-files authors-renamed-files-alist authors-renamed-files-regexps authors-valid-file-names bahai-diary-entry-symbol bahai-holidays c-font-lock-maybe-decl-faces cal-menu-load-hook cal-x-load-hook calendar-after-frame-setup-hooks capitalized-find-word-boundary-function-table capitalized-words-mode capitalized-words-mode-hook cc-bytecomp-noruntime-functions chinesiquify-ask-about-buffer-names-p vc-default-init-revision vc-disable-async-diff vc-keep-workfiles vc-mcvs-diff-switches vc-mcvs-global-switches vc-mcvs-header vc-mcvs-register-switches vc-mcvs-use-edit vc-mistrust-permissions vc-stay-local view-calendar-holidays-initially view-diary-entries-initially window-system-initialization-alist x-last-selected-text)
+ (added Info-mode-font-lock-keywords archive-visit-single-files auto-revert-buffers-counter auto-revert-buffers-counter-lockedout autoload-ensure-writable bidi-directional-controls-chars bidi-directional-non-controls-chars browse-url-chrome-arguments browse-url-chrome-program browse-url-conkeror-arguments browse-url-conkeror-new-window-is-buffer browse-url-conkeror-program bruce-phrase-default-count bruce-phrases-file byte-compile-new-defuns c--mapcan-status c-ation xref-etags-mode xref-etags-mode--saved xref-etags-mode-hook xref-file-location xref-item xref-location xref-marker-ring-length xref-match-item xref-mode-local-find-overloadable-regexp xref-prompt-for-identifier xref-show-xrefs-function xterm-mouse-tracking-disable-sequence xterm-mouse-tracking-enable-sequence xterm-mouse-utf-8 xwidget-webkit-activeelement-js xwidget-webkit-last-session-buffer xwidget-webkit-mode-abbrev-table xwidget-webkit-mode-hook xwidget-webkit-mode-map xwidget-webkit-mode-syntax-table))
+ (features
+ (removed authors gnus-setup vc-mcvs w32-common-fns)
+ (added bruce char-fold charscript cl-generic cl-preloaded cl-seq cp51932 cursor-sensor dom ede/detect eieio-compat elisp-mode eucjp-ms generator gnus-cloud inline let-alist map nsm obarray pinentry project sasl-scram-rfc sasl-scram-sha-1 seq thunk url-tramp vc-filewise vc-src xref xwidget)))
+ ((25 2)
+ (functions
+ (removed electric--insertable-p)
+ (added term--xterm-paste tex-handle-newline))
+ (variables
+ (removed)
+ (added inhibit-compacting-font-caches))
+ (features
+ (removed)
+ (added)))
+ ((25 3)
+ (functions
+ (removed)
+ (added))
+ (variables
+ (removed)
+ (added))
+ (features
+ (removed)
+ (added)))
+ ((26 1)
+ (functions
+ (removed 8859-1-map 8859-to-swascii-buffer Buffer-menu-info-node-description Man-quit ad-Advice-find-tag auto-source--symbol-keyword autoload-ensure-default-file c-clear-cpp-delimiters c-comment-out-cpps c-neutralize-syntax-in-and-mark-CPP c-set-cpp-delimiters c-state-semi-safe-place c-uncomment-out-cpps c-with-all-but-one-cpps-commented-out c-with-cpps-commented-out-n-minibuffer)
+ (added Buffer-menu-unmark-all Buffer-menu-unmark-all-buffers Info-node-description ad-Advice-exchange-point-and-mark ad-Advice-pop-global-mark ad-Advice-pop-to-mark-command ad-Advice-xref-find-definitions add-variable-watcher advice--where all-threads allout-count-trailing-whitespace-region allout-nullify-prefix-data allout-produce-mode-menubar-entries allout-regexp-sans-escapes allout-set-regexp allout-solicit-char-in-string and-let* ansible-inventory-generic-mode apropos-local-value apropos-local-variable arabic-shape-gstring auth-source--decode-octal-string auth-source--symbol-keyword auth-source-backends-parser-file auth-source-backends-parser-macos-keychain auth-source-backends-parser-secrets auth-source-pass--build-result auth-source-pass--do-debug auth-source-pass--entry-valid-p auth-source-pasp xref-quit-and-goto-xref xwidget-webkit-adjust-size-in-frame xwidget-webkit-auto-adjust-size xwidget-webkit-scroll-bottom xwidget-webkit-scroll-top xwidget-webkit-show-element xwidget-webkit-zoom-in xwidget-webkit-zoom-out))
+ (variables
+ (removed *orgtbl-default-fmt* *orgtbl-efmt* *orgtbl-fmt* *orgtbl-hline* *orgtbl-lend* *orgtbl-lfmt* *orgtbl-llend* *orgtbl-llfmt* *orgtbl-llstart* *orgtbl-lstart* *orgtbl-rtn* *orgtbl-sep* *orgtbl-table* 8859-1-map 8859-to-swascii-trans ansi-color-drop-regexp ansi-color-regexp antlr-default-face antlr-keyword-face antlr-literal-face antlr-ruledef-face antlr-ruleref-face antlr-syntax-face antlr-tokendef-face antlr-tokenref-face auth-source-magic awk-font-lock-syntactic-keywords battery--linux-sysfs-regexp c--m tramp-gw-gw-proc tramp-gw-gw-vector tramp-gw-socks-method tramp-gw-tunnel-method tramp-gw-vector tramp-obsolete-methods tramp-parse-time-months tramp-rfn-eshadow-update-overlay-regexp tramp-warned-obsolete-methods verilog-font-grouping-keywords-face viper-buffer-undo-list-mark viper-undo-needs-adjustment whitespace-indent-tabs-mode whitespace-tab-width window-sides window-text-change-functions woman-justify-list xref--window)
+ (added Buffer-menu-del-char Buffer-menu-marker-char Man-coding-system align-regexp-history ansi-color-control-seq-regexp arabic-shape-log arabic-shaper-ZWNJ-handling async-shell-command-display-buffer attempt-orderly-shutdown-on-fatal-signal attempt-stack-overflow-recovery auth-source-backend-parser-functions auth-source-pass-backend auto-save--timer auto-save-visited-interval asyntax-table xdg-desktop-entry-regexp xdg-desktop-group-regexp xdg-line-regexp xdg-user-dirs xref--original-window xref--original-window-intent))
+ (features
+ (removed awk-mode gnus-ems gnus-sync iso-acc iso-insert iso-swed messcompat mh-acros nxml-glyph nxml-uchnm ob-scala ob-sh pinentry resume scribe spell swedish sym-comp tramp-gw)
+ (added auth-source-pass charprop cl-print composite dired-loaddefs display-line-numbers eieio-loaddefs flymake-proc gnus-rfc1843 htmlfontify-loaddefs ibuffer-loaddefs isearch less-css-mode mhtml-mode ob-J ob-abc ob-coq ob-ebnf ob-forth ob-groovy ob-hledger ob-lua ob-processing ob-sed ob-shell ob-stan ob-vala org-duration org-eww org-lint pixel-scroll ps-print-loaddefs puny radix-tree reftex-loaddefs replace rmail-loaddefs rmc svg term/tty-colors text-mode timer-list xdg)))
+ ((26 2)
+ (functions
+ (removed dired--yes-no-all-quit-help shadow-get-user shadow-make-cluster shadow-parse-fullname)
+ (added assoc-delete-all calc-graph-w32-p copy-shadow-cluster ibuffer-do-toggle-lock make-shadow-cluster make-shadow-cluster--cmacro package--user-installed-p read-answer shadow-cluster-name--cmacro shadow-cluster-p shadow-cluster-p--cmacro shadow-cluster-primary--cmacro shadow-cluster-regexp--cmacro shadow-name-site shadow-site-name soap-type-of term--bash-needs-EMACSp term-watch-for-password-prompt thread-live-p))
+ (variables
+ (removed dired-delete-help last--line-number-width prolog-hungry-delete-key-flag)
+ (added byte-compile--default-val cl-print--depth cl-struct-shadow-cluster-tags ido-fallback read-answer-map--memoize read-answer-short term--bash-needs-EMACS-status xft-ignore-color-fonts))
+ (features
+ (removed)
+ (added threads)))
+ ((26 3)
+ (functions
+ (removed gnus-summary-sort-by-mark)
+ (added dir-locals--get-sort-score dir-locals--sort-variables gnus-summary-sort-by-marks package--buffer-string package--cs))
+ (variables
+ (removed)
+ (added help-enable-completion-auto-load))
+ (features
+ (removed)
+ (added)))
+ ((27 1)
+ (functions
+ (removed Edit-options-mode Edit-options-modify Edit-options-nil Edit-options-set Edit-options-t Edit-options-toggle Footnote-add-footnote Footnote-assoc-index Footnote-back-to-message Footnote-current-regexp Footnote-cycle-style Footnote-delete-footnote Footnote-english-lower Footnote-english-upper Footnote-goto-char-point-max Footnote-goto-footnote&nbc-diff-switches-list vc-hg--time-to-fixnum vc-next-comment vc-previous-comment view-todo viper-read-key viper-read-key-sequence vm-mode vm-save-message w3m-toggle-inline-images winner-edges winner-window-list with-connection-local-profiles xesam-buffer-name xesam-dbus-call-method xesam-delete-search-engine xesam-get-cached-property xesam-get-hits xesam-get-property xesam-highlight-string xesam-kill-buffer-function xesam-minor-mode xesam-mode xesam-new-search xesam-refresh-entry xesam-refresh-search-buffer xesam-search xesam-search-engines xesam-set-cached-property xesam-set-property xesam-signal-handler xref--find-buffer-visiting xref--pop-to-location)
+ (added \(setf\ jsonrpc--deferred-actions\) \(setf\ jsonrpc--events-buffer\) \(setf\ jsonrpc--events-buffer-scrollback-size\)&nind-definitions-at-mouse xref-matches-in-directory xref-matches-in-files xref-pop-to-location xref-references-in-directory xref-revert-buffer xref-set-marker-ring-length y-or-n-p-insert-n y-or-n-p-insert-other y-or-n-p-insert-y))
+ (variables
+ (removed * ** *** *1 *2 *3 Edit-options-mode-abbrev-table Edit-options-mode-hook Edit-options-mode-map Edit-options-mode-syntax-table ada-2005-keywords ada-83-keywords ada-95-keywords ada-align-list ada-align-modes ada-align-region-separate ada-always-ask-project ada-auto-case ada-block-label-re ada-block-start-re ada-body-suffixes ada-broken-decl-indent ada-broken-indent ada-case-attribute ada-case-exception ada-case-exception-file ada-case-exception-substring ada-case-identifier ada-case-keyword&nbxesam-engine xesam-fulltext-query xesam-hits-per-page xesam-interface-search xesam-minibuffer-query-history xesam-minibuffer-vendor-history xesam-minor-mode xesam-minor-mode-hook xesam-mode-abbrev-table xesam-mode-hook xesam-mode-map xesam-mode-syntax-table xesam-notify-function xesam-objects xesam-path-search xesam-query xesam-query-type xesam-refreshing xesam-search xesam-search-engines xesam-service-search xesam-to xesam-type xesam-user-query xesam-vendor xesam-xml-string xref--last-visiting-buffer)
+ (added Man--window-state-change-timer Man-columns Man-width-max add-log-dont-create-changelog-file after-delete-frame-functions after-focus-change-function after-set-visited-file-name-hook amalgamating-undo-limit apropos--current async-shell-command-width auth-source--session-nonce&n;wordstar-mode wordstar-mode-lighter wordstar-mode-major-mode wordstar-mode-set-explicitly xdg-mime-table xref--fetcher xref--last-file-buffer xref--transient-buffer-mode-abbrev-table xref--transient-buffer-mode-hook xref--transient-buffer-mode-map xref--transient-buffer-mode-syntax-table xref-file-name-display xref-show-definitions-function y-or-n-p-history-variable y-or-n-p-map zeroconf-service-type-browser-handler-running))
+ (features
+ (removed ada-mode ada-prj ada-stmt ada-xref ob-keys options org-bbdb org-bibtex org-docview org-eshell org-eww org-gnus org-info org-irc org-mhe org-rmail org-w3m xesam)
+ (added backtrace display-fill-column-indicator erc-loaddefs exif faceup fileloop flymake-cc image-converter info-edit iso8601 jsonrpc ob-eshell ol ol-bbdb ol-bibtex ol-docview ol-eshell ol-eww ol-gnus ol-info ol-irc ol-mhe ol-rmail ol-w3m org-attach-git org-goto org-keys org-num org-tempo pinyin so-long tab-bar tab-line text-property-search thread tramp-archive tramp-gvfs tramp-integration tramp-rclone tramp-sudoedit)))
+ ((27 2)
+ (functions
+ (removed org--property-global-value org--setup-collect-keywords org-attach-expand-link org-attach-export-link org-attach-open-link org-attach-store-link org-babel-clojure-cider-current-ns org-babel-clojure-initiate-session org-babel-clojure-var-to-clojure org-babel-prep-session:clojure org-babel-variable-assignments:clojure org-columns-set-tags-or-toggle org-encrypt-string)
+ (added backtrace--to-string dbus-get-other-registered-property dbus-get-this-registered-property debug-help-follow debugger-insert-backtrace debugger-toggle-locals fit-frame-to-buffer-1 fit-mini-frame-to-buffer ob-clojure-eval-with-cider ob-clojure-eval-with-inf-clojure ob-clojure-eval-with-slime ob-clojure-inf-clojure-output ob-clojure-string-or-list ob-clojure-with-temp-expanded org--backward-paragraph-once org--collect-keywords-1 org--create-inline-image org--forward-paragraph-once org--hide-wrapper-toggle org--line-fully-invisible-p org--newline org--paragraph-at-point org--property-global-or-keyword-value org--set-faces-extend org-agenda--get-buffer-name org-agenda-ctrl-c-ctrl-c org-agenda-do-in-region org-agenda-end-of-line org-agenda-maybe org-in-archived-heading-p org-link--context-from-region org-link--normalize-string org-link-open-as-file org-list-checkbox-radio-mode org-md--convert-to-html org-md--identity org-newline-and-indent org-priority-show org-priority-to-value org-property-global-value org-refile-copy org-return-and-maybe-indent org-scroll org-table-collapse-header org-table-header-line-mode org-table-header-set-header org-table-row-get-visible-string org-toggle-radio-button org-up-heading-or-point-min tramp-adb-get-signal-strings tramp-get-remote-awk tramp-get-remote-busybox tramp-get-remote-hexdump tramp-get-remote-od tramp-sh-get-signal-strings tramp-unquote-file-local-name))
+ (variables
+ (removed org-babel-clojure-sync-nrepl-timeout org-dcst org-export-special-keywords org-f org-file-properties org-hide-leading-stars-before-indent-mode org-l org-m org-remove-priority-next-time tramp-awk-coding-test)
+ (added c-recognize-bare-brace-inits finder-buffer org-agenda-filter-hook org-agenda-loop-over-headlines-in-active-region org-agenda-sort-noeffort-is-high org-agenda-sort-notime-is-late org-archive-subtree-save-file-p org-babel-default-header-args:clojurescript org-babel-haskell-compiler org-babel-header-args:clojurescript org-babel-header-args:haskell org-babel-lilypond-commands org-babel-shell-results-defaults-to-output org-clock-auto-clockout-timer org-columns-header-line-remap org-comment-regexp org-display-remote-inline-images org-fontify-todo-headline org-html-equation-reference-format org-html-prefer-user-labels org-id-overriding-file-name org-keyword-properties org-keyword-regexp org-latex-to-html-convert-command org-list-checkbox-radio-mode org-list-checkbox-radio-mode-hook org-logbook-drawer-re org-plantuml-exec-mode org-plantuml-executable-args org-plantuml-executable-path org-priority-default org-priority-enable-commands org-priority-get-priority-function org-priority-highest org-priority-lowest org-scroll-position-to-restore org-show-notification-timeout org-src--saved-temp-window-config org-startup-numerated org-table-header-line-mode org-table-header-line-mode-hook org-table-header-line-p org-table-header-overlay org-ts--internal-regexp tramp-compat-emacs-compiled-version tramp-gvfs-unload-hook tramp-hexdump-awk-encode tramp-hexdump-encode tramp-od-awk-encode tramp-od-encode tramp-smb-options tramp-system-name))
+ (features
+ (removed)
+ (added org-refile)))
+ ((28 1)
+ (functions
+ (removed Math-natnum-lessp add-menu add-menu-item add-menu-item-1 advertised-xscheme-send-previous-expression allocate-event allout-init allout-run-unit-tests allout-setup-menubar allout-test-range-overlaps allout-test-resumptions allout-tests-obliterate-variable allout-widgets-run-unit-tests antlr-default-directory antlr-read-shell-command antlr-with-displaying-help-buffer antlr-with-syntax-table archive-mode-revert battery-upower-prop bbdb-buffer bbdb-create-internal bbdb-gethash bbdb-records bibtex-vec-incr bookmark-jump-noselect browse-url-cci browse-url-mosaic buffer-syntactic-context buffer-syntactic-context-depth button-event-p button-press-event-p button-release-event--location-child-p xref-location-list-p xref-location-p xref-match-item xref-match-item--anon-cmacro xref-match-item--eieio-childp xref-match-item-child-p xref-match-item-list-p)
+ (added \(setf\ xref-item-location\) \(setf\ xref-item-summary\) \(setf\ xref-match-item-length\) \(setf\ xref-match-item-location\) \(setf\ xref-match-item-summary\) Buffer-menu--dynamic-name-width Buffer-menu-mode-menu Info-context-menu abbrev--suggest-above-threshold abbrev--suggest-count-words abbrev--suggest-get-active-abbrev-expansions abbrev--suggest-get-active-tables-including-parents abbrev--suggest-get-previous-words abbrev--suggest-get-totals abbrev--suggest-inform-user abbrev--suggest-maybe-suggest abbrev--suggest-shortest-abbrev abbrev-suggest-show-report abort-minibuffers activate-transient-input-method advice--maplit-below xwidget-webkit-clone-and-split-right xwidget-webkit-forward xwidget-webkit-save-as-file xwidget-webkit-scroll-down-line xwidget-webkit-scroll-up-line xwidget-window-inside-pixel-height xwidget-window-inside-pixel-width yank-from-kill-ring))
+ (variables
+ (removed GOLD-map add-menu-item-count allout-run-unit-tests-on-load allout-tests-globally-true allout-tests-globally-unbound allout-tests-locally-true allout-widgets-run-unit-tests-on-load auto-revert--buffers-by-watch-descriptor binhex-temporary-file-directory bookmark-read-annotation-text-func browse-url-CCI-host browse-url-CCI-port browse-url-mosaic-arguments browse-url-mosaic-pidfile browse-url-mosaic-program bubbles-game-theme-menu bubbles-graphics-theme-menu buffer buffer-menu-mode-hook byte-catch byte-compile--use-otespace-errbuf whitespace-global-mode whitespace-global-mode-hook whitespace-highlighted-space whitespace-indent-regexp whitespace-mode-line whitespace-modes whitespace-rescan-timer whitespace-rescan-timer-time whitespace-silent whitespace-spacetab-regexp whitespace-unload-hook whitespace-version xref-bogus-location xref-buffer-location xref-etags-location xref-file-location xref-item xref-location xref-match-item)
+ (added Buffer-menu-mode-menu Info--current-index-alternative Info-warn-on-index-alternatives-wrap Man-ansi-color-basic-faces-vector abbrev--suggest-saved-recommendations abbrev-suggest abbrev-suggest-hint-threshold ansi-color-basic-faces-vector ansi-color-bold-is-bright ansi-color-bright-colors-vector ansi-color-for-compilation-mode ansi-color-normal-colors-vector archive-alternate-hidden-columnto-first-xref xref-search-program xref-search-program-alist xref-truncation-width xwidget-webkit-bookmark-jump-new-session xwidget-webkit-download-dir y-or-n-p-use-read-key yank-from-kill-ring-rotate))
+ (features
+ (removed ledit levents lmenu lucid ob-J ob-abc ob-asymptote ob-coq ob-ebnf ob-hledger ob-io ob-ledger ob-mscgen ob-picolisp ob-shen ob-stan ob-vala)
+ (added cl-font-lock comp comp-cstr dictionary dictionary-connection dynamic-setting emoji-zwj erc-status-sidebar etc-authors-mode eudcb-macos-contacts gnus-dbus gnus-search hierarchy kinsoku memory-report nnselect ob-julia oc oc-basic oc-biblatex oc-csl oc-natbib ol-doi ol-man org-link-doi ox-koma-letter rfc6068 sasl-scram-sha256 shortdoc texinfo-loaddefs tramp-crypt tramp-fuse tramp-sshfs transient window)))
+ ((28 2)
+ (functions
+ (removed kdb-macro-redisplay)
+ (added describe-function--helper describe-key--helper desktop--on-kill gdb-breakpoints--add-breakpoint-row kmacro-redisplay org-file-has-changed-p org-replace-buffer-contents tramp-adb-tolerate-tilde tramp-fuse-remove-hidden-files tramp-get-remote-dev-tty tramp-scp-force-scp-protocol tramp-sshfs-handle-file-writable-p tramp-sshfs-handle-set-file-times tramp-sshfs-tolerate-tilde))
+ (variables
+ (removed)
+ (added org-cite-basic--file-id-cache org-file-has-changed-p--hash-table tramp-adb-unload-hook tramp-fuse-remove-hidden-files tramp-lock-pid tramp-scp-force-scp-protocol tramp-sshfs-unload-hook tramp-tolerate-tilde))
+ (features
+ (removed)
+ (added)))
+ ((29 1)
+ (functions
+ (removed Electric-buffer-menu-mode PC-bindings PC-chop-word PC-chunk-after PC-complete PC-complete-and-exit PC-complete-as-file-name PC-complete-space PC-complete-word PC-completion-help PC-do-complete-and-exit PC-do-completion PC-force-complete-and-exit PC-include-file-all-completions PC-include-file-path PC-lisp-complete-symbol PC-look-for-include-file PC-read-file-nak--fontify-key vc-string-prefix-p vc-toggle-read-only view-return-to-alist-update w32-batch-update-autoloads warning-suppress-action warning-suppress-log-action wdired-isearch-filter-read-only which-func-mode whitespace-empty-at-bob-regexp whitespace-empty-at-eob-regexp whitespace-looking-back window--preservable-size window-redisplay-end-trigger with-custom-print with-custom-print-funcs with-js x-dnd-get-drop-width-height x-dnd-get-drop-x-y x-selection)
+ (added \(setf\ eglot--capabilities\) \(setf\ eglot--file-watches\) \(setf\ eglot--inferior-process\) \(setf\ eglot--inhibit-autoreconnect\) \(setf\ eglot--language-id\) \(setf\ eglot--major-modes\) \(setf\ eglot--managed-buffers\) \(setf\ eglot--progress-reporters\) \(setf\ eglot--project\) \(setf\ eglot--project-nicknamenbsp;yank-in-context yank-in-context--transform yank-media yank-media--find-matching-media yank-media--get-selection yank-media--utf-16-p yank-media-handler yank-media-types yank-media-types--format))
+ (variables
+ (removed Buffer-menu-buffer+size-width Info-edit-map PC-completion-as-file-name-predicate PC-default-bindings PC-delim-regex PC-delims PC-delims-list PC-disable-includes PC-do-completion-end PC-env-vars-alist PC-first-char PC-goto-end PC-ignored-extensions PC-ignored-regexp PC-include-file-path PC-lisp-complete-end PC-meta-flag PC-ndelims-regex PC-not-minibuffer PC-word-delimiters PC-word-failed-flag advice--bytecodes advice--where-alist allout-abbreviate-flattened-numbering allout-exposure-change-hook allout-mode-deactivate-hook allout-structe-hook unify-8859-on-encoding-mode unify-8859-on-encoding-mode-hook vc-arch-command view-remove-frame-by-deleting view-return-to-alist whitespace-font-lock-refontify window-system-version winner-mode-leave-hook xref--marker-ring)
+ (added Buffer-menu-buffer-list Buffer-menu-filter-predicate Info-minibuf-history advice--how-alist after-pdump-load-hook animate-total-added-delay ansi-color--control-seq-fragment-regexp ansi-osc--marker ansi-osc-control-seq-regexp ansi-osc-for-compilation-buffer ansi-osc-handlers ansi-osc-hyperlink--state ansi-osc-hyperlink-map ansi-osc-window-title auth-source-pass--match-regexp auth-source-pass-extra-query-keywords auto-save-visited-predicate backtrace-on-redisplay-error bash-ts-mode-abbrev-table bash-ts-mode-hook bash-ts-mode-map battery-update-functions bib-unread-file bebkit--loading-p xwidget-webkit--progress-update-timer xwidget-webkit-buffer-name-format xwidget-webkit-cookie-file xwidget-webkit-edit-mode xwidget-webkit-edit-mode-hook xwidget-webkit-edit-mode-map xwidget-webkit-history--session xwidget-webkit-history-mode-abbrev-table xwidget-webkit-history-mode-hook xwidget-webkit-history-mode-map xwidget-webkit-history-mode-syntax-table xwidget-webkit-isearch--is-reverse xwidget-webkit-isearch--read-string-buffer xwidget-webkit-isearch--string xwidget-webkit-isearch-mode xwidget-webkit-isearch-mode-hook xwidget-webkit-isearch-mode-map xwidget-webkit-tool-bar-map yaml-ts-mode--font-lock-settings yaml-ts-mode--syntax-table yaml-ts-mode-abbrev-table yaml-ts-mode-hook yaml-ts-mode-map yank-media--registered-handlers yank-menu-max-items yank-transform-functions))
+ (features
+ (removed abbrevlist assoc complete cust-print eieio-loaddefs erc-hecomplete etc-authors-mode fast-lock hol-loaddefs htmlfontify-loaddefs lazy-lock mailpost mouse-sel pc-mode pc-select rmail-loaddefs s-region sregex)
+ (added ansi-osc bind-key c-ts-common c-ts-mode cmake-ts-mode csharp-mode dockerfile-ts-mode eglot em-elecslash em-extpipe emacs-authors-mode emacs-news-mode emoji epa-ks erc-common erc-sasl erc-sasl-ecdsa-nist256p-challenge erc-sasl-external erc-sasl-plain erc-sasl-scram-sha-1 erc-sasl-scram-sha-256 erc-sasl-scram-sha-512 erts-mode eudc-capf eudcb-ecomplete eudcb-mailabbrev external-completion generate-lisp-file glyphless-mode go-ts-mode holiday-loaddefs icons idna-mapping ietf-drums-date image-crop image-dired-dired image-dired-external image-dired-tags image-dired-util indonesian java-ts-mode json-ts-mode keymap loaddefs-gen mh-acros multisession oc-bibtex oclosure org-cycle org-fold org-fold-core org-persist package-vc pcmpl-git pgtk-dnd philippine pixel-fill range ruby-ts-mode rust-ts-mode sqlite sqlite-mode string-edit tai-viet-util textsec textsec-check theme-loaddefs toml-ts-mode tramp-container treesit typescript-ts-mode uni-confusable uni-scripts use-package use-package-bind-key use-package-core use-package-delight use-package-diminish use-package-ensure use-package-ensure-system-package use-package-jump use-package-lint vtable wallpaper word-wrap-mode yaml-ts-mode yank-media)))
+ ((29 2)
+ (functions
+ (removed face-remap--copy-face internal--unlabel-restriction js--treesit-property-not-function-p js-jsx--treesit-font-lock-compatibility-bb1f97b python--treesit-fontify-string-interpolation ruby-ts--parser-after-change tramp-docker--completion-function transient--ensure-infix-command transient--suffix-command transient--suffix-symbol)
+ (added c-ts-mode--else-heuristic c-ts-mode--emacs-defun-body-p c-ts-mode--first-sibling custom-icon-action custom-icon-mark-to-reset-standard custom-icon-mark-to-save custom-icon-reset-saved custom-icon-reset-standard custom-icon-save custom-icon-state-set-and-redraw emacs-lisp-native-compile internal--labeled-widen js-ts--syntax-propertize org-babel--variable-assignments:fish python--treesit-fontify-dotted-decorator python--treesit-fontify-union-types python--treesit-fontify-union-types-strict python--treesit-syntax-propertize rust-ts-mode--comment-docstring tramp-action-otp-password tramp-compat-length< tramp-compat-length= tramp-compat-length> tramp-completion-handle-expand-file-name tramp-completion-handle-file-exists-p tramp-completion-handle-file-name-directory tramp-completion-handle-file-name-nondirectory tramp-container--completion-function tramp-crypt-handle-file-exists-p tramp-fuse-handle-file-exists-p tramp-skeleton-file-exists-p tramp-skeleton-file-name-all-completions tramp-ssh-option-exists-p tramp-string-empty-or-nil-p transient--wrap-command-29 transient--wrap-command-30 treesit--pre-redisplay treesit--pre-syntax-ppss treesit--syntax-propertize-notifier tsx-ts--syntax-propertize tsx-ts--syntax-propertize-captures typescript-ts--syntax-propertize))
+ (variables
+ (removed tramp-device-escape-sequence-regexp tramp-display-escape-sequence-regexp)
+ (added custom-icon-extended-menu js-ts--s-p-query python--treesit-builtin-types python--treesit-type-regex tramp-otp-password-prompt-regexp tramp-show-ad-hoc-proxies treesit--pre-redisplay-tick treesit--syntax-propertize-start tsx-ts--s-p-query typescript-ts--s-p-query))
+ (features
+ (removed)
+ (added c++-ts-mode)))
+ ((29 3)
+ (functions
+ (removed cmake-ts-mode--imenu cmake-ts-mode--imenu-1 dockerfile-ts-mode--imenu dockerfile-ts-mode--imenu-1)
+ (added cmake-ts-mode--function-name dockerfile-ts-mode--stage-name js--treesit-font-lock-compatibility-definition-feature tramp-crypt-cleanup-connection tsx-ts-mode--font-lock-compatibility-function-expression))
+ (variables
+ (removed)
+ (added org--latex-preview-when-risky tramp-pipe-stty-settings tramp-security-key-pin-regexp untrusted-content))
+ (features
+ (removed)
+ (added)))
+ ((29 4)
+ (functions
+ (removed)
+ (added go-ts-mode--method-elem-supported-p))
+ (variables
+ (removed)
+ (added))
+ (features
+ (removed)
+ (added)))
+ ((30 1)
+ (functions
+ (removed \(setf\ eglot--inferior-process\) \(setf\ eglot--language-id\) \(setf\ eglot--major-modes\) \(setf\ jsonrpc--events-buffer-scrollback-size\) \(setf\ jsonrpc--request-continuations\) apropos-documentation-check-elc-file backtrace--match-ellipsis-in-string backtrace-expand-ellipsis bs--remove-hooks bs--restore-window-config bs--track-window-changes byte-compile--suspicious-defcustom-choice byte-compile-and-folded byte-compile-backward-char byte-compile-backward-word byte-comps-parse-uhp vc-deduce-fileset-1)
+ (added \(setf\ built-in-class-docstring\) \(setf\ built-in-class-index-table\) \(setf\ built-in-class-name\) \(setf\ built-in-class-parents\) \(setf\ built-in-class-slots\) \(setf\ eglot--languages\) \(setf\ jsonrpc--continuations\) \(setf\ jsonrpc--sync-request-alist\) Buffer-menu--selection-message Buffer-menu-group-by-mode Buffer-menu-group-by-root Buffer-menu-group-sort-alphabetically Buffer-menu-toggle-internal Custom-dirlocals-menu Custom-dirlocals-revert-buffer Custom-dirlocals-save Custom-display-on-screen-keyboard-p Man-default-directory Man-header-file-path Man-shell-file-name advice--forward-p advice--interactive-form-1 align--rule-should-run analyze-text-conversion android-read-build-system android-read-build-time ange-ftp-file-group-gid r-string with--track-changes with-peg-rules with-tramp-debug-message with-tramp-suspended-timers with-tramp-timeout without-remote-files xref--revert-buffer xref-revert-buffer-restore-point yaml-ts-mode--fill-paragraph))
+ (variables
+ (removed advice--buffer-local-function-sample apropos-item bs--window-config-coming-from byte-compile--wide-docstring-substitution-len c-string-escaped-newlines cl--all-builtin-types cl--generic-struct-generalizer cl--typeof-types cl-struct-comp-ssa-tags cl-struct-kmacro-register-tags comp--typeof-builtin-types comp-fwprop-max-insns-scan comp-known-func-cstr-h comp-known-type-specifiers completion-base-affixes completion-use-base-affixes cperl-extra-perl-args cperl-font-lock-multiline cperl-font-lock-multiline-start dictionary-instances diff-unhandding-spec org-src--preserve-blank-line pcase-mutually-exclusive-predicates ruby-syntax-methods-before-regexp rx--charset-all scheme-sexp-comment-syntax-table tramp-compat-use-url-tramp-p tramp-completion-reread-directory-timeout tramp-vc-registered-read-file-names transient--active-infix transient--unset-incompatible treesit-block-type-regexp verilog-complete-reg verilog-declaration-re-1-macro verilog-declaration-re-1-no-macro verilog-declaration-re-2-macro verilog-declaration-re-2-no-macro verilog-symbol-re)
+ (added Buffer-menu-group-by Buffer-menu-group-sort-by Buffer-menu-show-internal Custom-dirlocals-menu Info--dont-hide-references Info-url-alist Man-prefer-synchronous-call Man-support-remote-systems ambiguous-width-chars android-fonts-enumerated async-shell-command-mode auto-coding-file-name blink-matching-parebar--refresh-skipped-count window-tool-bar-mode window-tool-bar-mode-hook window-tool-bar-mode-major-mode window-tool-bar-mode-set-explicitly window-tool-bar-string--cache xref--hits-file-prefix xref-mode-line-matches xref-num-matches-face xref-num-matches-found yes-or-no-prompt))
+ (features
+ (removed esh-groups legacy-gnus-agent)
+ (added comp-common comp-run compat completion-preview editorconfig editorconfig-conf-mode editorconfig-core editorconfig-core-handle editorconfig-fnmatch editorconfig-tools elixir-ts-mode erc-nicks ert-font-lock esh-module-loaddefs etags-regen heex-ts-mode html-ts-mode indent-aux lua-ts-mode nnatom nnfeed org-element-ast peg php-ts-mode touch-screen track-changes tramp-androidsu tramp-message visual-wrap which-key window-tool-bar))))
+
+;; Local Variables:
+;; no-byte-compile: t
+;; no-update-autoloads: t
+;; End:
--- /dev/null
+;;; package-lint-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*-
+;; Generated by the `loaddefs-generate' function.
+
+;; This file is part of GNU Emacs.
+
+;;; Code:
+
+(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path)))
+
+
+\f
+;;; Generated autoloads from package-lint.el
+
+(autoload 'package-lint-describe-symbol-history "package-lint" "\
+Show the version history of SYM, if any.
+
+(fn SYM)" t)
+(autoload 'package-lint-buffer "package-lint" "\
+Get linter errors and warnings for BUFFER.
+
+Returns a list, each element of which is list of
+
+ (LINE COL TYPE MESSAGE)
+
+where TYPE is either `warning' or `error'.
+
+Current buffer is used if none is specified.
+
+(fn &optional BUFFER)")
+(autoload 'package-lint-current-buffer "package-lint" "\
+Display lint errors and warnings for the current buffer." t)
+(autoload 'package-lint-batch-and-exit "package-lint" "\
+Run `package-lint-buffer' on the files remaining on the command line.
+Use this only with -batch, it won't work interactively.
+
+When done, exit Emacs with status 1 in case of any errors, otherwise exit
+with status 0. The variable `package-lint-batch-fail-on-warnings' controls
+whether or not warnings alone produce a non-zero exit code.")
+(autoload 'package-lint-looks-like-a-package-p "package-lint" "\
+Return non-nil if the current buffer appears to be intended as a package.")
+(register-definition-prefixes "package-lint" '("package-lint-"))
+\f
+;;; End of scraped data
+
+(provide 'package-lint-autoloads)
+
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; no-update-autoloads: t
+;; no-native-compile: t
+;; coding: utf-8-emacs-unix
+;; End:
+
+;;; package-lint-autoloads.el ends here
--- /dev/null
+;; -*- no-byte-compile: t; lexical-binding: nil -*-
+(define-package "package-lint" "20250828.1506"
+ "A linting library for elisp package authors."
+ '((emacs "24.4")
+ (let-alist "1.0.6"))
+ :url "https://github.com/purcell/package-lint"
+ :commit "f990665a1b4ca9eadbfcdb0b2a22fbb819e78ef4"
+ :revdesc "f990665a1b4c"
+ :keywords '("lisp")
+ :authors '(("Steve Purcell" . "steveNOSPAMsanityinc.com")
+ ("Fanael Linithien" . "fanael4NOSPAMgmail.com"))
+ :maintainers '(("Steve Purcell" . "steveNOSPAMsanityinc.com")
+ ("Fanael Linithien" . "fanael4@gmail.com")))
--- /dev/null
+;;; package-lint.el --- A linting library for elisp package authors -*- lexical-binding: t -*-
+
+;; Copyright (C) 2014-2020 Steve Purcell, Fanael Linithien
+
+;; Author: Steve Purcell <steveNOSPAMsanityinc.com>
+;; Fanael Linithien <fanael4NOSPAMgmail.com>
+;; URL: https://github.com/purcell/package-lint
+;; Keywords: lisp
+;; Package-Version: 20250828.1506
+;; Package-Revision: f990665a1b4c
+;; Package-Requires: ((emacs "24.4") (let-alist "1.0.6"))
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Provides a list of issues with the package metadata of a file,
+;; e.g. the package dependencies it requires.
+
+;; See function `package-lint-buffer'.
+
+;; Checks will currently be enabled only if a "Package-Requires:" or
+;; "Package-Version:" header is present in the file.
+
+;;; Code:
+
+(eval-when-compile (require 'pcase)) ; `pcase-dolist' is not autoloaded
+(require 'cl-lib)
+(require 'package)
+(require 'lisp-mnt)
+(require 'finder)
+(require 'imenu)
+(require 'let-alist)
+(require 'rx)
+
+
+(defvar package-lint-main-file nil
+ "For multi-file packages, set this to the main .el or -pkg.el file.
+
+When set, the package prefix and dependencies are obtained from
+that file instead of the buffer being linted. This allows
+package-lint to operate on secondary files in a package.
+
+The path can be absolute or relative to that of the linted file.")
+(put 'package-lint-main-file 'safe-local-variable #'stringp)
+
+\f
+;;; Compatibility
+
+(defalias 'package-lint--package-desc-summary
+ (if (fboundp 'package-desc-summary)
+ 'package-desc-summary
+ 'package-desc-doc))
+
+(defalias 'package-lint--package-desc-name
+ (if (fboundp 'package-desc-name)
+ 'package-desc-name
+ (lambda (desc) (intern (elt desc 0)))))
+
+(defalias 'package-lint--package-desc-from-define
+ (if (fboundp 'package-desc-from-define)
+ 'package-desc-from-define
+ (lambda (_name-string version-string &optional docstring requirements &rest _args)
+ (vector
+ (version-to-list version-string)
+ (mapcar
+ (lambda (x)
+ (list (nth 0 x) (version-to-list (nth 1 x))))
+ (nth 1 requirements))
+ docstring))))
+
+\f
+;;; Machinery
+
+(defvar package-lint--errors nil
+ "List of errors and warnings for the current buffer.
+This is bound dynamically while the checks run.")
+
+(defconst package-lint-emacs-head-version '(31)
+ "Version of Emacs HEAD.")
+
+(defconst package-lint-backport-libraries
+ (list (list 'cl-lib "\\`cl-")
+ (list 'cl-generic "\\`cl-\\(?:def\\)?generic")
+ (list 'cl-print "\\`cl-print")
+ (list 'compat "\\`compat-'")
+ (list 'jsonrpc "\\`jsonrpc-")
+ (list 'map "\\`map-")
+ (list 'nadvice "\\`advice-")
+ (list 'ol "\\`org-link-" 'org "9.3")
+ (list 'seq "\\`seq-")
+ (list 'transient "\\`transient-")
+ (list 'hierarchy "\\`hierarchy-")
+ (list 'let-alist "\\`let-alist"))
+ "A sequence of (FEATURE SYMBOL-NAME-MATCH) for backport libraries.
+These are libraries that are built into newer Emacsen and also
+published in ELPA for use by older Emacsen.
+
+Alternatively, items can take a form of (FEATURE
+SYMBOL-NAME-MATCH PACKAGE VERSION?) where PACKAGE is the name of
+a backport library shipping the feature and VERSION is an
+optional minimum version containing the feature.")
+
+(defun package-lint--load-data (file)
+ "Load sexp data from FILE."
+ (with-temp-buffer
+ (insert-file-contents
+ (expand-file-name file
+ (if load-file-name
+ (file-name-directory load-file-name)
+ default-directory)))
+ (read (current-buffer))))
+
+(defconst package-lint-symbol-info
+ (let* ((stdlib-changes (package-lint--load-data "data/stdlib-changes"))
+ (info (make-hash-table)))
+ (pcase-dolist (`(,version . ,data) stdlib-changes)
+ (pcase-dolist (`(,syms . ,action)
+ (let-alist data
+ (list (cons .variables.added 'variable-added)
+ (cons .variables.removed 'variable-removed)
+ (cons .features.added 'library-added)
+ (cons .features.removed 'library-removed)
+ (cons .functions.added 'function-added)
+ (cons .functions.removed 'function-removed))))
+ (dolist (sym syms)
+ (puthash sym (cons (cons action version) (gethash sym info)) info))))
+ info)
+ "A hash table from SYMBOL to a list of events in its history.
+Each event is of the form (ACTION . EMACS-VER), where ACTION is a
+symbol such as `variable-added'.")
+
+(defun package-lint-symbol-info (sym)
+ "Retrieve information about SYM, as an alist of (ACTION . EMACS-VER)."
+ (gethash (cl-etypecase sym
+ (string (intern sym))
+ (symbol sym))
+ package-lint-symbol-info))
+
+(defun package-lint--read-known-symbol (prompt)
+ "Read a symbol `package-lint-symbol-info' with PROMPT."
+ (let* ((at-point (symbol-at-point))
+ (s (completing-read
+ prompt
+ (cl-loop for k being the hash-keys of package-lint-symbol-info collect k)
+ nil
+ t
+ (when at-point (symbol-name at-point)))))
+ (when s (intern s))))
+
+;;;###autoload
+(defun package-lint-describe-symbol-history (sym)
+ "Show the version history of SYM, if any."
+ (interactive (list (package-lint--read-known-symbol "Show history of symbol: ")))
+ (message
+ (concat (format "History of %s:\n" sym)
+ (mapconcat (lambda (info)
+ (pcase-let ((`(,action . ,version) info))
+ (format "* %s in Emacs %s"
+ action (mapconcat 'number-to-string version "."))))
+ (sort (package-lint-symbol-info sym)
+ (lambda (a b) (version-list-<= (cdr a) (cdr b))))
+ "\n"))))
+
+(defun package-lint--added-or-removed-function-p (sym)
+ "Return t if SYM is a function added/removed in any known Emacs version."
+ (let-alist (package-lint-symbol-info sym)
+ (or .function-added .function-removed)))
+
+(defconst package-lint--compat-symbols
+ (package-lint--load-data "data/compat-symbols")
+ "A cons cell of (VARS . FUNCTIONS) supported by \"compat\".")
+
+(defun package-lint--supported-by-compat (type sym)
+ "Return non-nil if SYM is supported by the \"compat\" package.
+TYPE is `function' or `variable'."
+ (memq sym (pcase type
+ (`function (cdr package-lint--compat-symbols))
+ (_ nil))))
+
+(defconst package-lint--sane-prefixes
+ (rx
+ string-start
+ (or
+ "org-dblock-write:"
+ "org-babel-execute:"
+ "org-babel-expand-body:"
+ "org-babel-header-args:"
+ "org-babel-prep-session:"
+ "org-babel-variable-assignments:"
+ "org-babel-default-header-args:"
+ "pcomplete/"
+ "use-package-normalize/"
+ "use-package-handler/"
+ "use-package-autoloads/"))
+ "A regexp matching whitelisted non-standard symbol prefixes.")
+
+(defvar package-lint--allowed-prefix-mappings
+ '(("ob-" . ("org-"))
+ ("oc-" . ("org-"))
+ ("ol-" . ("org-"))
+ ("ox-" . ("org-")))
+ "Alist containing mappings of package prefixes to symbol prefixes.")
+
+(defun package-lint--main-file-p ()
+ "Return non-nil if the current buffer corresponds to the package's main file."
+ (or (null package-lint-main-file)
+ (null (buffer-file-name))
+ (string= (file-truename (expand-file-name package-lint-main-file))
+ (file-truename (buffer-file-name)))))
+
+(defun package-lint--check-all ()
+ "Return a list of errors/warnings for the current buffer."
+ (let ((package-lint--errors '())
+ (case-fold-search nil))
+ (save-match-data
+ (save-excursion
+ (save-restriction
+ (widen)
+ (let (prefix deps)
+ (if (package-lint--main-file-p)
+ (progn
+ ;; TODO: handle when the main file is a -pkg.el file
+ (setq prefix (package-lint--get-package-prefix))
+ (let ((desc (package-lint--check-package-el-can-parse)))
+ (when desc
+ (package-lint--check-package-summary desc)
+ (package-lint--check-provide-form desc)
+ (package-lint--check-no-emacs-in-package-name desc)))
+ (setq deps (package-lint--check-dependency-list))
+
+ (package-lint--check-url-header)
+ (package-lint--check-package-version-present)
+ (package-lint--check-commentary-existence))
+ ;; Need to look at the main file to find prefix and dependencies
+ (setq prefix (replace-regexp-in-string
+ "\\(-mode\\)?\\(-pkg\\)?\\'" ""
+ (file-name-sans-extension
+ (file-name-nondirectory package-lint-main-file))))
+ (let ((main-file package-lint-main-file))
+ (if (string-match-p "-pkg\\.el\\'" main-file)
+ (let ((expr (with-temp-buffer
+ (insert-file-contents (expand-file-name main-file))
+ (read (current-buffer)))))
+ (if (eq (car-safe expr) 'define-package)
+ (setq deps (package-desc-reqs (apply #'package-lint--package-desc-from-define (cdr expr))))
+ (package-lint--error-at-bob 'error (format "Malformed package descriptor file \"%s\"" main-file))))
+ (when (package-lint--goto-header "Package-Requires")
+ (package-lint--error-at-bol 'error "Package-Requires outside the main file have no effect."))
+ (package-lint--check-provide-form-secondary-file)
+ (condition-case err
+ (with-temp-buffer
+ (insert-file-contents (expand-file-name main-file))
+ (setq deps (package-desc-reqs (package-lint--liberal-package-buffer-info))))
+ (error
+ (package-lint--error-at-bob
+ 'error
+ (format "Error parsing main package file \"%s\": %s" main-file err)))))))
+
+ ;; Source code checks
+ (package-lint--check-keywords-list)
+ (package-lint--check-lexical-binding-is-on-first-line)
+ (package-lint--check-reserved-keybindings)
+ (when prefix
+ (package-lint--check-objects-by-regexp
+ (concat "(" (regexp-opt '("defalias" "defvaralias")) "\\s-")
+ (apply-partially #'package-lint--check-defalias prefix)))
+ (package-lint--check-objects-by-regexp
+ "(define-minor-mode\\s-"
+ #'package-lint--check-minor-mode)
+ (package-lint--check-objects-by-regexp
+ "(define-global\\(?:ized\\)?-minor-mode\\s-"
+ #'package-lint--check-globalized-minor-mode)
+ (package-lint--check-objects-by-regexp
+ "(defgroup\\s-" #'package-lint--check-defgroup)
+
+ (package-lint--check-no-use-of-cl)
+ (package-lint--check-no-use-of-cl-lib-sublibraries)
+ (package-lint--check-eval-after-load)
+ (package-lint--check-lexical-binding-requires-emacs-24 deps)
+ (package-lint--check-libraries-available-in-emacs deps)
+ (package-lint--check-libraries-removed-from-emacs)
+ (package-lint--check-macros-functions-available-in-emacs deps)
+ (package-lint--check-macros-functions-removed-from-emacs deps)
+ (package-lint--check-objects-by-regexp
+ (concat "(" (regexp-opt '("format" "message" "error")) "\\s-")
+ (apply-partially #'package-lint--check-format-string deps))
+ (package-lint--check-for-literal-emacs-path)
+ (let ((definitions (package-lint--get-defs)))
+ (package-lint--check-autoloads-on-private-functions definitions)
+ (when prefix
+ (package-lint--check-defs-prefix prefix definitions))
+ (package-lint--check-symbol-separators definitions)))
+ (package-lint--check-lonely-parens))))
+ (sort package-lint--errors
+ (lambda (a b)
+ (pcase-let ((`(,a-line ,a-column ,_ ,a-message) a)
+ (`(,b-line ,b-column ,_ ,b-message) b))
+ (cond
+ ((/= a-line b-line) (< a-line b-line))
+ ((/= a-column b-column) (< a-column b-column))
+ (t
+ (string-lessp a-message b-message))))))))
+
+(defun package-lint--error (line col type message)
+ "Construct a datum for error at LINE and COL with TYPE and MESSAGE."
+ (push (list line col type message) package-lint--errors))
+
+(defun package-lint--error-at-point (type message &optional pos)
+ "Construct a datum for error at POS with TYPE and MESSAGE.
+POS defaults to `point'."
+ (save-excursion
+ (when pos
+ (goto-char pos))
+ (package-lint--error (line-number-at-pos) (- (point) (line-beginning-position)) type message)))
+
+(defun package-lint--error-at-bol (type message)
+ "Construct an error at the beginning of the current line with TYPE and MESSAGE."
+ (package-lint--error (line-number-at-pos) 0 type message))
+
+(defun package-lint--error-at-bob (type message)
+ "Construct an error at the beginning of the buffer with TYPE and MESSAGE."
+ (package-lint--error 1 0 type message))
+
+\f
+;;; Checks
+
+(defun package-lint--check-reserved-keybindings ()
+ "Warn about reserved keybindings."
+ (let ((re (rx "(" (*? space) (or "kbd" "global-set-key" "local-set-key" "define-key") symbol-end)))
+ (goto-char (point-min))
+ (while (re-search-forward re nil t)
+ (unless (nth 8 (save-match-data (syntax-ppss)))
+ ;; Read form and get key-sequence
+ (goto-char (match-beginning 0))
+ (let ((seq (package-lint--extract-key-sequence
+ (read (current-buffer)))))
+ (when seq
+ (let ((message (package-lint--test-keyseq seq)))
+ (when message
+ (package-lint--error-at-point 'error message)))))))))
+
+(defun package-lint--check-commentary-existence ()
+ "Warn about nonexistent or empty commentary section."
+ (let ((start (lm-commentary-start)))
+ (if (null start)
+ (package-lint--error-at-bob
+ 'error
+ "Package should have a ;;; Commentary section.")
+ ;; Skip over the section header.
+ (goto-char start)
+ (forward-line)
+ (when (package-lint--region-empty-p (point) (lm-commentary-end))
+ (package-lint--error-at-point
+ 'error
+ "Package should have a non-empty ;;; Commentary section."
+ start)))))
+
+(defun package-lint--check-autoloads-on-private-functions (definitions)
+ "Verify that private functions DEFINITIONS don't have autoload cookies."
+ (pcase-dolist (`(,symbol . ,position) definitions)
+ (when (string-match-p (rx "--") symbol)
+ (goto-char position)
+ (forward-line -1)
+ (when (looking-at-p (rx ";;;###autoload"))
+ (package-lint--error-at-point
+ 'warning
+ "Private functions generally should not be autoloaded.")))))
+
+(defun package-lint--check-for-literal-emacs-path ()
+ "Verify package does not refer to \"\.emacs\.d\" literally.
+Instead it should use `user-emacs-directory' or `locate-user-emacs-file'."
+ (goto-char (point-min))
+ ;; \b won't find a word boundary between a symbol and the "." in
+ ;; ".emacs.d". / is a valid symbol constituent in Emacs Lisp, so
+ ;; must be explicitly blacklisted.
+ (while (re-search-forward "\\(?:\\_<\\|/\\)\\.emacs\\.d\\b" nil t)
+ (unless (nth 4 (syntax-ppss))
+ ;; Not in a comment
+ (package-lint--error-at-point
+ 'warning
+ "Use variable `user-emacs-directory' or function `locate-user-emacs-file' instead of a literal path to the Emacs user directory or files."))))
+
+(defun package-lint--check-keywords-list ()
+ "Verify that package keywords are listed in `finder-known-keywords'."
+ (when (package-lint--goto-header "Keywords")
+ (let ((err-pos (point)))
+ (let ((keywords (lm-keywords-list)))
+ (unless (cl-some (lambda (keyword) (assoc (intern keyword) finder-known-keywords)) keywords)
+ (package-lint--error-at-point
+ 'warning
+ (format "You should include standard keywords: see the variable `finder-known-keywords'.")
+ err-pos))))))
+
+(defun package-lint--check-url-header ()
+ "Verify that the package has an HTTPS or HTTP Homepage/URL header."
+ (if (package-lint--goto-header "\\(?:URL\\|Homepage\\)")
+ (progn
+ (when (looking-at "<.*>$")
+ (forward-char 1))
+ (let ((url (thing-at-point 'url)))
+ (unless (and url (string-match-p "^https?://" url))
+ (package-lint--error-at-point
+ 'error
+ "Package URLs should be a single HTTPS or HTTP URL."
+ (point)))))
+ (package-lint--error-at-bob
+ 'error
+ "Package should have a Homepage or URL header.")))
+
+(defun package-lint--check-dependency-list ()
+ "Check the contents of the \"Package-Requires\" header.
+Return a list of well-formed dependencies, same as
+`package-lint--check-well-formed-dependencies'."
+ (let ((deps (package-lint--goto-header "Package-Requires" t)))
+ (when deps
+ (when (listp deps)
+ (setq deps (mapconcat #'identity deps "")))
+ (let ((position (point)))
+ (condition-case err
+ (pcase-let ((`(,parsed-deps . ,parse-end-pos) (read-from-string deps)))
+ (unless (= parse-end-pos (length deps))
+ (package-lint--error-at-bol
+ 'error
+ "More than one expression provided."))
+ (let ((deps (package-lint--check-well-formed-dependencies position parsed-deps)))
+ (package-lint--check-emacs-version deps)
+ (package-lint--check-packages-installable deps)
+ (package-lint--check-deps-use-non-snapshot-version deps)
+ (package-lint--check-deps-do-not-use-zero-versions deps)
+ (package-lint--check-cl-lib-version deps)
+ deps))
+ (error
+ (package-lint--error-at-bol
+ 'error
+ (format "Couldn't parse \"Package-Requires\" header: %s" (error-message-string err)))
+ nil))))))
+
+(defun package-lint--check-well-formed-dependencies (position parsed-deps)
+ "Check that dependencies listed at POSITION are well-formed.
+These PARSED-DEPS must have the format (name \"version\").
+Return a list of well-formed dependencies, where each element is of
+the form (PACKAGE-NAME PACKAGE-VERSION DEP-POSITION)."
+ (let (valid-deps)
+ (dolist (entry parsed-deps)
+ (pcase entry
+ ((or (and `(,package-name ,package-version)
+ (guard (symbolp package-name))
+ (guard (stringp package-version)))
+ (and `(,package-name)
+ (guard (symbolp package-name)))
+ (and package-name
+ (guard (symbolp package-name))))
+ ;; Find the column at which the dependency is declared so we can
+ ;; properly report the position of errors.
+ (let ((dep-pos
+ (save-excursion
+ (goto-char position)
+ (let* ((symbol-pattern
+ (format "\\(%s\\)"
+ (regexp-quote (symbol-name package-name))))
+ (list-pattern
+ (format "( *%s\\(?:[^[:alnum:]_\\-].*?\\)?)"
+ symbol-pattern)))
+ (if (or (re-search-forward list-pattern (line-end-position) t)
+ (re-search-forward symbol-pattern (line-end-position) t))
+ (match-beginning 1)
+ position)))))
+ (unless package-version
+ (setq package-version "0"))
+ (if (ignore-errors (version-to-list package-version))
+ (push (list package-name
+ (version-to-list package-version)
+ dep-pos)
+ valid-deps)
+ (package-lint--error-at-point
+ 'error
+ (format "%S is not a valid version string: see `version-to-list'."
+ package-version)
+ dep-pos))))
+ (_
+ (package-lint--error-at-bol
+ 'error
+ (format "Expected (package-name \"version-num\"), but found %S." entry)))))
+ valid-deps))
+
+(defun package-lint--check-package-installable (archive-entry package-version dep-pos)
+ "Check that ARCHIVE-ENTRY is installable from a configured package archive.
+
+Check that package described by ARCHIVE-ENTRY can be installed at
+required version PACKAGE-VERSION. If not, raise an error for DEP-POS."
+ (let* ((package-name (car archive-entry))
+ (best-version (package-lint--highest-installable-version-of package-name)))
+ (when (version-list-< best-version package-version)
+ (package-lint--error-at-point
+ 'warning
+ (format "Version dependency for %s appears too high: try %s" package-name
+ (package-version-join best-version))
+ dep-pos))))
+
+(defun package-lint--check-emacs-version (valid-deps)
+ "Check that all VALID-DEPS are available for installation."
+ (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps)
+ (when (eq 'emacs package-name)
+ (cond
+ ((version-list-< package-version '(24))
+ (package-lint--error-at-point
+ 'error
+ "You can only depend on Emacs version 24 or greater: package.el for Emacs 23 does not support the \"emacs\" pseudopackage."
+ dep-pos))
+ ((version-list-<= package-lint-emacs-head-version package-version)
+ (package-lint--error-at-point
+ 'warning
+ "This makes the package uninstallable in all released Emacs versions."
+ dep-pos))))))
+
+(defun package-lint--check-packages-installable (valid-deps)
+ "Check that all VALID-DEPS are available for installation."
+ (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps)
+ (unless (eq 'emacs package-name)
+ (let ((archive-entry (append (assq package-name package-archive-contents)
+ (assq package-name package-alist))))
+ (if archive-entry
+ (package-lint--check-package-installable archive-entry package-version dep-pos)
+ (package-lint--error-at-point
+ 'error
+ (format "Package %S is not installable." package-name)
+ dep-pos))))))
+
+(defun package-lint--check-deps-use-non-snapshot-version (valid-deps)
+ "Warn about any VALID-DEPS on snapshot versions of packages."
+ (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps)
+ (unless (version-list-< package-version '(19001201 1))
+ (package-lint--error-at-point
+ 'warning
+ (format "Use a non-snapshot version number for dependency on \"%S\" if possible."
+ package-name)
+ dep-pos))))
+
+(defun package-lint--check-deps-do-not-use-zero-versions (valid-deps)
+ "Warn about VALID-DEPS on \"0\" versions of packages."
+ (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps)
+ (when (equal package-version '(0))
+ (package-lint--error-at-point
+ 'warning
+ (format "Use a properly versioned dependency on \"%S\" if possible."
+ package-name)
+ dep-pos))))
+
+(defun package-lint--check-lexical-binding-requires-emacs-24 (valid-deps)
+ "Warn about use of `lexical-binding' when Emacs 24.1 is not among VALID-DEPS."
+ (goto-char (point-min))
+ (when (package-lint--lexical-binding-declared-in-header-line-p)
+ (unless (assq 'emacs valid-deps)
+ (package-lint--error-at-point
+ 'warning
+ "You should depend on (emacs \"24.1\") if you need lexical-binding."
+ (match-beginning 1)))))
+
+(defun package-lint--inside-comment-or-string-p ()
+ "Return non-nil if point is inside a comment or string."
+ (let ((ppss (save-match-data (syntax-ppss))))
+ (or (nth 3 ppss) (nth 4 ppss))))
+
+(defun package-lint--seen-fboundp-check-for (sym)
+ "Return non-nil if a `fboundp' check for SYM is present before point."
+ (save-excursion
+ (save-match-data
+ (and (re-search-backward
+ (concat "(" (regexp-opt '("fboundp" "functionp" "macrop")) "\\s-+#?'" (regexp-quote sym) "\\_>") (point-min) t)
+ (not (package-lint--inside-comment-or-string-p))))))
+
+(defun package-lint--map-regexp-match (regexp callback)
+ "For every match of REGEXP, call CALLBACK with the first match group.
+If callback returns non-nil, the return value - which must be a
+list - will be applied to `package-lint--error-at-point'. If
+REGEXP doesn't produce a match group 1, then match group
+0 (ie. the whole match string string) will be passed to
+CALLBACK."
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (let ((sym (or (match-string-no-properties 1)
+ (match-string-no-properties 0))))
+ (save-excursion
+ (goto-char (or (match-beginning 1)
+ (match-beginning 0)))
+ (let ((err (funcall callback sym)))
+ (when err
+ ;; Check this as late as possible, just before reporting,
+ ;; because otherwise the checking process is extremely slow,
+ ;; being bottlenecked by `syntax-ppss'.
+ (unless (package-lint--inside-comment-or-string-p)
+ (apply #'package-lint--error-at-point err)))))))))
+
+(defun package-lint--quick-up-list ()
+ (if (eq ?\( (char-before))
+ (backward-char 1)
+ (backward-up-list)))
+
+(defun package-lint--is-a-let-binding ()
+ "Return non-nil if point is on a symbol being introduced by a let binding."
+ (let ((binding-pat (rx "(" (or "let" "let*" "cl-let") symbol-end)))
+ (condition-case _
+ (save-excursion
+ (save-match-data
+ (let ((was-first (eq ?\( (char-before))))
+ (package-lint--quick-up-list)
+ (package-lint--quick-up-list)
+ (or (looking-at binding-pat)
+ (when was-first
+ (package-lint--quick-up-list)
+ (looking-at binding-pat))))))
+ (scan-error nil))))
+
+(defun package-lint--check-version-regexp-list (valid-deps symbol-regexp type)
+ "Warn if symbols matched by SYMBOL-REGEXP are unavailable in the target Emacs.
+The target Emacs version is taken from VALID-DEPS, which are the
+declared dependencies of this package. TYPE is the
+type of the symbol, either FUNCTION or FEATURE."
+ (let ((emacs-version-dep (or (cadr (assq 'emacs valid-deps)) '(0))))
+ (package-lint--map-regexp-match
+ symbol-regexp
+ (lambda (sym)
+ (let-alist (package-lint-symbol-info sym)
+ (let ((added-in-version (pcase type
+ (`function .function-added)
+ (`feature .library-added))))
+ (when (and added-in-version (version-list-< emacs-version-dep added-in-version))
+ (let* ((available-backport-with-ver
+ (pcase type
+ (`feature
+ (cl-some (lambda (bp)
+ (when (string= (car bp) sym)
+ (or (cddr bp)
+ (list (car bp)))))
+ package-lint-backport-libraries))
+ (`function
+ (cl-some (lambda (bp)
+ (when (string-match-p (nth 1 bp) sym)
+ (or (cddr bp)
+ (list (car bp)))))
+ package-lint-backport-libraries))))
+ (available-backport (car available-backport-with-ver))
+ (required-backport-version (cadr available-backport-with-ver))
+ (matching-dep (when available-backport
+ (assoc available-backport valid-deps)))
+ (compat-support (package-lint--supported-by-compat type (intern sym)))
+ (compat-in-deps (assoc 'compat valid-deps)))
+ (unless (or
+ (and compat-support compat-in-deps)
+ (and matching-dep
+ (or (not required-backport-version)
+ (version-list-<= (version-to-list required-backport-version)
+ (cadr matching-dep))))
+ (and (eq type 'function)
+ (or (package-lint--seen-fboundp-check-for sym)
+ (package-lint--is-a-let-binding))))
+ (list
+ 'error
+ (format "You should depend on (emacs \"%s\")%s%s if you need `%s'."
+ (mapconcat #'number-to-string added-in-version ".")
+ (if available-backport
+ (format " or the %s package"
+ (if required-backport-version
+ (format "(%s \"%s\")"
+ available-backport
+ required-backport-version)
+ available-backport))
+ "")
+ (if compat-support " or the compat package" "")
+ sym)))))))))))
+
+(defun package-lint--check-eval-after-load ()
+ "Warn about use of `eval-after-load' and co."
+ (package-lint--map-regexp-match
+ "(\\s-*?\\(\\(?:with-\\)?eval-after-load\\)\\_>"
+ (lambda (match)
+ (list 'warning
+ (format "`%s' is for use in configurations, and should rarely be used in packages." match)))))
+
+(defun package-lint--check-no-use-of-cl ()
+ "Warn about use of deprecated `cl' library."
+ (package-lint--map-regexp-match
+ "(\\s-*?require\\s-*?'\\(cl\\)\\_>"
+ (lambda (_)
+ (list
+ 'warning
+ "Replace deprecated `cl' with `cl-lib'. The `cl-libify' package can help with this."))))
+
+(defun package-lint--check-no-use-of-cl-lib-sublibraries ()
+ "Warn about use of `cl-macs', `cl-seq' etc."
+ (package-lint--map-regexp-match
+ "(\\s-*?require\\s-*?'\\(cl-macs\\|cl-seq\\)\\_>"
+ (lambda (_)
+ (list
+ 'warning
+ "This file is not in the `cl-lib' ELPA compatibility package: require `cl-lib' instead."))))
+
+(defconst package-lint--unconditional-require-regexp
+ ;; Match the ending paren so we can be sure it's a single argument
+ ;; `require'. If there are additional arguments, we don't want to warn,
+ ;; because (require 'foo nil t) indicates an optional dependency and
+ ;; (require 'foo "filename") is very uncommon.
+ "(\\s-*?require\\s-*?'\\_<\\(.*?\\)\\_>\\s-*?)"
+ "Regexp to match unconditional `require' forms.")
+
+(defun package-lint--check-libraries-available-in-emacs (valid-deps)
+ "Warn about use of libraries that are not available.
+The check is performed against the Emacs version in VALID-DEPS."
+ (package-lint--check-version-regexp-list
+ valid-deps
+ package-lint--unconditional-require-regexp
+ 'feature))
+
+(defun package-lint--check-libraries-removed-from-emacs ()
+ "Warn about use of libraries that have been removed from Emacs."
+ (package-lint--map-regexp-match
+ package-lint--unconditional-require-regexp
+ (lambda (sym)
+ (let-alist (package-lint-symbol-info sym)
+ (let ((removed-in-version .library-removed))
+ (when removed-in-version
+ (list
+ 'error
+ (format "The `%s' library was removed in Emacs version %s."
+ sym (mapconcat #'number-to-string removed-in-version ".")))))))))
+
+(defconst package-lint--function-name-regexp
+ (rx
+ (seq
+ (or "#'"
+ (seq "(" (* (syntax whitespace))
+ (? (seq
+ (or "funcall" "apply" "advice-add")
+ (+
+ (syntax whitespace))
+ "'"))))
+ (group
+ (*\? nonl))
+ symbol-end))
+ "Regexp to match function names.")
+
+(defun package-lint--check-macros-functions-available-in-emacs (valid-deps)
+ "Warn about use of unavailable functions/macros that are not available.
+The check is performed against the Emacs version in VALID-DEPS."
+ (package-lint--check-version-regexp-list
+ valid-deps
+ package-lint--function-name-regexp
+ 'function))
+
+(defun package-lint--check-macros-functions-removed-from-emacs (valid-deps)
+ "Warn about use of functions/macros that have been removed from Emacs.
+If an Emacs version is specified in VALID-DEPS, don't warn about
+functions/macros that were removed and later re-added, as long as
+the Emacs dependency matches the re-addition."
+ (package-lint--map-regexp-match
+ package-lint--function-name-regexp
+ (lambda (sym)
+ (let-alist (package-lint-symbol-info sym)
+ (let ((removed-in-version .function-removed))
+ (when removed-in-version
+ (let ((emacs-version-dep (or (cadr (assq 'emacs valid-deps)) '(0))))
+ (unless (or (package-lint--seen-fboundp-check-for sym)
+ (and .function-added (version-list-<= .function-added emacs-version-dep)))
+ (list
+ 'error
+ (format "`%s' was removed in Emacs version %s."
+ sym (mapconcat #'number-to-string removed-in-version ".")))))))))))
+
+(defun package-lint--check-lexical-binding-is-on-first-line ()
+ "Check that any `lexical-binding' declaration is on the first line of the file."
+ (cl-block return
+ (let ((original-buffer (current-buffer)))
+ (with-temp-buffer
+ (let ((lexical-binding-found-at-end nil))
+ (insert-buffer-substring-no-properties original-buffer)
+ (condition-case err
+ (cl-letf (((symbol-function #'hack-local-variables-apply) #'ignore)
+ ((symbol-function #'hack-local-variables-filter)
+ (lambda (variables _dir-name)
+ (setq file-local-variables-alist variables)))
+ ;; Silence any messages Emacs may want to share with the user.
+ ;; There's no user.
+ ((symbol-function #'display-warning) #'ignore)
+ ((symbol-function #'message) #'ignore))
+ ;; HACK: this is an internal variable!
+ ;; Unfortunately, Emacsen that have this variable also have
+ ;; `hack-local-variables' that doesn't store `lexical-binding'
+ ;; in `file-local-variables-alist'.
+ (defvar enable-dir-local-variables)
+ (defvar hack-local-variables--warned-lexical)
+ (let ((hack-local-variables--warned-lexical nil)
+ (enable-dir-local-variables nil)
+ (enable-local-variables t)
+ (local-enable-local-variables t))
+ (hack-local-variables)
+ (setq lexical-binding-found-at-end
+ hack-local-variables--warned-lexical)))
+ (error
+ (package-lint--error-at-bob 'error (error-message-string err))
+ (cl-return-from return nil)))
+ (when (or lexical-binding-found-at-end
+ ;; In case this is an Emacs from before `hack-local-variables'
+ ;; started to warn about `lexical-binding' on a line other
+ ;; than the first.
+ (and (cdr (assq 'lexical-binding file-local-variables-alist))
+ (not (package-lint--lexical-binding-declared-in-header-line-p))))
+ (package-lint--error-at-bob
+ 'error
+ "`lexical-binding' must be set in the first line.")))))))
+
+(defun package-lint--check-cl-lib-version (valid-deps)
+ "Check dependencies in VALID-DEPS on \"cl-lib\".
+The specified versions must be remotely available for installation."
+ (let ((emacs-version-dep (or (nth 1 (assq 'emacs valid-deps)) '(0)))
+ (cl-lib-dep (assq 'cl-lib valid-deps)))
+ (when cl-lib-dep
+ (let ((cl-lib-version (nth 1 cl-lib-dep)))
+ (cond ((and emacs-version-dep
+ (version-list-<= '(24 3) emacs-version-dep)
+ (version-list-<= cl-lib-version '(1 0)))
+ (package-lint--error-at-point
+ 'warning
+ "An explicit dependency on cl-lib <= 1.0 is not needed on Emacs >= 24.3."))
+ ((version-list-<= '(1) cl-lib-version)
+ (package-lint--error-at-point
+ 'error
+ (format "Depend on the latest 0.x version of cl-lib rather than on version \"%S\".
+Alternatively, depend on (emacs \"24.3\") or greater, in which cl-lib is bundled."
+ cl-lib-version)
+ (nth 2 cl-lib-dep))))))))
+
+(defun package-lint--check-package-version-present ()
+ "Check that a valid \"Version\" header is present."
+ (let ((version (package-lint--goto-header (rx (? "Package-") "Version"))))
+ (if version
+ (unless (ignore-errors (version-to-list version))
+ (package-lint--error-at-point
+ 'warning
+ (format "\"%s\" is not a valid version. MELPA will handle this, but other archives will not." version)
+ (point)))
+ (package-lint--error-at-bob
+ 'warning
+ "\"Version:\" or \"Package-Version:\" header is missing. MELPA will handle this, but other archives will not."))))
+
+(defun package-lint--liberal-package-buffer-info ()
+ "Like `package-buffer-info', but tolerate missing version header."
+ (let ((orig-buffer (current-buffer)))
+ ;; We've reported version header issues separately, so rule them out here
+ (with-temp-buffer
+ (insert-buffer-substring-no-properties orig-buffer)
+ (goto-char (point-min))
+ (package-lint--update-or-insert-version "0")
+ (let ((info (package-buffer-info)))
+ ;; Pedantically check for the footer comment
+ ;; In Emacs 29 this became a soft failure, but for packages to
+ ;; be installable with the package.el in older Emacsen, the
+ ;; footer comment must be there nonetheless.
+ (goto-char (point-min))
+ (search-forward (format ";;; %s.el ends here" (package-lint--package-desc-name info)))
+ info))))
+
+(defun package-lint--check-package-el-can-parse ()
+ "Check that `package-buffer-info' can read metadata from this file.
+If it can, return the read metadata."
+ (condition-case err
+ (package-lint--liberal-package-buffer-info)
+ (error
+ (package-lint--error-at-bob
+ 'error
+ (format "package.el cannot parse this buffer: %s" (error-message-string err)))
+ nil)))
+
+(defun package-lint--check-package-summary (desc)
+ "Check the summary for package with descriptor DESC.
+DESC is a struct as returned by `package-buffer-info'."
+ (let ((summary (package-lint--package-desc-summary desc)))
+ (cond
+ ((string= summary "")
+ (package-lint--error-at-bob
+ 'error
+ "Package should have a non-empty summary."))
+ (t
+ (unless (let ((case-fold-search nil))
+ (string-match-p "^[A-Z0-9]" summary))
+ (package-lint--error-at-bob
+ 'warning
+ "The package summary should start with an uppercase letter or a digit."))
+ (when (> (length summary) 60)
+ (package-lint--error-at-bob
+ 'warning
+ "The package summary is too long. It should be at most 60 characters."))
+ (when (string-match "\\.\\'" summary)
+ (package-lint--error-at-bob
+ 'warning
+ "The package summary should not end with a period."))
+ (when (save-match-data
+ (let ((case-fold-search t))
+ (and (string-match "[^.]\\<emacs\\>" summary)
+ (not (string-match-p "[[:space:]]+lisp"
+ summary (match-end 0))))))
+ (package-lint--error-at-bob
+ 'warning
+ "Including \"Emacs\" in the package summary is usually redundant."))))))
+
+(defun package-lint--check-provide-form (desc)
+ "Check the provide form for package with descriptor DESC.
+DESC is a struct as returned by `package-buffer-info'."
+ (let ((name (symbol-name (package-lint--package-desc-name desc))))
+ (if (string-match-p "-theme\\'" name)
+ (let ((theme-name (replace-regexp-in-string "-theme\\'" "" name))
+ (provided-theme (package-lint--provided-theme)))
+ (unless (string-equal theme-name provided-theme)
+ (package-lint--error-at-bob
+ 'error
+ (format "There is no (provide-theme '%s) form." theme-name))))
+ (let ((feature (package-lint--provided-feature)))
+ (unless (string-equal name feature)
+ (package-lint--error-at-bob
+ 'error
+ (format "There is no (provide '%s) form." name)))))))
+
+(defun package-lint--check-provide-form-secondary-file ()
+ "Check there is a provide form."
+ ;; We don't require that the provided feature have a name consistent
+ ;; with the overall package prefix, but this check may later be added.
+ (unless (package-lint--provided-feature)
+ (package-lint--error-at-bob
+ 'error
+ "There is no `provide' form.")))
+
+(defun package-lint--check-no-emacs-in-package-name (desc)
+ "Check that the package name doesn't contain \"emacs\".
+DESC is a struct as returned by `package-buffer-info'."
+ (let ((name (package-lint--package-desc-name desc)))
+ (when (string-match-p "emacs" (symbol-name name))
+ (package-lint--error-at-bob
+ 'warning
+ "The word \"emacs\" is redundant in Emacs package names."))))
+
+(defun package-lint--check-symbol-separators (definitions)
+ "Check that symbol DEFINITIONS don't contain non-standard separators."
+ (pcase-dolist (`(,name . ,position) definitions)
+ (when (and (string-match "[:/]" name)
+ (not (string-match-p package-lint--sane-prefixes name)))
+ (let ((match-pos (match-beginning 0)))
+ ;; As a special case, allow `/=' or `/' when at the end of a symbol.
+ (when (or (not (string-match (rx "/" (optional "=") string-end) name))
+ (/= match-pos (match-beginning 0)))
+ (goto-char position)
+ (package-lint--error
+ (line-number-at-pos) 0 'error
+ (format "`%s' contains a non-standard separator `%s', use hyphens instead (see Elisp Coding Conventions)."
+ name (substring-no-properties name match-pos (1+ match-pos)))))))))
+
+(defun package-lint--valid-prefix-mapping-p (short-prefix prefix name)
+ "Check if NAME corresponds to a valid mappings for PREFIX.
+Check is done according to the definitions in
+`package-lint--allowed-prefix-mappings' for SHORT-PREFIX."
+ (let ((regexp (concat "^" (regexp-opt
+ (cdr (assoc short-prefix package-lint--allowed-prefix-mappings))))))
+ (string-prefix-p prefix (replace-regexp-in-string regexp short-prefix name))))
+
+(defun package-lint--valid-definition-name-p (name prefix &optional position)
+ "Return non-nil if NAME denotes a valid definition name.
+
+Valid definition names are:
+
+- a NAME starting with PREFIX, a string representing the current
+ package prefix,
+
+- a NAME matching `package-lint--sane-prefixes', or
+
+- a NAME whose POSITION in the buffer denotes a global definition."
+ (or (string-match-p (rx-to-string `(seq string-start ,prefix (or string-end (not alpha)))) name)
+ (string-match-p package-lint--sane-prefixes name)
+ (string-match-p (rx-to-string `(seq string-start (or "define" "defun" "defvar" "defface" "with") "-" ,prefix)) name)
+ (string-match-p (rx-to-string `(seq string-start "global-" ,prefix (or "-mode" (seq "-" (* any) "-mode")) string-end)) name)
+ (let ((short-prefix (car (cl-remove-if-not (lambda (e) (string-prefix-p e prefix))
+ (mapcar #'car package-lint--allowed-prefix-mappings)))))
+ (when short-prefix
+ (package-lint--valid-prefix-mapping-p short-prefix prefix name)))
+ (when position
+ (goto-char position)
+ (looking-at-p (rx (*? space) "(" (*? space)
+ (or "defadvice" "cl-defmethod" "define-advice" "defalias" "defvaralias" (seq "define-obsolete-" (or "face" "function" "variable") "-alias"))
+ symbol-end)))))
+
+(defun package-lint--check-defs-prefix (prefix definitions)
+ "Verify that symbol DEFINITIONS start with package PREFIX."
+ (pcase-dolist (`(,name . ,position) definitions)
+ (unless (package-lint--valid-definition-name-p name prefix position)
+ (if (package-lint--added-or-removed-function-p name)
+ (package-lint--error-at-point
+ 'error
+ (format "Define compatibility functions with a prefix, e.g. \"%s--%s\", and use `defalias' where they exist."
+ prefix name)
+ position)
+ (package-lint--error-at-point
+ 'error
+ (format "\"%s\" doesn't start with package's prefix \"%s\"."
+ name prefix)
+ position)))))
+
+(defun package-lint--check-minor-mode (def)
+ "Offer up concerns about the minor mode definition DEF."
+ (when (cl-search '(:global t) def)
+ (package-lint--check-globalized-minor-mode def)))
+
+(defun package-lint--check-globalized-minor-mode (def)
+ "Offer up concerns about the global minor mode definition DEF."
+ (let ((feature-name (package-lint--provided-feature)))
+ (when feature-name
+ (let ((feature (intern feature-name))
+ (autoloaded (save-excursion
+ (forward-line -1)
+ (beginning-of-line)
+ (looking-at ";;;###autoload"))))
+ (unless (or autoloaded
+ (cl-search `(:require ',feature) def :test #'equal))
+ (package-lint--error-at-point
+ 'error
+ (format
+ "Global minor modes should be autoloaded or, rarely, `:require' their defining file (i.e. \":require '%s\"), to support the customization variable of the same name." feature)))))))
+
+(defun package-lint--check-defgroup (def)
+ "Offer up concerns about the customization group definition DEF."
+ (when (symbolp (cadr def))
+ (let ((group-name (symbol-name (cadr def))))
+ (when (string-match "\\(.*\\)-mode$" group-name)
+ (let ((parent (intern (match-string 1 group-name))))
+ (unless (cl-search `(:group ',parent) def :test #'equal)
+ (package-lint--error-at-point
+ 'error
+ "Customization groups should not end in \"-mode\" unless that name would conflict with their parent group."))))))
+
+ (unless (memq :group def)
+ (package-lint--error-at-point
+ 'error
+ "Customization groups should specify a parent via `:group'.")))
+
+(defun package-lint--check-defalias (prefix def)
+ "Offer up concerns about the customization group definition DEF.
+PREFIX is the package prefix."
+ (pcase (cadr def)
+ ((and `(quote ,alias) (guard (symbolp alias)))
+ (unless (package-lint--valid-definition-name-p (symbol-name alias) prefix)
+ (package-lint--error-at-point
+ 'error
+ (concat "Aliases should start with the package's prefix \"" prefix "\"."))))))
+
+(defun package-lint--check-format-string (valid-deps def)
+ "Offer up concerns about the format string used in DEF, depending on VALID-DEPS."
+ (let ((emacs-version-dep (or (cadr (assq 'emacs valid-deps)) '(0))))
+ (when (consp (cdr def))
+ (let ((fmt-str (cadr def)))
+ (when (and (version-list-< emacs-version-dep '(26 1))
+ ;; We give up on trying to warn about format strings that are
+ ;; evaluated at runtime.
+ (stringp fmt-str)
+ ;; The usual regexp strategy for finding unescaped matches
+ ;; requires negative lookbehind:
+ ;; (?<!%)(?:%%)*[0-9]+\$
+ ;; So instead we make sure the count of escape chars is odd
+ (string-match "\\(%+\\)[0-9]+\\$" fmt-str)
+ (cl-oddp (length (match-string 1 fmt-str))))
+ (package-lint--error-at-point
+ 'error
+ "You should depend on (emacs \"26.1\") if you need format field numbers."))))))
+
+(defun package-lint--check-lonely-parens ()
+ "Warn about dangling closing parens."
+ (package-lint--map-regexp-match
+ "^\\s-*?\\()\\)"
+ (lambda (_)
+ ;; Allow dangling parentheses if the preceding line ends with a comment, as
+ ;; it's not uncommon even in idiomatic lisp.
+ (when (save-excursion
+ (end-of-line 0)
+ (not (nth 4 (syntax-ppss))))
+ (list 'warning
+ "Closing parens should not be wrapped onto new lines.")))))
+
+
+\f
+;;; Helpers
+
+(defun package-lint--extract-key-sequence (form)
+ "Extract the key sequence from FORM."
+ (pcase form
+ (`(kbd ,seq)
+ (package-lint--extract-key-sequence seq))
+ ((or `(global-set-key ,seq ,_) `(local-set-key ,seq ,_))
+ (package-lint--extract-key-sequence seq))
+ (`(define-key ,_ ,seq ,_)
+ (package-lint--extract-key-sequence seq))
+ ((pred stringp)
+ (listify-key-sequence (read-kbd-macro form)))
+ ((pred vectorp)
+ (unless (listp (elt form 0))
+ (listify-key-sequence form)))))
+
+(defun package-lint--test-keyseq (lks)
+ "Return a message if the listified key sequence LKS is invalid, otherwise nil."
+ (let* ((modifiers (event-modifiers lks))
+ (basic-type (event-basic-type lks)))
+ (when (or (and (> (length lks) 1) (equal (car (last lks)) ?\C-g))
+ (and (equal (car (last lks)) ?\e)
+ (not (equal (nthcdr (- (length lks) 2) lks)
+ '(?\e ?\e))))
+ (equal (car (last lks)) ?\C-h)
+ (and (equal modifiers '(control))
+ (equal ?c basic-type)
+ (cdr lks)
+ (let ((v (event-basic-type (cdr lks)))
+ (m (event-modifiers (cdr lks))))
+ (and (numberp v)
+ (<= v ?z)
+ (>= v ?a)
+ (or (null m) (equal '(shift) m)))))
+ (member basic-type '(f5 f6 f7 f8 f9)))
+ "This key sequence is reserved (see Key Binding Conventions in the Emacs Lisp manual)")))
+
+(defun package-lint--region-empty-p (start end)
+ "Return t iff the region between START and END has no non-empty lines.
+
+Lines consisting only of whitespace or empty comments are considered empty."
+ (save-excursion
+ (save-restriction
+ (save-match-data
+ (narrow-to-region start end)
+ (goto-char start)
+ (while (and (looking-at "^[[:space:]]*;*[[:space:]]*$")
+ (= 0 (forward-line))))
+ (eobp)))))
+
+(defun package-lint--highest-installable-version-of (package)
+ "Return the highest version of PACKAGE available for installation."
+ (let ((descriptors (append (cdr (assq package package-archive-contents))
+ (cdr (assq package package-alist)))))
+ (if (fboundp 'package-desc-version)
+ (car (sort (mapcar 'package-desc-version descriptors)
+ (lambda (v1 v2) (not (version-list-< v1 v2)))))
+ (aref descriptors 0))))
+
+(defun package-lint--goto-header (header-name &optional multiline)
+ "Move to the first occurrence of HEADER-NAME in the file.
+If the return value is non-nil, then point will be at the
+beginning of the header's value, and the second and third match
+groups will contain the name and value of the header with any
+leading or trailing whitespace removed.
+
+If MULTILINE is non-nil, allow the header value to span lines, and return
+them as a list of strings."
+ (goto-char (point-min))
+ (when (re-search-forward (concat (lm-get-header-re header-name) "\\(.*?\\) *$")
+ (cond
+ ((fboundp 'lm-code-start) (lm-code-start)) ; >=30
+ ((fboundp 'lm-code-mark) (lm-code-mark)) ; <=29
+ ((error "BUG: lm-code-{start,mark} disappeared")))
+ t)
+ (let ((start-pos (match-beginning 3))
+ (val (match-string-no-properties 3)))
+ (when multiline
+ (setq val (list val))
+ (forward-line 1)
+ (while (looking-at "^;+\\(\t\\|[\t\s]\\{2,\\}\\)\\(.+\\)")
+ (push (match-string-no-properties 2) val)
+ (forward-line 1))
+ (setq val (nreverse val)))
+ (goto-char start-pos)
+ val)))
+
+(defun package-lint--update-or-insert-version (version)
+ "Ensure current buffer has a \"Version: VERSION\" header."
+ (if (package-lint--goto-header "Version")
+ (move-beginning-of-line nil)
+ (forward-line))
+ (insert (format ";; Version: %s" version))
+ (newline))
+
+(defun package-lint--get-header-line-file-local-variables ()
+ "Return local variables specified in the -*- line.
+Returns an alist of elements (VAR . VAL), where VAR is a variable
+and VAL is the specified value.
+
+For details, see `hack-local-variables-prop-line'."
+ (cl-letf (((symbol-function #'message) #'ignore))
+ (hack-local-variables-prop-line)))
+
+(defun package-lint--lexical-binding-declared-in-header-line-p ()
+ "Test if `lexical-binding' is declared in the -*- line."
+ ;; Test the `cdr' to see if it's actually true, because
+ ;; -*- lexical-binding: nil -*-
+ ;; is legal, if silly.
+ (cdr (assq 'lexical-binding (package-lint--get-header-line-file-local-variables))))
+
+(defvar semantic-imenu-summary-function)
+
+(defun package-lint--get-defs ()
+ "Return a list of all variables and functions defined in the current buffer.
+
+The returned list is of the form (SYMBOL-NAME . POSITION)."
+ ;; We probably could use Semantic instead, but it's a *global* minor mode and
+ ;; it tends to be quite heavy, so use Imenu instead; if the user has Semantic
+ ;; enabled, Imenu will use its index anyway.
+ (let ((result '())
+ (index
+ (save-excursion
+ ;; Use the default imenu expression list so that we're not confused
+ ;; by user customizations.
+ (let ((imenu-generic-expression (default-value 'lisp-imenu-generic-expression))
+ ;; In case it's actually Semantic, tell it not to decorate
+ ;; symbol names.
+ (semantic-imenu-summary-function 'semantic-format-tag-name))
+ (funcall imenu-create-index-function)))))
+ (dolist (entry index)
+ (pcase entry
+ ((and `(,submenu-name . ,submenu-elements)
+ (guard (consp submenu-elements)))
+ (when (member submenu-name '("Variables" "Defuns" "Types"))
+ (setq result (nconc (reverse submenu-elements) result))))
+ (_
+ (push entry result))))
+ ;; If it's Semantic, then it returns overlays, not positions. Convert
+ ;; them.
+ (dolist (entry result)
+ (when (overlayp (cdr entry))
+ (setcdr entry (overlay-start (cdr entry)))))
+ (nreverse result)))
+
+(defun package-lint--provided-feature ()
+ "Return the last-provided feature name, as a string, or nil if none."
+ (save-excursion
+ (goto-char (point-max))
+ (cond ((re-search-backward (rx "(provide '" (group (1+ (or (syntax word) (syntax symbol))))) nil t)
+ (match-string-no-properties 1))
+ ((re-search-backward "(provide-me)" nil t)
+ (file-name-sans-extension (file-name-nondirectory buffer-file-name))))))
+
+(defun package-lint--provided-theme ()
+ "Return the last-provided theme name, as a string, or nil if none."
+ (save-excursion
+ (goto-char (point-max))
+ (when (re-search-backward (rx "(provide-theme '" (group (1+ (or (syntax word) (syntax symbol))))) nil t)
+ (match-string-no-properties 1))))
+
+(defun package-lint--get-package-prefix ()
+ "Return package prefix string (i.e. the symbol the package `provide's).
+Prefix is returned without any `-mode' suffix."
+ (let ((feature (package-lint--provided-feature)))
+ (when feature
+ (replace-regexp-in-string "-mode\\'" "" feature))))
+
+(defun package-lint--check-objects-by-regexp (regexp function)
+ "Check all objects with the literal printed form matching REGEXP.
+
+The objects are parsed with `read'. The FUNCTION is passed the
+read object, with the point at the beginning of the match.
+
+S-expressions in comments or comments, partial s-expressions, or
+otherwise invalid read forms are ignored."
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (save-excursion
+ (goto-char (match-beginning 0))
+ (let ((obj (unless (package-lint--inside-comment-or-string-p)
+ (save-excursion
+ (ignore-errors (read (current-buffer)))))))
+ (when obj (funcall function obj))))))
+
+\f
+;;; Public interface
+
+;;;###autoload
+(defun package-lint-buffer (&optional buffer)
+ "Get linter errors and warnings for BUFFER.
+
+Returns a list, each element of which is list of
+
+ (LINE COL TYPE MESSAGE)
+
+where TYPE is either `warning' or `error'.
+
+Current buffer is used if none is specified."
+ (with-current-buffer (or buffer (current-buffer))
+ (unless (derived-mode-p 'emacs-lisp-mode)
+ (error "Buffer must be in emacs-lisp-mode"))
+ (package-lint--check-all)))
+
+;;;###autoload
+(defun package-lint-current-buffer ()
+ "Display lint errors and warnings for the current buffer."
+ (interactive)
+ (let ((errs (package-lint-buffer))
+ (buf "*Package-Lint*"))
+ (with-current-buffer (get-buffer-create buf)
+ (let ((buffer-read-only nil))
+ (erase-buffer)
+ (cond
+ ((null errs) (insert "No issues found."))
+ ((null (cdr errs)) (insert "1 issue found:\n\n"))
+ (t (insert (format "%d issues found:\n\n" (length errs)))))
+ (pcase-dolist (`(,line ,col ,type ,message) errs)
+ (insert (format "%d:%d: %s: %s\n" line col type message))))
+ (special-mode)
+ (view-mode 1))
+ (display-buffer buf)))
+
+(defgroup package-lint nil
+ "A linting library for elisp package authors."
+ :group 'development)
+
+(defcustom package-lint-batch-fail-on-warnings t
+ "When non-nil, make warnings fatal for `package-lint-batch-and-exit'."
+ :group 'package-lint
+ :type 'boolean)
+
+(defun package-lint-batch-and-exit-1 (filenames)
+ "Internal helper function for `package-lint-batch-and-exit'.
+
+Checks FILENAMES using package-lint.
+
+The main loop is this separate function so it's easier to test."
+ ;; Make sure package.el is initialized so we can query its database.
+ (package-initialize)
+ (let ((success t) (last-directory nil) (text-quoting-style 'grave))
+ (dolist (file filenames success)
+ (let* ((file (expand-file-name file))
+ (file-directory (file-name-directory file))
+ (base (file-name-nondirectory file)))
+ (with-temp-buffer
+ (insert-file-contents file t)
+ (emacs-lisp-mode)
+ (let ((checking-result (package-lint-buffer))
+ (fail-on (cons 'error (when package-lint-batch-fail-on-warnings '(warning)))))
+ (when (cl-some (lambda (err) (memq (nth 2 err) fail-on)) checking-result)
+ (setq success nil)
+ (unless (equal last-directory file-directory)
+ (setq last-directory file-directory)
+ (message "Entering directory '%s'" file-directory))
+ (pcase-dolist (`(,line ,col ,type ,message) checking-result)
+ (message "%s:%d:%d: %s: %s"
+ base line col type message)))))))))
+
+;;;###autoload
+(defun package-lint-batch-and-exit ()
+ "Run `package-lint-buffer' on the files remaining on the command line.
+Use this only with -batch, it won't work interactively.
+
+When done, exit Emacs with status 1 in case of any errors, otherwise exit
+with status 0. The variable `package-lint-batch-fail-on-warnings' controls
+whether or not warnings alone produce a non-zero exit code."
+ (unless noninteractive
+ (error "`package-lint-batch-and-exit' is to be used only with -batch"))
+ (let ((success (package-lint-batch-and-exit-1 command-line-args-left)))
+ (kill-emacs (if success 0 1))))
+
+;;;###autoload
+(defun package-lint-looks-like-a-package-p ()
+ "Return non-nil if the current buffer appears to be intended as a package."
+ (or package-lint-main-file
+ (save-match-data
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (re-search-forward
+ (lm-get-header-re (rx (or "Version" "Package-Version" "Package-Requires")))
+ nil t))))))
+
+(provide 'package-lint)
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End:
+;;; package-lint.el ends here