Cross-platform Text Expander written in Rust

Overview

espanso

A cross-platform Text Expander written in Rust

GitHub release (latest by date) Language Platforms License Build Status

example

Visit the espanso website.

What is a Text Expander?

A text expander is a program that detects when you type a specific keyword and replaces it with something else. This is useful in many ways:

  • Save a lot of typing, expanding common sentences.
  • Create system-wide code snippets.
  • Execute custom scripts
  • Use emojis like a pro.

Key Features

  • Works on Windows, macOS and Linux
  • Works with almost any program
  • Works with Emojis 😄
  • Works with Images
  • Date expansion support
  • Custom scripts support
  • Shell commands support
  • App-specific configurations
  • Support Forms
  • Expandable with packages
  • Built-in package manager for espanso hub
  • File based configuration

Get Started

Visit the official documentation.

Support

If you need some help to setup espanso, want to ask a question or simply get involved in the community, Join the official Subreddit! :)

Donations

espanso is a free, open source software developed in my (little) spare time. If you liked the project and would like to support further development, please consider making a small donation, it really helps :)

Donate with PayPal

Contributors

Many people helped the project along the way, thanks to all of you. In particular, I want to thank:

Remarks

  • Thanks to libxdo and xclip, used to implement the Linux port.
  • Thanks to the ModifyPath script, used by espanso to improve the Windows installer.

License

espanso was created by Federico Terzi and is licensed under the GPL-3.0 license.

