SilverBullet 2.5.0 brings a number of keyboard binding changes (due to CodeMirror dropping support for Alt-<letter> shortcuts, sorry about this...), significant sync reliability improvements ensuring your local state stays in sync with the server, and powerful new Lua Integrated Query features including group by and aggregator support. The Space Lua engine also saw significant improvements with a port of Lua's native pattern matching library, <close> attribute support, and various performance and compatibility improvements.
Changes
- Changed keyboard bindings (sorry!). CodeMirror no longer directly allows
Alt-<letter>andAlt-<special-character>Keyboard Shortcuts, meaning I had to remap a few key bindings. It's basically a mission impossible to pick great ones, but here are the new defaults:Quick noteis now bound to bothCtrl-q q(typeCtrl-qfirst, then hitqagain) andCtrl-q Ctrl-q(hitCtrl-qtwice)Navigate: Homeis now bound toCtrl-g hText: Markeris now bound toCtrl-Alt-m- Outlines commands generally now use a
Mod-.(Cmd-.on mac,Ctrl-.on Linux/Windows) prefix:Outline: Move Right:Mod-. lOutline: Move Left:Mod-. hOutline: Move Up:Alt-ArrowUpstill works, but now also addsMod-. kfor consistencyOutline: Move Down:Alt-ArrowDowstill works, but now also addsMod-. jfor consistencyOutline: Toggle Fold:Mod-. Mod-.Outline: * Fold(other fold commands): keyboard disabled, readd yourself if you need them (see Keyboard Shortcuts)Task: Cycle State:Mod-. t
Page: Renamekeyboard shortcut removedPage: Rename Linked Pagekeyboard shortcut removedSync: Spacekeyboard shortcut removed- As documented in Keyboard Shortcuts, it is now possible to specify multiple keyboard shortcuts to a commands.
- Sync reliability work:
- Better indication whether your page is synced to the server: "Dirty state" (slightly tinted color of page name) is now aligned with actual synced-to-server state unless the editor clearly indicates it is in offline mode (yellow top bar).
- Sync snapshots are now persisted after every file sync, reducing (and hopefully eliminating) edge cases where the sync engine is killed mid-sync (for whatever reason) and the snapshot becomes of sync with "reality".
- The index status progress indicator (blue circle) should now be more reliably reflect the actual indexing status.
- HTTP status codes >= 500 are now treated as offline (better offline detection).
- Lua Integrated Query improvements (courtesy of Matouš Jan Fialka):
- group by and
havingclauses with aggregator support filter(where <cond>)clause for per-row aggregate filteringnulls first/nulls lastinorder by- Null/missing query cells now render as empty
- group by and
- Space Lua engine general improvements (most courtesey of Matouš Jan Fialka):
- Native Lua pattern matching engine (replacing previous implementation)
- Support for
<close>attribute and __close metamethod - Better arithmetic error messages
- Refactor of control flow (performance)
- Improved numeric type semantics
- Implement
string.pack,string.unpackandstring.packsize - Implement
math.random,math.randomseed,math.tointeger,math.frexpandmath.ldexp - Implement
table.move; aligntable.packandtable.unpackwith Lua semantics - table.select(table, keys...) (non-standard in Lua) API, convenient to use in Lua Integrated Query
selectclauses, see example in docs. - Extend
osmodule - Add
_VERSIONenvironment variable tostring()now respects__tostringmetamethod;#operator now respects__lenmetamethod- Fix:
table.sortcomparator,string.gsubtable replacement,math.modfreturn types, number formatting in..andtable.concat - Load order of scripts is now well defined:
order by (script.priority or 0) desc, script.ref
- New experimental API: tag.define(spec), see linked page for docs and example uses. Brings back ability to define deadlines for tasks (see example). Another part of this is Schema support for tags. When a schema is defined for a tag, you get:
- Frontmatter attribute completion and linting (in-editor error indicators) for attributes defined as part of the tag's schema.
- Lua Integrated Query attribute code completion if you use the
from v = index.tag("bla")style syntax (so explicitly bind your iterator variable). - Item-level linting (highlights the object in-line in case of validation errors).
- Tag schema updates:
pos(present in link, item and some other tags) is now deprecated, userangeinsteadrangeis a tuple of two numbers: from and to (e.g.{0, 10}) identify where the object appears in the page
- Editor improvements:
- New
Page: Create Under Cursorcommand, useful to pre-create an aspiring page link. Put your cursor in a wiki link to a non-existing page, and hitCmd-Shift-Enter(Ctrl-Shift-Enter) to create it (empty) without navigating there. - Linked Mentions now list full page path rather than abbreviated version.
- Hide vertical scrollbar overflow for long page names.
- Upload file: prompt user before replacing files and no-clobber behavior for paste uploads (by Oliver Marriott).
- Trim user input from prompts where appropriate (by rktjmp).
- Consider empty string as invalid path (by rktjmp).
- New
- Styling changes:
- Attribute names and values ([key: value] notation) now get different CSS classes in the editor:
sb-attribute-namefor names andsb-attribute-valuefor values. - The
diffFenced Code Block language now uses colors to indicate additions and removals (by Lajos Papp).
- Attribute names and values ([key: value] notation) now get different CSS classes in the editor:
- Configuration:
- New
shortWikiLinksconfig (defaulting totrue) that decides whether a wiki link should be rendered in its short form (rendering just the last segment, e.g.Person/Johnwould show asJohn). To always render the full name, putconfig.set("shortWikiLinks", false)in your CONFIG. - Authentication: how long "remember me" works is now configurable (by Metin Yazici) via Configuration and more reliably persisted.
- New
- Library Manager: SilverBullet now navigates to library page after installing one.
- FreeBSD buids!
- Now excluding
.plug.jsand.js.mapfiles from the document list. - Fix: bring back Virtual Pages.
Upgrading
- For docker-based install, pull the new image, stop the container and start a new one. For binary-based installs run
silverbullet --upgradeand restart. - After upgrading the server, make sure you reload all your SilverBullet tabs a few times, just to make sure the cache is flushed.
Dedication
As mentioned earlier, I decided to reduce my regular day job to fewer days and spend this time on SilverBullet. This allows for deeper focus and more ambitious work. If you like this, consider sponsoring to make this a little bit more financially viable for me.