Releases: lem-project/lem
Nightly Build - 20251127-0142
Merge pull request #2006 from mychris/feature/bookmark-extension Adds a new bookmark package.
Nightly Build (macOS) - 20250810-1943
To launch lem.app, execute the following command
xattr -dr com.apple.quarantine lem.app/
Nightly Build (Linux) - 20250810-0811
Automatic nightly build from main branch
Commit: e89fac5
Nightly Build (Linux) - 20250810-0102
Automatic nightly build from main branch
Commit: 90cbd65
Nightly Build (Linux) - 20250810-0054
Automatic nightly build from main branch
Commit: c1f1379
Nightly Build (Linux) - 20250809-1923
Automatic nightly build from main branch
Commit: ae4339f
v2.3.0
What's Changed
- Add missing dependencies to .asd files. by @atgreen in #1294
- Remove hard dependency on quicklisp by @atgreen in #1295
- Adds the command DIRECTORY-MODE-KILL-LINES. by @mychris in #1296
- Make DIRECTORY-MODE-MARK-REGEXP keep old marks. by @mychris in #1297
- Adds more mark commands for directory-mode. by @mychris in #1298
- Enabled focusing leftside window with mouse in ncurses frontend by @asutoshpalai in #1301
- fix usage of erase-buffer in tetris by @resttime in #1305
- Change key bindings
ktoC-kin directory-mode, to avoid conflicts with keys in vi-mode by @cxxxr in #1306 - run tetris-quit after killing buffer as well by @resttime in #1307
- Add small docstring for define-key by @resttime in #1309
- Container improvements by @elken in #1318
- (minor) legit: fix rebase by @vindarel in #1319
- Include missed env values by @elken in #1322
- Added scrolling of unfocused window with mouse in ncurses frontend by @asutoshpalai in #1323
- translate docstrings: buffer, basic by @vindarel in #1320
- Remove quicklisp dependency by @atgreen in #1324
- Fix block selection of vi visual mode. by @gos-k in #1325
- Fix process-block-region space padding of vi visual mode by @gos-k in #1326
- legit rebase: abort, tell if in process by @vindarel in #1321
- legit: add --continue and --skip by @vindarel in #1333
- legit: add README documentation by @vindarel in #1334
- Wrap SDL2 call with trivial-main-thread to run in main thread by @resttime in #1335
- Feature/erlang mode by @ioolkos in #1303
- add completion to apropos-command by @garlic0x1 in #1340
- update docs/default-keybindings.md 20240320-062243 by @github-actions[bot] in #1341
- Add partial combined SDL2 and ncurses build by @frejanordsiek in #1329
- Fixed cursor movement by mouse when line numbers are enabled by @asutoshpalai in #1347
- Update version in .asd to latest by @garlic0x1 in #1348
- Handle ANSI escape codes. by @Homo-carbonis in #1349
- add docstring: define-command by @vindarel in #1350
- Add GitHub Sponsors to funding.yml by @cxxxr in #1351
- maybe-load-systems, not maybe-quickload by @atgreen in #1352
- add editor-variable
wrap-line-characterandwrap-line-attributeby @cxxxr in #1353 - Gerbil by @garlic0x1 in #1354
- Paredit improvements by @garlic0x1 in #1355
- line numbers: use prefix argument to show relative line numbers by @vindarel in #1357
- prompt-after-hook by @garlic0x1 in #1360
- Completion tweaks by @garlic0x1 in #1362
- Translated most (all?) doc-strings. by @BierLiebHaber in #1363
- Make lisp-compile-and-load-file ignore shebangs (
#!) by @BierLiebHaber in #1366 - disable setting clipboard when pasting in visual mode by @somniamble in #1367
- Add ignore-all-space option in legit by @cxxxr in #1368
- Add file drag and drop support for SDL2 by @jfaz1 in #1370
- Use theme colors for rainbow parens by @jfaz1 in #1369
- Bugfix out-of-range substitution of vi visual mode by @gos-k in #1372
- Dynamic vertically-adjacent gravity by @BierLiebHaber in #1371
- Make define-command accept more verbose/understandable argument-descriptors by @BierLiebHaber in #1375
- Fix doc-strings by @BierLiebHaber in #1379
- Replace arg-descriptor in defcommand with keyword by @cxxxr in #1380
- Syntax highlighting of code block in markdown-mode by @cxxxr in #1377
- Change the target language function to be called in the markdown-mode code block by @cxxxr in #1381
- Add rendering of markdown to browser by @cxxxr in #1384
- Fallback to asdf:load-system to create a micros server by @garlic0x1 in #1385
- Add :bn and :bp vi commands by @trevorcode in #1387
- [docstrings] markdown preview: add command docstring and package documentation by @vindarel in #1386
- [FEATURE] • n% line movement added to vi-mode by @theangelperalta in #1389
- Change so that messages such as C-g and “End of buffer” are not displayed by @cxxxr in #1390
- Export complete-symbol by @jsparkes in #1392
- Fix "dd" not deleting newline at end of buffer by @davidsun0 in #1395
- Add
M-x lisp-eval-expression-in-repl (C-c C-j)by @cxxxr in #1398 - hypheen -> hyphen by @jsparkes in #1404
- Fix commands with % movement by @davidsun0 in #1405
- Add support for Lua by @Sasanidas in #1409
- Export additional functions for legit and paredit mode for keybinds by @tetrazolium in #1411
- Move side init recursive load to a named directory by @Sasanidas in #1410
- add def* to grammar by @garlic0x1 in #1414
- Directory mode jump by @jsparkes in #1415
- Terminal by @cxxxr in #1418
- Dockerfile candidate to build terminal.so by @snmsts in #1422
- Fix diff colors not showing initially in legit by @jfaz1 in #1421
- Legit
statusdeleted file support, minor UI overhaul by @jfaz1 in #1420 - Add terminal.so file by @github-actions[bot] in #1427
- change to bordeaux-threads v2 by @cxxxr in #1428
- Add
make installoption for Linux systems by @jfaz1 in #1425 - update docs/default-keybindings.md 20240713-044227 by @github-actions[bot] in #1431
- update docs/default-keybindings.md 20240713-044513 by @github-actions[bot] in #1432
- Export symbols for some commands from relevant packages by @anlsh in #1433
- legit: "l l" to show the commits log by @vindarel in #1423
- Export all project-related commands by @anlsh in #1435
- update docs/default-keybindings.md 20240714-080709 by @github-actions[bot] in #1437
- Add
legit-jump-to-hunkby @jfaz1 in #1430 - Add better untracked file support to legit status by @jfaz1 in #1439
- Vindarel/legit log minor mode by @vindarel in #1438
- Use
call-with-current-projectwhen opening unstaged files/directories in legit status by @jfaz1 in #1442 - legit: enable by default. No more "lem/legit" system. by @vindarel in #1444
- Vindarel/legit common less packages better separation by @vindarel in #1445
- Asynchronously run external commands with find-file by @superduperchudmeister in #1446
- Make lsp-restart-server proceed even when buffer-workspace fails by @anlsh in #1447
- Refactoring of buffer editing by @cxxxr in #1450
- Add hard drop to tetris by @johnlorentzson in #1452
- Use theme colors for multiplexer bar by @jfaz1 in #1456
- Add SLIME's C-c ~ command (sync package) to lisp-mode by @johnlorentzson in #1455
- Refactor buffer structure by @cxxxr in #1454
- Expose modeline attributes, various theme fixes b...
v2.2.0
What's Changed
- Add repl shortcut
lsandpwdby @cxxxr in #842 - Fix closest-point function by @Sasanidas in #844
- Add modified buffers information when exit Lem by @Sasanidas in #851
- Add lisp-disassemble command by @Sasanidas in #845
- Vindarel/legit rebase interactive by @vindarel in #855
- (minor) export frame-multiplexer commands by @vindarel in #866
- image viewer: add +, -, 0 keys and help by @vindarel in #865
- Vindarel/image fit to screen by @vindarel in #867
- image viewer: improve fit to screen by @vindarel in #875
- Vindarel/directory sort follow filename by @vindarel in #876
- directory-mode: sort and follow file name (fixes) by @vindarel in #877
- Set last focused window in switch-to-window. by @Homo-carbonis in #881
- Use (switch-to-window) where appropriate. by @Homo-carbonis in #884
- Set WM_CLASS in X11 by @t-sin in #885
- Graphical text buffer by @cxxxr in #854
- Add lisp-search-symbol command by @cxxxr in #889
- Macrostep by @cxxxr in #892
- Add lem-lisp-mode:lisp-repl-mode-hook. by @fukamachi in #896
- Add lem-lisp-mode:lisp-sldb-mode-hook. by @fukamachi in #899
- Add :b and :bd command for vi-mode. by @fukamachi in #898
- Add directory-mode-rename-file command by @cxxxr in #900
- lem-core:config-plist errors out when ~/.lem/config.lisp is empty by @kamysheblid in #902
- Attempt #2: config-plist errors out when ~/.lem/config.lisp is empty by @kamysheblid in #904
- added help to cli by @kamysheblid in #905
- Add ';' for vi-mode to find a char in the same line repeatedly. by @fukamachi in #906
- Enable syntax highlighting in the listener as well by @cxxxr in #910
- Add :noh command of vi-mode for turning the isearch's highlight off. by @fukamachi in #909
- Add lem-if:update-cursor-shape to change the cursor's shape for lem-ncurses by @fukamachi in #942
- Introduce Vim's options feature, and add
:set&:cdby @fukamachi in #908 - Don't highlight trailing spaces in popup windows. by @fukamachi in #947
- Add ',' to search in the line repeatedly but backward by @fukamachi in #948
- Small changes to paredit-mode by @fukamachi in #949
- Add "number" option to show line numbers in vi-mode. by @fukamachi in #950
- Add test detection with detective and some handy lisp commands to run the test on the REPL by @Sasanidas in #957
- Fix test name when starting with # and small improvements by @Sasanidas in #958
- Test runner by @cxxxr in #956
- C-x C-e to eval that range during region selection by @cxxxr in #961
- Add keybindings for test-runner by @cxxxr in #962
- Refactor definitions of vi-mode operators. by @fukamachi in #952
- Use XDG_CONFIG_HOME to find the lem configuration directory. by @timmydo in #960
- Fix new bugs of vi-mode introduced by #952 by @fukamachi in #964
- Add "iskeyword" option by @fukamachi in #966
- Add the base of tests for lem-vi-mode by @fukamachi in #965
- NeoVim-like status indicator for vi-mode by @fukamachi in #972
- Consistent indentation in
lem.asd. by @pseudomata in #973 - Fix vi-mode's word-related motions by @fukamachi in #969
- Switch between visual modes without resetting the starting point by @fukamachi in #976
- Fix 'dd' not to append to the existing killring on serial execution like 'dddd' by @fukamachi in #978
- site-init: use lem-home instead of user's home directory by @timmydo in #980
- sdl2: Run paint operations on SDL2 main thread by @timmydo in #981
- Refactor overlay by @cxxxr in #983
- Remove modeline element from global editor variable by @Sasanidas in #985
- Fix error in start-loading-spinner by @masatoi in #988
- Add
lem:this-command-keysandlem:universal-argument-of-this-commandby @fukamachi in #986 - Add a new command
.to repeat the last operator command by @fukamachi in #989 - Fix bugs of vi-mode's line search commands by @fukamachi in #994
- Treat modifications while in INSERT mode as a single undo stack by @fukamachi in #991
- Fix
ddto delete to the end of buffer when the arg is larger than the number of line by @fukamachi in #995 - Fix vi-join-line to work for a line longer than the window width by @fukamachi in #990
- Fix an error when getting a global vi option by @fukamachi in #998
- Allow to repeat the modifications made while in INSERT mode by vi-repeat
.by @fukamachi in #1000 - Fix 'dw' not to delete to the next line. by @fukamachi in #999
- Fix vi-mode search feature to work similar to Vim by @fukamachi in #996
- Revert "Fix not to move the cursor by isearch-search-function." by @fukamachi in #1002
- Reorganize packages of vi-mode by @fukamachi in #1005
- Fix to reset
*this-command-keys*by @fukamachi in #1006 - Add a feature to set high priority keymaps for emulation modes by @fukamachi in #1004
- Add left-side drawing for graphical text buffer by @cxxxr in #1007
- Precede vi-mode keymaps over major-mode. by @fukamachi in #1008
- organize window switching commands by @cxxxr in #1009
- Added support for drawing when line-wrap is nil in graphical-text-buffer by @cxxxr in #1011
- Add
diwanddawto vi-mode by @fukamachi in #1012 - Allow 'aw' and 'iw' to be invoked in visual mode. by @fukamachi in #1013
- Modify vi-mode NORMAL cursor by @gos-k in #1016
- Fix 'dw' on spaces at the beginning of line not to go back to the previous line by @fukamachi in #1015
- Adjust cursor position after all commands in NORMAL mode by @fukamachi in #1018
- Fix
linvoked on an empty line not to go to the previous line. by @fukamachi in #1017 - Fix unintended undef-hook invocation due to more than twice key lookup by @fukamachi in #1019
- Add new text object commands
i",a",i(anda(by @fukamachi in #1014 - Rename defining macros of vi-mode and export them by @fukamachi in #1021
- Delete a dependency of lem-paredit-mode by @fukamachi in #1022
- Delete a message when switching vi-mode state by @fukamachi in #1020
- Export lem-vi-mode:change-mode and keymaps for text objects by @fukamachi in #1023
- Make the argument of vi-mode's motion optional by @fukamachi in #1024
- Fix vi-mode text objects by @fukamachi in #1025
- Small changes/fixes to vi-mode by @fukamachi in #1026
- Give sldb-keymap higher priority than vi-mode's keymap by @fukamachi in #1028
- Fix vi-mode's visual rectangle region by @fukamachi in #1029
- Add replace-state to vi-mode by @fukamachi in #1033
- Make
$allow to take a uarg. by @fukamachi in #1038 - Add
ofor visual mode to swap points by @fukamachi...
v2.1.0
We are happy to release Lem 2.1.0.
The highlights of this release are many: a new files viewer on the sidebar, many Common Lisp editing improvements, project-aware commands, a website with documentation, support for more Common Lisp implementations, and many more.
This release is brought to you by old and new contributors, many thanks to them! In no particular order: @Neshamon, @jcs090218, @theangelperalta, @avitkauskas, @snmsts, @RadSpaceEd, @jsparkes, @BierLiebHaber, @t-sin, @VitoVan, @seanfarley, @vindarel, @Sasanidas and @cxxxr.
We have decided to write this release note for each author of each Pull Request as an experiment.
@Sasanidas
Website
- Lem now has a web page: https://lem-project.github.io/ It is also translated in Chinese (and hopefully, soon in Japanese)
Detective (imenu)
- [Added] Add imenu (detective) support for Lem
Detective is the imenu equivalent from GNU Emacs, the key different is from a design perspective, is ready to be expanded and work with different source sources(tree-sitter for example) rather than mostly work with regex (even tho this is the default search behavior).
The new imenu-like commands are:
M-x detective-function: Shows a prompt with auto-completion of the current functions on the buffer.M-x detective-class: Shows a prompt with auto-completion of the current classes on the buffer.M-x detective-package: Shows a prompt with auto-completion of the current packages on the buffer.M-x detective-variable: Shows a prompt with auto-completion of the current variables on the buffer.
Also, two new movement commands, that moves from reference to references on the buffer:
M-x detective-next: Moves the point(cursor) to the next reference.M-x detective-previous: Moves the point(cursor) to the previous reference.
For now, this functionality is only available on Common Lisp buffers.
https://vimeo.com/845685109?share=copy
Emacs Lisp mode
- [Added] Add support for Emacs Lisp
A new major mode for editing Emacs Lisp code, with the ability to connect to a GNU Emacs
instance to get more updated information.
The main idea of this is to help users to test the difference between Emacs Lisp and Common Lisp and also in the future to port some Emacs Lisp functionality from working within Lem itself.
https://lem-project.github.io/modes/elisp
-
[Added] RPC Emacs↔Lem
This simple GNU Emacs package is meant to be used for interaction with internal
Emacs utilities from Lem, for now only supports some basic operations with auto-completion.
https://github.com/lem-project/lemmigton
Support for ECL, ABCL, Clasp and CCL
- [Added] Lem with other CL implementations
For now, still SBCL is the main implementation, ECL and CCL should work fairly well
and ABCL and Clasp are still work in progress, working but with minor bugs.
For more information about testing:
https://lem-project.github.io/development/implementations-details/
Elixir mode
- [Added] Basic support for Elixir language
A new major mode for the Elixir programming language, with basic syntax highlight and REPL interaction with the commandM-x run-elixir
For a more complete experience, it’s also recommended to use LSP server (https://github.com/elixir-lsp/elixir-ls), for more information about the capabilities and how to configure it:
https://lem-project.github.io/modes/elixir/
Thing at point
- [Added] Add thingatp functionality
The idea of this feature is to mimic the equivalent version of GNU Emacs but with an interactive approach, for a more interactive usage. There is a simple command that can be trigger “at point” (or cursor)M-x open-at-poin
For now, it can detect and correctly open, symbols definitions, paths and URLs.
thingatp.mp4
@vindarel
Project-aware commands
- added:
M-x project-find-fileallows to choose a file among the list of all files pertaining to the current project. This command is bound toC-x p f. See more: https://lem-project.github.io/usage/usage/#find-file-in-project- this command uses
fdif it finds it, allowing to exclude typical files and folders (node_modules/, .git/ etc).
- this command uses
- more project-aware commands were added: switch project, delete buffers, project-root, project-root-directory…
Find files recursively
- added:
M-x find-file-recursively, not bound to a key by default, does the same asproject-find-filebut starts at the buffer’s directory, not at the project root.
Directory-mode
- added: pressing
ssorts files by last modification time, then by size, then back to alphabetical order.
Other
- a simple
helpcommand was added. - added more vi keys:
space,+,-,_ - the right Alt key (sometimes referedd to as Alt Gr) is not recognized as an Alt key anymore, allowing to use it to write characters as it is meant to.
- more fixes, translations and improvements.
@cxxxr
Lisp Mode
Class Inheritance Tree
I have implemented a feature to graphically display the inheritance relationship of classes in a tree structure.
class-inheritance-tree.mp4
You can use M-x lisp-browse-class-as-tree to display the inheritance tree with the specified class as the root.
You can also open an inspector by selecting a node.
Currently, this feature is only available for SDL2.
Evaluating and printing
Changed the UI for evaluating expressions with C-x C-e.
eval.mp4
When you call M-x show-context-menu (M-h) on the expression targeted by the evaluation result, you can select an action (such as inspect) for the evaluation value.
It is now possible to associate the output strings and objects in REPL.
Using the micros:micros-print function allows you to print values to the REPL and perform inspect.
print.mp4
You can trace the selected function using M-x lisp-toggle-trace (C-c C-t).
trace.mp4
You can choose the values of arguments and return values, and inspect them.
You can also use the M-x lisp-trace-list (C-c T) command to display a list of currently traced functions and untrace them.
It is now possible to micros:watch a specific value in real time.
watcher.mp4
Expressions using micros:watch will display the evaluation results on the right side
Completion
display details of the currently selected symbol.
Describe symbol
Improved displayed by M-x lisp-describe-symbol (C-c C-d d)
REPL
- Added the
quickloadcommand in REPL shortcut. It offers autocompletion on the available Quicklisp packages and installs the selected one.- all REPL shorcuts start with a coma:
,change-package,,quickload,,cd,,sayonara. - tip: fuzzy completion allows to type
,ql.
- all REPL shorcuts start with a coma:
- Show loading spinner during evaluation
Micros (forked SLIME)
I created a repository called micros, which is a fork of slime in lem-project, and used it in lem.
For more information, please see the issue below
Documentation Mode
The documentation mode displays commands and their bindings in the lem buffer.
The commands are clickable and selecting them will jump to their definition location.
You can display it with M-x documentation-describe-bindings.
It comes in addition of the describe-.* commands, such as describe-key bound on C-x ?.
Filer / Sidebar
Added sidebar and filer.
You can open it with C-x d.
SDL2
- sdl2: fix retina mouse coordinates by @seanfarley
#822 - Fix some minor SDL2 paper cuts by @seanfarley
#831- added
M-x toggle-frame-fullscreen, addedset-display-title.
- added
- fix blurry text on Apple retina display by @VitoVan
#799 - Add a launcher script for SDL2 frontend for roswell users by @t-sin
#637 - Improved display of images to buffer: added commands for scaling and display of resolution in mode line
#629 - add a super key support in SDL2
https://github.com/lem...
v2.0.0
SDL2 Frontend
The highlight of this release is the implementation of the SDL2 frontend. This feature adds mouse support, graphic capabilities, and Windows support.
Graphics
Thanks to SDL2's graphics feature, it is now possible to display images and shapes. You can draw at any location on a specified buffer or window.

Mouse Support
I've added support for mouse clicks and scrolling. Moreover, inserting S-expressions at the cursor position with a middle mouse click, as well as selection by double-click or triple-click, has been made possible.
Addition of Color Themes
Until now, the default themes were limited to emacs-dark and emacs-light. However, with this release, I've added over 180 new themes. These themes were created by @lukpank.
https://github.com/lukpank/lem-base16-themes
Additionally, I've added the M-x list-color-themes command, which allows you to display and select from the list of available themes.
Furthermore, the selected theme is saved as a plist in $HOME/.lem/config.lisp and applied when the editor is restarted.
UI Improvement
I have significantly improved the default look of lem. I've changed the look & feel of elements such as floating-window borders, frame-multiplexer tabs, and the mode line. Moreover, I've added highlighting to the line at the cursor position.
I've also revamped the UI for listing buffers (C-x C-b) and displaying the slime connection list (M-x lisp-connection-list).
Furthermore, I've updated the design of the completion window that appears with commands like C-x C-f.
grep
I've improved the UI for displaying multiple candidates when using grep or M-.
directory-mode
I've improved the display when opening directories using M-x Find File(C-x C-f). Major updates include:
- Display of emojis corresponding to files
- Added mouse support
- Ability to open files not supported by lem with external programs
Asynchronous Completion
I've made completion calculations asynchronous. This improvement reduces lag during completion calculations.
Lisp Mode
Several minor improvements have been made:
- Indent adjustment when yanking
- Addition of a feature that does not insert ')' when there's no corresponding opening parenthesis
- Adjustment of output position to REPL
- Hovering over underlined parts during function/file compilation pops up messages
vi-mode
Many bug fixes and refactorings for vi-mode have been contributed by @theangelperalta.

Other Changes
There have been numerous other changes, including:
- Add var and defun for removing trailing whitespace on save #608 (@rearman )
- Close socket gracefully when `slime-quit' #622 (@kchanqvq )
- Addition of json-mode
- Minor changes and large-scale refactoring, such as replacing internal modules used in lsp-mode, language-server
- A significant number of bug fixes
Known Issues
There are several unresolved issues related to SDL2:
- The SDL2 frontend may not work with certain graphic drivers, especially when installing graphic drivers on Linux.
- On Linux, the system may become unresponsive when returning from suspend.
- Modifier key changes in macOS settings or Linux's xmodmap may not be reflected.









