unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#72919: 29.1; chart-space-usage in chart.el does not work correctly on windows
@ 2024-08-31 18:52 Harm Van der Vegt
  2024-09-01  8:13 ` Eli Zaretskii
  0 siblings, 1 reply; 6+ messages in thread
From: Harm Van der Vegt @ 2024-08-31 18:52 UTC (permalink / raw)
  To: 72919


[-- Attachment #1.1: Type: text/plain, Size: 43269 bytes --]

Load the builtin chart package. When chart-space-usage is run, targeting
any directory, chart fails to find any files and therefore can't create
the chart. The expected behavior is that a bar chart is shown, ranking
the files of the directory by size.

This only fails on my Windows machine, it works on my Ubuntu
installation.

The output as shown in *Messages* is as follows:

Collecting statistics...
Running ‘cd g:/Shakespeare/;du -sk *’...
Scanning output ...
chart-space-usage: No files found!

chart-space-usage makes use of the du (disk usage) utility, which might
not be present on all machines. In my case I have du installed, but
chart-space-usage still failed to find any files.

I have patched chart-space-usage to remove the dependency on du and make
it OS agnostic and attached the patch to this email.

In GNU Emacs 29.1 (build 2, x86_64-w64-mingw32) of 2023-07-31 built on
 AVALON
Windowing system distributor 'Microsoft Corp.', version 10.0.19045
System Description: Microsoft Windows 10 Home (v10.0.2009.19045.4780)

Configured using:
 'configure --with-modules --without-dbus --with-native-compilation=aot
 --without-compress-install --with-tree-sitter CFLAGS=-O2'

Configured features:
ACL GIF GMP GNUTLS HARFBUZZ JPEG JSON LCMS2 LIBXML2 MODULES NATIVE_COMP
NOTIFY W32NOTIFY PDUMPER PNG RSVG SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XPM ZLIB

(NATIVE_COMP present but libgccjit not available)

Important settings:
  value of $LANG: NLD
  locale-coding-system: cp1252

Major mode: ELisp/l

Minor modes in effect:
  bug-reference-prog-mode: t
  erefactor-check-eval-mode: t
  erefactor-highlight-mode: t
  treemacs-filewatch-mode: t
  treemacs-follow-mode: t
  treemacs-git-mode: t
  treemacs-fringe-indicator-mode: t
  global-magit-file-mode: t
  magit-file-mode: t
  magit-auto-revert-mode: t
  auto-revert-mode: t
  global-git-commit-mode: t
  async-bytecomp-package-mode: t
  shell-dirtrack-mode: t
  server-mode: t
  which-key-mode: t
  global-corfu-mode: t
  corfu-mode: t
  marginalia-mode: t
  override-global-mode: t
  savehist-mode: t
  vertico-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-texinfo hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-texinfo
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-publish hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-publish
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-org hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-org
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-odt hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-odt
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-md hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-md
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-man hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-man
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-latex hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-latex
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-icalendar hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-icalendar
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-html hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-html
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-beamer hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-beamer
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-ascii hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-ascii
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-version hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-version
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-timer hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-timer
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-tempo hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-tempo
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-table hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-table
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-src hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-src
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-protocol hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-protocol
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-plot hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-plot
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-pcomplete
hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-pcomplete
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-num hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-num
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-mouse hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-mouse
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-mobile hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-mobile
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-macs hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-macs
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-macro hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-macro
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-loaddefs hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-loaddefs
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-list hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-list
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-lint hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-lint
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-keys hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-keys
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-install hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-install
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-inlinetask
hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-inlinetask
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-indent hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-indent
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-id hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-id
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-habit hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-habit
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-goto hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-goto
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-footnote hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-footnote
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-feed hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-feed
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-faces hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-faces
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-entities hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-entities
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-element hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-element
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-duration hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-duration
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-datetree hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-datetree
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-ctags hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-ctags
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-crypt hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-crypt
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-compat hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-compat
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-colview hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-colview
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-clock hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-clock
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-capture hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-capture
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-attach hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-attach
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-attach-git
hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-attach-git
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-archive hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-archive
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-agenda hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-agenda
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-w3m hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-w3m
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-rmail hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-rmail
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-mhe hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-mhe
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-irc hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-irc
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-info hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-info
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-gnus hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-gnus
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-eww hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-eww
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-eshell hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-eshell
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-docview hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-docview
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-bibtex hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-bibtex
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-bbdb hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-bbdb
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-vala hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-vala
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-tangle hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-tangle
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-table hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-table
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-stan hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-stan
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-sqlite hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-sqlite
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-sql hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-sql
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-shen hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-shen
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-shell hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-shell
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-sed hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-sed
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-screen hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-screen
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-scheme hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-scheme
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-sass hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-sass
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ruby hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-ruby
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ref hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-ref
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-R hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-R
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-python hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-python
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-processing
hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-processing
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-plantuml hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-plantuml
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-picolisp hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-picolisp
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-perl hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-perl
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-org hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-org
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-octave hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-octave
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ocaml hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-ocaml
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-mscgen hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-mscgen
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-maxima hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-maxima
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-matlab hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-matlab
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-makefile hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-makefile
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-lua hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-lua
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-lob hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-lob
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-lisp hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-lisp
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-lilypond hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-lilypond
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ledger hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-ledger
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-latex hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-latex
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-js hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-js
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-java hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-java
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-J hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-J
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-io hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-io
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-hledger hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-hledger
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-haskell hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-haskell
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-groovy hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-groovy
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-gnuplot hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-gnuplot
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-fortran hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-fortran
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-forth hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-forth
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-exp hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-exp
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-eval hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-eval
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-eshell hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-eshell
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-emacs-lisp
hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-emacs-lisp
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ebnf hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-ebnf
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-dot hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-dot
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ditaa hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-ditaa
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-css hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-css
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-core hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-core
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-coq hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-coq
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-comint hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-comint
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-clojure hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-clojure
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-calc hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-calc
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-C hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-C
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-awk hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-awk
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-asymptote hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-asymptote
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-abc hides
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-abc
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/transient-20200622.2050/transient
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/transient
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/use-package-20201110.2133/use-package
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/use-package/use-package
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/use-package-20201110.2133/use-package-lint
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/use-package/use-package-lint
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/use-package-20201110.2133/use-package-jump
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/use-package/use-package-jump
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/use-package-20201110.2133/use-package-ensure
hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/use-package/use-package-ensure
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/use-package-20201110.2133/use-package-diminish
hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/use-package/use-package-diminish
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/use-package-20201110.2133/use-package-delight
hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/use-package/use-package-delight
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/use-package-20201110.2133/use-package-core
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/use-package/use-package-core
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/use-package-20201110.2133/use-package-bind-key
hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/use-package/use-package-bind-key
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/bind-key-20200805.1727/bind-key
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/use-package/bind-key
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-texinfo hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-texinfo
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-publish hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-publish
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-org hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-org
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-odt hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-odt
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-md hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-md
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-man hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-man
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-latex hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-latex
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ox-koma-letter
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-koma-letter
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-icalendar hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-icalendar
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-html hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-html
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-beamer hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-beamer
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ox-ascii hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ox-ascii
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-version hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-version
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-timer hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-timer
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-tempo hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-tempo
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-table hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-table
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-src hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-src
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/org-refile
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-refile
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-protocol hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-protocol
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-plot hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-plot
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-pcomplete
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-pcomplete
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-num hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-num
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-mouse hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-mouse
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-mobile hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-mobile
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-macs hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-macs
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-macro hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-macro
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-loaddefs hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-loaddefs
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-list hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-list
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-lint hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-lint
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-keys hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-keys
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-inlinetask
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-inlinetask
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-indent hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-indent
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-id hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-id
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-habit hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-habit
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-goto hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-goto
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-footnote hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-footnote
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-feed hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-feed
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-faces hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-faces
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-entities hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-entities
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-element hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-element
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-duration hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-duration
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-datetree hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-datetree
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-ctags hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-ctags
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-crypt hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-crypt
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-compat hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-compat
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-colview hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-colview
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-clock hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-clock
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-capture hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-capture
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-attach hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-attach
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-attach-git
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-attach-git
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-archive hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-archive
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/org-agenda hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/org-agenda
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-w3m hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-w3m
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-rmail hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-rmail
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-mhe hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-mhe
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ol-man
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-man
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-irc hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-irc
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-info hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-info
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-gnus hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-gnus
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-eww hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-eww
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-eshell hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-eshell
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-docview hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-docview
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-bibtex hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-bibtex
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ol-bbdb hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ol-bbdb
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-tangle hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-tangle
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-table hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-table
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-sqlite hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-sqlite
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-sql hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-sql
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-shell hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-shell
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-sed hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-sed
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-screen hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-screen
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-scheme hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-scheme
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-sass hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-sass
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ruby hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-ruby
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ref hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-ref
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-R hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-R
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-python hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-python
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-processing
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-processing
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-plantuml hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-plantuml
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-perl hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-perl
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-org hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-org
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-octave hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-octave
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ocaml hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-ocaml
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-maxima hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-maxima
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-matlab hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-matlab
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-makefile hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-makefile
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-lua hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-lua
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-lob hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-lob
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-lisp hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-lisp
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-lilypond hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-lilypond
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-latex hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-latex
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-plus-contrib-20210222/ob-julia
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-julia
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-js hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-js
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-java hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-java
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-haskell hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-haskell
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-groovy hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-groovy
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-gnuplot hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-gnuplot
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-fortran hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-fortran
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-forth hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-forth
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-exp hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-exp
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-eval hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-eval
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-eshell hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-eshell
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-emacs-lisp
hides g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-emacs-lisp
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-dot hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-dot
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-ditaa hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-ditaa
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-css hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-css
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-core hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-core
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-comint hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-comint
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-clojure hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-clojure
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-calc hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-calc
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-C hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-C
c:/Users/Harm/Documents/Emacs/.emacs.d/elpa/org-20200406/ob-awk hides
g:/Emacs/emacs-29.1/share/emacs/29.1/lisp/org/ob-awk

Features:
(shadow sort mail-extr emacsbug sh-script smie treesit executable
files-x whitespace magit-patch magit-subtree magit-ediff ediff
ediff-merg ediff-mult ediff-wind ediff-diff ediff-help ediff-init
ediff-util misearch multi-isearch magit-extras checkdoc shortdoc
help-fns radix-tree bug-reference vc-git vc-dispatcher cus-edit
cus-start cus-load wid-edit dired-aux display-line-numbers
treemacs-bookmarks treemacs-tags xref magit-bookmark bookmark pp chart
lisp-mnt mule-util erefactor flymake-proc flymake project compile
thingatpt gptel gptel-openai treemacs treemacs-header-line
treemacs-compatibility treemacs-mode treemacs-interface
treemacs-persistence treemacs-filewatch-mode treemacs-follow-mode
treemacs-rendering treemacs-annotations treemacs-async
treemacs-workspaces treemacs-dom treemacs-visuals
treemacs-fringe-indicator pulse color treemacs-faces treemacs-icons
treemacs-scope treemacs-themes treemacs-core-utils pfuture inline
hl-line ht treemacs-logging treemacs-customization treemacs-macros pcase
s 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 which-func imenu
magit-diff smerge-mode diff diff-mode magit-core magit-autorevert
autorevert filenotify magit-margin magit-transient magit-process
magit-mode git-commit transient magit-git magit-section magit-utils crm
log-edit message sendmail yank-media puny dired dired-loaddefs rfc822
mml mml-sec epa derived epg rfc6068 epg-config gnus-util
text-property-search mm-decode mm-bodies mm-encode mail-parse rfc2231
rfc2047 rfc2045 mm-util ietf-drums mail-prsvr mailabbrev mail-utils
gmm-utils mailheader pcvs-util add-log with-editor comp comp-cstr
warnings rx async-bytecomp async shell server dash which-key corfu
edmacro kmacro marginalia use-package-bind-key bind-key easy-mmode
savehist orderless vertico compat cl-extra help-mode use-package-ensure
use-package-core finder-inf org-checklist org ob ob-tangle ob-ref ob-lob
ob-table ob-exp org-macro org-footnote org-src ob-comint org-pcomplete
pcomplete comint ansi-osc ansi-color ring org-list org-faces
org-entities time-date noutline outline icons org-version ob-emacs-lisp
ob-core ob-eval org-table ol org-keys org-compat advice org-macs
org-loaddefs format-spec find-func cal-menu calendar cal-loaddefs
corfu-autoloads devdocs-autoloads embark-autoloads erefactor-autoloads
gptel-autoloads marginalia-autoloads orderless-autoloads
treemacs-autoloads cfrs-autoloads posframe-autoloads ht-autoloads
hydra-autoloads lv-autoloads pfuture-autoloads ace-window-autoloads
avy-autoloads vertico-autoloads compat-autoloads which-key-autoloads
info yaml-mode-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 cl-seq
eieio eieio-core cl-macs password-cache json subr-x map byte-opt gv
bytecomp byte-compile url-vars cl-loaddefs cl-lib rmc iso-transl tooltip
cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type
elisp-mode mwheel dos-w32 ls-lisp disp-table term/w32-win w32-win
w32-vars term/common-win 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 oclosure
cl-preloaded button loaddefs theme-loaddefs 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 w32notify w32 lcms2 multi-tty make-network-process
native-compile emacs)

Memory information:
((conses 16 604727 66916)
 (symbols 48 32728 0)
 (strings 32 171750 4795)
 (string-bytes 1 5874342)
 (vectors 16 64504)
 (vector-slots 8 1649805 128430)
 (floats 8 345 545)
 (intervals 56 7272 265)
 (buffers 984 34))

[-- Attachment #1.2: Type: text/html, Size: 43933 bytes --]

[-- Attachment #2: 0001-Make-chart-space-usage-OS-independent.patch --]
[-- Type: application/octet-stream, Size: 2201 bytes --]

From 48eb6af0f78424df9f02d744275538d80cee3bc4 Mon Sep 17 00:00:00 2001
From: Harm van der Vegt <harmvegt@gmail.com>
Date: Sat, 31 Aug 2024 20:10:37 +0200
Subject: [PATCH] Make chart-space-usage OS independent

---
 lisp/emacs-lisp/chart.el | 36 ++++++++++++++----------------------
 1 file changed, 14 insertions(+), 22 deletions(-)

diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index da61e45213d..c195ccb7165 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -646,30 +646,22 @@ SORT-PRED if desired."
   (interactive "DDirectory: ")
   (message "Collecting statistics...")
   (let ((nmlst nil)
-	(cntlst nil)
-	(b (get-buffer-create " *du-tmp*")))
-    (set-buffer b)
-    (erase-buffer)
-    (insert "cd " d ";du -sk * \n")
-    (message "Running `cd %s;du -sk *'..." d)
-    (call-process-region (point-min) (point-max) shell-file-name t
-			 (current-buffer) nil)
-    (goto-char (point-min))
-    (message "Scanning output ...")
-    (while (re-search-forward "^\\([0-9]+\\)[ \t]+\\([^ \n]+\\)$" nil t)
-      (let* ((nam (buffer-substring (match-beginning 2) (match-end 2)))
-	     (num (buffer-substring (match-beginning 1) (match-end 1))))
-	(setq nmlst (cons nam nmlst)
-	      ;; * 1000 to put it into bytes
-	      cntlst (cons (* (string-to-number num) 1000) cntlst))))
+        (cntlst nil))
+    (dolist (file (directory-files d t))
+      (when (file-regular-p file)
+        (let ((size (nth 7 (file-attributes file))))
+          (setq nmlst (cons (file-name-nondirectory file) nmlst))
+          (setq cntlst (cons size cntlst)))))
+
     (if (not nmlst)
-	(error "No files found!"))
+        (error "No files found!"))
+
+    ;; Display the chart if files are found
     (chart-bar-quickie 'vertical (format "Largest files in %s" d)
-		       nmlst "File Name"
-		       cntlst "File Size"
-		       10
-		       (lambda (a b) (> (cdr a) (cdr b))))
-    ))
+                       nmlst "File Name"
+                       cntlst "File Size"
+                       10
+                       (lambda (a b) (> (cdr a) (cdr b))))))
 
 (defun chart-emacs-storage ()
   "Chart the current storage requirements of Emacs."
-- 
2.11.0.windows.3


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* bug#72919: 29.1; chart-space-usage in chart.el does not work correctly on windows
  2024-08-31 18:52 bug#72919: 29.1; chart-space-usage in chart.el does not work correctly on windows Harm Van der Vegt
@ 2024-09-01  8:13 ` Eli Zaretskii
       [not found]   ` <CAPdXVSxuhccEEYSLH+WR57irNYn4OrWWhmPPcCY5GjPa-RTnHQ@mail.gmail.com>
  0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2024-09-01  8:13 UTC (permalink / raw)
  To: Harm Van der Vegt; +Cc: 72919

> From: Harm Van der Vegt <harmvegt@gmail.com>
> Date: Sat, 31 Aug 2024 20:52:41 +0200
> 
> Load the builtin chart package. When chart-space-usage is run, targeting
> any directory, chart fails to find any files and therefore can't create
> the chart. The expected behavior is that a bar chart is shown, ranking
> the files of the directory by size.
> 
> This only fails on my Windows machine, it works on my Ubuntu
> installation.
> 
> The output as shown in *Messages* is as follows:
> 
> Collecting statistics...
> Running ‘cd g:/Shakespeare/;du -sk *’...
> Scanning output ...
> chart-space-usage: No files found!

Yes, the current implementation is not portable.

> chart-space-usage makes use of the du (disk usage) utility, which might
> not be present on all machines. In my case I have du installed, but
> chart-space-usage still failed to find any files.
> 
> I have patched chart-space-usage to remove the dependency on du and make
> it OS agnostic and attached the patch to this email.

Thanks.  However, I think your changes are not entirely correct: they
fail to account for space usage of files inside subdirectories of the
directory which the user types at the prompt, whereas the
implementation with "du" does account for that.  In addition, I think
if someone has 'du' on Windows, it should be used.

So I came up with the following changes instead.  Could you please try
them, both with and without du.exe on PATH?  If these changes give
good results, I will install them.

diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index da61e45..03dbe33 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -641,27 +641,63 @@ chart-file-count
 		       (lambda (a b) (> (cdr a) (cdr b))))
     ))
 
