-
-
Notifications
You must be signed in to change notification settings - Fork 25.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1698 from ConradIrwin/safe-paste
safe-paste plugin
- Loading branch information
Showing
1 changed file
with
54 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
# Code from Mikael Magnusson: http://www.zsh.org/mla/users/2011/msg00367.html | ||
# | ||
# Requires xterm, urxvt, iTerm2 or any other terminal that supports bracketed | ||
# paste mode as documented: http://www.xfree86.org/current/ctlseqs.html | ||
|
||
# create a new keymap to use while pasting | ||
bindkey -N paste | ||
# make everything in this keymap call our custom widget | ||
bindkey -R -M paste "^@"-"\M-^?" paste-insert | ||
# these are the codes sent around the pasted text in bracketed | ||
# paste mode. | ||
# do the first one with both -M viins and -M vicmd in vi mode | ||
bindkey '^[[200~' _start_paste | ||
bindkey -M paste '^[[201~' _end_paste | ||
# insert newlines rather than carriage returns when pasting newlines | ||
bindkey -M paste -s '^M' '^J' | ||
|
||
zle -N _start_paste | ||
zle -N _end_paste | ||
zle -N zle-line-init _zle_line_init | ||
zle -N zle-line-finish _zle_line_finish | ||
zle -N paste-insert _paste_insert | ||
|
||
# switch the active keymap to paste mode | ||
function _start_paste() { | ||
bindkey -A 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. | ||
function _end_paste() { | ||
#use bindkey -v here with vi mode probably. maybe you want to track | ||
#if you were in ins or cmd mode and restore the right one. | ||
bindkey -e | ||
LBUFFER+=$_paste_content | ||
unset _paste_content | ||
} | ||
|
||
function _paste_insert() { | ||
_paste_content+=$KEYS | ||
} | ||
|
||
function _zle_line_init() { | ||
# Tell terminal to send escape codes around pastes. | ||
[[ $TERM == rxvt-unicode || $TERM == xterm || $TERM = xterm-256color ]] && printf '\e[?2004h' | ||
} | ||
|
||
function _zle_line_finish() { | ||
# Tell it to stop when we leave zle, so pasting in other programs | ||
# doesn't get the ^[[200~ codes around the pasted text. | ||
[[ $TERM == rxvt-unicode || $TERM == xterm || $TERM = xterm-256color ]] && printf '\e[?2004l' | ||
} | ||
|