Webtech Walker

Macのvimでクリップボードにコピーするoperator

下記の様に書けばクリップボードにコピーできるのですが、行単位じゃないとコピーできないし、オペレーターとして使えないのが若干不便です。

nnoremap <silent> <Space>y :.w !pbcopy<CR><CR>
vnoremap <silent> <Space>y :w !pbcopy<CR><CR>
nnoremap <silent> <Space>p :r !pbpaste<CR>
vnoremap <silent> <Space>p :r !pbpaste<CR>

なのでクリップボードにコピーするためのオペレーターを定義しました。pbcopyを使うのでMac限定です。

" Macでクリップボードにコピーするoperator
if has('mac')
    function! Pbcopy(type, ...)
        let reg_save = @@
        if a:0
            silent execute "normal! `<" . a:type . "`>y"
        elseif a:type == 'line'
            silent execute "normal! '[V']y"
        elseif a:type == 'block'
            silent execute "normal! `[\<C-V>`]y"
        else
            silent execute "normal! `[v`]y"
        endif
        call system('iconv -f utf-8 -t shift-jis | pbcopy', @@)
        let @@ = reg_save
    endfunction
    nnoremap <silent> <Space>y :<C-u>set opfunc=Pbcopy<CR>g@
    nnoremap <silent> <Space>yy :<C-u>set opfunc=Pbcopy<CR>g@g@
    vnoremap <silent> <Space>y :<C-u>call Pbcopy(visualmode(), 1)<CR>
    nnoremap <silent> <Space>p :<C-u>r !pbpaste<CR>
endif

日本語はsjisじゃないとダメらしいのでsjisに変換してます。あと、最初からイントールされているscreen上ではpbcopy使えないのでscreenをパッチ当ててインストールしないとダメです。

追記: faceclip.vimを使おう!

fakeclip - pseudo clipboard register for non-GUI version of Vim : vim online

このエントリーをはてなブックマークに追加