From unknown Sat Sep 06 02:03:30 2025 X-Loop: help-debbugs@gnu.org Subject: bug#62364: 28.2; savehist file becomes quadratic when used with kill-ring and evil-yank-rectangle Resent-From: Aaron Zeng Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 22 Mar 2023 02:06:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 62364 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: To: 62364@debbugs.gnu.org Cc: app-emacs-dev@janestreet.com X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.167945072026962 (code B ref -1); Wed, 22 Mar 2023 02:06:01 +0000 Received: (at submit) by debbugs.gnu.org; 22 Mar 2023 02:05:20 +0000 Received: from localhost ([127.0.0.1]:33065 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1penqo-00070n-KJ for submit@debbugs.gnu.org; Tue, 21 Mar 2023 22:05:19 -0400 Received: from lists.gnu.org ([209.51.188.17]:42934) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pejZG-00033K-7v for submit@debbugs.gnu.org; Tue, 21 Mar 2023 17:30:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pejZ9-0001k5-Ph for bug-gnu-emacs@gnu.org; Tue, 21 Mar 2023 17:30:49 -0400 Received: from mxout5.mail.janestreet.com ([64.215.233.18]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pejZ4-0000qO-8x for bug-gnu-emacs@gnu.org; Tue, 21 Mar 2023 17:30:46 -0400 From: Aaron Zeng Date: Tue, 21 Mar 2023 17:30:40 -0400 Message-ID: MIME-Version: 1.0 Content-Type: text/plain Received-SPF: pass client-ip=64.215.233.18; envelope-from=azeng@janestreet.com; helo=mxout5.mail.janestreet.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.4 (-) X-Mailman-Approved-At: Tue, 21 Mar 2023 22:05:17 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.4 (--) Serializing text properties on savehist variables can cause quadratic behavior due to large shared data structures. The motivating scenario is with `kill-ring' added to `savehist-additional-variables', and `evil-mode' enabled. `evil-yank-rectangle' copies a string and sets its `yank-handler' text property to a structure containing a list of every line of the copied string. When `savehist-save' runs, this text property can get serialized linearly many times (depending on the other text properties in different substrings of the copied text), and the property is as long as the text itself, which results in a quadratic amount of data serialization. For example: 1. emacs -Q 2. Enable savehist-mode and add kill-ring to savehist-additional-variables 3. Enable evil-mode (I'm using Evil version evil-git-9584081cf) 4. Open a medium-size file with several hundred lines 5. Copy the whole file as a rectangle, by pressing C-v G $ y 6. M-x savehist-save On an OCaml source file with about 400 lines, savehist-save took over 5 seconds and resulted in a >70MB savehist file. A suggested patch is below. For comparison, with the patch, savehist-save takes less than a second and results in a 160kB savehist file. >From 4bd805a4fb35afd5abf45e09c2f1facaf1b88f4a Mon Sep 17 00:00:00 2001 From: "Aaron L. Zeng" Date: Tue, 21 Mar 2023 16:07:54 -0400 Subject: [PATCH] * lisp/savehist.el (savehist-save): Preserve shared structure This avoids ballooning the size of variables that contain large text properties, such as the `yank-handler' installed by `evil-yank-rectangle', which contains a list of lines in the string. Copyright-paperwork-exempt: yes --- lisp/savehist.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lisp/savehist.el b/lisp/savehist.el index b532668f8a4..ea8968c771b 100644 --- a/lisp/savehist.el +++ b/lisp/savehist.el @@ -232,8 +232,9 @@ If AUTO-SAVE is non-nil, compare the saved contents to the one last saved, savehist-coding-system)) (run-hooks 'savehist-save-hook) (let ((print-length nil) - (print-level nil) - (print-quoted t)) + (print-level nil) + (print-quoted t) + (print-circle t)) ;; Save the minibuffer histories, along with the value of ;; savehist-minibuffer-history-variables itself. (when savehist-save-minibuffer-history -- 2.30.2 In GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, X toolkit, cairo version 1.15.12, Xaw scroll bars) of 2023-02-09 built on Repository revision: 739b5d0e52d83ec567bd61a5a49ac0e93e0eb469 Repository branch: HEAD Windowing system distributor 'The X.Org Foundation', version 11.0.12011000 System Description: CentOS Linux 7 (Core) Configured using: 'configure --with-x-toolkit=lucid --without-gpm --without-gconf --without-selinux --without-imagemagick --with-modules --with-gif=no --with-cairo --with-rsvg --prefix=' Configured features: CAIRO DBUS FREETYPE GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS X11 XDBE XIM XPM LUCID ZLIB Important settings: value of $LANG: en_US.utf8 locale-coding-system: utf-8-unix Major mode: Org Minor modes in effect: global-evil-surround-mode: t evil-surround-mode: t evil-org-mode: t org-appear-mode: t org-superstar-mode: t org-indent-mode: t global-display-line-numbers-mode: t evil-escape-mode: t recentf-mode: t company-mode: t eval-sexp-fu-flash-mode: t show-smartparens-global-mode: t show-smartparens-mode: t yas-global-mode: t yas-minor-mode: t mode-line-bell-mode: t indent-guide-global-mode: t indent-guide-mode: t global-column-enforce-mode: t fancy-battery-mode: t global-vi-tilde-fringe-mode: t vi-tilde-fringe-mode: t winner-mode: t global-spacemacs-whitespace-cleanup-mode: t spacemacs-whitespace-cleanup-mode: t winum-mode: t pupo-mode: t unkillable-scratch: t global-undo-tree-mode: t undo-tree-mode: t spaceline-info-mode: t save-place-mode: t savehist-mode: t persp-mode: t persistent-scratch-autosave-mode: t org-wild-notifier-mode: t projectile-mode: t bug-reference-mode: t global-git-commit-mode: t global-ligature-mode: t ligature-mode: t flycheck-pos-tip-mode: t global-flycheck-mode: t flycheck-mode: t jane-org-fe-minor-mode: t ivy-rich-project-root-cache-mode: t ivy-rich-mode: t global-hl-todo-mode: t hl-todo-mode: t global-fasd-mode: t purpose-mode: t eyebrowse-mode: t global-evil-quickscope-always-mode: t evil-quickscope-always-mode: t global-anzu-mode: t anzu-mode: t editorconfig-mode: t counsel-mode: t ivy-mode: t clean-aindent-mode: t hybrid-mode: t which-key-mode: t override-global-mode: t flyspell-mode: t shell-dirtrack-mode: t evil-mode: t evil-local-mode: t windmove-mode: t spacemacs-leader-override-mode: t global-spacemacs-leader-override-mode: t global-hl-line-mode: t xterm-mouse-mode: t global-auto-revert-mode: t which-function-mode: t minibuffer-depth-indicate-mode: t midnight-mode: t display-time-mode: t dired-omit-mode: t ido-vertical-mode: t global-page-break-lines-mode: t page-break-lines-mode: t global-eldoc-mode: t eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t column-number-mode: t line-number-mode: t auto-fill-function: yas--auto-fill transient-mark-mode: t Load-path shadows: Features: (shadow qp smiley gnus-cite gnus-async gnus-bcklg gnus-agent gnus-srvr gnus-score score-mode nnvirtual nntp gnus-ml gnus-msg nndoc gnus-cache gnus-dup gnus-art mm-uu mml2015 mm-view mml-smime smime dig gnus-sum shr kinsoku svg gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail mail-source utf7 netrc nnoo gnus-spec gnus-int gnus-range gnus-win gnus nnheader debbugs-gnu debbugs-compat debbugs soap-client rng-xsd rng-dt rng-util xsd-regexp autoload tar-mode arc-mode archive-mode emacsbug sendmail sort mail-extr magit-patch mc-hide-unmatched-lines-mode mc-mark-more mc-cycle-cursors multiple-cursors-core woman man eieio-opt speedbar ezimage dframe shortdoc cl-print gravatar dns counsel-projectile evil-surround misearch multi-isearch emmet-mode smartparens-html sgml-mode facemenu dom company-shell flycheck-bashate shfmt reformatter sh-script utop utop-minor-mode mule-util executable nix-format cal-iso org-duration org-eldoc evil-org ob-C smartparens-c cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs ob-js ob-perl ob-python smartparens-python python tramp-sh tramp tramp-loaddefs trampver tramp-integration files-x tramp-compat ls-lisp ob-ruby ob-sql org-appear org-download org-attach org-id org-superstar toc-org org-indent magit-imenu face-remap editorconfig-core editorconfig-core-handle editorconfig-fnmatch smex display-line-numbers evil-escape recentf tree-widget company-files company-keywords company-etags company-gtags company-dabbrev-code company-dabbrev company-semantic company-template company-capf merlin-company company overseer pkg-info epl auto-compile packed elisp-slime-nav etags fileloop flycheck-elsa flycheck-package package-lint finder eval-sexp-fu goto-addr vc-mtn log-view vc-hg vc-git vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs vc vc-dispatcher evil-lisp-state flycheck-haskell haskell-cabal haskell-utils flycheck-rust highlight-numbers parent-mode highlight-parentheses rainbow-delimiters smartparens-config smartparens-ml smartparens-org smartparens-markdown smartparens-text smartparens yasnippet-snippets yasnippet mode-line-bell indent-guide column-enforce-mode fancy-battery battery vi-tilde-fringe ol-man org-checklist ol-eshell eshell-z em-dirs esh-var em-term term disp-table ehelp em-smart esh-mode eshell esh-cmd esh-ext esh-opt esh-proc esh-io esh-arg esh-module esh-groups esh-util org-tempo tempo ol-info org-habit ol-docview doc-view jka-compr image-mode exif ol-bibtex dired-async dired-aux cus-start winner org-clock evil-matchit evil-matchit-sdk semantic/lex semantic/fw mode-local xterm-color spacemacs-whitespace-cleanup ws-butler winum spacemacs-purpose-popwin window-purpose-x imenu-list hideshow unkillable-scratch unicode-fonts undo-tree symbol-overlay string-inflection string-edit spaceline-config spaceline-segments spaceline powerline powerline-separators powerline-themes diminish saveplace savehist popwin persp-mode persistent-scratch diary-lib diary-loaddefs org-wild-notifier ox-texinfo ox-org ox-latex ox-icalendar ox-gfm ox-md ox-html table ox-ascii ox-publish ox bcc32-org bcc32-org-flycheck org-element avl-tree generator org-projectile projectile ibuf-ext ibuffer ibuffer-loaddefs org-category-capture org-capture org-agenda org-refile orgit git-rebase forge-list forge-commands forge-semi forge-bitbucket buck forge-gogs gogs forge-gitea gtea forge-gitlab glab forge-github ghub-graphql treepy gsexp ghub forge-notify forge-revnote forge-pullreq forge-issue forge-topic yaml parse-time bug-reference forge-post forge-repo forge forge-core forge-db closql emacsql-sqlite emacsql emacsql-compiler evil-collection-magit magit-bookmark magit-submodule magit-obsolete magit-blame magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit magit-sequence magit-notes magit-worktree magit-tag magit-merge magit-branch magit-reset magit-files magit-refs magit-status magit magit-repos magit-apply magit-wip magit-log magit-diff git-commit log-edit pcvs-util add-log magit-core magit-autorevert magit-margin magit-transient magit-process with-editor magit-mode transient magit-git magit-section magit-utils org org-macro org-footnote org-pcomplete org-list org-faces org-entities org-version ob-dot ob-shell ob ob-tangle org-src ob-ref ob-lob ob-table ob-exp ob-comint ob-emacs-lisp ob-core ob-eval org-table oc-basic bibtex iso8601 org-keys oc org-loaddefs cal-menu calendar cal-loaddefs ol org-compat org-macs async alert log4e notifications dbus gntp org-rich-yank multi-line multi-line-find multi-line-enter multi-line-decorator multi-line-respace multi-line-shared shut-up multi-line-cycle multi-line-candidate ligature keycast jane-async-merlin jane-merlin merlin-imenu flycheck-ocaml flycheck-pos-tip pos-tip flycheck merlin-xref merlin-cap merlin crm jane-common image+ image-file image-converter whitespace jane-auto-modes vba-mode markdown-mode jane-deprecated jane-smerge gnu-elpa-keyring-update jane-load-x-slowness-mitigation jane-elpa-snapshot jane-completion smerge-mode diff-mode diff ffap ecaml_plugin linum gopcaml bookmark jane jane-micro-features grep server jane-diff unified-test-mode shell-file jane-sexp jane-ocaml jane-tuareg-theme jane-ocp-indent ocp-indent tuareg tuareg-compat tuareg-opam skeleton flymake-proc flymake smie caml-types caml-help view find-file jane-cr jane-align jane-util jane-autoloads core core-buffer core-error core-util ert ewoc debug backtrace find-func ivy-rich ivy-hydra ivy-avy avy hl-todo fasd window-purpose window-purpose-fixes window-purpose-prefix-overload window-purpose-switch let-alist window-purpose-layout window-purpose-core window-purpose-configuration window-purpose-utils eyebrowse evil-unimpaired f evil-textobj-line evil-quickscope evil-easymotion evil-collection-dired evil-collection-buff-menu evil-collection annalist evil-anzu anzu emr popup s dash editorconfig noutline outline drag-stuff counsel xdg xref project compile swiper ivy flx delsel ivy-faces ivy-overlay colir clean-aindent-mode clang-format xml cl tex-site hybrid-mode evil-evilified-state which-key use-package use-package-ensure use-package-delight use-package-diminish use-package-bind-key bind-key use-package-core hydra lv evil evil-integration evil-maps evil-commands reveal flyspell ispell evil-jumps evil-command-window evil-search evil-ex shell pcomplete comint ansi-color evil-types evil-macros evil-repeat evil-states evil-core evil-common windmove calc calc-loaddefs calc-macs thingatpt rect evil-digraphs evil-vars ring bind-map info mm-archive message rfc822 mml mml-sec epa gnus-util rmail rmail-loaddefs text-property-search time-date mailabbrev gmm-utils mailheader mail-utils gnutls network-stream url-http url-gw nsm rmc puny url-cache url-auth quelpa mm-decode mm-bodies mm-encode lisp-mnt mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr help-fns radix-tree hl-line xt-mouse autorevert filenotify cl-extra solarized-light-theme solarized solarized-faces color format-spec finder-inf jane-elpa-pin which-func imenu mb-depth midnight time dired-x dired dired-loaddefs ido-vertical-mode ido core-spacemacs core-spacebind core-use-package-ext core-transient-state core-micro-state core-toggle core-keybindings core-fonts-support core-themes-support core-display-init core-jump core-release-management core-custom-settings core-configuration-layer eieio-compat core-progress-bar core-spacemacs-buffer core-funcs spacemacs-ht inline help-mode warnings package browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq password-cache json map url-vars eieio eieio-core eieio-loaddefs epg rfc6068 epg-config core-command-line core-debug edmacro kmacro derived profiler core-hooks page-break-lines easy-mmode core-env load-env-vars rx core-dotspacemacs advice pcase core-customization validate cus-edit pp cus-load wid-edit seq byte-opt bytecomp byte-compile cconv core-emacs-backports core-compilation core-dumper subr-x spinner cl-macs gv cl-loaddefs cl-lib core-load-paths core-versions core-early-funcs iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help simple abbrev obarray cl-preloaded nadvice button loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote threads dbusbind inotify dynamic-setting system-font-setting font-render-setting cairo x-toolkit x multi-tty make-network-process emacs) Memory information: ((conses 16 3145559 2267191) (symbols 48 125163 50) (strings 32 519749 443235) (string-bytes 1 16529585) (vectors 16 170854) (vector-slots 8 3077103 1711953) (floats 8 3673 6250) (intervals 56 174226 83831) (buffers 992 93) (heap 1024 611628 397693)) From unknown Sat Sep 06 02:03:30 2025 X-Loop: help-debbugs@gnu.org Subject: bug#62364: 28.2; savehist file becomes quadratic when used with kill-ring and evil-yank-rectangle Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 23 Mar 2023 08:55:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 62364 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: To: Aaron Zeng , Lars Ingebrigtsen , Stefan Monnier Cc: app-emacs-dev@janestreet.com, 62364@debbugs.gnu.org Received: via spool by 62364-submit@debbugs.gnu.org id=B62364.167956165222614 (code B ref 62364); Thu, 23 Mar 2023 08:55:02 +0000 Received: (at 62364) by debbugs.gnu.org; 23 Mar 2023 08:54:12 +0000 Received: from localhost ([127.0.0.1]:37324 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pfGi3-0005sg-Lu for submit@debbugs.gnu.org; Thu, 23 Mar 2023 04:54:12 -0400 Received: from eggs.gnu.org ([209.51.188.92]:54888) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pfGi2-0005sT-3h for 62364@debbugs.gnu.org; Thu, 23 Mar 2023 04:54:10 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pfGhw-0004hu-Bf; Thu, 23 Mar 2023 04:54:04 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=+Giryw8PunSDUyrCyGzejkd+qIsUEglHH2zv3djPI/U=; b=Oh7UgJG0KQMo 9kG9xlw6jmphbJDTxQsRPD24LAnoFsriPZbj/5uuF61q77KNprC0aOd3KnMGMrXeXn7o1HbZC1Wxv 3kUPGlfHF+5Bo7Men14sbNrlW3pI9fjXJiUxX5qpxoxXn130NYl7AIdDUNdu/PndUBg/hoTvSBkRm 5OzG9YJpSiLz/jBi6G2/v2V13ZXaLAUoIB+IcFRRUEErlHM0a68BF6gDZnb4swvI4721LgiM2ehDc nX8rmpg77pqhPn5dhs4uxLUgLuacjevlUKCveyjLQ1iplpc+oz2dJ82rhlYF7xVXmUw8wFzGRfOp0 +NSz5yxvDXbelf6ryTHgiA==; Received: from [87.69.77.57] (helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pfGhv-0007A6-QO; Thu, 23 Mar 2023 04:54:04 -0400 Date: Thu, 23 Mar 2023 10:54:19 +0200 Message-Id: <83355v6e6c.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: (message from Aaron Zeng on Tue, 21 Mar 2023 17:30:40 -0400) References: X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Cc: app-emacs-dev@janestreet.com > From: Aaron Zeng > Date: Tue, 21 Mar 2023 17:30:40 -0400 > > > Serializing text properties on savehist variables can cause quadratic > behavior due to large shared data structures. The motivating scenario > is with `kill-ring' added to `savehist-additional-variables', and > `evil-mode' enabled. `evil-yank-rectangle' copies a string and sets > its `yank-handler' text property to a structure containing a list of > every line of the copied string. When `savehist-save' runs, this text > property can get serialized linearly many times (depending on the > other text properties in different substrings of the copied text), and > the property is as long as the text itself, which results in a > quadratic amount of data serialization. > > For example: > > 1. emacs -Q > 2. Enable savehist-mode and add kill-ring to savehist-additional-variables > 3. Enable evil-mode (I'm using Evil version evil-git-9584081cf) > 4. Open a medium-size file with several hundred lines > 5. Copy the whole file as a rectangle, by pressing C-v G $ y > 6. M-x savehist-save > > On an OCaml source file with about 400 lines, savehist-save took over > 5 seconds and resulted in a >70MB savehist file. > > A suggested patch is below. For comparison, with the patch, > savehist-save takes less than a second and results in a 160kB savehist > file. Lars, Stefan, any comments? Are there any downsides to binding print-circle to a non-nil value here? From unknown Sat Sep 06 02:03:30 2025 X-Loop: help-debbugs@gnu.org Subject: bug#62364: 28.2; savehist file becomes quadratic when used with kill-ring and evil-yank-rectangle Resent-From: Stefan Monnier Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 23 Mar 2023 13:05:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 62364 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: To: Eli Zaretskii Cc: Lars Ingebrigtsen , app-emacs-dev@janestreet.com, Aaron Zeng , 62364@debbugs.gnu.org Received: via spool by 62364-submit@debbugs.gnu.org id=B62364.167957669925735 (code B ref 62364); Thu, 23 Mar 2023 13:05:01 +0000 Received: (at 62364) by debbugs.gnu.org; 23 Mar 2023 13:04:59 +0000 Received: from localhost ([127.0.0.1]:37496 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pfKch-0006gw-UO for submit@debbugs.gnu.org; Thu, 23 Mar 2023 09:04:59 -0400 Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:2386) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pfKce-0006ge-3Q for 62364@debbugs.gnu.org; Thu, 23 Mar 2023 09:04:54 -0400 Received: from pmg2.iro.umontreal.ca (localhost.localdomain [127.0.0.1]) by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id AF0C980677; Thu, 23 Mar 2023 09:04:46 -0400 (EDT) Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1]) by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id E3ABB804BC; Thu, 23 Mar 2023 09:04:44 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca; s=mail; t=1679576684; bh=Up9BNaP/55s2jm52zvcMk2R+AzziGYRlf/7TylHARMY=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=duQOuZ9GYH6Jw2lq3GjvNCQSn9dJU7Yzjd/HCDp45mxrnoscX11at956yXCrpi8XJ FgkJfLnXQ1InYl3tZgaebVqQPZVoVQaueSBD9/SjYht3cDZlF8TaEyA4UJsrKfBdBv qLEA9NsZmyheQSgasmIt7u+RkzHGY8AMbz4ifp6x2n7oi5OROpYvwkEzTXjAvUev10 Bwn0rM8MdiL1TE+J80d5tOpgb5KRHmrmpSKNU6o6Ab3O+OMwh6L6APdly1Lksc0z7c g72yF9Qwdnr/w2SSQHZ4VUcdHjWkxt+6nBNFNHT3e+fCURoicBCaIl4OtPJCgYAaXM tvB9xLCDobH1Q== Received: from pastel (unknown [216.154.34.24]) by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id B48B2123311; Thu, 23 Mar 2023 09:04:44 -0400 (EDT) From: Stefan Monnier In-Reply-To: <83355v6e6c.fsf@gnu.org> (Eli Zaretskii's message of "Thu, 23 Mar 2023 10:54:19 +0200") Message-ID: References: <83355v6e6c.fsf@gnu.org> Date: Thu, 23 Mar 2023 09:04:43 -0400 User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-SPAM-INFO: Spam detection results: 0 ALL_TRUSTED -1 Passed through trusted hosts only via SMTP AWL -0.026 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain X-SPAM-LEVEL: X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) >> A suggested patch is below. For comparison, with the patch, >> savehist-save takes less than a second and results in a 160kB savehist >> file. > Lars, Stefan, any comments? Are there any downsides to binding > print-circle to a non-nil value here? The patch looks good to me, I can't see any downside. Stefan From unknown Sat Sep 06 02:03:30 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Aaron Zeng Subject: bug#62364: closed (Re: bug#62364: 28.2; savehist file becomes quadratic when used with kill-ring and evil-yank-rectangle) Message-ID: References: <83pm8xc9j3.fsf@gnu.org> X-Gnu-PR-Message: they-closed 62364 X-Gnu-PR-Package: emacs Reply-To: 62364@debbugs.gnu.org Date: Sat, 25 Mar 2023 12:16:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1679746562-17732-1" This is a multi-part message in MIME format... ------------=_1679746562-17732-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #62364: 28.2; savehist file becomes quadratic when used with kill-ring and = evil-yank-rectangle which was filed against the emacs package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 62364@debbugs.gnu.org. --=20 62364: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D62364 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1679746562-17732-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 62364-done) by debbugs.gnu.org; 25 Mar 2023 12:15:10 +0000 Received: from localhost ([127.0.0.1]:41962 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pg2nd-0004aV-Rq for submit@debbugs.gnu.org; Sat, 25 Mar 2023 08:15:10 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50080) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pg2nb-0004aE-NG for 62364-done@debbugs.gnu.org; Sat, 25 Mar 2023 08:15:08 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pg2nV-0002Fj-R2; Sat, 25 Mar 2023 08:15:01 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=P63uQbpXIcifRe0er/RRt7K/wJ+gXq+BC2fMMRf4wTw=; b=EZR9+Z/E3IeI IKngwxyCFPxwHoRj/EhREJCo+atPqqjiYutcfx/sMJ6/0HliurvlzH77JSI8Ya6QEez7Fq7k3cCfs 6PbPATVD13BPPaY8ua+GqtlzefS6X7PmKYo0i+WYCaSY0eSt5oO90Lyg/AriNCcxIJjV28wcyQmDr R8H/0Z4K5fw6OZqMRsdIh5mT/XwhdL/Sxci/BGnU9he2cEWRQISQO+PwJpypna12stDTEAHVrWkso Syai5n/OUF7BbUZJABclKcK27r6g2VdH9VEWQyBAJssIH35ct2Ay41PpLoXNDOLEhjEV3BK3yig9p aEzKsHIlJV8rQSQNo3RX9A==; Received: from [87.69.77.57] (helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pg2nU-0001rQ-V9; Sat, 25 Mar 2023 08:15:01 -0400 Date: Sat, 25 Mar 2023 15:14:56 +0300 Message-Id: <83pm8xc9j3.fsf@gnu.org> From: Eli Zaretskii To: Stefan Monnier In-Reply-To: (message from Stefan Monnier on Thu, 23 Mar 2023 09:04:43 -0400) Subject: Re: bug#62364: 28.2; savehist file becomes quadratic when used with kill-ring and evil-yank-rectangle References: <83355v6e6c.fsf@gnu.org> X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 62364-done Cc: larsi@gnus.org, app-emacs-dev@janestreet.com, azeng@janestreet.com, 62364-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.9 (--) > From: Stefan Monnier > Cc: Aaron Zeng , Lars Ingebrigtsen , > 62364@debbugs.gnu.org, app-emacs-dev@janestreet.com > Date: Thu, 23 Mar 2023 09:04:43 -0400 > > >> A suggested patch is below. For comparison, with the patch, > >> savehist-save takes less than a second and results in a 160kB savehist > >> file. > > Lars, Stefan, any comments? Are there any downsides to binding > > print-circle to a non-nil value here? > > The patch looks good to me, I can't see any downside. Thanks, installed on the emacs-29 branch, and closing the bug. ------------=_1679746562-17732-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 22 Mar 2023 02:05:20 +0000 Received: from localhost ([127.0.0.1]:33065 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1penqo-00070n-KJ for submit@debbugs.gnu.org; Tue, 21 Mar 2023 22:05:19 -0400 Received: from lists.gnu.org ([209.51.188.17]:42934) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pejZG-00033K-7v for submit@debbugs.gnu.org; Tue, 21 Mar 2023 17:30:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pejZ9-0001k5-Ph for bug-gnu-emacs@gnu.org; Tue, 21 Mar 2023 17:30:49 -0400 Received: from mxout5.mail.janestreet.com ([64.215.233.18]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pejZ4-0000qO-8x for bug-gnu-emacs@gnu.org; Tue, 21 Mar 2023 17:30:46 -0400 From: Aaron Zeng To: bug-gnu-emacs@gnu.org Subject: 28.2; savehist file becomes quadratic when used with kill-ring and evil-yank-rectangle Date: Tue, 21 Mar 2023 17:30:40 -0400 Message-ID: MIME-Version: 1.0 Content-Type: text/plain Received-SPF: pass client-ip=64.215.233.18; envelope-from=azeng@janestreet.com; helo=mxout5.mail.janestreet.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.4 (-) X-Debbugs-Envelope-To: submit X-Mailman-Approved-At: Tue, 21 Mar 2023 22:05:17 -0400 Cc: app-emacs-dev@janestreet.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.4 (--) Serializing text properties on savehist variables can cause quadratic behavior due to large shared data structures. The motivating scenario is with `kill-ring' added to `savehist-additional-variables', and `evil-mode' enabled. `evil-yank-rectangle' copies a string and sets its `yank-handler' text property to a structure containing a list of every line of the copied string. When `savehist-save' runs, this text property can get serialized linearly many times (depending on the other text properties in different substrings of the copied text), and the property is as long as the text itself, which results in a quadratic amount of data serialization. For example: 1. emacs -Q 2. Enable savehist-mode and add kill-ring to savehist-additional-variables 3. Enable evil-mode (I'm using Evil version evil-git-9584081cf) 4. Open a medium-size file with several hundred lines 5. Copy the whole file as a rectangle, by pressing C-v G $ y 6. M-x savehist-save On an OCaml source file with about 400 lines, savehist-save took over 5 seconds and resulted in a >70MB savehist file. A suggested patch is below. For comparison, with the patch, savehist-save takes less than a second and results in a 160kB savehist file. >From 4bd805a4fb35afd5abf45e09c2f1facaf1b88f4a Mon Sep 17 00:00:00 2001 From: "Aaron L. Zeng" Date: Tue, 21 Mar 2023 16:07:54 -0400 Subject: [PATCH] * lisp/savehist.el (savehist-save): Preserve shared structure This avoids ballooning the size of variables that contain large text properties, such as the `yank-handler' installed by `evil-yank-rectangle', which contains a list of lines in the string. Copyright-paperwork-exempt: yes --- lisp/savehist.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lisp/savehist.el b/lisp/savehist.el index b532668f8a4..ea8968c771b 100644 --- a/lisp/savehist.el +++ b/lisp/savehist.el @@ -232,8 +232,9 @@ If AUTO-SAVE is non-nil, compare the saved contents to the one last saved, savehist-coding-system)) (run-hooks 'savehist-save-hook) (let ((print-length nil) - (print-level nil) - (print-quoted t)) + (print-level nil) + (print-quoted t) + (print-circle t)) ;; Save the minibuffer histories, along with the value of ;; savehist-minibuffer-history-variables itself. (when savehist-save-minibuffer-history -- 2.30.2 In GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, X toolkit, cairo version 1.15.12, Xaw scroll bars) of 2023-02-09 built on Repository revision: 739b5d0e52d83ec567bd61a5a49ac0e93e0eb469 Repository branch: HEAD Windowing system distributor 'The X.Org Foundation', version 11.0.12011000 System Description: CentOS Linux 7 (Core) Configured using: 'configure --with-x-toolkit=lucid --without-gpm --without-gconf --without-selinux --without-imagemagick --with-modules --with-gif=no --with-cairo --with-rsvg --prefix=' Configured features: CAIRO DBUS FREETYPE GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS X11 XDBE XIM XPM LUCID ZLIB Important settings: value of $LANG: en_US.utf8 locale-coding-system: utf-8-unix Major mode: Org Minor modes in effect: global-evil-surround-mode: t evil-surround-mode: t evil-org-mode: t org-appear-mode: t org-superstar-mode: t org-indent-mode: t global-display-line-numbers-mode: t evil-escape-mode: t recentf-mode: t company-mode: t eval-sexp-fu-flash-mode: t show-smartparens-global-mode: t show-smartparens-mode: t yas-global-mode: t yas-minor-mode: t mode-line-bell-mode: t indent-guide-global-mode: t indent-guide-mode: t global-column-enforce-mode: t fancy-battery-mode: t global-vi-tilde-fringe-mode: t vi-tilde-fringe-mode: t winner-mode: t global-spacemacs-whitespace-cleanup-mode: t spacemacs-whitespace-cleanup-mode: t winum-mode: t pupo-mode: t unkillable-scratch: t global-undo-tree-mode: t undo-tree-mode: t spaceline-info-mode: t save-place-mode: t savehist-mode: t persp-mode: t persistent-scratch-autosave-mode: t org-wild-notifier-mode: t projectile-mode: t bug-reference-mode: t global-git-commit-mode: t global-ligature-mode: t ligature-mode: t flycheck-pos-tip-mode: t global-flycheck-mode: t flycheck-mode: t jane-org-fe-minor-mode: t ivy-rich-project-root-cache-mode: t ivy-rich-mode: t global-hl-todo-mode: t hl-todo-mode: t global-fasd-mode: t purpose-mode: t eyebrowse-mode: t global-evil-quickscope-always-mode: t evil-quickscope-always-mode: t global-anzu-mode: t anzu-mode: t editorconfig-mode: t counsel-mode: t ivy-mode: t clean-aindent-mode: t hybrid-mode: t which-key-mode: t override-global-mode: t flyspell-mode: t shell-dirtrack-mode: t evil-mode: t evil-local-mode: t windmove-mode: t spacemacs-leader-override-mode: t global-spacemacs-leader-override-mode: t global-hl-line-mode: t xterm-mouse-mode: t global-auto-revert-mode: t which-function-mode: t minibuffer-depth-indicate-mode: t midnight-mode: t display-time-mode: t dired-omit-mode: t ido-vertical-mode: t global-page-break-lines-mode: t page-break-lines-mode: t global-eldoc-mode: t eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t column-number-mode: t line-number-mode: t auto-fill-function: yas--auto-fill transient-mark-mode: t Load-path shadows: Features: (shadow qp smiley gnus-cite gnus-async gnus-bcklg gnus-agent gnus-srvr gnus-score score-mode nnvirtual nntp gnus-ml gnus-msg nndoc gnus-cache gnus-dup gnus-art mm-uu mml2015 mm-view mml-smime smime dig gnus-sum shr kinsoku svg gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail mail-source utf7 netrc nnoo gnus-spec gnus-int gnus-range gnus-win gnus nnheader debbugs-gnu debbugs-compat debbugs soap-client rng-xsd rng-dt rng-util xsd-regexp autoload tar-mode arc-mode archive-mode emacsbug sendmail sort mail-extr magit-patch mc-hide-unmatched-lines-mode mc-mark-more mc-cycle-cursors multiple-cursors-core woman man eieio-opt speedbar ezimage dframe shortdoc cl-print gravatar dns counsel-projectile evil-surround misearch multi-isearch emmet-mode smartparens-html sgml-mode facemenu dom company-shell flycheck-bashate shfmt reformatter sh-script utop utop-minor-mode mule-util executable nix-format cal-iso org-duration org-eldoc evil-org ob-C smartparens-c cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs ob-js ob-perl ob-python smartparens-python python tramp-sh tramp tramp-loaddefs trampver tramp-integration files-x tramp-compat ls-lisp ob-ruby ob-sql org-appear org-download org-attach org-id org-superstar toc-org org-indent magit-imenu face-remap editorconfig-core editorconfig-core-handle editorconfig-fnmatch smex display-line-numbers evil-escape recentf tree-widget company-files company-keywords company-etags company-gtags company-dabbrev-code company-dabbrev company-semantic company-template company-capf merlin-company company overseer pkg-info epl auto-compile packed elisp-slime-nav etags fileloop flycheck-elsa flycheck-package package-lint finder eval-sexp-fu goto-addr vc-mtn log-view vc-hg vc-git vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs vc vc-dispatcher evil-lisp-state flycheck-haskell haskell-cabal haskell-utils flycheck-rust highlight-numbers parent-mode highlight-parentheses rainbow-delimiters smartparens-config smartparens-ml smartparens-org smartparens-markdown smartparens-text smartparens yasnippet-snippets yasnippet mode-line-bell indent-guide column-enforce-mode fancy-battery battery vi-tilde-fringe ol-man org-checklist ol-eshell eshell-z em-dirs esh-var em-term term disp-table ehelp em-smart esh-mode eshell esh-cmd esh-ext esh-opt esh-proc esh-io esh-arg esh-module esh-groups esh-util org-tempo tempo ol-info org-habit ol-docview doc-view jka-compr image-mode exif ol-bibtex dired-async dired-aux cus-start winner org-clock evil-matchit evil-matchit-sdk semantic/lex semantic/fw mode-local xterm-color spacemacs-whitespace-cleanup ws-butler winum spacemacs-purpose-popwin window-purpose-x imenu-list hideshow unkillable-scratch unicode-fonts undo-tree symbol-overlay string-inflection string-edit spaceline-config spaceline-segments spaceline powerline powerline-separators powerline-themes diminish saveplace savehist popwin persp-mode persistent-scratch diary-lib diary-loaddefs org-wild-notifier ox-texinfo ox-org ox-latex ox-icalendar ox-gfm ox-md ox-html table ox-ascii ox-publish ox bcc32-org bcc32-org-flycheck org-element avl-tree generator org-projectile projectile ibuf-ext ibuffer ibuffer-loaddefs org-category-capture org-capture org-agenda org-refile orgit git-rebase forge-list forge-commands forge-semi forge-bitbucket buck forge-gogs gogs forge-gitea gtea forge-gitlab glab forge-github ghub-graphql treepy gsexp ghub forge-notify forge-revnote forge-pullreq forge-issue forge-topic yaml parse-time bug-reference forge-post forge-repo forge forge-core forge-db closql emacsql-sqlite emacsql emacsql-compiler evil-collection-magit magit-bookmark magit-submodule magit-obsolete magit-blame magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit magit-sequence magit-notes magit-worktree magit-tag magit-merge magit-branch magit-reset magit-files magit-refs magit-status magit magit-repos magit-apply magit-wip magit-log magit-diff git-commit log-edit pcvs-util add-log magit-core magit-autorevert magit-margin magit-transient magit-process with-editor magit-mode transient magit-git magit-section magit-utils org org-macro org-footnote org-pcomplete org-list org-faces org-entities org-version ob-dot ob-shell ob ob-tangle org-src ob-ref ob-lob ob-table ob-exp ob-comint ob-emacs-lisp ob-core ob-eval org-table oc-basic bibtex iso8601 org-keys oc org-loaddefs cal-menu calendar cal-loaddefs ol org-compat org-macs async alert log4e notifications dbus gntp org-rich-yank multi-line multi-line-find multi-line-enter multi-line-decorator multi-line-respace multi-line-shared shut-up multi-line-cycle multi-line-candidate ligature keycast jane-async-merlin jane-merlin merlin-imenu flycheck-ocaml flycheck-pos-tip pos-tip flycheck merlin-xref merlin-cap merlin crm jane-common image+ image-file image-converter whitespace jane-auto-modes vba-mode markdown-mode jane-deprecated jane-smerge gnu-elpa-keyring-update jane-load-x-slowness-mitigation jane-elpa-snapshot jane-completion smerge-mode diff-mode diff ffap ecaml_plugin linum gopcaml bookmark jane jane-micro-features grep server jane-diff unified-test-mode shell-file jane-sexp jane-ocaml jane-tuareg-theme jane-ocp-indent ocp-indent tuareg tuareg-compat tuareg-opam skeleton flymake-proc flymake smie caml-types caml-help view find-file jane-cr jane-align jane-util jane-autoloads core core-buffer core-error core-util ert ewoc debug backtrace find-func ivy-rich ivy-hydra ivy-avy avy hl-todo fasd window-purpose window-purpose-fixes window-purpose-prefix-overload window-purpose-switch let-alist window-purpose-layout window-purpose-core window-purpose-configuration window-purpose-utils eyebrowse evil-unimpaired f evil-textobj-line evil-quickscope evil-easymotion evil-collection-dired evil-collection-buff-menu evil-collection annalist evil-anzu anzu emr popup s dash editorconfig noutline outline drag-stuff counsel xdg xref project compile swiper ivy flx delsel ivy-faces ivy-overlay colir clean-aindent-mode clang-format xml cl tex-site hybrid-mode evil-evilified-state which-key use-package use-package-ensure use-package-delight use-package-diminish use-package-bind-key bind-key use-package-core hydra lv evil evil-integration evil-maps evil-commands reveal flyspell ispell evil-jumps evil-command-window evil-search evil-ex shell pcomplete comint ansi-color evil-types evil-macros evil-repeat evil-states evil-core evil-common windmove calc calc-loaddefs calc-macs thingatpt rect evil-digraphs evil-vars ring bind-map info mm-archive message rfc822 mml mml-sec epa gnus-util rmail rmail-loaddefs text-property-search time-date mailabbrev gmm-utils mailheader mail-utils gnutls network-stream url-http url-gw nsm rmc puny url-cache url-auth quelpa mm-decode mm-bodies mm-encode lisp-mnt mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr help-fns radix-tree hl-line xt-mouse autorevert filenotify cl-extra solarized-light-theme solarized solarized-faces color format-spec finder-inf jane-elpa-pin which-func imenu mb-depth midnight time dired-x dired dired-loaddefs ido-vertical-mode ido core-spacemacs core-spacebind core-use-package-ext core-transient-state core-micro-state core-toggle core-keybindings core-fonts-support core-themes-support core-display-init core-jump core-release-management core-custom-settings core-configuration-layer eieio-compat core-progress-bar core-spacemacs-buffer core-funcs spacemacs-ht inline help-mode warnings package browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq password-cache json map url-vars eieio eieio-core eieio-loaddefs epg rfc6068 epg-config core-command-line core-debug edmacro kmacro derived profiler core-hooks page-break-lines easy-mmode core-env load-env-vars rx core-dotspacemacs advice pcase core-customization validate cus-edit pp cus-load wid-edit seq byte-opt bytecomp byte-compile cconv core-emacs-backports core-compilation core-dumper subr-x spinner cl-macs gv cl-loaddefs cl-lib core-load-paths core-versions core-early-funcs iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help simple abbrev obarray cl-preloaded nadvice button loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote threads dbusbind inotify dynamic-setting system-font-setting font-render-setting cairo x-toolkit x multi-tty make-network-process emacs) Memory information: ((conses 16 3145559 2267191) (symbols 48 125163 50) (strings 32 519749 443235) (string-bytes 1 16529585) (vectors 16 170854) (vector-slots 8 3077103 1711953) (floats 8 3673 6250) (intervals 56 174226 83831) (buffers 992 93) (heap 1024 611628 397693)) ------------=_1679746562-17732-1--