Fish-like autosuggestions for zsh
Go to file
Eric Freese 4ea825faf8 Fix #247 and #248 without using `(b)` flag
To support older versions of zsh (< 5.0.8).

We were missing the EXTENDED_GLOB option that allows use of `(#m)` flag.
2017-12-06 08:09:14 -07:00
spec Fix conditionals to use [[ and (( rather than [ 2017-11-27 08:31:41 -07:00
src Fix #247 and #248 without using `(b)` flag 2017-12-06 08:09:14 -07:00
.editorconfig Set up circle ci 2017-02-26 14:26:41 -07:00
.rspec Lots of async changes 2017-02-16 19:19:30 -07:00
.rubocop.yml replace tabs in Rubocop config with spaces 2017-08-20 23:36:18 +01:00
.ruby-version Add RSpec for high-level integration testing 2017-01-19 22:33:17 -07:00
CHANGELOG.md v0.4.1 2017-11-28 10:07:49 -07:00
DESCRIPTION Use `add-zsh-hook` to remove need to call `autosuggest_start`. 2016-02-07 15:35:43 -07:00
Gemfile Use pry-byebug instead of pry for more functionality 2017-03-03 18:43:10 -05:00
Gemfile.lock Use pry-byebug instead of pry for more functionality 2017-03-03 18:43:10 -05:00
LICENSE Update license date 2017-02-16 19:07:41 -07:00
Makefile Revert "Simplify escaping of pattern and fix match_prev_cmd strategy" 2017-12-06 08:08:53 -07:00
README.md Use https protocol instead of git in README instructions 2017-09-26 07:56:29 -06:00
URL Update URL references after repo move to zsh-users 2016-02-25 13:04:32 -07:00
VERSION v0.4.1 2017-11-28 10:07:49 -07:00
circle.yml Run CI on prominent versions of zsh back to 4.3.11 2017-12-06 07:45:45 -07:00
zsh-autosuggestions.plugin.zsh Adjust plugin.zsh file to run on zsh 5.1 in mSYS2. 2016-05-11 17:02:41 +02:00
zsh-autosuggestions.zsh Fix #247 and #248 without using `(b)` flag 2017-12-06 08:09:14 -07:00

README.md

zsh-autosuggestions

Fish-like fast/unobtrusive autosuggestions for zsh.

It suggests commands as you type, based on command history.

CircleCI

Installation

Manual

  1. Clone this repository somewhere on your machine. This guide will assume ~/.zsh/zsh-autosuggestions.

    git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
    
  2. Add the following to your .zshrc:

    source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
    
  3. Start a new terminal session.

Oh My Zsh

  1. Clone this repository into $ZSH_CUSTOM/plugins (by default ~/.oh-my-zsh/custom/plugins)

    git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
    
  2. Add the plugin to the list of plugins for Oh My Zsh to load:

    plugins=(zsh-autosuggestions)
    
  3. Start a new terminal session.

Arch Linux via the AUR

  1. Install the zsh-autosuggestions or the zsh-autosuggestions-git packages from the AUR.

    pacaur -S zsh-autosuggestions
    

    or

    pacaur -S zsh-autosuggestions-git
    
  2. Add the following to your .zshrc:

    source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
    
  3. Start a new terminal session.

macOS via Homebrew

  1. Install the zsh-autosuggestions package using Homebrew.

    brew install zsh-autosuggestions
    
  2. Add the following to your .zshrc:

    source /usr/local/share/zsh-autosuggestions/zsh-autosuggestions.zsh
    
  3. Start a new terminal session.

Usage

As you type commands, you will see a completion offered after the cursor in a muted gray color. This color can be changed by setting the ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE variable. See configuration.

If you press the key (forward-char widget) or End (end-of-line widget) with the cursor at the end of the buffer, it will accept the suggestion, replacing the contents of the command line buffer with the suggestion.

If you invoke the forward-word widget, it will partially accept the suggestion up to the point that the cursor moves to.

Configuration

You may want to override the default global config variables after sourcing the plugin. Default values of these variables can be found here.

Note: If you are using Oh My Zsh, you can put this configuration in a file in the $ZSH_CUSTOM directory. See their comments on overriding internals.

Suggestion Highlight Style

Set ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE to configure the style that the suggestion is shown with. The default is fg=8.

Suggestion Strategy

Set ZSH_AUTOSUGGEST_STRATEGY to choose the strategy for generating suggestions. There are currently two to choose from:

  • default: Chooses the most recent match.
  • match_prev_cmd: Chooses the most recent match whose preceding history item matches the most recently executed command (more info). Note that this strategy won't work as expected with ZSH options that don't preserve the history order such as HIST_IGNORE_ALL_DUPS or HIST_EXPIRE_DUPS_FIRST.

Widget Mapping

This plugin works by triggering custom behavior when certain zle widgets are invoked. You can add and remove widgets from these arrays to change the behavior of this plugin:

  • ZSH_AUTOSUGGEST_CLEAR_WIDGETS: Widgets in this array will clear the suggestion when invoked.
  • ZSH_AUTOSUGGEST_ACCEPT_WIDGETS: Widgets in this array will accept the suggestion when invoked.
  • ZSH_AUTOSUGGEST_EXECUTE_WIDGETS: Widgets in this array will execute the suggestion when invoked.
  • ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS: Widgets in this array will partially accept the suggestion when invoked.
  • ZSH_AUTOSUGGEST_IGNORE_WIDGETS: Widgets in this array will not trigger any custom behavior.

Widgets that modify the buffer and are not found in any of these arrays will fetch a new suggestion after they are invoked.

Note: A widget shouldn't belong to more than one of the above arrays.

Disabling suggestion for large buffers

Set ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE to an integer value to disable autosuggestion for large buffers. The default is unset, which means that autosuggestion will be tried for any buffer size. Recommended value is 20. This can be useful when pasting large amount of text in the terminal, to avoid triggering autosuggestion for too long strings.

Enable Asynchronous Mode

As of v0.4.0, suggestions can be fetched asynchronously using the zsh/zpty module. To enable this behavior, set the ZSH_AUTOSUGGEST_USE_ASYNC variable (it can be set to anything).

Key Bindings

This plugin provides a few widgets that you can use with bindkey:

  1. autosuggest-accept: Accepts the current suggestion.
  2. autosuggest-execute: Accepts and executes the current suggestion.
  3. autosuggest-clear: Clears the current suggestion.
  4. autosuggest-fetch: Fetches a suggestion (works even when suggestions are disabled).
  5. autosuggest-disable: Disables suggestions.
  6. autosuggest-enable: Re-enables suggestions.
  7. autosuggest-toggle: Toggles between enabled/disabled suggestions.

For example, this would bind ctrl + space to accept the current suggestion.

bindkey '^ ' autosuggest-accept

Troubleshooting

If you have a problem, please search through the list of issues on GitHub to see if someone else has already reported it.

Reporting an Issue

Before reporting an issue, please try temporarily disabling sections of your configuration and other plugins that may be conflicting with this plugin to isolate the problem.

When reporting an issue, please include:

  • The smallest, simplest .zshrc configuration that will reproduce the problem. See this comment for a good example of what this means.
  • The version of zsh you're using (zsh --version)
  • Which operating system you're running

Uninstallation

  1. Remove the code referencing this plugin from ~/.zshrc.

  2. Remove the git repository from your hard drive

    rm -rf ~/.zsh/zsh-autosuggestions # Or wherever you installed
    

Development

Build Process

Edit the source files in src/. Run make to build zsh-autosuggestions.zsh from those source files.

Pull Requests

Pull requests are welcome! If you send a pull request, please:

  • Request to merge into the develop branch (NOT master)
  • Match the existing coding conventions.
  • Include helpful comments to keep the barrier-to-entry low for people new to the project.
  • Write tests that cover your code as much as possible.

Testing

Tests are written in ruby using the rspec framework. They use tmux to drive a pseudoterminal, sending simulated keystrokes and making assertions on the terminal content.

Test files live in spec/. To run the tests, run make test. To run a specific test, run TESTS=spec/some_spec.rb make test. You can also specify a zsh binary to use by setting the TEST_ZSH_BIN environment variable (ex: TEST_ZSH_BIN=/bin/zsh make test).

License

This project is licensed under MIT license. For the full text of the license, see the LICENSE file.