]> ruderich.org/simon Gitweb - config/dotfiles.git/commitdiff
vim/bundle/screenpaste: Update to 7.0.
authorSimon Ruderich <simon@ruderich.org>
Tue, 10 May 2011 20:37:06 +0000 (22:37 +0200)
committerSimon Ruderich <simon@ruderich.org>
Tue, 10 May 2011 20:37:06 +0000 (22:37 +0200)
vim/bundle/screenpaste/autoload/screenpaste.vim [new file with mode: 0644]
vim/bundle/screenpaste/doc/screenpaste.txt
vim/bundle/screenpaste/plugin/screenpaste.vim [deleted file]
vim/bundle/screenpaste/plugin/screenpastePlugin.vim [new file with mode: 0644]

diff --git a/vim/bundle/screenpaste/autoload/screenpaste.vim b/vim/bundle/screenpaste/autoload/screenpaste.vim
new file mode 100644 (file)
index 0000000..a6d9e93
--- /dev/null
@@ -0,0 +1,234 @@
+" These functions are used by the screenpaste plugin.
+" $Id: screenpaste.vim,v 1bdf402abcdd 2008-10-30 16:27 +0100 blacktrash $
+
+" Script Vars: characters to be escaped on cmdline {{{1
+" static:
+
+" dynamic:
+" these contain the current values for cmdline conversion, and,
+" at startup, are set to the values corresponding to 'noesc'
+" because for 'search' and 'sub' Screen_ClConfig is called with
+" the current value of screen_clmode everytime Screen_CPut is called
+" with the purpose to adapt to current setting of 'magic'
+let s:cl_esc = ''
+let s:cl_eol = '\\n'
+
+" Function: Screen_ClCfgComplete for cmdline-completion {{{1
+function! screenpaste#Screen_ClCfgComplete(A, L, P)
+  return "search\nsub\nnoesc"
+endfunction
+
+" Function: Screen_ClConfig configures cmdline insertion {{{1
+" variables configured here and used by Screen_CPut function:
+" global:
+" g:screen_clmode     cmdline behaviour
+" internal:
+" s:cl_eol            eol-conversion
+" s:cl_esc            character group pattern to be escaped
+" s:esc_info          displays escaped characters
+" s:eol_info          displays eol-conversion
+
+function! screenpaste#Screen_ClConfig(mod, msg)
+  if a:mod !~# '^\%(s\%(earch\|ub\)\|noesc\)$'
+    echohl WarningMsg
+    echon "`" a:mod "': invalid value for screen_clmode\n"
+          \ "use one of: search | sub | noesc"
+    echohl None
+    return ""
+  endif
+  " patterns and strings (for user info)
+  let l:esc_search_ma    = '][/\^$*.~'
+  let l:esc_search_noma  = ']/\^$'
+  let l:esc_sub_ma       = '/\~&'
+  let l:esc_sub_noma     = '/\'
+  let l:info_search_ma   = "] [ / \\ ^ $ ~ * . (magic)"
+  let l:info_search_noma = "] / \\ ^ $ (nomagic)"
+  let l:info_sub_ma      = "/ \\ ~ & (magic)"
+  let l:info_sub_noma    = "/ \\ (nomagic)"
+  " dict vars
+  let l:cl_esc_dict = {
+        \ "search": {0: l:esc_search_noma, 1: l:esc_search_ma},
+        \ "sub":    {0: l:esc_sub_noma,    1: l:esc_sub_ma   },
+        \ "noesc":  {0: '',                1: ''             }
+        \ }
+  let l:cl_info_dict = {
+        \ "search": {0: l:info_search_noma, 1: l:info_search_ma},
+        \ "sub"   : {0: l:info_sub_noma,    1: l:info_sub_ma   },
+        \ "noesc" : {0: 'none',             1: 'none'          }
+        \ }
+  let l:eol_conv_dict =
+        \ {"search": '\\n', "sub": '\\r', "noesc": '\\n'}
+  let l:eol_info_dict =
+        \ {"search": '\n', "sub": '\r', "noesc": '\n'}
+
+  let g:screen_clmode = a:mod
+  let s:cl_esc   =   l:cl_esc_dict[g:screen_clmode][&magic]
+  let s:esc_info =  l:cl_info_dict[g:screen_clmode][&magic]
+  let s:cl_eol   = l:eol_conv_dict[g:screen_clmode]
+  let s:eol_info = l:eol_info_dict[g:screen_clmode]
+  if a:msg
+    echon "set '" g:screen_clmode "' "
+          \ "for Screen buffer insertion in cmdline:\n"
+          \ "eol-conversion to literal " s:eol_info "\n"
+          \ "escaped characters        " s:esc_info
+  endif
+endfunction
+" }}}1
+" ============================================================================
+" Function: Screen_Yank snatches current Screen buffer {{{1
+" Function: Screen_ReadBuf subroutine returns Screen buffer as text {{{2
+
+function! s:Screen_ReadBuf(screen_tmpfile)
+  if !filereadable(a:screen_tmpfile)
+    " wait in case screen is late in writing screen-exchange file
+    execute "sleep" g:screen_wait
+  endif
+  try
+    return join(readfile(a:screen_tmpfile, "b"), "\n")
+  catch /^Vim\%((\a\+)\)\=:E484/
+    " Screen buffer empty, no tmpfile created
+    return ""
+  endtry
+endfunction
+" }}}2
+
+function! screenpaste#Screen_Yank(...)
+  let l:screen_tmpfile = tempname()
+  call system(g:screen_executable." -X writebuf ".l:screen_tmpfile)
+  if !a:0
+    return <SID>Screen_ReadBuf(l:screen_tmpfile)
+  else
+    let l:screen_buf = <SID>Screen_ReadBuf(l:screen_tmpfile)
+    if strlen(l:screen_buf)
+      if strlen(a:1)
+        call setreg(a:1, l:screen_buf)
+      else
+        call setreg(g:screen_register, l:screen_buf)
+      endif
+      return 1
+    elseif g:screen_register =~ '\u'
+      " do nothing
+      return 1
+    else
+      echohl WarningMsg
+      echo "Screen buffer is empty"
+      echohl None
+      return 0
+    endif
+  endif
+endfunction
+
+" Function: Screen_NPut pastes in normal mode {{{1
+function! screenpaste#Screen_NPut(p)
+  if screenpaste#Screen_Yank(g:screen_register)
+    execute 'normal! "'.g:screen_register.a:p
+  endif
+endfunction
+
+" Function: Screen_IPut pastes in insert mode {{{1
+
+" Function: Screen_TwRestore subroutine restores 'paste' {{{2
+" helper function, only called right after Screen_IPut
+" because Screen_IPut must return result before
+" being able to restore paste its previous value
+function! screenpaste#Screen_TwRestore()
+  let &paste = s:curr_paste
+  return ""
+endfunction
+" }}}2
+
+function! screenpaste#Screen_IPut()
+  let s:curr_paste = &paste
+  let &paste = 1
+  let l:screen_buf = screenpaste#Screen_Yank()
+  return l:screen_buf
+endfunction
+
+" Function: Screen_VPut pastes in visual mode {{{1
+function! screenpaste#Screen_VPut(go)
+  if screenpaste#Screen_Yank(g:screen_register)
+    if g:screen_register =~ '["@]'
+      " we have to use another register because
+      " visual selection is deleted into unnamed register
+      let l:store_reg = @z
+      let @z = @"
+      let g:screen_register = "z"
+    endif
+    execute 'normal! gv"'.g:screen_register.a:go.'p'
+    if g:screen_visualselect
+      execute "normal! `[".visualmode()."`]"
+    endif
+    if exists("l:store_reg")
+      let g:screen_register = '"'
+      let @0 = @z
+      let @z = l:store_reg
+    endif
+  else
+    " reset visual after showing message for 3 secs
+    sleep 3
+    execute "normal! gv"
+  endif
+endfunction
+
+" Function: Screen_PutCommand is called from :ScreenPut {{{1
+function! screenpaste#Screen_PutCommand(line, bang, reg)
+  if !strlen(a:reg)
+    let l:reg = g:screen_register
+  else
+    let l:reg = a:reg
+  endif
+  if screenpaste#Screen_Yank(l:reg)
+    if a:line
+      execute a:line "put".a:bang l:reg
+    else
+      execute "put".a:bang l:reg
+    endif
+  endif
+endfunction
+
+" Function: Screen_CPut pastes in cmdline according to cmdtype {{{1
+function! screenpaste#Screen_CPut()
+  " automatically adapt 'screen_clmode' to cmdtype if possible
+  " or instant paste in case of :insert or :append
+  let l:cmdtype = getcmdtype()
+  if l:cmdtype == '-' && exists("$STY")
+    " Screen call needed for :insert and :append commands in Screen_CPut
+    " using slowpaste avoids need for manual redraw
+    let l:screen_slowpaste =
+          \ g:screen_executable." -X slowpaste 10;".
+          \ g:screen_executable." -X paste .;".
+          \ g:screen_executable." -X slowpaste 0"
+    " :insert, :append inside Screen session
+    call system(l:screen_slowpaste)
+    return ""
+  endif
+  " store current cmdline behaviour
+  let l:save_clmode = g:screen_clmode
+  " detect cmdtype if not 'noesc'
+  if g:screen_clmode != "noesc"
+    if l:cmdtype =~ '[/?]'
+      " search: always call config to adapt to 'magic'
+      call screenpaste#Screen_ClConfig("search", 0)
+    elseif l:cmdtype =~ '[@-]'
+      " input() or :insert, :append outside Screen session
+      call screenpaste#Screen_ClConfig("noesc", 0)
+    else
+      " search, sub: always call config to adapt to 'magic'
+      call screenpaste#Screen_ClConfig(g:screen_clmode, 0)
+    endif
+  endif
+  " escape chars in Screen buffer for cmdline
+  let l:screen_buf = screenpaste#Screen_Yank()
+  if strlen(s:cl_esc)
+    let l:screen_buf = escape(l:screen_buf, s:cl_esc)
+  endif
+  let l:screen_buf = substitute(l:screen_buf, "\<C-J>", s:cl_eol, 'g')
+  " restore global 'screen_clmode' if changed
+  if l:save_clmode != g:screen_clmode
+    call screenpaste#Screen_ClConfig(l:save_clmode, 0)
+  endif
+  return l:screen_buf
+endfunction
+" }}}1
+" EOF vim600: set foldmethod=marker:
index 11a50e8d10cae5aa1a6831cd13f5a3bb1c00a1af..49cfeb61471cad5dd7f32c747c0504ff92d7bbe5 100644 (file)
@@ -1,5 +1,11 @@
 *screenpaste.txt* Paste/insert GNU Screen buffer in (almost) any mode  v5.92
 
