raylu преди 13 години
родител
ревизия
53b7fca1e2
променени са 3 файла, в които са добавени 965 реда и са изтрити 0 реда
  1. 573 0
      vim/autoload/EasyMotion.vim
  2. 319 0
      vim/doc/easymotion.txt
  3. 73 0
      vim/plugin/EasyMotion.vim

+ 573 - 0
vim/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

+ 319 - 0
vim/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:

+ 73 - 0
vim/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