* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
@ 2024-05-20 15:43 Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-20 16:20 ` Eli Zaretskii
0 siblings, 1 reply; 10+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-20 15:43 UTC (permalink / raw)
To: 71080; +Cc: monnier
Package: Emacs
Version: 30.0.50
Create a file `~/tmp/foo.txt` with the following content:
λ
# Local Variables:
# coding: iso-2022-7bit
# End:
Then
emacs -Q ~/tmp/foo.txt
C-x C-w foo.gpg RET # To save the file into an encrypted `foo.gpg`.
TAB TAB RET # To select symmetric encryption.
.. type the password you'd like to use ...
M-x revert-buffer RET
and then you should see that he `λ` turned into its UTF-8 sequence `\316\273`.
The same happens if you encrypt with public keys and if you use any
other encoding that's different from UTF-8.
AFAICT, the problem is partly due to
(find-coding-systems-region (point-min) (point-max))
returning a list which includes `no-conversion` because in the end the
buffer is saved with "no conversion" (i.e. it uses Emacs's internal
encoding). Another part of the problem is that `find-auto-coding`
returns `no-conversion` for `.gpg` files because those files are binary.
IOW it can be considered as the result of "no conversion" being
ambiguous, meaning either "binary" or "Emacs's internal encoding"
depending on the circumstances. But it's also due to the confusion
between the encoding to use before encryption (resp. after decryption)
and the encoding to use after encryption (resp. before decryption).
I don't understand enough of how the "no conversion" ambiguity is
expected to be resolved, nor how the different layers of encoding
are supposed to be handled in file-name-handlers to dig much deeper.
Stefan
In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
3.24.38, cairo version 1.16.0) of 2024-04-23 built on pastel
Repository revision: c736206045227123fd2dec4c8028f013f78090c5
Repository branch: work
Windowing system distributor 'The X.Org Foundation', version 11.0.12101007
System Description: Debian GNU/Linux 12 (bookworm)
Configured using:
'configure -C --enable-checking --enable-check-lisp-object-type --with-modules --with-cairo --with-tiff=ifavailable
'CFLAGS=-Wall -g3 -Og -Wno-pointer-sign' --without-native-compilation
PKG_CONFIG_PATH=/home/monnier/lib/pkgconfig'
Configured features:
CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
LIBSELINUX LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND
THREADS TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XDBE XIM XINPUT2 XPM
GTK3 ZLIB
Important settings:
value of $LANG: fr_CH.UTF-8
locale-coding-system: utf-8-unix
Major mode: Group
Minor modes in effect:
csv-field-index-mode: t
gnus-undo-mode: t
server-mode: t
electric-pair-mode: t
global-reveal-mode: t
reveal-mode: t
auto-insert-mode: t
savehist-mode: t
minibuffer-electric-default-mode: t
type-break-mode: t
global-compact-docstrings-mode: t
global-corfu-mode: t
corfu-mode: t
url-handler-mode: t
global-eldoc-mode: t
show-paren-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
global-prettify-symbols-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
minibuffer-regexp-mode: t
global-sanity-check-change-functions-mode: t
buffer-read-only: t
line-number-mode: t
transient-mark-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
Load-path shadows:
/home/monnier/src/emacs/nongnu/packages/jade-mode/jade-mode hides /home/monnier/src/emacs/nongnu/packages/stylus-mode/jade-mode
/home/monnier/src/emacs/nongnu/packages/jade-mode/sws-mode hides /home/monnier/src/emacs/nongnu/packages/stylus-mode/sws-mode
/home/monnier/src/emacs/nongnu/packages/jade-mode/stylus-mode hides /home/monnier/src/emacs/nongnu/packages/stylus-mode/stylus-mode
/home/monnier/src/emacs/nongnu/packages/paredit/test hides /home/monnier/src/emacs/elpa/packages/easy-kill/test
/home/monnier/src/emacs/elpa/packages/embark-consult/embark-consult hides /home/monnier/src/emacs/elpa/packages/embark/embark-consult
/home/monnier/src/emacs/elpa/packages/embark-consult/embark-org hides /home/monnier/src/emacs/elpa/packages/embark/embark-org
/home/monnier/src/emacs/elpa/packages/embark-consult/embark hides /home/monnier/src/emacs/elpa/packages/embark/embark
/home/monnier/src/emacs/elpa/packages/embark-consult/avy-embark-collect hides /home/monnier/src/emacs/elpa/packages/embark/avy-embark-collect
/home/monnier/src/emacs/elpa/packages/ada-mode/prj hides /home/monnier/src/emacs/elpa/packages/gpr-query/prj
/home/monnier/src/emacs/nongnu/packages/forth-mode/build hides /home/monnier/src/emacs/elpa/packages/lentic/build
/home/monnier/src/emacs/elpa/packages/ef-themes/theme-loaddefs hides /home/monnier/src/emacs/elpa/packages/modus-themes/theme-loaddefs
/home/monnier/src/emacs/nongnu/packages/paredit/test hides /home/monnier/src/emacs/elpa/packages/num3-mode/test
/home/monnier/src/emacs/nongnu/packages/org-contrib/lisp/ob-asymptote hides /home/monnier/src/emacs/elpa/packages/ob-asymptote/ob-asymptote
/home/monnier/src/emacs/elpa/packages/realgud-lldb/cask-install hides /home/monnier/src/emacs/elpa/packages/realgud-trepan-ni/cask-install
/home/monnier/src/emacs/elpa/packages/realgud-lldb/cask-install hides /home/monnier/src/emacs/elpa/packages/realgud/cask-install
/home/monnier/src/emacs/elpa/packages/realgud-lldb/cask-install hides /home/monnier/src/emacs/elpa/packages/loc-changes/cask-install
/home/monnier/src/emacs/elpa/packages/ef-themes/theme-loaddefs hides /home/monnier/src/emacs/elpa/packages/standard-themes/theme-loaddefs
/home/monnier/src/emacs/elpa/packages/elsa/Elsafile hides /home/monnier/src/emacs/elpa/packages/trinary/Elsafile
/home/monnier/src/emacs/elpa/packages/url-http-oauth-demo/url-http-oauth-demo hides /home/monnier/src/emacs/elpa/packages/url-http-oauth/url-http-oauth-demo
/home/monnier/src/emacs/nongnu/packages/vm/lisp/vcard hides /home/monnier/src/emacs/elpa/packages/vcard/vcard
/home/monnier/src/emacs/elpa/packages/hydra/hydra-test hides /home/monnier/src/emacs/elpa/packages/lv/hydra-test
/home/monnier/src/emacs/elpa/packages/hydra/hydra hides /home/monnier/src/emacs/elpa/packages/lv/hydra
/home/monnier/src/emacs/elpa/packages/hydra/lv hides /home/monnier/src/emacs/elpa/packages/lv/lv
/home/monnier/src/emacs/elpa/packages/hydra/hydra-ox hides /home/monnier/src/emacs/elpa/packages/lv/hydra-ox
/home/monnier/src/emacs/elpa/packages/hydra/hydra-examples hides /home/monnier/src/emacs/elpa/packages/lv/hydra-examples
/home/monnier/src/emacs/elpa/packages/ef-themes/theme-loaddefs hides /home/monnier/src/emacs/work/lisp/theme-loaddefs
/home/monnier/src/emacs/elpa/packages/idlwave/idlw-help hides /home/monnier/src/emacs/work/lisp/progmodes/idlw-help
/home/monnier/src/emacs/elpa/packages/idlwave/idlw-complete-structtag hides /home/monnier/src/emacs/work/lisp/progmodes/idlw-complete-structtag
/home/monnier/src/emacs/elpa/packages/idlwave/idlw-toolbar hides /home/monnier/src/emacs/work/lisp/progmodes/idlw-toolbar
/home/monnier/src/emacs/elpa/packages/idlwave/idlwave hides /home/monnier/src/emacs/work/lisp/progmodes/idlwave
/home/monnier/src/emacs/elpa/packages/csharp-mode/csharp-mode hides /home/monnier/src/emacs/work/lisp/progmodes/csharp-mode
/home/monnier/src/emacs/nongnu/packages/lua-mode/lua-mode hides /home/monnier/src/emacs/work/lisp/progmodes/lua-mode
/home/monnier/src/emacs/elpa/packages/idlwave/idlw-shell hides /home/monnier/src/emacs/work/lisp/progmodes/idlw-shell
/home/monnier/src/emacs/elpa/packages/org/lisp/org-src hides /home/monnier/src/emacs/work/lisp/org/org-src
/home/monnier/src/emacs/elpa/packages/org/lisp/oc hides /home/monnier/src/emacs/work/lisp/org/oc
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-screen hides /home/monnier/src/emacs/work/lisp/org/ob-screen
/home/monnier/src/emacs/elpa/packages/org/lisp/org-loaddefs hides /home/monnier/src/emacs/work/lisp/org/org-loaddefs
/home/monnier/src/emacs/elpa/packages/org/lisp/org-agenda hides /home/monnier/src/emacs/work/lisp/org/org-agenda
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-dot hides /home/monnier/src/emacs/work/lisp/org/ob-dot
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-plantuml hides /home/monnier/src/emacs/work/lisp/org/ob-plantuml
/home/monnier/src/emacs/elpa/packages/org/lisp/org-inlinetask hides /home/monnier/src/emacs/work/lisp/org/org-inlinetask
/home/monnier/src/emacs/elpa/packages/org/lisp/oc-natbib hides /home/monnier/src/emacs/work/lisp/org/oc-natbib
/home/monnier/src/emacs/elpa/packages/org/lisp/org-attach-git hides /home/monnier/src/emacs/work/lisp/org/org-attach-git
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-docview hides /home/monnier/src/emacs/work/lisp/org/ol-docview
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-exp hides /home/monnier/src/emacs/work/lisp/org/ob-exp
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-mhe hides /home/monnier/src/emacs/work/lisp/org/ol-mhe
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-awk hides /home/monnier/src/emacs/work/lisp/org/ob-awk
/home/monnier/src/emacs/elpa/packages/org/lisp/org-fold-core hides /home/monnier/src/emacs/work/lisp/org/org-fold-core
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-doi hides /home/monnier/src/emacs/work/lisp/org/ol-doi
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-ref hides /home/monnier/src/emacs/work/lisp/org/ob-ref
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-calc hides /home/monnier/src/emacs/work/lisp/org/ob-calc
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-js hides /home/monnier/src/emacs/work/lisp/org/ob-js
/home/monnier/src/emacs/elpa/packages/org/lisp/org-colview hides /home/monnier/src/emacs/work/lisp/org/org-colview
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-julia hides /home/monnier/src/emacs/work/lisp/org/ob-julia
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-ruby hides /home/monnier/src/emacs/work/lisp/org/ob-ruby
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-forth hides /home/monnier/src/emacs/work/lisp/org/ob-forth
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-lua hides /home/monnier/src/emacs/work/lisp/org/ob-lua
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-lob hides /home/monnier/src/emacs/work/lisp/org/ob-lob
/home/monnier/src/emacs/elpa/packages/org/lisp/org-compat hides /home/monnier/src/emacs/work/lisp/org/org-compat
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-matlab hides /home/monnier/src/emacs/work/lisp/org/ob-matlab
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-scheme hides /home/monnier/src/emacs/work/lisp/org/ob-scheme
/home/monnier/src/emacs/elpa/packages/org/lisp/org-table hides /home/monnier/src/emacs/work/lisp/org/org-table
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-haskell hides /home/monnier/src/emacs/work/lisp/org/ob-haskell
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-octave hides /home/monnier/src/emacs/work/lisp/org/ob-octave
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-processing hides /home/monnier/src/emacs/work/lisp/org/ob-processing
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-bibtex hides /home/monnier/src/emacs/work/lisp/org/ol-bibtex
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-ocaml hides /home/monnier/src/emacs/work/lisp/org/ob-ocaml
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-bbdb hides /home/monnier/src/emacs/work/lisp/org/ol-bbdb
/home/monnier/src/emacs/elpa/packages/org/lisp/org-plot hides /home/monnier/src/emacs/work/lisp/org/org-plot
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-core hides /home/monnier/src/emacs/work/lisp/org/ob-core
/home/monnier/src/emacs/elpa/packages/org/lisp/org-refile hides /home/monnier/src/emacs/work/lisp/org/org-refile
/home/monnier/src/emacs/elpa/packages/org/lisp/org-lint hides /home/monnier/src/emacs/work/lisp/org/org-lint
/home/monnier/src/emacs/elpa/packages/org/lisp/org-footnote hides /home/monnier/src/emacs/work/lisp/org/org-footnote
/home/monnier/src/emacs/elpa/packages/org/lisp/org hides /home/monnier/src/emacs/work/lisp/org/org
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-w3m hides /home/monnier/src/emacs/work/lisp/org/ol-w3m
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-info hides /home/monnier/src/emacs/work/lisp/org/ol-info
/home/monnier/src/emacs/elpa/packages/org/lisp/org-num hides /home/monnier/src/emacs/work/lisp/org/org-num
/home/monnier/src/emacs/elpa/packages/org/lisp/org-cycle hides /home/monnier/src/emacs/work/lisp/org/org-cycle
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-tangle hides /home/monnier/src/emacs/work/lisp/org/ob-tangle
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-clojure hides /home/monnier/src/emacs/work/lisp/org/ob-clojure
/home/monnier/src/emacs/elpa/packages/org/lisp/org-attach hides /home/monnier/src/emacs/work/lisp/org/org-attach
/home/monnier/src/emacs/elpa/packages/org/lisp/org-element hides /home/monnier/src/emacs/work/lisp/org/org-element
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-comint hides /home/monnier/src/emacs/work/lisp/org/ob-comint
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-latex hides /home/monnier/src/emacs/work/lisp/org/ox-latex
/home/monnier/src/emacs/elpa/packages/org/lisp/org-faces hides /home/monnier/src/emacs/work/lisp/org/org-faces
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-html hides /home/monnier/src/emacs/work/lisp/org/ox-html
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-lisp hides /home/monnier/src/emacs/work/lisp/org/ob-lisp
/home/monnier/src/emacs/elpa/packages/org/lisp/org-persist hides /home/monnier/src/emacs/work/lisp/org/org-persist
/home/monnier/src/emacs/elpa/packages/org/lisp/oc-basic hides /home/monnier/src/emacs/work/lisp/org/oc-basic
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-maxima hides /home/monnier/src/emacs/work/lisp/org/ob-maxima
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-gnuplot hides /home/monnier/src/emacs/work/lisp/org/ob-gnuplot
/home/monnier/src/emacs/elpa/packages/org/lisp/org-archive hides /home/monnier/src/emacs/work/lisp/org/org-archive
/home/monnier/src/emacs/elpa/packages/org/lisp/org-protocol hides /home/monnier/src/emacs/work/lisp/org/org-protocol
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-gnus hides /home/monnier/src/emacs/work/lisp/org/ol-gnus
/home/monnier/src/emacs/elpa/packages/org/lisp/org-indent hides /home/monnier/src/emacs/work/lisp/org/org-indent
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-java hides /home/monnier/src/emacs/work/lisp/org/ob-java
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-shell hides /home/monnier/src/emacs/work/lisp/org/ob-shell
/home/monnier/src/emacs/elpa/packages/org/lisp/org-tempo hides /home/monnier/src/emacs/work/lisp/org/org-tempo
/home/monnier/src/emacs/elpa/packages/org/lisp/oc-bibtex hides /home/monnier/src/emacs/work/lisp/org/oc-bibtex
/home/monnier/src/emacs/elpa/packages/org/lisp/ob hides /home/monnier/src/emacs/work/lisp/org/ob
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-texinfo hides /home/monnier/src/emacs/work/lisp/org/ox-texinfo
/home/monnier/src/emacs/elpa/packages/org/lisp/org-ctags hides /home/monnier/src/emacs/work/lisp/org/org-ctags
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-beamer hides /home/monnier/src/emacs/work/lisp/org/ox-beamer
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-perl hides /home/monnier/src/emacs/work/lisp/org/ob-perl
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-man hides /home/monnier/src/emacs/work/lisp/org/ox-man
/home/monnier/src/emacs/elpa/packages/org/lisp/org-version hides /home/monnier/src/emacs/work/lisp/org/org-version
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-R hides /home/monnier/src/emacs/work/lisp/org/ob-R
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-icalendar hides /home/monnier/src/emacs/work/lisp/org/ox-icalendar
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-python hides /home/monnier/src/emacs/work/lisp/org/ob-python
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-sass hides /home/monnier/src/emacs/work/lisp/org/ob-sass
/home/monnier/src/emacs/elpa/packages/org/lisp/oc-csl hides /home/monnier/src/emacs/work/lisp/org/oc-csl
/home/monnier/src/emacs/elpa/packages/org/lisp/org-feed hides /home/monnier/src/emacs/work/lisp/org/org-feed
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-ascii hides /home/monnier/src/emacs/work/lisp/org/ox-ascii
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-eshell hides /home/monnier/src/emacs/work/lisp/org/ob-eshell
/home/monnier/src/emacs/elpa/packages/org/lisp/org-id hides /home/monnier/src/emacs/work/lisp/org/org-id
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-man hides /home/monnier/src/emacs/work/lisp/org/ol-man
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-org hides /home/monnier/src/emacs/work/lisp/org/ox-org
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-ditaa hides /home/monnier/src/emacs/work/lisp/org/ob-ditaa
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-rmail hides /home/monnier/src/emacs/work/lisp/org/ol-rmail
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-C hides /home/monnier/src/emacs/work/lisp/org/ob-C
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-emacs-lisp hides /home/monnier/src/emacs/work/lisp/org/ob-emacs-lisp
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-makefile hides /home/monnier/src/emacs/work/lisp/org/ob-makefile
/home/monnier/src/emacs/elpa/packages/org/lisp/org-keys hides /home/monnier/src/emacs/work/lisp/org/org-keys
/home/monnier/src/emacs/elpa/packages/org/lisp/org-duration hides /home/monnier/src/emacs/work/lisp/org/org-duration
/home/monnier/src/emacs/elpa/packages/org/lisp/org-macro hides /home/monnier/src/emacs/work/lisp/org/org-macro
/home/monnier/src/emacs/elpa/packages/org/lisp/org-timer hides /home/monnier/src/emacs/work/lisp/org/org-timer
/home/monnier/src/emacs/elpa/packages/org/lisp/org-datetree hides /home/monnier/src/emacs/work/lisp/org/org-datetree
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-sed hides /home/monnier/src/emacs/work/lisp/org/ob-sed
/home/monnier/src/emacs/elpa/packages/org/lisp/ol hides /home/monnier/src/emacs/work/lisp/org/ol
/home/monnier/src/emacs/elpa/packages/org/lisp/org-list hides /home/monnier/src/emacs/work/lisp/org/org-list
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-eshell hides /home/monnier/src/emacs/work/lisp/org/ol-eshell
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-eval hides /home/monnier/src/emacs/work/lisp/org/ob-eval
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-css hides /home/monnier/src/emacs/work/lisp/org/ob-css
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-table hides /home/monnier/src/emacs/work/lisp/org/ob-table
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-eww hides /home/monnier/src/emacs/work/lisp/org/ol-eww
/home/monnier/src/emacs/elpa/packages/org/lisp/ox hides /home/monnier/src/emacs/work/lisp/org/ox
/home/monnier/src/emacs/elpa/packages/org/lisp/oc-biblatex hides /home/monnier/src/emacs/work/lisp/org/oc-biblatex
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-fortran hides /home/monnier/src/emacs/work/lisp/org/ob-fortran
/home/monnier/src/emacs/elpa/packages/org/lisp/org-habit hides /home/monnier/src/emacs/work/lisp/org/org-habit
/home/monnier/src/emacs/elpa/packages/org/lisp/ol-irc hides /home/monnier/src/emacs/work/lisp/org/ol-irc
/home/monnier/src/emacs/elpa/packages/org/lisp/org-mouse hides /home/monnier/src/emacs/work/lisp/org/org-mouse
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-koma-letter hides /home/monnier/src/emacs/work/lisp/org/ox-koma-letter
/home/monnier/src/emacs/elpa/packages/org/lisp/org-mobile hides /home/monnier/src/emacs/work/lisp/org/org-mobile
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-publish hides /home/monnier/src/emacs/work/lisp/org/ox-publish
/home/monnier/src/emacs/elpa/packages/org/lisp/org-clock hides /home/monnier/src/emacs/work/lisp/org/org-clock
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-lilypond hides /home/monnier/src/emacs/work/lisp/org/ob-lilypond
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-sqlite hides /home/monnier/src/emacs/work/lisp/org/ob-sqlite
/home/monnier/src/emacs/elpa/packages/org/lisp/org-macs hides /home/monnier/src/emacs/work/lisp/org/org-macs
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-odt hides /home/monnier/src/emacs/work/lisp/org/ox-odt
/home/monnier/src/emacs/elpa/packages/org/lisp/org-fold hides /home/monnier/src/emacs/work/lisp/org/org-fold
/home/monnier/src/emacs/elpa/packages/org/lisp/org-crypt hides /home/monnier/src/emacs/work/lisp/org/org-crypt
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-org hides /home/monnier/src/emacs/work/lisp/org/ob-org
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-latex hides /home/monnier/src/emacs/work/lisp/org/ob-latex
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-groovy hides /home/monnier/src/emacs/work/lisp/org/ob-groovy
/home/monnier/src/emacs/elpa/packages/org/lisp/ob-sql hides /home/monnier/src/emacs/work/lisp/org/ob-sql
/home/monnier/src/emacs/elpa/packages/org/lisp/org-pcomplete hides /home/monnier/src/emacs/work/lisp/org/org-pcomplete
/home/monnier/src/emacs/elpa/packages/org/lisp/ox-md hides /home/monnier/src/emacs/work/lisp/org/ox-md
/home/monnier/src/emacs/elpa/packages/org/lisp/org-capture hides /home/monnier/src/emacs/work/lisp/org/org-capture
/home/monnier/src/emacs/elpa/packages/org/lisp/org-entities hides /home/monnier/src/emacs/work/lisp/org/org-entities
/home/monnier/src/emacs/elpa/packages/org/lisp/org-goto hides /home/monnier/src/emacs/work/lisp/org/org-goto
/home/monnier/src/emacs/elpa/packages/hyperbole/set hides /home/monnier/src/emacs/work/lisp/emacs-lisp/set
/home/monnier/src/emacs/work/lisp/keymap hides /home/monnier/src/emacs/work/lisp/emacs-lisp/keymap
/home/monnier/src/emacs/elpa/packages/landmark/landmark hides /home/monnier/src/emacs/work/lisp/obsolete/landmark
/home/monnier/src/emacs/elpa/packages/crisp/crisp hides /home/monnier/src/emacs/work/lisp/obsolete/crisp
Features:
(shadow emacsbug find-cmd grep whitespace edebug display-line-numbers
debbugs-browse prefixed-core nnagent nnml vc gnus-topic shortdoc
comp-common mouse-copy mouse-drag csv-mode dabbrev sm-es skeleton
gnus-draft view cal-china lunar solar cal-dst cal-bahai cal-islam
cal-hebrew holidays holiday-loaddefs cal-french org-journal org-crypt
cal-iso cal-move bbdb-com org-eldoc oc-basic org-element org-persist
org-id org-element-ast avl-tree generator ol-eww eww ol-rmail ol-mhe
ol-irc ol-info ol-gnus nnselect ol-docview ol-bibtex bibtex ol-bbdb
ol-w3m ol-doi org-link-doi autorevert doc-view filenotify image-mode
exif gnus-fun gnus-icalendar org-capture org-refile org ob ob-tangle
ob-ref ob-lob ob-table ob-exp org-macro org-src sh-script smie treesit
make-mode ob-comint org-pcomplete org-list org-footnote org-faces
org-entities ob-emacs-lisp ob-core ob-eval org-cycle org-table ol
org-fold org-fold-core org-keys oc org-loaddefs org-version org-compat
org-macs icalendar diary-lib diary-loaddefs cal-menu calendar
cal-loaddefs quail misearch multi-isearch epa-file emoji-labels emoji
multisession sqlite transient edmacro kmacro smerge-mode jka-compr
filecache bbdb bbdb-site timezone nnfolder canlock flow-fill gnus-html
url-queue mm-url utf-7 raku-detect shr-color color ecomplete mailalias
smtpmail tramp trampver tramp-integration files-x tramp-message
tramp-compat xdg shell drupal/pcomplete pcomplete tramp-loaddefs
tramp-core gited-tests gited vc-git diff-mode track-changes easy-mmode
vc-dispatcher gited-ci ert ewoc cl-print debug backtrace find-func
el-mock help-fns radix-tree rect format-spec mule-util sort smiley
gnus-cite mail-extr textsec uni-scripts idna-mapping ucs-normalize
uni-confusable textsec-check qp gnus-async gnus-bcklg debbugs-gnu
add-log debbugs-compat debbugs soap-client rng-xsd rng-dt rng-util
xsd-regexp gnus-ml nndoc mm-archive url-http-oauth url-http-ntlm ntlm
hmac-md5 hex-util md4 url-http url-gw url-cache crm bug-reference
nndraft nnmh rfc2104 network-stream nsm executable diff copyright nnnil
gnus-agent gnus-srvr gnus-score score-mode nnvirtual gnus-msg gnus-art
mm-uu mml2015 mm-view mml-smime smime gnutls dig nntp gnus-cache
gnus-sum shr pixel-fill kinsoku url-file svg dom gnus-group gnus-undo
server gnus-start gnus-dbus dbus xml gnus-cloud nnimap nnmail
mail-source utf7 nnoo parse-time iso8601 gnus-spec gnus-int gnus-range
message sendmail yank-media puny dired dired-loaddefs rfc822 mml mml-sec
epa derived epg rfc6068 epg-config mm-decode mm-bodies mm-encode
mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mailabbrev gmm-utils
mailheader gnus-win gnus nnheader gnus-util mail-utils range mm-util
mail-prsvr time-date flymake project compile text-property-search comint
ansi-osc ansi-color ring warnings noutline outline flyspell ispell
checkdoc lisp-mnt thingatpt elec-pair reveal autoinsert savehist
minibuf-eldef disp-table type-break compact-docstrings corfu compat
adoc-mode-autoloads afternoon-theme-autoloads alect-themes-autoloads
ample-theme-autoloads annotate-autoloads anti-zenburn-theme-autoloads
apache-mode-autoloads apropospriate-theme-autoloads
arduino-mode-autoloads ede/auto eieio-base
auto-dim-other-buffers-autoloads bash-completion-autoloads
better-jumper-autoloads bison-mode-autoloads blow-autoloads
blueprint-ts-mode-autoloads boxquote-autoloads buttercup-autoloads
camera-autoloads cdlatex-autoloads cider-autoloads
clojure-ts-mode-autoloads coffee-mode-autoloads
consult-flycheck-autoloads corfu-terminal-autoloads crux-autoloads
cyberpunk-theme-autoloads cycle-at-point-autoloads d-mode-autoloads
dart-mode-autoloads dcs-mode-autoloads denote-refs-autoloads
devhelp-autoloads devil-autoloads diff-ansi-autoloads dirvish-autoloads
doc-show-inline-autoloads dockerfile-mode-autoloads
dracula-theme-autoloads drupal-mode-autoloads eat-autoloads
edit-indirect-autoloads editorconfig-autoloads el-mock-autoloads
elixir-mode-autoloads elpher-autoloads emacsql-autoloads
engine-mode-autoloads evil-anzu-autoloads anzu-autoloads
evil-args-autoloads evil-escape-autoloads evil-exchange-autoloads
evil-goggles-autoloads evil-iedit-state-autoloads
evil-indent-plus-autoloads evil-lisp-state-autoloads bind-map-autoloads
evil-matchit-autoloads evil-nerd-commenter-autoloads
evil-numbers-autoloads evil-surround-autoloads
evil-visual-mark-mode-autoloads evil-visualstar-autoloads evil-autoloads
exec-path-from-shell-autoloads flx-ido-autoloads flx-autoloads
flycheck-autoloads flymake-guile-autoloads flymake-kondor-autoloads
flymake-popon-autoloads focus-autoloads forth-mode-autoloads
free-keys-autoloads gc-buffers-autoloads geiser-chez-autoloads
geiser-chibi-autoloads geiser-chicken-autoloads geiser-gambit-autoloads
geiser-gauche-autoloads geiser-guile-autoloads geiser-kawa-autoloads
geiser-mit-autoloads geiser-racket-autoloads geiser-stklos-autoloads
geiser-autoloads git-modes-autoloads gnu-apl-mode-autoloads
gnu-indent-autoloads gnuplot-autoloads go-mode-autoloads
golden-ratio-autoloads gotham-theme-autoloads goto-chg-autoloads
graphql-mode-autoloads gruber-darker-theme-autoloads
gruvbox-theme-autoloads autothemer-autoloads guru-mode-autoloads
haskell-tng-mode-autoloads helm-autoloads helm-core-autoloads
highlight-parentheses-autoloads hl-block-mode-autoloads
hl-column-autoloads htmlize-autoloads hyperdrive-autoloads
idle-highlight-mode-autoloads idris-mode-autoloads iedit-autoloads
inf-clojure-autoloads clojure-mode-autoloads inf-ruby-autoloads
inkpot-theme-autoloads iwindow-autoloads j-mode-autoloads
jabber-autoloads jade-mode-autoloads jinja2-mode-autoloads
julia-mode-autoloads keycast-autoloads kotlin-mode-autoloads
lorem-ipsum-autoloads lua-mode-autoloads markdown-mode-autoloads
mastodon-autoloads material-theme-autoloads mentor-autoloads
meow-autoloads minibar-autoloads moe-theme-autoloads
monokai-theme-autoloads mpv-autoloads multiple-cursors-autoloads
nasm-mode-autoloads nginx-mode-autoloads nix-mode-autoloads
oblivion-theme-autoloads opam-switch-mode-autoloads
org-auto-tangle-autoloads org-drill-autoloads org-journal-autoloads
org-mime-autoloads org-present-autoloads org-superstar-autoloads
org-tree-slide-autoloads orgit-autoloads package-lint-autoloads
pacmacs-autoloads page-break-lines-autoloads paredit-autoloads
parseedn-autoloads parseclj-autoloads pcmpl-args-autoloads
pcre2el-autoloads popon-autoloads popup-autoloads prescient-autoloads
projectile-autoloads proof-general-autoloads proof-site proof-autoloads
prop-menu-autoloads racket-mode-autoloads rainbow-delimiters-autoloads
raku-mode-autoloads recomplete-autoloads rfc-mode-autoloads
rubocop-autoloads rust-mode-autoloads sass-mode-autoloads
haml-mode-autoloads scad-mode-autoloads scala-mode-autoloads
scroll-on-drag-autoloads scroll-on-jump-autoloads sesman-autoloads
shellcop-autoloads slime-autoloads macrostep-autoloads sly-autoloads
smartparens-autoloads solarized-theme-autoloads
spacemacs-theme-autoloads spell-fu-autoloads sqlite3-autoloads
stylus-mode-autoloads subatomic-theme-autoloads subed-autoloads
sweeprolog-autoloads swift-mode-autoloads swsw-autoloads
symbol-overlay-autoloads systemd-autoloads tablist-autoloads
tangotango-theme-autoloads telephone-line-autoloads
testcover-mark-line-autoloads textile-mode-autoloads toc-org-autoloads
totp-auth-autoloads base32-autoloads tuareg-autoloads rx caml-autoloads
typescript-mode-autoloads ujelly-theme-autoloads undo-fu-autoloads
undo-fu-session-autoloads vc-fossil-autoloads vcomplete-autoloads
visual-fill-column-autoloads vm-autoloads web-mode-autoloads
webpaste-autoloads wfnames-autoloads wgrep-autoloads why-this-autoloads
with-simulated-input-autoloads workroom-autoloads
writegood-mode-autoloads ws-butler-autoloads xah-fly-keys-autoloads
xkcd-autoloads xml-rpc-autoloads yaml-mode-autoloads
yasnippet-snippets-autoloads zenburn-theme-autoloads zig-mode-autoloads
reformatter-autoloads ace-window-autoloads ack-autoloads
activities-autoloads ada-mode-autoloads ada-ref-man-autoloads
adaptive-wrap-autoloads adjust-parens-autoloads advice-patch-autoloads
aggressive-completion-autoloads aggressive-indent-autoloads
agitate-autoloads ahungry-theme-autoloads aircon-theme-autoloads
all-autoloads altcaps-autoloads ampc-autoloads arbitools-autoloads
assess-autoloads aumix-mode-autoloads auto-correct-autoloads
auto-header-autoloads auto-overlays-autoloads autocrypt-autoloads
bbdb-autoloads beacon-autoloads beardbolt-autoloads beframe-autoloads
bicep-ts-mode-autoloads blist-autoloads bluetooth-autoloads
bnf-mode-autoloads boxy-headings-autoloads boxy-headlines-autoloads
breadcrumb-autoloads brief-autoloads buffer-env-autoloads
buffer-expose-autoloads bufferlo-autoloads bug-hunter-autoloads
buildbot-autoloads calibre-autoloads cape-autoloads
capf-autosuggest-autoloads caps-lock-autoloads captain-autoloads
chess-autoloads clipboard-collector-autoloads cobol-mode-autoloads
code-cells-autoloads compact-docstrings-autoloads company-ebdb-autoloads
company-math-autoloads company-statistics-autoloads company-autoloads
consult-hoogle-autoloads haskell-mode-autoloads consult-recoll-autoloads
context-coloring-autoloads corfu-autoloads coterm-autoloads
counsel-autoloads cpio-mode-autoloads cpupower-autoloads crdt-autoloads
crisp-autoloads csharp-mode-autoloads csv-mode-autoloads
cursory-autoloads cycle-quotes-autoloads dape-autoloads
darkroom-autoloads dbus-codegen-autoloads debbugs-autoloads
delight-autoloads denote-menu-autoloads denote-autoloads
detached-autoloads devdocs-autoloads devicetree-ts-mode-autoloads
dict-tree-autoloads diff-hl-autoloads diffview-autoloads
diminish-autoloads dired-du-autoloads dired-duplicates-autoloads
dired-git-info-autoloads dired-preview-autoloads disk-usage-autoloads
dismal-autoloads djvu-autoloads do-at-point-autoloads doc-toc-autoloads
docbook-autoloads drepl-autoloads comint-mime-autoloads
dts-mode-autoloads easy-escape-autoloads easy-kill-autoloads
ebdb-gnorb-autoloads cl-seq inline ebdb-i18n-chn-autoloads
ebdb-autoloads cl-extra help-mode ediprolog-autoloads eev-autoloads
ef-themes-autoloads el-search-autoloads electric-spacing-autoloads
elisp-benchmarks-autoloads ellama-autoloads elsa-autoloads
emacs-gc-stats-autoloads emacspeak-autoloads embark-consult-autoloads
consult-autoloads embark-autoloads ement-autoloads emms-autoloads
engrave-faces-autoloads enwc-autoloads epoch-view-autoloads
ergoemacs-mode-autoloads ess-autoloads excorporate-autoloads
expand-region-autoloads expreg-autoloads exwm-autoloads
f90-interface-browser-autoloads face-shift-autoloads
filechooser-autoloads filladapt-autoloads
firefox-javascript-repl-autoloads flylisp-autoloads
flymake-codespell-autoloads flymake-proselint-autoloads
fontaine-autoloads frame-tabs-autoloads frog-menu-autoloads
fsm-autoloads ftable-autoloads gcmh-autoloads ggtags-autoloads
gited-autoloads gle-mode-autoloads gnome-c-style-autoloads
gnorb-autoloads gnu-elpa-autoloads gnu-elpa-features
gnu-elpa-keyring-update-autoloads gnugo-autoloads
ascii-art-to-unicode-autoloads gnus-mock-autoloads gpastel-autoloads
gpr-mode-autoloads gpr-query-autoloads gnat-compiler-autoloads
graphql-autoloads greader-autoloads greenbar-autoloads
gtags-mode-autoloads guess-language-autoloads hcel-autoloads
hiddenquote-autoloads highlight-escape-sequences-autoloads
hook-helpers-autoloads html5-schema-autoloads hyperbole-autoloads
kotl-autoloads hact set hhist idlwave-autoloads ilist-autoloads
inspector-autoloads ioccur-autoloads isearch-mb-autoloads
iterators-autoloads ivy-avy-autoloads avy-autoloads
ivy-explorer-autoloads ivy-hydra-autoloads ivy-posframe-autoloads
jarchive-autoloads javaimp-autoloads jgraph-mode-autoloads
jinx-autoloads jit-spell-autoloads js2-mode-autoloads
json-mode-autoloads jumpc-autoloads kind-icon-autoloads kiwix-autoloads
request-autoloads kmb-autoloads landmark-autoloads
latex-table-wizard-autoloads auctex-autoloads tex-site leaf-autoloads
lentic-server-autoloads lentic-autoloads lex-autoloads lin-autoloads
listen-autoloads llm-autoloads lmc-autoloads load-dir-autoloads
loccur-autoloads logos-autoloads luwak-autoloads m-buffer-autoloads
marginalia-autoloads markchars-autoloads math-symbol-lists-autoloads
mct-autoloads memory-usage-autoloads metar-autoloads midi-kbd-autoloads
mines-autoloads minibuffer-header-autoloads minibuffer-line-autoloads
minimap-autoloads modus-themes-autoloads mpdired-autoloads
multi-mode-autoloads multishell-autoloads muse-autoloads myers-autoloads
nameless-autoloads names-autoloads nano-agenda-autoloads
nano-modeline-autoloads nano-theme-autoloads nftables-mode-autoloads
nhexl-mode-autoloads nlinum-autoloads notes-mode-autoloads
notmuch-indicator-autoloads num3-mode-autoloads oauth2-autoloads
ob-asymptote-autoloads ob-haxe-autoloads objed-autoloads
omn-mode-autoloads on-screen-autoloads openpgp-autoloads
orderless-autoloads org-contacts-autoloads org-edna-autoloads
org-jami-bot-autoloads jami-bot-autoloads org-modern-autoloads
org-notify-autoloads org-real-autoloads boxy-autoloads
org-remark-autoloads org-transclusion-autoloads org-translate-autoloads
org-autoloads orgalist-autoloads osc-autoloads osm-autoloads
other-frame-window-autoloads pabbrev-autoloads paced-autoloads
parsec-autoloads parser-generator-autoloads path-iterator-autoloads
perl-doc-autoloads persist-autoloads phpinspect-autoloads
phps-mode-autoloads pinentry-autoloads plz-see-autoloads poke-autoloads
poke-mode-autoloads poker-autoloads polymode-autoloads popper-autoloads
pq-autoloads prefixed-core-autoloads psgml-autoloads pspp-mode-autoloads
pulsar-autoloads pyim-autoloads async-autoloads pyim-basedict-autoloads
quarter-plane-autoloads rainbow-mode-autoloads rbit-autoloads
rcirc-color-autoloads rcirc-menu-autoloads rcirc-sqlite-autoloads
realgud-ipdb-autoloads realgud-jdb-autoloads realgud-lldb-autoloads
realgud-node-debug-autoloads realgud-node-inspect-autoloads
realgud-pdbpp-autoloads realgud-trepan-ni-autoloads
realgud-trepan-xpy-autoloads realgud-autoloads loc-changes-autoloads
load-relative-autoloads rec-mode-autoloads register-list-autoloads
relint-autoloads repology-autoloads rich-minority-autoloads
rmsbolt-autoloads rnc-mode-autoloads info rt-liberation-autoloads
ruby-end-autoloads rudel-autoloads satchel-autoloads scanner-autoloads
scroll-restore-autoloads sed-mode-autoloads setup-autoloads
shelisp-autoloads shell-command+-autoloads shell-quasiquote-autoloads
shen-mode-autoloads sisu-mode-autoloads site-lisp-autoloads
sketch-mode-autoloads slime-volleyball-autoloads sm-c-mode-autoloads
smalltalk-mode-autoloads smart-yank-autoloads sml-mode-autoloads
sokoban-autoloads sotlisp-autoloads spacious-padding-autoloads
spinner-autoloads sql-beeline-autoloads sql-cassandra-autoloads
sql-indent-autoloads sql-smie-autoloads finder-inf plz-autoloads
ssh-deploy-autoloads standard-themes-autoloads stream-autoloads
substitute-autoloads svg-clock-autoloads svg-tag-mode-autoloads
svg-lib-autoloads swiper-autoloads ivy-autoloads
switchy-window-autoloads sxhkdrc-mode-autoloads
system-packages-autoloads tam-autoloads taxy-magit-section-autoloads
taxy-autoloads dash-autoloads temp-buffer-browse-autoloads
tempel-autoloads test-simple-autoloads theme-buffet-autoloads
timerfunctions-autoloads tiny-autoloads tmr-autoloads tomelr-autoloads
topspace-autoloads tramp-nspawn-autoloads tramp-theme-autoloads
transcribe-autoloads transient-cycles-autoloads tree-inspector-autoloads
treeview-autoloads trie-autoloads heap-autoloads tNFA-autoloads
trinary-autoloads triples-autoloads typo-autoloads ulisp-repl-autoloads
undo-tree-autoloads uni-confusables-autoloads uniquify-files-autoloads
urgrep-autoloads url-http-ntlm-autoloads url-http-oauth-demo-autoloads
url-http-oauth-autoloads url-auth url-scgi-autoloads validate-autoloads
valign-autoloads vc-backup-autoloads vc-got-autoloads vc-hgcmd-autoloads
vcard-autoloads vcl-mode-autoloads vdiff-autoloads hydra-autoloads
lv-autoloads vertico-posframe-autoloads vertico-autoloads
posframe-autoloads vigenere-autoloads visual-filename-abbrev-autoloads
visual-fill-autoloads vlf-autoloads vundo-autoloads
wcheck-mode-autoloads wconf-autoloads web-server-autoloads
webfeeder-autoloads websocket-autoloads which-key-autoloads
window-commander-autoloads windower-autoloads windresize-autoloads
wisitoken-grammar-mode-autoloads mmm-mode-autoloads wisi-autoloads
wpuzzle-autoloads wrap-search-autoloads xclip-autoloads xeft-autoloads
xelb-autoloads xpm-autoloads queue-autoloads xr-autoloads
xref-union-autoloads yasnippet-classic-snippets-autoloads
yasnippet-autoloads zones-autoloads ztree-autoloads zuul-autoloads
package browse-url url url-proxy url-privacy url-expand url-methods
url-history url-cookie generate-lisp-file url-domsuf url-util mailcap
url-handlers url-parse auth-source eieio eieio-core cl-macs pcase
password-cache json subr-x map byte-opt bytecomp byte-compile url-vars
cus-edit pp cus-load icons wid-edit cl-loaddefs cl-lib gv rmc iso-transl
tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks
lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd
touch-screen 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
nadvice seq simple cl-generic indonesian philippine 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 abbrev obarray button loaddefs
theme-loaddefs oclosure cl-preloaded faces cus-face macroexp files
window text-properties overlay sha1 md5 base64 format env code-pages
mule custom widget keymap hashtable-print-readable backquote threads
dbusbind inotify dynamic-setting system-font-setting font-render-setting
cairo gtk x-toolkit xinput2 x multi-tty move-toolbar
make-network-process emacs)
Memory information:
((conses 16 11308797 674903) (symbols 48 57360 1) (strings 32 282389 59572)
(string-bytes 1 8152871) (vectors 16 117656)
(vector-slots 8 2316624 601787) (floats 8 1185 17163)
(intervals 56 11267 1308) (buffers 992 123))
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
2024-05-20 15:43 bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-20 16:20 ` Eli Zaretskii
2024-05-20 16:38 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 10+ messages in thread
From: Eli Zaretskii @ 2024-05-20 16:20 UTC (permalink / raw)
To: Stefan Monnier; +Cc: 71080
> Cc: monnier@iro.umontreal.ca
> Date: Mon, 20 May 2024 11:43:31 -0400
> From: Stefan Monnier via "Bug reports for GNU Emacs,
> the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
>
> Then
>
> emacs -Q ~/tmp/foo.txt
> C-x C-w foo.gpg RET # To save the file into an encrypted `foo.gpg`.
> TAB TAB RET # To select symmetric encryption.
> .. type the password you'd like to use ...
> M-x revert-buffer RET
>
> and then you should see that he `λ` turned into its UTF-8 sequence `\316\273`.
> The same happens if you encrypt with public keys and if you use any
> other encoding that's different from UTF-8.
>
> AFAICT, the problem is partly due to
>
> (find-coding-systems-region (point-min) (point-max))
>
> returning a list which includes `no-conversion` because in the end the
> buffer is saved with "no conversion" (i.e. it uses Emacs's internal
> encoding). Another part of the problem is that `find-auto-coding`
> returns `no-conversion` for `.gpg` files because those files are binary.
>
> IOW it can be considered as the result of "no conversion" being
> ambiguous, meaning either "binary" or "Emacs's internal encoding"
> depending on the circumstances. But it's also due to the confusion
> between the encoding to use before encryption (resp. after decryption)
> and the encoding to use after encryption (resp. before decryption).
>
> I don't understand enough of how the "no conversion" ambiguity is
> expected to be resolved, nor how the different layers of encoding
> are supposed to be handled in file-name-handlers to dig much deeper.
How can this work reliably, unless the *.gpg files can have some
meta-data that tells Emacs how to decode them? When encoding, we
could perhaps use buffer-file-coding-system (AFAICT, we do that
indirectly now, via select-safe-coding-system), but what to do when
decoding?
If _you_ know the correct encoding, you could use "C-x RET c" before
the commands (as in "C-x RET c iso-2022-7bit RET C-x C-w"). Did you
try that?
IOW, I don't think the problem is with 'no-conversion', the problem is
that when decoding, we don't really have any useful info for how to
decode, and the locale-dependent ad-hoc'ery doesn't help because
GPG-encrypted stuff is likely to come from a different locale. You
deliberately used iso-2022-7bit, which simulates such an "alien" file.
Am I missing something (I know very little about epa, so apologies if
what I say makes no sense)?
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
2024-05-20 16:20 ` Eli Zaretskii
@ 2024-05-20 16:38 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-20 18:00 ` Eli Zaretskii
0 siblings, 1 reply; 10+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-20 16:38 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 71080
> How can this work reliably, unless the *.gpg files can have some
> meta-data that tells Emacs how to decode them?
GPG takes bytes in and split bytes out, so there's no encoding
issue there. The contents in my example very much comes with the needed
meta-data (in the form of a `coding` file-local var). That meta-data is
correctly used when opening the file (which is why the UTF-8 byte sequence
is not turned into `λ` but is kept as `eight-bit` chars) but not when saving.
> When encoding, we could perhaps use buffer-file-coding-system (AFAICT,
> we do that indirectly now, via select-safe-coding-system), but what to
> do when decoding?
As mentioned, AFAICT we DTRT already when decoding (at least when the
coding system is specified via a file-local var). The problem is when
saving: `select-safe-coding-system` ends up returning `no-conversion`
despite the `coding:` cookie.
> If _you_ know the correct encoding, you could use "C-x RET c" before
> the commands (as in "C-x RET c iso-2022-7bit RET C-x C-w"). Did you
> try that?
I tried `C-x RET f`. It makes no difference. And it should not be
needed since the file-local var states very explicitly what we
should use.
Stefan
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
2024-05-20 16:38 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-20 18:00 ` Eli Zaretskii
2024-05-20 21:08 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 10+ messages in thread
From: Eli Zaretskii @ 2024-05-20 18:00 UTC (permalink / raw)
To: Stefan Monnier; +Cc: 71080
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: 71080@debbugs.gnu.org
> Date: Mon, 20 May 2024 12:38:50 -0400
>
> > How can this work reliably, unless the *.gpg files can have some
> > meta-data that tells Emacs how to decode them?
>
> GPG takes bytes in and split bytes out, so there's no encoding
> issue there.
Yes, but what bytes? You can encode a buffer using UTF-8 or you can
encode it using ISO 2022, and in each case you will get a different
bytestream. GPG doesn't care either way, but the bytes it will get
and encode will be different.
> The contents in my example very much comes with the needed
> meta-data (in the form of a `coding` file-local var). That meta-data is
> correctly used when opening the file (which is why the UTF-8 byte sequence
> is not turned into `λ` but is kept as `eight-bit` chars) but not when saving.
Any evidence for that? Can you take me through the code to show that
buffer's encoding is ignored? What I see there is that we choose a
reasonable encoding when sending data to GPG, but maybe I'm not
looking in the right place.
> > When encoding, we could perhaps use buffer-file-coding-system (AFAICT,
> > we do that indirectly now, via select-safe-coding-system), but what to
> > do when decoding?
>
> As mentioned, AFAICT we DTRT already when decoding (at least when the
> coding system is specified via a file-local var). The problem is when
> saving: `select-safe-coding-system` ends up returning `no-conversion`
> despite the `coding:` cookie.
Please tell where in the code you see that.
AFAIK, the coding cookie is supposed to determine
buffer-file-coding-system, and select-safe-coding-system tries
buffer-file-coding-system as part of the values it attempts to use.
> > If _you_ know the correct encoding, you could use "C-x RET c" before
> > the commands (as in "C-x RET c iso-2022-7bit RET C-x C-w"). Did you
> > try that?
>
> I tried `C-x RET f`. It makes no difference.
Not "C-x RET f", but "C-x RET c".
> And it should not be needed since the file-local var states very
> explicitly what we should use.
Yes, but "C-x RET c" is generally stronger, so if it helps, it's a
sign that the code is correct, but uses incorrect defaults. That's
why I suggested to try it. However, if you know the code and can tell
how and where we determine which encoding to use, that'd be more
efficient.
Thanks.
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
2024-05-20 18:00 ` Eli Zaretskii
@ 2024-05-20 21:08 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-23 13:01 ` Eli Zaretskii
0 siblings, 1 reply; 10+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-20 21:08 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 71080
>> The contents in my example very much comes with the needed
>> meta-data (in the form of a `coding` file-local var). That meta-data is
>> correctly used when opening the file (which is why the UTF-8 byte sequence
>> is not turned into `λ` but is kept as `eight-bit` chars) but not when saving.
> Any evidence for that?
Of what exactly?
> Can you take me through the code to show that buffer's encoding is
> ignored? What I see there is that we choose a reasonable encoding
> when sending data to GPG,
I think my recipe is pretty clear: we start with
λ
# Local Variables:
# coding: iso-2022-7bit
# End:
and after save and `revert-buffer` we end up with
\316\273
# Local Variables:
# coding: iso-2022-7bit
# End:
\316\273 is the encoding of λ in UTF-8, not in `iso-2022-7bit`, so it
seems pretty clear that Emacs encoded the buffer using (some version of)
utf-8, thus disregarding the `coding:` cookie.
>> As mentioned, AFAICT we DTRT already when decoding (at least when the
>> coding system is specified via a file-local var). The problem is when
>> saving: `select-safe-coding-system` ends up returning `no-conversion`
>> despite the `coding:` cookie.
>
> Please tell where in the code you see that.
Try and reproduce my recipe after doing
`M-x trace-function RET select-safe-coding-system`.
> AFAIK, the coding cookie is supposed to determine
> buffer-file-coding-system, and select-safe-coding-system tries
> buffer-file-coding-system as part of the values it attempts to use.
AFAICT this gets overridden by the return value of `find-auto-coding` we
setup for `.gpg` files.
>> > If _you_ know the correct encoding, you could use "C-x RET c" before
>> > the commands (as in "C-x RET c iso-2022-7bit RET C-x C-w"). Did you
>> > try that?
>> I tried `C-x RET f`. It makes no difference.
> Not "C-x RET f", but "C-x RET c".
I haven't tried that, no.
> Yes, but "C-x RET c" is generally stronger, so if it helps, it's a
> sign that the code is correct, but uses incorrect defaults. That's
> why I suggested to try it. However, if you know the code and can tell
> how and where we determine which encoding to use, that'd be more
> efficient.
I stepped through `select-safe-coding-system`, which is where I got the
info I described about `find-auto-coding` and
`find-coding-systems-region`.
Stefan
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
2024-05-20 21:08 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-23 13:01 ` Eli Zaretskii
2024-05-23 15:44 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 10+ messages in thread
From: Eli Zaretskii @ 2024-05-23 13:01 UTC (permalink / raw)
To: Stefan Monnier; +Cc: 71080
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: 71080@debbugs.gnu.org
> Date: Mon, 20 May 2024 17:08:25 -0400
>
> \316\273 is the encoding of λ in UTF-8, not in `iso-2022-7bit`, so it
> seems pretty clear that Emacs encoded the buffer using (some version of)
> utf-8, thus disregarding the `coding:` cookie.
AFAICT, this is due to an (unsolicited? at least the log message is
silent about this particular part) change as part of commit
e78c15acf679, 4 years ago. Reverting that part makes your recipe work
as expected. Please try the patch below:
diff --git a/lisp/epa-file.el b/lisp/epa-file.el
index a4942e7..90cc91e 100644
--- a/lisp/epa-file.el
+++ b/lisp/epa-file.el
@@ -267,7 +267,14 @@ epa-file-write-region
(setq file (expand-file-name file))
(let* ((coding-system (or coding-system-for-write
(if (fboundp 'select-safe-coding-system)
- (let ((buffer-file-name file))
+ ;; This is needed because
+ ;; `auto-coding-alist' has
+ ;; `no-conversion' for *.gpg files,
+ ;; which would otherwise force
+ ;; `select-safe-coding-system' return
+ ;; `no-conversion'.
+ (let ((buffer-file-name
+ (file-name-sans-extension file)))
(select-safe-coding-system
(point-min) (point-max)))
buffer-file-coding-system)))
^ permalink raw reply related [flat|nested] 10+ messages in thread
* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
2024-05-23 13:01 ` Eli Zaretskii
@ 2024-05-23 15:44 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-24 20:12 ` Jonas Bernoulli via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 10+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-23 15:44 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Jonas Bernoulli, 71080
> AFAICT, this is due to an (unsolicited? at least the log message is
> silent about this particular part) change as part of commit
> e78c15acf679, 4 years ago. Reverting that part makes your recipe work
> as expected. Please try the patch below:
Ha! Thanks for tracking it down!
It does fix the problem for me, and it makes a lot of sense, indeed.
Jonas, do you remember what that hunk was about?
Stefan
> diff --git a/lisp/epa-file.el b/lisp/epa-file.el
> index a4942e7..90cc91e 100644
> --- a/lisp/epa-file.el
> +++ b/lisp/epa-file.el
> @@ -267,7 +267,14 @@ epa-file-write-region
> (setq file (expand-file-name file))
> (let* ((coding-system (or coding-system-for-write
> (if (fboundp 'select-safe-coding-system)
> - (let ((buffer-file-name file))
> + ;; This is needed because
> + ;; `auto-coding-alist' has
> + ;; `no-conversion' for *.gpg files,
> + ;; which would otherwise force
> + ;; `select-safe-coding-system' return
> + ;; `no-conversion'.
> + (let ((buffer-file-name
> + (file-name-sans-extension file)))
> (select-safe-coding-system
> (point-min) (point-max)))
> buffer-file-coding-system)))
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
2024-05-23 15:44 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-24 20:12 ` Jonas Bernoulli via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-25 6:14 ` Eli Zaretskii
2024-05-25 14:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 2 replies; 10+ messages in thread
From: Jonas Bernoulli via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-24 20:12 UTC (permalink / raw)
To: Stefan Monnier, Eli Zaretskii; +Cc: 71080
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> AFAICT, this is due to an (unsolicited? at least the log message is
>> silent about this particular part) change as part of commit
>> e78c15acf679, 4 years ago. Reverting that part makes your recipe work
>> as expected. Please try the patch below:
>
> Ha! Thanks for tracking it down!
> It does fix the problem for me, and it makes a lot of sense, indeed.
> Jonas, do you remember what that hunk was about?
I don't recall; and since I didn't mention it in the commit message,
it seems most likely, that it was included in that commit mistake.
Jonas
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
2024-05-24 20:12 ` Jonas Bernoulli via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-25 6:14 ` Eli Zaretskii
2024-05-25 14:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
1 sibling, 0 replies; 10+ messages in thread
From: Eli Zaretskii @ 2024-05-25 6:14 UTC (permalink / raw)
To: Jonas Bernoulli; +Cc: 71080, monnier
> From: Jonas Bernoulli <jonas@bernoul.li>
> Cc: 71080@debbugs.gnu.org
> Date: Fri, 24 May 2024 22:12:59 +0200
>
> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>
> >> AFAICT, this is due to an (unsolicited? at least the log message is
> >> silent about this particular part) change as part of commit
> >> e78c15acf679, 4 years ago. Reverting that part makes your recipe work
> >> as expected. Please try the patch below:
> >
> > Ha! Thanks for tracking it down!
> > It does fix the problem for me, and it makes a lot of sense, indeed.
> > Jonas, do you remember what that hunk was about?
>
> I don't recall; and since I didn't mention it in the commit message,
> it seems most likely, that it was included in that commit mistake.
Thanks, so I've now installed the fix on the master branch.
Stefan, feel free to close the bug if this solves the problems. If
there's anything else left to do here, please tell.
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file
2024-05-24 20:12 ` Jonas Bernoulli via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-25 6:14 ` Eli Zaretskii
@ 2024-05-25 14:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
1 sibling, 0 replies; 10+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-25 14:01 UTC (permalink / raw)
To: Jonas Bernoulli; +Cc: Eli Zaretskii, 71080-done
>>> AFAICT, this is due to an (unsolicited? at least the log message is
>>> silent about this particular part) change as part of commit
>>> e78c15acf679, 4 years ago. Reverting that part makes your recipe work
>>> as expected. Please try the patch below:
>> Ha! Thanks for tracking it down!
>> It does fix the problem for me, and it makes a lot of sense, indeed.
>> Jonas, do you remember what that hunk was about?
> I don't recall; and since I didn't mention it in the commit message,
> it seems most likely, that it was included in that commit mistake.
OK, Thanks Jonas and Eli, closing,
Stefan
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-05-25 14:01 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-20 15:43 bug#71080: 30.0.50; UTF-8 used unconditionally when saving GPG file Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-20 16:20 ` Eli Zaretskii
2024-05-20 16:38 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-20 18:00 ` Eli Zaretskii
2024-05-20 21:08 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-23 13:01 ` Eli Zaretskii
2024-05-23 15:44 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-24 20:12 ` Jonas Bernoulli via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-25 6:14 ` Eli Zaretskii
2024-05-25 14:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.