+;; This assumes 4KB blocks
+(defun chart--file-size (size)
+  (* (/ (+ size 4095) 4096) 4096))
+
+(defun chart--directory-size (dir)
+  "Compute total size of files in directory DIR and its subdirectories.
+DIR is assumed to be a directory, verified by the caller."
+  (let ((size 0))
+    (dolist (file (directory-files-recursively dir "." t))
+      (let ((fsize (nth 7 (file-attributes file))))
+        (if (> fsize 0)
+            (setq size
+                  (+ size (chart--file-size fsize))))))
+    size))
+
 (defun chart-space-usage (d)
   "Display a top usage chart for directory D."
   (interactive "DDirectory: ")
   (message "Collecting statistics...")
   (let ((nmlst nil)
 	(cntlst nil)
-	(b (get-buffer-create " *du-tmp*")))
-    (set-buffer b)
-    (erase-buffer)
-    (insert "cd " d ";du -sk * \n")
-    (message "Running `cd %s;du -sk *'..." d)
-    (call-process-region (point-min) (point-max) shell-file-name t
-			 (current-buffer) nil)
-    (goto-char (point-min))
-    (message "Scanning output ...")
-    (while (re-search-forward "^\\([0-9]+\\)[ \t]+\\([^ \n]+\\)$" nil t)
-      (let* ((nam (buffer-substring (match-beginning 2) (match-end 2)))
-	     (num (buffer-substring (match-beginning 1) (match-end 1))))
-	(setq nmlst (cons nam nmlst)
-	      ;; * 1000 to put it into bytes
-	      cntlst (cons (* (string-to-number num) 1000) cntlst))))
+        b)
+    (if (executable-find "du")
+        (progn
+	  (setq b (get-buffer-create " *du-tmp*"))
+          (set-buffer b)
+          (erase-buffer)
+          (if (and (memq system-type '(windows-nt ms-dos))
+                   (fboundp 'w32-shell-dos-semantics)
+                   (w32-shell-dos-semantics))
+              (progn
+                ;; With Windows shells, 'cd' does not change the drive,
+                ;; and ';' is not reliable for running multiple
+                ;; commands, so use alternatives.  We quote the
+                ;; directory because otherwise pushd will barf on a
+                ;; directory with forward slashes.
+                (insert "pushd \"" d "\" && du -sk * \n")
+                (message "Running `pushd \"%s\" && du -sk *'..." d))
+            (insert "cd " d ";du -sk * \n")
+            (message "Running `cd %s;du -sk *'..." d))
+          (call-process-region (point-min) (point-max) shell-file-name t
+			       (current-buffer) nil)
+          (goto-char (point-min))
+          (message "Scanning output ...")
+          (while (re-search-forward "^\\([0-9]+\\)[ \t]+\\([^ \n]+\\)$" nil t)
+            (let* ((nam (buffer-substring (match-beginning 2) (match-end 2)))
+	           (num (buffer-substring (match-beginning 1) (match-end 1))))
+	      (setq nmlst (cons nam nmlst)
+	            ;; * 1000 to put it into bytes
+	            cntlst (cons (* (string-to-number num) 1000) cntlst)))))
+      (dolist (file (directory-files d t directory-files-no-dot-files-regexp))
+        (setq nmlst (cons (file-name-nondirectory file) nmlst))
+        (if (file-regular-p file)
+            (setq cntlst (cons (chart--file-size
+                                (nth 7 (file-attributes file)))
+                               cntlst))
+          (setq cntlst (cons (chart--directory-size file) cntlst)))))
     (if (not nmlst)
 	(error "No files found!"))
     (chart-bar-quickie 'vertical (format "Largest files in %s" d)





^ permalink raw reply related	[flat|nested] 6+ messages in thread

* bug#72919: Fwd: bug#72919: 29.1; chart-space-usage in chart.el does not work correctly on windows
       [not found]   ` <CAPdXVSxuhccEEYSLH+WR57irNYn4OrWWhmPPcCY5GjPa-RTnHQ@mail.gmail.com>
@ 2024-09-01 18:16     ` Harm Van der Vegt
  2024-09-01 18:35     ` Eli Zaretskii
  1 sibling, 0 replies; 6+ messages in thread
From: Harm Van der Vegt @ 2024-09-01 18:16 UTC (permalink / raw)
  To: 72919


[-- Attachment #1.1: Type: text/plain, Size: 7258 bytes --]

---------- Forwarded message ---------
Van: Harm Van der Vegt <harmvegt@gmail.com>
Date: zo 1 sep 2024 om 20:11
Subject: Re: bug#72919: 29.1; chart-space-usage in chart.el does not work
correctly on windows
To: Eli Zaretskii <eliz@gnu.org>


>Thanks.  However, I think your changes are not entirely correct: they
>fail to account for space usage of files inside subdirectories of the
>directory which the user types at the prompt, whereas the
>implementation with "du" does account for that.

That is indeed a pretty major difference, my bad!

>In addition, I think if someone has 'du' on Windows, it should be used.

Is there a preference for using system binaries above elisp for cases like
these?

>So I came up with the following changes instead.  Could you please try
>them, both with and without du.exe on PATH?  If these changes give
>good results, I will install them.

Thanks.

I've tried your changes with and without du. This uncovered something in the
original implementation, namely that the original implementation did not
count
hidden files and directories. du * skips dotfiles for me.

With du present chart-space-usage shows the lisp directory as the largest
in the
emacs repository root. Without du it shows .git as the largest.

I'm not sure which output is the wanted output.

I've attempted to find a shell independent way to have du show dotfiles,
but it
appears to be rather tricky.

I've made a new patch that makes the elisp implementation recursive, uses
the
rounding function provided by you and shows dotfiles.

Op zo 1 sep 2024 om 10:13 schreef Eli Zaretskii <eliz@gnu.org>:

> > From: Harm Van der Vegt <harmvegt@gmail.com>
> > Date: Sat, 31 Aug 2024 20:52:41 +0200
> >
> > Load the builtin chart package. When chart-space-usage is run, targeting
> > any directory, chart fails to find any files and therefore can't create
> > the chart. The expected behavior is that a bar chart is shown, ranking
> > the files of the directory by size.
> >
> > This only fails on my Windows machine, it works on my Ubuntu
> > installation.
> >
> > The output as shown in *Messages* is as follows:
> >
> > Collecting statistics...
> > Running ‘cd g:/Shakespeare/;du -sk *’...
> > Scanning output ...
> > chart-space-usage: No files found!
>
> Yes, the current implementation is not portable.
>
> > chart-space-usage makes use of the du (disk usage) utility, which might
> > not be present on all machines. In my case I have du installed, but
> > chart-space-usage still failed to find any files.
> >
> > I have patched chart-space-usage to remove the dependency on du and make
> > it OS agnostic and attached the patch to this email.
>
> Thanks.  However, I think your changes are not entirely correct: they
> fail to account for space usage of files inside subdirectories of the
> directory which the user types at the prompt, whereas the
> implementation with "du" does account for that.  In addition, I think
> if someone has 'du' on Windows, it should be used.
>
> So I came up with the following changes instead.  Could you please try
> them, both with and without du.exe on PATH?  If these changes give
> good results, I will install them.
>
> diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
> index da61e45..03dbe33 100644
> --- a/lisp/emacs-lisp/chart.el
> +++ b/lisp/emacs-lisp/chart.el
> @@ -641,27 +641,63 @@ chart-file-count
>                        (lambda (a b) (> (cdr a) (cdr b))))
>      ))
>
> +;; This assumes 4KB blocks
> +(defun chart--file-size (size)
> +  (* (/ (+ size 4095) 4096) 4096))
> +
> +(defun chart--directory-size (dir)
> +  "Compute total size of files in directory DIR and its subdirectories.
> +DIR is assumed to be a directory, verified by the caller."
> +  (let ((size 0))
> +    (dolist (file (directory-files-recursively dir "." t))
> +      (let ((fsize (nth 7 (file-attributes file))))
> +        (if (> fsize 0)
> +            (setq size
> +                  (+ size (chart--file-size fsize))))))
> +    size))
> +
>  (defun chart-space-usage (d)
>    "Display a top usage chart for directory D."
>    (interactive "DDirectory: ")
>    (message "Collecting statistics...")
>    (let ((nmlst nil)
>         (cntlst nil)
> -       (b (get-buffer-create " *du-tmp*")))
> -    (set-buffer b)
> -    (erase-buffer)
> -    (insert "cd " d ";du -sk * \n")
> -    (message "Running `cd %s;du -sk *'..." d)
> -    (call-process-region (point-min) (point-max) shell-file-name t
> -                        (current-buffer) nil)
> -    (goto-char (point-min))
> -    (message "Scanning output ...")
> -    (while (re-search-forward "^\\([0-9]+\\)[ \t]+\\([^ \n]+\\)$" nil t)
> -      (let* ((nam (buffer-substring (match-beginning 2) (match-end 2)))
> -            (num (buffer-substring (match-beginning 1) (match-end 1))))
> -       (setq nmlst (cons nam nmlst)
> -             ;; * 1000 to put it into bytes
> -             cntlst (cons (* (string-to-number num) 1000) cntlst))))
> +        b)
> +    (if (executable-find "du")
> +        (progn
> +         (setq b (get-buffer-create " *du-tmp*"))
> +          (set-buffer b)
> +          (erase-buffer)
> +          (if (and (memq system-type '(windows-nt ms-dos))
> +                   (fboundp 'w32-shell-dos-semantics)
> +                   (w32-shell-dos-semantics))
> +              (progn
> +                ;; With Windows shells, 'cd' does not change the drive,
> +                ;; and ';' is not reliable for running multiple
> +                ;; commands, so use alternatives.  We quote the
> +                ;; directory because otherwise pushd will barf on a
> +                ;; directory with forward slashes.
> +                (insert "pushd \"" d "\" && du -sk * \n")
> +                (message "Running `pushd \"%s\" && du -sk *'..." d))
> +            (insert "cd " d ";du -sk * \n")
> +            (message "Running `cd %s;du -sk *'..." d))
> +          (call-process-region (point-min) (point-max) shell-file-name t
> +                              (current-buffer) nil)
> +          (goto-char (point-min))
> +          (message "Scanning output ...")
> +          (while (re-search-forward "^\\([0-9]+\\)[ \t]+\\([^ \n]+\\)$"
> nil t)
> +            (let* ((nam (buffer-substring (match-beginning 2) (match-end
> 2)))
> +                  (num (buffer-substring (match-beginning 1) (match-end
> 1))))
> +             (setq nmlst (cons nam nmlst)
> +                   ;; * 1000 to put it into bytes
> +                   cntlst (cons (* (string-to-number num) 1000)
> cntlst)))))
> +      (dolist (file (directory-files d t
> directory-files-no-dot-files-regexp))
> +        (setq nmlst (cons (file-name-nondirectory file) nmlst))
> +        (if (file-regular-p file)
> +            (setq cntlst (cons (chart--file-size
> +                                (nth 7 (file-attributes file)))
> +                               cntlst))
> +          (setq cntlst (cons (chart--directory-size file) cntlst)))))
>      (if (not nmlst)
>         (error "No files found!"))
>      (chart-bar-quickie 'vertical (format "Largest files in %s" d)
>

[-- Attachment #1.2: Type: text/html, Size: 9144 bytes --]

[-- Attachment #2: 0001-Make-chart-space-usage-OS-and-shell-independent.patch --]
[-- Type: application/x-patch, Size: 2617 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#72919: 29.1; chart-space-usage in chart.el does not work correctly on windows
       [not found]   ` <CAPdXVSxuhccEEYSLH+WR57irNYn4OrWWhmPPcCY5GjPa-RTnHQ@mail.gmail.com>
  2024-09-01 18:16     ` bug#72919: Fwd: " Harm Van der Vegt
@ 2024-09-01 18:35     ` Eli Zaretskii
  2024-09-01 19:06       ` Harm Van der Vegt
  2024-09-07  9:24       ` Eli Zaretskii
  1 sibling, 2 replies; 6+ messages in thread
From: Eli Zaretskii @ 2024-09-01 18:35 UTC (permalink / raw)
  To: Harm Van der Vegt; +Cc: 72919

[Please use Reply All to reply, so that the bug tracker is CC'ed.]

> From: Harm Van der Vegt <harmvegt@gmail.com>
> Date: Sun, 1 Sep 2024 20:11:39 +0200
> 
> >Thanks.  However, I think your changes are not entirely correct: they
> >fail to account for space usage of files inside subdirectories of the
> >directory which the user types at the prompt, whereas the
> >implementation with "du" does account for that.
> 
> That is indeed a pretty major difference, my bad!
> 
> >In addition, I think if someone has 'du' on Windows, it should be used.
> 
> Is there a preference for using system binaries above elisp for cases like these?

I think 'du' has some tricks up its sleeve (like accounting correctly
for block size), which a Lisp implementation can only approximate.  I
don't think minor differences matter here, since this command is just
an illustration of what chart.el can be used for, but I do want to use
'du' if it's available.

> >So I came up with the following changes instead.  Could you please try
> >them, both with and without du.exe on PATH?  If these changes give
> >good results, I will install them.
> 
> Thanks.
> 
> I've tried your changes with and without du. This uncovered something in the
> original implementation, namely that the original implementation did not count
> hidden files and directories. du * skips dotfiles for me.
>
> With du present chart-space-usage shows the lisp directory as the largest in the 
> emacs repository root. Without du it shows .git as the largest.

This just means minor adjustments in the code I posted: we need to use
a different regexp in the call to directory-files-recursively, and
also ignore files that start with a dot in the command itself.  I will
make those changes, thanks for pointing them out

> I'm not sure which output is the wanted output.

I think we want to be as close to 'du' as possible.

> I've attempted to find a shell independent way to have du show dotfiles, but it 
> appears to be rather tricky.

I don't think we want that.

> I've made a new patch that makes the elisp implementation recursive, uses the
> rounding function provided by you and shows dotfiles.

I'd prefer to avoid recursion (in addition to what
directory-files-recursively already does), because that could overflow
the stack.

I will post a version that ignores dotfiles.

Here's the version you sent, repeated for the bug tracker:

>From 6f53d65f9ae5e1c61a2ca2650b149c895ce9794c Mon Sep 17 00:00:00 2001
>From: Harm van der Vegt <harmvegt@gmail.com>
Date: Sun, 1 Sep 2024 20:03:34 +0200
Subject: [PATCH] Make chart-space-usage OS and shell independent

---
 lisp/emacs-lisp/chart.el | 41 +++++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 12 deletions(-)

diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index c195ccb7165..b0302b55278 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -641,27 +641,44 @@ SORT-PRED if desired."
 		       (lambda (a b) (> (cdr a) (cdr b))))
     ))
 
+;; This assumes 4KB blocks
+(defun chart--file-size (size)
+  (* (/ (+ size 4095) 4096) 4096))
+
+(defun chart--directory-size (dir)
+  "Compute total size of files in directory DIR and its subdirectories.
+DIR is assumed to be a directory, verified by the caller."
+  (let ((total-size 0))
+    (dolist (file (directory-files dir t directory-files-no-dot-files-regexp))
+      (cond
+       ((file-regular-p file)
+        (setq total-size (+ total-size (chart--file-size (nth 7 (file-attributes file))))))
+       ((file-directory-p file)
+        (setq total-size (+ total-size (chart--directory-size file))))))
+    total-size))
+
 (defun chart-space-usage (d)
   "Display a top usage chart for directory D."
   (interactive "DDirectory: ")
   (message "Collecting statistics...")
   (let ((nmlst nil)
-        (cntlst nil))
-    (dolist (file (directory-files d t))
-      (when (file-regular-p file)
-        (let ((size (nth 7 (file-attributes file))))
+	(cntlst nil))
+
+    (dolist (file (directory-files d t directory-files-no-dot-files-regexp))
+        (let ((size (if (file-regular-p file)
+                        (nth 7 (file-attributes file))
+                      (chart--directory-size file))))
           (setq nmlst (cons (file-name-nondirectory file) nmlst))
-          (setq cntlst (cons size cntlst)))))
+          (setq cntlst (cons (chart--file-size size) cntlst))))
 
     (if (not nmlst)
-        (error "No files found!"))
-
-    ;; Display the chart if files are found
+	(error "No files found!"))
     (chart-bar-quickie 'vertical (format "Largest files in %s" d)
-                       nmlst "File Name"
-                       cntlst "File Size"
-                       10
-                       (lambda (a b) (> (cdr a) (cdr b))))))
+		       nmlst "File Name"
+		       cntlst "File Size"
+		       10
+		       (lambda (a b) (> (cdr a) (cdr b))))
+    ))
 
 (defun chart-emacs-storage ()
   "Chart the current storage requirements of Emacs."
-- 
2.11.0.windows.3






^ permalink raw reply related	[flat|nested] 6+ messages in thread

* bug#72919: 29.1; chart-space-usage in chart.el does not work correctly on windows
  2024-09-01 18:35     ` Eli Zaretskii
@ 2024-09-01 19:06       ` Harm Van der Vegt
  2024-09-07  9:24       ` Eli Zaretskii
  1 sibling, 0 replies; 6+ messages in thread
From: Harm Van der Vegt @ 2024-09-01 19:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 72919

[-- Attachment #1: Type: text/plain, Size: 5446 bytes --]

Clear, thanks for the response!

Op zo 1 sep 2024 om 20:35 schreef Eli Zaretskii <eliz@gnu.org>:

> [Please use Reply All to reply, so that the bug tracker is CC'ed.]
>
> > From: Harm Van der Vegt <harmvegt@gmail.com>
> > Date: Sun, 1 Sep 2024 20:11:39 +0200
> >
> > >Thanks.  However, I think your changes are not entirely correct: they
> > >fail to account for space usage of files inside subdirectories of the
> > >directory which the user types at the prompt, whereas the
> > >implementation with "du" does account for that.
> >
> > That is indeed a pretty major difference, my bad!
> >
> > >In addition, I think if someone has 'du' on Windows, it should be used.
> >
> > Is there a preference for using system binaries above elisp for cases
> like these?
>
> I think 'du' has some tricks up its sleeve (like accounting correctly
> for block size), which a Lisp implementation can only approximate.  I
> don't think minor differences matter here, since this command is just
> an illustration of what chart.el can be used for, but I do want to use
> 'du' if it's available.
>
> > >So I came up with the following changes instead.  Could you please try
> > >them, both with and without du.exe on PATH?  If these changes give
> > >good results, I will install them.
> >
> > Thanks.
> >
> > I've tried your changes with and without du. This uncovered something in
> the
> > original implementation, namely that the original implementation did not
> count
> > hidden files and directories. du * skips dotfiles for me.
> >
> > With du present chart-space-usage shows the lisp directory as the
> largest in the
> > emacs repository root. Without du it shows .git as the largest.
>
> This just means minor adjustments in the code I posted: we need to use
> a different regexp in the call to directory-files-recursively, and
> also ignore files that start with a dot in the command itself.  I will
> make those changes, thanks for pointing them out
>
> > I'm not sure which output is the wanted output.
>
> I think we want to be as close to 'du' as possible.
>
> > I've attempted to find a shell independent way to have du show dotfiles,
> but it
> > appears to be rather tricky.
>
> I don't think we want that.
>
> > I've made a new patch that makes the elisp implementation recursive,
> uses the
> > rounding function provided by you and shows dotfiles.
>
> I'd prefer to avoid recursion (in addition to what
> directory-files-recursively already does), because that could overflow
> the stack.
>
> I will post a version that ignores dotfiles.
>
> Here's the version you sent, repeated for the bug tracker:
>
> >From 6f53d65f9ae5e1c61a2ca2650b149c895ce9794c Mon Sep 17 00:00:00 2001
> >From: Harm van der Vegt <harmvegt@gmail.com>
> Date: Sun, 1 Sep 2024 20:03:34 +0200
> Subject: [PATCH] Make chart-space-usage OS and shell independent
>
> ---
>  lisp/emacs-lisp/chart.el | 41 +++++++++++++++++++++++++++++------------
>  1 file changed, 29 insertions(+), 12 deletions(-)
>
> diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
> index c195ccb7165..b0302b55278 100644
> --- a/lisp/emacs-lisp/chart.el
> +++ b/lisp/emacs-lisp/chart.el
> @@ -641,27 +641,44 @@ SORT-PRED if desired."
>                        (lambda (a b) (> (cdr a) (cdr b))))
>      ))
>
> +;; This assumes 4KB blocks
> +(defun chart--file-size (size)
> +  (* (/ (+ size 4095) 4096) 4096))
> +
> +(defun chart--directory-size (dir)
> +  "Compute total size of files in directory DIR and its subdirectories.
> +DIR is assumed to be a directory, verified by the caller."
> +  (let ((total-size 0))
> +    (dolist (file (directory-files dir t
> directory-files-no-dot-files-regexp))
> +      (cond
> +       ((file-regular-p file)
> +        (setq total-size (+ total-size (chart--file-size (nth 7
> (file-attributes file))))))
> +       ((file-directory-p file)
> +        (setq total-size (+ total-size (chart--directory-size file))))))
> +    total-size))
> +
>  (defun chart-space-usage (d)
>    "Display a top usage chart for directory D."
>    (interactive "DDirectory: ")
>    (message "Collecting statistics...")
>    (let ((nmlst nil)
> -        (cntlst nil))
> -    (dolist (file (directory-files d t))
> -      (when (file-regular-p file)
> -        (let ((size (nth 7 (file-attributes file))))
> +       (cntlst nil))
> +
> +    (dolist (file (directory-files d t
> directory-files-no-dot-files-regexp))
> +        (let ((size (if (file-regular-p file)
> +                        (nth 7 (file-attributes file))
> +                      (chart--directory-size file))))
>            (setq nmlst (cons (file-name-nondirectory file) nmlst))
> -          (setq cntlst (cons size cntlst)))))
> +          (setq cntlst (cons (chart--file-size size) cntlst))))
>
>      (if (not nmlst)
> -        (error "No files found!"))
> -
> -    ;; Display the chart if files are found
> +       (error "No files found!"))
>      (chart-bar-quickie 'vertical (format "Largest files in %s" d)
> -                       nmlst "File Name"
> -                       cntlst "File Size"
> -                       10
> -                       (lambda (a b) (> (cdr a) (cdr b))))))
> +                      nmlst "File Name"
> +                      cntlst "File Size"
> +                      10
> +                      (lambda (a b) (> (cdr a) (cdr b))))
> +    ))
>
>  (defun chart-emacs-storage ()
>    "Chart the current storage requirements of Emacs."
> --
> 2.11.0.windows.3
>
>

[-- Attachment #2: Type: text/html, Size: 6821 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#72919: 29.1; chart-space-usage in chart.el does not work correctly on windows
  2024-09-01 18:35     ` Eli Zaretskii
  2024-09-01 19:06       ` Harm Van der Vegt
@ 2024-09-07  9:24       ` Eli Zaretskii
  1 sibling, 0 replies; 6+ messages in thread
From: Eli Zaretskii @ 2024-09-07  9:24 UTC (permalink / raw)
  To: harmvegt; +Cc: 72919-done

> Cc: 72919@debbugs.gnu.org
> Date: Sun, 01 Sep 2024 21:35:03 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > I've tried your changes with and without du. This uncovered something in the
> > original implementation, namely that the original implementation did not count
> > hidden files and directories. du * skips dotfiles for me.
> >
> > With du present chart-space-usage shows the lisp directory as the largest in the 
> > emacs repository root. Without du it shows .git as the largest.
> 
> This just means minor adjustments in the code I posted: we need to use
> a different regexp in the call to directory-files-recursively, and
> also ignore files that start with a dot in the command itself.  I will
> make those changes, thanks for pointing them out

Actually, there's more here than meets the eye.  'du' does NOT skip
dotfiles (unless instructed to do so via the --exclude= command-line
option).  What happens here is that a typical Unix shell does not
include dotfiles in the expansion of the "*" wildcard, so "du *" does
not count dotfiles, but only in the directory in which 'du' was
invoked; dotfiles in subdirectories _are_ counted.

I made the Lisp implementation skip dotfiles in the directory for
which the command is invoked, but not in the subdirectories.  Windows
users who do have 'du' installed will now depend on how "*" is
expanded, which is probably different in different ports of 'du'.  I
considered using --exclude=, but that would exclude dotfiles in
subdirectories as well, which is not what happens in the Unix case.

> I will post a version that ignores dotfiles.

I installed a modified version on the emacs-30 branch.  The patch is
below in case you want to try it.

With that, I'm closing this bug.

diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index da61e45..2ca9b64 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -641,27 +641,68 @@ chart-file-count
 		       (lambda (a b) (> (cdr a) (cdr b))))
     ))
 
+;; This assumes 4KB blocks
+(defun chart--file-size (size)
+  (* (/ (+ size 4095) 4096) 4096))
+
+(defun chart--directory-size (dir)
+  "Compute total size of files in directory DIR and its subdirectories.
+DIR is assumed to be a directory, verified by the caller."
+  (let ((size 0))
+    (dolist (file (directory-files-recursively dir "." t))
+      (let ((fsize (nth 7 (file-attributes file))))
+        (if (> fsize 0)
+            (setq size
+                  (+ size (chart--file-size fsize))))))
+    size))
+
 (defun chart-space-usage (d)
   "Display a top usage chart for directory D."
   (interactive "DDirectory: ")
   (message "Collecting statistics...")
   (let ((nmlst nil)
 	(cntlst nil)
-	(b (get-buffer-create " *du-tmp*")))
-    (set-buffer b)
-    (erase-buffer)
-    (insert "cd " d ";du -sk * \n")
-    (message "Running `cd %s;du -sk *'..." d)
-    (call-process-region (point-min) (point-max) shell-file-name t
-			 (current-buffer) nil)
-    (goto-char (point-min))
-    (message "Scanning output ...")
-    (while (re-search-forward "^\\([0-9]+\\)[ \t]+\\([^ \n]+\\)$" nil t)
-      (let* ((nam (buffer-substring (match-beginning 2) (match-end 2)))
-	     (num (buffer-substring (match-beginning 1) (match-end 1))))
-	(setq nmlst (cons nam nmlst)
-	      ;; * 1000 to put it into bytes
-	      cntlst (cons (* (string-to-number num) 1000) cntlst))))
+        b)
+    (if (executable-find "du")
+        (progn
+	  (setq b (get-buffer-create " *du-tmp*"))
+          (set-buffer b)
+          (erase-buffer)
+          (if (and (memq system-type '(windows-nt ms-dos))
+                   (fboundp 'w32-shell-dos-semantics)
+                   (w32-shell-dos-semantics))
+              (progn
+                ;; With Windows shells, 'cd' does not change the drive,
+                ;; and ';' is not reliable for running multiple
+                ;; commands, so use alternatives.  We quote the
+                ;; directory because otherwise pushd will barf on a
+                ;; directory with forward slashes.  Note that * will not
+                ;; skip dotfiles with Windows shells, unlike on Unix.
+                (insert "pushd \"" d "\" && du -sk * \n")
+                (message "Running `pushd \"%s\" && du -sk *'..." d))
+            (insert "cd " d ";du -sk * \n")
+            (message "Running `cd %s;du -sk *'..." d))
+          (call-process-region (point-min) (point-max) shell-file-name t
+			       (current-buffer) nil)
+          (goto-char (point-min))
+          (message "Scanning output ...")
+          (while (re-search-forward "^\\([0-9]+\\)[ \t]+\\([^ \n]+\\)$" nil t)
+            (let* ((nam (buffer-substring (match-beginning 2) (match-end 2)))
+	           (num (buffer-substring (match-beginning 1) (match-end 1))))
+	      (setq nmlst (cons nam nmlst)
+	            ;; * 1000 to put it into bytes
+	            cntlst (cons (* (string-to-number num) 1000) cntlst)))))
+      (dolist (file (directory-files d t directory-files-no-dot-files-regexp))
+        (let ((fbase (file-name-nondirectory file)))
+          ;; Typical shells exclude files and subdirectories whose names
+          ;; begin with a period when it expands *, so we do the same.
+          (unless (string-match-p "\\`\\." fbase)
+            (setq nmlst (cons fbase nmlst))
+            (if (file-regular-p file)
+                (setq cntlst (cons (chart--file-size
+                                    (nth 7 (file-attributes file)))
+                                   cntlst))
+              (setq cntlst (cons (chart--directory-size file) cntlst)))))))
     (if (not nmlst)
 	(error "No files found!"))
     (chart-bar-quickie 'vertical (format "Largest files in %s" d)





^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-09-07  9:24 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-31 18:52 bug#72919: 29.1; chart-space-usage in chart.el does not work correctly on windows Harm Van der Vegt
2024-09-01  8:13 ` Eli Zaretskii
     [not found]   ` <CAPdXVSxuhccEEYSLH+WR57irNYn4OrWWhmPPcCY5GjPa-RTnHQ@mail.gmail.com>
2024-09-01 18:16     ` bug#72919: Fwd: " Harm Van der Vegt
2024-09-01 18:35     ` Eli Zaretskii
2024-09-01 19:06       ` Harm Van der Vegt
2024-09-07  9:24       ` Eli Zaretskii

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).