2023-05-08, updated: 2023-05-13
Nyxt 3.0.0
After working on 3.0.0 for approximately two years, it is finally here.
- Please feel free to share your feedback on our GitHub issue tracker!
- You can download Nyxt 3.0.0.
Happy Hacking :-)
Obligatory screenshots:



Note: many of the links below are designed to be opened in Nyxt.
3.0.0
#
3.0.0
#
New features
#
New features
#- Add Flatpak build.
- New
migration-guidecommand to help the user migrate their configuration between major version releases. Migration suggestions are automatically given on startup error. - The auto-config file is now suffixed with the major version number. This means that upgrading Nyxt to a new major version will ignore the previous auto-configuration (which probably wouldn't work anyways).
- UserScript support (such as GreaseMonkey scripts).
- Prompt buffer updated for intuitive matching with new algorithms and settings.
- Revamp status buffer design for increased readability and aesthetics. Make it
fully customizable with
format-statusframework. - Status buffer placement can be changed with
status-buffer-position(thanks to @mianmoreno) - Most help pages, including the manual are more readable and interactive.
- Add support for the Gopher and Gemini protocols.
- Headless mode available through
--headlessCLI switch. Config file (--config) becomes the script to run in the headless instance on Nyxt. - Color-picker support when
native-dialogsare on. - New
hinting-typesetting to configure one's favorite link hints style (Vimium-style vs. body-matching prompts). Thanks to @heiwiper! - Hinting now highlights hints by dimming the matched characters (thanks to @heiwiper!)
- Session is restored on startup by default. Slot
session-restore-prompthas been replaced byrestore-session-on-startup-p, a boolean. -
reduce-tracking-modeclears widely known tracking query parameters. - Add a
%slot-value%value todefine-configurationto allow configuration to compose from differentdefine-configurationforms. execute-command ( C-space )evaluates arbitrary Lisp code and provides inline documentation for symbols.- New prediction capabilities. Nyxt can now predict your next command, it will show up automatically in the execute-command menu. Nyxt uses a stochastic model to generate predictions for what your next command will be. The model is stored locally and is cleared after every session.
- Support for key files and Yubikey locking in KeePassXC password interface.
- History globality can be set on a per-buffer basis. See the
global-history-p. backtrack-to-hubs-pallows to revisit the "hub" URLs you often visit, instead of adding them to history anew.- When started with
--remoteand without--quit, Nyxt now reads s-expression from standard input and sends it to the remote process. This avoids the performance penalty of a new process startup on each iteration. -
define-configurationautomatically resolves class names and slot names even without package prefix. For instance:style-mode -> nyxt/mode/style:style-mode. - Keybindings are also resolved to existing commands when necessary. For
instance
:jump-to-heading -> nyxt/mode/document:jump-to-heading. after-init-hookandafter-startup-hookare browser slots, instead of the global variables they used to be.- Universal describe-* commands have been replaced with new sources for the
regular commands, such as
function-non-nyxt-source,function-internal-sourceand so on. - The
browserclass has aprofileslot. - With
dynamic-attribute-width-pon, prompt buffer attribute columns adjust to their content, allowing for a better overview of lengthy attributes. - Search engines are now listed with their full name (when available).
- Internal buffers/pages are now rendered in the status area as
internal.
Prompt buffer improvements
#
Prompt buffer improvements
#- New prompt buffer fuzzy matching algorithm, hopefully offering more relevant results (thanks to @kchanqvq!)
- Prompt buffer mouse support can be disabled with the
mouse-support-pslot (thanks to @efimerspan!) - Add
heightslot. - Add
toggle-actions-on-current-suggestion-enabled ( UNBOUND ), bound toC-c C-jby default. return-selection-over-actionrenamed torun-action-on-return ( UNBOUND ). The default keybinding is the same.- Add
toggle-prompt-buffer-focus ( M-o ). - Add
first-suggestion-within-source ( UNBOUND ). - Add
last-suggestion-within-source ( UNBOUND ).
New modes
#
New modes
#- New
record-input-field-modeto record and restore input fields. Lisp REPL ( UNBOUND )is fully redesigned into a multiple-pane environment with debugging, value inspection, convenient editing bindings, and full extensibility viacellandvalue->html.- New
remembrance-modeto automatically cache the visited page content. The cache can be looked up and the page textual content can be displayed even offline. Seerecollect-visited-page.
New commands
#
New commands
#- New
next-heading ( M-} )andprevious-heading ( M-{ )commands to jump between neighboring headings. - New
toggle-message-buffer ( UNBOUND )andtoggle-status-buffer ( UNBOUND )commands. Andtoggle-maximize ( UNBOUND )command for maximizing a window, relying on these two (thanks to @maggiplant!) - New
repeat-key ( UNBOUND )command repeating the provided key as many times as you like. - Slynk is a new dependency and SLY users can now connect to a running Nyxt
instance using the
start-slynkcommand (thanks to @jgart!)
Refactors
#
Refactors
#auto-modeis incorporated into Nyxt core, with its settings residing inmodable-buffer.- The new
apply-all-matching-auto-rules-pallows you to apply all the matching auto-rules instead of the most specific one. - There are default rules for Gopher, Gemini, and Nyxt-internal-pages.
- The rules file is now moved to
auto-rules.lisp(instead of the oldauto-mode-rules.lisp).
- The new
- Major
search-buffer-moderefactor. The new implementation is more accurate and more flexible, as it allows manipulating matches as Lisp objects. - Major improvement of
editor-mode.
Moves and removals
#
Moves and removals
#- Move the
prompterlibrary to a separate repository. - Some of the Nyxt-internal logic was abstracted into separate
libraries/systems:
-
define-classmacro — tonclasses. - Portable GUI-friendly debugger — to
ndebug. - JSON parsing — to
njson. - Symbol search and listing — to
nsymbols.
-
- Move
lisp-systemto separate repository as extension. The functionslist-systemandload-systemare no longer available. - Move
os-package-manager-modeto separate repository as extension. diff-modehas been removed.
Bug fixes
#
Bug fixes
#- Lisp code run with the --script or --eval command line arguments now defaults
to the
nyxt-userpackage. - Various
spell-check-modefixes. (Thanks to @hendursaga!) - All copying and pasting commands populate
clipboard-ringreliably, thus fixing thepaste-from-clipboard-ring ( M-v )command. - Fix touchscreen gestures for VI mode.
- Fix processing via relative paths when opening files.
- Fix buffer re-attachment from the deleted window.
- Fix
history-backwards ( UNBOUND )by gracefully handling pages that are not yet done loading. - Fix full-screening event handling — status buffer no longer goes off-sync with the full-screened page/video.
- Startup is more robust against corrupted history files.
- VI insert mode is triggered in more cases where it should be triggered.
- Invoke the right WebKit command when cutting text with
ffi-buffer-cut. - Fix the display of history suggestions when going forward in history.
- Security: all the non-ASCII domain names are shown as IDN punycodes in addition to aesthetic display in the status buffer.
- The canceled page requests are stored to history, making it more consistent.
- Extensions directory is more carefully checked to avoid crashes.
- Trying to delete a hanged buffer destroys it, instead of leaving it dangling forever.
- Switching focus away from Nyxt doesn't make it unfullscreen anymore (thanks to @shaunsingh!)
- Fix
select-frame-new-buffer ( UNBOUND )andselect-frame-expedition ( UNBOUND ). - Numerous documentation and functionality fixes thanks to @shamazmazum, @hendursaga, @Gavinok, @mianmoreno, @edgar-vincent, @K1D77A, @kchanqvq, @tiberious726, @createyourpersonalaccount, @khinsen, @aaron-tan, @chrisboeg, @taiju, @odanoburu, @wasamasa, @fabian-thomas, @shakatoday, @grawlinson, @kenranunderscore, @Uthar, @e0a6, @comradekingu, @whirm, and others!
Bindings
#
Bindings
#editor-modenow has an equally powerful set of bindings in all key schemes, allowing one to open a file, save it, switch buffer or delete current buffer.-
visual-modenow has more VI bindings (thanks to @CorruptedVor!) paste-from-clipboard-ring ( M-v )is now conveniently bound toM-yin Emacs scheme ofdocument-mode.- Add Emacs/VI text editing bindings in
prompt-buffer-modeandrepl ( UNBOUND ). - Rebind
history-forwards ( UNBOUND )tohistory-forwards-maybe-query ( UNBOUND )in the Emacs and VI schemes. - Rebind
bookmark-url ( UNBOUND )andcopy-title ( M-c t )to be more consistent with other bindings. - Rebind
list-downloads ( C-s-Y ). When using the CUA keyscheme, the keybinding was previously shadowed byfollow-hint ( UNBOUND ). - Rebind
jump-to-heading ( C-h )for the CUA keyscheme.
Renamings
#
Renamings
#- The buffer hierarchy has been redesigned. Now
bufferis a minimal class and instantiating such a buffer is only useful if you need a dummy buffer.web-bufferinherits from a mix of specialized buffer subclasses, such asmodable-bufferandinput-buffer. For the full list, see thebufferclass documentation and browse its subclasses. application-modeis nowpassthrough-mode.web-modeis no more. Instead much of its features have been moved to the newdocument-mode. The buffer history management is now handled in a separate mode,history-mode.bookmarkletshave they own mode too,bookmarklets-mode.- Rename
keep-search-hints-pslot tokeep-search-marks-p. - Rename
remove-search-hintscommand toremove-search-marks ( UNBOUND ). load-after-systemandnyxt-config-filehave been replaced withdefine-nyxt-user-systemanddefine-nyxt-user-system-and-load.- Rename
nyxt/mode/hint:box-styletostyle. - Deprecate
nyxt/mode/hint:highlighted-box-styleand merge intostyle. - New
describe-modecommand (an alias fordescribe-class). describe-commandbecame an alias fordescribe-function.nyxt/mode/prompt-buffer:return-selectionrenamed torun-action-on-return ( UNBOUND ).nyxt/mode/prompt-buffer:cancel-inputrenamed toquit-prompt-buffer ( UNBOUND ).nyxt/mode/prompt-buffer:toggle-toggle-mark-backwardsrenamed totoggle-mark-backwards ( UNBOUND ).nyxt/mode/prompt-buffer:toggle-markrenamed totoggle-mark-forwards ( UNBOUND ).nyxt/mode/prompt-buffer:select-next-sourcerenamed tonext-source ( UNBOUND ).nyxt/mode/prompt-buffer:select-previous-sourcerenamed toprevious-source ( UNBOUND ).nyxt/mode/prompt-buffer:select-next-pagerenamed tonext-page ( UNBOUND ).nyxt/mode/prompt-buffer:select-previous-pagerenamed toprevious-page ( UNBOUND ).nyxt/mode/prompt-buffer:select-lastrenamed tolast-suggestion ( UNBOUND ).nyxt/mode/prompt-buffer:select-firstrenamed tofirst-suggestion ( UNBOUND ).nyxt/mode/prompt-buffer:select-nextrenamed tonext-suggestion ( UNBOUND ).nyxt/mode/prompt-buffer:select-previousrenamed toprevious-suggestion ( UNBOUND ).nyxt/mode/prompt-buffer:set-selection-actionrenamed toset-action-on-return ( UNBOUND ).nyxt/mode/prompt-buffer:run-selection-actionrenamed torun-action-on-current-suggestion ( UNBOUND ).nyxt/mode/prompt-buffer:toggle-selection-actions-enabledrenamed totoggle-actions-on-current-suggestion-enabled ( UNBOUND ).nyxt/mode/prompt-buffer:insert-selectionrenamed toinsert-current-suggestion ( UNBOUND ).
Programming interface
#
Programming interface
#- Internal pages are now using the
nyxtURL scheme. They support thelispprotocol to allow evaluating arbitrary Lisp, for instance from a button click. Internal pages also have a URL now, which means they have history support. - New
define-internal-page-commandanddefine-internal-page-command-globalhelpers to define internal pages. define-panel-commandanddefine-panel-command-globalhelpers to define new panels.- New
define-internal-schemehelper to define custom schemes. - Nyxt-native debugger available via
toggle-debug-on-error ( UNBOUND ). - Better Lisp values inspection in
describe-*commands andrepl ( UNBOUND ), extensible throughvalue->htmlmethods. - Universal
describe-*commands describing things in any Nyxt-accessible package. Available viaC-h ukey prefix. after-startup-hookto attach headless mode actions or configuration to.- Thread name is now mandatory in
run-thread. - New
nyxt-unstable*features*when built from source on an untagged commit. A feature with the commit is also added. - New
prompt1helper. - New
themelibrary. - Input processing is now easier to customize with
command-dispatcherandinput-skip-dispatcher. - Rename buffer slot
load-statustostatus. - The core
nyxtpackages are now locked to prevent against accidental clobbering from the user side. - New
ffi-buffer-load-htmlandffi-buffer-load-alternate-html. This is useful to set the buffer content without resorting to expensive JavaScript calls. - Removed
clipboard-textsince it's redundant withffi-buffer-copy. - General purpose helpers can be found in the
nyxt/utilitiespackage. - New
nxrefSpinneret tag for cross-referencing. -
if-confirmnow allows configuring its yes/no options and can return booleans. - Move download hooks to
downloadenabling proper typing and adding handlers to them. - Spinneret tags like
:nxref,:nbutton,:ninput,:nselect,:ncode,:nsection,:ntocfor better help pages markup enhanced by the compiler data. - All mode packages have been renamed to
nyxt/mode/mode-name. - Renderers are now first class objects, see the
rendererclass. It's possible to change renderer from a same REPL session. -
set-url ( C-l )andset-url-new-buffer ( M-l )accept the:URLkeyword argument and load it when provided. - New
ffi-heightandffi-widthmethods to unify most of the height & width methods used before. - Generate methods instead of functions in
define-parenscriptanddefine-parenscript-asyncto ease hooking into those with, for example,:aroundmethods. - Allow the command argument to
ffi-add-context-menu-commandto be an arbitrary function. - New package nicknames:
timeforlocal-timetypesfortrivial-typessymfornsymbols
- The third value in the
object-attributesattribute list is interpreted as display HTML for the suggestion. See the color-picker support as an example application for this feature. - New
match-portURL designator predicate for auto-rules.
Did you enjoy this article? Register for our newsletter to receive the latest hacker news from the world of Lisp and browsers!
- Maximum one email per month
- Unsubscribe at any time
