1
0
mirror of https://github.com/amix/vimrc synced 2025-02-28 14:12:51 +08:00
amix-vimrc-mirror/sources_forked/vim-system-copy/plugin/system_copy.vim

112 lines
3.0 KiB
VimL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

if exists('g:loaded_system_copy') || v:version < 700
finish
endif
let g:loaded_system_copy = 1
let s:blockwise = 'blockwise visual'
let s:visual = 'visual'
let s:motion = 'motion'
let s:linewise = 'linewise'
let s:mac = 'mac'
let s:windows = 'windows'
let s:linux = 'linux'
function! s:system_copy(type, ...) abort
let mode = <SID>resolve_mode(a:type, a:0)
if mode == s:linewise
let lines = { 'start': line("'["), 'end': line("']") }
silent exe lines.start . "," . lines.end . "y"
elseif mode == s:visual || mode == s:blockwise
silent exe "normal! `<" . a:type . "`>y"
else
silent exe "normal! `[v`]y"
endif
let command = s:CopyCommandForCurrentOS()
silent call system(command, getreg('@'))
echohl String | echon 'Copied to clipboard using: ' . command | echohl None
endfunction
function! s:system_paste() abort
let command = <SID>PasteCommandForCurrentOS()
put =system(command)
echohl String | echon 'Pasted to vim using: ' . command | echohl None
endfunction
function! s:resolve_mode(type, arg)
let visual_mode = a:arg != 0
if visual_mode
return (a:type == '') ? s:blockwise : s:visual
elseif a:type == 'line'
return s:linewise
else
return s:motion
endif
endfunction
function! s:currentOS()
let os = substitute(system('uname'), '\n', '', '')
let known_os = 'unknown'
if has("gui_mac") || os ==? 'Darwin'
let known_os = s:mac
elseif has("gui_win32")
let known_os = s:windows
elseif os ==? 'Linux'
let known_os = s:linux
else
exe "normal \<Esc>"
throw "unknown OS: " . os
endif
return known_os
endfunction
function! s:CopyCommandForCurrentOS()
if exists('g:system_copy#copy_command')
return g:system_copy#copy_command
endif
let os = <SID>currentOS()
if os == s:mac
return 'pbcopy'
elseif os == s:windows
return 'clip'
elseif os == s:linux
return 'xsel --clipboard --input'
endif
endfunction
function! s:PasteCommandForCurrentOS()
if exists('g:system_copy#paste_command')
return g:system_copy#paste_command
endif
let os = <SID>currentOS()
if os == s:mac
return 'pbpaste'
elseif os == s:windows
return 'paste'
elseif os == s:linux
return 'xsel --clipboard --output'
endif
endfunction
xnoremap <silent> <Plug>SystemCopy :<C-U>call <SID>system_copy(visualmode(),visualmode() ==# 'V' ? 1 : 0)<CR>
nnoremap <silent> <Plug>SystemCopy :<C-U>set opfunc=<SID>system_copy<CR>g@
nnoremap <silent> <Plug>SystemCopyLine :<C-U>set opfunc=<SID>system_copy<Bar>exe 'norm! 'v:count1.'g@_'<CR>
nnoremap <silent> <Plug>SystemPaste :<C-U>call <SID>system_paste()<CR>
if !hasmapto('<Plug>SystemCopy', 'n') || maparg('cp', 'n') ==# ''
nmap cp <Plug>SystemCopy
endif
if !hasmapto('<Plug>SystemCopy', 'v') || maparg('cp', 'v') ==# ''
xmap cp <Plug>SystemCopy
endif
if !hasmapto('<Plug>SystemCopyLine', 'n') || maparg('cP', 'n') ==# ''
nmap cP <Plug>SystemCopyLine
endif
if !hasmapto('<Plug>SystemPaste', 'n') || maparg('cv', 'n') ==# ''
nmap cv <Plug>SystemPaste
endif
" vim:ts=2:sw=2:sts=2