screenからの貼り付け2

修正した。
screen -X writebuf fileでfileに出力し、
"レジスタに保存して"でペースト。
"レジスタを元の値に戻すという感じ。
ついでにplugin化してみた。

if &cp || (exists('g:loaded_pastescreen') && g:loaded_pastescreen)
  finish
endif


let g:loaded_pastescreen = 1
if !exists('g:pastescreen_screen_path')
  let g:pastescreen_screen_path = 'screen'
endif


let s:tempreg = '"'
let s:ostr = ''
let s:otype = ''


" functions
function! s:read_file(fn)
  try
    return join(readfile(a:fn, "b"), "\n")
  catch
    return ""
  endtry
endfunction

function! s:read_copybuffer()
  let tmpfile = tempname()
  call system(g:pastescreen_screen_path . ' -X writebuf ' . tmpfile)
  let str = s:read_file(tmpfile)
  call delete(tmpfile)
  return str
endfunction

function! s:paste_text()
  let str = s:read_copybuffer()
  let s:ostr = getreg(s:tempreg)
  let s:otype = getregtype(s:tempreg)
  call setreg(s:tempreg, str)
  return "\<C-R>\<C-O>" . s:tempreg
endfunction

function! s:restore_register()
  call setreg(s:tempreg, s:ostr, s:otype)
  return ''
endfunction


"map
inoremap <silent> <Plug>IPasteScreen <C-R>=<SID>paste_text()<CR><C-R>=<SID>restore_register()<CR>

imap <C-J> <Plug>IPasteScreen

これを.vim/pluginに保存。



作ってからvim.orgで発見したのが以下。
screenpaste.vim - pastes current GNU screen buffer in (almost) any mode : vim online
こっちのほうが高機能です。
軽くソースみた感じだと、レジスタが汚染されるのかな?


まあ、vimscriptの勉強になったので。