From 1dca22662c273539f06069ca3e1b02cd2c6e240b Mon Sep 17 00:00:00 2001 From: Federico Terzi Date: Sun, 23 Aug 2020 17:11:54 +0200 Subject: [PATCH] Update the docs --- _data/docs.yml | 8 +- assets/images/form1.png | Bin 0 -> 4457 bytes assets/images/form2.png | Bin 0 -> 6171 bytes assets/images/form3.png | Bin 0 -> 3354 bytes assets/images/form4.png | Bin 0 -> 4260 bytes assets/images/macform.png | Bin 0 -> 43753 bytes docs/cli.md | 44 ++++++++ docs/configuration.md | 51 +++++++-- docs/forms.md | 212 ++++++++++++++++++++++++++++++++++++++ docs/get-started.md | 83 ++++++--------- docs/matches.md | 173 +++++++++++++++++++++++++++++-- docs/packages.md | 10 +- install/linux.md | 33 ++++-- install/mac.md | 2 + 14 files changed, 530 insertions(+), 86 deletions(-) create mode 100644 assets/images/form1.png create mode 100644 assets/images/form2.png create mode 100644 assets/images/form3.png create mode 100644 assets/images/form4.png create mode 100644 assets/images/macform.png create mode 100644 docs/cli.md create mode 100644 docs/forms.md diff --git a/_data/docs.yml b/_data/docs.yml index fd0c10d..e79e068 100644 --- a/_data/docs.yml +++ b/_data/docs.yml @@ -7,6 +7,9 @@ - name: Matches link: /docs/matches/ desc: This sections will cover Matches in detail, showing their features and options. +- name: Forms + link: /docs/forms/ + desc: An introduction to Forms, a powerful feature to create customizable prompts. - name: Packages link: /docs/packages/ desc: This section will cover the basics and the creation of espanso packages. @@ -18,4 +21,7 @@ desc: An introduction to espanso's Passive Mode, one of its most powerful features. - name: Synchronization link: /docs/sync/ - desc: Keep espanso in sync using Dropbox, Google Drive or GitHub. \ No newline at end of file + desc: Keep espanso in sync using Dropbox, Google Drive or GitHub. +- name: CLI + link: /docs/cli/ + desc: Some useful terminal commands to interact with espanso. \ No newline at end of file diff --git a/assets/images/form1.png b/assets/images/form1.png new file mode 100644 index 0000000000000000000000000000000000000000..89ecc93a3f0afec6aedaeb7d3ca5e63e89bb8627 GIT binary patch literal 4457 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 GLjDC}#-XkN literal 0 HcmV?d00001 diff --git a/assets/images/form2.png b/assets/images/form2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed9ce38809beb136364b7e8d54a7a5eb37f990e GIT binary patch literal 6171 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 literal 0 HcmV?d00001 diff --git a/assets/images/form3.png b/assets/images/form3.png new file mode 100644 index 0000000000000000000000000000000000000000..e2da0d76fdf059da3feb9812b0ddac788b838423 GIT binary patch literal 3354 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 literal 0 HcmV?d00001 diff --git a/assets/images/form4.png b/assets/images/form4.png new file mode 100644 index 0000000000000000000000000000000000000000..454224592a670f7435bb148ec5de892389c56905 GIT binary patch literal 4260 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 HdFcND3YJy* literal 0 HcmV?d00001 diff --git a/assets/images/macform.png b/assets/images/macform.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8f3f3043b283c774a6271415ee75e1c874ded4 GIT binary patch literal 43753 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 +``` + +where `` is the match trigger. + +This is useful if, for example, you want to trigger an expansion from a script. \ No newline at end of file diff --git a/docs/configuration.md b/docs/configuration.md index 521daff..fc19e77 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -32,15 +32,6 @@ you will be working with. You can find a list of all the possible options in the The `user` folder is used to store more advanced user configurations, such as [Application-specific](#application-specific-configurations) configs. -#### Migrating from versions prior to v0.3.0 - -Prior to version v0.3.0, espanso located all configurations in the user home directory, into the `.espanso` folder. -This location is now deprecated and, while being still supported for compatibility purposes, you should migrate to the new one with the following steps: - -* Copy the `default.yml` and the `user/` directory in the new `espanso` config folder ( you can find the new config location with the `espanso path` command ). -* Copy the contents of the `packages` folder into the new `packages` path ( you can find the new package -location with the `espanso path` command ). - ### Quick Editing Introduced in version 0.5.1, espanso now ships with the `edit` subcommand, which makes editing configuration files much more convenient. Let's see how it works: @@ -141,7 +132,7 @@ Filter | Description | Windows Support | MacOS Support | Linux Support `filter_exec` | Filter based on the current application executable path | Full support | Full support | Partial support `filter_class` | Filter based on the current Window class | Uses the application executable path instead | Uses the App identifier instead | Full support -The `filter_title`, `filter_exec` and `filter_class` filters support a full **regex** as parameter. +The `filter_title`, `filter_exec` and `filter_class` filters support a full **regex** as parameter, but make sure to escape the special characters properly. #### Finding the right filters @@ -164,6 +155,45 @@ Detected change, current window has properties: These are the parameters espanso detected for your target application, so you can now use them to create the perfect filter. +### Customizing the Toggle Key + +By default, espanso can be temporarily disabled and enabled by pressing the Alt key twice, resulting in a +notification saying "espanso disabled." Pressing Alt twice again will enable it, and you'll receive a +notification saying "espanso enabled." + +If you'd like to customize the key, simply add the `toggle_key` option to your +`default.yml` configuration and set it to one of the available options: + +| | | | | +|--------------|-------------|---------------|--------------| +| `CTRL` | `ALT` | `SHIFT` | `META` | +| `LEFT_CTRL` | `LEFT_ALT` | `LEFT_SHIFT` | `LEFT_META` | +| `RIGHT_CTRL` | `RIGHT_ALT` | `RIGHT_SHIFT` | `RIGHT_META` | + +And if you'd rather turn it off, you can do so with: + +```yml +toggle_key: OFF +``` + +### Hiding the Icon + +You can hide the espanso icon on macOS and Windows by adding the following option to your `default.yml` file: + +```yaml +show_icon: false +``` + +### Hiding the Notifications + +You can hide the espanso notifications by adding the following option to your `default.yml` config: + +```yaml +show_notifications: false +``` + +**Note for macOS users:** if you only want to hide the *SecureInput* notifications, please read the following section.1 + ### 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). @@ -191,5 +221,6 @@ Option | Description | Possible Values | Default | App-Specific `secure_input_notification` | Enable/Disable the Secure Input notification on macOS | `true`/`false` | `true` | No `show_icon` | Show/Hide the icon in the status bar on macOS and Windows | `true`/`false` | `true` | No `show_notifications` | Show/Hide the notifications| `true`/`false` | `true` | No +`undo_backspace` | Enable/Disable the Backspace-To-Undo feature | `true`/`false` | `true`| Yes `fast_inject` | Use a faster injection mechanism (Linux only). It uses XSendEvent API rather than XTestFakeKeyEvent API, which is faster but incompatible with some applications.| `true`/`false` | `true`| Yes diff --git a/docs/forms.md b/docs/forms.md new file mode 100644 index 0000000..04b274e --- /dev/null +++ b/docs/forms.md @@ -0,0 +1,212 @@ +--- +title: Forms +layout: docs +--- + +Since version 0.7.0, espanso is capable of creating arbirarly complex input forms: + +![Espanso Form](/assets/images/macform.png) + +These open up a world of possibilities, allowing the user to create matches with many arguments, as well as injecting those values into custom Scripts or Shell commands. + +### Prerequisites + +In order to use forms, espanso requires [modulo](https://github.com/federico-terzi/modulo) to be installed. +If you are a Windows or macOS user, then modulo is most likely already installed with recent versions of espanso, but if you are using Linux, you'll need to [install it manually](/install/linux/#installing-modulo). + +### Getting started + +Let's say you want to create a match for birthday greetings, personalized with the person name. With forms, that would translate to: + +{% raw %} +```yaml + - trigger: ":greet" + form: | + Hey {{name}}, + Happy Birthday! +``` +{% endraw %} + +Then, after typing `:greet`, you will be prompted with: + +![Form example](/assets/images/form1.png) + +After entering the desired name, we can submit the form either by clicking "Submit" or pressing CTRL+Enter. + +The key here is to specify the `form` field rather than `replace`, which is a shorthand for the verbose syntax explained in the following sections. + +{% raw %} +You can create as many fields as you like, just indicate them with the double-brackets `{{field_name}}` syntax. +{% endraw %} + +### Controls + +In the previous example, we've seen how to use simple text fields, but `modulo` supports many controls, such as: + +* Multiline text field +* Choice box +* List box + +In order to use another control, we need to specify it in the `form_fields` parameter. Let's say we want to add a multiline text field to our previous example to write our custom message inside the greetings: + +{% raw %} +```yaml + - trigger: ":greet" + form: | + Hey {{name}}, + {{text}} + Happy Birthday! + form_fields: + text: + multiline: true +``` +{% endraw %} + +After saving and triggering the match, we would be prompted with a form like the following: + +![Form example](/assets/images/form2.png) + +Let's analyze the most important bits: + +{% raw %} +1. Inside the `form` parameter we specified the `{{text}}` field. This name is arbitrary, you can put whatever you want there. +2. In the `form_fields` parameter, we specified that the `text` field had property `multiline: true` +{% endraw %} + +Each control has its own options, so let's see them separately: + +#### Text Fields + +{% raw %} +Text Fields are the default control. Anytime you specify a new field using the `{{field_name}}` syntax, that field is considered a text field, if not specified otherwise. + +| Property | Description | Default value | +| ---------|-------------|---------------| +| multiline | If `true`, the text field becomes a multiline text area | `false` | +| default | Specify the default value of the field | `null` | + +{% endraw %} + +#### Choice Box + +Choice boxes are fields in which the user can select one choice in a list. In order to use it, you have to specify the `type: choice` parameter, along with an array of `values`: + +{% raw %} +```yaml + - trigger: ":form" + form: | + {{choices}} + form_fields: + choices: + type: choice + values: + - First choice + - Second choice +``` +{% endraw %} + +Which produces: + +![Form example](/assets/images/form3.png) + +| Property | Description | Default value | +| ---------|-------------|---------------| +| default | Specify the default value of the field | `null` | + +#### List Box + +List boxes are completely equivalent to Choice Boxes, with the only difference of requiring `type: list` rather than `type: choice`. + +{% raw %} +```yaml + - trigger: ":form" + form: | + {{choices}} + form_fields: + choices: + type: list + values: + - First choice + - Second choice +``` +{% endraw %} + +Which produces: + +![Form example](/assets/images/form4.png) + +### Using with Script and Shell extension + +The syntax proposed above works for most cases, but there are times in which you might want to harness the full power of espanso forms, for example using them with the Script and Shell extension. + +The first important thing to understand is that the following syntax: + +{% raw %} +```yaml + - trigger: ":form" + form: "Hey {{name}}, how are you?" +``` + +is a shorthand of the following match: + +```yaml + - 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. It should be clear now that **forms are extensions themselves**, just like the Date and Script extension. + +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: + +```yaml + - 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`. + +To understand more about the variable injection mechanism, please read the [Advanced Topics](/docs/matches/#advanced-topics) section. +{% endraw %} + +#### Controls with the Verbose syntax + +If you want to use other Controls in a form specified using the above (verbose) syntax, you would have to specify the `fields` parameter: + +{% raw %} +```yaml + - trigger: ":form" + replace: "Hey {{form1.name}}, how are you?" + vars: + - name: "form1" + type: form + params: + layout: "Hey {{name}}, how are you?" + fields: + name: + multiline: true +``` +{% endraw %} + +Note that **the `fields` parameter content is specified as the `form_fields` parameter explaned above**. + +### macOS remarks + +For the expansion to take place on macOS, you have to release the submit keys (CTRL+Enter) after submitting the form. \ No newline at end of file diff --git a/docs/get-started.md b/docs/get-started.md index 8e7b48a..dfeb099 100644 --- a/docs/get-started.md +++ b/docs/get-started.md @@ -7,9 +7,9 @@ Make sure to [install espanso](/install) before diving into the next sections. ### Starting espanso -If you followed the [Windows](/install/win/) or [MacOS](/install/mac/) installation correctly, +If you followed the installation correctly, **espanso will be automatically started** when you power up your computer. There are times, -however, when you may need to start espanso explicitly, such as when you're using Linux. +however, when you may need to start espanso explicitly. It's very easy to check if espanso is currently running: if you're using **MacOS** or **Windows**, you should see the **icon in the status bar**. If you don't see it, or if you're using **Linux**, @@ -55,14 +55,14 @@ reside in the `espanso` directory, whose location depends on the current OS: * macOS: `$HOME/Library/Preferences/espanso` (e.g. `/Users/user/Library/Preferences/espanso`) * Windows: `{FOLDERID_RoamingAppData}\espanso` (e.g. `C:\Users\user\AppData\Roaming\espanso`) -> By default, configuration folder is hidden in most systems. To open it, copy path of your configuration folder and paste it in the address bar (aka path bar) of your file manager/explorer. - A quick way to find the path of your configuration folder is by using the following command: ```bash espanso path ``` +> By default, configuration folder is hidden in most systems. To open it, copy path of your configuration folder and paste it in the address bar (aka path bar) of your file manager/explorer. + While this folder may contain many different files, let's focus on the most important one: `default.yml`. The `default.yml` file contain the **main espanso configuration** and uses the widely @@ -133,7 +133,7 @@ matches: ... ``` -We're almost there! After every configuration change, **espanso must be restarted**. Open a terminal and type: +We're almost there! After every configuration change, **espanso must be restarted**. Recent versions **automatically restart when a file change is detected**, but if you disabled that option, you'll need to do so manually by opening a terminal and typing: ```bash espanso restart @@ -141,12 +141,21 @@ espanso restart Now try to type `:br` anywhere. If you did everything correctly, you should see `Best Regards` appear! -> In version 0.5.1, espanso introduced the `edit` subcommand which makes editing configuration files much easier. -Take a look at [Quick Editing](/docs/configuration/#quick-editing) if you are interested. +#### Quick Editing + +If you are comfortable using the terminal to edit your configs, you can also use the much quicker: + +``` +espanso edit +``` + +command in the terminal, which spawns an instance of the system-default text editor and automatically restarts espanso on exit. + +By default it uses Nano on Unix and Notepad on Windows, but you can customize it as you like. Take a look at [Quick Editing](/docs/configuration/#quick-editing) for more information. ### Understanding Packages -Custom matches are amazing, but sometimes it can be tedious to define Matches for every **common operation**, +Custom matches are amazing, but sometimes it can be tedious to define Matches for every common operation, and even more when you want to **share them with other people**. espanso offers an easy way to **share and reuse matches** with other people, **packages**. In fact, @@ -178,63 +187,29 @@ If you now type `:ook` into any text field, you should see 👍👍👍👍 appe ### Useful shortcuts -Let's conclude this introduction with the most important shortcut espanso offers, the **toggle shortcut**: +Let's conclude this introduction with the most important shortcuts espanso offers, the **toggle shortcut** and the **backspace undo**. + +#### Toggle Key There are times when you may want to **disable espanso to avoid an unwanted expansion**. This can be easily accomplished by quickly **double pressing the `ALT` key** ( Option on MacOS ). You should then see a notification showing "Espanso disabled". -At this point, espanso will be disabled and will not expand any match. +At this point, espanso will be disabled and will not expand any match. To **re-enable** it, double press the `ALT` key again. -To **re-enable** it, double press the `ALT` key again. +**You can disable or change the toggle key**. Take a look at [Customizing the Toggle Key](/docs/configuration/#customizing-the-toggle-key) -#### Customizing the Toggle Key +#### Backspace Undo -By default, espanso can be temporarily disabled & enabled by pressing the Alt key twice, resulting in a -notification saying "espanso disabled." Pressing Alt twice again will enable it, and you'll receive a -notification saying "espanso enabled." This does not turn off espanso, it simply disables it until -you enable it again. +> This feature was introduced in version 0.7.0, so make sure to have an up-to-date version. -If you'd like to customize this behavior, simply add the `toggle_key` option to your previously mentioned -`default.yml` and set it to `OFF` or one of the available options: +It might happen to accidentally trigger an expansion, even though that was not intended. If you immediately press the `BACKSPACE` key after the expansion, the action is reverted and the trigger recovered. -| | | | | -|--------------|-------------|---------------|--------------| -| `CTRL` | `ALT` | `SHIFT` | `META` | -| `LEFT_CTRL` | `LEFT_ALT` | `LEFT_SHIFT` | `LEFT_META` | -| `RIGHT_CTRL` | `RIGHT_ALT` | `RIGHT_SHIFT` | `RIGHT_META` | +You can also disable this behavior by adding the following line on your `default.yml` file: - -Using the above example `default.yml`, if I wanted to make it so espanso is disabled/enabled when I press -the left control key twice, I add `toggle_key: LEFT_CTRL` to the file like so, and then, pressing -the left control key twice disables/enables espanso. - -```yml -# espanso configuration file - -# This is the default configuration file, change it as you like it -# You can refer to the official documentation: -# https://espanso.org/docs/ -toggle_key: LEFT_CTRL - -# Matches are the substitution rules, when you type the "trigger" string -# it gets replaced by the "replace" string. -matches: - # Simple text replacement - - trigger: ":espanso" - replace: "Hi there!" - - - trigger: ":br" - replace: "Best Regards,\nJon Snow" - -... +```yaml +undo_backspace: false ``` -And if you'd rather it not be possible to disable it on accident, just turn it off like so: - -```yml -toggle_key: OFF -``` - -After the changes are made, if you used `espanso edit` it will automatically restart. If not, issue a `espanso restart` and you'll be ready to go! +> Note that backspace undo is not available for every match, namely the ones that specify a [Cursor Hint](/docs/matches/#cursor-hints) \ No newline at end of file diff --git a/docs/matches.md b/docs/matches.md index 7575ca6..1318972 100644 --- a/docs/matches.md +++ b/docs/matches.md @@ -48,8 +48,6 @@ There are a number of characters that are special (or reserved) and cannot be us These kind of expansions are simple text replacements and are *static*. -> Special thanks to [@muhlinux](https://github.com/muhlinux) for the help with this section. - ### Dynamic Matches Static matches are suitable for many tasks, but can be problematic when we need an **expansion that changes dynamically**. For those situations, espanso introduces the concepts of **variables** and **extensions**. @@ -138,10 +136,12 @@ global_vars: At this point, you can use `global1` and `greet` in all your matches: +{% raw %} ```yaml - trigger: ":hello" replace: "{{greet}} Jon" ``` +{% endraw %} And typing `:hello` will result in `Hey Jon`. @@ -173,7 +173,7 @@ If you now type `:div`, you get the `
` expansion, with the cursor bet #### Things to keep in mind -* You can only define **one cursor hint** per match. Multiple hints will be ignored. +* You can only define **one cursor hint** per match. Multiple hints will be ignored. If you need multiple hints, a decent replacement would be to use [Forms](/docs/forms/) * This feature should be used with care in **multiline** expansions, as it may yield **unexpected results** when using it in code editors that support **auto indenting**. This is due to the way the feature is implemented: espanso simulates a series of `left arrow` @@ -314,6 +314,16 @@ Introduced in version 0.5.0, *nested matches* allow to include the output of a m At this point, if you type `:nested` you'll see `This is a nested match appear`. +### Forms + +Since version 0.7.0, espanso is capable of creating arbirarly complex input forms. + +![Espanso Form](/assets/images/macform.png) + +These open up a world of possibilities, allowing the user to create matches with many arguments, as well as injecting those values into custom Scripts or Shell commands. + +For more informations, visit the [Forms section](/docs/forms/). + ### Script Extension There will be tasks for which espanso was not designed for. For those cases, espanso offers the @@ -350,16 +360,45 @@ If you now try to type `:pyscript` anywhere, you should see `Hello from python` You can do the same thing with any programming language, just change the `args` array accordingly. +#### Script Placement + +The current best-practice when creating Script matches is to create a `scripts` directory in the `espanso` directory and store the scripts there. + +That way, you can use the `%CONFIG%` wildcard to automatically replace the config directory with the correct path, such as: + +{% raw %} +```yaml +- trigger: ":pyscript" + replace: "{{output}}" + vars: + - name: output + type: script + params: + args: + - python + - "%CONFIG%/scripts/script.py" +``` +{% endraw %} + +This makes it easier to create matches that work across many machines. + #### A note on performance Because of the execution time, you should limit yourself to fast-running scripts to avoid any lag. +#### Useful Environment Variables + +When triggering the shell command, espanso also injects a few useful Environment Variables that you can use: + +* `CONFIG`: Points to the path of the espanso config directory +* All the values of the previously evaluated match variables. For more information, look at the [Advanced topics](#advanced-topics) section. + ### Shell Extension The **Shell Extension** is similar to the [Script Extension](#script-extension), but instead of executing a script, it executes **shell commands**. This offers a lot of flexibility on Unix systems thanks to the -`bash` shell. +`bash` shell (and thanks to WSL support also on Windows). Let's say you regularly send your IP address to your coworkers. You can setup a match to fetch your public IP from [ipify](https://www.ipify.org/). @@ -381,15 +420,38 @@ IP from [ipify](https://www.ipify.org/). As always, restart espanso with `espanso restart`. Now everytime you type `:ip`, it gets expanded to your public IP address! -#### For macOS users +#### Choosing the Shell -On macOS the shell extension does not read the `PATH` env variable (because it is managed by `launchd`). Therefore, **you need to specify the full path for the commands you are using**. For example, if you are using `jq`, you should write `/usr/local/bin/jq` instead. +The shell extension supports many different shells out of the box. By default it uses: -This will probably change in the future. +* `Powershell` on Windows +* `bash` on Linux +* `sh` on macOS + +You can also specify different shells by using the `shell` param. For example, let's say we want to use bash on Windows through the `Windows Subsystem for Linux`. We would use: + +{% raw %} +```yml +- trigger: ":ip" + replace: "{{output}}" + vars: + - name: output + type: shell + params: + cmd: "curl 'https://api.ipify.org'" + shell: wsl +``` +{% endraw %} + +Other possible values for the `shell` parameter are: + +* On Windows: `cmd`, `powershell`, `wsl` +* On macOS: `sh`, `bash` +* On Linux: `sh`, `bash` #### Bash pipes -This extension also supports bash **pipes** as your shell, such as: +This extension also supports bash **pipes** as your shell does, such as: {% raw %} ```yml @@ -421,6 +483,36 @@ excess spaces/newlines. You can optionally disable the `trim` option: ``` {% endraw %} +#### Useful Environment Variables + +When triggering the shell command, espanso also injects a few useful Environment Variables that you can use: + +* `CONFIG`: Points to the path of the espanso config directory +* All the values of the previously evaluated match variables. For more information, look at the [Advanced topics](#advanced-topics) section. + +#### Using Linux commands on Windows + +As you might have already understood from previous sections, espanso supports the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) through the `shell: wsl` parameter. This allows Windows users to execute Linux commands from their machine. + +#### Debugging + +Sometimes it's useful to understand what get's executed exactly, what are the return codes and error messages returned by the command. In order to do that, you can use the `debug: true` option: + +{% raw %} +```yml +- trigger: ":localip" + replace: "{{output}}" + vars: + - name: output + type: shell + params: + cmd: "ip a | grep 'inet 192' | awk '{ print $2 }'" + debug: true +``` +{% endraw %} + +At this point, after triggering a match, the logs will be populated with useful information. Too see them, use the `espanso log` command. + ### Date Extension The **Date Extension** can be used to include *date* and *time* information in a match. @@ -486,3 +578,68 @@ see the following replacement appear: ``` ``` + +### Advanced Topics + +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: + +```yaml +- 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: + +```yaml +# 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`. \ No newline at end of file diff --git a/docs/packages.md b/docs/packages.md index d0ddd58..e818539 100644 --- a/docs/packages.md +++ b/docs/packages.md @@ -112,10 +112,6 @@ allowed) #### Publishing on espanso hub After following all these steps, you can request to publish your package to [espanso hub](http://hub.espanso.org) -by opening an [Issue](https://github.com/federico-terzi/espanso-hub/issues) with the following format: -* Title: 'New package - ' -* Body: - * The package **repository** url - * A short description of your package - * List of replacements and optionally, their descriptions - * Requirements/Dependencies, if any +by opening an [Issue](https://github.com/federico-terzi/espanso-hub/issues) with the following information: + +* The repository **url** \ No newline at end of file diff --git a/install/linux.md b/install/linux.md index 5aa6524..39dcb51 100644 --- a/install/linux.md +++ b/install/linux.md @@ -11,7 +11,7 @@ have many problems making it work on others. #### Wayland support -Currently espanso supports X11 systems only. +Currently espanso supports X11 systems only, but future support for Wayland is being investigated. Follow [this issue](https://github.com/federico-terzi/espanso/issues/287) to stay updated. ### Installing on Ubuntu / Debian @@ -41,7 +41,7 @@ If you now type `:espanso` in any text field, you should see "Hi there!" appear! > **Note**: after executing the previous command, espanso will prompt the user to register a Systemd service. This is needed to automatically start espanso at system startup. -At this point, you are ready to read the [Getting Started](/docs/get-started/) tutorial. +At this point, you should [install `modulo`](#installing-modulo) to enable the GUI features. #### Installing using DEB package @@ -71,7 +71,7 @@ If you now type `:espanso` in any text field, you should see "Hi there!" appear! > **Note**: after executing the previous command, espanso will prompt the user to register a Systemd service. This is needed to automatically start espanso at system startup. -At this point, you are ready to read the [Getting Started](/docs/get-started/) tutorial. +At this point, you should [install `modulo`](#installing-modulo) to enable the GUI features. #### Manual installation @@ -109,7 +109,7 @@ If you now type `:espanso` in any text field, you should see "Hi there!" appear! > **Note**: after executing the previous command, espanso will prompt the user to register a Systemd service. This is needed to automatically start espanso at system startup. -At this point, you are ready to read the [Getting Started](/docs/get-started/) tutorial. +At this point, you should [install `modulo`](#installing-modulo) to enable the GUI features. ### Installing on Manjaro / Arch @@ -141,7 +141,7 @@ If you now type `:espanso` in any text field, you should see "Hi there!" appear! > **Note**: after executing the previous command, espanso will prompt the user to register a Systemd service. This is needed to automatically start espanso at system startup. -At this point, you are ready to read the [Getting Started](/docs/get-started/) tutorial. +At this point, you should [install `modulo`](#installing-modulo) to enable the GUI features. #### Installing from the prebuilt release @@ -178,4 +178,25 @@ If you now type `:espanso` in any text field, you should see "Hi there!" appear! > **Note**: after executing the previous command, espanso will prompt the user to register a Systemd service. This is needed to automatically start espanso at system startup. -At this point, you are ready to read the [Getting Started](/docs/get-started/) tutorial. +At this point, you should [install `modulo`](#installing-modulo) to enable the GUI features. + +### Installing Modulo + +Since version 0.7.0, espanso introduced a few gui-related features that require [modulo](https://github.com/federico-terzi/modulo) to be installed in your system. **While not strictly required, it's highly suggested to install it enable some very useful features, such as Forms.**. + +Installing modulo is pretty straight forward, being it packaged as an AppImage. Here's the list of suggested steps: + +```bash +# Download the latest Modulo AppImage in the $HOME/opt +wget https://github.com/federico-terzi/modulo/releases/latest/download/modulo-x86_64.AppImage -O $HOME/opt/modulo.AppImage + +# Make it executable: +chmod u+x $HOME/opt/modulo.AppImage + +# Create a link to make modulo available as "modulo" +sudo ln -s $HOME/opt/modulo.AppImage /usr/bin/modulo +``` + +Note that these steps can be changed in many ways, the only requirement is that the modulo binary is available as `modulo` in the PATH. + +At this point, you are ready to read the [Getting Started](/docs/get-started/) tutorial. \ No newline at end of file diff --git a/install/mac.md b/install/mac.md index 4a2661a..24c2234 100644 --- a/install/mac.md +++ b/install/mac.md @@ -61,6 +61,8 @@ To make sure that espanso was correctly installed, you can open a terminal and t espanso --version ``` +**Important:** Some of the most recent espanso features require also `modulo`, so make sure to follow the installation instructions from the [modulo docs](https://github.com/federico-terzi/modulo#macos). + At this point, you have to [Enable Accessibility](#enabling-accessibility) to use espanso. ### Enabling Accessibility