"============================================================================= " FILE: mappings.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. " }}} "============================================================================= scriptencoding utf-8 let s:Cache = vimfiler#util#get_vital_cache() function! s:SID_PREFIX() abort return matchstr(expand(''), '\d\+_\zeSID_PREFIX$') endfunction function! vimfiler#mappings#define_default_mappings(context) abort "{{{ " Plugin keymappings "{{{ nnoremap (vimfiler_loop_cursor_down) \ (line('.') == line('$'))? \ (vimfiler#get_file_offset(b:vimfiler)+1).'Gzb' : 'j' nnoremap (vimfiler_loop_cursor_up) \ (line('.') == 1)? ":call \cursor_bottom()\" : 'k' nnoremap (vimfiler_redraw_screen) \ :call vimfiler#force_redraw_screen(1) nnoremap (vimfiler_toggle_mark_current_line) \ :call toggle_mark_current_line('j') nnoremap (vimfiler_toggle_mark_current_line_up) \ :call toggle_mark_current_line('k') vnoremap (vimfiler_toggle_mark_selected_lines) \ :call toggle_mark_lines(getpos("'<")[1], getpos("'>")[1]) nnoremap (vimfiler_toggle_mark_all_lines) \ :call toggle_mark_all_lines() nnoremap (vimfiler_mark_similar_lines) \ :call mark_similar_lines() nnoremap (vimfiler_clear_mark_all_lines) \ :call clear_mark_all_lines(b:vimfiler) nnoremap (vimfiler_mark_current_line) \ :call mark_current_line() nmap (vimfiler_cd_or_edit) \ vimfiler#mappings#smart_cursor_map( \ "\(vimfiler_cd_file)", \ "\(vimfiler_edit_file)") nmap (vimfiler_expand_or_edit) \ vimfiler#mappings#smart_cursor_map( \ "\(vimfiler_expand_tree)", \ "\(vimfiler_edit_file)") nnoremap (vimfiler_execute_system_associated) \ :call execute_system_associated() nnoremap (vimfiler_execute_vimfiler_associated) \ :call execute_vimfiler_associated() nnoremap (vimfiler_switch_to_parent_directory) \ :call vimfiler#mappings#cd('..') nnoremap (vimfiler_switch_to_home_directory) \ :call vimfiler#mappings#cd('file:~') nnoremap (vimfiler_switch_to_root_directory) \ :call vimfiler#mappings#cd('file:/') nnoremap (vimfiler_switch_to_project_directory) \ :call vimfiler#mappings#cd_project() nnoremap (vimfiler_switch_to_drive) \ :call switch_to_drive() nnoremap (vimfiler_switch_to_history_directory) \ :call switch_to_history_directory() nnoremap (vimfiler_toggle_visible_ignore_files) \ :call toggle_visible_ignore_files() nmap (vimfiler_toggle_visible_dot_files) \ (vimfiler_toggle_visible_ignore_files) nnoremap (vimfiler_popup_shell) \ :call popup_shell() nnoremap (vimfiler_edit_file) \ :call vimfiler#mappings#do_switch_action( \ b:vimfiler, b:vimfiler.context.edit_action) nnoremap (vimfiler_split_edit_file) \ :call split_edit_file() nnoremap (vimfiler_edit_binary_file) \ :call edit_binary_file() nnoremap (vimfiler_execute_external_filer) \ :call execute_external_filer() nnoremap (vimfiler_execute_shell_command) \ :call execute_shell_command() nnoremap (vimfiler_hide) \ :call vimfiler#util#hide_buffer() nnoremap (vimfiler_exit) \ :call exit(b:vimfiler) nnoremap (vimfiler_close) \ :call close(b:vimfiler) nnoremap (vimfiler_help) \ :call help() nnoremap (vimfiler_preview_file) \ :call vimfiler#mappings#do_action( \ b:vimfiler, b:vimfiler.context.preview_action) nnoremap (vimfiler_sync_with_current_vimfiler) \ :call sync_with_current_vimfiler() nnoremap (vimfiler_sync_with_another_vimfiler) \ :call sync_with_another_vimfiler() nnoremap (vimfiler_open_file_in_another_vimfiler) \ :call open_file_in_another_vimfiler() nnoremap (vimfiler_print_filename) \ :call print_filename() nnoremap (vimfiler_toggle_maximize_window) \ :call toggle_maximize_window() nnoremap (vimfiler_yank_full_path) \ :call yank_full_path() nnoremap (vimfiler_set_current_mask) \ :call set_current_mask() nnoremap (vimfiler_grep) \ :call grep() nnoremap (vimfiler_find) \ :call find() nnoremap (vimfiler_select_sort_type) \ :call select_sort_type() nnoremap (vimfiler_switch_to_other_window) \ :call switch_to_other_window() nnoremap (vimfiler_switch_to_another_vimfiler) \ :call switch_to_another_vimfiler() nnoremap (vimfiler_switch_vim_buffer_mode) \ :call switch_vim_buffer_mode() nnoremap (vimfiler_restore_vimfiler_mode) \ :call restore_vimfiler_mode() nmap (vimfiler_cd) \ (vimfiler_cd_vim_current_dir) nnoremap (vimfiler_cd_vim_current_dir) \ :call vimfiler#mappings#_change_vim_current_dir() nnoremap (vimfiler_cd_file) \ :call cd_file_directory() nnoremap (vimfiler_choose_action) \ :call choose_action() nnoremap (vimfiler_toggle_safe_mode) \ :call toggle_safe_mode() nnoremap (vimfiler_toggle_simple_mode) \ :call toggle_simple_mode() nnoremap (vimfiler_pushd) \ :call pushd() nnoremap (vimfiler_popd) \ :call popd() nmap (vimfiler_smart_h) \ (check_opened() ? \ "\(vimfiler_unexpand_tree)" : \ "\(vimfiler_switch_to_parent_directory)") if a:context.explorer nmap (vimfiler_smart_l) \ (vimfiler_expand_or_edit) else nmap (vimfiler_smart_l) \ (vimfiler_cd_or_edit) endif nnoremap (vimfiler_cursor_top) \ (vimfiler#get_file_offset(b:vimfiler)+1).'Gzb' nnoremap (vimfiler_cursor_bottom) \ :call cursor_bottom() nnoremap (vimfiler_expand_tree) \ :call toggle_tree(0) nnoremap (vimfiler_unexpand_tree) \ :call unexpand_tree() nnoremap (vimfiler_expand_tree_recursive) \ :call toggle_tree(1) nnoremap (vimfiler_cd_input_directory) \ :call cd_input_directory() nnoremap (vimfiler_double_click) \ :call on_double_click() nnoremap (vimfiler_quick_look) \ :call quick_look() nnoremap (vimfiler_jump_first_child) \ :call jump_child(1) nnoremap (vimfiler_jump_last_child) \ :call jump_child(0) if b:vimfiler.is_safe_mode call s:unmapping_file_operations() else call s:mapping_file_operations() endif "}}} if exists('g:vimfiler_no_default_key_mappings') \ && g:vimfiler_no_default_key_mappings return endif if a:context.split || !a:context.quit || a:context.explorer " Change default mapping. execute s:nowait_nmap() '' \ '(vimfiler_switch_to_other_window)' else execute s:nowait_nmap() '' \ '(vimfiler_switch_to_another_vimfiler)' endif execute s:nowait_nmap() 'j' \ '(vimfiler_loop_cursor_down)' execute s:nowait_nmap() 'k' \ '(vimfiler_loop_cursor_up)' " Toggle mark. execute s:nowait_nmap() '' \ '(vimfiler_redraw_screen)' execute s:nowait_nmap() '' \ '(vimfiler_toggle_mark_current_line)' execute s:nowait_nmap() '' \ '(vimfiler_toggle_mark_current_line)' execute s:nowait_nmap() '' \ '(vimfiler_toggle_mark_current_line_up)' vmap \ (vimfiler_toggle_mark_selected_lines) " Toggle marks in all lines. execute s:nowait_nmap() '*' \ '(vimfiler_toggle_mark_all_lines)' execute s:nowait_nmap() '#' \ '(vimfiler_mark_similar_lines)' " Clear marks in all lines. execute s:nowait_nmap() 'U' \ '(vimfiler_clear_mark_all_lines)' " Copy files. execute s:nowait_nmap() 'c' \ '(vimfiler_copy_file)' execute s:nowait_nmap() 'Cc' \ '(vimfiler_clipboard_copy_file)' " Move files. execute s:nowait_nmap() 'm' \ '(vimfiler_move_file)' execute s:nowait_nmap() 'Cm' \ '(vimfiler_clipboard_move_file)' " Delete files. execute s:nowait_nmap() 'd' \ '(vimfiler_delete_file)' " Rename. execute s:nowait_nmap() 'r' \ '(vimfiler_rename_file)' " Make directory. execute s:nowait_nmap() 'K' \ '(vimfiler_make_directory)' " New file. execute s:nowait_nmap() 'N' \ '(vimfiler_new_file)' " Paste. execute s:nowait_nmap() 'Cp' \ '(vimfiler_clipboard_paste)' " Execute or change directory. execute s:nowait_nmap() '' \ '(vimfiler_cd_or_edit)' execute s:nowait_nmap() 'o' \ '(vimfiler_expand_or_edit)' execute s:nowait_nmap() 'l' \ '(vimfiler_smart_l)' execute s:nowait_nmap() 'x' \ '(vimfiler_execute_system_associated)' execute s:nowait_nmap() 'X' \ '(vimfiler_execute_vimfiler_associated)' " Move to directory. execute s:nowait_nmap() 'h' \ '(vimfiler_smart_h)' execute s:nowait_nmap() 'L' \ '(vimfiler_switch_to_drive)' execute s:nowait_nmap() '~' \ '(vimfiler_switch_to_home_directory)' execute s:nowait_nmap() '\' \ '(vimfiler_switch_to_root_directory)' execute s:nowait_nmap() '&' \ '(vimfiler_switch_to_project_directory)' execute s:nowait_nmap() '' \ '(vimfiler_switch_to_history_directory)' execute s:nowait_nmap() '' \ '(vimfiler_switch_to_parent_directory)' execute s:nowait_nmap() 'gv' \ '(vimfiler_execute_new_gvim)' execute s:nowait_nmap() '.' \ '(vimfiler_toggle_visible_ignore_files)' execute s:nowait_nmap() 'H' \ '(vimfiler_popup_shell)' " Edit file. execute s:nowait_nmap() 'e' \ '(vimfiler_edit_file)' execute s:nowait_nmap() 'E' \ '(vimfiler_split_edit_file)' execute s:nowait_nmap() 'B' \ '(vimfiler_edit_binary_file)' " Choose action. execute s:nowait_nmap() 'a' \ '(vimfiler_choose_action)' " Hide vimfiler. execute s:nowait_nmap() 'q' \ '(vimfiler_hide)' " Exit vimfiler. execute s:nowait_nmap() 'Q' \ '(vimfiler_exit)' " Close vimfiler. execute s:nowait_nmap() '-' \ '(vimfiler_close)' execute s:nowait_nmap() 'ge' \ '(vimfiler_execute_external_filer)' execute s:nowait_nmap() '' \ '(vimfiler_execute_external_filer)' execute s:nowait_nmap() '!' \ '(vimfiler_execute_shell_command)' execute s:nowait_nmap() 'g?' \ '(vimfiler_help)' execute s:nowait_nmap() 'v' \ '(vimfiler_preview_file)' execute s:nowait_nmap() 'O' \ '(vimfiler_sync_with_current_vimfiler)' execute s:nowait_nmap() 'go' \ '(vimfiler_open_file_in_another_vimfiler)' execute s:nowait_nmap() '' \ '(vimfiler_print_filename)' execute s:nowait_nmap() 'g' \ '(vimfiler_toggle_maximize_window)' execute s:nowait_nmap() 'yy' \ '(vimfiler_yank_full_path)' execute s:nowait_nmap() 'M' \ '(vimfiler_set_current_mask)' execute s:nowait_nmap() 'gr' \ '(vimfiler_grep)' execute s:nowait_nmap() 'gf' \ '(vimfiler_find)' execute s:nowait_nmap() 'S' \ '(vimfiler_select_sort_type)' execute s:nowait_nmap() '' \ '(vimfiler_switch_vim_buffer_mode)' execute s:nowait_nmap() 'gc' \ '(vimfiler_cd_vim_current_dir)' execute s:nowait_nmap() 'gs' \ '(vimfiler_toggle_safe_mode)' execute s:nowait_nmap() 'gS' \ '(vimfiler_toggle_simple_mode)' execute s:nowait_nmap() 'gg' \ '(vimfiler_cursor_top)' execute s:nowait_nmap() 'G' \ '(vimfiler_cursor_bottom)' execute s:nowait_nmap() 't' \ '(vimfiler_expand_tree)' execute s:nowait_nmap() 'T' \ '(vimfiler_expand_tree_recursive)' execute s:nowait_nmap() 'I' \ '(vimfiler_cd_input_directory)' execute s:nowait_nmap() '<2-LeftMouse>' \ '(vimfiler_double_click)' " pushd/popd execute s:nowait_nmap() 'Y' \ '(vimfiler_pushd)' execute s:nowait_nmap() 'P' \ '(vimfiler_popd)' execute s:nowait_nmap() 'gj' \ '(vimfiler_jump_last_child)' execute s:nowait_nmap() 'gk' \ '(vimfiler_jump_first_child)' endfunction"}}} function! s:nowait_nmap() abort "{{{ return 'nmap ' \ . ((v:version > 703 || (v:version == 703 && has('patch1261'))) ? \ '' : '') endfunction "}}} function! vimfiler#mappings#smart_cursor_map(directory_map, file_map) abort "{{{ let filename = vimfiler#get_filename() let file = vimfiler#get_file(b:vimfiler) return filename == '..' || empty(file) \ || file.vimfiler__is_directory ? \ a:directory_map : a:file_map endfunction"}}} function! vimfiler#mappings#do_action(vimfiler, action, ...) abort "{{{ let cursor_linenr = get(a:000, 0, line('.')) let marked_files = vimfiler#get_marked_files(a:vimfiler) if empty(marked_files) let file = vimfiler#get_file(a:vimfiler, cursor_linenr) if empty(file) return endif let marked_files = [ file ] endif return vimfiler#mappings#do_files_action( \ a:vimfiler, a:action, marked_files) endfunction"}}} function! vimfiler#mappings#do_switch_action(vimfiler, action) abort "{{{ let current_linenr = line('.') call s:switch() let context = a:vimfiler.context if !context.force_quit \ && context.quit && buflisted(context.alternate_buffer) \ && getbufvar(context.alternate_buffer, '&filetype') !=# 'vimfiler' \ && g:vimfiler_restore_alternate_file silent! execute 'buffer' context.alternate_buffer endif call vimfiler#mappings#do_action(a:vimfiler, a:action, current_linenr) endfunction"}}} function! vimfiler#mappings#do_files_action(vimfiler, action, files, ...) abort "{{{ let context = get(a:000, 0, {}) if !has_key(context, 'vimfiler__current_directory') let context.vimfiler__current_directory = a:vimfiler.current_dir endif let context.unite__is_interactive = 1 call s:clear_mark_all_lines(a:vimfiler) call s:check_force_quit(a:vimfiler, a:action) " Execute action. call unite#mappings#do_action(a:action, a:files, context) endfunction"}}} function! vimfiler#mappings#do_current_dir_action(vimfiler, action, ...) abort "{{{ let context = get(a:000, 0, {}) return vimfiler#mappings#do_dir_action( \ a:vimfiler, a:action, a:vimfiler.current_dir, context) endfunction"}}} function! vimfiler#mappings#do_dir_action(vimfiler, action, directory, ...) abort "{{{ let context = get(a:000, 0, {}) let context.vimfiler__current_directory = a:directory let context.unite__is_interactive = 1 let files = vimfiler#get_marked_files(a:vimfiler) if empty(files) let context.vimfiler__is_dummy = 1 let files = unite#get_vimfiler_candidates( \ [[a:vimfiler.source, a:directory]], context) if empty(files) return endif else let context.vimfiler__is_dummy = 0 endif call s:clear_mark_all_lines(a:vimfiler) call s:check_force_quit(a:vimfiler, a:action) " Execute action. call unite#mappings#do_action(a:action, files, context) endfunction"}}} function! vimfiler#mappings#cd_project(...) abort "{{{ let path = get(a:000, 0, \ vimfiler#util#path2project_directory( \ b:vimfiler.context.path) \ ) call vimfiler#mappings#cd(path) endfunction"}}} function! vimfiler#mappings#cd(dir, ...) abort "{{{ if &filetype !=# 'vimfiler' return endif let save_history = get(a:000, 0, 1) let previous_current_dir = b:vimfiler.current_dir if previous_current_dir =~ '/$' let previous_current_dir = previous_current_dir[: -2] endif " Save current pos. let save_pos = getpos('.') let b:vimfiler.directory_cursor_pos[b:vimfiler.current_dir] = \ deepcopy(save_pos) let prev_dir = b:vimfiler.current_dir if b:vimfiler.source !=# 'file' let prev_dir = b:vimfiler.source . ':' . prev_dir endif let fullpath = vimfiler#helper#_get_cd_path(a:dir) let b:vimfiler.current_dir = fullpath if b:vimfiler.context.auto_cd call vimfiler#mappings#_change_vim_current_dir() endif " Save changed directories. if save_history let histories = vimfiler#get_histories() call add(histories, [bufname('%'), prev_dir]) let max_save = g:vimfiler_max_directories_history > 0 ? \ g:vimfiler_max_directories_history : 10 if len(histories) >= max_save " Get last max_save num elements. let histories = histories[-max_save :] endif call vimfiler#set_histories(histories) endif " Check sort type. let cache_dir = vimfiler#variables#get_data_directory() . '/' . 'sort' let path = b:vimfiler.source.'/'.b:vimfiler.current_dir if s:Cache.filereadable(cache_dir, path) let b:vimfiler.local_sort_type = \ s:Cache.readfile(cache_dir, path)[0] else let b:vimfiler.local_sort_type = b:vimfiler.global_sort_type endif let b:vimfiler.original_files = [] let b:vimfiler.all_files = [] let b:vimfiler.current_files = [] let b:vimfiler.all_files_len = 0 " Redraw. call vimfiler#force_redraw_screen() call s:restore_cursor(a:dir, fullpath, save_pos, \ previous_current_dir) endfunction"}}} function! s:restore_cursor(dir, fullpath, save_pos, previous_current_dir) abort "{{{ " Restore cursor pos. if a:dir ==# '..' " Search previous current directory. let num = 0 let max = len(b:vimfiler.current_files) while num < max let path = b:vimfiler.current_files[num].action__path if path ==# \ b:vimfiler.source.':'.a:previous_current_dir \ || path ==# a:previous_current_dir call cursor(vimfiler#get_line_number(b:vimfiler, num), 1) break endif let num += 1 endwhile elseif has_key(b:vimfiler.directory_cursor_pos, a:fullpath) call setpos('.', b:vimfiler.directory_cursor_pos[a:fullpath]) else call cursor(vimfiler#get_file_offset(b:vimfiler)+1, 0) endif call vimfiler#helper#_set_cursor() endfunction"}}} function! s:cursor_bottom() abort "{{{ if b:vimfiler.all_files_len != len(b:vimfiler.current_files) call vimfiler#view#_redraw_screen(1) endif call cursor(line('$'), 0) endfunction"}}} function! vimfiler#mappings#search_cursor(path) abort "{{{ let max = line('$') let cnt = 1 while cnt <= max let file = vimfiler#get_file(b:vimfiler, cnt) if empty(file) let cnt += 1 continue endif if file.action__path ==# a:path \ || file.action__path . '/' ==# a:path " Move cursor. call cursor(cnt, 0) return 1 elseif file.vimfiler__is_directory \ && stridx(a:path, file.action__path . '/') == 0 \ && !file.vimfiler__is_opened " Expand tree. call cursor(cnt, 0) call s:expand_tree(0) let max = line('$') endif let cnt += 1 endwhile endfunction"}}} function! vimfiler#mappings#close(buffer_name) abort "{{{ let quit_winnr = vimfiler#util#get_vimfiler_winnr(a:buffer_name) if quit_winnr > 0 " Hide unite buffer. call vimfiler#util#winmove(quit_winnr) if winnr('$') != 1 close else call vimfiler#util#alternate_buffer( \ getbufvar(winbufnr(quit_winnr), 'vimfiler').context) endif endif return quit_winnr > 0 endfunction"}}} function! s:switch() abort "{{{ let context = b:vimfiler.context if context.quit return endif let prev_bufnr = bufnr('%') let windows = filter(unite#helper#get_choose_windows(), \ "getwinvar(v:val, '&filetype') !=# 'qf'") if empty(windows) rightbelow vnew elseif len(windows) == 1 call vimfiler#util#winmove(windows[0]) else let alt_winnr = winnr('#') let [tabnr, winnr] = [tabpagenr(), winnr()] let [old_tabnr, old_winnr] = [tabnr, winnr] if exists('g:loaded_choosewin') \ || hasmapto('(choosewin)', 'n') " Use vim-choosewin. let pos = getpos('.') try let choice = choosewin#start(windows, {'noop' : 1}) finally " Note: choosewin with overlay move cursor. call setpos('.', pos) endtry if !empty(choice) let [tabnr, winnr] = choice endif else " Use unite-builtin choose. let winnr = unite#helper#choose_window() endif if tabnr != tabpagenr() execute 'tabnext' tabnr endif if (winnr == 0 || (winnr == old_winnr && tabnr == old_tabnr)) \ && alt_winnr > 0 " Use alternative window let winnr = alt_winnr endif if winnr == 0 || (winnr == old_winnr && tabnr == old_tabnr) rightbelow vnew else call vimfiler#util#winmove(winnr) endif endif call vimfiler#handler#_event_bufwin_enter(prev_bufnr) endfunction"}}} function! s:toggle_mark_current_line(...) abort "{{{ let file = vimfiler#get_file(b:vimfiler) if empty(file) " Don't toggle. return endif let file.vimfiler__is_marked = !file.vimfiler__is_marked let file.vimfiler__marked_time = localtime() try setlocal modifiable setlocal noreadonly call setline('.', vimfiler#view#_get_print_lines([file])) finally setlocal nomodifiable setlocal readonly endtry let map = get(a:000, 0, '') if map == '' return endif if map ==# 'j' if line('.') != line('$') call cursor(line('.') + 1, 0) endif elseif map ==# 'k' if line('.') > 2 call cursor(line('.') - 1, 0) endif else execute 'normal!' map endif endfunction"}}} function! s:mark_current_line() abort "{{{ let file = vimfiler#get_file(b:vimfiler) if empty(file) " Don't toggle. return endif let file.vimfiler__is_marked = 1 let file.vimfiler__marked_time = localtime() try setlocal modifiable setlocal noreadonly call setline('.', vimfiler#view#_get_print_lines([file])) finally setlocal nomodifiable setlocal readonly endtry endfunction"}}} function! s:toggle_mark_all_lines() abort "{{{ for file in b:vimfiler.all_files let file.vimfiler__is_marked = !file.vimfiler__is_marked let file.vimfiler__marked_time = localtime() endfor if b:vimfiler.all_files_len != len(b:vimfiler.current_files) call vimfiler#view#_redraw_screen(1) else call vimfiler#redraw_screen() endif endfunction"}}} function! s:mark_similar_lines() abort "{{{ let file = vimfiler#get_file(b:vimfiler) if empty(file) " Don't toggle. return endif " Get pattern. let idents = [] let pos = 0 let ident = matchstr(file.vimfiler__filename, '\I\+') while ident != '' call add(idents, ident) let pos = matchend(file.vimfiler__filename, '\I\+', pos) let ident = matchstr(file.vimfiler__filename, '\I\+', pos) endwhile let pattern = join(idents, '.\+') for file in filter(copy(b:vimfiler.current_files), \ 'v:val.vimfiler__filename =~# pattern') let file.vimfiler__is_marked = 1 let file.vimfiler__marked_time = localtime() endfor call vimfiler#redraw_screen() endfunction"}}} function! s:toggle_mark_lines(start, end) abort "{{{ let cnt = a:start while cnt <= a:end let file = vimfiler#get_file(b:vimfiler, cnt) if !empty(file) " Toggle mark. let file.vimfiler__is_marked = !file.vimfiler__is_marked let file.vimfiler__marked_time = localtime() endif let cnt += 1 endwhile call vimfiler#redraw_screen() endfunction"}}} function! s:clear_mark_all_lines(vimfiler) abort "{{{ for file in a:vimfiler.current_files let file.vimfiler__is_marked = 0 endfor call vimfiler#redraw_screen() endfunction"}}} function! s:execute_vimfiler_associated() abort "{{{ let vimfiler = b:vimfiler let bufnr = bufnr('%') call s:switch() call unite#start(['vimfiler/execute'], { \ 'immediately' : 1, \ 'buffer_name' : 'vimfiler/execute', \ 'script' : 1, \ 'vimfiler__winnr' : bufwinnr(bufnr), \ }) call s:check_force_quit(vimfiler, '') endfunction"}}} function! s:execute_system_associated() abort "{{{ if empty(vimfiler#get_marked_files(b:vimfiler)) if empty(vimfiler#get_file(b:vimfiler)) call s:execute_external_filer() return endif " Mark current line. call s:toggle_mark_current_line() endif " Execute marked files. call vimfiler#mappings#do_dir_action( \ b:vimfiler, 'vimfiler__execute', b:vimfiler.current_dir) endfunction"}}} function! s:switch_to_other_window() abort "{{{ if winnr('$') != 1 || !exists('b:vimfiler') wincmd w return endif call s:switch_to_another_vimfiler() endfunction"}}} function! s:switch_to_another_vimfiler() abort "{{{ if vimfiler#exists_another_vimfiler() call vimfiler#mappings#switch_another_vimfiler() else " Create another vimfiler. call vimfiler#mappings#create_another_vimfiler() call vimfiler#redraw_all_vimfiler() endif endfunction"}}} function! s:print_filename() abort "{{{ let filename = vimfiler#get_filename() if filename != '..' && empty(vimfiler#get_file(b:vimfiler)) let filename = matchstr(getline('.'), \ ' Current directory: \zs.*\ze[/\\]') endif echo filename endfunction"}}} function! s:yank_full_path() abort "{{{ let filename = join(vimfiler#get_marked_filenames(b:vimfiler), "\n") if filename == '' " Use cursor filename. let filename = vimfiler#get_filename() if filename == '..' || empty(vimfiler#get_file(b:vimfiler)) let filename = b:vimfiler.current_dir else let filename = vimfiler#get_file(b:vimfiler).action__path endif endif let @" = filename if has('clipboard') || has('xterm_clipboard') let @+ = filename endif echo 'Yanked: '.filename endfunction"}}} function! s:toggle_tree(is_recursive) abort "{{{ let file = vimfiler#get_file(b:vimfiler) if empty(file) || vimfiler#get_filename() == '..' if vimfiler#get_filename() == '..' call vimfiler#mappings#cd('..') endif return endif if !file.vimfiler__is_directory " Search parent directory. for cnt in reverse(range(1, line('.')-1)) let nest_level = get(vimfiler#get_file(b:vimfiler, cnt), \ 'vimfiler__nest_level', -1) if (a:is_recursive && nest_level == 0) || \ (!a:is_recursive && \ nest_level >= 0 && nest_level < file.vimfiler__nest_level) call cursor(cnt, 0) call s:toggle_tree(a:is_recursive) break endif endfor return endif if file.vimfiler__is_opened call s:unexpand_tree() else call s:expand_tree(a:is_recursive) endif endfunction"}}} function! s:expand_tree(is_recursive) abort "{{{ let cursor_file = vimfiler#get_file(b:vimfiler) if empty(cursor_file) || vimfiler#get_filename() == '..' if vimfiler#get_filename() == '..' call vimfiler#mappings#cd('..') endif return endif if !cursor_file.vimfiler__is_directory " Search parent directory. for cnt in reverse(range(1, line('.')-1)) let nest_level = get(vimfiler#get_file(b:vimfiler, cnt), \ 'vimfiler__nest_level', -1) if (a:is_recursive && nest_level == 0) || \ (!a:is_recursive && \ nest_level >= 0 && \ nest_level < cursor_file.vimfiler__nest_level) call cursor(cnt, 0) call s:expand_tree(a:is_recursive) break endif endfor return endif if cursor_file.vimfiler__is_opened if a:is_recursive call s:unexpand_tree() endif return endif let cursor_file.vimfiler__is_opened = 1 " Expand tree. let nestlevel = cursor_file.vimfiler__nest_level + 1 if a:is_recursive let original_files = vimfiler#mappings#expand_tree_rec(cursor_file) let files = \ unite#filters#matcher_vimfiler_mask#define().filter( \ copy(original_files), \ { 'input' : b:vimfiler.current_mask }) else let original_files = \ vimfiler#get_directory_files(cursor_file.action__path) for file in original_files " Initialize. let file.vimfiler__nest_level = nestlevel endfor let files = \ unite#filters#matcher_vimfiler_mask#define().filter( \ copy(original_files), \ { 'input' : b:vimfiler.current_mask }) endif if !a:is_recursive && !b:vimfiler.is_visible_ignore_files let files = vimfiler#helper#_call_filters( \ files, b:vimfiler.context) endif let index = vimfiler#get_file_index(b:vimfiler, line('.')) let index_orig = \ vimfiler#get_original_file_index(line('.')) call extend(b:vimfiler.all_files, files, index+1) call extend(b:vimfiler.current_files, files, index+1) call extend(b:vimfiler.original_files, original_files, index_orig+1) let b:vimfiler.all_files_len += len(files) if b:vimfiler.context.auto_expand \ && !a:is_recursive && len(files) == 1 \ && files[0].vimfiler__is_directory " Expand recursive. call cursor(line('.') + 1, 0) call s:expand_tree(a:is_recursive) elseif g:vimfiler_expand_jump_to_first_child && !a:is_recursive \ || b:vimfiler.context.auto_expand " Move to next line. call cursor(line('.') + 1, 0) endif call vimfiler#view#_redraw_screen() endfunction"}}} function! vimfiler#mappings#expand_tree_rec(file, ...) abort "{{{ if get(a:file, 'vimfiler__ftype', '') ==# 'link' " Ignore symbolic link. return [] endif let old_original_files = get(a:000, 0, {}) let a:file.vimfiler__is_opened = 1 " Expand tree. let nestlevel = a:file.vimfiler__nest_level + 1 let files = vimfiler#get_directory_files(a:file.action__path) if !b:vimfiler.is_visible_ignore_files let files = filter(vimfiler#get_directory_files(a:file.action__path), \ "v:val.vimfiler__filename !~ '^\\.'") endif let _ = [] " let is_fold = len(files) == 1 && files[0].vimfiler__is_directory " \ && s:get_abbr_length(a:file, files[0]) " \ < vimfiler#view#_get_max_len([]) let is_fold = 0 if is_fold " Open in cursor directory. let file = files[0] let file.vimfiler__parent = \ !b:vimfiler.context.explorer && \ has_key(a:file, 'vimfiler__parent') ? \ a:file.vimfiler__parent : deepcopy(a:file) let file.vimfiler__abbr = \ a:file.vimfiler__abbr . '/' . file.vimfiler__abbr let file.vimfiler__nest_level = a:file.vimfiler__nest_level for key in keys(file) let a:file[key] = file[key] endfor else " if a:file.vimfiler__abbr =~ './.' " call add(_, a:file) " endif for file in files " Initialize. let file.vimfiler__nest_level = nestlevel endfor endif for file in files if !is_fold call add(_, file) endif if file.vimfiler__is_directory \ && (empty(old_original_files) || \ has_key(old_original_files, file.action__path)) if has_key(old_original_files, file.action__path) call remove(old_original_files, file.action__path) endif let _ += vimfiler#mappings#expand_tree_rec(file, old_original_files) " echomsg string(map(copy(_), 'v:val.action__path')) endif endfor " echomsg string(map(copy(_), 'v:val.action__path')) return _ endfunction"}}} function! s:unexpand_tree() abort "{{{ let cursor_file = vimfiler#get_file(b:vimfiler) if empty(cursor_file) || vimfiler#get_filename() == '..' return endif if !cursor_file.vimfiler__is_directory || \ (!has_key(cursor_file, 'vimfiler__parent') \ && !cursor_file.vimfiler__is_opened) " Search parent directory. for cnt in reverse(range(1, line('.')-1)) let nest_level = get(vimfiler#get_file(b:vimfiler, cnt), \ 'vimfiler__nest_level', -1) if nest_level >= 0 && nest_level < cursor_file.vimfiler__nest_level call cursor(cnt, 0) call s:unexpand_tree() break endif endfor return endif if !cursor_file.vimfiler__is_opened && \ has_key(cursor_file, 'vimfiler__parent') let parent_file = cursor_file.vimfiler__parent let parent_file.vimfiler__is_opened = 0 call remove(cursor_file, 'vimfiler__parent') for key in keys(parent_file) let cursor_file[key] = parent_file[key] endfor endif let cursor_file.vimfiler__is_opened = 0 try setlocal modifiable setlocal noreadonly call setline('.', vimfiler#view#_get_print_lines([cursor_file])) finally setlocal nomodifiable setlocal readonly endtry " Unexpand tree. let nestlevel = cursor_file.vimfiler__nest_level " Search children. let index = vimfiler#get_file_index(b:vimfiler, line('.')) let end = index for cursor_file in b:vimfiler.current_files[index+1 :] if cursor_file.vimfiler__nest_level <= nestlevel break endif let end += 1 endfor if end - index > 0 let index_orig = vimfiler#get_original_file_index(line('.')) let end_orig = index_orig for file in b:vimfiler.original_files[index_orig+1 :] if file.vimfiler__nest_level <= nestlevel break endif let end_orig += 1 endfor " Delete children. let b:vimfiler.all_files = b:vimfiler.all_files[: index] \ + b:vimfiler.all_files[end+1 :] let b:vimfiler.all_files_len += len(b:vimfiler.all_files) let b:vimfiler.current_files = b:vimfiler.current_files[: index] \ + b:vimfiler.current_files[end+1 :] let b:vimfiler.original_files = b:vimfiler.original_files[: index_orig] \ + b:vimfiler.original_files[end_orig+1 :] let pos = getpos('.') call vimfiler#view#_redraw_screen() call setpos('.', pos) endif endfunction"}}} function! s:jump_child(is_first) abort "{{{ if empty(vimfiler#get_file(b:vimfiler)) return endif let max = a:is_first ? b:vimfiler.prompt_linenr : line('$') let cnt = line('.') let file = vimfiler#get_file(b:vimfiler, cnt) let level = file.vimfiler__nest_level while cnt != max let file = vimfiler#get_file(b:vimfiler, cnt) if level > file.vimfiler__nest_level if a:is_first let cnt += 1 else let cnt -= 1 endif break endif if a:is_first let cnt -= 1 else let cnt += 1 endif endwhile if empty(vimfiler#get_file(b:vimfiler, cnt)) if a:is_first let cnt += 1 else let cnt -= 1 endif endif call cursor(cnt, 0) endfunction"}}} function! s:switch_to_drive() abort "{{{ call unite#start(['vimfiler/drive'], \ { 'buffer_name' : 'vimfiler/drive', 'script' : 1 }) endfunction"}}} function! s:switch_to_history_directory() abort "{{{ call unite#start(['vimfiler/history'], \ { 'buffer_name' : 'vimfiler/history', 'script' : 1 }) endfunction"}}} function! s:pushd() abort "{{{ call unite#sources#vimfiler_popd#pushd() endfunction"}}} function! s:popd() abort "{{{ call unite#start(['vimfiler/popd'], \ { 'buffer_name' : 'vimfiler/popd', 'script' : 1 }) endfunction"}}} function! s:toggle_visible_ignore_files() abort "{{{ let b:vimfiler.is_visible_ignore_files = !b:vimfiler.is_visible_ignore_files call vimfiler#redraw_screen() endfunction"}}} function! s:popup_shell() abort "{{{ call vimfiler#mappings#do_current_dir_action( \ b:vimfiler, 'vimfiler__shell', { \ 'vimfiler__files' : vimfiler#get_escaped_marked_files(b:vimfiler), \}) endfunction"}}} function! s:edit_binary_file() abort "{{{ let file = vimfiler#get_file(b:vimfiler) if empty(file) return endif if !exists(':Vinarise') call vimfiler#util#print_error( \ 'vinarise is not found. Please install it.') return endif call s:switch() execute 'Vinarise' escape(vimfiler#get_filename(), ' ') endfunction"}}} function! s:execute_shell_command() abort "{{{ let marked_files = vimfiler#get_marked_files(b:vimfiler) if !empty(marked_files) echo 'Marked files:' echohl Type | echo join(vimfiler#get_marked_filenames( \ b:vimfiler), "\n") | echohl NONE endif let command = input('Input shell command: ', '', 'shellcmd') redraw if command == '' echo 'Cancelled.' return endif let special = matchstr(command, \'\s\+\zs[*?]\ze\%([;|[:space:]]\|$\)') if special == '*' let command = substitute(command, \'\s\+\zs[*]\ze\%([;|[:space:]]\|$\)', \ join(vimfiler#get_escaped_marked_files(b:vimfiler)), 'g') elseif !empty(marked_files) let base_command = command let command = '' for file in vimfiler#get_escaped_marked_files(b:vimfiler) if special == '?' let command .= substitute(base_command, \'\s\+\zs[?]\ze\%([;|[:space:]]\|$\)', file, 'g') . '; ' else let command .= base_command . ' ' . file . '; ' endif endfor endif call vimfiler#mappings#do_current_dir_action( \ b:vimfiler, \ 'vimfiler__shellcmd', { \ 'vimfiler__command' : command, \}) endfunction"}}} function! s:exit(vimfiler) abort "{{{ if !bufexists(a:vimfiler.bufnr) return endif let another_bufnr = a:vimfiler.another_vimfiler_bufnr call vimfiler#util#delete_buffer(a:vimfiler.bufnr) if another_bufnr > 0 " Exit another vimfiler. call vimfiler#util#winmove(bufwinnr(another_bufnr)) call vimfiler#util#delete_buffer(another_bufnr) endif endfunction"}}} function! s:close(vimfiler) abort "{{{ let context = a:vimfiler.context if vimfiler#winnr_another_vimfiler() > 0 " Close current vimfiler. call vimfiler#util#winclose(winnr(), context) call vimfiler#force_redraw_all_vimfiler() elseif winnr('$') != 1 && (context.split || context.toggle) call vimfiler#util#winclose(bufwinnr(a:vimfiler.bufnr), context) else call vimfiler#util#alternate_buffer(context) endif endfunction"}}} function! vimfiler#mappings#create_another_vimfiler() abort "{{{ let current_vimfiler = b:vimfiler let current_bufnr = bufnr('%') let line = line('.') " Create another vimfiler. let original_context = deepcopy(b:vimfiler.context) let context = deepcopy(original_context) if context.split || context.explorer " Note: Horizontal automatically. let context.horizontal = 1 endif if context.reverse " Reverse split direction. let context.horizontal = !context.horizontal endif let context.split = 1 let context.double = 0 let context.create = 1 let context.tab = 0 let context.alternate_buffer = -1 let context.direction = 'belowright' call vimfiler#start( \ current_vimfiler.source.':'. \ current_vimfiler.current_dir, context) " Restore split option. let b:vimfiler.context.split = original_context.split call cursor(line, 0) call vimfiler#helper#_set_cursor() let b:vimfiler.another_vimfiler_bufnr = current_bufnr let current_vimfiler.another_vimfiler_bufnr = bufnr('%') endfunction"}}} function! vimfiler#mappings#switch_another_vimfiler(...) abort "{{{ let directory = get(a:000, 0, '') if vimfiler#winnr_another_vimfiler() > 0 " Switch to another vimfiler window. call vimfiler#util#winmove(vimfiler#winnr_another_vimfiler()) if directory != '' " Change current directory. call vimfiler#mappings#cd(directory) endif else " Open another vimfiler buffer. let current_vimfiler = b:vimfiler let original_context = deepcopy(b:vimfiler.context) let context = deepcopy(original_context) let context.split = 1 let context.double = 0 let context.direction = 'belowright' if context.reverse " Reverse split direction. let context.horizontal = !context.horizontal endif call vimfiler#init#_switch_vimfiler( \ current_vimfiler.another_vimfiler_bufnr, \ context, directory) " Restore split option. let b:vimfiler.context.split = original_context.split endif endfunction"}}} function! s:sync_with_current_vimfiler() abort "{{{ " Search vimfiler window. let line = line('.') if vimfiler#exists_another_vimfiler() " Change another vimfiler directory. call vimfiler#mappings#switch_another_vimfiler( \ b:vimfiler.source . ':' . b:vimfiler.current_dir) call cursor(line, 0) else call vimfiler#mappings#create_another_vimfiler() endif call vimfiler#helper#_set_cursor() wincmd p call cursor(line, 0) call vimfiler#redraw_screen() endfunction"}}} function! s:sync_with_another_vimfiler() abort "{{{ " Search vimfiler window. if vimfiler#exists_another_vimfiler() " Change current vimfiler directory. let another = vimfiler#get_another_vimfiler() call vimfiler#mappings#switch_another_vimfiler() let line = line('.') wincmd p call vimfiler#mappings#cd( \ another.source . ':' . another.current_dir) else call vimfiler#mappings#create_another_vimfiler() let line = line('.') wincmd p call vimfiler#redraw_screen() endif call cursor(line, 0) endfunction"}}} function! s:open_file_in_another_vimfiler() abort "{{{ let vimfiler = b:vimfiler " Search vimfiler window. let files = vimfiler#get_marked_files(vimfiler) if empty(files) let files = [vimfiler#get_file(vimfiler)] endif call s:clear_mark_all_lines(vimfiler) call s:switch_to_other_window() if len(files) > 1 || !files[0].vimfiler__is_directory call vimfiler#mappings#do_files_action( \ vimfiler, vimfiler.context.edit_action, files) else call vimfiler#mappings#cd(files[0].action__path) endif call s:switch_to_other_window() endfunction"}}} function! s:choose_action() abort "{{{ let marked_files = vimfiler#get_marked_files(b:vimfiler) if empty(marked_files) if empty(vimfiler#get_file(b:vimfiler)) return endif let marked_files = [ vimfiler#get_file(b:vimfiler) ] endif call unite#mappings#_choose_action(marked_files, { \ 'vimfiler__current_directory' : b:vimfiler.current_dir, \ }) endfunction"}}} function! s:split_edit_file() abort "{{{ let context = b:vimfiler.context let winwidth = (winnr('$') != 1) ? \ &columns - (winwidth(0)+1)/2*2 : \ (context.winwidth > 0) ? \ &columns / 2 : \ &columns - context.winwidth call vimfiler#mappings#do_action(b:vimfiler, context.split_action) " Resize. execute 'vertical resize' \ (winnr('$') == 1 ? winwidth : winwidth/(winnr('$') - 1)) setlocal nowinfixwidth setlocal nowinfixheight endfunction"}}} " File operations. function! s:copy() abort "{{{ if empty(vimfiler#get_marked_files(b:vimfiler)) " Mark current line. call s:toggle_mark_current_line() return endif " Get destination directory. let dest_dir = '' if vimfiler#winnr_another_vimfiler() > 0 let another = vimfiler#get_another_vimfiler() if another.source !=# 'file' let dest_dir = another.source . ':' endif let dest_dir .= another.current_dir endif " Execute copy. call vimfiler#mappings#do_dir_action( \ b:vimfiler, \ 'vimfiler__copy', \ s:get_action_current_dir( \ vimfiler#get_marked_files(b:vimfiler)), \ { 'action__directory' : dest_dir }) endfunction"}}} function! s:move() abort "{{{ if empty(vimfiler#get_marked_files(b:vimfiler)) " Mark current line. call s:toggle_mark_current_line() return endif " Get destination directory. let dest_dir = '' if vimfiler#winnr_another_vimfiler() > 0 let another = vimfiler#get_another_vimfiler() if another.source !=# 'file' let dest_dir = another.source . ':' endif let dest_dir .= another.current_dir endif " Execute move. call vimfiler#mappings#do_dir_action( \ b:vimfiler, \ 'vimfiler__move', \ s:get_action_current_dir( \ vimfiler#get_marked_files(b:vimfiler)), \ { 'action__directory' : dest_dir }) endfunction"}}} function! s:delete() abort "{{{ if empty(vimfiler#get_marked_files(b:vimfiler)) " Mark current line. call s:toggle_mark_current_line() return endif " Execute delete. call vimfiler#mappings#do_dir_action( \ b:vimfiler, \ 'vimfiler__delete', \ s:get_action_current_dir( \ vimfiler#get_marked_files(b:vimfiler))) endfunction"}}} function! s:rename() abort "{{{ let vimfiler = b:vimfiler if !empty(vimfiler#get_marked_filenames(vimfiler)) " Extended rename. call vimfiler#exrename#create_buffer( \ vimfiler#get_marked_files(vimfiler)) call s:clear_mark_all_lines(vimfiler) return endif let file = vimfiler#get_file(vimfiler) if empty(file) return endif call vimfiler#mappings#do_files_action( \ vimfiler, \ 'vimfiler__rename', [file], { \ 'vimfiler__current_directory' : \ s:get_action_current_dir([file]), \ }) endfunction"}}} function! s:make_directory() abort "{{{ let directory = vimfiler#get_file_directory() " Don't quit. let context = b:vimfiler.context let is_quit = context.quit try let context.quit = 0 call vimfiler#mappings#do_dir_action( \ b:vimfiler, 'vimfiler__mkdir', directory) finally let context.quit = is_quit endtry endfunction"}}} function! s:new_file() abort "{{{ let directory = vimfiler#get_file_directory() call vimfiler#mappings#do_dir_action( \ b:vimfiler, 'vimfiler__newfile', directory) endfunction"}}} function! s:clipboard_copy() abort "{{{ if empty(vimfiler#get_marked_files(b:vimfiler)) " Mark current line. call s:toggle_mark_current_line() return endif let clipboard = vimfiler#variables#get_clipboard() let clipboard.operation = 'copy' let clipboard.files = vimfiler#get_marked_files(b:vimfiler) call s:clear_mark_all_lines(b:vimfiler) echo 'Copied files to vimfiler clipboard.' endfunction"}}} function! s:clipboard_move() abort "{{{ if empty(vimfiler#get_marked_files(b:vimfiler)) " Mark current line. call s:toggle_mark_current_line() return endif let clipboard = vimfiler#variables#get_clipboard() let clipboard.operation = 'move' let clipboard.files = vimfiler#get_marked_files(b:vimfiler) call s:clear_mark_all_lines(b:vimfiler) echo 'Moved files to vimfiler clipboard.' endfunction"}}} function! s:clipboard_paste() abort "{{{ let clipboard = vimfiler#variables#get_clipboard() if empty(clipboard.files) call vimfiler#util#print_error('Clipboard is empty.') return endif " Get destination directory. let dest_dir = vimfiler#get_file_directory() " Execute file operation. call vimfiler#mappings#do_files_action( \ b:vimfiler, \ 'vimfiler__' . clipboard.operation, \ clipboard.files, { \ 'action__directory' : dest_dir, \ 'vimfiler__current_directory' : dest_dir, \ }) let clipboard.operation = '' let clipboard.files = [] endfunction"}}} function! s:set_current_mask() abort "{{{ call vimfiler#redraw_screen() call unite#start(['vimfiler/mask'], \ { 'start_insert' : 1, 'buffer_name' : 'vimfiler/mask', 'script' : 1 }) endfunction"}}} function! s:select_sort_type() abort "{{{ call unite#start(['vimfiler/sort'], \ { 'buffer_name' : 'vimfiler/sort', 'script' : 1 }) endfunction"}}} function! s:switch_vim_buffer_mode() abort "{{{ redir => nmaps silent nmap redir END let b:vimfiler.mapdict = {} for map in split(nmaps, '\n') let lhs = split(map)[1] let rhs = join(split(map)[2: ])[1:] if rhs =~ '^(vimfiler_' let b:vimfiler.mapdict[lhs] = rhs execute 'nunmap ' lhs endif endfor nmap (vimfiler_restore_vimfiler_mode) echo 'Switched vim buffer mode' endfunction"}}} function! s:restore_vimfiler_mode() abort "{{{ for [lhs, rhs] in items(b:vimfiler.mapdict) execute 'nmap ' lhs rhs endfor echo 'Switched vimfiler mode' endfunction"}}} function! s:help() abort "{{{ call unite#start(['mapping'], \ { 'buffer_name' : 'vimfiler/mapping', 'script' : 1 }) endfunction"}}} function! s:execute_external_filer() abort "{{{ let file = vimfiler#get_file(b:vimfiler) if empty(file) " Use current directory call vimfiler#mappings#do_current_dir_action( \ b:vimfiler, 'vimfiler__execute') else call vimfiler#mappings#do_files_action( \ b:vimfiler, 'vimfiler__external_filer', [file]) endif endfunction"}}} function! vimfiler#mappings#_change_vim_current_dir() abort "{{{ let vimfiler = b:vimfiler if vimfiler.source !=# 'file' call vimfiler#util#print_error( \ 'Invalid operation in not file source.') return endif " Initialize load. call unite#kinds#cdable#define() execute g:unite_kind_cdable_lcd_command \ fnameescape(vimfiler.current_dir) endfunction"}}} function! s:grep() abort "{{{ if !vimfiler#util#has_vimproc() call vimfiler#util#print_error( \ 'Sorry, vimproc is not installed. '. \ 'This mapping use vimproc.') return endif call unite#sources#grep#define() let vimfiler = b:vimfiler call s:switch() if empty(vimfiler#get_marked_files(vimfiler)) call vimfiler#mappings#do_current_dir_action(vimfiler, 'grep') else call vimfiler#mappings#do_action(vimfiler, 'grep') endif endfunction"}}} function! s:find() abort "{{{ if !vimfiler#util#has_vimproc() call vimfiler#util#print_error( \ 'Sorry, vimproc is not installed. '. \ 'This mapping use vimproc.') return endif call unite#sources#find#define() let vimfiler = b:vimfiler call s:switch() call vimfiler#mappings#do_current_dir_action(vimfiler, 'find') endfunction"}}} function! s:cd_file_directory() abort "{{{ " Change directory. call vimfiler#mappings#cd(vimfiler#get_filename()) if b:vimfiler.context.auto_expand \ && b:vimfiler.all_files_len == 1 \ && b:vimfiler.all_files[0].vimfiler__is_directory " Cd recursive call s:cd_file_directory() endif endfunction"}}} function! s:cd_input_directory() abort "{{{ let vimfiler = b:vimfiler let current_dir = vimfiler.current_dir let dir = input('[in]: ', \ vimfiler.source . ':'. current_dir, \ 'customlist,vimfiler#complete_path') if dir == '' echo 'Cancelled.' return endif " Change directory. call vimfiler#mappings#cd(dir) endfunction"}}} function! s:on_double_click() abort "{{{ let file = vimfiler#get_file(b:vimfiler) if empty(file) \ || !file.vimfiler__is_directory if vimfiler#get_filename() ==# '..' call vimfiler#mappings#cd('..') else call s:execute_system_associated() endif else call s:toggle_tree(0) endif endfunction"}}} function! s:quick_look() abort "{{{ if !vimfiler#util#has_vimproc() call vimfiler#util#print_error( \ 'vimproc is needed for this feature.') return endif let file = vimfiler#get_file(b:vimfiler) if empty(file) return endif let command = vimproc#util#iconv( \ g:vimfiler_quick_look_command . ' ' . \ vimproc#shellescape(file.action__path), &encoding, 'char') try call vimproc#system_gui(command) catch /vimproc#get_command_name: / call vimfiler#util#print_error( \ 'g:vimfiler_quick_look_command "'. \ g:vimfiler_quick_look_command.'" is not executable.') return endtry endfunction"}}} " For safe mode. function! s:toggle_safe_mode() abort "{{{ let b:vimfiler.is_safe_mode = !b:vimfiler.is_safe_mode echo 'Safe mode is ' . (b:vimfiler.is_safe_mode ? 'enabled' : 'disabled') call vimfiler#view#_redraw_screen() if b:vimfiler.is_safe_mode call s:unmapping_file_operations() else call s:mapping_file_operations() endif endfunction"}}} function! s:mapping_file_operations() abort "{{{ nnoremap (vimfiler_copy_file) \ :call copy() nnoremap (vimfiler_move_file) \ :call move() nnoremap (vimfiler_delete_file) \ :call delete() nnoremap (vimfiler_rename_file) \ :call rename() nnoremap (vimfiler_make_directory) \ :call make_directory() nnoremap (vimfiler_new_file) \ :call new_file() nnoremap (vimfiler_clipboard_copy_file) \ :call clipboard_copy() nnoremap (vimfiler_clipboard_move_file) \ :call clipboard_move() nnoremap (vimfiler_clipboard_paste) \ :call clipboard_paste() endfunction"}}} function! s:unmapping_file_operations() abort "{{{ nnoremap (vimfiler_copy_file) \ :call disable_operation() nnoremap (vimfiler_move_file) \ :call disable_operation() nnoremap (vimfiler_delete_file) \ :call disable_operation() nnoremap (vimfiler_rename_file) \ :call disable_operation() nnoremap (vimfiler_make_directory) \ :call disable_operation() nnoremap (vimfiler_new_file) \ :call disable_operation() nnoremap (vimfiler_clipboard_copy_file) \ :call disable_operation() nnoremap (vimfiler_clipboard_move_file) \ :call disable_operation() nnoremap (vimfiler_clipboard_paste) \ :call disable_operation() endfunction"}}} function! s:disable_operation() abort "{{{ call vimfiler#util#print_error( \ 'In safe mode, this operation is disabled.') endfunction"}}} function! s:toggle_simple_mode() abort "{{{ let b:vimfiler.context.simple = !b:vimfiler.context.simple call vimfiler#redraw_screen() echo 'Simple mode is ' . \ (b:vimfiler.context.simple ? 'enabled' : 'disabled') endfunction"}}} function! s:toggle_maximize_window() abort "{{{ let std_width = b:vimfiler.context.winwidth if std_width == 0 let std_width = (&columns+1)/2 endif let winwidth = (winwidth(0)+1)/2*2 if winwidth == std_width execute 'vertical resize' &columns else execute 'vertical resize' std_width endif call vimfiler#redraw_screen() setlocal winfixwidth endfunction"}}} function! s:get_action_current_dir(files) abort "{{{ let current_dir = b:vimfiler.current_dir if b:vimfiler.source != 'file' let current_dir = b:vimfiler.source . ':' . current_dir endif if len(a:files) == 1 let current_dir = unite#helper#get_candidate_directory(a:files[0]) if a:files[0].vimfiler__is_directory let current_dir = vimfiler#util#substitute_path_separator( \ fnamemodify(current_dir, ':h')) endif endif return current_dir endfunction"}}} function! s:get_abbr_length(parent, child) abort "{{{ return strwidth(repeat(' ', a:parent.vimfiler__nest_level \ * g:vimfiler_tree_indentation) . \ a:parent.vimfiler__abbr.a:child.vimfiler__abbr) + 5 endfunction"}}} function! s:check_force_quit(vimfiler, action) abort "{{{ if (a:vimfiler.context.force_quit || a:vimfiler.context.force_hide) \ && index([ \ 'vimfiler__move', 'vimfiler__copy', 'vimfiler__delete', \ 'vimfiler__rename', 'vimfiler__mkdir', 'vimfiler__newfile', \ ], a:action) < 0 if a:vimfiler.context.force_quit call s:exit(a:vimfiler) else call vimfiler#util#hide_buffer(a:vimfiler.bufnr) endif endif endfunction"}}} function! s:check_opened() abort "{{{ return get(vimfiler#get_file(b:vimfiler), \ 'vimfiler__is_opened', 0) \ || get(vimfiler#get_file(b:vimfiler), \ 'vimfiler__nest_level', 0) > 0 endfunction"}}} " vim: foldmethod=marker