From c4af8c5b72760bcca4059ce843b2beb9a91f1ffe Mon Sep 17 00:00:00 2001 From: Michael Campagnaro Date: Sat, 21 Nov 2015 13:54:28 -0500 Subject: [PATCH] Add a safe-paste zsh plugin --- zsh/plugins/safe-paste/safe-paste.plugin.zsh | 54 ++++++++++++++++++++ zshrc | 2 +- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 zsh/plugins/safe-paste/safe-paste.plugin.zsh diff --git a/zsh/plugins/safe-paste/safe-paste.plugin.zsh b/zsh/plugins/safe-paste/safe-paste.plugin.zsh new file mode 100644 index 0000000..17c212c --- /dev/null +++ b/zsh/plugins/safe-paste/safe-paste.plugin.zsh @@ -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 || $TERM = screen || $TERM = screen-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 || $TERM = screen || $TERM = screen-256color ]] && printf '\e[?2004l' +} + diff --git a/zshrc b/zshrc index d883cfa..89e7fcd 100644 --- a/zshrc +++ b/zshrc @@ -4,7 +4,7 @@ platform=`uname` ZSH=$HOME/.zsh # Plugins to enable - they are found in .zsh/plugins -PLUGINS=() +PLUGINS=(safe-paste) fpath=($fpath $ZSH/func) typeset -U fpath