Skip to content


Choose a tag to compare
@xiaq xiaq released this 23 Sep 00:22
· 4236 commits to master since this release

This is another pre-release, for no particular reason other than lack of pre-releases for a long time.

As always, binaries are on

Breaking changes

  • The unpack builtin is now known as explode, for more excitement.

  • Mode-specific editor commands now reside in mode-specific subnamespaces of le: (they used to be all directly under le:). For instance, navigation-related builtins are now to be found in le:nav:. For example, le:nav-left has become le:nav:left.

    Names of most builtins undergo a simple mechanical transformation like in the example. Notable exceptions are:

    • le:start-xxx builtins that are now le:xxx:start.

    • le:navigation-default is now le:nav:default, in consistency with other navigation-mode commands.

    • Commands like le:move-dot-left are still in the le: namespace; they are not considered to be insert-mode-specific.

Notable fixes and enhancements

  • Test coverage has increased to almost 50%.

  • The edit package has seen some cleanups and refactors.

  • It is now possible to pin and hide directories in location mode, using $le:loc-pinned and $le:loc-hidden respectively (#326 #342).

  • Matching in location mode is now more sensible (#338).

  • Special builtins and and or have been added, with similar semantics as Python.

    ~> and $true $false$false
    ~> and $false ?(echo 233)
    ▶ $false
    ~> and $true 1
    ▶ 1
  • A not builtin has been added that negates boolean values.

  • Pressing Ctrl-V will now put Elvish into "raw mode" that causes the next key press to be read literally, like in other shells (#182). However, the implementation is now buggy (#350).

  • An embedded:readline-binding module has been added. Add use embedded:readline-binding to get a (partial) readline-esque binding (#339).

  • An experimental -match builtin for regular expression matching was added.

  • A repr builtin for printing the representation of objects has been added.

  • Elvish per-se no longer depends on cgo for compiling (#345). However, Elvish still uses sqlite, which requires cgo to compile.

  • When completing a variable in a namespace, e.g. put $le:lo<Tab>, the candidate menu now only shows the variable names (like loc-pinned) instead of the whole qualified name (like $le:loc-pinned). Under the hood, the definition of what is being matched against candidates, as well as the candidates themselves, have changed. When using the default prefix matcher, this has only consequence on how candidates are displayed. However, for other matchers this will make a difference.

  • An experimental variable $le:-use-subseq-matcher has been introduced. If it is set to $true, Elvish matches completion candidates using a subsequence matching algorithm. Using the example in the previous bullet, in put $le:lo<Tab>, lo is used to match against loc-pinned instead of the entire $le:lo, because loc-pinned instead of $le:loc-pinned is now considered the candidate.