1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-23 13:40:05 +08:00

chore(bundle): update bundle clever-f

This commit is contained in:
wsdjeg 2022-04-08 23:52:26 +08:00
parent e7344bab8b
commit 9a21254747
9 changed files with 410 additions and 76 deletions

View File

@ -10,6 +10,7 @@ In `bundle/` directory, there are two kinds of plugins: forked plugins without c
- `neoformat`: based on [neoformat](https://github.com/sbdchd/neoformat/tree/f1b6cd506b72be0a2aaf529105320ec929683920) - `neoformat`: based on [neoformat](https://github.com/sbdchd/neoformat/tree/f1b6cd506b72be0a2aaf529105320ec929683920)
- `github-issues.vim`: based on [github-issues.vim](https://github.com/jaxbot/github-issues.vim/tree/46f1922d3d225ed659f3dda1c95e35001c9f41f4) - `github-issues.vim`: based on [github-issues.vim](https://github.com/jaxbot/github-issues.vim/tree/46f1922d3d225ed659f3dda1c95e35001c9f41f4)
- `vim-virtualenv`: based on [vim-virtualenv](https://github.com/jmcantrell/vim-virtualenv/tree/b1150223cd876f155ed7a3b2e285ed33f6f93873) - `vim-virtualenv`: based on [vim-virtualenv](https://github.com/jmcantrell/vim-virtualenv/tree/b1150223cd876f155ed7a3b2e285ed33f6f93873)
- `clever-f.vim`: based on [`clever-f.vim@fd370f2`](https://github.com/rhysd/clever-f.vim/tree/fd370f27cca93918184a8043220cef1aa440a1fd)
### No changed plugins ### No changed plugins

View File

@ -27,40 +27,48 @@ jobs:
PROFILE_LOG: profile.txt PROFILE_LOG: profile.txt
run: | run: |
cd ./test cd ./test
echo $THEMIS_VIM echo "${THEMIS_VIM}"
../vim-themis/bin/themis . ../vim-themis/bin/themis .
# covimerage seems not maintained for Windows. Skip taking code coverage on Windows # covimerage seems not maintained for Windows. Skip taking code coverage on Windows
- name: Install Python - name: Install Python
if: matrix.os != 'windows-latest' if: ${{ matrix.os != 'windows-latest' }}
uses: actions/setup-python@v1 uses: actions/setup-python@v1
- name: Install covimerage - name: Install covimerage
if: matrix.os != 'windows-latest' if: ${{ matrix.os != 'windows-latest' }}
run: | run: |
# https://github.com/Vimjas/covimerage/issues/95
pip install 'click<8.0.0'
pip install covimerage pip install covimerage
covimerage --version covimerage --version
- name: Run covimerage - name: Run covimerage
if: matrix.os != 'windows-latest' if: ${{ matrix.os != 'windows-latest' }}
run: | run: |
cd ./test cd ./test
covimerage write_coverage profile.txt covimerage write_coverage profile.txt
- name: Take coverage - name: Take coverage
if: matrix.os != 'windows-latest' if: ${{ matrix.os != 'windows-latest' }}
run: | run: |
cd ./test cd ./test
coverage report coverage report
coverage xml coverage xml
- name: Upload coverage to codecov - name: Upload coverage to codecov
if: matrix.os != 'windows-latest' if: ${{ matrix.os != 'windows-latest' }}
uses: codecov/codecov-action@v1 uses: codecov/codecov-action@v1
with: with:
token: ${{ secrets.CODECOV_TOKEN }} token: ${{ secrets.CODECOV_TOKEN }}
file: ./test/coverage.xml file: ./test/coverage.xml
vint: lint:
name: Run vint name: Lint
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions/setup-python@v1 - uses: actions/setup-python@v1
- run: pip install vim-vint - run: pip install vim-vint
- run: vint --warning --verbose --enable-neovim ./autoload ./plugin - run: vint --warning --verbose --enable-neovim ./autoload ./plugin
- run: sudo apt install shellcheck
- name: Run actionlint
run: |
bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
./actionlint -color
shell: bash

View File

@ -0,0 +1,33 @@
name: Weekly check
on:
schedule:
- cron: '0 0 * * 0'
jobs:
unit-tests:
name: Unit tests
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
neovim: [false, true]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- name: Checkout themis.vim
uses: actions/checkout@v2
with:
repository: thinca/vim-themis
path: vim-themis
- name: Install Vim or Neovim
uses: rhysd/action-setup-vim@v1
id: vim
with:
neovim: ${{ matrix.neovim }}
- name: Run unit tests
env:
THEMIS_VIM: ${{ steps.vim.outputs.executable }}
PROFILE_LOG: profile.txt
run: |
cd ./test
echo "$THEMIS_VIM"
../vim-themis/bin/themis .

View File

@ -19,7 +19,7 @@ Lastly, you can customize the behavior of the mappings and features.
## USAGE ## USAGE
![Screen shot](https://raw.githubusercontent.com/rhysd/screenshots/master/clever-f.vim/cleverf_main.gif) ![Screen shot](https://raw.githubusercontent.com/rhysd/ss/master/clever-f.vim/cleverf_main.gif)
I'll show some examples of usage. `_` is the place of cursor, `->` is a move of cursor, alphabets above I'll show some examples of usage. `_` is the place of cursor, `->` is a move of cursor, alphabets above
`->` is input by keyboard. Note that this is a part of clever-f.vim's features. `->` is input by keyboard. Note that this is a part of clever-f.vim's features.
@ -32,7 +32,7 @@ I'll show some examples of usage. `_` is the place of cursor, `->` is a move of
move : _<-----------------------------_<-_ move : _<-----------------------------_<-_
text : hoge huga hoo hugu ponyo text : hoge huga hoo hugu ponyo
![f screencast](https://raw.githubusercontent.com/rhysd/screenshots/master/clever-f.vim/cleverf_1.gif) ![f screencast](https://raw.githubusercontent.com/rhysd/ss/master/clever-f.vim/cleverf_1.gif)
### __`F`__ ### __`F`__
@ -43,7 +43,7 @@ I'll show some examples of usage. `_` is the place of cursor, `->` is a move of
move : _---------->_------>_----------->_ move : _---------->_------>_----------->_
text : hoge huga huyo hugu ponyo text : hoge huga huyo hugu ponyo
![F screencast](https://raw.githubusercontent.com/rhysd/screenshots/master/clever-f.vim/cleverf_2.gif) ![F screencast](https://raw.githubusercontent.com/rhysd/ss/master/clever-f.vim/cleverf_2.gif)
### __`t`__ ### __`t`__
@ -54,7 +54,7 @@ I'll show some examples of usage. `_` is the place of cursor, `->` is a move of
move : _<-----------------------------__ move : _<-----------------------------__
text : hoge huga hoo hugu ponyo text : hoge huga hoo hugu ponyo
![t screencast](https://raw.githubusercontent.com/rhysd/screenshots/master/clever-f.vim/cleverf_3.gif) ![t screencast](https://raw.githubusercontent.com/rhysd/ss/master/clever-f.vim/cleverf_3.gif)
## CUSTOMIZE ## CUSTOMIZE
@ -71,7 +71,9 @@ to be case-insensitive, set it to `1` in your vimrc.
### Smart case ### Smart case
`g:clever_f_smart_case` controls whether searches are smart case or not. If you type a lower case character, the case will be ignored however if you type an upper case character it will only search for upper case characters. Please set it to `1` in your vimrc to enable searching by smart case. `g:clever_f_smart_case` controls whether searches are smart case or not. If you type a lower case character,
the case will be ignored however if you type an upper case character it will only search for upper case characters.
Please set it to `1` in your vimrc to enable searching by smart case.
### Target character highlighting in current line ### Target character highlighting in current line
@ -81,18 +83,41 @@ group to `g:clever_f_mark_char_color`.
Below is an example using `ta` in description of clever-f.vim. Below is an example using `ta` in description of clever-f.vim.
![highlight example](https://raw.githubusercontent.com/rhysd/screenshots/master/clever-f.vim/cleverf_4.gif) ![highlight example](https://raw.githubusercontent.com/rhysd/ss/master/clever-f.vim/cleverf_4.gif)
Here, `ta` searches `a` forward then matches the character before `a` and `Ta` searches `a` backward Here, `ta` searches `a` forward then matches the character before `a` and `Ta` searches `a` backward
then matches the character after `a`. You can see the highlighted target is dynamically changed following then matches the character after `a`. You can see the highlighted target is dynamically changed following
the cursor's direction. the cursor's direction.
### Timeout Highlight can be cleared after timeout. See below section.
You can specify the timeout for `f`, `F`, `t` and `T` mappings. If the interval of these mappings ### Highlighting characters which can be directly jumped to
is greater than the one you specified, clever-f.vim resets its state to make you input a new character.
This feature is disabled by default. If you want to use this feature, set `g:clever_f_timeout_ms` clever-f.vim can highlight the characters in the line which can be directly jumped to. With this feature, you
to proper value. can easily understand where cursor can move by the `f{char}` input before inputting `{char}`.
For example, when 'aba' is in the current line, cursor can reach the first 'a' with `fa` but cannot reach the second 'a'.
In this case, the first 'a' is highlighted but the second 'a' is not when typing `f`.
To enable this feature, set `1` to `g:clever_f_mark_direct` in your vimrc. Note that setting `1` after Vim
starts does not work.
### Repeat timeout
You can specify the timeout for repeating the previous target character on `f`, `F`, `t` and `T` mappings.
If the interval of these mappings is greater than the one you specified, clever-f.vim resets its state to make you
input a new character. This feature is disabled by default. If you want to use this feature, set timeout value in
milliseconds to `g:clever_f_timeout_ms`.
### Highlight timeout
When target character highlighting is enabled, the highlight can be cleared after specific timeout.
By default, this feature is not enabled. Highlight won't be cleared until the cursor moves. To enable this feature,
set milliseconds value to `g:clever_f_highlight_timeout_ms`.
This feature requires timer feature added at Vim8. Confirm `:echo has('timers')` returns `1` to check if this feature
is available.
### Repeat last input ### Repeat last input

View File

@ -3,6 +3,8 @@ set cpo&vim
" constants " constants
let s:ON_NVIM = has('nvim') let s:ON_NVIM = has('nvim')
let s:ESC_CODE = char2nr("\<Esc>")
let s:HAS_TIMER = has('timers')
" configurations " configurations
let g:clever_f_across_no_line = get(g:, 'clever_f_across_no_line', 0) let g:clever_f_across_no_line = get(g:, 'clever_f_across_no_line', 0)
@ -18,6 +20,7 @@ let g:clever_f_timeout_ms = get(g:, 'clever_f_timeout_ms', 0)
let g:clever_f_mark_char = get(g:, 'clever_f_mark_char', 1) let g:clever_f_mark_char = get(g:, 'clever_f_mark_char', 1)
let g:clever_f_repeat_last_char_inputs = get(g:, 'clever_f_repeat_last_char_inputs', ["\<CR>"]) let g:clever_f_repeat_last_char_inputs = get(g:, 'clever_f_repeat_last_char_inputs', ["\<CR>"])
let g:clever_f_mark_direct = get(g:, 'clever_f_mark_direct', 0) let g:clever_f_mark_direct = get(g:, 'clever_f_mark_direct', 0)
let g:clever_f_highlight_timeout_ms = get(g:, 'clever_f_highlight_timeout_ms', 0)
" below variable must be set before loading this script " below variable must be set before loading this script
let g:clever_f_clean_labels_eagerly = get(g:, 'clever_f_clean_labels_eagerly', 1) let g:clever_f_clean_labels_eagerly = get(g:, 'clever_f_clean_labels_eagerly', 1)
@ -75,6 +78,7 @@ let s:first_move = {}
let s:migemo_dicts = {} let s:migemo_dicts = {}
let s:previous_char_num = {} let s:previous_char_num = {}
let s:timestamp = [0, 0] let s:timestamp = [0, 0]
let s:highlight_timer = -1
" keys are mode string returned from mode() " keys are mode string returned from mode()
function! clever_f#reset() abort function! clever_f#reset() abort
@ -99,11 +103,13 @@ function! clever_f#_reset_all() abort
let s:previous_char_num = {} let s:previous_char_num = {}
autocmd! plugin-clever-f-finalizer autocmd! plugin-clever-f-finalizer
unlet! s:moved_forward unlet! s:moved_forward
return ''
endfunction endfunction
function! s:remove_highlight() abort function! s:remove_highlight() abort
if s:highlight_timer >= 0
call timer_stop(s:highlight_timer)
let s:highlight_timer = -1
endif
for h in filter(getmatches(), 'v:val.group ==# "CleverFChar"') for h in filter(getmatches(), 'v:val.group ==# "CleverFChar"')
call matchdelete(h.id) call matchdelete(h.id)
endfor endfor
@ -117,12 +123,21 @@ function! s:is_timedout() abort
return elapsed_ms > g:clever_f_timeout_ms return elapsed_ms > g:clever_f_timeout_ms
endfunction endfunction
function! s:on_highlight_timer_expired(timer) abort
if s:highlight_timer != a:timer
return
endif
let s:highlight_timer = -1
call s:remove_highlight()
endfunction
" highlight characters to which the cursor can be moved directly " highlight characters to which the cursor can be moved directly
function! s:mark_direct(forward, count) abort " Note: public function for test
function! clever_f#_mark_direct(forward, count) abort
let line = getline('.') let line = getline('.')
let [_, l, c, _] = getpos('.') let [_, l, c, _] = getpos('.')
if (a:forward && c == len(line)) || (!a:forward && c == 1) if (a:forward && c >= len(line)) || (!a:forward && c == 1)
" there is no matching characters " there is no matching characters
return [] return []
endif endif
@ -157,11 +172,6 @@ function! s:mark_direct(forward, count) abort
return matches return matches
endfunction endfunction
" introduce public function for test
function! clever_f#_mark_direct(forward, count) abort
return s:mark_direct(a:forward, a:count)
endfunction
function! s:mark_char_in_current_line(map, char) abort function! s:mark_char_in_current_line(map, char) abort
let regex = '\%' . line('.') . 'l' . s:generate_pattern(a:map, a:char) let regex = '\%' . line('.') . 'l' . s:generate_pattern(a:map, a:char)
call matchadd('CleverFChar', regex , 999) call matchadd('CleverFChar', regex , 999)
@ -185,7 +195,7 @@ endfunction
function! clever_f#find_with(map) abort function! clever_f#find_with(map) abort
if a:map !~# '^[fFtT]$' if a:map !~# '^[fFtT]$'
throw "Error: Invalid mapping '" . a:map . "'" throw "clever-f: Invalid mapping '" . a:map . "'"
endif endif
if &foldopen =~# '\<\%(all\|hor\)\>' if &foldopen =~# '\<\%(all\|hor\)\>'
@ -195,14 +205,21 @@ function! clever_f#find_with(map) abort
endif endif
let current_pos = getpos('.')[1 : 2] let current_pos = getpos('.')[1 : 2]
let mode = s:mode() let mode = s:mode()
if current_pos != get(s:previous_pos, mode, [0, 0]) let highlight_timer_enabled = g:clever_f_mark_char && g:clever_f_highlight_timeout_ms > 0 && s:HAS_TIMER
let in_macro = clever_f#compat#reg_executing() !=# ''
" When 'f' is run while executing a macro, do not repeat previous
" character. See #59 for more details
if current_pos != get(s:previous_pos, mode, [0, 0]) || in_macro
let should_redraw = !in_macro
let back = 0 let back = 0
if g:clever_f_mark_cursor if g:clever_f_mark_cursor
let cursor_marker = matchadd('CleverFCursor', '\%#', 999) let cursor_marker = matchadd('CleverFCursor', '\%#', 999)
if should_redraw
redraw redraw
endif endif
endif
" block-NONE does not work on Neovim " block-NONE does not work on Neovim
if g:clever_f_hide_cursor_on_cmdline && !s:ON_NVIM if g:clever_f_hide_cursor_on_cmdline && !s:ON_NVIM
let guicursor_save = &guicursor let guicursor_save = &guicursor
@ -211,15 +228,17 @@ function! clever_f#find_with(map) abort
set t_ve= set t_ve=
endif endif
try try
if g:clever_f_mark_direct if g:clever_f_mark_direct && should_redraw
let direct_markers = s:mark_direct(a:map =~# '\l', v:count1) let direct_markers = clever_f#_mark_direct(a:map =~# '\l', v:count1)
redraw redraw
endif endif
if g:clever_f_show_prompt | echon 'clever-f: ' | endif if g:clever_f_show_prompt
echon 'clever-f: '
endif
let s:previous_map[mode] = a:map let s:previous_map[mode] = a:map
let s:first_move[mode] = 1 let s:first_move[mode] = 1
let cn = s:getchar() let cn = s:getchar()
if cn == char2nr("\<Esc>") if cn == s:ESC_CODE
return "\<Esc>" return "\<Esc>"
endif endif
if index(map(deepcopy(g:clever_f_repeat_last_char_inputs), 'char2nr(v:val)'), cn) == -1 if index(map(deepcopy(g:clever_f_repeat_last_char_inputs), 'char2nr(v:val)'), cn) == -1
@ -250,10 +269,12 @@ function! clever_f#find_with(map) abort
endif endif
endif endif
if g:clever_f_show_prompt | redraw! | endif if g:clever_f_show_prompt && should_redraw
redraw!
endif
finally finally
if g:clever_f_mark_cursor | call matchdelete(cursor_marker) | endif if g:clever_f_mark_cursor | call matchdelete(cursor_marker) | endif
if g:clever_f_mark_direct if g:clever_f_mark_direct && exists('l:direct_markers')
for m in direct_markers for m in direct_markers
call matchdelete(m) call matchdelete(m)
endfor endfor
@ -271,10 +292,11 @@ function! clever_f#find_with(map) abort
endif endif
endtry endtry
else else
" when repeated " When repeated
let back = a:map =~# '\u' let back = a:map =~# '\u'
if g:clever_f_fix_key_direction if g:clever_f_fix_key_direction && s:previous_map[mode] =~# '\u'
let back = s:previous_map[mode] =~# '\u' ? !back : back let back = !back
endif endif
" reset and retry if timed out " reset and retry if timed out
@ -282,6 +304,22 @@ function! clever_f#find_with(map) abort
call clever_f#reset() call clever_f#reset()
return clever_f#find_with(a:map) return clever_f#find_with(a:map)
endif endif
" Restore highlights which were removed by timeout
if highlight_timer_enabled && s:highlight_timer < 0
call s:remove_highlight()
if mode ==# 'n' || mode ==? 'v' || mode ==# "\<C-v>" ||
\ mode ==# 'ce' || mode ==? 's' || mode ==# "\<C-s>"
call s:mark_char_in_current_line(s:previous_map[mode], s:previous_char_num[mode])
endif
endif
endif
if highlight_timer_enabled
if s:highlight_timer >= 0
call timer_stop(s:highlight_timer)
endif
let s:highlight_timer = timer_start(g:clever_f_highlight_timeout_ms, funcref('s:on_highlight_timer_expired'))
endif endif
return clever_f#repeat(back) return clever_f#repeat(back)
@ -412,7 +450,7 @@ function! s:load_migemo_dict() abort
return clever_f#migemo#eucjp#load_dict() return clever_f#migemo#eucjp#load_dict()
else else
let g:clever_f_use_migemo = 0 let g:clever_f_use_migemo = 0
throw 'Error: ' . enc . ' is not supported. Migemo is disabled.' throw "clever-f: Encoding '" . enc . "' is not supported. Migemo is disabled"
endif endif
endfunction endfunction

View File

@ -17,3 +17,14 @@ else
return a:a && !a:b || !a:a && a:b return a:a && !a:b || !a:a && a:b
endfunction endfunction
endif endif
if exists('*reg_executing')
function! clever_f#compat#reg_executing() abort
return reg_executing()
endfunction
else
" reg_executing() was introduced at Vim 8.2.0020 and Neovim 0.4.0
function! clever_f#compat#reg_executing() abort
return ''
endfunction
endif

View File

@ -174,6 +174,13 @@ g:clever_f_timeout_ms *g:clever_f_timeout_ms*
value is millisecond. value is millisecond.
The default value is 0 (it means no timeout). The default value is 0 (it means no timeout).
g:clever_f_highlight_timeout_ms *g:clever_f_highlight_timeout_ms*
Setting a number value to this variable specifies the timeout for clearing
highlights in milliseconds. When the value is greater than 0, highlights
on the target character are automatically cleared after the timeout.
The default value is 0 (it means no timeout).
g:clever_f_mark_char *g:clever_f_mark_char* g:clever_f_mark_char *g:clever_f_mark_char*
If the value is equivalent to 1, the characters in line which you input If the value is equivalent to 1, the characters in line which you input
@ -214,6 +221,10 @@ g:clever_f_mark_direct *g:clever_f_mark_direct*
is enabled in normal and visual mode. is enabled in normal and visual mode.
The default value is 0. The default value is 0.
Note:
|g:clever_f_mark_direct| must be set before |clever-f| is loaded. Setting
to 1 in your |vimrc| is recommended.
g:clever_f_mark_direct_color *g:clever_f_mark_direct_color* g:clever_f_mark_direct_color *g:clever_f_mark_direct_color*
If |g:clever_f_mark_direct| is enabled, |clever-f| highlights characters If |g:clever_f_mark_direct| is enabled, |clever-f| highlights characters

View File

@ -1,8 +1,8 @@
## How to execute tests ## How to execute tests
It requires [vim-themis](https://github.com/thinca/vim-themis). You need to install it in advance. [vim-themis](https://github.com/thinca/vim-themis) is required.
For example, following clones it locally in clever-f.vim repository. For example, the following clones it locally in clever-f.vim repository.
```console ```console
$ cd /path/to/clever-f.vim/test $ cd /path/to/clever-f.vim/test
@ -12,9 +12,13 @@ $ ./vim-themis/bin/themis .
## How to measure code coverage ## How to measure code coverage
It requires [covimerage](https://github.com/Vimjas/covimerage). [covimerage](https://github.com/Vimjas/covimerage) is required. I recommend to use
[venv](https://docs.python.org/3/library/venv.html) for installing it locally.
```console ```console
$ python -m venv venv
$ source ./venv/bin/activate
$ pip install covimerage $ pip install covimerage
$ cd /path/to/clever-f.vim/test $ cd /path/to/clever-f.vim/test
@ -33,6 +37,6 @@ $ coverage html
## CI ## CI
CI is run in both Linux and macOS using Travis CI: https://travis-ci.org/rhysd/clever-f.vim CI runs on Linux, macOS and Windows using GitHub Actions: https://github.com/rhysd/clever-f.vim/actions?query=workflow%3ACI
Coverage is tracked with codecov.io: https://codecov.io/gh/rhysd/clever-f.vim Coverage is tracked with codecov.io: https://codecov.io/gh/rhysd/clever-f.vim

View File

@ -12,6 +12,22 @@ function! CursorPos()
return [line('.'), col('.'), getline('.')[col('.')-1]] return [line('.'), col('.'), getline('.')[col('.')-1]]
endfunction endfunction
function! Highlights() abort
return filter(getmatches(), 'v:val.group==#"CleverFChar"')
endfunction
function! WaitUntil(ms, pred) abort
let remaining = a:ms
while remaining > 0
sleep 10m
let remaining -= 10
if a:pred()
return 1
endif
endwhile
return 0
endfunction
Describe default config Describe default config
It should load plugin It should load plugin
Assert g:loaded_clever_f Assert g:loaded_clever_f
@ -274,7 +290,7 @@ Describe f, F, t and T mappings
Assert Equals(getline('.'), "piyo poyo") Assert Equals(getline('.'), "piyo poyo")
Assert Equals(CursorPos(), [l, 2, 'i']) Assert Equals(CursorPos(), [l, 2, 'i'])
normal! dfp normal dfp
Assert Equals(getline('.'), "poyo") Assert Equals(getline('.'), "poyo")
Assert Equals(CursorPos(), [l, 2, 'o']) Assert Equals(CursorPos(), [l, 2, 'o'])
End End
@ -311,9 +327,50 @@ Describe f, F, t and T mappings
normal fo normal fo
Assert Equals(CursorPos(), [l,14,'o']) Assert Equals(CursorPos(), [l,14,'o'])
End End
It should work while running in macro
for _ in range(10)
call AddLine('poge huga hiyo poyo')
endfor
normal! gg0
" Macro to change the line from 'poge huga hiyo poyo' to 'poge'
let @a = 'thDj'
normal 10@a
for l in range(2, 10)
Assert Equals(getline(l), 'poge')
endfor
End
It should not repeat previous character while running in macro (#59)
call AddLine('1a 2a 3a 4a 5a')
normal! gg0
let @a = 'fax'
normal 5@a
Assert Equals(getline('.'), '1 2 3 4 5')
End
It should share its state among mappings
normal! 0
let l = line('.')
let left = [l, 6, 'h']
let right = [l, 11, 'h']
normal fh
Assert Equals(CursorPos(), left)
normal f
Assert Equals(CursorPos(), right)
normal F
Assert Equals(CursorPos(), left)
normal t
Assert Equals(CursorPos(), right)
normal T
Assert Equals(CursorPos(), left)
End
End End
Describe f and F mappings' contexts Describe clever_f#reset()
Before Before
new new
call clever_f#reset() call clever_f#reset()
@ -324,18 +381,32 @@ Describe f and F mappings' contexts
close! close!
End End
It should be shared It should reset current target character
normal! 0 normal! 0
let l = line('.') let l = line('.')
normal fh normal fh
Assert Equals(CursorPos(), [l,6,'h']) Assert Equals(CursorPos(), [l,6,'h'])
normal f call clever_f#reset()
Assert Equals(CursorPos(), [l,11,'h']) normal to
normal F Assert Equals(CursorPos(), [l,13,'y'])
End
It should be called on <Plug>(clever-f-reset)
normal! 0
let l = line('.')
normal fh
Assert Equals(CursorPos(), [l,6,'h']) Assert Equals(CursorPos(), [l,6,'h'])
normal f execute 'normal' "\<Plug>(clever-f-reset)"
Assert Equals(CursorPos(), [l,11,'h']) normal to
Assert Equals(CursorPos(), [l,13,'y'])
End
It should remove target highlights
normal! 0
normal fhff
Assert NotEquals(Highlights(), [])
call clever_f#reset()
Assert Equals(Highlights(), [])
End End
End End
@ -499,7 +570,7 @@ Context Multibyte characters
End End
End End
describe g:clever_f_ignore_case Describe g:clever_f_ignore_case
Before Before
new new
let g:clever_f_ignore_case = 1 let g:clever_f_ignore_case = 1
@ -557,7 +628,7 @@ End
Describe clever_f#find_with() Describe clever_f#find_with()
It should raise an error when invalid map is given It should raise an error when invalid map is given
Throws /Error: Invalid mapping/ clever_f#find_with('x') Throws /^clever-f: Invalid mapping/ clever_f#find_with('x')
End End
End End
@ -746,6 +817,15 @@ Describe <Esc>
execute 'normal' "f\<Esc>" execute 'normal' "f\<Esc>"
Assert Equals(len(filter(getmatches(), 'v:val.group==#"CleverFDirect"')), 0) Assert Equals(len(filter(getmatches(), 'v:val.group==#"CleverFDirect"')), 0)
End End
It does nothing on empty line (#55)
call AddLine('')
normal! G0
Assert Equals(getline('.'), '')
Assert Equals(col('.'), 1)
normal fa
Assert Equals(col('.'), 1)
End
End End
End End
@ -931,6 +1011,7 @@ End
Describe g:clever_f_mark_char Describe g:clever_f_mark_char
Before Before
new new
let saved_mark_char = g:clever_f_mark_char
let g:clever_f_mark_char = 1 let g:clever_f_mark_char = 1
call clever_f#reset() call clever_f#reset()
call AddLine('poge huga hiyo poyo') call AddLine('poge huga hiyo poyo')
@ -941,30 +1022,31 @@ Describe g:clever_f_mark_char
After After
close! close!
let g:clever_f_across_no_line = old_across_no_line let g:clever_f_across_no_line = old_across_no_line
let g:clever_f_mark_char = saved_mark_char
End End
It should highlight the target characters automatically It should highlight the target characters automatically
normal! gg0 normal! gg0
normal fh normal fh
Assert NotEquals(filter(getmatches(), 'v:val.group==#"CleverFChar"'), []) Assert NotEquals(Highlights(), [])
normal f normal f
Assert NotEquals(filter(getmatches(), 'v:val.group==#"CleverFChar"'), []) Assert NotEquals(Highlights(), [])
End End
It should update the highlight if the cursor moves to another line It should update the highlight when the cursor moves to another line
call AddLine('oh huh') call AddLine('oh huh')
normal! gg0 normal! gg0
let l = line('.') let l = line('.')
normal fhff normal fhff
Assert NotEquals(filter(getmatches(), 'v:val.group==#"CleverFChar"'), []) Assert NotEquals(Highlights(), [])
Assert NotEquals(stridx(getmatches()[0].pattern, l), -1) Assert NotEquals(stridx(getmatches()[0].pattern, l), -1)
Assert Equals(len(getmatches()), 1) Assert Equals(len(getmatches()), 1)
normal f normal f
Assert NotEquals(filter(getmatches(), 'v:val.group==#"CleverFChar"'), []) Assert NotEquals(Highlights(), [])
Assert NotEquals(stridx(getmatches()[0].pattern, l+1), -1) Assert NotEquals(stridx(getmatches()[0].pattern, l+1), -1)
Assert Equals(len(getmatches()), 1) Assert Equals(len(getmatches()), 1)
normal f normal f
Assert NotEquals(filter(getmatches(), 'v:val.group==#"CleverFChar"'), []) Assert NotEquals(Highlights(), [])
Assert NotEquals(stridx(getmatches()[0].pattern, l+1), -1) Assert NotEquals(stridx(getmatches()[0].pattern, l+1), -1)
Assert Equals(len(getmatches()), 1) Assert Equals(len(getmatches()), 1)
End End
@ -978,7 +1060,7 @@ Describe g:clever_f_mark_char
" XXX: Hack! While running test, CursorMoved is not fired " XXX: Hack! While running test, CursorMoved is not fired
" automatically. To test the event, we need to cause it manually. " automatically. To test the event, we need to cause it manually.
doautocmd CursorMoved doautocmd CursorMoved
Assert Equals(filter(getmatches(), 'v:val.group==#"CleverFChar"'), []) Assert Equals(Highlights(), [])
End End
It should remove highlights when entering insert mode It should remove highlights when entering insert mode
@ -989,19 +1071,16 @@ Describe g:clever_f_mark_char
" XXX: Hack! While running test, InsertEnter is not fired " XXX: Hack! While running test, InsertEnter is not fired
" automatically. To test the event, we need to cause it manually. " automatically. To test the event, we need to cause it manually.
doautocmd InsertEnter doautocmd InsertEnter
Assert Equals(filter(getmatches(), 'v:val.group==#"CleverFChar"'), []) Assert Equals(Highlights(), [])
End End
Describe clever_f#reset() It should not highlight target character when set to 0
It should remove target highlights let g:clever_f_mark_char = 0
call AddLine('oh huh')
normal! gg0 normal! gg0
let l = line('.') normal fh
normal fhff Assert Equals(Highlights(), [])
Assert NotEquals(filter(getmatches(), 'v:val.group==#"CleverFChar"'), []) normal f
call clever_f#reset() Assert Equals(Highlights(), [])
Assert Equals(filter(getmatches(), 'v:val.group==#"CleverFChar"'), [])
End
End End
End End
@ -1294,4 +1373,128 @@ Describe g:clever_f_mark_direct
Assert Equals(len(filter(getmatches(), 'v:val.group ==# "CleverFDirect"')), 0) Assert Equals(len(filter(getmatches(), 'v:val.group ==# "CleverFDirect"')), 0)
End End
End End
" vim:foldmethod=marker
Describe g:clever_f_highlight_timeout_ms
Before
new
let g:clever_f_mark_char = 1
let g:clever_f_highlight_timeout_ms = 100
call clever_f#reset()
call AddLine('pOge huga Hiyo poyooooooooooooooooooooooooooooooooooooooooooooooooooo')
normal! gg0
End
After
close!
let g:clever_f_highlight_timeout_ms = 0
End
It should remove highlights after specified timeout
let start = reltime()
normal fo
Assert NotEquals(Highlights(), [])
sleep 10m
Assert NotEquals(Highlights(), [])
Assert WaitUntil(100, { -> Highlights() == [] })
let duration = reltimefloat(reltime(start))
Assert Truthy(duration > 0.1, string(duration) . ' should be greater than 0.1')
End
It should not remove highlights while repeating search
let start = reltime()
normal fo
" After 500ms highlights are not removed since 'f' resets timer
for _ in range(10)
sleep 50m
Assert NotEquals(Highlights(), [])
normal f
endfor
" Spending 100ms without 'f' expires the timer
Assert WaitUntil(120, { -> Highlights() == [] })
End
It should restore highlights after timeout removed it
normal fo
Assert NotEquals(Highlights(), [])
" Wait until highlights are removed due to timeout
Assert WaitUntil(200, { -> Highlights() == [] })
" repeat f
normal f
" Highlights are restored
Assert NotEquals(Highlights(), [])
" Finally highlights are removed again
Assert WaitUntil(200, { -> Highlights() == [] })
End
End
Describe .
Before each
new
call AddLine('hoge fuge piye poye')
normal! gg0
End
After each
close!
End
It should repeat 'f' mapping
normal dfe
Assert Equals(getline('.'), ' fuge piye poye')
normal! .
Assert Equals(getline('.'), ' piye poye')
normal! .
Assert Equals(getline('.'), ' poye')
normal! .
Assert Equals(getline('.'), '')
End
It should repeat 't' mapping
normal dte
Assert Equals(getline('.'), 'e fuge piye poye')
normal! .
Assert Equals(getline('.'), 'e piye poye')
normal! .
Assert Equals(getline('.'), 'e poye')
normal! .
Assert Equals(getline('.'), 'e')
End
It should repeat 'F' mapping
normal! $
normal dFe
Assert Equals(getline('.'), 'hoge fuge piye')
normal .
Assert Equals(getline('.'), 'hoge fuge')
normal .
Assert Equals(getline('.'), 'hoge')
End
It should repeat 'T' mapping
normal! $
normal dTe
Assert Equals(getline('.'), 'hoge fuge piyee')
normal .
Assert Equals(getline('.'), 'hoge fugee')
normal .
Assert Equals(getline('.'), 'hogee')
End
End
" vim: set ft=vim foldmethod=marker: