mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-01-30 02:44:42 +01:00
Just taking the first three characters of $ZSH_VERSION would result in 5.10 becoming 5.1 and then failing this check. I've updated your logic to strip off the second dot and anything that follows it, thus ensuring all of these work: 5.10 5.10.1 5.10.1.2.3 5.100.
100 lines
4 KiB
Bash
100 lines
4 KiB
Bash
# A good summary of the zsh 5.1 Bracketed Paste Mode changes is at:
|
|
# https://archive.zhimingwang.org/blog/2015-09-21-zsh-51-and-bracketed-paste.html
|
|
|
|
# zsh 5.1 (September 2015) introduced built-in support for Bracketed Paste Mode
|
|
# https://github.com/zsh-users/zsh/blob/68405f31a043bdd5bf338eb06688ed3e1f740937/README#L38-L45
|
|
#
|
|
# zsh 5.1 breaks url-quote-magic and other widgets replacing self-insert
|
|
# zsh-users' bracketed-paste-magic resolves these issues:
|
|
# https://github.com/zsh-users/zsh/blob/f702e17b14d75aa21bff014168fa9048124db286/Functions/Zle/bracketed-paste-magic#L9-L12
|
|
|
|
# Load bracketed-paste-magic if zsh version is >= 5.1
|
|
if [[ ${ZSH_VERSION%.${ZSH_VERSION#*.*.}} -ge 5.1 ]]; then
|
|
set zle_bracketed_paste # Explicitly restore this zsh default
|
|
autoload -Uz bracketed-paste-magic
|
|
zle -N bracketed-paste bracketed-paste-magic
|
|
return ### The rest of this file is NOT executed on zsh version >= 5.1 ###
|
|
fi
|
|
|
|
######################################################################
|
|
# The rest of this file is ONLY executed if zsh version < 5.1
|
|
######################################################################
|
|
|
|
# Code from Mikael Magnusson: https://www.zsh.org/mla/users/2011/msg00367.html
|
|
#
|
|
# Requires xterm, urxvt, iTerm2 or any other terminal that supports
|
|
# Bracketed Paste Mode as documented:
|
|
# https://www.xfree86.org/current/ctlseqs.html#Bracketed%20Paste%20Mode
|
|
#
|
|
# For tmux, use: bind ] paste-buffer -p
|
|
#
|
|
# Additional technical details: https://cirw.in/blog/bracketed-paste
|
|
|
|
# Create a new keymap to use while pasting
|
|
bindkey -N bracketed-paste
|
|
# Make everything in this new keymap enqueue characters for pasting
|
|
bindkey -RM bracketed-paste '\x00-\xFF' bracketed-paste-enqueue
|
|
# These are the codes sent around the pasted text in bracketed paste mode
|
|
bindkey -M main '^[[200~' _bracketed_paste_begin
|
|
bindkey -M bracketed-paste '^[[201~' _bracketed_paste_end
|
|
# Insert newlines rather than carriage returns when pasting newlines
|
|
bindkey -M bracketed-paste -s '^M' '^J'
|
|
|
|
zle -N _bracketed_paste_begin
|
|
zle -N _bracketed_paste_end
|
|
zle -N bracketed-paste-enqueue _bracketed_paste_enqueue
|
|
|
|
# Attempt to not clobber zle_line_{init,finish}
|
|
# Use https://github.com/willghatch/zsh-hooks if available
|
|
if typeset -f hooks-add-hook > /dev/null; then
|
|
hooks-add-hook zle_line_init_hook _bracketed_paste_zle_init
|
|
hooks-add-hook zle_line_finish_hook _bracketed_paste_zle_finish
|
|
else
|
|
zle -N zle-line-init _bracketed_paste_zle_init
|
|
zle -N zle-line-finish _bracketed_paste_zle_finish
|
|
fi
|
|
|
|
# Switch the active keymap to paste mode
|
|
_bracketed_paste_begin() {
|
|
# Save the bindkey command to restore the active ("main") keymap
|
|
# Tokenise the restorative bindkey command into an array
|
|
_bracketed_paste_restore_keymap=( ${(z)"$(bindkey -lL main)"} )
|
|
bindkey -A bracketed-paste main
|
|
}
|
|
|
|
# Go back to our normal keymap, and insert all the pasted text in the
|
|
# command line. This has the nice effect of making the whole paste be
|
|
# a single undo/redo event.
|
|
_bracketed_paste_end() {
|
|
# Only execute the restore command if it starts with 'bindkey'
|
|
# Allow for option KSH_ARRAYS being set (indexing starts at 0)
|
|
if [ ${_bracketed_paste_restore_keymap[@]:0:1} = 'bindkey' ]; then
|
|
$_bracketed_paste_restore_keymap
|
|
fi
|
|
LBUFFER+=$_bracketed_paste_content
|
|
unset _bracketed_paste_content _bracketed_paste_restore_keymap
|
|
}
|
|
|
|
# Append a pasted character to the content which is later inserted as a whole
|
|
_bracketed_paste_enqueue() {
|
|
_bracketed_paste_content+=$KEYS
|
|
}
|
|
|
|
# Run at zle-line-init
|
|
_bracketed_paste_zle_init() {
|
|
_bracketed_paste_content=''
|
|
# Tell terminal to send escape codes around pastes
|
|
if [[ $TERM =~ '^(rxvt-unicode|xterm(-256color)?|screen(-256color)?)$' ]]; then
|
|
printf '\e[?2004h'
|
|
fi
|
|
}
|
|
|
|
# Run at zle-line-finish
|
|
_bracketed_paste_zle_finish() {
|
|
# Turn off bracketed paste when we leave ZLE, so pasting in other programs
|
|
# doesn't get the ^[[200~ codes around the pasted text
|
|
if [[ $TERM =~ '^(rxvt-unicode|xterm(-256color)?|screen(-256color)?)$' ]]; then
|
|
printf '\e[?2004l'
|
|
fi
|
|
}
|
|
|