项目作者: hlissner

项目描述 :
Auto-close and delete matching delimiters in zsh
高级语言: Shell
项目地址: git://github.com/hlissner/zsh-autopair.git
创建时间: 2015-12-09T23:51:15Z
项目社区:https://github.com/hlissner/zsh-autopair

开源协议:MIT License

下载


Made with Doom Emacs
MIT License
ZSH 5.0.2+
Build Status

zsh-autopair

A simple plugin that auto-closes, deletes and skips over matching delimiters in
zsh intelligently. Hopefully.

NOTE: zsh-autopair is untested for versions of Zsh below 5.0.2. Please report
any issues you have in earlier versions!

Specifically, zsh-autopair does 5 things for you:

  1. It inserts matching pairs (by default, that means brackets, quotes and
    spaces):

    e.g. echo | => => echo "|"

  2. It skips over matched pairs:

    e.g. cat ./*.{py,rb|} => } => cat ./*.{py,rb}|

  3. It auto-deletes pairs on backspace:

    e.g. git commit -m "|" => backspace => git commit -m |

  4. And does all of the above only when it makes sense to do so. e.g. when the
    pair is balanced and when the cursor isn’t next to a boundary character:

    e.g. echo "|"" => backspace => echo |"" (doesn’t aggressively eat up too many quotes)

  5. Spaces between brackets are expanded and contracted.

    e.g. echo [|] => space => echo [ | ] => backspace => echo [|]

Table of Contents

Install

Download and source autopair.zsh

  1. if [[ ! -d ~/.zsh-autopair ]]; then
  2. git clone https://github.com/hlissner/zsh-autopair ~/.zsh-autopair
  3. fi
  4. source ~/.zsh-autopair/autopair.zsh
  5. autopair-init

Hoembrew

brew install zsh-autopair

  1. # Add to .zshrc
  2. source $HOMEBREW_PREFIX/share/zsh-autopair/autopair.zsh

Antigen

antigen bundle hlissner/zsh-autopair

zgen

  1. if ! zgen saved; then
  2. echo "Creating a zgen save"
  3. # ... other plugins
  4. zgen load hlissner/zsh-autopair
  5. zgen save
  6. fi

zplug

Load autopair after compinit, otherwise, the plugin won’t work.

  1. zplug "hlissner/zsh-autopair", defer:2

Homebrew

For Homebrew users, you can install it through the following command

  1. brew install zsh-autopair

Then source it in your .zshrc

  1. source $(brew --prefix)/share/zsh-autopair/autopair.zsh

Oh My Zsh

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

    1. git clone https://github.com/hlissner/zsh-autopair ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autopair
  2. Add the plugin to the list of plugins for Oh My Zsh to load (inside ~/.zshrc):

    1. plugins=(
    2. # other plugins...
    3. zsh-autopair
    4. )
  3. Start a new terminal session.

Configuration

zsh-autopair sets itself up. You can prevent this by setting
AUTOPAIR_INHIBIT_INIT.

Options:

  • AUTOPAIR_BETWEEN_WHITESPACE (default: blank): if set, regardless of whether
    delimiters are unbalanced or do not meet a boundary check, pairs will be
    auto-closed if surrounded by whitespace, BOL or EOL.
  • AUTOPAIR_INHIBIT_INIT (default: blank): if set, autopair will not
    automatically set up keybinds. Check out the initialization
    code
    if you want to know what it does.
  • AUTOPAIR_PAIRS (default: ('`' '`' "'" "'" '"' '"' '{' '}' '[' ']' '(' ')' ' ' ' ')): An associative array that map pairs. Only one-character pairs are
    supported. To modify this, see the “Adding/Removing pairs” section.
  • AUTOPAIR_LBOUNDS/AUTOPAIR_RBOUNDS (default: see below): Associative lists
    of regex character groups dictating the ‘boundaries’ for autopairing depending
    on the delimiter. These are their default values:

    1. AUTOPAIR_LBOUNDS=(all '[.:/\!]')
    2. AUTOPAIR_LBOUNDS+=(quotes '[]})a-zA-Z0-9]')
    3. AUTOPAIR_LBOUNDS+=(spaces '[^{([]')
    4. AUTOPAIR_LBOUNDS+=(braces '')
    5. AUTOPAIR_LBOUNDS+=('`' '`')
    6. AUTOPAIR_LBOUNDS+=('"' '"')
    7. AUTOPAIR_LBOUNDS+=("'" "'")
    8. AUTOPAIR_RBOUNDS=(all '[[{(<,.:?/%$!a-zA-Z0-9]')
    9. AUTOPAIR_RBOUNDS+=(quotes '[a-zA-Z0-9]')
    10. AUTOPAIR_RBOUNDS+=(spaces '[^]})]')
    11. AUTOPAIR_RBOUNDS+=(braces '')

    For example, if $AUTOPAIR_LBOUNDS[braces]="[a-zA-Z]", then braces ({([) won’t be
    autopaired if the cursor follows an alphabetical character.

    Individual delimiters can be used too. Setting $AUTOPAIR_RBOUNDS['{']="[0-9]" will
    cause { specifically to not be autopaired when the cursor precedes a number.

Adding/Removing pairs

You can change the designated pairs in zsh-autopair by modifying the
AUTOPAIR_PAIRS envvar. This can be done before initialization like so:

  1. typeset -gA AUTOPAIR_PAIRS
  2. AUTOPAIR_PAIRS+=("<" ">")

Or after initialization; however, you’ll have to bind keys to autopair-insert
manually:

  1. AUTOPAIR_PAIRS+=("<" ">")
  2. bindkey "<" autopair-insert
  3. # prevents breakage in isearch
  4. bindkey -M isearch "<" self-insert

To remove pairs, use unset 'AUTOPAIR_PAIRS[<]'. Unbinding is optional.

Troubleshooting & compatibility issues

zgen & prezto compatibility

Prezto’s Editor module is known to reset autopair’s bindings. A workaround is to
defer autopair from initializing (by setting AUTOPAIR_INHIBIT_INIT=1) and
initialize it manually (by calling autopair-init):

  1. source "$HOME/.zgen/zgen.zsh"
  2. # Add this
  3. AUTOPAIR_INHIBIT_INIT=1
  4. if ! zgen saved; then
  5. zgen prezto
  6. # ...
  7. zgen load hlissner/zsh-autopair 'autopair.zsh'
  8. #...
  9. zgen save
  10. fi
  11. # And this
  12. autopair-init

text on right-side of cursor interfere with completion

Bind Tab to expand-or-complete-prefix and completion will ignore
what’s to the right of cursor:

bindkey '^I' expand-or-complete-prefix

This has the unfortunate side-effect of overwriting whatever’s right of the
cursor, however.

zsh-autopair & isearch?

zsh-autopair silently disables itself in isearch, as the two are incompatible.

Midnight Commander

MC hangs when zsh-autopair tries to bind the space key. This also breaks the MC
subshell.

Disable space expansion to work around this: unset 'AUTOPAIR_PAIRS[ ]'

Other resources

  • Works wonderfully with [zsh-syntax-highlight] and
    ZSH_HIGHLIGHT_HIGHLIGHTERS+=brackets, but zsh-syntax-highlight must be
    loaded after zsh-autopair.
  • Mixes well with these vi-mode zsh modules: surround, select-quoted, and
    select-bracketed (they’re built into zsh as of zsh-5.0.8)
  • Other relevant repositories of mine: