"============================================================================= " FILE: file_base.vim " AUTHOR: Shougo Matsushita " License: MIT license {{{ " Permission is hereby granted, free of charge, to any person obtaining " a copy of this software and associated documentation files (the " "Software"), to deal in the Software without restriction, including " without limitation the rights to use, copy, modify, merge, publish, " distribute, sublicense, and/or sell copies of the Software, and to " permit persons to whom the Software is furnished to do so, subject to " the following conditions: " " The above copyright notice and this permission notice shall be included " in all copies or substantial portions of the Software. " " THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS " OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF " MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. " IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY " CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, " TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE " SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. " }}} "============================================================================= let s:save_cpo = &cpo set cpo&vim " Variables "{{{ if !exists('g:unite_kind_file_preview_max_filesize') let g:unite_kind_file_preview_max_filesize = 1000000 endif "}}} function! unite#kinds#file_base#define() abort "{{{ return s:kind endfunction"}}} let s:kind = { \ 'name' : 'file_base', \ 'default_action' : 'open', \ 'action_table' : {}, \ 'parents' : [], \} " Actions "{{{ let s:kind.action_table.open = { \ 'description' : 'open files', \ 'is_selectable' : 1, \ } function! s:kind.action_table.open.func(candidates) abort "{{{ for candidate in a:candidates if buflisted(candidate.action__path) execute 'buffer' bufnr(candidate.action__path) else call s:execute_command('edit', candidate) if isdirectory(candidate.action__path) \ && exists('g:loaded_vimfiler') \ && get(g:, 'vimfiler_as_default_explorer', 0) call vimfiler#handler#_event_handler('BufReadCmd') endif endif call unite#remove_previewed_buffer_list(bufnr(candidate.action__path)) endfor endfunction"}}} let s:kind.action_table.preview = { \ 'description' : 'preview file', \ 'is_quit' : 0, \ } function! s:kind.action_table.preview.func(candidate) abort "{{{ let buflisted = buflisted(a:candidate.action__path) if !filereadable(a:candidate.action__path) return endif if getfsize(a:candidate.action__path) > \ g:unite_kind_file_preview_max_filesize call unite#print_error(printf( \ 'The file size of "%s" is too huge.' , \ a:candidate.action__path)) return endif " If execute this command, unite.vim will be affected by events. call unite#view#_preview_file(a:candidate.action__path) let winnr = winnr() wincmd P try if !buflisted call unite#add_previewed_buffer_list(bufnr('%')) endif finally execute winnr.'wincmd w' endtry endfunction"}}} let s:kind.action_table.mkdir = { \ 'description' : 'make this directory and parents directory', \ 'is_quit' : 0, \ 'is_invalidate_cache' : 1, \ } function! s:kind.action_table.mkdir.func(candidate) abort "{{{ let dirname = input('New directory name: ', \ a:candidate.action__path, 'dir') redraw if dirname == '' echo 'Canceled.' return endif if filereadable(dirname) || isdirectory(dirname) echo dirname . ' is already exists.' elseif !unite#util#is_sudo() call mkdir(dirname, 'p') endif endfunction"}}} let s:kind.action_table.rename = { \ 'description' : 'rename files', \ 'is_quit' : 0, \ 'is_invalidate_cache' : 1, \ 'is_selectable' : 1, \ } function! s:kind.action_table.rename.func(candidates) abort "{{{ for candidate in a:candidates let filename = unite#util#substitute_path_separator( \ unite#util#expand(input(printf('New file name: %s -> ', \ candidate.action__path), candidate.action__path))) redraw if filename != '' && filename !=# candidate.action__path call unite#kinds#file#do_rename(candidate.action__path, filename) endif endfor endfunction"}}} let s:kind.action_table.backup = { \ 'description' : 'backup files', \ 'is_quit' : 0, \ 'is_invalidate_cache' : 1, \ 'is_selectable' : 1, \ } function! s:kind.action_table.backup.func(candidates) abort "{{{ for candidate in a:candidates let filename = candidate.action__path . '.' . strftime('%y%m%d_%H%M') call unite#sources#file#copy_files(filename, [candidate]) endfor endfunction"}}} let s:kind.action_table.read = { \ 'description' : ':read files', \ 'is_selectable' : 1, \ } function! s:kind.action_table.read.func(candidates) abort "{{{ for candidate in a:candidates call s:execute_command('read', candidate) endfor endfunction"}}} let s:kind.action_table.wunix = { \ 'description' : 'write by unix fileformat', \ 'is_selectable' : 1, \ } function! s:kind.action_table.wunix.func(candidates) abort "{{{ let current_bufnr = bufnr('%') for candidate in a:candidates let is_listed = buflisted(candidate.action__path) call s:kind.action_table.open.func([candidate]) write ++fileformat=mac if is_listed call s:kind.action_table.open.func([candidate]) else let bufnr = bufnr(candidate.action__path) silent execute bufnr 'bdelete' endif endfor execute 'buffer' current_bufnr endfunction"}}} let s:kind.action_table.diff = { \ 'description' : 'diff with the other candidate or current buffer', \ 'is_selectable' : 1, \ } function! s:kind.action_table.diff.func(candidates) abort "{{{ if !empty(filter(copy(a:candidates), 'isdirectory(v:val.action__path)')) echo 'Invalid files.' return endif if len(a:candidates) == 1 " :vimdiff with current buffer. let winnr = winnr() if &filetype ==# 'vimfiler' " Move to other window. wincmd w endif try " Use selected candidates or current buffer. if &filetype ==# 'vimfiler' let file = get(vimfiler#get_marked_files( \ b:vimfiler), 0, vimfiler#get_file(b:vimfiler)) if empty(file) || isdirectory(file.action__path) echo 'Invalid candidate is detected.' return elseif len(vimfiler#get_marked_files(b:vimfiler)) > 1 echo 'Too many candidates!' return endif let path = file.action__path else let path = bufname('%') endif finally if winnr() != winnr " Restore window. execute winnr.'wincmd w' endif endtry execute 'tabnew' path let t:title = 'vimdiff' call s:execute_command('vert diffsplit', a:candidates[0]) elseif len(a:candidates) == 2 " :vimdiff the other candidate. call s:execute_command('tabnew', a:candidates[0]) let t:title = 'vimdiff' call s:execute_command('vert diffsplit', a:candidates[1]) else echo 'Too many candidates!' endif endfunction"}}} let s:kind.action_table.dirdiff = { \ 'description' : ':DirDiff with the other candidate', \ 'is_selectable' : 1, \ } function! s:kind.action_table.dirdiff.func(candidates) abort "{{{ if !exists(':DirDiff') echo 'DirDiff.vim is not installed.' return endif if len(a:candidates) != 2 echo 'Candidates must be 2.' else " :DirDiff the other candidate. tabnew let t:title = 'DirDiff' execute 'DirDiff' unite#helper#get_candidate_directory(a:candidates[0]) \ unite#helper#get_candidate_directory(a:candidates[1]) endif endfunction"}}} " For grep. let s:kind.action_table.grep = { \ 'description': 'grep this file', \ 'is_selectable': 1, \ 'is_start' : 1, \ } function! s:kind.action_table.grep.func(candidates) abort "{{{ call unite#start_script([ \ ['grep', join(map(copy(a:candidates), 'v:val.action__path'), "\n"), \ ]], { 'no_quit' : 1, 'no_empty' : 1 }) endfunction "}}} " For vimgrep let s:kind.action_table.vimgrep = { \ 'description': 'vimgrep this files', \ 'is_selectable': 1, \ 'is_start' : 1, \ } function! s:kind.action_table.vimgrep.func(candidates) abort "{{{ call unite#start_script([ \ ['vimgrep', join(map(copy(a:candidates), \ 'substitute(v:val.action__path, "/$", "", "g")'), "\n"), \ ]], { 'no_quit' : 1 }) endfunction "}}} " For find. let s:kind.action_table.find = { \ 'description': 'find this directory', \ 'is_start' : 1, \ } function! s:kind.action_table.find.func(candidate) abort "{{{ call unite#start_script([['find', \ unite#helper#get_candidate_directory(a:candidate)]], \ {'no_quit' : 1}) endfunction "}}} let s:kind.action_table.argadd = { \ 'description' : 'add candidates into the argument list', \ 'is_selectable' : 1, \ } function! s:kind.action_table.argadd.func(candidates) abort "{{{ for candidate in a:candidates execute 'argadd' fnameescape(candidate.action__path) endfor endfunction"}}} "}}} function! s:execute_command(command, candidate) abort "{{{ let dir = unite#util#path2directory( \ unite#util#expand(a:candidate.action__path)) " Auto make directory. if dir !~ '^\a\+:' && !isdirectory(dir) && !unite#util#is_sudo() \ && unite#util#input_yesno( \ printf('"%s" does not exist. Create?', dir)) call mkdir(dir, 'p') endif call unite#util#smart_execute_command( \ a:command, unite#util#expand( \ fnamemodify(a:candidate.action__path, ':~:.'))) endfunction"}}} " For exrename let s:kind.action_table.exrename = { \ 'description': 'bulk rename files', \ 'is_quit': 1, \ 'is_invalidate_cache': 1, \ 'is_selectable': 1, \ } function! s:kind.action_table.exrename.func(candidates) abort "{{{ let context = unite#get_context() let buffer_name = context.buffer_name if buffer_name ==# 'default' let buffer_name = 'unite' endif call unite#exrename#create_buffer(a:candidates, { \ 'buffer_name': buffer_name, \}) endfunction"}}} let &cpo = s:save_cpo unlet s:save_cpo " vim: foldmethod=marker