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

screenからの貼り付け

pasteモードに移行し、GNU screenのC-a ] をして、pasteモードを解除するだけ。
クリップボードからの貼り付けを改良して作成。

function! PasteTextFromScreen()
  let oldpaste = &paste
  try
    set paste
    silent execute '!screen -X eval "paste ."'
  finally
    let &paste = oldpaste
  endtry
endfunction
"なんとなくCTRL-Jに割り当て
inoremap <silent> <C-J> <C-O>:call PasteTextFromScreen()<CR>

imapしかないのは理由があって、

nnoremap <silent> <C-J> i<C-O>:call PasteTextFromScreen()<CR><Esc>

としてみたけど、うまく動かなかったから。
どうすればいいのかな。

クリップボードからの貼り付け

*追記(2008.10.22)*
コメントでka-nachtさんより教えていただいた方法がすばらしいです。
以下はお勧めできません。

windowsだとgvim使っているのですが、クリップボードにコピーした文字列を貼り付けるときに
毎回:se pasteして:se nopasteするのは無駄ではないかと思いまして。
vimscriptがあるんだから使えばいいじゃないかと思いまして。
こんなの作ってみました。

" クリップボードからペースト
function! PasteTextFromClipboard()
  let oldpaste = &paste

  try
    set paste
    silent execute 'normal! "+gP'
  finally
    let &paste = oldpaste
  endtry
endfunction
nnoremap <silent> <M-v> :call PasteTextFromClipboard()<CR>
inoremap <silent> <M-v> <C-O>:call PasteTextFromClipboard()<CR>
vnoremap <silent> <M-v> "-c<C-O>:call PasteTextFromClipboard()<CR><ESC>l
cnoremap <silent> <M-v> <C-R>+
" クリップボードへコピー
vmap <M-c> "+y
" クリップボードへ切り取り
vmap <M-x> "+d

初vimscrip。

matchparen.vim

{}とかにカーソルを当てると対応する括弧がハイライトされるやつなのですが。
これ、vim7からデフォルトで入っている(わかんないですけど)と思いますが、正直うざいです。
:NoMatchParenとすると消えますが、毎回やってられないので.vimrcに以下を記述するようにしました。
let g:loaded_matchparen = 1
しかし、これをやってしまうと:DoMatchParenできなくなる罠。
でも気にしない。

surround.vim

結構前にインストールしてから更新していなかったので、
最新版に更新してみました。
repeat.vimをインストールすると cs" とかが.コマンドで
再度実行してくれるようになっていて便利に!
surround.vim - Delete/change/add parentheses/quotes/XML-tags/much more with ease : vim online
repeat.vim - Use the repeat command (.) with supported plugins : vim online