+$Id: screenpaste.txt,v 8624db9970aa 2008-11-08 21:33 +0100 blacktrash $
+
+For instructions on installing this file, type
+       :help add-local-help
+inside Vim.
+
 Author:        Christian Ebert <blacktrash@gmx.net>
 
 
@@ -12,13 +18,12 @@ Author:     Christian Ebert <blacktrash@gmx.net>
 1. Contents                                            *screenpaste-toc*
 
        Screen Paste Plugin                             |screenpaste-intro|
-       Activation                                      |screenpaste-activate|
+       Installation                                    |screenpaste-install|
        Usage                                           |screenpaste-usage|
        Options                                         |screenpaste-options|
        Changing Mappings                               |screenpaste-mappings|
        Commands                                        |screenpaste-commands|
        Bugs and Limitations                            |screenpaste-bugs|
-       Credits                                         |screenpaste-credits|
 
 ==============================================================================
 
@@ -36,7 +41,7 @@ This script provides mappings and commands to get correct results.
 As an additional feature the current Screen buffer is available in any Vim
 instance, even those /outside/ the current Screen session.
 
-When pasting into command-line in Vim7 many commands are autodetected and the
+When pasting into command-line many commands are autodetected and the
 behaviour adapts automatically (|getcmdtype()|).
 
 The underlying mechanism of screenpaste consists in getting hold of the
@@ -51,15 +56,17 @@ respectively.
 
 ==============================================================================
 
-3. Activation                                          *screenpaste-activate*
+3. Installation                                                *screenpaste-install*
 
-Either copy screenpaste.vim to your plugin directory (|add-global-plugin|),
-or to your macros directory and source it (manually or from |vimrc|): >
-       :runtime macros/screenpaste.vim
-or >
-       :source $HOME/.vim/macros/screenpaste.vim
+The screenpaste plugin comprises three files: screenpastePlugin.vim,
+screenpaste.vim and screenpaste.txt (this file). To install the plugin, copy
+screenpastePlugin.vim into a 'plugin' directory in your runtime path and
+screenpaste.vim into the corresponding 'autoload' directory. See
+|add-global-plugin| and |'runtimepath'|.
 
-The Vim Help documentation installs itself when you restart Vim.
+This help file goes into a 'doc' directory in the runtime path. Then execute
+|:helptags|, specifying the full path of the 'doc' directory. See
+|add-local-help| for details.
 
 The GNU Screen executable has to be in $PATH. Otherwise screenpaste bails out
 giving an error message.
@@ -199,16 +206,26 @@ Default Value     'screen'
        "screen", or if you like to specify it's full path: >
                let g:screen_executable = "/usr/local/bin/screen"
 
+g:screen_wait                                          *screen_wait*
+
+Type           String or Number
+Valid Values   See |:sleep|
+Default Value  '333m'
+
+       How long Vim should wait for Screen to write its exchange file.  If
+       you get messages that the Screen buffer is empty even though you know
+       that it actually is not, bump up this setting.
+
 g:screen_visualselect                                  *screen_visualselect*
 Type           Boolean
 Default Value  0
 
-        If set to 1 and in Visual mode the text from the Screen buffer is
-        visually selected after the put operation.
+       If set to 1 and in Visual mode the text from the Screen buffer is
+       visually selected after the put operation.
 
 g:screen_register                                      *screen_register*
 
-Type           String
+Type           String or Number
 Valid Values   "a-z0-9A-Z
 Default Value  '"'
 
@@ -228,12 +245,9 @@ Default Value      '"'
        For a one time operation with a special register the use of
        |ScreenPut| ex-command and its register argument is recommended.
 
-       Note: Due to the mechanics of the script even a numbered register has
-       to be passed as string, ie. it has to quoted when you set it; eg. >
-               :let g:screen_register = "8"
-<      Note as well that specifying an uppercase letter means that the
-       contents of the Screen buffer will be appended to the register named
-       with the corresponding lowercase character (|quote_alpha|).
+       Note: Specifying an uppercase letter means that the contents of the
+       Screen buffer will be appended to the register named with the
+       corresponding lowercase character (|quote_alpha|).
 
 g:screen_clmode                                                *screen_clmode*
 
@@ -291,7 +305,6 @@ Modes and their behaviour:
        Use this mode to paste current Screen buffer literally into command
        line.
 
-Vim7:
        |/|, |?|, |input()|, |:insert|, and |:append| commands are
        autodetected when not in 'noesc' |screen_clmode|. This means that even
        when you are in 'sub' mode you can type: >
@@ -305,9 +318,6 @@ Vim7:
        without clobbering a parallel Screen session, and Vim would insert
        <Nul> characters instead (see |NL-used-for-Nul|).
 
-Vim6:
-       For |:insert| and |:append| commands use Screen's "C-a ]"
-
 ==============================================================================
 
 6. Changing Mappings                                   *screenpaste-mappings*
@@ -425,13 +435,6 @@ the end of a selection in a different manner than Vim's visual yank does.
 Screen expands tabs, expect incorrect results if the Screen buffer contains
 tabs.
 
