0
0
mirror of https://github.com/vim/vim.git synced 2025-07-25 10:54:51 -04:00

patch 8.2.2612: col('.') may get outdated column value

Problem:    col('.') may get outdated column value.
Solution:   Add a note to the help how to make this work and add a test for
            it. (closes #7971)
This commit is contained in:
Bram Moolenaar 2021-03-17 13:28:05 +01:00
parent f8c52e8d08
commit 18b7d86d7f
3 changed files with 40 additions and 0 deletions

View File

@ -263,6 +263,20 @@ input. Example: >
endfunc endfunc
nnoremap <expr> <F3> <Sid>OpenPopup() nnoremap <expr> <F3> <Sid>OpenPopup()
Also, keep in mind that the expression may be evaluated when looking for
typeahead, before the previous command has been executed. For example: >
func StoreColumn()
let g:column = col('.')
return 'x'
endfunc
nnoremap <expr> x StoreColumn()
nmap ! f!x
You will notice that g:column has the value from before executing "fx",
because "z" is evaluated before "fx" is executed.
This can be solved by inserting <Ignore> before the character that is
expression-mapped: >
nmap ! f!<Ignore>x
Be very careful about side effects! The expression is evaluated while Be very careful about side effects! The expression is evaluated while
obtaining characters, you may very well make the command dysfunctional. obtaining characters, you may very well make the command dysfunctional.
For this reason the following is blocked: For this reason the following is blocked:

View File

@ -485,6 +485,30 @@ func Test_list_mappings()
nmapclear nmapclear
endfunc endfunc
func Test_expr_map_gets_cursor()
new
call setline(1, ['one', 'some w!rd'])
func StoreColumn()
let g:exprLine = line('.')
let g:exprCol = col('.')
return 'x'
endfunc
nnoremap <expr> x StoreColumn()
2
nmap ! f!<Ignore>x
call feedkeys("!", 'xt')
call assert_equal('some wrd', getline(2))
call assert_equal(2, g:exprLine)
call assert_equal(7, g:exprCol)
bwipe!
unlet g:exprLine
unlet g:exprCol
delfunc ExprMapped
nunmap x
nunmap !
endfunc
func Test_expr_map_restore_cursor() func Test_expr_map_restore_cursor()
CheckScreendump CheckScreendump

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2612,
/**/ /**/
2611, 2611,
/**/ /**/