settings

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit a82180edd495693ff28015a6be553c151ba411d5
parent 8d9fc75934ac7e3b8fb72a6a48224b4cbf68da55
Author: Paul Longtine <paul@nanner.co>
Date:   Tue Jun 16 21:18:20 2015

tweaked vimstuffs

Diffstat:
 vim/.vim/.netrwhist                    |   9 +-
 vim/.vim/autoload/multiple_cursors.vim | 273 ++++++++++++++++++++-------
 vim/.vim/autoload/pathogen.vim         | 347 +----------------------------------
 vim/.vim/plugin/emacs-bindings.vim     |  61 +------
 vim/.vim/plugin/multiple_cursors.vim   |  26 ++-
 vim/.vimrc                             |   8 +-
 6 files changed, 235 insertions(+), 489 deletions(-)

diff --git a/vim/.vim/.netrwhist b/vim/.vim/.netrwhist @@ -1,8 +1,3 @@ let g:netrw_dirhistmax =10 -let g:netrw_dirhist_cnt =6 -let g:netrw_dirhist_1='/home' -let g:netrw_dirhist_2='/' -let g:netrw_dirhist_3='/var' -let g:netrw_dirhist_4='/var/www' -let g:netrw_dirhist_5='/var/www/html' -let g:netrw_dirhist_6='/var/www/html/admin' +let g:netrw_dirhist_cnt =1 +let g:netrw_dirhist_1='/home/paul/.vim' diff --git a/vim/.vim/autoload/multiple_cursors.vim b/vim/.vim/autoload/multiple_cursors.vim @@ -8,22 +8,23 @@ " it to work the way we like. '<C-n>' is converted to '\<C-n>' by the end and " the global vars are replaced by their new value. This is ok since the mapping " using '<C-n>' should already have completed in the plugin file. -for key in [ 'g:multi_cursor_next_key', +for s:key in [ 'g:multi_cursor_next_key', \ 'g:multi_cursor_prev_key', \ 'g:multi_cursor_skip_key', \ 'g:multi_cursor_quit_key' ] - if exists(key) + if exists(s:key) " Translate raw strings like "<C-n>" into key code like "\<C-n>" - exec 'let temp = '.key - if temp =~ '^<.*>$' - exec 'let '.key.' = "\'.temp.'"' + exec 'let s:temp = '.s:key + if s:temp =~ '^<.*>$' + exec 'let '.s:key.' = "\'.s:temp.'"' endif else " If the user didn't define it, initialize it to an empty string so the " logic later don't break - exec 'let '.key.' = ""' + exec 'let '.s:key.' = ""' endif endfor +unlet! s:key s:temp " These keys will not be replicated at every cursor location. Make sure that " this assignment happens AFTER the key tweak setting above @@ -38,6 +39,13 @@ let s:hi_group_cursor = 'multiple_cursors_cursor' " The highlight group we use for all the visual selection let s:hi_group_visual = 'multiple_cursors_visual' +" Used for preventing multiple calls on before function +let s:before_function_called = 0 + +" Used for searching whole words (search pattern is wrapped with \< and \>) +" Keep old behaviour by default (act like g*) +let s:use_word_boundary = 1 + " Set up highlighting if !hlexists(s:hi_group_cursor) exec "highlight ".s:hi_group_cursor." term=reverse cterm=reverse gui=reverse" @@ -46,32 +54,38 @@ if !hlexists(s:hi_group_visual) exec "highlight link ".s:hi_group_visual." Visual" endif +" Temporary buffer that is used for individual paste buffer save/restore +" operations +let s:paste_buffer_temporary_text = '' +let s:paste_buffer_temporary_type = '' + "=============================================================================== " Internal Mappings "=============================================================================== -inoremap <silent> <Plug>(i) <C-o>:call <SID>process_user_input()<CR> -nnoremap <silent> <Plug>(i) :call <SID>process_user_input()<CR> -xnoremap <silent> <Plug>(i) :<C-u>call <SID>process_user_input()<CR> +inoremap <silent> <Plug>(multiple-cursors-input) <C-o>:call <SID>process_user_input()<CR> +nnoremap <silent> <Plug>(multiple-cursors-input) :call <SID>process_user_input()<CR> +xnoremap <silent> <Plug>(multiple-cursors-input) :<C-u>call <SID>process_user_input()<CR> -inoremap <silent> <Plug>(a) <C-o>:call <SID>apply_user_input_next('i')<CR> -nnoremap <silent> <Plug>(a) :call <SID>apply_user_input_next('n')<CR> -xnoremap <silent> <Plug>(a) :<C-u>call <SID>apply_user_input_next('v')<CR> +inoremap <silent> <Plug>(multiple-cursors-apply) <C-o>:call <SID>apply_user_input_next('i')<CR> +nnoremap <silent> <Plug>(multiple-cursors-apply) :call <SID>apply_user_input_next('n')<CR> +xnoremap <silent> <Plug>(multiple-cursors-apply) :<C-u>call <SID>apply_user_input_next('v')<CR> -inoremap <silent> <Plug>(d) <C-o>:call <SID>detect_bad_input()<CR> -nnoremap <silent> <Plug>(d) :call <SID>detect_bad_input()<CR> -xnoremap <silent> <Plug>(d) :<C-u>call <SID>detect_bad_input()<CR> +inoremap <silent> <Plug>(multiple-cursors-detect) <C-o>:call <SID>detect_bad_input()<CR> +nnoremap <silent> <Plug>(multiple-cursors-detect) :call <SID>detect_bad_input()<CR> +xnoremap <silent> <Plug>(multiple-cursors-detect) :<C-u>call <SID>detect_bad_input()<CR> -inoremap <silent> <Plug>(w) <C-o>:call <SID>wait_for_user_input('')<CR> -nnoremap <silent> <Plug>(w) :call <SID>wait_for_user_input('')<CR> -xnoremap <silent> <Plug>(w) :<C-u>call <SID>wait_for_user_input('')<CR> +inoremap <silent> <Plug>(multiple-cursors-wait) <C-o>:call <SID>wait_for_user_input('')<CR> +nnoremap <silent> <Plug>(multiple-cursors-wait) :call <SID>wait_for_user_input('')<CR> +xnoremap <silent> <Plug>(multiple-cursors-wait) :<C-u>call <SID>wait_for_user_input('')<CR> " Note that although these mappings are seemingly triggerd from Visual mode, " they are in fact triggered from Normal mode. We quit visual mode to allow the " virtual highlighting to take over -nnoremap <silent> <Plug>(p) :<C-u>call multiple_cursors#prev()<CR> -nnoremap <silent> <Plug>(s) :<C-u>call multiple_cursors#skip()<CR> -nnoremap <silent> <Plug>(n) :<C-u>call multiple_cursors#new('v')<CR> +nnoremap <silent> <Plug>(multiple-cursors-prev) :<C-u>call multiple_cursors#prev()<CR> +nnoremap <silent> <Plug>(multiple-cursors-skip) :<C-u>call multiple_cursors#skip()<CR> +nnoremap <silent> <Plug>(multiple-cursors-new) :<C-u>call multiple_cursors#new('v', 0)<CR> +nnoremap <silent> <Plug>(multiple-cursors-new-word) :<C-u>call multiple_cursors#new('v', 1)<CR> "=============================================================================== " Public Functions @@ -95,7 +109,13 @@ endfunction " 3. In visual mode, if the visual selection covers a single line, a new cursor " is created at the end of the visual selection. Another cursor will be " attempted to be created at the next occurrence of the visual selection -function! multiple_cursors#new(mode) +function! multiple_cursors#new(mode, word_boundary) + " Call before function if exists only once until it is canceled (<Esc>) + if exists('*Multiple_cursors_before') && !s:before_function_called + exe "call Multiple_cursors_before()" + let s:before_function_called = 1 + endif + let s:use_word_boundary = a:word_boundary if a:mode ==# 'n' " Reset all existing cursors, don't restore view and setting call s:cm.reset(0, 0) @@ -150,6 +170,11 @@ function! multiple_cursors#new(mode) endif endfunction +" Quit out of multicursor mode, fixes #27. +function! multiple_cursors#quit() + call s:exit() +endfunction + " Delete the current cursor. If there's no more cursors, stop the loop function! multiple_cursors#prev() call s:cm.delete_current() @@ -221,6 +246,14 @@ function! multiple_cursors#find(start, end, pattern) return else echohl Normal | echo 'Added '.s:cm.size().' cursor'.(s:cm.size()>1?'s':'') | echohl None + + " If we've created any cursors, we need to call the before function, end + " function will be called via normal routes + if exists('*Multiple_cursors_before') && !s:before_function_called + exe "call Multiple_cursors_before()" + let s:before_function_called = 1 + endif + call s:wait_for_user_input('v') endif endfunction @@ -235,9 +268,15 @@ function! s:Cursor.new(position) let obj = copy(self) let obj.position = copy(a:position) let obj.visual = [] + " Stores text that was yanked after any commands in Normal or Visual mode + let obj.paste_buffer_text = getreg('"') + let obj.paste_buffer_type = getregtype('"') let obj.cursor_hi_id = s:highlight_cursor(a:position) let obj.visual_hi_id = 0 let obj.line_length = col([a:position[0], '$']) + if has('folding') + silent! execute a:position[0] . "foldopen!" + endif return obj endfunction @@ -299,6 +338,17 @@ function! s:Cursor.remove_visual_selection() dict let self.visual_hi_id = 0 endfunction +" Restore unnamed register from paste buffer +function! s:Cursor.restore_unnamed_register() dict + call setreg('"', self.paste_buffer_text, self.paste_buffer_type) +endfunction + +" Save contents of the unnamed register into paste buffer +function! s:Cursor.save_unnamed_register() dict + let self.paste_buffer_text = getreg('"') + let self.paste_buffer_type = getregtype('"') +endfunction + "=============================================================================== " CursorManager class "=============================================================================== @@ -319,6 +369,7 @@ function! s:CursorManager.new() \ 'cursorline': &cursorline, \ 'lazyredraw': &lazyredraw, \ 'paste': &paste, + \ 'clipboard': &clipboard, \ } " We save the window view when multicursor mode is entered let obj.saved_winview = [] @@ -328,7 +379,7 @@ function! s:CursorManager.new() endfunction " Clear all cursors and their highlights -function! s:CursorManager.reset(restore_view, restore_setting) dict +function! s:CursorManager.reset(restore_view, restore_setting, ...) dict if a:restore_view " Return the view back to the beginning if !empty(self.saved_winview) @@ -361,6 +412,11 @@ function! s:CursorManager.reset(restore_view, restore_setting) dict if a:restore_setting call self.restore_user_settings() endif + " Call after function if exists and only if action is canceled (<Esc>) + if exists('*Multiple_cursors_after') && a:0 && s:before_function_called + exe "call Multiple_cursors_after()" + let s:before_function_called = 0 + endif endfunction " Returns 0 if it's not managing any cursors at the moment @@ -434,7 +490,17 @@ function! s:CursorManager.update_current() dict exec "normal! gv\<Esc>" call cur.update_visual_selection(s:get_visual_region(s:pos('.'))) elseif s:from_mode ==# 'v' || s:from_mode ==# 'V' + " Save contents of unnamed register after each operation in Visual mode. + " This should be executed after user input is processed, when unnamed + " register already contains the text. + call cur.save_unnamed_register() + call cur.remove_visual_selection() + elseif s:from_mode ==# 'i' && s:to_mode ==# 'n' && self.current_index != self.size() - 1 + normal! h + elseif s:from_mode ==# 'n' + " Save contents of unnamed register after each operation in Normal mode. + call cur.save_unnamed_register() endif let vdelta = line('$') - s:saved_linecount " If the total number of lines changed in the buffer, we need to potentially @@ -518,19 +584,28 @@ endfunction " cursors on screen " paste mode needs to be switched off since it turns off a bunch of features " that's critical for the plugin to function +" clipboard should not have unnamed and unnamedplus otherwise plugin cannot +" reliably use unnamed register ('"') function! s:CursorManager.initialize() dict let self.saved_settings['virtualedit'] = &virtualedit let self.saved_settings['cursorline'] = &cursorline let self.saved_settings['lazyredraw'] = &lazyredraw let self.saved_settings['paste'] = &paste + let self.saved_settings['clipboard'] = &clipboard let &virtualedit = "onemore" let &cursorline = 0 let &lazyredraw = 1 let &paste = 0 + set clipboard-=unnamed clipboard-=unnamedplus " We could have already saved the view from multiple_cursors#find if !self.start_from_find let self.saved_winview = winsaveview() endif + + " Save contents and type of unnamed register upon entering multicursor mode + " to restore it later when leaving mode + let s:paste_buffer_temporary_text = getreg('"') + let s:paste_buffer_temporary_type = getregtype('"') endfunction " Restore user settings. @@ -540,7 +615,15 @@ function! s:CursorManager.restore_user_settings() dict let &cursorline = self.saved_settings['cursorline'] let &lazyredraw = self.saved_settings['lazyredraw'] let &paste = self.saved_settings['paste'] + let &clipboard = self.saved_settings['clipboard'] endif + + " Restore original contents and type of unnamed register. This method is + " called from reset, which calls us only when restore_setting argument is + " true, which happens only when we leave multicursor mode. This should be + " symmetrical to saving of unnamed register upon the start of multicursor + " mode. + call setreg('"', s:paste_buffer_temporary_text, s:paste_buffer_temporary_type) endfunction " Reselect the current cursor's region in visual mode @@ -628,6 +711,12 @@ endfunction " visual selection ended function! s:exit_visual_mode() exec "normal! \<Esc>gv\<Esc>" + + " Call before function if exists only once until it is canceled (<Esc>) + if exists('*Multiple_cursors_before') && !s:before_function_called + exe "call Multiple_cursors_before()" + let s:before_function_called = 1 + endif endfunction " Visually select input region, where region is an array containing the start @@ -643,7 +732,7 @@ endfunction function! s:select_in_visual_mode(region) if a:region[0] == a:region[1] normal! v - else + else call cursor(a:region[1]) normal! m` call cursor(a:region[0]) @@ -660,7 +749,7 @@ endfunction function! s:update_visual_markers(region) if a:region[0] == a:region[1] normal! v - else + else call cursor(a:region[1]) normal! m` call cursor(a:region[0]) @@ -674,7 +763,11 @@ endfunction " Mode change: Normal -> Normal " Cursor change: Set to the end of the match function! s:find_next(text) - let pattern = '\V\C'.substitute(escape(a:text, '\'), '\n', '\\n', 'g') + let pattern = substitute(escape(a:text, '\'), '\n', '\\n', 'g') + if s:use_word_boundary == 1 + let pattern = '\<'.pattern.'\>' + endif + let pattern = '\V\C'.pattern call search(pattern) let start = s:pos('.') call search(pattern, 'ce') @@ -714,7 +807,7 @@ function! s:highlight_region(region) let pattern = s1.'\|'.s2 " More than two lines if (s[1][0] - s[0][0] > 1) - let pattern = pattern.'\|\%>'.s[0][0].'l\%<'.s[1][0].'l.*\ze.\_$' + let pattern = pattern.'\|\%>'.s[0][0].'l\%<'.s[1][0].'l.*\ze.\_$' endif endif endif @@ -725,28 +818,31 @@ endfunction function! s:revert_mode(from, to) if a:to ==# 'v' call s:cm.reapply_visual_selection() - endif - if a:to ==# 'V' + elseif a:to ==# 'V' call s:cm.reapply_visual_selection() normal! V - endif - if a:to ==# 'n' && a:from ==# 'i' + elseif a:to ==# 'n' && a:from ==# 'i' stopinsert endif endfunction " Consume all the additional character the user typed between the last " getchar() and here, to avoid potential race condition. -" TODO(terryma): This solves the problem of cursors getting out of sync, but -" we're potentially losing user input. We COULD replay these characters as -" well... +let s:saved_keys = "" function! s:feedkeys(keys) while 1 let c = getchar(0) + let char_type = type(c) " Checking type is important, when strings are compared with integers, " strings are always converted to ints, and all strings are equal to 0 - if type(c) == 0 && c == 0 - break + if char_type == 0 + if c == 0 + break + else + let s:saved_keys .= nr2char(c) + endif + elseif char_type == 1 " char with more than 8 bits (as string) + let s:saved_keys .= c endif endwhile call feedkeys(a:keys) @@ -768,10 +864,16 @@ function! s:process_user_input() call s:cm.get_current().update_line_length() let s:saved_linecount = line('$') + " Restore unnamed register only in Normal mode. This should happen before user + " input is processed. + if s:from_mode ==# 'n' || s:from_mode ==# 'v' || s:from_mode ==# 'V' + call s:cm.get_current().restore_unnamed_register() + endif + " Apply the user input. Note that the above could potentially change mode, we " use the mapping below to help us determine what the new mode is - " Note that it's possible that \<Plug>(a) never gets called, we have a - " detection mechanism using \<Plug>(d). See its documentation for more details + " Note that it's possible that \<Plug>(multiple-cursors-apply) never gets called, we have a + " detection mechanism using \<Plug>(multiple-cursors-detect). See its documentation for more details " Assume that input is not valid let s:valid_input = 0 @@ -781,14 +883,14 @@ function! s:process_user_input() " FIXME(terryma): Undo always places the cursor at the beginning of the line. " Figure out why. if s:from_mode ==# 'i' || s:to_mode ==# 'i' - silent! undojoin | call s:feedkeys(s:char."\<Plug>(a)") + silent! undojoin | call s:feedkeys(s:char."\<Plug>(multiple-cursors-apply)") else - call s:feedkeys(s:char."\<Plug>(a)") + call s:feedkeys(s:char."\<Plug>(multiple-cursors-apply)") endif - + " Even when s:char produces invalid input, this method is always called. The " 't' here is important - call feedkeys("\<Plug>(d)", 't') + call feedkeys("\<Plug>(multiple-cursors-detect)", 't') endfunction " This method is always called during fanout, even when a bad user input causes @@ -797,7 +899,7 @@ endfunction function! s:detect_bad_input() if !s:valid_input " We ignore the bad input and force invoke s:apply_user_input_next - call feedkeys("\<Plug>(a)") + call feedkeys("\<Plug>(multiple-cursors-apply)") let s:bad_input += 1 endif endfunction @@ -828,10 +930,10 @@ function! s:apply_user_input_next(mode) " This is necessary to set the "'<" and "'>" markers properly call s:update_visual_markers(s:cm.get_current().visual) endif - call feedkeys("\<Plug>(w)") + call feedkeys("\<Plug>(multiple-cursors-wait)") else " Continue to next - call feedkeys("\<Plug>(i)") + call feedkeys("\<Plug>(multiple-cursors-input)") endif endfunction @@ -873,7 +975,7 @@ endfunction " Quits multicursor mode and clears all cursors. Return true if exited " successfully. function! s:exit() - if s:char !=# g:multi_cursor_quit_key + if s:last_char() !=# g:multi_cursor_quit_key return 0 endif let exit = 0 @@ -887,7 +989,7 @@ function! s:exit() let exit = 1 endif if exit - call s:cm.reset(1, 1) + call s:cm.reset(1, 1, 1) return 1 endif return 0 @@ -902,11 +1004,15 @@ function! s:handle_special_key(key, mode) " increasing the call stack, since feedkeys execute after the current call " finishes if a:key == g:multi_cursor_next_key - call s:feedkeys("\<Plug>(n)") + if s:use_word_boundary == 1 + call s:feedkeys("\<Plug>(multiple-cursors-new-word)") + else + call s:feedkeys("\<Plug>(multiple-cursors-new)") + endif elseif a:key == g:multi_cursor_prev_key - call s:feedkeys("\<Plug>(p)") + call s:feedkeys("\<Plug>(multiple-cursors-prev)") elseif a:key == g:multi_cursor_skip_key - call s:feedkeys("\<Plug>(s)") + call s:feedkeys("\<Plug>(multiple-cursors-skip)") endif endfunction @@ -941,12 +1047,22 @@ function! s:revert_highlight_fix() let s:saved_line = 0 endfunction +let s:retry_keys = "" function! s:display_error() - if s:bad_input > 0 - echohl ErrorMsg | - \ echo "Key '".s:char."' cannot be replayed at ". - \ s:bad_input." cursor location".(s:bad_input == 1 ? '' : 's') | - \ echohl Normal + if s:bad_input == s:cm.size() + \ && s:from_mode ==# 'n' + \ && has_key(g:multi_cursor_normal_maps, s:char[0]) + " we couldn't replay it anywhere but we're told it's the beginning of a + " multi-character map like the `d` in `dw` + let s:retry_keys = s:char + else + let s:retry_keys = "" + if s:bad_input > 0 + echohl ErrorMsg | + \ echo "Key '".s:char."' cannot be replayed at ". + \ s:bad_input." cursor location".(s:bad_input == 1 ? '' : 's') | + \ echohl Normal + endif endif let s:bad_input = 0 endfunction @@ -982,15 +1098,19 @@ function! s:end_latency_measure() let s:skip_latency_measure = 0 endfunction +function! s:last_char() + return s:char[len(s:char)-1] +endfunction + function! s:wait_for_user_input(mode) + call s:display_error() + let s:from_mode = a:mode if empty(a:mode) let s:from_mode = s:to_mode endif let s:to_mode = '' - call s:display_error() - " Right before redraw, apply the highlighting bug fix call s:apply_highlight_fix() @@ -1001,7 +1121,38 @@ function! s:wait_for_user_input(mode) call s:end_latency_measure() - let s:char = s:get_char() + let s:char = s:retry_keys . s:saved_keys + if len(s:saved_keys) == 0 + let s:char .= s:get_char() + else + let s:saved_keys = "" + endif + + if s:from_mode ==# 'i' && has_key(g:multi_cursor_insert_maps, s:last_char()) + let c = getchar(0) + let char_type = type(c) + let poll_count = 0 + while char_type == 0 && c == 0 && poll_count < &timeoutlen + sleep 1m + let c = getchar(0) + let char_type = type(c) + let poll_count += 1 + endwhile + + if char_type == 0 && c != 0 + let s:char .= nr2char(c) + elseif char_type == 1 " char with more than 8 bits (as string) + let s:char .= c + endif + elseif s:from_mode !=# 'i' && s:char[0] ==# ":" + call feedkeys(s:char) + call s:cm.reset(1, 1) + return + elseif s:from_mode ==# 'n' + while match(s:last_char(), "\\d") == 0 + let s:char .= s:get_char() + endwhile + endif call s:start_latency_measure() @@ -1013,11 +1164,11 @@ function! s:wait_for_user_input(mode) endif " If the key is a special key and we're in the right mode, handle it - if index(get(s:special_keys, s:from_mode, []), s:char) != -1 - call s:handle_special_key(s:char, s:from_mode) + if index(get(s:special_keys, s:from_mode, []), s:last_char()) != -1 + call s:handle_special_key(s:last_char(), s:from_mode) call s:skip_latency_measure() else call s:cm.start_loop() - call s:feedkeys("\<Plug>(i)") + call s:feedkeys("\<Plug>(multiple-cursors-input)") endif endfunction diff --git a/vim/.vim/autoload/pathogen.vim b/vim/.vim/autoload/pathogen.vim @@ -1,347 +0,0 @@ -" pathogen.vim - path option manipulation -" Maintainer: Tim Pope <http://tpo.pe/> -" Version: 2.3 - -" Install in ~/.vim/autoload (or ~\vimfiles\autoload). -" -" For management of individually installed plugins in ~/.vim/bundle (or -" ~\vimfiles\bundle), adding `execute pathogen#infect()` to the top of your -" .vimrc is the only other setup necessary. -" -" The API is documented inline below. - -if exists("g:loaded_pathogen") || &cp - finish -endif -let g:loaded_pathogen = 1 - -" Point of entry for basic default usage. Give a relative path to invoke -" pathogen#interpose() (defaults to "bundle/{}"), or an absolute path to invoke -" pathogen#surround(). Curly braces are expanded with pathogen#expand(): -" "bundle/{}" finds all subdirectories inside "bundle" inside all directories -" in the runtime path. -function! pathogen#infect(...) abort - for path in a:0 ? filter(reverse(copy(a:000)), 'type(v:val) == type("")') : ['bundle/{}'] - if path =~# '^\%({\=[$~\\/]\|{\=\w:[\\/]\).*[{}*]' - call pathogen#surround(path) - elseif path =~# '^\%([$~\\/]\|\w:[\\/]\)' - call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') - call pathogen#surround(path . '/{}') - elseif path =~# '[{}*]' - call pathogen#interpose(path) - else - call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') - call pathogen#interpose(path . '/{}') - endif - endfor - call pathogen#cycle_filetype() - if pathogen#is_disabled($MYVIMRC) - return 'finish' - endif - return '' -endfunction - -" Split a path into a list. -function! pathogen#split(path) abort - if type(a:path) == type([]) | return a:path | endif - if empty(a:path) | return [] | endif - let split = split(a:path,'\\\@<!\%(\\\\\)*\zs,') - return map(split,'substitute(v:val,''\\\([\\,]\)'',''\1'',"g")') -endfunction - -" Convert a list to a path. -function! pathogen#join(...) abort - if type(a:1) == type(1) && a:1 - let i = 1 - let space = ' ' - else - let i = 0 - let space = '' - endif - let path = "" - while i < a:0 - if type(a:000[i]) == type([]) - let list = a:000[i] - let j = 0 - while j < len(list) - let escaped = substitute(list[j],'[,'.space.']\|\\[\,'.space.']\@=','\\&','g') - let path .= ',' . escaped - let j += 1 - endwhile - else - let path .= "," . a:000[i] - endif - let i += 1 - endwhile - return substitute(path,'^,','','') -endfunction - -" Convert a list to a path with escaped spaces for 'path', 'tag', etc. -function! pathogen#legacyjoin(...) abort - return call('pathogen#join',[1] + a:000) -endfunction - -" Turn filetype detection off and back on again if it was already enabled. -function! pathogen#cycle_filetype() abort - if exists('g:did_load_filetypes') - filetype off - filetype on - endif -endfunction - -" Check if a bundle is disabled. A bundle is considered disabled if its -" basename or full name is included in the list g:pathogen_disabled. -function! pathogen#is_disabled(path) abort - if a:path =~# '\~$' - return 1 - endif - let sep = pathogen#slash() - let blacklist = map( - \ get(g:, 'pathogen_blacklist', get(g:, 'pathogen_disabled', [])) + - \ pathogen#split($VIMBLACKLIST), - \ 'substitute(v:val, "[\\/]$", "", "")') - return index(blacklist, fnamemodify(a:path, ':t')) != -1 || index(blacklist, a:path) != -1 -endfunction "}}}1 - -" Prepend the given directory to the runtime path and append its corresponding -" after directory. Curly braces are expanded with pathogen#expand(). -function! pathogen#surround(path) abort - let sep = pathogen#slash() - let rtp = pathogen#split(&rtp) - let path = fnamemodify(a:path, ':p:?[\\/]\=$??') - let before = filter(pathogen#expand(path), '!pathogen#is_disabled(v:val)') - let after = filter(reverse(pathogen#expand(path.sep.'after')), '!pathogen#is_disabled(v:val[0:-7])') - call filter(rtp, 'index(before + after, v:val) == -1') - let &rtp = pathogen#join(before, rtp, after) - return &rtp -endfunction - -" For each directory in the runtime path, add a second entry with the given -" argument appended. Curly braces are expanded with pathogen#expand(). -function! pathogen#interpose(name) abort - let sep = pathogen#slash() - let name = a:name - if has_key(s:done_bundles, name) - return "" - endif - let s:done_bundles[name] = 1 - let list = [] - for dir in pathogen#split(&rtp) - if dir =~# '\<after$' - let list += reverse(filter(pathogen#expand(dir[0:-6].name.sep.'after'), '!pathogen#is_disabled(v:val[0:-7])')) + [dir] - else - let list += [dir] + filter(pathogen#expand(dir.sep.name), '!pathogen#is_disabled(v:val)') - endif - endfor - let &rtp = pathogen#join(pathogen#uniq(list)) - return 1 -endfunction - -let s:done_bundles = {} - -" Invoke :helptags on all non-$VIM doc directories in runtimepath. -function! pathogen#helptags() abort - let sep = pathogen#slash() - for glob in pathogen#split(&rtp) - for dir in map(split(glob(glob), "\n"), 'v:val.sep."/doc/".sep') - if (dir)[0 : strlen($VIMRUNTIME)] !=# $VIMRUNTIME.sep && filewritable(dir) == 2 && !empty(split(glob(dir.'*.txt'))) && (!filereadable(dir.'tags') || filewritable(dir.'tags')) - silent! execute 'helptags' pathogen#fnameescape(dir) - endif - endfor - endfor -endfunction - -command! -bar Helptags :call pathogen#helptags() - -" Execute the given command. This is basically a backdoor for --remote-expr. -function! pathogen#execute(...) abort - for command in a:000 - execute command - endfor - return '' -endfunction - -" Section: Unofficial - -function! pathogen#is_absolute(path) abort - return a:path =~# (has('win32') ? '^\%([\\/]\|\w:\)[\\/]\|^[~$]' : '^[/~$]') -endfunction - -" Given a string, returns all possible permutations of comma delimited braced -" alternatives of that string. pathogen#expand('/{a,b}/{c,d}') yields -" ['/a/c', '/a/d', '/b/c', '/b/d']. Empty braces are treated as a wildcard -" and globbed. Actual globs are preserved. -function! pathogen#expand(pattern) abort - if a:pattern =~# '{[^{}]\+}' - let [pre, pat, post] = split(substitute(a:pattern, '\(.\{-\}\){\([^{}]\+\)}\(.*\)', "\\1\001\\2\001\\3", ''), "\001", 1) - let found = map(split(pat, ',', 1), 'pre.v:val.post') - let results = [] - for pattern in found - call extend(results, pathogen#expand(pattern)) - endfor - return results - elseif a:pattern =~# '{}' - let pat = matchstr(a:pattern, '^.*{}[^*]*\%($\|[\\/]\)') - let post = a:pattern[strlen(pat) : -1] - return map(split(glob(substitute(pat, '{}', '*', 'g')), "\n"), 'v:val.post') - else - return [a:pattern] - endif -endfunction - -" \ on Windows unless shellslash is set, / everywhere else. -function! pathogen#slash() abort - return !exists("+shellslash") || &shellslash ? '/' : '\' -endfunction - -function! pathogen#separator() abort - return pathogen#slash() -endfunction - -" Convenience wrapper around glob() which returns a list. -function! pathogen#glob(pattern) abort - let files = split(glob(a:pattern),"\n") - return map(files,'substitute(v:val,"[".pathogen#slash()."/]$","","")') -endfunction "}}}1 - -" Like pathogen#glob(), only limit the results to directories. -function! pathogen#glob_directories(pattern) abort - return filter(pathogen#glob(a:pattern),'isdirectory(v:val)') -endfunction "}}}1 - -" Remove duplicates from a list. -function! pathogen#uniq(list) abort - let i = 0 - let seen = {} - while i < len(a:list) - if (a:list[i] ==# '' && exists('empty')) || has_key(seen,a:list[i]) - call remove(a:list,i) - elseif a:list[i] ==# '' - let i += 1 - let empty = 1 - else - let seen[a:list[i]] = 1 - let i += 1 - endif - endwhile - return a:list -endfunction - -" Backport of fnameescape(). -function! pathogen#fnameescape(string) abort - if exists('*fnameescape') - return fnameescape(a:string) - elseif a:string ==# '-' - return '\-' - else - return substitute(escape(a:string," \t\n*?[{`$\\%#'\"|!<"),'^[+>]','\\&','') - endif -endfunction - -" Like findfile(), but hardcoded to use the runtimepath. -function! pathogen#runtime_findfile(file,count) abort "{{{1 - let rtp = pathogen#join(1,pathogen#split(&rtp)) - let file = findfile(a:file,rtp,a:count) - if file ==# '' - return '' - else - return fnamemodify(file,':p') - endif -endfunction - -" Section: Deprecated - -function! s:warn(msg) abort - echohl WarningMsg - echomsg a:msg - echohl NONE -endfunction - -" Prepend all subdirectories of path to the rtp, and append all 'after' -" directories in those subdirectories. Deprecated. -function! pathogen#runtime_prepend_subdirectories(path) abort - call s:warn('Change pathogen#runtime_prepend_subdirectories('.string(a:path).') to pathogen#infect('.string(a:path.'/{}').')') - return pathogen#surround(a:path . pathogen#slash() . '{}') -endfunction - -function! pathogen#incubate(...) abort - let name = a:0 ? a:1 : 'bundle/{}' - call s:warn('Change pathogen#incubate('.(a:0 ? string(a:1) : '').') to pathogen#infect('.string(name).')') - return pathogen#interpose(name) -endfunction - -" Deprecated alias for pathogen#interpose(). -function! pathogen#runtime_append_all_bundles(...) abort - if a:0 - call s:warn('Change pathogen#runtime_append_all_bundles('.string(a:1).') to pathogen#infect('.string(a:1.'/{}').')') - else - call s:warn('Change pathogen#runtime_append_all_bundles() to pathogen#infect()') - endif - return pathogen#interpose(a:0 ? a:1 . '/{}' : 'bundle/{}') -endfunction - -if exists(':Vedit') - finish -endif - -let s:vopen_warning = 0 - -function! s:find(count,cmd,file,lcd) - let rtp = pathogen#join(1,pathogen#split(&runtimepath)) - let file = pathogen#runtime_findfile(a:file,a:count) - if file ==# '' - return "echoerr 'E345: Can''t find file \"".a:file."\" in runtimepath'" - endif - if !s:vopen_warning - let s:vopen_warning = 1 - let warning = '|echohl WarningMsg|echo "Install scriptease.vim to continue using :V'.a:cmd.'"|echohl NONE' - else - let warning = '' - endif - if a:lcd - let path = file[0:-strlen(a:file)-2] - execute 'lcd `=path`' - return a:cmd.' '.pathogen#fnameescape(a:file) . warning - else - return a:cmd.' '.pathogen#fnameescape(file) . warning - endif -endfunction - -function! s:Findcomplete(A,L,P) - let sep = pathogen#slash() - let cheats = { - \'a': 'autoload', - \'d': 'doc', - \'f': 'ftplugin', - \'i': 'indent', - \'p': 'plugin', - \'s': 'syntax'} - if a:A =~# '^\w[\\/]' && has_key(cheats,a:A[0]) - let request = cheats[a:A[0]].a:A[1:-1] - else - let request = a:A - endif - let pattern = substitute(request,'/\|\'.sep,'*'.sep,'g').'*' - let found = {} - for path in pathogen#split(&runtimepath) - let path = expand(path, ':p') - let matches = split(glob(path.sep.pattern),"\n") - call map(matches,'isdirectory(v:val) ? v:val.sep : v:val') - call map(matches,'expand(v:val, ":p")[strlen(path)+1:-1]') - for match in matches - let found[match] = 1 - endfor - endfor - return sort(keys(found)) -endfunction - -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Ve :execute s:find(<count>,'edit<bang>',<q-args>,0) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vedit :execute s:find(<count>,'edit<bang>',<q-args>,0) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vopen :execute s:find(<count>,'edit<bang>',<q-args>,1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vsplit :execute s:find(<count>,'split',<q-args>,<bang>1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vvsplit :execute s:find(<count>,'vsplit',<q-args>,<bang>1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vtabedit :execute s:find(<count>,'tabedit',<q-args>,<bang>1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vpedit :execute s:find(<count>,'pedit',<q-args>,<bang>1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vread :execute s:find(<count>,'read',<q-args>,<bang>1) - -" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=': diff --git a/vim/.vim/plugin/emacs-bindings.vim b/vim/.vim/plugin/emacs-bindings.vim @@ -1,61 +0,0 @@ -" Basic cursor movement and deletion keybindings from emacs, for vim. -map <C-f> <Right> -map <C-b> <Left> -map <C-e> <End> -map <C-a> <Home> - -" insert mode -imap <C-g> <ESC> -imap <C-b> <Left> -imap <C-f> <Right> -imap <C-p> <Up> -imap <C-n> <Down> -imap <C-a> <C-o>:call <SID>home()<CR> -imap <C-e> <End> -imap <C-d> <Del> -imap <C-h> <BS> -imap <C-k> <C-r>=<SID>kill_line()<CR> - -" visual mode -vmap <C-p> <Up> -vmap <C-n> <Down> -vmap <C-b> <Left> -vmap <C-f> <Right> - - -" command line mode -cmap <C-p> <Up> -cmap <C-n> <Down> -cmap <C-b> <Left> -cmap <C-f> <Right> -cmap <C-a> <Home> -cmap <C-e> <End> -cnoremap <C-d> <Del> -cnoremap <C-h> <BS> -cnoremap <C-k> <C-f>D<C-c><C-c>:<Up> - -function! s:home() - let start_col = col('.') - normal! ^ - if col('.') == start_col - normal! 0 - endif - return '' -endfunction - -function! s:kill_line() - let [text_before_cursor, text_after_cursor] = s:split_line_text_at_cursor() - if len(text_after_cursor) == 0 - normal! J - else - call setline(line('.'), text_before_cursor) - endif - return '' -endfunction - -function! s:split_line_text_at_cursor() - let line_text = getline(line('.')) - let text_after_cursor = line_text[col('.')-1 :] - let text_before_cursor = (col('.') > 1) ? line_text[: col('.')-2] : '' - return [text_before_cursor, text_after_cursor] -endfunction diff --git a/vim/.vim/plugin/multiple_cursors.vim b/vim/.vim/plugin/multiple_cursors.vim @@ -40,26 +40,42 @@ let s:settings_if_default = { \ 'skip_key': '<C-x>', \ } +let s:default_insert_maps = {} +let s:default_normal_maps = {'!':1, '@':1, '=':1, 'q':1, 'r':1, 't':1, 'T':1, 'y':1, '[':1, ']':1, '\':1, 'd':1, 'f':1, 'F':1, 'g':1, '"':1, 'z':1, 'c':1, 'm':1, '<':1, '>':1} + +let g:multi_cursor_insert_maps = + \ get(g:, 'multi_cursor_insert_maps', s:default_insert_maps) +let g:multi_cursor_normal_maps = + \ get(g:, 'multi_cursor_normal_maps', s:default_normal_maps) + call s:init_settings(s:settings) if g:multi_cursor_use_default_mapping call s:init_settings(s:settings_if_default) endif -if !exists('g:multi_cursor_start_key') && exists('g:multi_cursor_next_key') - let g:multi_cursor_start_key = g:multi_cursor_next_key +if !exists('g:multi_cursor_start_word_key') && exists('g:multi_cursor_next_key') + let g:multi_cursor_start_word_key = g:multi_cursor_next_key endif " External mappings if exists('g:multi_cursor_start_key') exec 'nnoremap <silent> '.g:multi_cursor_start_key. - \' :call multiple_cursors#new("n")<CR>' + \' :call multiple_cursors#new("n", 0)<CR>' exec 'xnoremap <silent> '.g:multi_cursor_start_key. - \' :<C-u>call multiple_cursors#new("v")<CR>' + \' :<C-u>call multiple_cursors#new("v", 0)<CR>' +endif + +if exists('g:multi_cursor_start_word_key') + exec 'nnoremap <silent> '.g:multi_cursor_start_word_key. + \' :call multiple_cursors#new("n", 1)<CR>' + " In Visual mode word boundary is not used + exec 'xnoremap <silent> '.g:multi_cursor_start_word_key. + \' :<C-u>call multiple_cursors#new("v", 0)<CR>' endif " Commands -command! -nargs=1 -range=% MultipleCursorsFind +command! -nargs=1 -range=% MultipleCursorsFind \ call multiple_cursors#find(<line1>, <line2>, <q-args>) let &cpo = s:save_cpo diff --git a/vim/.vimrc b/vim/.vimrc @@ -27,14 +27,6 @@ map <C-d> <Ins> map <C-x> :tabp<cr> map <C-c> :tabn<cr> -" Default mapping -let g:multi_cursor_use_default_mapping=0 -let g:multi_cursor_start_key='<C-l>' -let g:multi_cursor_next_key='<C-l>' -let g:multi_cursor_prev_key='<C-p>' -let g:multi_cursor_skip_key='<C-x>' -let g:multi_cursor_quit_key='<Esc>' - " YAY COLOR syntax on hi SpecialKey ctermfg=black cterm=bold