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。
相性
vimperatorはすごく良いんだけど、
livedoor readerやgmailとは相性悪いですね。
良い方法はないかなぁ。
追記:
[I]キーを押せば良いということが判明。
素晴らしい。
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