-==============================================================================
-
-Credits                                                        *screenpaste-credits*
-
-Mathieu Clabaut, Guo-Peng Wen  let me steal and tweak the inline
-                               self-install code for this Help document.
-
 ==============================================================================
 
  vim:tw=78:ts=8:ft=help:norl:
diff --git a/vim/bundle/screenpaste/plugin/screenpaste.vim b/vim/bundle/screenpaste/plugin/screenpaste.vim
deleted file mode 100644 (file)
index 5ae6ec4..0000000
+++ /dev/null
@@ -1,1007 +0,0 @@
-" File:          screenpaste.vim
-" Description:   pastes/inserts current GNU Screen buffer in (almost) any mode
-" Version:       5.92
-" Mercurial:     $Id: screenpaste.vim,v 41183f681647 2008-01-06 17:29 +0100 blacktrash $
-" Author:        Christian Ebert <blacktrash@gmx.net>
-" Credits:       Mathieu Clabaut and Guo-Peng Wen for inline doc self-install code
-" URL:           http://www.vim.org/script.php?script_id=1512
-" Requirements:  GNU Screen must be in $PATH
-" Documentation: :help screenpaste
-"                self installing to its current version when plugin is loaded
-"                to review before install go to last section of this file
-"
-" GetLatestVimScripts: 1512 1 :AutoInstall: screenpaste.vim
-
-" Init: store 'compatible' settings {{{1
-let s:save_cpo = &cpo
-set cpo&vim
-
-if !exists("g:loaded_screenpaste")
-  " Fast Load: global vars, mappings, commands, doc install
-  " load functions only on demand via autocmd
-  " at Vim startup only run checks, load global vars, mappings, commands,
-  " and install Help if not up to date or not present
-
-  " full path to plugin -- needed for Screen_UpdateDocs and demand load
-  let s:plug_path = expand("<sfile>:p")
-  " name of plugin w/o extension for messages
-  let s:plug_name = fnamemodify(s:plug_path, ":t:r")
-
-  " Global Variables: {{{1
-  " g:screen_executable: name of GNU Screen executable
-  if !exists("g:screen_executable")
-    let g:screen_executable = "screen"
-  endif
-
-  " g:screen_clmode: how screenpaste behaves in Vim's command-line
-  if !exists("g:screen_clmode")
-    let g:screen_clmode = "search"
-  elseif g:screen_clmode !~# '^\%(s\%(earch\|ub\)\|noesc\)$'
-    echomsg s:plug_name.": `".g:screen_clmode."':"
-          \ "invalid value for screen_clmode."
-          \ "Reset to 'search' (default)"
-    let g:screen_clmode = "search"
-  endif
-
-  " g:screen_register: instead of register "0 use this one
-  if !exists("g:screen_register")
-    let g:screen_register = '"'
-  elseif g:screen_register !~ '^["0-9a-zA-Z]$'
-    echomsg s:plug_name.": `".g:screen_register."':"
-          \ "invalid value for screen_register."
-          \ "Reset to '\"' (default)"
-    let g:screen_register = '"'
-  endif
-
-  if !exists("g:screen_visualselect")
-    let g:screen_visualselect = 0
-  endif
-
-  " Checks: for system() and Screen executable {{{1
-  function! s:Screen_CleanUp(msg)
-    echohl WarningMsg
-    echomsg s:plug_name.":" a:msg "Plugin not loaded"
-    echohl None
-    let g:loaded_screenpaste = "no"
-    let &cpo = s:save_cpo
-    unlet s:save_cpo s:plug_name g:screen_executable g:screen_clmode
-  endfunction
-
-  " bail out if system() is not available
-  if !exists("*system")
-    call <SID>Screen_CleanUp("builtin system() function not available.")
-    finish
-  endif
-
-  " bail out if GNUscreen is not present
-  if !executable(g:screen_executable)
-    call <SID>Screen_CleanUp("`".g:screen_executable."' not executable.")
-    finish
-  endif
-
-  let s:curr_version = "v5.92"
-
-  " Mappings: propose defaults {{{1
-  if !hasmapto("<Plug>ScreenpastePut") " nvo
-    map  <unique> <Leader>p <Plug>ScreenpastePut
-  endif
-  if !hasmapto("<Plug>ScreenpasteGPut") " nvo
-    map  <unique> <Leader>gp <Plug>ScreenpasteGPut
-  endif
-  if !hasmapto("<Plug>ScreenpastePutBefore", "n")
-    nmap <unique> <Leader>P <Plug>ScreenpastePutBefore
-  endif
-  if !hasmapto("<Plug>ScreenpasteGPutBefore", "n")
-    nmap <unique> <Leader>gP <Plug>ScreenpasteGPutBefore
-  endif
-  if !hasmapto("<Plug>ScreenpastePut", "ic")
-    map! <unique> <Leader>p <Plug>ScreenpastePut
-  endif
-
-  " Internal Mappings: {{{1
-  nnoremap <script> <silent> <Plug>ScreenpastePut
-        \ :call <SID>Screen_NPut("p")<CR>
-  nnoremap <script> <silent> <Plug>ScreenpasteGPut
-        \ :call <SID>Screen_NPut("gp")<CR>
-  nnoremap <script> <silent> <Plug>ScreenpastePutBefore
-        \ :call <SID>Screen_NPut("P")<CR>
-  nnoremap <script> <silent> <Plug>ScreenpasteGPutBefore
-        \ :call <SID>Screen_NPut("gP")<CR>
-  vnoremap <script> <silent> <Plug>ScreenpastePut
-        \ :<C-U> call <SID>Screen_VPut("")<CR>
-  vnoremap <script> <silent> <Plug>ScreenpasteGPut
-        \ :<C-U> call <SID>Screen_VPut("g")<CR>
-  inoremap <script> <silent> <Plug>ScreenpastePut
-        \ <C-R>=<SID>Screen_IPut()<CR><C-R>=<SID>Screen_TwRestore()<CR>
-  cnoremap <script>          <Plug>ScreenpastePut
-        \ <C-R>=<SID>Screen_CPut()<CR>
-
-  " Commands: {{{1
-  " configuration for command-line-mode
-  " in v:version >= 700 this works with <SID>
-  function! Screen_ClCfgComplete(A, L, P)
-    return "search\nsub\nnoesc"
-  endfunction
-  command -nargs=1 -complete=custom,Screen_ClCfgComplete
-        \ ScreenCmdlineConf call <SID>Screen_ClConfig(<f-args>, 1)
-  command ScreenCmdlineInfo call <SID>Screen_ClConfig(g:screen_clmode, 1)
-  command ScreenSearch      call <SID>Screen_ClConfig("search", 1)
-  command ScreenSub         call <SID>Screen_ClConfig("sub", 1)
-  command ScreenNoEsc       call <SID>Screen_ClConfig("noesc", 1)
-  " yank Screen buffer into register (default: screen_register)
-  command -register ScreenYank call <SID>Screen_Yank("<register>")
-  " buffer operation
-  command -count=0 -bang -register ScreenPut
-        \ call <SID>Screen_PutCommand("<count>", "<bang>", "<register>")
-
-  " }}}1
-" ===== end of public configuration ==========================================
-  " Help Install: automatically when needed {{{1
-  " Function: Screen_FlexiMkdir tries to adapt to system {{{2
-  function! s:Screen_FlexiMkdir(dir)
-    if exists("*mkdir")
-      call mkdir(a:dir)
-    elseif !exists("+shellslash")
-      call system("mkdir -p '".a:dir."'")
-    else
-      let l:ssl = &shellslash
-      try
-        set shellslash
-        " no single spaces for M$? (untested)
-        call system('mkdir "'.a:dir.'"')
-      finally
-        let &shellslash = l:ssl
-      endtry
-    endif
-  endfunction
-  " }}}2
-
-  " and now the doc install itself
-  function! s:Screen_UpdateDocs()
-    " figure out document path
-    let l:vim_doc_dir = fnamemodify(s:plug_path, ":h:h")."/doc"
-    if filewritable(l:vim_doc_dir) != 2
-      let l:doc_install_intro = s:plug_name." doc install:"
-      echomsg l:doc_install_intro "Trying doc path" l:vim_doc_dir
-      echomsg "  relative to" s:plug_path
-      silent! call <SID>Screen_FlexiMkdir(l:vim_doc_dir)
-      if filewritable(l:vim_doc_dir) != 2
-        " try first item in 'runtimepath' which is comma-separated list
-        let l:vim_doc_dir =
-              \ substitute(&runtimepath, '^\([^,]*\).*', '\1/doc', 'e')
-        echomsg l:doc_install_intro "Trying doc path" l:vim_doc_dir
-        echomsg "  using first item of 'runtimepath'"
-        if filewritable(l:vim_doc_dir) != 2
-          silent! call <SID>Screen_FlexiMkdir(l:vim_doc_dir)
-          if filewritable(l:vim_doc_dir) != 2
-            " give a warning
-            echomsg l:doc_install_intro "Unable to detect writeable doc directory"
-            echomsg "  type `:help add-local-help' for more information"
-            return 0
-          endif
-        endif
-      endif
-    endif
-    " full name of help file
-    let l:doc_file = l:vim_doc_dir."/".s:plug_name.".txt"
-    " bail out if document file is still up to date
-    if filereadable(l:doc_file) &&
-          \ getftime(s:plug_path) < getftime(l:doc_file)
-      return 0
-    endif
-    let l:lz = &lazyredraw
-    let l:hls = &hlsearch
-    set lazyredraw nohlsearch
-    " create a new buffer & read in the plugin file
-    1 new
-    setlocal noswapfile modifiable nomodeline
-    if has("folding")
-      setlocal nofoldenable
-    endif
-    silent execute "read" escape(s:plug_path, " ")
-    let l:doc_buf = bufnr("%")
-    1
-    " delete from first line line starting with
-    " === START_DOC
-    silent 1,/^=\{3,}\s\+START_DOC\C/ delete _
-    " delete from line starting with
-    " === END_DOC
-    " to end of buffer
-    silent /^=\{3,}\s\+END_DOC\C/,$ delete _
-    " add modeline for help, modeline string mangled intentionally
-    " to avoid its being recognized when it is parsed
-    call append(line("$"), "")
-    call append(line("$"), " v"."im:tw=78:ts=8:ft=help:norl:")
-    " replace revision
-    silent execute "normal :1s/#version#/ ".s:curr_version."/\<CR>"
-    " write file `screenpaste.txt'
-    silent execute "wq!" escape(l:doc_file, " ") "| bwipeout" l:doc_buf
-    " create help tags
-    silent execute "helptags" l:vim_doc_dir
-    let &hlsearch = l:hls
-    let &lazyredraw = l:lz
-    return 1
-  endfunction
-
-  if <SID>Screen_UpdateDocs()
-    echomsg s:plug_name s:curr_version.": updated documentation"
-  endif
-
-  " Demand Load: via autcmd FuncUndefined : {{{1
-  " get the current script ID
-  function! s:Screen_SID()
-    " <sfile> inside a function yields {function-name}
-    return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_SID$')
-  endfunction
-  " load functions on demand
-  execute "autocmd FuncUndefined"
-        \ "*".<SID>Screen_SID()."Screen_* source" escape(s:plug_path, " ")
-
-  " Purge Functions: that have done their one-time duty {{{1
-  delfunction <SID>Screen_CleanUp
-  delfunction <SID>Screen_FlexiMkdir
-  delfunction <SID>Screen_UpdateDocs
-  delfunction <SID>Screen_SID
-
-  let g:loaded_screenpaste = s:curr_version."_fast_load_done"
-
-  let &cpo = s:save_cpo
-  unlet s:save_cpo s:plug_path
-  finish
-endif
-
-if g:loaded_screenpaste != s:curr_version."_fast_load_done"
-  let &cpo = s:save_cpo
-  unlet s:save_cpo
-  finish
-endif
-
-let g:loaded_screenpaste = s:curr_version
-
-" }}}1
-" ===== end of fast load =====================================================
-" Script Vars: characters to be escaped on cmdline {{{1
-" static:
-" patterns and strings (for user info)
-let s:esc_search_ma    = '][/\^$*.~'
-let s:esc_search_noma  = ']/\^$'
-let s:esc_sub_ma       = '/\~&'
-let s:esc_sub_noma     = '/\'
-let s:info_search_ma   = "] [ / \\ ^ $ ~ * . (magic)"
-let s:info_search_noma = "] / \\ ^ $ (nomagic)"
-let s:info_sub_ma      = "/ \\ ~ & (magic)"
-let s:info_sub_noma    = "/ \\ (nomagic)"
-
-" dynamic:
-" these contain the current values for cmdline conversion, and,
-" at startup, are set to the values corresponding to 'noesc'
-" because for 'search' and 'sub' Screen_ClConfig is called with
-" the current value of screen_clmode everytime Screen_CPut is called
-" with the purpose to adapt to current setting of 'magic'
-let s:cl_esc = ''
-let s:cl_eol = '\\n'
-
-" Function: Screen_BufEscape escapes chars in Screen buffer for cmdline {{{1
-function! s:Screen_BufEscape()
-  let l:screen_buf = <SID>Screen_Yank()
-  if strlen(s:cl_esc)
-    let l:screen_buf = escape(l:screen_buf, s:cl_esc)
-  endif
-  return substitute(l:screen_buf, "\<C-J>", s:cl_eol, 'g')
-endfunction
-
-" Function: Screen_ClConfig configures cmdline insertion {{{1
-" variables configured here and used by Screen_CPut function:
-" global:
-" g:screen_clmode     cmdline behaviour
-" internal:
-" s:cl_eol            eol-conversion
-" s:cl_esc            character group pattern to be escaped
-" s:esc_info          displays escaped characters
-" s:eol_info          displays eol-conversion
-function! s:Screen_ClConfig(mod, msg)
-  if a:mod !~# '^\%(s\%(earch\|ub\)\|noesc\)$'
-    echohl WarningMsg
-    echon "`" a:mod "': invalid value for screen_clmode\n"
-          \ "use one of: search | sub | noesc"
-    echohl None
-    return ""
-  endif
-  let g:screen_clmode = a:mod
-  " call version dependent function to assign escapes
-  call <SID>Screen_ClEscape()
-  if a:msg
-    echon "set '" g:screen_clmode "' "
-          \ "for Screen buffer insertion in cmdline:\n"
-          \ "eol-conversion to literal " s:eol_info "\n"
-          \ "escaped characters        " s:esc_info
-  endif
-endfunction
-" }}}1
-" ============================================================================
-" Vim7 Functions: subroutines, Screen_CPut (command detection) {{{1
-" ============================================================================
-" functions and helpers making use of Vim7 features
-if v:version >= 700
-
-  " Function: Screen_ReadBuf returns Screen buffer as text {{{2
-  function! s:Screen_ReadBuf(screen_tmpfile)
-    try
-      return join(readfile(a:screen_tmpfile, "b"), "\n")
-    catch /^Vim\%((\a\+)\)\=:E484/
-      " Screen buffer empty, no tmpfile created
-      return ""
-    endtry
-  endfunction
-
-  " Function: Screen_ClEscape chars to be escaped in cmdline {{{2
-  " initialize dict vars
-  let s:cl_esc_dict = {
-        \ "search": {0: s:esc_search_noma, 1: s:esc_search_ma},
-        \ "sub":    {0: s:esc_sub_noma,    1: s:esc_sub_ma   },
-        \ "noesc":  {0: '',                1: ''             }
-        \ }
-  let s:cl_info_dict = {
-        \ "search": {0: s:info_search_noma, 1: s:info_search_ma},
-        \ "sub"   : {0: s:info_sub_noma,    1: s:info_sub_ma   },
-        \ "noesc" : {0: 'none',             1: 'none'          }
-        \ }
-  let s:eol_conv_dict =
-        \ {"search": '\\n', "sub": '\\r', "noesc": '\\n'}
-  let s:eol_info_dict =
-        \ {"search": '\n', "sub": '\r', "noesc": '\n'}
-
-  function! s:Screen_ClEscape()
-    let s:cl_esc   =   s:cl_esc_dict[g:screen_clmode][&magic]
-    let s:esc_info =  s:cl_info_dict[g:screen_clmode][&magic]
-    let s:cl_eol   = s:eol_conv_dict[g:screen_clmode]
-    let s:eol_info = s:eol_info_dict[g:screen_clmode]
-  endfunction
-
-  " Function: Screen_CPut writes converted Screen buffer to cmdline {{{2
-  " Screen call needed for :insert and :append commands in Screen_CPut
-  " using slowpaste avoids need for manual redraw
-  let s:screen_slowpaste =
-        \ g:screen_executable." -X slowpaste 10;".
-        \ g:screen_executable." -X paste .;".
-        \ g:screen_executable." -X slowpaste 0"
-
-  function! s:Screen_CPut()
-    " automatically adapt 'screen_clmode' to cmdtype if possible
-    " or instant paste in case of :insert or :append
-    let l:cmdtype = getcmdtype()
-    if l:cmdtype == '-' && exists("$STY")
-      " :insert, :append inside Screen session
-      call system(s:screen_slowpaste)
-      return ""
-    endif
-    " store current cmdline behaviour
-    let l:save_clmode = g:screen_clmode
-    " detect cmdtype if not 'noesc'
-    if g:screen_clmode != "noesc"
-      if l:cmdtype =~ '[/?]'
-        " search: always call config to adapt to 'magic'
-        call <SID>Screen_ClConfig("search", 0)
-      elseif l:cmdtype =~ '[@-]'
-        " input() or :insert, :append outside Screen session
-        call <SID>Screen_ClConfig("noesc", 0)
-      else
-        " search, sub: always call config to adapt to 'magic'
-        call <SID>Screen_ClConfig(g:screen_clmode, 0)
-      endif
-    endif
-    let l:screen_buf = <SID>Screen_BufEscape()
-    " restore global 'screen_clmode' if changed
-    if l:save_clmode != g:screen_clmode
-      call <SID>Screen_ClConfig(l:save_clmode, 0)
-    endif
-    return l:screen_buf
-  endfunction
-
-" }}}1
-" ============================================================================
-" Vim6 Functions: subroutines, Screen_CPut (w/o command detection) {{{1
-" (see Vim7 for more comments)
-else
-
-  " Function: Screen_ReadBuf returns Screen buffer as text {{{2
-  function! s:Screen_ReadBuf(screen_tmpfile)
-    let l:store_quote = @"
-    let l:store_null  = @0
-    let l:lz = &lazyredraw
-    silent execute "1 sview" a:screen_tmpfile
-    silent % yank
-    quit!
-    let &lazyredraw = l:lz
-    " remove closing newline to mimic reading in binary mode
-    " otherwise always a linewise register
-    let l:screen_buf = substitute(@0, '\n\%$', '', 'e')
-    let @" = l:store_quote
-    let @0 = l:store_null
-    return l:screen_buf
-  endfunction
-
-  " Function: Screen_ClEscape assigns chars to be escaped in cmdline {{{2
-  function! s:Screen_ClEscape()
-    if &magic && g:screen_clmode == "search"
-      let s:cl_esc   = s:esc_search_ma
-      let s:esc_info = s:info_search_ma
-    elseif &magic && g:screen_clmode == "sub"
-      let s:cl_esc   = s:esc_sub_ma
-      let s:esc_info = s:info_sub_ma
-    elseif g:screen_clmode == "search"
-      let s:cl_esc   = s:esc_search_noma
-      let s:esc_info = s:info_search_noma
-    elseif g:screen_clmode == "sub"
-      let s:cl_esc   = s:esc_sub_noma
-      let s:esc_info = s:info_sub_noma
-    else " "noesc"
-      let s:cl_esc   = ''
-      let s:esc_info = "none"
-    endif
-    if g:screen_clmode != "sub"
-      let s:cl_eol   = '\\n'
-      let s:eol_info = '\n'
-    else
-      let s:cl_eol   = '\\r'
-      let s:eol_info = '\r'
-    endif
-  endfunction
-
-  " Function: Screen_CPut writes converted Screen buffer to cmdline {{{2
-  " no detection of cmdtype
-  function! s:Screen_CPut()
-    if g:screen_clmode != "noesc"
-      " catch eventual change of &magic
-      call <SID>Screen_ClConfig(g:screen_clmode, 0)
-    endif
-    return <SID>Screen_BufEscape()
-  endfunction
-
-endif
-
-" }}}1
-" ============================================================================
-" Function: Screen_Yank snatches current Screen buffer {{{1
-function! s:Screen_Yank(...)
-  let l:screen_tmpfile = tempname()
-  call system(g:screen_executable." -X writebuf ".l:screen_tmpfile)
-  if !a:0
-    return <SID>Screen_ReadBuf(l:screen_tmpfile)
-  else
-    let l:screen_buf = <SID>Screen_ReadBuf(l:screen_tmpfile)
-    if strlen(l:screen_buf)
-      if strlen(a:1)
-        call setreg(a:1, l:screen_buf)
-      else
-        call setreg(g:screen_register, l:screen_buf)
-      endif
-      return 1
-    elseif g:screen_register =~ '\u'
-      " do nothing
-      return 1
-    else
-      echohl WarningMsg
-      echo "Screen buffer is empty"
-      echohl None
-      return 0
-    endif
-  endif
-endfunction
-
-" Function: Screen_NPut pastes in normal mode {{{1
-function! s:Screen_NPut(p)
-  if <SID>Screen_Yank(g:screen_register)
-    execute 'normal! "'.g:screen_register.a:p
-  endif
-endfunction
-
-" Function: Screen_IPut pastes in insert mode {{{1
-" Function: Screen_TwRestore restores 'paste' {{{2
-" helper function, only called right after Screen_IPut
-" because Screen_IPut must return result before
-" being able to restore paste its previous value
-function! s:Screen_TwRestore()
-  let &paste = s:curr_paste
-  return ""
-endfunction
-" }}}2
-function! s:Screen_IPut()
-  let s:curr_paste = &paste
-  let &paste = 1
-  let l:screen_buf = <SID>Screen_Yank()
-  return l:screen_buf
-endfunction
-
-" Function: Screen_VPut pastes in visual mode {{{1
-function! s:Screen_VPut(go)
-  if <SID>Screen_Yank(g:screen_register)
-    if g:screen_register =~ '["@]'
-      " we have to use another register because
-      " visual selection is deleted into unnamed register
-      let l:store_reg = @z
-      let @z = @"
-      let g:screen_register = "z"
-    endif
-    execute 'normal! gv"'.g:screen_register.a:go.'p'
-    if g:screen_visualselect
-      execute "normal! `[".visualmode()."`]"
-    endif
-    if exists("l:store_reg")
-      let g:screen_register = '"'
-      let @0 = @z
-      let @z = l:store_reg
-    endif
-  else
-    " reset visual after showing message for 3 secs
-    sleep 3
-    execute "normal! gv"
-  endif
-endfunction
-
-" Function: Screen_PutCommand is called from :ScreenPut {{{1
-function! s:Screen_PutCommand(line, bang, reg)
-  if !strlen(a:reg)
-    let l:reg = g:screen_register
-  else
-    let l:reg = a:reg
-  endif
-  if <SID>Screen_Yank(l:reg)
-    if a:line
-      execute a:line "put".a:bang l:reg
-    else
-      execute "put".a:bang l:reg
-    endif
-  endif
-endfunction
-
-" Finale: restore 'compatible' settings {{{1
-let &cpo = s:save_cpo
-unlet s:save_cpo
-
-finish
-" }}}1
-" ============================================================================
-" Section: inline documentation (self-installing) {{{1
-" to read the docs from this file with proper syntax coloring, type
-" :set ft=help
-
-=== START_DOC
-*screenpaste.txt* Paste/insert GNU Screen buffer in (almost) any mode #version#
-
-Author:        Christian Ebert <blacktrash@gmx.net>
-
-
-               SCREENPASTE REFERENCE MANUAL~
-
-*screenpaste* *screenpaste.vim*
-
-==============================================================================
-
-1. Contents                                            *screenpaste-toc*
-
-       Screen Paste Plugin                             |screenpaste-intro|
-       Activation                                      |screenpaste-activate|
-       Usage                                           |screenpaste-usage|
-       Options                                         |screenpaste-options|
-       Changing Mappings                               |screenpaste-mappings|
-       Commands                                        |screenpaste-commands|
-       Bugs and Limitations                            |screenpaste-bugs|
-       Credits                                         |screenpaste-credits|
-
-==============================================================================
-
-2. Screen Paste Plugin                                 *screenpaste-intro*
-
-The terminal window manager Screen http://www.gnu.org/software/screen
-offers the capability to copy and paste between windows.
-
-In principle you can just do "C-a ]" (default) to paste the current Screen
-buffer into a vim buffer. However this gives unexpected results when 'paste'
-is not set or in Vim's command-line.
-
-This script provides mappings and commands to get correct results.
-
-As an additional feature the current Screen buffer is available in any Vim
-instance, even those /outside/ the current Screen session.
-
-When pasting into command-line in Vim7 many commands are autodetected and the
-behaviour adapts automatically (|getcmdtype()|).
-
-The underlying mechanism of screenpaste consists in getting hold of the
-current Screen buffer via calling to Screen to write it to a temporary file.
-At this point Vim takes over, reads the contents of the file, and puts them to
-use either directly (in Insert, Replace or Command-line mode) or, in Normal
-and Visual mode, by writing to a register and, most often, putting the
-contents of the register into the Vim buffer.  Which is why the default
-keybindings mimic |p|, |P|, |gp|, |gP|, with the |mapleader| prepended, as
-well as |:ScreenPut| and |:ScreenYank| behave almost like |:put| and |:yank|
-respectively.
-
-==============================================================================
-
-3. Activation                                          *screenpaste-activate*
-
-Either copy screenpaste.vim to your plugin directory (|add-global-plugin|),
-or to your macros directory and source it (manually or from |vimrc|): >
-       :runtime macros/screenpaste.vim
-or >
-       :source $HOME/.vim/macros/screenpaste.vim
-
-The Vim Help documentation installs itself when you restart Vim.
-
-The GNU Screen executable has to be in $PATH. Otherwise screenpaste bails out
-giving an error message.
-
-==============================================================================
-
-4. Usage                                               *screenpaste-usage*
-
-Think of the current Screen buffer as of a register at your disposal via the
-|screenpaste| mappings and commands.
-
-                                                       *screenpaste-put*
-When you type the plugin's Ex command
->
-       :ScreenPut
-
-this works like executing |:put| with the current Screen buffer as register.
-It puts the text after the current line.  Like |:put| it accepts a prepended
-number as parameter designating the target line as well as an appended bang
-to put the text before the indicated line and an optional register argument
-which defaults to |screen_register| when omitted.
-
-|:ScreenPut| differs from |:put| as the register is not only written into the
-buffer but filled with the current Screen buffer beforehand.
-
-                                                       *screenpaste-yank*
-If you want to just get hold of the current Screen buffer for further
-processing, type
->
-       :ScreenYank
->
-and the Screen buffer is at your disposal in the |screen_register|.  Similar
-to |:yank| you can also execute the command with an explicit register
-argument.
-
-Note: Screen's copy mechanism discards spaces at the end and the beginning of
-a selection in case there are printable characters in the same line.  In Vim
-terms one could consider this like selecting 'exclusive', and to get a
-|linewise| "yank" the selection has to span visually more than one line, the
-newline at the end of a visually selected single line is not included.
-
-
-All other commands configure the treatment of the current Screen buffer when
-it is pasted into the command-line.  Please refer to |screen_clmode| and
-|screenpaste-commands| for further information.
-
-
-Mappings:~
-
-In |Insert|, |Replace|, and |Command-line| modes (by default) simply type: >
-       \p
-to paste the current Screen buffer.  In these modes the |screen_register| is
-not changed.
-
-Note: mappings are ignored in Insert mode while |'paste'| is set. But in that
-case Screen's "paste" command (bound to "C-a]" by default) works just fine and
-there's no need to work around this via |'pastetoggle'|.
-
-
-The plugin's mappings for |Normal| and |Visual| mode emulate the non-Ex
-commands |p|, |P|, |gp|, and |gP|:  They put the text of the current Screen
-buffer after or before the cursor, or replace the visual selection with it,
-just as if the unnamed register would contain the current Screen buffer (see
-|screen_register|).
-
-If the Screen buffer is empty they do nothing, the registers stay untouched,
-and only a corresponding message is displayed in the menu.
-
-Note however that the optional initial [count] argument to the original non-Ex
-commands will not work with these mappings (|screenpaste-bugs|).
-
-In their default state the |Normal| and |Visual| mode mappings consist of the
-same letters as the corresponding non-Ex commands with the |mapleader|
-prepended: >
-
-       <Leader>p
-       <Leader>P       (not in Visual)
-       <Leader>gp
-       <Leader>gP      (not in Visual)
-
-For simplicity we use the default |screenpaste-mappings| and the default
-|<Leader>| "\" in the following description.
-
-                                                       *screenpaste-p*
-\p                     Put current Screen buffer after the cursor.
-
-                                                       *screenpaste-P*
-\P                     Put current Screen buffer before the cursor.
-                       Not available in Visual mode.
-
-                                                       *screenpaste-gp*
-\gp                    Like "\p" but leave the cursor after the pasted text.
-
-                                                       *screenpaste-gP*
-\gP                    Like "\P" but leave the cursor after the pasted text.
-                       Not available in Visual mode.
-
-In |Visual| mode we do not need "\P" and "\gP" as "\p" and "\P" have the same
-effect of replacing the Visual selected text with the current Screen buffer.
-
-
-To summarize, supposing the default |<Leader>| "\" and the default
-|screenpaste-mappings| you can type:
->
-       \p  in Normal mode to put Screen buffer after cursor
-       \gp in Normal mode to put Screen buffer after cursor and leave cursor
-               after the end of new text
-       \P  in Normal mode to put Screen buffer before cursor
-       \gP in Normal mode to put Screen buffer before cursor and leave cursor
-               after the end of new text
-       \p  in Visual mode to replace visual selection with Screen buffer
-       \gp in Visual mode to put Screen buffer after cursor and leave cursor
-               after the end of new text
-       \p  in Insert and Replace mode to paste Screen buffer
-       \p  in Command-line-mode to put Screen buffer in command line
-
-==============================================================================
-
-5. Options                                             *screenpaste-options*
-
-g:loaded_screenpaste                                   *loaded_screenpaste*
-
-       This option normally is set by screenpaste to avoid loading the script
-       more than once. But you can use it to get the current script version: >
-               :echo loaded_screenpaste
-<
-       If you want to disable screenpaste, put the following line in your
-       |vimrc|: >
-               let g:loaded_screenpaste = 1
-
-g:screen_executable                                    *screen_executable*
-
-Type           String
-Default Value  'screen'
-
-       Set this option if the name of your GNU Screen executable differs from
-       "screen", or if you like to specify it's full path: >
-               let g:screen_executable = "/usr/local/bin/screen"
-
-g:screen_visualselect                                  *screen_visualselect*
-Type           Boolean
-Default Value  0
-
-        If set to 1 and in Visual mode the text from the Screen buffer is
-        visually selected after the put operation.
-
-g:screen_register                                      *screen_register*
-
-Type           String
-Valid Values   "a-z0-9A-Z
-Default Value  '"'
-
-       The non-Ex put "commands" (mappings) act in a twofold operation when
-       executed in Normal or Visual mode: they yank the Screen buffer into a
-       register in the background, and then put the register into the buffer
-       or command-line.  This variable controls the register that is used for
-       the first part of the operation.  It defaults to the unnamed register
-       "" (|quotequote|).
-
-       Normally you should be fine with the default setting.  But if you
-       prefer to reserve a register of your choice for the Screen buffer you
-       can do so with this option.  Besides the default "", you may choose
-       any named (|quote_alpha|) or numbered (|quote_number|) register.
-       Consult |registers| about their behaviour.
-
-       For a one time operation with a special register the use of
-       |ScreenPut| ex-command and its register argument is recommended.
-
-       Note: Due to the mechanics of the script even a numbered register has
-       to be passed as string, ie. it has to quoted when you set it; eg. >
-               :let g:screen_register = "8"
-<      Note as well that specifying an uppercase letter means that the
-       contents of the Screen buffer will be appended to the register named
-       with the corresponding lowercase character (|quote_alpha|).
-
-g:screen_clmode                                                *screen_clmode*
-
-Type           String
-Valid Values   'search', 'sub', 'noesc'
-Default Value   'search'
-
-       This setting controls how the Screen buffer is treated when pasted in
-       the command line.
-
-       You can change the setting at startup in your |vimrc|: >
-               let g:screen_clmode = "sub"
-<
-       To change its value in a vim session you might want to use one of the
-       |:ScreenCmdlineConf|, |:ScreenSearch|, |:ScreenSub|, |:ScreenNoEsc|
-       commands as they also give a short informative message on how the mode
-       of your choice will act, and prevent you from setting an invalid value.
-
-       Information on the current value and the resulting behaviour is also
-       available via the |:ScreenCmdlineInfo| command.
-
-Modes and their behaviour:
-                                                       *screenpaste-search*
-'search' ~
-       Converts end-of-line to literal '\n'.
-       Escapes characters according to the current setting of 'magic':
-       magic:    [ ] / \ ^ * . ~ $
-       nomagic:    ] / \ ^       $
-
-       Use this mode to search for occurrences of current Screen buffer.
-       Example as typed using default mapleader: >
-               :ScreenSearch
-               :%s/\p/repl/g
-<      If the current Screen buffer is `[hello world.]' and 'magic' is set,
-       the above becomes: >
-               :%s/\[hello world\.\]/repl/g
-<                                                      *screenpaste-sub*
-'sub' ~
-       Converts end-of-line to literal '\r'.
-       Escapes characters according to the current setting of 'magic':
-       magic:    /  \  ~  &
-       nomagic:  /  \
-
-       Use this mode to substitute a pattern with current Screen buffer.
-       Example as typed using default mapleader: >
-               :ScreenSub
-               :%s/pattern/\p/g
-<      If the current Screen buffer is `http://www.vim.org', the above
-       becomes: >
-               :%s/pattern/http:\/\/www.vim.org/g
-<                                                      *screenpaste-noesc*
-'noesc' ~
-       Converts end-of-line to literal '\n'.
-
-       Use this mode to paste current Screen buffer literally into command
-       line.
-
-Vim7:
-       |/|, |?|, |input()|, |:insert|, and |:append| commands are
-       autodetected when not in 'noesc' |screen_clmode|. This means that even
-       when you are in 'sub' mode you can type: >
-               /\p
-<      and this becomes (using above example for 'search'): >
-               /\[hello world\.\]
-<
-       Note: If you paste a Screen buffer containing newlines while in an
-       |:insert| or |:append| but outside a running Screen session the
-       newlines are escaped because we cannot call Screen's paste mechanism
-       without clobbering a parallel Screen session, and Vim would insert
-       <Nul> characters instead (see |NL-used-for-Nul|).
-
-Vim6:
-       For |:insert| and |:append| commands use Screen's "C-a ]"
-
-==============================================================================
-
-6. Changing Mappings                                   *screenpaste-mappings*
-                                                       *ScreenpastePut*
-                                                       *ScreenpasteGPut*
-                                                       *ScreenpastePutBefore*
-                                                       *ScreenpasteGPutBefore*
-
-The right-hand-side |{rhs}| mappings provided by this plugin and the modes in
-which to apply them are: >
-
-       <Plug>ScreenpastePut            Normal, Visual, Insert, Command-line
-       <Plug>ScreenpasteGPut           Normal, Visual
-       <Plug>ScreenpastePutBefore      Normal
-       <Plug>ScreenpasteGPutBefore     Normal
-<
-Use these to customize the default mappings <Leader>p, <Leader>gp, <Leader>P,
-and <Leader>gP to your taste (see |using-<Plug>| and |:map-modes|).
-
-The default mappings would look like this in a |vimrc|:
-
-map  <Leader>p  <Plug>ScreenpastePut           " Normal, Visual mode
-map! <Leader>p  <Plug>ScreenpastePut           " Insert, Command-line mode
-map  <Leader>gp <Plug>ScreenpasteGPut          " Normal, Visual mode
-nmap <Leader>P  <Plug>ScreenpastePutBefore     " Normal mode
-nmap <Leader>gP <Plug>ScreenpasteGPutBefore    " Normal mode
-
-You can tweak them by changing their left-hand-side |{lhs}|.
-
-Normal (put after cursor) and Visual mode:
-                                                       default
-:map   {lhs}   <Plug>ScreenpastePut                      \p
-:map   {lhs}   <Plug>ScreenpasteGPut                     \gp
-
-       Vimrc example: >
-               map  <Leader>P <Plug>ScreenpastePut
-
-Normal mode (put before cursor):
-
-:nmap  {lhs}   <Plug>ScreenpastePutBefore                \P
-:nmap  {lhs}   <Plug>ScreenpasteGPutBefore               \gP
-
-       Vimrc example: >
-               nmap <Leader>I <Plug>ScreenpastePutBefore
-
-Insert and Command-line mode:
-
-:map!  {lhs}   <Plug>ScreenpastePut                      \p
-
-       Vimrc example, to avoid character mappings when inserting: >
-               map! <F7> <Plug>ScreenpastePut
-
-==============================================================================
-
-7. Commands                                            *screenpaste-commands*
-
-                                                       *:ScreenYank*
-:ScreenYank [x]                Yank current Screen buffer into register [x] (default
-                       |screen_register|).
-
-                                                       *:ScreenPut*
-:[line]ScreenPut [x]   Put the text from current Screen buffer after [line]
-                       (default current line) using register [x] (default
-                       |screen_register|).
-
-       You can use this command for instance to append the contents of the
-       Screen buffer to a named register and then paste in one go: >
-               :3 ScreenPut A
-<      puts the contents of register "a and the Screen buffer after line 3.
-
-:[line]ScreenPut! [x]  Put the text from current Screen buffer before [line]
-                       (default current line) using register [x] (default
-                       |screen_register|).
-
-                                                       *:ScreenCmdlineConf*
-:ScreenCmdlineConf {mode}
-                       Tell screenpaste to convert the current Screen
-                       buffer in command-line-mode according to {mode}.
-                       Takes one argument of: "search", "sub", "noesc" (w/o
-                       quotes).
-                       Changes |screen_clmode| accordingly.
-       Example: >
-               :ScreenCmdlineConf noesc
-<
-                                                       *:ScreenCmdlineInfo*
-:ScreenComdlineInfo    Display information on current command-line-mode
-                       behaviour, ie. current |screen_clmode| and what it
-                       does.
-
-                                                       *:ScreenSearch*
-:ScreenSearch          Set |screen_clmode| to 'search'.
-       Equivalent to: >
-               :ScreenCmdlineConf search
-<
-                                                       *:ScreenSub*
-:ScreenSub             Set |screen_clmode| to 'sub'.
-       Equivalent to: >
-               :ScreenCmdlineConf sub
-<
-                                                       *:ScreenNoEsc*
-:ScreenNoEsc           Set |screen_clmode| to 'noesc'.
-       Equivalent to: >
-               :ScreenCmdlineConf noesc
-
-==============================================================================
-
-8. Bugs and Limitations                                        *screenpaste-bugs*
-
-Found no way (yet?) to make optional initial [count] argument work with
-(Normal mode) mappings.
-
-Screen's copy mechanism treats spaces (including newlines) at the beginning or
-the end of a selection in a different manner than Vim's visual yank does.
-
-Screen expands tabs, expect incorrect results if the Screen buffer contains
-tabs.
-
-==============================================================================
-
-Credits                                                        *screenpaste-credits*
-
-Mathieu Clabaut, Guo-Peng Wen  let me steal and tweak the inline
-                               self-install code for this Help document.
-
-==============================================================================
-=== END_DOC
-
-" EOF vim600: set foldmethod=marker:
diff --git a/vim/bundle/screenpaste/plugin/screenpastePlugin.vim b/vim/bundle/screenpaste/plugin/screenpastePlugin.vim
new file mode 100644 (file)
index 0000000..8f85449
--- /dev/null
@@ -0,0 +1,151 @@
+" File:          screenpaste.vim
+" Description:   pastes/inserts current GNU Screen buffer in (almost) any mode
+" Version:       7.0
+" Mercurial:     $Id: screenpastePlugin.vim,v c90c865d65f4 2008-11-15 00:10 +0100 blacktrash $
+" Author:        Christian Ebert <blacktrash@gmx.net>
+" URL:           http://www.vim.org/script.php?script_id=1512
+" Requirements:  GNU Screen must be in $PATH
+" Documentation: in separate file, screenpaste.txt
+"
+" GetLatestVimScripts: 1512 1 :AutoInstall: screenpaste.zip
+
+if exists("g:loaded_screenpaste") || &cp
+  finish
+endif
+let g:loaded_screenpaste = "7.0"
+
+" Init: store 'compatible' settings {{{1
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Run Checks: for Vim version, system() and Screen executable {{{1
+function! s:Screen_CleanUp(msg) " {{{2
+  echohl WarningMsg
+  echomsg "screenpaste:" a:msg "Plugin not loaded"
+  echohl None
+  let g:loaded_screenpaste = "no"
+  let &cpo = s:save_cpo
+  unlet! g:screen_clmode g:screen_executable g:screen_register
+        \ g:screen_visualselect g:screen_wait
+endfunction
+" }}}2
+
+" bail out if not Vim7 or greater
+if v:version < 700
+  call <SID>Screen_CleanUp("Vim7 or greater required.")
+  finish
+endif
+
+" bail out if system() is not available
+if !exists("*system")
+  call <SID>Screen_CleanUp("builtin system() function not available.")
+  finish
+endif
+
+" g:screen_executable: name of GNU Screen executable
+if !exists("g:screen_executable")
+  let g:screen_executable = "screen"
+endif
+" bail out if GNUscreen is not present
+if !executable(g:screen_executable)
+  call <SID>Screen_CleanUp("`".g:screen_executable."' not executable.")
+  finish
+endif
+
+" More Global Variables: {{{1
+function! s:Screen_Default(val,cur,def) " {{{2
+  echomsg "screenpaste: `".a:cur."':"
+        \ "invalid value for screen_clmode."
+        \ "Reset to '".a:def."' (default)"
+  execute "let" a:val "= '".a:def."'"
+endfunction
+" }}}2
+
+" g:screen_clmode: how screenpaste behaves in Vim's command-line
+if !exists("g:screen_clmode")
+  let g:screen_clmode = "search"
+elseif g:screen_clmode !~# '^\%(s\%(earch\|ub\)\|noesc\)$'
+  call <SID>Screen_Default("g:screen_clmode",g:screen_clmode,"search")
+endif
+
+" g:screen_register: instead of register "0 use this one
+if !exists("g:screen_register")
+  let g:screen_register = '"'
+elseif g:screen_register !~ '^["0-9a-zA-Z]$'
+  call <SID>Screen_Default("g:screen_register",g:screen_register,'"')
+endif
+
+" g:screen_visualselect: select area after paste in visual mode
+if !exists("g:screen_visualselect")
+  let g:screen_visualselect = 0
+endif
+
+" g:screen_wait: how long to wait for Screen to write exchange file
+if !exists("g:screen_wait")
+  let g:screen_wait = "333m"
+elseif g:screen_wait !~# '^\d\+m\?$'
+  call <SID>Screen_Default("g:screen_wait",g:screen_wait,"333m")
+endif
+
+" Mappings: propose defaults {{{1
+if !hasmapto("<Plug>ScreenpastePut") " nvo
+  map  <unique> <Leader>p <Plug>ScreenpastePut
+endif
+if !hasmapto("<Plug>ScreenpasteGPut") " nvo
+  map  <unique> <Leader>gp <Plug>ScreenpasteGPut
+endif
+if !hasmapto("<Plug>ScreenpastePutBefore", "n")
+  nmap <unique> <Leader>P <Plug>ScreenpastePutBefore
+endif
+if !hasmapto("<Plug>ScreenpasteGPutBefore", "n")
+  nmap <unique> <Leader>gP <Plug>ScreenpasteGPutBefore
+endif
+if !hasmapto("<Plug>ScreenpastePut", "ic")
+  map! <unique> <Leader>p <Plug>ScreenpastePut
+endif
+
+" Internal Mappings: {{{1
+nnoremap <script> <silent> <Plug>ScreenpastePut
+      \ :call screenpaste#Screen_NPut("p")<CR>
+nnoremap <script> <silent> <Plug>ScreenpasteGPut
+      \ :call screenpaste#Screen_NPut("gp")<CR>
+nnoremap <script> <silent> <Plug>ScreenpastePutBefore
+      \ :call screenpaste#Screen_NPut("P")<CR>
+nnoremap <script> <silent> <Plug>ScreenpasteGPutBefore
+      \ :call screenpaste#Screen_NPut("gP")<CR>
+vnoremap <script> <silent> <Plug>ScreenpastePut
+      \ :<C-U> call screenpaste#Screen_VPut("")<CR>
+vnoremap <script> <silent> <Plug>ScreenpasteGPut
+      \ :<C-U> call screenpaste#Screen_VPut("g")<CR>
+inoremap <script> <silent> <Plug>ScreenpastePut
+      \ <C-R>=screenpaste#Screen_IPut()<CR><C-R>=screenpaste#Screen_TwRestore()<CR>
+cnoremap <script>          <Plug>ScreenpastePut
+      \ <C-R>=screenpaste#Screen_CPut()<CR>
+
+" Commands: {{{1
+" configuration for command-line-mode
+command -nargs=1 -complete=custom,screenpaste#Screen_ClCfgComplete
+      \ ScreenCmdlineConf call screenpaste#Screen_ClConfig(<f-args>, 1)
+command ScreenCmdlineInfo call screenpaste#Screen_ClConfig(g:screen_clmode, 1)
+command ScreenSearch      call screenpaste#Screen_ClConfig("search", 1)
+command ScreenSub         call screenpaste#Screen_ClConfig("sub", 1)
+command ScreenNoEsc       call screenpaste#Screen_ClConfig("noesc", 1)
+" yank Screen buffer into register (default: screen_register)
+command -register ScreenYank call screenpaste#Screen_Yank("<register>")
+" buffer operation
+command -count=0 -bang -register ScreenPut
+      \ call screenpaste#Screen_PutCommand("<count>", "<bang>", "<register>")
+
+" }}}1
+" Finale: cleanup and restore 'compatible' settings {{{1
+
+" Purge Functions that have done their one-time duty
+delfunction <SID>Screen_CleanUp
+delfunction <SID>Screen_Default
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+finish
+" }}}1
+" EOF vim600: set foldmethod=marker: