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の勉強になったので。