Это почти работает:
function! UpdateCount(n) abort
let limit = get(g:, 'counter_limit', 99)
if v:count == 0
return ''.a:n
elseif v:count == limit
return ''
elseif 10 * v:count + a:n > limit
return repeat("\<Del>", strlen(v:count)).limit
else
return ''.a:n
endif
endfunction
nnoremap <expr> 0 UpdateCount(0)
nnoremap <expr> 1 UpdateCount(1)
nnoremap <expr> 2 UpdateCount(2)
nnoremap <expr> 3 UpdateCount(3)
nnoremap <expr> 4 UpdateCount(4)
nnoremap <expr> 5 UpdateCount(5)
nnoremap <expr> 6 UpdateCount(6)
nnoremap <expr> 7 UpdateCount(7)
nnoremap <expr> 8 UpdateCount(8)
nnoremap <expr> 9 UpdateCount(9)
Но, к сожалению, оно не работает для клавиши 0
, поскольку Vim отключает любые сопоставления для 0
при вводе счетчика , что имеет смысл, поскольку 0
сама по себе является командой для go до первого символа строки, и если эти отображения не были отключены, то такая команда, как nnoremap 0 ^
, прервет использование из 0
в счетах ...
Так что, да, кроме исправления Vim для добавления ограничения, я не вижу хорошего способа исправить это в общем .
Если это проблема с некоторыми командами больше, чем с другими (например, команды вставки, такие как o
или i
или A
, et c.), Тогда вы можете рассмотреть возможность добавления отображения для тех, кто проверяет v:count
в тех и предотвращает их, если число превышает определенный предел.
Например:
function! LimitCount(cmd) abort
let limit = get(g:, 'counter_limit', 99)
if v:count > limit
echomsg "Count ".v:count." is too large, aborting execution of '".a:cmd."' command."
" Use Ctrl-C to erase the pending count and avoid applying it to the next command.
return "\<C-C>"
else
return a:cmd
endif
endfunction
nnoremap <expr> o LimitCount('o')
nnoremap <expr> i LimitCount('i')
" And so on for other insertion commands...