Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

安装 EasyMotion

  • Loading branch information...
commit 2d393f13846686ab2fd62ebabaf81593e9b3fae2 1 parent ffd6de1
@lilydjwg authored
View
573 autoload/EasyMotion.vim
@@ -0,0 +1,573 @@
+" EasyMotion - Vim motions on speed!
+"
+" Author: Kim Silkebækken <kim.silkebaekken+vim@gmail.com>
+" Source repository: https://github.com/Lokaltog/vim-easymotion
+
+" Default configuration functions {{{
+ function! EasyMotion#InitOptions(options) " {{{
+ for [key, value] in items(a:options)
+ if ! exists('g:EasyMotion_' . key)
+ exec 'let g:EasyMotion_' . key . ' = ' . string(value)
+ endif
+ endfor
+ endfunction " }}}
+ function! EasyMotion#InitHL(group, colors) " {{{
+ let group_default = a:group . 'Default'
+
+ " Prepare highlighting variables
+ let guihl = printf('guibg=%s guifg=%s gui=%s', a:colors.gui[0], a:colors.gui[1], a:colors.gui[2])
+ if !exists('g:CSApprox_loaded')
+ let ctermhl = &t_Co == 256
+ \ ? printf('ctermbg=%s ctermfg=%s cterm=%s', a:colors.cterm256[0], a:colors.cterm256[1], a:colors.cterm256[2])
+ \ : printf('ctermbg=%s ctermfg=%s cterm=%s', a:colors.cterm[0], a:colors.cterm[1], a:colors.cterm[2])
+ else
+ let ctermhl = ''
+ endif
+
+ " Create default highlighting group
+ execute printf('hi default %s %s %s', group_default, guihl, ctermhl)
+
+ " Check if the hl group exists
+ if hlexists(a:group)
+ redir => hlstatus | exec 'silent hi ' . a:group | redir END
+
+ " Return if the group isn't cleared
+ if hlstatus !~ 'cleared'
+ return
+ endif
+ endif
+
+ " No colors are defined for this group, link to defaults
+ execute printf('hi default link %s %s', a:group, group_default)
+ endfunction " }}}
+ function! EasyMotion#InitMappings(motions) "{{{
+ for motion in keys(a:motions)
+ call EasyMotion#InitOptions({ 'mapping_' . motion : g:EasyMotion_leader_key . motion })
+ endfor
+
+ if g:EasyMotion_do_mapping
+ for [motion, fn] in items(a:motions)
+ if empty(g:EasyMotion_mapping_{motion})
+ continue
+ endif
+
+ silent exec 'nnoremap <silent> ' . g:EasyMotion_mapping_{motion} . ' :call EasyMotion#' . fn.name . '(0, ' . fn.dir . ')<CR>'
+ silent exec 'onoremap <silent> ' . g:EasyMotion_mapping_{motion} . ' :call EasyMotion#' . fn.name . '(0, ' . fn.dir . ')<CR>'
+ silent exec 'vnoremap <silent> ' . g:EasyMotion_mapping_{motion} . ' :<C-U>call EasyMotion#' . fn.name . '(1, ' . fn.dir . ')<CR>'
+ endfor
+ endif
+ endfunction "}}}
+" }}}
+" Motion functions {{{
+ function! EasyMotion#F(visualmode, direction) " {{{
+ let char = s:GetSearchChar(a:visualmode)
+
+ if empty(char)
+ return
+ endif
+
+ let re = '\C' . escape(char, '.$^~')
+
+ call s:EasyMotion(re, a:direction, a:visualmode ? visualmode() : '', mode(1))
+ endfunction " }}}
+ function! EasyMotion#T(visualmode, direction) " {{{
+ let char = s:GetSearchChar(a:visualmode)
+
+ if empty(char)
+ return
+ endif
+
+ if a:direction == 1
+ let re = '\C' . escape(char, '.$^~') . '\zs.'
+ else
+ let re = '\C.' . escape(char, '.$^~')
+ endif
+
+ call s:EasyMotion(re, a:direction, a:visualmode ? visualmode() : '', mode(1))
+ endfunction " }}}
+ function! EasyMotion#WB(visualmode, direction) " {{{
+ call s:EasyMotion('\(\<.\|^$\)', a:direction, a:visualmode ? visualmode() : '', '')
+ endfunction " }}}
+ function! EasyMotion#WBW(visualmode, direction) " {{{
+ call s:EasyMotion('\(\(^\|\s\)\@<=\S\|^$\)', a:direction, a:visualmode ? visualmode() : '', '')
+ endfunction " }}}
+ function! EasyMotion#E(visualmode, direction) " {{{
+ call s:EasyMotion('\(.\>\|^$\)', a:direction, a:visualmode ? visualmode() : '', mode(1))
+ endfunction " }}}
+ function! EasyMotion#EW(visualmode, direction) " {{{
+ call s:EasyMotion('\(\S\(\s\|$\)\|^$\)', a:direction, a:visualmode ? visualmode() : '', mode(1))
+ endfunction " }}}
+ function! EasyMotion#JK(visualmode, direction) " {{{
+ call s:EasyMotion('^\(\w\|\s*\zs\|$\)', a:direction, a:visualmode ? visualmode() : '', '')
+ endfunction " }}}
+ function! EasyMotion#Search(visualmode, direction) " {{{
+ call s:EasyMotion(@/, a:direction, a:visualmode ? visualmode() : '', '')
+ endfunction " }}}
+" }}}
+" Helper functions {{{
+ function! s:Message(message) " {{{
+ echo 'EasyMotion: ' . a:message
+ endfunction " }}}
+ function! s:Prompt(message) " {{{
+ echohl Question
+ echo a:message . ': '
+ echohl None
+ endfunction " }}}
+ function! s:VarReset(var, ...) " {{{
+ if ! exists('s:var_reset')
+ let s:var_reset = {}
+ endif
+
+ let buf = bufname("")
+
+ if a:0 == 0 && has_key(s:var_reset, a:var)
+ " Reset var to original value
+ call setbufvar(buf, a:var, s:var_reset[a:var])
+ elseif a:0 == 1
+ let new_value = a:0 == 1 ? a:1 : ''
+
+ " Store original value
+ let s:var_reset[a:var] = getbufvar(buf, a:var)
+
+ " Set new var value
+ call setbufvar(buf, a:var, new_value)
+ endif
+ endfunction " }}}
+ function! s:SetLines(lines, key) " {{{
+ try
+ " Try to join changes with previous undo block
+ undojoin
+ catch
+ endtry
+
+ for [line_num, line] in a:lines
+ call setline(line_num, line[a:key])
+ endfor
+ endfunction " }}}
+ function! s:GetChar() " {{{
+ let char = getchar()
+
+ if char == 27
+ " Escape key pressed
+ redraw
+
+ call s:Message('Cancelled')
+
+ return ''
+ endif
+
+ return nr2char(char)
+ endfunction " }}}
+ function! s:GetSearchChar(visualmode) " {{{
+ call s:Prompt('Search for character')
+
+ let char = s:GetChar()
+
+ " Check that we have an input char
+ if empty(char)
+ " Restore selection
+ if ! empty(a:visualmode)
+ silent exec 'normal! gv'
+ endif
+
+ return ''
+ endif
+
+ return char
+ endfunction " }}}
+" }}}
+" Grouping algorithms {{{
+ let s:grouping_algorithms = {
+ \ 1: 'SCTree'
+ \ , 2: 'Original'
+ \ }
+ " Single-key/closest target priority tree {{{
+ " This algorithm tries to assign one-key jumps to all the targets closest to the cursor.
+ " It works recursively and will work correctly with as few keys as two.
+ function! s:GroupingAlgorithmSCTree(targets, keys)
+ " Prepare variables for working
+ let targets_len = len(a:targets)
+ let keys_len = len(a:keys)
+
+ let groups = {}
+
+ let keys = reverse(copy(a:keys))
+
+ " Semi-recursively count targets {{{
+ " We need to know exactly how many child nodes (targets) this branch will have
+ " in order to pass the correct amount of targets to the recursive function.
+
+ " Prepare sorted target count list {{{
+ " This is horrible, I know. But dicts aren't sorted in vim, so we need to
+ " work around that. That is done by having one sorted list with key counts,
+ " and a dict which connects the key with the keys_count list.
+
+ let keys_count = []
+ let keys_count_keys = {}
+
+ let i = 0
+ for key in keys
+ call add(keys_count, 0)
+
+ let keys_count_keys[key] = i
+
+ let i += 1
+ endfor
+ " }}}
+
+ let targets_left = targets_len
+ let level = 0
+ let i = 0
+
+ while targets_left > 0
+ " Calculate the amount of child nodes based on the current level
+ let childs_len = (level == 0 ? 1 : (keys_len - 1) )
+
+ for key in keys
+ " Add child node count to the keys_count array
+ let keys_count[keys_count_keys[key]] += childs_len
+
+ " Subtract the child node count
+ let targets_left -= childs_len
+
+ if targets_left <= 0
+ " Subtract the targets left if we added too many too
+ " many child nodes to the key count
+ let keys_count[keys_count_keys[key]] += targets_left
+
+ break
+ endif
+
+ let i += 1
+ endfor
+
+ let level += 1
+ endwhile
+ " }}}
+ " Create group tree {{{
+ let i = 0
+ let key = 0
+
+ call reverse(keys_count)
+
+ for key_count in keys_count
+ if key_count > 1
+ " We need to create a subgroup
+ " Recurse one level deeper
+ let groups[a:keys[key]] = s:GroupingAlgorithmSCTree(a:targets[i : i + key_count - 1], a:keys)
+ elseif key_count == 1
+ " Assign single target key
+ let groups[a:keys[key]] = a:targets[i]
+ else
+ " No target
+ continue
+ endif
+
+ let key += 1
+ let i += key_count
+ endfor
+ " }}}
+
+ " Finally!
+ return groups
+ endfunction
+ " }}}
+ " Original {{{
+ function! s:GroupingAlgorithmOriginal(targets, keys)
+ " Split targets into groups (1 level)
+ let targets_len = len(a:targets)
+ let keys_len = len(a:keys)
+
+ let groups = {}
+
+ let i = 0
+ let root_group = 0
+ try
+ while root_group < targets_len
+ let groups[a:keys[root_group]] = {}
+
+ for key in a:keys
+ let groups[a:keys[root_group]][key] = a:targets[i]
+
+ let i += 1
+ endfor
+
+ let root_group += 1
+ endwhile
+ catch | endtry
+
+ " Flatten the group array
+ if len(groups) == 1
+ let groups = groups[a:keys[0]]
+ endif
+
+ return groups
+ endfunction
+ " }}}
+ " Coord/key dictionary creation {{{
+ function! s:CreateCoordKeyDict(groups, ...)
+ " Dict structure:
+ " 1,2 : a
+ " 2,3 : b
+ let sort_list = []
+ let coord_keys = {}
+ let group_key = a:0 == 1 ? a:1 : ''
+
+ for [key, item] in items(a:groups)
+ let key = ( ! empty(group_key) ? group_key : key)
+
+ if type(item) == 3
+ " Destination coords
+
+ " The key needs to be zero-padded in order to
+ " sort correctly
+ let dict_key = printf('%05d,%05d', item[0], item[1])
+ let coord_keys[dict_key] = key
+
+ " We need a sorting list to loop correctly in
+ " PromptUser, dicts are unsorted
+ call add(sort_list, dict_key)
+ else
+ " Item is a dict (has children)
+ let coord_key_dict = s:CreateCoordKeyDict(item, key)
+
+ " Make sure to extend both the sort list and the
+ " coord key dict
+ call extend(sort_list, coord_key_dict[0])
+ call extend(coord_keys, coord_key_dict[1])
+ endif
+
+ unlet item
+ endfor
+
+ return [sort_list, coord_keys]
+ endfunction
+ " }}}
+" }}}
+" Core functions {{{
+ function! s:PromptUser(groups) "{{{
+ " If only one possible match, jump directly to it {{{
+ let group_values = values(a:groups)
+
+ if len(group_values) == 1
+ redraw
+
+ return group_values[0]
+ endif
+ " }}}
+ " Prepare marker lines {{{
+ let lines = {}
+ let hl_coords = []
+ let coord_key_dict = s:CreateCoordKeyDict(a:groups)
+
+ for dict_key in sort(coord_key_dict[0])
+ let target_key = coord_key_dict[1][dict_key]
+ let [line_num, col_num] = split(dict_key, ',')
+
+ let line_num = str2nr(line_num)
+ let col_num = str2nr(col_num)
+
+ " Add original line and marker line
+ if ! has_key(lines, line_num)
+ let current_line = getline(line_num)
+
+ let lines[line_num] = { 'orig': current_line, 'marker': current_line, 'mb_compensation': 0 }
+ endif
+
+ " Compensate for byte difference between marker
+ " character and target character
+ "
+ " This has to be done in order to match the correct
+ " column; \%c matches the byte column and not display
+ " column.
+ let target_char_len = strlen(matchstr(lines[line_num]['marker'], '\%' . col_num . 'c.'))
+ let target_key_len = strlen(target_key)
+
+ " Solve multibyte issues by matching the byte column
+ " number instead of the visual column
+ let col_num -= lines[line_num]['mb_compensation']
+
+ if strlen(lines[line_num]['marker']) > 0
+ " Substitute marker character if line length > 0
+ let lines[line_num]['marker'] = substitute(lines[line_num]['marker'], '\%' . col_num . 'c.', target_key, '')
+ else
+ " Set the line to the marker character if the line is empty
+ let lines[line_num]['marker'] = target_key
+ endif
+
+ " Add highlighting coordinates
+ call add(hl_coords, '\%' . line_num . 'l\%' . col_num . 'c')
+
+ " Add marker/target lenght difference for multibyte
+ " compensation
+ let lines[line_num]['mb_compensation'] += (target_char_len - target_key_len)
+ endfor
+
+ let lines_items = items(lines)
+ " }}}
+ " Highlight targets {{{
+ let target_hl_id = matchadd(g:EasyMotion_hl_group_target, join(hl_coords, '\|'), 1)
+ " }}}
+
+ try
+ " Set lines with markers
+ call s:SetLines(lines_items, 'marker')
+
+ redraw
+
+ " Get target character {{{
+ call s:Prompt('Target key')
+
+ let char = s:GetChar()
+ " }}}
+ finally
+ " Restore original lines
+ call s:SetLines(lines_items, 'orig')
+
+ " Un-highlight targets {{{
+ if exists('target_hl_id')
+ call matchdelete(target_hl_id)
+ endif
+ " }}}
+
+ redraw
+ endtry
+
+ " Check if we have an input char {{{
+ if empty(char)
+ throw 'Cancelled'
+ endif
+ " }}}
+ " Check if the input char is valid {{{
+ if ! has_key(a:groups, char)
+ throw 'Invalid target'
+ endif
+ " }}}
+
+ let target = a:groups[char]
+
+ if type(target) == 3
+ " Return target coordinates
+ return target
+ else
+ " Prompt for new target character
+ return s:PromptUser(target)
+ endif
+ endfunction "}}}
+ function! s:EasyMotion(regexp, direction, visualmode, mode) " {{{
+ let orig_pos = [line('.'), col('.')]
+ let targets = []
+
+ try
+ " Reset properties {{{
+ call s:VarReset('&scrolloff', 0)
+ call s:VarReset('&modified', 0)
+ call s:VarReset('&modifiable', 1)
+ call s:VarReset('&readonly', 0)
+ call s:VarReset('&spell', 0)
+ call s:VarReset('&virtualedit', '')
+ " }}}
+ " Find motion targets {{{
+ let search_direction = (a:direction == 1 ? 'b' : '')
+ let search_stopline = line(a:direction == 1 ? 'w0' : 'w$')
+
+ while 1
+ let pos = searchpos(a:regexp, search_direction, search_stopline)
+
+ " Reached end of search range
+ if pos == [0, 0]
+ break
+ endif
+
+ " Skip folded lines
+ if foldclosed(pos[0]) != -1
+ continue
+ endif
+
+ call add(targets, pos)
+ endwhile
+
+ let targets_len = len(targets)
+ if targets_len == 0
+ throw 'No matches'
+ endif
+ " }}}
+
+ let GroupingFn = function('s:GroupingAlgorithm' . s:grouping_algorithms[g:EasyMotion_grouping])
+ let groups = GroupingFn(targets, split(g:EasyMotion_keys, '\zs'))
+
+ " Shade inactive source {{{
+ if g:EasyMotion_do_shade
+ let shade_hl_pos = '\%' . orig_pos[0] . 'l\%'. orig_pos[1] .'c'
+
+ if a:direction == 1
+ " Backward
+ let shade_hl_re = '\%'. line('w0') .'l\_.*' . shade_hl_pos
+ else
+ " Forward
+ let shade_hl_re = shade_hl_pos . '\_.*\%'. line('w$') .'l'
+ endif
+
+ let shade_hl_id = matchadd(g:EasyMotion_hl_group_shade, shade_hl_re, 0)
+ endif
+ " }}}
+
+ " Prompt user for target group/character
+ let coords = s:PromptUser(groups)
+
+ " Update selection {{{
+ if ! empty(a:visualmode)
+ keepjumps call cursor(orig_pos[0], orig_pos[1])
+
+ exec 'normal! ' . a:visualmode
+ endif
+ " }}}
+ " Handle operator-pending mode {{{
+ if a:mode == 'no'
+ " This mode requires that we eat one more
+ " character to the right if we're using
+ " a forward motion
+ if a:direction != 1
+ let coords[1] += 1
+ endif
+ endif
+ " }}}
+
+ " Update cursor position
+ call cursor(orig_pos[0], orig_pos[1])
+ mark '
+ call cursor(coords[0], coords[1])
+
+ call s:Message('Jumping to [' . coords[0] . ', ' . coords[1] . ']')
+ catch
+ redraw
+
+ " Show exception message
+ call s:Message(v:exception)
+
+ " Restore original cursor position/selection {{{
+ if ! empty(a:visualmode)
+ silent exec 'normal! gv'
+ else
+ keepjumps call cursor(orig_pos[0], orig_pos[1])
+ endif
+ " }}}
+ finally
+ " Restore properties {{{
+ call s:VarReset('&scrolloff')
+ call s:VarReset('&modified')
+ call s:VarReset('&modifiable')
+ call s:VarReset('&readonly')
+ call s:VarReset('&spell')
+ call s:VarReset('&virtualedit')
+ " }}}
+ " Remove shading {{{
+ if g:EasyMotion_do_shade && exists('shade_hl_id')
+ call matchdelete(shade_hl_id)
+ endif
+ " }}}
+ endtry
+ endfunction " }}}
+" }}}
+
+" vim: fdm=marker:noet:ts=4:sw=4:sts=4
View
319 doc/easymotion.txt
@@ -0,0 +1,319 @@
+*easymotion.txt* Version 1.3. Last change: 2011 Nov 7
+
+
+ ______ __ ___ __ _
+ / ____/____ ________ __/ |/ /____ / /_(_)____ ____
+ / __/ / __ `/ ___/ / / / /|_/ // __ \/ __/ // __ \/ __ \
+ / /___ / /_/ (__ ) /_/ / / / // /_/ / /_/ // /_/ / / / /
+ /_____/ \__,_/____/\__, /_/ /_/ \____/\__/_/ \____/_/ /_/
+ /____/
+ - Vim motions on speed!
+
+
+==============================================================================
+CONTENTS *easymotion-contents*
+
+ 1. Introduction ....................... |easymotion-introduction|
+ 2. Usage .............................. |easymotion-usage|
+ 2.1 Default mappings ............... |easymotion-default-mappings|
+ 3. Requirements ....................... |easymotion-requirements|
+ 4. Configuration ...................... |easymotion-configuration|
+ 4.1 EasyMotion_keys ................ |EasyMotion_keys|
+ 4.2 EasyMotion_do_shade ............ |EasyMotion_do_shade|
+ 4.3 EasyMotion_do_mapping .......... |EasyMotion_do_mapping|
+ 4.4 EasyMotion_grouping ............ |EasyMotion_grouping|
+ 4.5 Custom highlighting ............ |easymotion-custom-hl|
+ 4.6 Custom mappings ................ |easymotion-custom-mappings|
+ 4.6.1 Leader key ............... |easymotion-leader-key|
+ 4.6.2 Custom keys .............. |easymotion-custom-keys|
+ 5. License ............................ |easymotion-license|
+ 6. Known bugs ......................... |easymotion-known-bugs|
+ 7. Contributing ....................... |easymotion-contributing|
+ 8. Credits ............................ |easymotion-credits|
+
+==============================================================================
+1. Introduction *easymotion* *easymotion-introduction*
+
+EasyMotion provides a much simpler way to use some motions in vim. It takes
+the <number> out of <number>w or <number>f{char} by highlighting all possible
+choices and allowing you to press one key to jump directly to the target.
+
+When one of the available motions is triggered, all visible text preceding or
+following the cursor is faded, and motion targets are highlighted.
+
+==============================================================================
+2. Usage *easymotion-usage*
+
+EasyMotion is triggered by one of the provided mappings (see
+|easymotion-default-mappings| for details).
+
+Example: >
+
+ <cursor>Lorem ipsum dolor sit amet.
+
+Type <Leader><Leader>w to trigger the word motion |w|. See
+|easymotion-leader-key| for details about the leader key. When the
+motion is triggered, the text is updated (no braces are actually added,
+the text is highlighted in red by default): >
+
+ <cursor>Lorem {a}psum {b}olor {c}it {d}met.
+
+Press "c" to jump to the beginning of the word "sit": >
+
+ Lorem ipsum dolor <cursor>sit amet.
+
+Similarly, if you're looking for an "o", you can use the |f| motion.
+Type <Leader><Leader>fo, and all "o" characters are highlighted: >
+
+ <cursor>L{a}rem ipsum d{b}l{c}r sit amet.
+
+Press "b" to jump to the second "o": >
+
+ Lorem ipsum d<cursor>olor sit amet.
+
+And that's it!
+
+------------------------------------------------------------------------------
+2.1 Default mappings *easymotion-default-mappings*
+
+The default configuration defines the following mappings in normal,
+visual and operator-pending mode:
+
+ Mapping | Details
+ ------------------|----------------------------------------------
+ <Leader>f{char} | Find {char} to the right. See |f|.
+ <Leader>F{char} | Find {char} to the left. See |F|.
+ <Leader>t{char} | Till before the {char} to the right. See |t|.
+ <Leader>T{char} | Till after the {char} to the left. See |T|.
+ <Leader>w | Beginning of word forward. See |w|.
+ <Leader>W | Beginning of WORD forward. See |W|.
+ <Leader>b | Beginning of word backward. See |b|.
+ <Leader>B | Beginning of WORD backward. See |B|.
+ <Leader>e | End of word forward. See |e|.
+ <Leader>E | End of WORD forward. See |E|.
+ <Leader>ge | End of word backward. See |ge|.
+ <Leader>gE | End of WORD backward. See |gE|.
+ <Leader>j | Line downward. See |j|.
+ <Leader>k | Line upward. See |k|.
+ <Leader>n | Jump to latest "/" or "?" forward. See |n|.
+ <Leader>N | Jump to latest "/" or "?" backward. See |N|.
+
+See |easymotion-leader-key| and |mapleader| for details about the leader key.
+See |easymotion-custom-mappings| for customizing the default mappings.
+
+==============================================================================
+3. Requirements *easymotion-requirements*
+
+EasyMotion has been developed and tested in vim 7.3, but it should run without
+any problems in vim 7.2.
+
+Vi-compatible mode must be disabled.
+
+==============================================================================
+4. Configuration *easymotion-configuration*
+
+EasyMotion will work fine without any configuration, but you can override the
+default behavior by setting configuration variables globally in your |vimrc|
+file.
+
+Example (this will change the target keys and disable shading): >
+
+ let g:EasyMotion_keys = '1234567890'
+ let g:EasyMotion_do_shade = 0
+
+------------------------------------------------------------------------------
+4.1 EasyMotion_keys *EasyMotion_keys*
+
+Set the keys which will be used for motion targets. Add as many keys as you
+want. There's a lower chance that the motion targets will be grouped if many
+keys are available.
+
+Default: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
+
+------------------------------------------------------------------------------
+4.2 EasyMotion_do_shade *EasyMotion_do_shade*
+
+The default behavior is to shade the text following the cursor (forward
+motions) or preceding the cursor (backward motions) to make the motion targets
+more visible. Set this option to 0 if you want to disable text shading.
+
+Default: 1
+
+------------------------------------------------------------------------------
+4.3 EasyMotion_do_mapping *EasyMotion_do_mapping*
+
+Set this option to 0 if you want to disable the default mappings. See
+|easymotion-default-mappings| for details about the default mappings.
+
+Note: If you disable this option, you'll have to map the motions yourself. See
+the plugin source code for mapping details. You usually shouldn't need to do
+this, see |easymotion-custom-mappings| for customizing the default mappings.
+
+Default: 1
+
+------------------------------------------------------------------------------
+4.4 EasyMotion_grouping *EasyMotion_grouping*
+
+When there are too many possible targets on the screen, the results have to be
+grouped. This configuration option lets you change which grouping algorithm
+you want to use. There are two grouping algorithms available:
+
+ * Single-key priority (value: 1)
+ -------------------
+
+ This algorithm prioritizes single-key jumps for the targets closest to
+ the cursor and only groups the last jump targets to maximize the amount
+ of single-key jumps.
+
+ This algorithm works recursively and will work with as few keys as two.
+
+ Example (with |EasyMotion_keys| = "abcdef"): >
+
+ x x x x x x x x x
+<
+ The |w| motion is triggered: >
+
+ a b c d e f f f f
+ ^ ^ ^ ^ ^ Direct jump to target
+ ^ ^ ^ ^ Enter group "f"
+<
+ * Original (value: 2)
+ --------
+
+ This is the original algorithm which always groups all targets if there
+ are too many possible motion targets.
+
+ Example (with |EasyMotion_keys| = "abcdef"): >
+
+ x x x x x x x x x
+<
+ The |w| motion is triggered: >
+
+ a a a a a a b b b
+ ^ ^ ^ ^ ^ ^ Enter group "a"
+ ^ ^ ^ Enter group "b"
+
+Default: 1
+
+------------------------------------------------------------------------------
+4.5 Custom highlighting *easymotion-custom-hl*
+
+The default EasyMotion configuration uses two highlighting groups that link
+to groups with default values. The highlighting groups are:
+
+ * EasyMotionTarget
+
+ Highlights motion targets, the default value is bold red
+
+ * EasyMotionShade
+
+ Highlights shaded text, the default value is dark gray
+
+There are two ways to override the default colors:
+
+ 1) Set the highlighting in your color scheme
+
+ This will only affect a single color scheme. The default red/gray colors
+ will be used if you change the color scheme to one that doesn't assign
+ any EasyMotion colors.
+
+ Example: >
+
+ hi EasyMotionTarget ctermbg=none ctermfg=green
+ hi EasyMotionShade ctermbg=none ctermfg=blue
+<
+ 2) Set the highlighting in your vimrc
+
+ This is ideal if you want to link the colors to highlighting groups that
+ are available in almost every color scheme, e.g. |ErrorMsg| (usually
+ bright red) and Comment (usually faded). You can be sure that the
+ color scheme's colors will be used instead of the default red/gray
+ if you choose this option.
+
+ Example: >
+
+ hi link EasyMotionTarget ErrorMsg
+ hi link EasyMotionShade Comment
+<
+------------------------------------------------------------------------------
+4.6 Custom mappings *easymotion-custom-mappings*
+
+EasyMotion allows you to customize all default mappings to avoid conflicts
+with existing mappings. It is possible to change the default leader key
+of all mappings to another key or sequence. It is also possible to fine
+tune the plugin to your need by changing every single sequence.
+
+4.6.1 Leader key *EasyMotion_leader_key* *easymotion-leader-key*
+
+The default leader key can be changed with the configuration option
+|EasyMotion_leader_key|.
+
+Set this option to the key sequence to use as the prefix of the mappings
+described in |easymotion-default-mappings|.
+
+Note: The default leader key has been changed to '<Leader><Leader>' to
+avoid conflicts with other plugins. You can revert to the original
+leader by setting this option in your vimrc: >
+
+ let g:EasyMotion_leader_key = '<Leader>'
+<
+Default: '<Leader><Leader>'
+
+4.6.2 Custom Keys *easymotion-custom-keys*
+
+All custom mappings follow the same variable format: >
+
+ EasyMotion_mapping_{motion} = {mapping}
+<
+Example: >
+
+ let g:EasyMotion_mapping_f = '_f'
+ let g:EasyMotion_mapping_T = '<C-T>'
+<
+See |easymotion-default-mappings| for a table of motions that can be mapped
+and their default values.
+
+Note: The leader key defined by |EasyMotion_leader_key| is not prepended to
+your customized mappings! You have to provide full key sequences when setting
+these options.
+
+==============================================================================
+5. License *easymotion-license*
+
+Creative Commons Attribution-ShareAlike 3.0 Unported
+
+http://creativecommons.org/licenses/by-sa/3.0/
+
+==============================================================================
+6. Known bugs *easymotion-known-bugs*
+
+None.
+
+==============================================================================
+7. Contributing *easymotion-contributing*
+
+If you experience any bugs or have feature requests, please open an issue on
+GitHub. Fork the source repository on GitHub and send a pull request if you
+have any code improvements.
+
+Author: Kim Silkebækken <kim.silkebaekken+vim@gmail.com>
+Source repository: https://github.com/Lokaltog/vim-easymotion
+
+==============================================================================
+8. Credits *easymotion-credits*
+
+- Ben Boeckel: ge and WORD motions
+- Drew Neil: operator-pending mappings
+- Rob O'Dwyer: customizable mappings without giving up all defaults
+- Michel D'Hooge: customizable leader
+- Maxime Bourget: search motion, improved JK motion behavior
+- Kearn Holliday: fix jumplist issues
+- Shougo Matsushita: fix CSApprox issue
+
+EasyMotion is based on Bartlomiej Podolak's great PreciseJump script, which
+can be downloaded here:
+
+http://www.vim.org/scripts/script.php?script_id=3437
+
+==============================================================================
+vim:tw=78:sw=4:ts=8:ft=help:norl:
View
21 doc/tags
@@ -225,6 +225,11 @@ CountJump-todo CountJump.txt /*CountJump-todo*
CountJump-usage CountJump.txt /*CountJump-usage*
CountJump.txt CountJump.txt /*CountJump.txt*
CountJump.vim CountJump.txt /*CountJump.vim*
+EasyMotion_do_mapping easymotion.txt /*EasyMotion_do_mapping*
+EasyMotion_do_shade easymotion.txt /*EasyMotion_do_shade*
+EasyMotion_grouping easymotion.txt /*EasyMotion_grouping*
+EasyMotion_keys easymotion.txt /*EasyMotion_keys*
+EasyMotion_leader_key easymotion.txt /*EasyMotion_leader_key*
EnhComm-Bugs EnhancedCommentify.txt /*EnhComm-Bugs*
EnhComm-Credits EnhancedCommentify.txt /*EnhComm-Credits*
EnhComm-EnhCommentify EnhancedCommentify.txt /*EnhComm-EnhCommentify*
@@ -548,6 +553,22 @@ dav pi_netrw.txt /*dav*
davs pi_netrw.txt /*davs*
dictionary_complete neocomplcache.txt /*dictionary_complete*
ds surround.txt /*ds*
+easymotion easymotion.txt /*easymotion*
+easymotion-configuration easymotion.txt /*easymotion-configuration*
+easymotion-contents easymotion.txt /*easymotion-contents*
+easymotion-contributing easymotion.txt /*easymotion-contributing*
+easymotion-credits easymotion.txt /*easymotion-credits*
+easymotion-custom-hl easymotion.txt /*easymotion-custom-hl*
+easymotion-custom-keys easymotion.txt /*easymotion-custom-keys*
+easymotion-custom-mappings easymotion.txt /*easymotion-custom-mappings*
+easymotion-default-mappings easymotion.txt /*easymotion-default-mappings*
+easymotion-introduction easymotion.txt /*easymotion-introduction*
+easymotion-known-bugs easymotion.txt /*easymotion-known-bugs*
+easymotion-leader-key easymotion.txt /*easymotion-leader-key*
+easymotion-license easymotion.txt /*easymotion-license*
+easymotion-requirements easymotion.txt /*easymotion-requirements*
+easymotion-usage easymotion.txt /*easymotion-usage*
+easymotion.txt easymotion.txt /*easymotion.txt*
ex-visincr-I visincr.txt /*ex-visincr-I*
ex-visincr-IA visincr.txt /*ex-visincr-IA*
ex-visincr-ID visincr.txt /*ex-visincr-ID*
View
73 plugin/EasyMotion.vim
@@ -0,0 +1,73 @@
+" EasyMotion - Vim motions on speed!
+"
+" Author: Kim Silkebækken <kim.silkebaekken+vim@gmail.com>
+" Source repository: https://github.com/Lokaltog/vim-easymotion
+
+" Script initialization {{{
+ if exists('g:EasyMotion_loaded') || &compatible || version < 702
+ finish
+ endif
+
+ let g:EasyMotion_loaded = 1
+" }}}
+" Default configuration {{{
+ " Default options {{{
+ call EasyMotion#InitOptions({
+ \ 'leader_key' : '<Leader><Leader>'
+ \ , 'keys' : 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ \ , 'do_shade' : 1
+ \ , 'do_mapping' : 1
+ \ , 'grouping' : 1
+ \
+ \ , 'hl_group_target' : 'EasyMotionTarget'
+ \ , 'hl_group_shade' : 'EasyMotionShade'
+ \ })
+ " }}}
+ " Default highlighting {{{
+ let s:target_hl_defaults = {
+ \ 'gui' : ['NONE', '#ff0000' , 'bold']
+ \ , 'cterm256': ['NONE', '196' , 'bold']
+ \ , 'cterm' : ['NONE', 'red' , 'bold']
+ \ }
+
+ let s:shade_hl_defaults = {
+ \ 'gui' : ['NONE', '#777777' , 'NONE']
+ \ , 'cterm256': ['NONE', '242' , 'NONE']
+ \ , 'cterm' : ['NONE', 'grey' , 'NONE']
+ \ }
+
+ call EasyMotion#InitHL(g:EasyMotion_hl_group_target, s:target_hl_defaults)
+ call EasyMotion#InitHL(g:EasyMotion_hl_group_shade, s:shade_hl_defaults)
+
+ " Reset highlighting after loading a new color scheme {{{
+ augroup EasyMotionInitHL
+ autocmd!
+
+ autocmd ColorScheme * call EasyMotion#InitHL(g:EasyMotion_hl_group_target, s:target_hl_defaults)
+ autocmd ColorScheme * call EasyMotion#InitHL(g:EasyMotion_hl_group_shade, s:shade_hl_defaults)
+ augroup end
+ " }}}
+ " }}}
+ " Default key mapping {{{
+ call EasyMotion#InitMappings({
+ \ 'f' : { 'name': 'F' , 'dir': 0 }
+ \ , 'F' : { 'name': 'F' , 'dir': 1 }
+ \ , 't' : { 'name': 'T' , 'dir': 0 }
+ \ , 'T' : { 'name': 'T' , 'dir': 1 }
+ \ , 'w' : { 'name': 'WB' , 'dir': 0 }
+ \ , 'W' : { 'name': 'WBW', 'dir': 0 }
+ \ , 'b' : { 'name': 'WB' , 'dir': 1 }
+ \ , 'B' : { 'name': 'WBW', 'dir': 1 }
+ \ , 'e' : { 'name': 'E' , 'dir': 0 }
+ \ , 'E' : { 'name': 'EW' , 'dir': 0 }
+ \ , 'ge': { 'name': 'E' , 'dir': 1 }
+ \ , 'gE': { 'name': 'EW' , 'dir': 1 }
+ \ , 'j' : { 'name': 'JK' , 'dir': 0 }
+ \ , 'k' : { 'name': 'JK' , 'dir': 1 }
+ \ , 'n' : { 'name': 'Search' , 'dir': 0 }
+ \ , 'N' : { 'name': 'Search' , 'dir': 1 }
+ \ })
+ " }}}
+" }}}
+
+" vim: fdm=marker:noet:ts=4:sw=4:sts=4
View
5 vimrc
@@ -38,7 +38,7 @@ function Lilydjwg_join(sep, bang) range
if a:bang != '!'
call map(lines, "substitute(v:val, '^\\s\\+\\|\\s\\+$', '', 'g')")
endif
- call append(a:firstline -1, join(lines, sep))
+ call append(a:firstline-1, join(lines, sep))
if dellast
$d_
endif
@@ -782,6 +782,9 @@ command MusicSelect runtime so/musicselect.vim
command -nargs=1 -range -complete=customlist,Lilydjwg_Align_complete LA <line1>,<line2>call Lilydjwg_Align("<args>")
command -range=% Paste :<line1>,<line2>py3 LilyPaste()
" 插件配置[[[1
+" easymotion[[[2
+let EasyMotion_leader_key = '<M-q>'
+let EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyz'
" neocomplcache[[[2
let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_enable_camel_case_completion = 1
Please sign in to comment.
Something went wrong with that request. Please try again.