changeset 351:bef29d49d19f

safe-paste: adds support for bracketed paste mode to zsh Since I don't use oh-my-zsh, just import their code directly with a reference. Based on the site where I learned about this [0], it's originally from [1], and I downloaded it from [2]. 0: https://cirw.in/blog/bracketed-paste 1: http://www.zsh.org/mla/users/2011/msg00367.html 2: https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/plugins/safe-paste/safe-paste.plugin.zsh
author Augie Fackler <raf@durin42.com>
date Mon, 10 Nov 2014 09:26:04 -0500
parents b55a7fe4dfab
children 3111d61151be
files .shell.d/99.safe-paste.zsh
diffstat 1 files changed, 55 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/.shell.d/99.safe-paste.zsh
@@ -0,0 +1,55 @@
+# taken from https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/plugins/safe-paste/safe-paste.plugin.zsh
+# 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'
+}
+