Comments
  • Any Wayland support plans?

    Any Wayland support plans?

    I see in the documentation that Wayland isn't currently supported. Are there any plans (however tentative) to do so at some point? I ask because I'd like to know whether it's worth my while following espanso's releases/progress.

    Linux Feature 
    opened by crispinb 42
  • Add debug mode to ShellExtension

    Add debug mode to ShellExtension

    Sometimes when writing a match that uses the shell plugin, there will be a problem that interferes with proper replacement, but the nature of the problem is difficult to ascertain. The yaml syntax can be valid, the match can be triggered, but the replacement is missing.

    Adding -vvv (up to how many makes a difference?) to the espanso worker command doesn't reveal if any error happened during the command run, or what the output/error was, if any.

    I encountered this debugging difficulty as I tried to add a trigger for local IP address, 2 ways:

      - trigger: :local
        replace: "{{address}}"
        vars:
          - name: address
            type: shell
            params:
              cmd: 'nmcli device show wlan0 | pcre2grep -M -O ''$1'' ''^IP4.ADDRESS\[1\]: *(.*)/.*'''
              # cmd: 'ip addr | pcre2grep -M -O ''$2'' ''^\d: wlan0: (.*\n[^\d])*.* inet ((\d+\.){3}\d+)/'''
    

    Neither of the two cmd values above produced a replacement. There are a lot of symbols, and maybe the command being run isn't what I think it is, and it would help if I could find out if it is, and anything else about the commands being run.

    Feature RFNR 
    opened by AndydeCleyre 38
  • espanso wayland fails to install on Ubuntu 22.04 with `libssl1.1` package unavailable error

    espanso wayland fails to install on Ubuntu 22.04 with `libssl1.1` package unavailable error

    Describe the bug

    espanso wayland fails to install on Ubuntu 22.04 beta. a dependency for libssl1.1 is unable to be resolved.

    To Reproduce Steps to reproduce the behavior:

    1. sudo apt update && sudo apt upgrade
    2. wget https://github.com/federico-terzi/espanso/releases/download/v2.1.5-beta/espanso-debian-wayland-amd64.deb
    3. sudo apt install ./espanso-debian-wayland-amd64.deb espanso-wayland : Depends: libssl1.1 (>= 1.1.0) but it is not installable
    4. sudo apt install libssl1.1 E: Package 'libssl1.1' has no installation candidate

    Expected behavior

    Expected to be able to install using instructions from https://espanso.org/docs/install/linux/#deb-wayland

    Screenshots If applicable, add screenshots or screen recordings to help explain your problem.

    Logs

    Output of apt install for espanso

    sudo apt install ./espanso-debian-wayland-amd64.deb
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    Note, selecting 'espanso-wayland' instead of './espanso-debian-wayland-amd64.deb'
    Some packages could not be installed. This may mean that you have
    requested an impossible situation or if you are using the unstable
    distribution that some required packages have not yet been created
    or been moved out of Incoming.
    The following information may help to resolve the situation:
    
    The following packages have unmet dependencies:
     espanso-wayland : Depends: libssl1.1 (>= 1.1.0) but it is not installable
    E: Unable to correct problems, you have held broken packages.
    

    and libssl1.1

    sudo apt install libssl1.1
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    Package libssl1.1 is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or
    is only available from another source
    
    E: Package 'libssl1.1' has no installation candidate
    

    Setup information

    • OS: What OS are you using?
    • Version: which version of Espanso are you running? (you can find out by running espanso --version inside a terminal)

    This was espanso wayland v2.1.5-beta from https://github.com/federico-terzi/espanso/releases/download/v2.1.5-beta/espanso-debian-wayland-amd64.deb

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID:	Ubuntu
    Description:	Ubuntu Jammy Jellyfish (development branch)
    Release:	22.04
    Codename:	jammy
    
    bug Linux 
    opened by idcrook 30
  • Replacement issue with Kitty

    Replacement issue with Kitty

    I looked at existing issues, and even at the code. It seems there is some "special" handling required for terminals. Can you please add kitty to the list?

    With a file like:

    
    matches:
      - trigger: ";name"
        replace: "Shadab Zafar"
    
      - trigger: ";email"
        replace: "[email protected]"
    

    Results in:

    Espanso on Kitty

    Notice the issues with case of the text as well as special characters like @.

    bug Linux 
    opened by dufferzafar 30
  • Espanso stops expanding after waking from sleep

    Espanso stops expanding after waking from sleep

    Using espanso on macOS 10.14 or 10.15 (seems more noticeable though) seems to die after waking from a sleep. Sometimes using restart to restart the daemon fixes it, but not reliably. I have to usually perform a full restart to get it to start using expansions again.

    bug MacOS 
    opened by WardsParadox 27
  • Windows passive mode is broken

    Windows passive mode is broken

    Good morning,

    Just for tell which bug i found : On linux, if we reload the config, few instances of espanso could be started, i need to restart it.

    When i use passive keys, text is not deleted.

    bug Windows RFNR 
    opened by Gadgetroch 26
  • Wrong replacement after session startup on non-US keyboard

    Wrong replacement after session startup on non-US keyboard

    I just installed espanso 0.7.0 on Ubuntu 20.04 with a french azerty keyboard.

    I have set some custom replacements such as :

    - trigger: ":pd"
      replace: "import pandas as pd"
    

    After editing the configuration file with espanso edit, the replacement works fine. However, when I close and restart my session the replacement becomes: i,port pqndqs qs pd instead of import pandas as pd, as if it has been typed on a qwerty keyboard.

    Restarting espanso with espanso restart fixes the problem.

    bug Linux 
    opened by GustaveCoste 25
  • Modulo forms do not work

    Modulo forms do not work


    Config :

    • Windows 10 64bits (Updated)
    • Keyscrambler (deactivated - Espanso doesn't work when it is activated)
    • Bitdefender

    Hello, I can't use forms with Espanso. In fact, they just don't appear at all. I tried with the code samples given in the Documentation (like : greet) and they don't work. When I type the command it can't fetch the data because I can't type it.

    For example, image Will just replace ":greet" by nothing.

    I tried to install manually Modulo, which worked perfectly on its own (I used the doc to create a form which appeared successfully). There is nothing in the logs.

    I hope I was clear.

    PS : The "filter-title" filter also doesn't work (I don't know if it's linked but It doesn't work)

    Thank you for helping me, Sincerely,

    bug investigate 
    opened by AntoineQ1 25
  • pipe in shell extension fails silently

    pipe in shell extension fails silently

    The output of this command curl -s 'https://api.chucknorris.io/jokes/random' | jq '.value' in a bash shell returns the value value of the json, as expected.

    Putting the same in the cmd field of an espanso rule triggers the rule but replaces the trigger word with nothing. eg.:

     - trigger: ":tst"
        replace: "{{output}}"
        vars:
           - name: output
              type: shell
              params:
                     cmd: "curl -s 'https://api.chucknorris.io/jokes/random' | jq '.value'"       
    
    bug documentation MacOS RFNR 
    opened by NeoTeo 25
  • Thunderbird plain text and html editor

    Thunderbird plain text and html editor

    I just noticed, that espanso behaves differently in Thunderbird's plain text and html editor.

    I need multiline expansions, so according to https://github.com/federico-terzi/espanso/issues/285#issuecomment-629849295 I have:

    name: Thunderbird
    
    filter_class: "Thunderbird"
    backend: Clipboard
    paste_shortcut: CtrlShiftV
    
    matches:
      - trigger: ":kr"
        replace: |-
          Kind regards
          Max
    

    I get the following results:

    • Plain message editor:

    (Yes, nothing)

    • HTML message editor:
    Kind regards
    Max
    
      <body>
        Kind regards<br>
        Max<br>
      </body>
    

    With

    filter_class: "Thunderbird"
    backend: Clipboard
    

    (paste_shortcut: CtrlShiftV commented out) I get the following results:

    • Plain message editor:
    Kind regards
    Max
    
    • HTML message editor:
    Kind regards Max
    
      <body>
        Kind regards
        Max
      </body>
    

    And with just

    filter_class: "Thunderbird"
    

    (backend: Clipboard also commented out):

    • Plain message editor:
    Kind regards
    Max
    
    • HTML message editor:
    Kind regards
    
    Max
    
      <body>
        <p>Kind regards</p>
        <p>Max<br>
        </p>
      </body>
    

    I tried to differentiate the two message editors by their window properties, but no luck, because espanso detect returns the same for both:

    Detected change, current window has properties:
    ==> Title: 'Write: (no subject) - Thunderbird - Max Mustermann <[email protected]>'
    ==> Class: 'Thunderbird'
    ==> Executable: ''
    

    Any idea how to get a consistent behaviour for both editors?

    investigate 
    opened by sphh 24
  • Autoreload not working for Espanso v2 on Linux

    Autoreload not working for Espanso v2 on Linux

    Installed:

     aur/espanso-git r1058.8f291f4-1 [installed] [2+] [0.00%] [6 Oct 2021]
    

    Currently running KDE

    Previously espanso reload the config on the fly when edits were saved, it is not doing this, I have to stop/start for it to recognize alterations.

    Also the espanso restart command has completely disappeared? This was really useful.

    bug Linux v2 
    opened by xircon 22
  • Forms insert data in wrong window (finder)

    Forms insert data in wrong window (finder)

    Describe the bug When using forms the input jumps to wrong window. I type the trigger on display 1 and the form window appears on display 2, I type my data into the form and press enter. Now the window in focus is finder. No matter where I typed my trigger. This behaviour appeared after updating from 2.1.5 to 2.1.8.

    To Reproduce Steps to reproduce the behavior:

    1. Use Form with multiple displays
    2. Try to enter Form data
    3. Finder is in focus

    Expected behavior Insertion of filled form where the trigger has been typed.

    Logs 10:33:38 [worker(5214)] [INFO] using runtime dir: "/Users/******/Library/Caches/espanso" 10:33:38 [worker(5214)] [INFO] system info: Darwin v13.1 - kernel: 22.2.0 10:33:38 [worker(5214)] [INFO] using CocoaAppInfoProvider 10:33:38 [worker(5214)] [INFO] using CocoaSource 10:33:38 [worker(5214)] [INFO] binded to IPC unix socket: /Users/******/Library/Caches/espanso/espansoworkerv2.sock 10:33:38 [worker(5214)] [INFO] using MacInjector 10:33:38 [worker(5214)] [INFO] monitoring the status of the daemon process 10:33:38 [worker(5214)] [INFO] using CocoaClipboard 10:33:38 [worker(5214)] [INFO] monitoring the status of secure input 10:33:45 [worker(5214)] [WARN] detected inconsistent modifier state for keys [(Meta, 55)], sending compensating events... 10:33:45 [worker(5214)] [WARN] detected inconsistent modifier state for keys [(Meta, 55)], sending compensating events...

    Setup information

    • OS: macOS 13.1 (22C65)
    • Version: espanso 2.1.8
    bug 
    opened by einbequemesbrot 0
  • Deleting a word with ctrl + backspace does not trigger expansion for the next word trigger if the trigger has word: true

    Deleting a word with ctrl + backspace does not trigger expansion for the next word trigger if the trigger has word: true

    Description Ctrl + backspace is a shortcut used to delete a whole word. However, when i use it to delete a word, the next trigger word that i type in the expansion trigger does not get expanded IF word: true is included in the match.

    To Reproduce Steps to reproduce the behavior:

    1. Have a snippet in the config file with word: true (Refer to screenshot)
    2. Type any word.
    3. Use ctrl + backspace to delete the whole word.
    4. Type any trigger word with "word:true" in the config, it does not expand

    Expected behavior The word should still expand.

    Screenshots image

    Setup information

    • OS: Linux
    • Version: espanso 2.1.8
    bug 
    opened by ChaiVeggie 0
  • error[E0425]: cannot find function `build_native` in this scope

    error[E0425]: cannot find function `build_native` in this scope

    Describe the bug

    rror[E0425]: cannot find function `build_native` in this scope
       --> espanso-modulo/build.rs:501:3
        |
    501 |   build_native();
        |   ^^^^^^^^^^^^ not found in this scope
    
    For more information about this error, try `rustc --explain E0425`.
    warning: `espanso-modulo` (build script) generated 1 warning
    error: could not compile `espanso-modulo` due to previous error; 1 warning emitted
    

    Setup information

    • OS: FreeBSD 13.1
    • Version: 2.1.8
    • rust-1.66.0
    bug 
    opened by yurivict 0
  • It doesn't auto start

    It doesn't auto start

    Describe the bug A clear and concise description of what the bug is I can't find the autostart option but a made a rule in Task Scheduler

    To Reproduce Steps to reproduce the behavior:

    1. Start/Restart/Log on PC

    Expected behavior A clear and concise description of what you expected to happen. Start the app automatically

    Setup information

    • OS: What OS are you using? Windows 10
    • Version: which version of Espanso are you running? (you can find out by running espanso --version inside a terminal) espanso 2.1.8
    bug 
    opened by katastrophe92 0
  • macOS logout/login doesn't restart cleanly

    macOS logout/login doesn't restart cleanly

    Describe the bug Logging out and then logging in to user with espanso installed fails to restart cleanly.

    To Reproduce Steps to reproduce the behavior:

    1. Reboot macOS.
    2. Login to user with espanso installed. ps shows:
    Screenshot 2022-12-30 at 19 56 16
    1. Logout
    2. Login again.
    3. espanso does not work, but displays the following modal:
    Screenshot 2022-12-30 at 19 57 25
    1. ps shows:
    Screenshot 2022-12-30 at 19 57 45
    1. To clean things up, it's necessary to kill -9 the process and and reload espanso

    Expected behavior espanso should unload all process on logout and restart cleanly on login.

    Setup information

    • OS: macOS 12.6.2 (Monterey)
    • Version: espanso 2.1.8
    bug 
    opened by auxbuss 0
  • Different behavior in Kitty Terminal

    Different behavior in Kitty Terminal

    Describe the bug

    • tested with Gnome Terminal, Alacritty and Kitty
    • POPOS 22.04 (Ubuntu 22.04)
    • Some substitutions have issues with "special" characters such as "&", etc.

    To Reproduce Steps to reproduce the behavior:

    example 1

    1. define the following:
      - trigger: ":test"
        replace: 'clear && MYVAR="hi there" && echo "hello one" && echo "hello two" && echo $MYVAR'
    
    1. open kitty and run the :test trigger
    2. the results are:
    clear 77 myvar='hi there' 77 echo 'hello one' 77 echo 'hello two' 77 echo 4myvar
    

    example 2

    1. define the following:
      - trigger: ":t2"
        replace: 'clear && echo "Getting Files" && echo && MYPATH="/home/dustin/docker/files" && MYDEST="/home/dustin/docker/process" && cd $MYDEST && rsync --progress -avze ssh system:/mnt/path ./process-m && echo && echo "Renaming Files" && echo && docker run --rm -it -v $MYPATH/process-m:/process-m -v $MYDEST:/media -v data:/data repo/myimage -r -rename /process-m --log-file $MYDEST/logs/rename.log -non-strict && echo && echo "Setting Permissions" && echo && sudo chown -R dustin:dustin $MYDEST && MYVAR="/home/dustin/docker/files" && echo "Deleting Files" && echo && rm -rf $MYPATH/process-m/*'
    
    1. open kitty and run the :t2 trigger
    2. the results are:
    v
    

    Expected behavior

    • I would expect the replacement to match as defined.
    • Works in Alacritty and Gnome Terminal

    Logs If possible, run espanso log in a terminal after the bug has occurred, then post the output here so that we can better diagnose the problem

    ❯  espanso log    
    11:33:45 [daemon(36341)] [INFO] reading configs from: "/home/dustin/.config/espanso"
    11:33:45 [daemon(36341)] [INFO] reading packages from: "/home/dustin/.config/espanso/match/packages"
    11:33:45 [daemon(36341)] [INFO] using runtime dir: "/home/dustin/.cache/espanso"
    11:33:45 [daemon(36341)] [INFO] system info: Pop!_OS v22.04 - kernel: 6.0.6-76060006-generic
    11:33:45 [daemon(36341)] [INFO] watching for changes in path: "/home/dustin/.config/espanso"
    11:33:45 [daemon(36341)] [INFO] espanso version: 2.1.8
    11:33:45 [daemon(36341)] [INFO] spawning the worker process...
    11:33:45 [daemon(36341)] [INFO] binded to IPC unix socket: /home/dustin/.cache/espanso/espansodaemonv2.sock
    11:33:45 [worker(36349)] [INFO] reading configs from: "/home/dustin/.config/espanso"
    11:33:45 [worker(36349)] [INFO] reading packages from: "/home/dustin/.config/espanso/match/packages"
    11:33:45 [worker(36349)] [INFO] using runtime dir: "/home/dustin/.cache/espanso"
    11:33:45 [worker(36349)] [INFO] system info: Pop!_OS v22.04 - kernel: 6.0.6-76060006-generic
    11:33:45 [worker(36349)] [INFO] binded to IPC unix socket: /home/dustin/.cache/espanso/espansoworkerv2.sock
    11:33:45 [worker(36349)] [INFO] using X11AppInfoProvider
    11:33:45 [worker(36349)] [INFO] monitoring the status of the daemon process
    11:33:45 [worker(36349)] [INFO] using X11Source
    11:33:45 [worker(36349)] [INFO] using X11ProxyInjector
    11:33:45 [worker(36349)] [INFO] using X11Clipboard
    11:35:19 [daemon(36341)] [INFO] configuration change detected, restarting worker process...
    11:35:19 [worker(36349)] [INFO] engine eventloop has terminated, propagating exit event...
    11:35:19 [worker(36349)] [INFO] waiting for engine exit mode...
    11:35:19 [worker(36349)] [INFO] exiting worker process...
    11:35:19 [daemon(36341)] [INFO] spawning the worker process...
    11:35:19 [worker(36692)] [INFO] reading configs from: "/home/dustin/.config/espanso"
    11:35:19 [worker(36692)] [INFO] reading packages from: "/home/dustin/.config/espanso/match/packages"
    11:35:19 [worker(36692)] [INFO] using runtime dir: "/home/dustin/.cache/espanso"
    11:35:19 [worker(36692)] [INFO] system info: Pop!_OS v22.04 - kernel: 6.0.6-76060006-generic
    11:35:19 [worker(36692)] [INFO] binded to IPC unix socket: /home/dustin/.cache/espanso/espansoworkerv2.sock
    11:35:19 [worker(36692)] [INFO] using X11AppInfoProvider
    11:35:19 [worker(36692)] [INFO] monitoring the status of the daemon process
    11:35:19 [worker(36692)] [INFO] using X11Source
    11:35:19 [worker(36692)] [INFO] using X11ProxyInjector
    11:35:19 [worker(36692)] [INFO] using X11Clipboard
    11:45:06 [daemon(36341)] [INFO] configuration change detected, restarting worker process...
    11:45:06 [worker(36692)] [INFO] engine eventloop has terminated, propagating exit event...
    11:45:06 [worker(36692)] [INFO] waiting for engine exit mode...
    11:45:06 [worker(36692)] [INFO] exiting worker process...
    11:45:06 [daemon(36341)] [INFO] spawning the worker process...
    11:45:06 [worker(38322)] [INFO] reading configs from: "/home/dustin/.config/espanso"
    11:45:06 [worker(38322)] [INFO] reading packages from: "/home/dustin/.config/espanso/match/packages"
    11:45:06 [worker(38322)] [INFO] using runtime dir: "/home/dustin/.cache/espanso"
    11:45:06 [worker(38322)] [INFO] system info: Pop!_OS v22.04 - kernel: 6.0.6-76060006-generic
    11:45:06 [worker(38322)] [INFO] binded to IPC unix socket: /home/dustin/.cache/espanso/espansoworkerv2.sock
    11:45:06 [worker(38322)] [INFO] using X11AppInfoProvider
    11:45:06 [worker(38322)] [INFO] monitoring the status of the daemon process
    11:45:06 [worker(38322)] [INFO] using X11Source
    11:45:06 [worker(38322)] [INFO] using X11ProxyInjector
    11:45:06 [worker(38322)] [INFO] using X11Clipboard
    11:45:28 [daemon(36341)] [INFO] configuration change detected, restarting worker process...
    11:45:28 [worker(38322)] [INFO] engine eventloop has terminated, propagating exit event...
    11:45:28 [worker(38322)] [INFO] waiting for engine exit mode...
    11:45:28 [worker(38322)] [INFO] exiting worker process...
    11:45:28 [daemon(36341)] [INFO] spawning the worker process...
    11:45:28 [worker(38418)] [INFO] reading configs from: "/home/dustin/.config/espanso"
    11:45:28 [worker(38418)] [INFO] reading packages from: "/home/dustin/.config/espanso/match/packages"
    11:45:28 [worker(38418)] [INFO] using runtime dir: "/home/dustin/.cache/espanso"
    11:45:28 [worker(38418)] [INFO] system info: Pop!_OS v22.04 - kernel: 6.0.6-76060006-generic
    11:45:28 [worker(38418)] [INFO] binded to IPC unix socket: /home/dustin/.cache/espanso/espansoworkerv2.sock
    11:45:28 [worker(38418)] [INFO] using X11AppInfoProvider
    11:45:28 [worker(38418)] [INFO] monitoring the status of the daemon process
    11:45:28 [worker(38418)] [INFO] using X11Source
    11:45:28 [worker(38418)] [INFO] using X11ProxyInjector
    11:45:28 [worker(38418)] [INFO] using X11Clipboard
    

    Setup information

    • OS: What OS are you using?
    ❯  bat -p /etc/lsb-releaseDISTRIB_ID=Pop
    DISTRIB_RELEASE=22.04
    DISTRIB_CODENAME=jammy
    DISTRIB_DESCRIPTION="Pop!_OS 22.04 LTS"
    
    • Version: which version of Espanso are you running? (you can find out by running espanso --version inside a terminal)
    ❯  espanso --version
    espanso 2.1.8
    

    I suspect it might be the way escaping is handled. Either in Espanso or Kitty? (Total guess).

    Thank you so much!

    bug 
    opened by bashfulrobot 0
