https://tv.dyne.org/videos/watch/851e53de-08a8-4b6a-ba3c-67da4d6445c8

@EFLS @mxp I only ever use "switch-buffer" and use fuzzy completion to find the buffer I want by name. The idea that buffers could have an order is mind boggling lol. I keep Emacs open through multiple projects and I end up with sometimes 10s to 100s of buffers open.
If it gets really bad I'll open ibuffer, mark ones I don't need anymore, and kill them that way

Question for Emacs wizards. I found a strange thing which I could not understand after reading the documentation (https://www.gnu.org/software/emacs/manual/html_node/emacs/Initial-Options.html) and even after reading the startup files, shipped with my Emacs 30.2.
If I use the -q option — Emacs will add site-lisp directories to the load-path. But with -Q option — there are no site-lisp catalogs in the load-path. Why is this happens? 
Note: the option --no-site-lisp is not used in the both examples. So, as I understood after reading the https://www.gnu.org/software/emacs/manual/html_node/eintr/Site_002dwide-Init.html, even with --no-site-file (or -Q) the site-lisp catalogs should be added to the load-path in the both cases 
This might be a question for the mailing list instead, but I’m trying to implement buffer-local variables in my #EmacsLisp interpreter, but in my test programs, there seem to be no functional difference between the “toplevel default” and the “default” value of a variable at all. When reading the documentation, it says this:
A variable can be let-bound to a value. This makes its global value shadowed by the binding; default-value will then return the value from that binding, not the global value, and set-default will be prevented from setting the global value (it will change the let-bound value instead). The following two functions allow referencing the global value even if it’s shadowed by a let-binding.
But the documentation seems to be wrong, but maybe I am missing something? Here is my test program:
(when (intern-soft 'x) (unintern 'x obarray))
(setq record nil)
(defun record (where val)
(setq record (cons (cons where val) record))
)
(defun record-comment (str)
(setq record (cons str record))
)
(defun replay ()
(princ ";----------------------------\n")
(princ "; lexical-binding: ") (princ lexical-binding) (terpri)
(dolist (x (reverse record))
(cond
((stringp x) (princ x) (terpri))
(t (prin1 (car x))
(princ "; x => ") (prin1 (cdr x)) (terpri)
))))
(record "lexical-binding" lexical-binding)
(defvar x "global")
(record 'x x)
(make-local-variable 'x)
(record '(make-local-variable 'x) x)
(setq x "local")
(record '(setq x "local") x)
(record '(default-value 'x) (default-value 'x))
(set-default 'x "default")
(record '(set-default 'x "default") x)
(record '(default-value 'x) (default-value 'x))
(record '(default-toplevel-value 'x) (default-toplevel-value 'x))
(set-default-toplevel-value 'x "top-level")
(record '(set-default-toplevel-value 'x "toplevel") x)
(record '(default-value 'x) (default-value 'x))
(record '(default-toplevel-value 'x) (default-toplevel-value 'x))
(let ((x "inside-let-form"))
(defvar x)
(record '(let ((x "inside-let-form")) x) x)
(setq x "let-local")
(record '(let -- (setq x "let-local") x) x)
(record '(let -- (default-value 'x)) (default-value 'x))
(set-default 'x "default")
(record '(let -- (set-default 'x "default") x) x)
(record '(let -- (default-value 'x)) (default-value 'x))
(record '(let -- (default-toplevel-value 'x)) (default-toplevel-value 'x))
(set-default-toplevel-value 'x "top-level")
(record '(let -- (set-default-toplevel-value 'x "top-level")) x)
(record '(let -- (default-value 'x)) (default-value 'x))
(record '(let -- (default-toplevel-value 'x)) (default-toplevel-value 'x))
)
(record-comment ";;after let")
(record 'x x)
(record '(default-value 'x) (default-value 'x))
(record '(default-toplevel-value 'x) (default-toplevel-value 'x))
(replay)When you look at the output of the program, (default-value 'x) returns the same value as (default-toplevel-value 'x) regardless of whether it is inside of a let binding, and regardless of lexical or dynamic binding mode. Here is the above program’s output:
;----------------------------
; lexical-binding: t
x; x => "global"
(make-local-variable 'x); x => "global"
(setq x "local"); x => "local"
(default-value 'x); x => "global"
(set-default 'x "default"); x => "local"
(default-value 'x); x => "default"
(default-toplevel-value 'x); x => "default"
(set-default-toplevel-value 'x "toplevel"); x => "local"
(default-value 'x); x => "top-level"
(default-toplevel-value 'x); x => "top-level"
(let ((x "inside-let-form")) x); x => "inside-let-form"
(let -- (setq x "let-local") x); x => "let-local"
(let -- (default-value 'x)); x => "top-level"
(let -- (set-default 'x "default") x); x => "let-local"
(let -- (default-value 'x)); x => "default"
(let -- (default-toplevel-value 'x)); x => "default"
(let -- (set-default-toplevel-value 'x "top-level")); x => "let-local"
(let -- (default-value 'x)); x => "top-level"
(let -- (default-toplevel-value 'x)); x => "top-level"
;;after let
x; x => "local"
(default-value 'x); x => "top-level"
(default-toplevel-value 'x); x => "top-level" I decided to merge my #Scheme react-like declarative GUI framework (schemacs ui), even though the back-end isn’t completely bug-free yet. (It is still an experimental software project, so the main branch is the development branch).
Though it is written in pure #R7RS “small” Scheme, the only GUI back-end currently available is for Guile users who go to the trouble to install Guile-GI all on their own.
If Guile-GI is installed, put on your safety goggles and run this command in the Guile REPL:
(load "./main-gui.scm")I haven’t tried getting it to work in a Guix shell for almost a year now, but my last attempt did not go well (it crashed while initializing Gtk). To anyone who wants to try the GUI, I am sorry to inconvenience you, but I’m afraid I just have to ask you to please install Guile-GI yourself using the old-fashioned ./configure && make && make install method. If anyone happens to be able to get it to work in a Guix shell, please let me know, or open a PR on the Codeberg Git repository.
The only examples for how to use (schemacs ui) are in the test suite and the Schemacs Debugger. The only documentation so far are the comments in the source code, though I did try to be very thorough with comments.
The “Debugui” debugger works, but only has one single feature: the eval-expression command, which is bound to M-: (Alt-Colon). This command works the same as in #Emacs but you enter a Scheme language command instead. The #EmacsLisp interpreter is not yet connected to the GUI.
Now that this is merged, I am going to work on a few tasks in the Emacs Lisp interpreter that have been pending for more than a few weeks now. Then, back to creating new features in the GUI toward the goal of making it a useful program editor. And also, of course, writing some more documentation.
I have been banging my head against #Gtk3 for the past 3 weeks and all progress has pretty much come to a stand-still. No matter how simple and straight-forward my GUI is, Gtk makes it simply impossible to get the layout correct. I am now convinced that programming my own layout algorithm from scratch and using the GtkLayout container (which lets you place widgets at arbitrary X,Y coordinates) is the only way to proceed at this point. It is soooo frustrating.
The #Gtk documentation is good, but not at all good enough. The people on the Gnome Discourse have been very kind and helpful, and I truly appreciate the engagement I have had there, but ultimately I am still not able to solve my problems.
I have decided I need find some way to keep making progress without postponing the release of the work I have done so far for an indeterminate length of time. So rather than work out all the bugs in this version before merging it to the main Git branch, what I will do instead is have the main program launch a debugger window. The debugger window will have all layout calculated in advance, and all widgets will be declared once and only once throughout the lifetime of the application to avoid the reference counting issues. Obviously the debugger GUI will be very rigid, but you will at least be able to edit files and run commands in a REPL within this debugger.
Then maybe I can merge the code I have written to the main Git branch, and people will at least be able to use it through the debugger. Maybe also I could use this debugger to help with writing my layout algorithm. Also, I need to get back to the Emacs Lisp interpreter, I haven’t worked on it in almost two months now.
#tech #software #Lisp #Emacs #EmacsLisp #Scheme #SchemeLang #R7RS

(In Gtk3) I am ordering elements in a GtkApplicationWindow. The app window’s top-level layout container is a GtkBox with vertical orientation. The box contains two elements, a GtkScrolledWindow (with a GtkTextView inside of it), and GtkLabel below for reporting messages. I made sure the top-level Box and the GtkScrolledWindow both have their expand properties set to TRUE, and both have their valign and halign properties set to fill. I made sure to call pack_start with the expand and fill argume...
NEW BLOG POST: Custom sorting of mu4e headers
I love mu4e for dealing with email under Emacs: with a little Emacs Lisp you can make it do email how you want to do email.
https://jamesendreshowell.com/2026-01-08-custom-sorting-of-mu4e-headers.html
ReLifeBook, Будни ретрокомпьютерщика, Emacs Lisp и FPGA: подведение итогов моей хобби-деятельности
Ровно три года назад, в декабре 2022 года, у меня появилось новое хобби -- увлечение старыми ноутбуками. А произошло это так. Однажды мне надоело таскать в рюкзаке туда-сюда единственный ноутбук, и я решил приобрести второй рабочий ноутбук, чтобы никуда без острой необходимости его не носить. Сначала я подбирал недорогой новый. Как оказалось, почти все современные ноутбуки не удовлетворяли моим требованиям в плане оснащения. Мне нужны были: порты Ethernet и HDMI и слот для полноформатных карт памяти SD. При этом процессор хоть и не топовый, но и не лоукост. Ну и дизайн хотелось, чтоб был приятный, а не как у бюджетников 2010 года. Вариантов было мало, а цена высокой. Решил искать подходящий среди подержанных в основном под привычными мне марками Acer и Fujitsu по приемлемой цене. И если среди Acer, Toshiba это были хоть и старые, но с более-менее актуальными характеристиками, то среди Fujitsu, Lenovo это были модели на Core 2 Duo и старее. Попадались и ретро, вызвавшие во мне ностальгические чувства к LifeBook, ведь одним первых ноутбуков, купленных мною новыми, был как-раз этой компании. В общем, купил я сначала один, потом другой... В основном покупал по низу рынка, полуживые и на запчасти. По возможности приводил в порядок и восстанавливал работоспособность. Иногда приобретал экземпляры и в хорошем состоянии. А в прошедшем, 2025 году, я завёл канал в Telegram и начал рассказывать о своём хобби на Хабр. Но это не всё. Думаю, что можно подвести итоги и немного рассказать о планах.
https://habr.com/ru/articles/982396/
#fujitsu #fujitsusiemens #lifebook #fmvbiblo #emacs #emacslisp #gowin

Ровно три года назад, в декабре 2022 года, у меня появилось новое хобби -- увлечение старыми ноутбуками. А произошло это так. Однажды мне надоело таскать в рюкзаке туда-сюда единственный ноутбук, и я...

This Org-mode file was used for an org-present presentation at EmacsConf 2025 – Juicemacs. This blog post is adapted from that presentation, with added transcript and explanations for a bunch of things I didn't dig into during the presentation. For EmacsConf 2025 Project: https://github.com/gudzpoz/Juicemacs Contact: See the navigation bar (or join the Zulip chat)