Tags: patch Attached is a patch which rewrites 'speedbar-expand-line-descendants'. The previous version could get into an infinite loop by reaching the maximum recursion depth, although in practice the slow speed meant that most people would probably abort the operation before reaching that point. The majority of the slowdown was because the motion commands being used were the variants which looked up information for every entry, displayed the information as a message, and adjusted the cursor position. The messages were not readable because of being continually overwritten. Here is a way to demonstrate that stack depth was increasing for items at the same level, that the messages were not readable, and how slow the whole process was: rm -rf /tmp/project mkdir /tmp/project for i in $(seq 1 50); do echo "(defun fun-$i ())" >> /tmp/project/file1.el; done for i in $(seq 1 50); do echo "(defun fun-$i ())" >> /tmp/project/file2.el; done emacs -Q \ --eval="(find-file \"/tmp/project/file1.el\")" \ --eval "(speedbar-get-focus)" \ --eval "(profiler-start 'cpu)" \ --eval "(speedbar-expand-line-descendants)" \ --eval "(profiler-stop)" \ --eval "(profiler-report)" ...that should expand every entry in file1.el and not touch the entries in file2.el. The replacement function is significantly faster. Messages are only used to indicate that the function is running and when it is finished - the result is similar to manually clicking every node open. Thanks, Morgan In GNU Emacs 30.0.91 (build 2, x86_64-pc-linux-gnu, X toolkit, cairo version 1.16.0, Xaw3d scroll bars) of 2024-09-12 built on inspiron Windowing system distributor 'The X.Org Foundation', version 11.0.12101007 System Description: Debian GNU/Linux 12 (bookworm) Configured using: 'configure --with-native-compilation=aot --with-xml2 --with-x-toolkit=lucid'