Releases(v2.1.8)
  • v2.1.8(Nov 1, 2022)

    v2.1.8 is out! 🎉

    This small release solves a couple of problems with macOS Ventura and Wayland

    • Solved a bug that caused the SearchBar to not work correctly on macOS Ventura #1413
    • Solved a memory issue that caused the SearchBar to crash in some cases
    • Solved a compatibility issue that caused "Unexpected exit code from worker 90" on Wayland #1057 (special thanks to @lakoliu and Ricky Kresslein for the fix 🚀)

    Happy expanding 🚀

    Source code(tar.gz)
    Source code(zip)
    espanso-debian-wayland-amd64-sha256.txt(99 bytes)
    espanso-debian-wayland-amd64.deb(3.49 MB)
    espanso-debian-x11-amd64-sha256.txt(95 bytes)
    espanso-debian-x11-amd64.deb(3.30 MB)
    Espanso-Mac-Intel.zip(7.15 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.70 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.87 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.27 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(15.63 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.1.7-beta(Sep 11, 2022)

    v2.1.7-beta is out! 🎉

    This release is mostly focused on improving Espanso's security and compatibility.

    Code-signed binaries

    Starting from this release, Espanso will be digitally signed on both macOS and Windows. This change further improves Espanso's security, adding an extra layer of protection from tampering and corruption of binaries.

    Digital signatures will also improve the installation process, as they should limit the number of warnings from operating systems.

    This much-needed addition should also help Espanso's adoption in business environments, where digital signatures are often required to run software.

    Other changes/fixes

    • Remove OpenSSL dependency on Linux, improving compatibility on Debian/Ubuntu. Fixes 1056

    Any feedback or bug report is very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Source code(tar.gz)
    Source code(zip)
    espanso-debian-wayland-amd64-sha256.txt(99 bytes)
    espanso-debian-wayland-amd64.deb(3.49 MB)
    espanso-debian-x11-amd64-sha256.txt(95 bytes)
    espanso-debian-x11-amd64.deb(3.30 MB)
    Espanso-Mac-Intel.zip(7.16 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.72 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.88 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.29 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(15.64 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.1.6-beta(Jul 3, 2022)

    v2.1.6-beta is out! 🎉

    This release comes with a couple of new features and several of bug fixes.

    New feature: Alternative X11 backend (based on xdotool)

    On Linux (X11), you can now enable an alternative injection backend based on the awesome libxdo library, the same one powering xdotool. This might solve (or at least mitigate) some problems with certain locales, so if you're having problems on X11, you can now try this new mode by adding the following to your default.yml file:

    x11_use_xdotool_backend: true
    

    New feature: Alt-codes emulation

    If you're a Windows user, chances are that you've used the ALT+Numpad codes combination in the past to insert some special characters. Unfortunately, the mechanism used internally by Espanso is incompatible with this feature, so in this release we added an emulation mode for it, which should produce identical results.

    To enable it, just add the following to your default.yml file:

    emulate_alt_codes: true
    

    As a side effect, this brings the Alt-code functionality to macOS and Linux as well! (though it's still experimental)

    Other changes/fixes

    • Improve espanso stop to handle non-graceful terminations. #1281
    • Add multiple locations to fix migrate command on Linux #1051

    Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Source code(tar.gz)
    Source code(zip)
    espanso-debian-wayland-amd64-sha256.txt(99 bytes)
    espanso-debian-wayland-amd64.deb(3.06 MB)
    espanso-debian-x11-amd64-sha256.txt(95 bytes)
    espanso-debian-x11-amd64.deb(2.87 MB)
    Espanso-Mac-Intel.zip(7.03 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.70 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.87 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.31 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.59 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.1.4-beta(Mar 19, 2022)

    The first v2 beta release is finally ready! 🎉

    With this release, the v2 will officially become the stable version, while version 0.7.3 (legacy version) will be deprecated. This decision comes after months of testing, and we're confident the v2 is ready for general adoption!

    This release also comes with a new juicy feature, as well as several bug fixes.

    New feature: Localized dates

    After years, Espanso finally supports localized dates!

    For example, you can now define a match as:

      - trigger: ":tomorrow"
        replace: "{{mytime}}"
        vars:
          - name: mytime
            type: date
            params:
              format: "%A"
              offset: 86400
    

    And see it expand to tomorrow weekday in your locale. In my case, the output is domenica (the Italian word for Sunday).

    You can also force a specific locale, such as:

      - trigger: ":tomorrow"
        replace: "{{mytime}}"
        vars:
          - name: mytime
            type: date
            params:
              format: "%A"
              locale: "es-ES"
              offset: 86400
    

    Which is expanded to domingo (Spanish word for Sunday).

    Here you can find the list of valid formats.

    I'm going to write the full documentation in the upcoming days.

    Other changes/fixes

    • Override PATH env variable on macOS to fix some edge cases. #966
    • Fix memory issue on macOS that sometimes caused Espanso to crash
    • Fix search bar not focusing correctly on some Linux DE #829
    • Add missing wl-clipboard dependency #956
    • Others #944, #961

    Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Source code(tar.gz)
    Source code(zip)
    espanso-debian-wayland-amd64-sha256.txt(99 bytes)
    espanso-debian-wayland-amd64.deb(2.99 MB)
    espanso-debian-x11-amd64-sha256.txt(95 bytes)
    espanso-debian-x11-amd64.deb(2.80 MB)
    Espanso-Mac-Intel.zip(6.75 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.47 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.80 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.14 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(17.54 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.1.3-alpha(Jan 17, 2022)

    ⚠ ALPHA RELEASE ⚠

    This alpha release ships with several bug fixes:

    Breaking change: search_trigger now disabled by default

    Prior to version 2.1.3, Espanso was configured to use "jkj" as search_trigger by default. That was a source of confusion for many users, so Espanso now ships with the search_trigger disabled by default.

    If you want to keep using it, you can explicitly specify it in your configuration, as described here: https://espanso.org/docs/next/configuration/options/#customizing-the-search-trigger

    New install methods

    In this version, we re-introduced two additional installation methods:

    • On macOS, you can now install Espanso v2 with Homebrew: https://espanso.org/docs/next/install/mac/#install-using-homebrew
    • On Debian/Ubuntu, you can use a DEB package (both on X11 and Wayland): https://espanso.org/docs/next/install/linux/#choosing-the-right-install-method

    Other changes/fixes

    • clarify 'espanso service' usage. Fix #920
    • wire up inject_delay on macOS. Fix #849
    • fix SecureInput troubleshoot link. Fix #892
    • disable 'search_trigger' by default. Fix #925
    • implement additional search items. #789
    • add search terms option. #789 #796
    • remove paste_shortcut and backend override from Thunderbird patch. Fix #455

    If anyone wants to give it a try (and enjoy the Searchbar and Regex trigger goodies 😎), here are the main takeaways:

    • New documentation can be found here: https://espanso.org/docs/next/get-started/
    • Passive mode is currently not supported, though regex triggers might cover (and improve!) many of the possible use-cases
    • We are still porting some of the old installation methods

    Keep in mind that this is an alpha release, so things are likely to be buggy. Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Automatically released by CI

    Source code(tar.gz)
    Source code(zip)
    espanso-debian-wayland-amd64-sha256.txt(99 bytes)
    espanso-debian-wayland-amd64.deb(2.91 MB)
    espanso-debian-x11-amd64-sha256.txt(95 bytes)
    espanso-debian-x11-amd64.deb(2.72 MB)
    Espanso-Mac-Intel.zip(6.83 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.52 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.76 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.14 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.35 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.1.2-alpha(Dec 27, 2021)

    ⚠ ALPHA RELEASE ⚠

    This alpha release ships with several new features and bug fixes:

    Breaking change: toggle_key now disabled by default

    Prior to version 2.1.2, Espanso was configured to use the ALT key as toggle_key by default. That was a major source of confusion, as many users accidentally pressed it during normal use (sorry, bad design decision from my side... ) For this reason, Espanso now ships with the toggle_key disabled by default.

    If you want to keep using it, you can explicitly specify it in your configuration, as described here: https://espanso.org/docs/next/configuration/options/#customizing-the-toggle-key

    New Choice Extension

    The Choice extension can be used to open a selection dialog, letting you choose the right value from a list.

    image

    More information on the docs: https://espanso.org/docs/next/matches/extensions/#choice-extension

    Other changes/fixes

    • Add patch for Brave browser. #885
    • Stop Espanso when removing snap. #464
    • Switch default Wayland paste shortcut to SHIFT+INSERT #899
    • Fix return key not working inside Form's listboxes #857
    • Potentially mitigate AppImage bug on some distros #900

    If anyone wants to give it a try (and enjoy the Searchbar and Regex trigger goodies 😎), here are the main takeaways:

    • New documentation can be found here:
    • Passive mode is currently not supported, though regex triggers might cover (and improve!) many of the possible use-cases
    • The distribution format has changed for some platforms, please see the instructions for macOS, Windows and Linux. On macOS, Espanso is now a regular App bundle, which should make it much easier to deal with. On Linux, we still have a lot of work to do. For now, we have an AppImage available for X11 systems, with more formats and integrations (AUR, etc) to come. Wayland users will need to compile Espanso from sources right now.

    Keep in mind that this is an alpha release, so things are likely to be buggy. Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Automatically released by CI

    Source code(tar.gz)
    Source code(zip)
    Espanso-Mac-Intel.zip(6.83 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.51 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.75 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.12 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.33 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.1.1-alpha(Nov 27, 2021)

    ⚠ ALPHA RELEASE ⚠

    This alpha release ships with several new features and bug fixes:

    New detect tool

    You can now type #detect# inside an application to show the information Espanso is detecting, which is useful to create App-specific configurations. This command can also be triggered by the Searchbar and will replace the previous espanso detect subcommand available in pre-v2 releases.

    Active application detection

    New log tool

    You can now open Espanso's log from the search bar, by selecting the "Show Espanso's Logs" option. Windows and macOS users can also show them from the status icon's context menu.

    Gradual rollout of packages

    We ported most of the old packages to the new format inside the Hub, so you can install them with:

    espanso install <package_name>
    

    That said, there are still many things left to do, including rewriting the package documentation and porting the new packages to the hub. Hopefully, we'll be able to do so in the upcoming releases :)

    Other changes/fixes

    • Improved Deadkeys handling on X11. #881
    • Added alternative xclip backend for X11. #882

    If anyone wants to give it a try (and enjoy the Searchbar and Regex trigger goodies 😎), here are the main takeaways:

    • Documentation is still lacking, I just had the chance to write a migration guide. That should be enough to get started with the new version, but there is a lot more to cover. Feel free to ask here on GitHub or Reddit if you don't understand something :)
    • Passive mode is currently not supported, though regex triggers might cover (and improve!) many of the possible use-cases
    • The distribution format has changed for some platforms, please see the instructions for macOS, Windows and Linux. On macOS, Espanso is now a regular App bundle, which should make it much easier to deal with. On Linux, we still have a lot of work to do. For now, we have an AppImage available for X11 systems, with more formats and integrations (AUR, snap, etc) to come. Wayland users will need to compile Espanso from sources right now, I'm going to write a comment in the wayland thread with some instructions soon

    Keep in mind that this is an alpha release, so things are likely to be buggy. Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Automatically released by CI

    Source code(tar.gz)
    Source code(zip)
    Espanso-Mac-Intel.zip(6.81 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.50 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.74 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.11 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.34 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.1.0-alpha(Nov 13, 2021)

    ⚠ ALPHA RELEASE ⚠

    This alpha release ships with several new features, bug fixes and one breaking change:

    Variable injection

    With variable injection, you'll be able to freely use the value of a previous variable as a parameter for another. For example, you can use the output of a shell command to populate a Form's choice/list control.

    More info here: https://espanso.org/docs/next/matches/variables/

    Form syntax [breaking change]

    In previous versions, you could define Form's controls with the same curly-bracket syntax as variables:

      - trigger: ":greet"
        form: |
          Hey {{name}},
          Happy Birthday!
    

    Since version 2.1.0-alpha, you'll need to use double square-brackets to define controls instead, such as:

      - trigger: ":greet"
        form: |
          Hey [[name]],
          Happy Birthday!
    

    This breaking change was needed to support the new variable injection mechanism, for which the curly-brackets syntax {{name}} is reserved.

    Other changes/fixes

    • Add workaround to fix inconsistent state detection on macOS. Fix #825 #858
    • Form list/choice controls now accept a multiline string as input #855

    If anyone wants to give it a try (and enjoy the Searchbar and Regex trigger goodies 😎), here are the main takeaways:

    • Documentation is still lacking, I just had the chance to write a migration guide. That should be enough to get started with the new version, but there is a lot more to cover. Feel free to ask here on GitHub or Reddit if you don't understand something :)
    • Packages from the Hub are currently not working. With the great help of @4lch4, we are setting up the CI for the new Hub, which brings several improvements compared to the previous edition. In the meanwhile, you will need to manually copy the YAML files into your configs if you want to install a package. Sorry for the inconvenience :)
    • Passive mode is currently not supported, though regex triggers might cover (and improve!) many of the possible use-cases
    • Some commands, such as espanso detect, are yet to be ported. If you need to create an app-specific config, please see this comment
    • The distribution format has changed for some platforms, please see the instructions for macOS, Windows and Linux. On macOS, Espanso is now a regular App bundle, which should make it much easier to deal with. On Linux, we still have a lot of work to do. For now, we have an AppImage available for X11 systems, with more formats and integrations (AUR, snap, etc) to come. Wayland users will need to compile Espanso from sources right now, I'm going to write a comment in the wayland thread with some instructions soon

    Keep in mind that this is an alpha release, so things are likely to be buggy. Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Automatically released by CI

    Source code(tar.gz)
    Source code(zip)
    Espanso-Mac-Intel.zip(6.80 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.49 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.74 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.11 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.32 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.0.5-alpha(Nov 6, 2021)

    ⚠ ALPHA RELEASE ⚠

    This alpha release ships with several new features and bug fixes:

    • Espanso now shows an error message if rendering for a match fails instead of silently failing #774
    • Now Forms can be submitted by just pressing Enter #709
    • Port espanso match list and espanso match exec commands #786 #780
    • Port espanso cmd command #832
    • Implement Espanso disabled/enabled notification on Linux #798
    • Avoid stripping away paragraph tags in markdown #811
    • Fix search bar shortcut handling for non-querty layouts #823
    • Fix possible undefined behavior on macOS #826
    • Prevent certain commands from being run as root on macOS #648
    • Improvements on Wayland implementation when devices are removed, that previously caused espanso to go 100% cpu #836
    • Improve reporting of espanso start command
    • Add delay to espanso restart to mitigate race conditions
    • Block Espanso from being run on macOS when subject to app translocation #844 #845
    • Read Wayland display from env variable instead of hard-coding it #846
    • Hopefully fix ARM compilation on linux #801
    • Improve handling of wx-config command on Linux #840

    If anyone wants to give it a try (and enjoy the Searchbar and Regex trigger goodies 😎), here are the main takeaways:

    • Documentation is still lacking, I just had the chance to write a migration guide. That should be enough to get started with the new version, but there is a lot more to cover. Feel free to ask here on GitHub or Reddit if you don't understand something :)
    • Packages from the Hub are currently not working. With the great help of @4lch4, we are setting up the CI for the new Hub, which brings several improvements compared to the previous edition. In the meanwhile, you will need to manually copy the YAML files into your configs if you want to install a package. Sorry for the inconvenience :)
    • Passive mode is currently not supported, though regex triggers might cover (and improve!) many of the possible use-cases
    • Some commands, such as espanso detect, are yet to be ported. If you need to create an app-specific config, please see this comment
    • The distribution format has changed for some platforms, please see the instructions for macOS, Windows and Linux. On macOS, Espanso is now a regular App bundle, which should make it much easier to deal with. On Linux, we still have a lot of work to do. For now, we have an AppImage available for X11 systems, with more formats and integrations (AUR, snap, etc) to come. Wayland users will need to compile Espanso from sources right now, I'm going to write a comment in the wayland thread with some instructions soon

    Keep in mind that this is an alpha release, so things are likely to be buggy. Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Automatically released by CI

    Source code(tar.gz)
    Source code(zip)
    Espanso-Mac-Intel.zip(6.78 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.47 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.73 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.08 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.29 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.0.4-alpha(Oct 26, 2021)

    ⚠ ALPHA RELEASE ⚠

    This fourth alpha release ships with several bug fixes:

    • Fix form extension not handling default field type. Fix #804
    • Improve toggle key handling. Fix #815
    • Add workaround to avoid crashing Espanso with malformed markdown. Fix #759
    • Improve handling of Spanish keyboard layouts on Linux. Fix #802
    • Fix (hopefully) compilation on ARM Linux #801
    • Added Alacritty and Virtualbox patches on Windows #787 #742
    • Add option to lower keyboard layout caching on Windows #745

    If anyone wants to give it a try (and enjoy the Searchbar and Regex trigger goodies 😎), here are the main takeaways:

    • Documentation is still lacking, I just had the chance to write a migration guide. That should be enough to get started with the new version, but there is a lot more to cover. Feel free to ask here on GitHub or Reddit if you don't understand something :)
    • Packages from the Hub are currently not working. With the great help of @4lch4, we are setting up the CI for the new Hub, which brings several improvements compared to the previous edition. In the meanwhile, you will need to manually copy the YAML files into your configs if you want to install a package. Sorry for the inconvenience :)
    • Passive mode is currently not supported, though regex triggers might cover (and improve!) many of the possible use-cases
    • Some commands, such as espanso detect, are yet to be ported. If you need to create an app-specific config, please see this comment
    • The distribution format has changed for some platforms, please see the instructions for macOS, Windows and Linux. On macOS, Espanso is now a regular App bundle, which should make it much easier to deal with. On Linux, we still have a lot of work to do. For now, we have an AppImage available for X11 systems, with more formats and integrations (AUR, snap, etc) to come. Wayland users will need to compile Espanso from sources right now, I'm going to write a comment in the wayland thread with some instructions soon

    Keep in mind that this is an alpha release, so things are likely to be buggy. Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Automatically released by CI

    Source code(tar.gz)
    Source code(zip)
    Espanso-Mac-Intel.zip(6.73 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.43 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.70 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.04 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.26 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.0.3-alpha(Oct 17, 2021)

    ⚠ ALPHA RELEASE ⚠

    This third alpha release ships with several bug fixes, especially for macOS and Windows:

    • Improved behavior of shell extension: it now fails only if the status code is non-zero, ignoring a non-empty STDERR #563
    • Added experimental support for Snap on Linux X11
    • macOS: Fixed bug that prevented older macOS versions from running Espanso #785
    • macOS: Fixed edge case that prevented daemon from detecting a worker failure #788
    • Windows: Fixed long standing bug that caused random characters to appear when pressing Alt+Arrow keys #552
    • Windows: Fixed long standing bug that prevented some keys from being detected correctly #307
    • Windows: Fixed welcome screen continue button being cut with 125% scaling #777
    • macOS: Fixed Espanso process appearing "not responding"
    • macOS: Fixed global hotkey handling that caused espanso internal modifier states to go out-of-sync #791
    • Windows: Fixed forms crashing when username contained unicode characters #554
    • Fixed bug that caused multiple search bars to "stack up" when pressing ALT+SPACE multiple times #781
    • Fixed bug that caused espanso to interpret keys even when certain modifiers were pressed #725

    If anyone wants to give it a try (and enjoy the Searchbar and Regex trigger goodies 😎), here are the main takeaways:

    • Documentation is still lacking, I just had the chance to write a migration guide. That should be enough to get started with the new version, but there is a lot more to cover. Feel free to ask here on GitHub or Reddit if you don't understand something :)
    • Packages from the Hub are currently not working. With the great help of @4lch4, we are setting up the CI for the new Hub, which brings several improvements compared to the previous edition. In the meanwhile, you will need to manually copy the YAML files into your configs if you want to install a package. Sorry for the inconvenience :)
    • Passive mode is currently not supported, though regex triggers might cover (and improve!) many of the possible use-cases
    • Some commands, such as espanso detect, are yet to be ported. If you need to create an app-specific config, please see this comment
    • The distribution format has changed for some platforms, please see the instructions for macOS, Windows and Linux. On macOS, Espanso is now a regular App bundle, which should make it much easier to deal with. On Linux, we still have a lot of work to do. For now, we have an AppImage available for X11 systems, with more formats and integrations (AUR, snap, etc) to come. Wayland users will need to compile Espanso from sources right now, I'm going to write a comment in the wayland thread with some instructions soon

    Keep in mind that this is an alpha release, so things are likely to be buggy. Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Automatically released by CI

    Source code(tar.gz)
    Source code(zip)
    Espanso-Mac-Intel.zip(6.75 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.42 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.70 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.04 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.26 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.0.2-alpha(Oct 11, 2021)

    ⚠ ALPHA RELEASE ⚠

    This second alpha release ships with some bug fixes we identified in the past few days:

    • Ported the espanso status subcommand #775
    • Fixed a bug that caused espanso from not being started automatically on Linux. #783
    • Fixed a bug that prevented auto-reload from working correctly with some editors. #769
    • Add patch for Thunderbird #130 #376
    • Fix a bug in the migration tool that caused it to output invalid yaml with padded multiline strings #771.

    If anyone wants to give it a try (and enjoy the Searchbar and Regex trigger goodies 😎), here are the main takeaways:

    • Documentation is still lacking, I just had the chance to write a migration guide. That should be enough to get started with the new version, but there is a lot more to cover. Feel free to ask here on GitHub or Reddit if you don't understand something :)
    • Packages from the Hub are currently not working. With the great help of @4lch4, we are setting up the CI for the new Hub, which brings several improvements compared to the previous edition. In the meanwhile, you will need to manually copy the YAML files into your configs if you want to install a package. Sorry for the inconvenience :)
    • Passive mode is currently not supported, though regex triggers might cover (and improve!) many of the possible use-cases
    • Some commands, such as espanso detect, are yet to be ported. If you need to create an app-specific config, please see this comment
    • The distribution format has changed for some platforms, please see the instructions for macOS, Windows and Linux. On macOS, Espanso is now a regular App bundle, which should make it much easier to deal with. On Linux, we still have a lot of work to do. For now, we have an AppImage available for X11 systems, with more formats and integrations (AUR, snap, etc) to come. Wayland users will need to compile Espanso from sources right now, I'm going to write a comment in the wayland thread with some instructions soon

    Keep in mind that this is an alpha release, so things are likely to be buggy. Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Automatically released by CI

    Source code(tar.gz)
    Source code(zip)
    Espanso-Mac-Intel.zip(6.74 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.41 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.70 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.03 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.26 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v2.0.1(Oct 9, 2021)

    ⚠ ALPHA RELEASE ⚠

    Hey guys!

    I'm releasing the first official alpha v2 release (v2.0.1), which should be fairly usable already (I've been using it myself for a couple of weeks), but is likely to have some bugs and inconveniences :)

    If anyone wants to give it a try (and enjoy the Searchbar and Regex trigger goodies 😎), here are the main takeaways:

    • Documentation is still lacking, I just had the chance to write a migration guide. That should be enough to get started with the new version, but there is a lot more to cover. Feel free to ask here on GitHub or Reddit if you don't understand something :)
    • Packages from the Hub are currently not working. With the great help of @4lch4, we are setting up the CI for the new Hub, which brings several improvements compared to the previous edition. In the meanwhile, you will need to manually copy the YAML files into your configs if you want to install a package. Sorry for the inconvenience :)
    • Passive mode is currently not supported, though regex triggers might cover (and improve!) many of the possible use-cases
    • Some commands, such as espanso detect, are yet to be ported. If you need to create an app-specific config, please see this comment
    • The distribution format has changed for some platforms, please see the instructions for macOS, Windows and Linux. On macOS, Espanso is now a regular App bundle, which should make it much easier to deal with. On Linux, we still have a lot of work to do. For now, we have an AppImage available for X11 systems, with more formats and integrations (AUR, snap, etc) to come. Wayland users will need to compile Espanso from sources right now, I'm going to write a comment in the wayland thread with some instructions soon

    Keep in mind that this is an alpha release, so things are likely to be buggy. Any feedback or bug report will be very helpful, so don't hesitate to let us know if you encounter any problems! :)

    Happy expanding 🚀

    Automatically released by CI

    Source code(tar.gz)
    Source code(zip)
    Espanso-Mac-Intel.zip(6.74 MB)
    Espanso-Mac-Intel.zip.sha256.txt(88 bytes)
    Espanso-Mac-M1.zip(6.41 MB)
    Espanso-Mac-M1.zip.sha256.txt(85 bytes)
    Espanso-Win-Installer-x86_64.exe(5.69 MB)
    Espanso-Win-Installer-x86_64.exe.sha256.txt(134 bytes)
    Espanso-Win-Portable-x86_64.zip(6.03 MB)
    Espanso-Win-Portable-x86_64.zip.sha256.txt(134 bytes)
    Espanso-X11.AppImage(16.25 MB)
    Espanso-X11.AppImage.sha256.txt(87 bytes)
  • v0.7.3(Dec 3, 2020)

    Version 0.7.3 is here, bringing a couple of bug fixes and support for rich text matches!

    Rich Text matches

    Note: this feature is still experimental, so expect a few rough edges. If you encounter any problem, please open an issue :)

    You can now specify Rich text matches on espanso! This allows you to include styled text, images and basically everything that supports HTML clipboard pasting.

    96773832-69e53680-13e5-11eb-9e0b-47b7bc3b287e

    This can be obtained with the following configuration:

      - trigger: ":rich"
        markdown: "This *text* is **very rich**!"
      
      - trigger: ":ric2"
        html: '<p>But <span style="color: #ce181e;"><span style="font-size: x-large;">this</span></span> one is <span style="color: #81d41a;"><span style="font-family: Arial, sans-serif;">even richer</span></span>!</p>'
    

    You can use both markdown and html to define your rich text (under the hoods, espanso converts the markdown field to HTML at startup).

    This feature should work in all applications that support HTML pasting, but expect some rough edges given that it's still experimental!

    If you notice any problem, please open an issue :)

    Other changes

    • Fix a bug that caused white space to appear in the macOS status icon. #480 #474
    • Extensions are now able to stop the expansion process. For example, if you open a form and then exit without submitting, the expansion will not take place. See #475
    • Add option to wait for modifier release before injection. See #470
    • Add support for escaped brackets in form fields. Fix #503
    • Disable argument rendering for matches unless args are present. Fix #465
    • Improve buffer handling when interfacing with the native layer. Fix #431
    • Fix test failing on Linux with Rust 1.48. Thanks to @Scrumplex!
    • Add support for the Mingw64 gcc compiler. Thanks to @mattn!
    • Improve a bug that caused a couple of problems with modulo forms on macOS
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(1.93 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.88 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(8.96 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(5.03 MB)
  • v0.7.2(Sep 24, 2020)

    Version 0.7.2 is here!

    • Improve modulo support on macOS, which should now focus the form automatically without requiring the user to click it. Fix #430
    • Improve modulo support on Windows, fix a bug that prevented the injection on Chrome and other apps. Fix #440
    • Add support for proxies when installing packages. Fix #408
    • Change the status icon on macOS when espanso is disabled #432. Thanks to @pedrorrivero)
    • Some general improvements to modulo itself, mainly a better support for UTF8: https://github.com/federico-terzi/modulo/releases/tag/v0.1.1
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(1.90 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.73 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(7.70 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(4.67 MB)
  • v0.7.0(Aug 22, 2020)

    Version 0.7.0 is here, and brings a few very powerful features!

    Forms

    Note: this feature is still experimental, so expect a few rough edges. If you encounter any problem, please open an issue :)

    One of the most requested features is finally here: forms!

    macform

    This opens up a world of possibilities, such as creating matches with multiple parameters and scripts with arguments.

    Installation

    To avoid bloating espanso with unnecessary dependencies, this feature is extracted as a separate component, modulo.

    Windows and macOS users

    If you are a Windows or macOS user, the latest version of espanso automatically ships with modulo, so you don't have to install anything.

    Linux users

    Due to the great fragmentation in the linux world, I decided to package modulo as an AppImage. In order to use it from espanso, you'll have to complete these steps:

    1. Download the AppImage from the modulo's Releases page.
    2. Copy it in a reasonable directory, such as $HOME/opt
    3. Make it executable with chmod u+x modulo*.AppImage
    4. In order to make it usable from espanso, modulo has to be visible in the PATH as modulo. The easiest way to achieve it is creating a link with:
    sudo ln -s $HOME/opt/modulo*.AppImage /usr/bin/modulo
    

    Simple example

    To try out the new feature, create a new match as follows:

      - trigger: ":form"
        form: "Hey {{name}}, how are you?"
    

    Reload the changes and type ":form". If you did everything correctly, you should see a form appear!

    form

    To submit the value you have 2 alternatives, you can either:

    • Press the CTRL+Enter shortcut
    • Click the "Submit" button

    Explanation

    As you can see from the example, instead of using the usual replace clause, we used form. This is just syntactic sugar to make it easier to use forms, but in the following sections you will learn the complete syntax, necessary if you want to use forms with scripts.

    The only important thing to notice is that where we wanted to put a field in the form, we used the double brakets syntax {{field_name}}.

    Controls

    In the example we've just seen, only a simple text field was used, but modulo supports other controls, such as multiline text fields, choice boxes and list boxes (with more to come in future versions).

    To specify the control type, you have to specify the form_fields param. An example would be:

      - trigger: ":form"
        form: |
          Hey {{name}},
          {{text}}
          {{greet}}
        form_fields:
          text:
            multiline: true
          greet:
            type: choice
            values:
              - First choice
              - Second choice
    

    Which produces this result:

    exampleform

    Some of you might be confused with the | char. That is used to specify a multiline string in YAML

    In this example we can see:

    • The text field is now a multiline text field
    • The greet field is a Choice box

    Improvements in the variable system

    Before diving into the next section, it might be useful to explain some of the variable system improvements that were introduced to support forms in the first place.

    Starting from version 0.7.0, most variables can now use the value of other (previously declared) variables in their body.

    Not all variable types support variable injection, but notably Shell and Script extensions do through the use of ad-hoc environment variables. Take the following example:

    Let's say we want to reverse the string produced by the Date Extension:

    - trigger: ":reversed"
      replace: "Reversed {{myshell}}"
      vars:
        - name: mytime
          type: date
          params:
            format: "%H:%M"
        - name: myshell
          type: shell
          params:
            cmd: "echo $ESPANSO_MYTIME | rev"
    

    This match produces the result we expected. If the current time was 11:54, it produces:

    Reversed 45:11
    

    Let's analyze it step by step:

    1. Variable mytime is evaluated first (as it's the first declared in the vars list).
    2. It's output is injected in the myshell shell command, in particular through the $ESPANSO_MYTIME env variable.
    3. The result is piped through the unix rev command
    4. Finally the output is included in the replace text and expanded.

    As you might have already guessed, the previous variables are injected in the Shell variable (and the Script extension works in the same way) with the naming ESPANSO_UPPERCASE-VAR-NAME.

    Make sure to avoid spaces in the variable names, as they can become problematic in this situation

    If you are using global variables, you have to be careful in this case, as they are implicitly evaluated before the local ones.

    If you need to evaluate a global variable after a local one (which might be necessary if you want to inject another variable value inside it), you can do so as follows:

    # Considering the following global variable
    global_vars:
      - name: "reversed"
        type: shell
        params:
          cmd: "echo $ESPANSO_VARNAME | rev"
    
    matches:
      - trigger: ":rev"
        replace: "{{reversed}}"
        vars:
          - name: "varname"
            type: echo
            params:
              echo: "hello"
          - name: "reversed"
            type: "global"
    

    The key element here is the global type, which tells espanso to evaluate variable reversed only at that point, and not before varname.

    Using forms with the Script and Shell extension

    Hopefully, you now understand how variable values are injected between one another. Turns out, forms are variables as well!

    In fact, our first example:

      - trigger: ":form"
        form: "Hey {{name}}, how are you?"
    

    is a shorthand for the following match:

      - trigger: ":form"
        replace: "Hey {{form1.name}}, how are you?"
        vars:
          - name: "form1"
            type: form
            params:
              layout: "Hey {{name}}, how are you?"
    

    What this does is simply generating a form with the given layout, and then injecting the resulting fields (form1.name) into the replacement text.

    All right, but how can we use forms with the shell extension?

    Let's say that we want to create a match that prompts for user input, and then expands to the reverse of what the user inserted. That could be implemented with:

      - trigger: ":rev"
        replace: "{{reversed}}"
        vars:
        - name: form1
          type: form
          params:
            layout: |
              Reverse {{name}}
        - name: reversed
          type: shell
          params:
           cmd: "echo $ESPANSO_FORM1_NAME | rev"
    

    The key aspect here is that the value of the form field is injected in the shell variable as ESPANSO_FORM1_NAME. The naming is pretty straightforward, as the form variable is called form1 and the field is called name.

    macOS remarks

    For the expansion to take place on macOS, you have to release the submit keys (CTRL+Enter) after submitting the form.

    Backspace Undo

    Another highly requested feature was backspace-to-undo:

    If you press backspace immediately after an expansion takes place, the expansion is reversed:

    backspace

    If for some reason you need to backspace without reverting the expansion, press SHIFT+BACKSPACE instead.

    You can disable it with:

    undo_backspace: false
    

    Please note that this feature is experimental, so if you notice any problem please open an issue!

    Other changes

    • Avoid showing the Console/Powershell window on Windows when using the Shell extension. Fix #249
    • Add offset parameter to Date extension to express dates before/after the current one. See #311
    • The Windows icon now turns red when espanso is disabled. #293
    • Added a debug option to shell commands to understand what is going on under the hoods. Thanks to @deckarep #355
    • General improvements to the Passive Mode. Thanks to @AndydeCleyre See #372
    • Avoid reloading configuration if triggered by hidden files. Fix #393
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(1.90 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.74 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(7.67 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(4.68 MB)
  • v0.6.3(Jun 29, 2020)

    Version 0.6.3 is here, and brings a series of bug fixes and a new feature!

    New CLI options

    You can now list all the registered matches with the command:

    espanso match list
    

    And trigger an expansion from the CLI with the command:

    espanso match exec <trigger>
    

    This is particularly useful when integrating with tools like Rofi. See example

    Note: there are still a few rough edges in this feature, so if you notice any bug please open an issue!

    Bug Fixes

    • Add CI pipeline check to verify the presence of all required DLLs on Windows. Fix #336
    • Change WSL shell on Windows to call bash instead of wsl command.
    • Remove trailing .git suffix when installing packages from custom repositories. Fix #326
    • Prevent espanso from crashing when X11 exception occurs. Fix #312
    • Add alternative paste shortcut (Ctrl+Shift+V) on Windows. Fix #333
    • Refactor modifier handling on Windows to respond to keyup events instead of keydown. Fix #328
    • Use named pipes instead of localhost socket on Windows for IPC communication with the daemon. Fix #340
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(1.87 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.73 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(7.63 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(3.44 MB)
  • v0.6.2(Jun 10, 2020)

    Version 0.6.2 is here! Nothing too special, just some bug fixes ¯\(ツ)

    Turn on auto_restart by default

    In this version, the auto-restart on config changes is turned on by default. If you don't like this approach, you can disable it by adding this line to your default.yml file:

    auto_restart: false
    

    Minor changes

    • Fix #306 that prevented ALT key from working correctly on Windows.
    • Add trim option to ScriptExtension #295 (which is turned on by default).
    • Propagate termination signals from daemon to worker. Fix #302
    • Fix secure-input app name extraction process on macOS. Fix #291
    • Inject user PATH on macOS plist when user register espanso. Fix #233
    • Release Shift key if pressed when an expansion occurs. Fix #279
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(1.86 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.66 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(7.53 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(3.03 MB)
  • v0.6.1(May 29, 2020)

    Version 0.6.1 is here, bringing mostly bug fixes and minor features:

    • Fixed a bug #284 that prevented espanso from starting correctly on Linux.
    • Now user matches have an higher priority than packages, so that you can redefine a trigger defined in a package. #273
    • trim option in Shell Extension is now set to true by default. #272
    • Now both the Script Extension and Shell Extension inject a CONFIG env variable to the spawned process with the path of the config directory, making it easier to write cross-machine scripts. #277
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(1.85 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.64 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(7.46 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(3.41 MB)
  • v0.6.0(May 10, 2020)

    Version 0.6.0 is here, bringing a couple of new features and a many improvements!

    Config Auto-reload

    This feature, requested many times before, allows espanso to "listen" for changes in the configuration files and automatically restart itself when needed, making frequent changes much more convenient!

    To try this new feature, enable it in your default.yml file with:

    auto_restart: true
    

    And then restart espanso!

    There are times in which a full restart is still beneficial, such as after installing a package, to make sure espanso picks up all new changes.

    If you notice any strange behavior or bug, don't hesitate to open an issue.

    Install packages from repositories outside the Hub

    Requested by many users in #55, espanso now allows to install packages from GitHub repositories outside the espanso hub.

    The command to use has the following format:

    espanso install <package_name> <repo_url> --external
    

    Those repositories must comply with the format specified in the package-example.

    Add support for Powershell and WSL on Windows

    The Shell Extension now allows the user to select the preferred shell, which is particularly beneficial on Windows. In particular, this new version also allows to execute a shell command on WSL, harnessing the full power of Linux shell on Windows!

    Example of usage:

      - trigger: ":shell"
        replace: "{{output}}"
        vars:
          - name: output
            type: shell
            params:
              cmd: "echo hello from linux!"
              shell: "wsl"
    

    The shell parameter can be either: cmd, powershell or wsl on Windows.

    Note: now the default shell on Windows is Powershell.

    Minor changes

    • Mitigate bug related to word matches. See #252
    • Default shell on Windows changed to Powershell (instead of CMD).
    • Add option to slow down backspacing and injection on Windows and Linux, which is beneficial for some applications (such as Firefox). See #248 #246
    • Fast inject is now enabled by default on Linux.
    • Fix a bug that caused global variables to being evaluated even though they where not needed. #270
    • Improved the espanso edit subcommand to accept EDITOR with parameters. Fix #245
    • Improve the Script Extension to automatically expand %HOME% to the user home directory in paths, making it possibile to define cross-platform script paths. Fix #265
    • Improve case propagation to work also with prefix symbols. Fix #244
    • Formatted the whole project using rustfmt, conforming to Rust best practices. Fix #137
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(1.85 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.63 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(7.45 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(3.41 MB)
  • v0.5.5(Apr 18, 2020)

    Version 0.5.5 is here, and brings massive improvements on Linux.

    Fast Inject on Linux

    NOTE: This feature is still experimental, so it must be enabled manually.

    In the last few days I've been working hard to improve the expansion speed on Linux. This version brings an improved text injection mechanism that relies on XSendEvent rather than XTestFakeKeyEvent, which is much faster.

    I've tested it on various distros and applications, and it always worked pretty well. That said, I don't exclude the possibility of some compatibility problems. If you experience any of them, please open an issue.

    This improvement should be particularly noticeable on Gnome distros (such as stock Ubuntu).

    Enabling Fast Injection

    To enable fast injection, just add the following line on your default.yml config:

    fast_inject: true
    

    NOTE: make sure you didn't specify backend: Clipboard, otherwise this setting won't have any effect.

    Acknowledgements

    A special thanks to AutoKey, a great open-source text expander for Linux, from which I took some inspiration for this feature.

    Option to Hide Icon and Notifications

    Originally proposed by @timorunge in #95, now espanso gives the possibility to hide the status icon on Windows and macOS, as well as disabling notifications.

    In particular, you can add the following to your default.yml config:

    show_icon: false            # Disable the status icon
    show_notifications: false   # Disable the notifications
    

    Minor changes

    • The Auto backend is now the default one on Linux.
    • Add the SECURITY.md overview. Fix #182
    • Ignore hidden files when loading configs and make error more explicit. Fix #234
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(1.78 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.50 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(7.22 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(3.39 MB)
  • v0.5.4(Apr 3, 2020)

    Version 0.5.4 is here! Let's see the changes:

    Improved Security for Packages

    To add a layer of security, now most Hub packages have been moved to the core repository. The end user shouldn't experience any difference from the previous version, with the only exception being:

    Some packages (namely the bigger ones that would make the core repository too large) are now considered external, and espanso will block the installation by default, prompting the user to verify the source of the package (the repository).

    In case the user wants to proceed with the installation, a the --external flag could be used:

    espanso install <package> --external
    

    macOS Notification for SecureInput

    On macOS there is a security feature known as SecureInput, which blocks text expanders from detecting input when entering text in sensitive areas, such as password fields (but also other apps, even the Terminal if configured).

    As a result, espanso will not work in those situations, and many users didn't understand this apparently strange behavior.

    To better inform the user, now espanso will trigger a notification (as well as logging it) to warn the user if an app triggers SecureInput.

    If you want to disable the notification, just add the following line in your config file:

    secure_input_notification: false
    

    Removed the Git dependency

    Espanso has removed its git2 dependency, which means macOS users won't have to install openssl anymore, making it much easier to install without Homebrew.

    For more information, see: #218.

    Minor changes

    • Change the context menu entry to display "Exit espanso". Fix #209
    • Remove git2 dependency. Fix #218
    • Add option to force clipboard use on a per-match basis. Fix #217
    • Improve robustness of passive mode with empty selections. Fix #213
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(1.78 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.50 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(7.23 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(3.32 MB)
  • v0.5.3(Mar 17, 2020)

    Version 0.5.3 brings a couple of bugfixes and general improvements:

    • Fix Windows installer missing required vcruntime140_1.dll. Fix #203
    • Add an alternative package provider to install packages, as a small fraction of macOS users had a problem related to GIT. See #164
    • Fix a bug that prevented the espanso context menu from working correctly on Windows.
    • Disable conflict_check by default, as it yield a lot of false positives while not providing much value.
    • Now espanso automatically updates Systemd service file if espanso changes path (such as when updating through snap).
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(2.18 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.97 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(8.07 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(3.74 MB)
  • v0.5.2(Mar 10, 2020)

    Version 0.5.2 is here! It ships various improvements and optimizations, let's see them:

    New Auto backend on Linux

    This feature is still experimental, and thus must be enabled manually. Check the section below for more information

    On Linux systems there was a long standing issue with text injection, which prevented certain apps from correctly handling special characters (such as emojis or accented letters) when injected (for example on Firefox).

    For this reason, espanso initially defaulted on the Clipboard backend on Linux, as it was the most reliable (working in 99% of cases), even though it was less efficient and with a few inconveniences (for example, the previous clipboard content being overwritten).

    Espanso now ships with the Auto backend, which tries to take it a step further, by automatically determining when an injection is possible (only ascii characters in the replacement), and falling back to the Clipboard backend otherwise.

    This new approach should offer substantial benefits to Linux users.

    Enabling the Auto backend

    Add the following line to your default.yml configuration to enable the backend:

    backend: Auto
    

    and restart espanso.

    Please let me know if you experience any problem with this new mode :)

    More specific key options

    Originally proposed by @lkrms in #117, you can now specify a more specific toggle_key option (and the same goes for passive_key). The new options are:

    • LEFT_CTRL
    • RIGHT_CTRL
    • LEFT_ALT
    • RIGHT_ALT
    • LEFT_META
    • RIGHT_META
    • LEFT_SHIFT
    • RIGHT_SHIFT

    All the other options are still valid, for example specifying CTRL is equivalent to accepting both LEFT_CTRL and RIGHT_CTRL.

    Minor changes and bug fixes

    • General improvements to word matches, which up to know were known to be a bit unstable. Fix #127
    • Add support to kitty terminal. Thanks to @miterion for the help! :)
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(2.16 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.92 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(8.03 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(3.71 MB)
  • v0.5.1(Mar 4, 2020)

    Version 0.5.1 is finally here and brings a few interesting features! Let's see them:

    Edit subcommand

    Originally proposed by @GJKrupa in #171 , espanso now ships with the edit subcommand, which makes editing configuration files much more convenient. Let's see how it works:

    If you open a terminal and type:

    espanso edit
    

    the default system editor (Notepad on Windows and Nano on Unix systems) will be spawned, editing the default.yml. Then, after you saved the file and exited the editor, espanso will automatically restart, loading the new changes.

    Customizing the editor

    But wait! Nano? Are you serious?

    I thought about it for a while, and eventually I opted for a newby-friendly approach (what if one of our fellows expanders gets trapped into VIM? :)

    Jokes aside, customizing the editor is super easy, just specify your choice in the EDITOR (or VISUAL) envorionment variables, such as:

    EDITOR=/usr/bin/vim
    

    Editing files in the user directory

    If you invoke espanso edit without further arguments, it will open the default.yml file. But what if you want to edit files in the user/* directory? Luckily, you can simply specify the name as an additional argument (without the extension).

    For example, if you want to edit the user/email.yml file, you can type:

    espanso edit email
    

    ClipboardExtension

    Espanso now allows to include the current clipboard content in a match, which can be useful in many situations.

    For example, let's imagine you want to create the ultimate HTML link shortcut:

      - trigger: ":a"
        replace: "<a href='{{clipboard}}' />$|$</a>"
        vars:
          - name: "clipboard"
            type: "clipboard"
    

    If you now copy a link in the clipboard (for example by selecting and then CTRL+C) and then type :a, you'll see the following replacement appear:

    <a href='YOUR_COPIED_LINK'></a>
    

    Too see the reasons behind this feature, see #192.

    Multi-trigger matches

    Originally proposed by @muhlinux in #144, now espanso allows matches to have multiple triggers, by using the triggers keyword and specifying a list of valid triggers:

      - triggers: [":lol", ":xd"]
        replace: ":laughing:"
    

    Case-propagating matches

    Originally proposed by @muhlinux in #152, espanso now support matches that propagate the casing of the trigger. Just add the propagate_case: true option in a match, such as:

      - trigger: foo
        replace: bar
        propagate_case: true
        word: true
    

    Based on the case style you use in the trigger, espanso will trigger the replacement as:

    foo => bar
    Foo => Bar
    FOO => BAR
    

    Minor changes and bug fixes

    • Now the preserve_clipboard option is enabled by default.
    • Add the possibility to escape double brackets in replacements. Fix #187
    • Change the urxvt terminal paste shortcut. Fix #166
    • Change the Windows installer to avoid VC++ Redist installation (which required Admin rights) by switching to local deployment of DLLs. Fix #189
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(2.15 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.92 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(8.09 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(3.74 MB)
  • v0.5.0(Feb 2, 2020)

    Hey expanders! After a long wait, espanso 0.5.0 has finally been released and brings many new features! Note: it could take me a few days to update the docs.

    New features

    Passive mode

    NOTE: this feature is still in the experimental stage, and must be switched on manually

    Originally proposed by @telmotrooper in #62, passive mode has finally been implemented. This alterative mode allows the user to expand matches after typing them, instead of in realtime.

    The feature works as follows:

    • Type a message containing any number of matches (passive mode matches are more limited, see the Limitations paragraph below)
    • Select the text you want to process (conveniently done with the CTRL+A shortcut)
    • Double press the CTRL key (you can customize this key).

    As a result, espanso will copy the text, process it expanding all the matches, and then paste it back in the field.

    passive

    Why should this be useful though? Many things! Let's see them:

    Arguments

    One of the most requested features has always been match arguments. Due to the realtime nature of espanso, this problem was very difficult to solve in a solid way. The solution is to use passive mode, so that espanso can analyze whole sentences and execute a more complex elaboration.

    argument

    Which can be obtained with the following:

    - trigger: ":greet"
      replace: "Hey $0$, how are you?\nIt's been a while!"
      passive_only: true
    

    The $0$ keyword indicates where the argument should be placed, and you can also pass multiple arguments, so that they becomes $1$, $2$, ecc.

    Notice the passive_only keyword, which makes espanso ignore the match when typing it (otherwise, espanso would expand it right away).

    The really powerful thing is that you can pass these arguments to the shell or custom scripts as well:

    Integration with Shell

    argumentshell

    This can be done by including $0, $1 in the cmd parameter:

    - trigger: ":rev"
      replace: "{{output}}"
      passive_only: true
      vars:
        - name: output
          type: shell
          params:
            cmd: "echo $0 | rev"
            trim: true
    

    For Windows users: instead of $0, you must use %0.

    Integration with Scripts

    Using the inject_args parameter, arguments will be appended to the given list when launching a program. For example:

    - trigger: ":pyscript"
      replace: "{{output}}"
      vars:
        - name: output
          type: script
          params:
            inject_args: true
            args:
              - python
              - /path/to/your/script.py
    

    At this point, if you expand :pyscript/hello/, your script will receive "hello" as the first argument.

    Limitations

    • Passive mode does not work in terminals. Unfortunately, because this feature heavily uses selections and copy/pasting to work, I still haven't figured out a way to reliably make them work in terminals.

    • Matches have to start with a specific character. The default character is :, but that can be customized by changing the passive_match_regex parameter. This constraint has been added to improve the analysis efficiency.

    • Passive matches do not support images.

    Enabling passive mode

    Passive mode is still in its experimental stage, so it must be enabled manually. Add the following lines in the default.yml file:

    enable_passive: true
    passive_key: CTRL
    

    Currently, the passive_key parameter accept the following alternatives: CTRL, ALT, SHIFT and META (Win key on Windows and Linux, CMD on macOS). If you'd like other possibilities, please open an issue.

    More information can be found in the documentation (could take a few days to update).

    Nested matches

    Originally proposed by @timorunge in #110, nested matches allow you to include the output of a match inside another one. For example:

    - trigger: ":one"
      replace: "nested"
    
    - trigger: ":nested"
      replace: "This is a {{output}} match"
      vars:
        - name: output
          type: match
          params:
            trigger: ":one"
    

    At this point, if you type :nested you'll see This is a nested match appear.

    Global variables

    Originally proposed by @simon-wolf in #162, global matches allow the definition of global variables that can be used in all matches. In your default.yml file, you can add:

    global_vars:
      - name: "global1"
        type: "shell"
        params:
          cmd: "echo global var"
      - name: "greet"
        type: "dummy"
        params:
          echo: "Hey"
    

    At this point, you can use global1 and greet in all your matches:

    - trigger: ":hello"
      replace: "{{greet}} Jon"
    

    And typing :hello will result in Hey Jon.

    For Ubuntu/Debian users

    Espanso now ships with a experimental deb package! If you want to try it out, here's how you can migrate:

    Before removing the espanso binary, unregister it from Systemd.

    espanso unregister
    

    Then remove the old binary (if you followed the instructions it is located in /usr/local/bin/espanso).

    At this point, download espanso-debian-amd64.deb and type the following command (making sure you are in the same directory as the deb file):

    sudo apt install ./espanso-debian-amd64.deb
    

    This new approach offers a number of benefits, such as the automatic dependency management and ease of upgrade.

    Conflicting triggers warning

    Suggested by @tiktuk in #135, espanso now warn the user in case there are conflicting triggers, such as :abcd and :ab.

    Bug fixes

    • Added support for Yakuake terminal. Fix #153
    • Added support for Tilix terminal. Fix #143
    • Added delay to fix possibile race condition when using preserve_clipboard. Fix #148
    • Fix bug that prevented certain applications, such as Photoshop, from working correctly with espanso on macOS. Fix #159
    Source code(tar.gz)
    Source code(zip)
    espanso-debian-amd64-sha256.txt(91 bytes)
    espanso-debian-amd64.deb(2.14 MB)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.91 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(8.00 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(16.04 MB)
  • v0.4.1(Dec 16, 2019)

    Hello fellow expanders! Version 0.4.1 brings some interesting new features, as well as many bug fixes.

    New features

    Experimental: preserve clipboard

    Espanso now supports a way to partially preserve your previous clipboard when expanding a match instead of overwriting it. At the moment, it only preserve text-based clipboards, so if you had pasted an image, espanso will overwrite it even with this option enabled.

    Because this is still experimental, you will need to enable it manually by adding the following line in your default.yml config:

    preserve_clipboard: true
    

    In the next release, unless any problems arise, the feature will be turned on by default.

    A great thank you to @matt-h, who laid the foundations of this new feature.

    Random Extension

    You how have the possibility to write non-deterministic replacement texts. Said in other words, you can now specify a set of possible expansions for a match, useful to avoid repetitions.

    This feature works as any other extension. You declare a variable of type random and then pass a number of choices as a parameter:

      - trigger: ":quote"
        replace: "{{output}}"
        vars:
          - name: output
            type: random
            params:
              choices:
                - "Every moment is a fresh beginning."
                - "Everything you can imagine is real."
                - "Whatever you do, do it well."
    

    In this case, typing :quote will expand randomly to one of the tree quotes.

    Minor changes

    • You can now specify the trim: true parameter in a shell extension to trim the output from any space/newline character. For example:
      - trigger: ":shell"
        replace: "{{output}}"
        vars:
          - name: output
            type: shell
            params:
              cmd: "echo Hello from your shell"
              trim: true
    
    • Added a warning if Systemd is not available on Linux and switching automatically to unmanaged mode. Fix #139 #134
    • Improved support for Simple Terminal. Fix #112
    • Improved support for Emacs editor. Fix #122
    Source code(tar.gz)
    Source code(zip)
    espanso-linux-sha256.txt(65 bytes)
    espanso-linux.tar.gz(3.96 MB)
    espanso-mac-sha256.txt(64 bytes)
    espanso-mac.tar.gz(7.99 MB)
    espanso-win-installer-sha256.txt(64 bytes)
    espanso-win-installer.exe(16.04 MB)
Owner
Federico Terzi
Engineering Student and Developer. Creator of espanso
Federico Terzi
Cross-platform, cross-browser, cross-search-engine duckduckgo-like bangs

localbang Cross-platform, cross-browser, cross-search-engine duckduckgo-like bangs What are "bangs"?? Bangs are a way to define where to search inside

Jakob Kruse 7 Nov 23, 2022
An opinionated, monolithic template for Bevy with cross-platform CI/CD, native + WASM launchers, and managed cross-platform deployment.

??️ Bevy Shell - Template An opinionated, monolithic template for Bevy with cross-platform CI/CD, native + WASM launchers, and managed cross-platform

Kurbos 218 Dec 30, 2022
WriteForAll is a text file style checker, that compares text documents with editorial tips to make text better.

WriteForAll: tips to make text better WriteForAll is a text file style checker, that compares text documents with editorial tips to make text better.

Joel Parker Henderson 2 Dec 27, 2022
Swash is a pure Rust, cross-platform crate that provides font introspection, complex text shaping and glyph rendering.

Swash is a pure Rust, cross-platform crate that provides font introspection, complex text shaping and glyph rendering. Goals This crate aims to

Chad Brokaw 398 Dec 14, 2022
A cross platform minimalistic text user interface

titik Titik is a crossplatform TUI widget library with the goal of being able to interact intuitively on these widgets. It uses crossterm as the under

Jovansonlee Cesar 113 Dec 31, 2022
ReVi is a cross-platform terminal based Vim inspired text editor.

ReVi Table Of Contents: About Usage Install Clone && Installing Development Q&A KeyBindings Roadmap Changelog About ReVi is a cross-platform terminal

null 31 Sep 21, 2022
Simple macros to write colored and formatted text to a terminal. Based on `termcolor`, thus also cross-platform.

Bunt: simple macro-based terminal colors and styles bunt offers macros to easily print colored and formatted text to a terminal. It is just a convenie

Lukas Kalbertodt 202 Dec 22, 2022
Fusion is a cross-platform App Dev ToolKit build on Rust . Fusion lets you create Beautiful and Fast apps for mobile and desktop platform.

Fusion is a cross-platform App Dev ToolKit build on Rust . Fusion lets you create Beautiful and Fast apps for mobile and desktop platform.

Fusion 1 Oct 19, 2021
Dip editor: Multi-platform Text editor purely written in Rust

dip editor Multi-platform Text editor purely written in Rust, supercharged by Bevy game engine and Dioxus UI framework. heavily in development Why Gam

Junichi Sugiura 270 Jan 4, 2023
Text Expression Runner – Readable and easy to use text expressions

ter - Text Expression Runner ter is a cli to run text expressions and perform basic text operations such as filtering, ignoring and replacing on the c

Maximilian Schulke 72 Jul 31, 2022
An implementation of Piet's text interface using cosmic-text

piet-cosmic-text Implements piet's Text interface using the cosmic-text crate. License piet-cosmic-text is free software: you can redistribute it and/

John Nunley 7 Mar 12, 2023
A GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust

Wez's Terminal A GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust User facing docs and guide a

Wez Furlong 6.7k Jan 2, 2023
An impish, cross-platform binary parsing crate, written in Rust

libgoblin Documentation https://docs.rs/goblin/ changelog Usage Goblin requires rustc 1.40.0. Add to your Cargo.toml [dependencies] goblin = "0.3" Fea

null 892 Dec 29, 2022
A cross-platform terminal database tool written in Rust

gobang is currently in alpha A cross-platform terminal database tool written in Rust Features Cross-platform support (macOS, Windows, Linux) Mu

Takayuki Maeda 2.1k Jan 5, 2023
An impish, cross-platform binary parsing crate, written in Rust

libgoblin Documentation https://docs.rs/goblin/ changelog Usage Goblin requires rustc 1.40.0. Add to your Cargo.toml [dependencies] goblin = "0.4" Fea

null 892 Dec 22, 2022
gobang - A cross-platform TUI database management tool written in Rust

gobang - A cross-platform TUI database management tool written in Rust

Takayuki Maeda 2.1k Jan 1, 2023
A rewrite of Phonelink for Windows Forms written in Rust, with cross-platform support.

phonelink-rs A rewrite of Phonelink for Windows Forms written in Rust, with cross-platform support. Usage Clone the repository and build, or download

ahsan-a 4 Aug 6, 2022
Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery life of your device.

Universal Android Debloater GUI DISCLAIMER: Use it at your own risk. I am not responsible for anything that could happen to your phone. This software

w1nst0n 7k Jan 7, 2023
A little cross-platform graphics engine written in rust.

Bismuth This is a version of my C++ graphics engine named Bismuth re-written with Rust. My goal is to learn more about the Rust language and make my g

Admiral サイタマ 1 Nov 1, 2021
Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices

Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery life of your device.

w1nst0n 6.8k Jan 2, 2023