Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Ohmyzsh
Commits
df58625c
Unverified
Commit
df58625c
authored
Oct 09, 2020
by
Tom Hale
Committed by
GitHub
Oct 09, 2020
Browse files
safe-paste: refresh plugin (update for zsh 5.1 and vi keymaps) (#7887)
parent
8ad9b315
Changes
1
Hide whitespace changes
Inline
Side-by-side
plugins/safe-paste/safe-paste.plugin.zsh
View file @
df58625c
# 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
:0:3
}
-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
# Code from Mikael Magnusson: https://www.zsh.org/mla/users/2011/msg00367.html
#
#
# Requires xterm, urxvt, iTerm2 or any other terminal that supports bracketed
# Requires xterm, urxvt, iTerm2 or any other terminal that supports
# paste mode as documented: https://www.xfree86.org/current/ctlseqs.html
# Bracketed Paste Mode as documented:
# https://www.xfree86.org/current/ctlseqs.html#Bracketed%20Paste%20Mode
# create a new keymap to use while pasting
#
bindkey
-N
paste
# For tmux, use: bind ] paste-buffer -p
# make everything in this keymap call our custom widget
#
bindkey
-R
-M
paste
"^@"
-
"
\M
-^?"
paste-insert
# Additional technical details: https://cirw.in/blog/bracketed-paste
# these are the codes sent around the pasted text in bracketed
# paste mode.
# Create a new keymap to use while pasting
# do the first one with both -M viins and -M vicmd in vi mode
bindkey
-N
bracketed-paste
bindkey
'^[[200~'
_start_paste
# Make everything in this new keymap enqueue characters for pasting
bindkey
-M
paste
'^[[201~'
_end_paste
bindkey
-RM
bracketed-paste
'\x00-\xFF'
bracketed-paste-enqueue
# insert newlines rather than carriage returns when pasting newlines
# These are the codes sent around the pasted text in bracketed paste mode
bindkey
-M
paste
-s
'^M'
'^J'
bindkey
-M
main
'^[[200~'
_bracketed_paste_begin
bindkey
-M
bracketed-paste
'^[[201~'
_bracketed_paste_end
zle
-N
_start_paste
# Insert newlines rather than carriage returns when pasting newlines
zle
-N
_end_paste
bindkey
-M
bracketed-paste
-s
'^M'
'^J'
zle
-N
zle-line-init _zle_line_init
zle
-N
zle-line-finish _zle_line_finish
zle
-N
_bracketed_paste_begin
zle
-N
paste-insert _paste_insert
zle
-N
_bracketed_paste_end
zle
-N
bracketed-paste-enqueue _bracketed_paste_enqueue
# switch the active keymap to paste mode
function
_start_paste
()
{
# Attempt to not clobber zle_line_{init,finish}
bindkey
-A
paste
main
# 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
}
}
#
g
o back to our normal keymap, and insert all the pasted text in the
#
G
o back to our normal keymap, and insert all the pasted text in the
# command line.
t
his has the nice effect of making the whole paste be
# command line.
T
his has the nice effect of making the whole paste be
# a single undo/redo event.
# a single undo/redo event.
function
_end_paste
()
{
_bracketed_paste_end
()
{
#use bindkey -v here with vi mode probably. maybe you want to track
# Only execute the restore command if it starts with 'bindkey'
#if you were in ins or cmd mode and restore the right one.
# Allow for option KSH_ARRAYS being set (indexing starts at 0)
bindkey
-e
if
[
${
_bracketed_paste_restore_keymap
[@]
:0:1
}
=
'bindkey'
]
;
then
LBUFFER+
=
$_paste_content
$_bracketed_paste_restore_keymap
unset
_paste_content
fi
LBUFFER+
=
$_bracketed_paste_content
unset
_bracketed_paste_content _bracketed_paste_restore_keymap
}
}
function
_paste_insert
()
{
# Append a pasted character to the content which is later inserted as a whole
_paste_content+
=
$KEYS
_bracketed_paste_enqueue
()
{
_bracketed_paste_content+
=
$KEYS
}
}
function
_zle_line_init
()
{
# Run at zle-line-init
# Tell terminal to send escape codes around pastes.
_bracketed_paste_zle_init
()
{
[[
$TERM
==
rxvt-unicode
||
$TERM
==
xterm
||
$TERM
=
xterm-256color
||
$TERM
=
screen
||
$TERM
=
screen-256color
]]
&&
printf
'\e[?2004h'
_bracketed_paste_content
=
''
# Tell terminal to send escape codes around pastes
if
[
$TERM
=
~
'^(rxvt-unicode|xterm(-256color)?|screen(-256color)?)$'
]
;
then
printf
'\e[?2004h'
fi
}
}
function
_zle_line_finish
()
{
# Run at zle-line-finish
# Tell it to stop when we leave zle, so pasting in other programs
_bracketed_paste_zle_finish
()
{
# doesn't get the ^[[200~ codes around the pasted text.
# Turn off bracketed paste when we leave ZLE, so pasting in other programs
[[
$TERM
==
rxvt-unicode
||
$TERM
==
xterm
||
$TERM
=
xterm-256color
||
$TERM
=
screen
||
$TERM
=
screen-256color
]]
&&
printf
'\e[?2004l'
# doesn't get the ^[[200~ codes around the pasted text
if
[
$TERM
=
~
'^(rxvt-unicode|xterm(-256color)?|screen(-256color)?)$'
]
;
then
printf
'\e[?2004l'
fi
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment