Ограничить модификатор количества для итерации команд - PullRequest
1 голос
/ 28 марта 2020

Vim предоставляет модификатор счета , который используется для умножения или добавления итераций в команду. Если вы используете vim, вы, вероятно, знакомы с ним: он позволяет вам написать 50j, чтобы перейти вниз на 50 раз.

Иногда мне удается вводить большое число, не замечая этого, в то время как я фактически использую другие приложения. , Когда я затем продолжаю использовать vim и, например, набираю o, чтобы начать новую строку, vim, естественно, пытается создать огромное количество новых строк, которые медленно заполняют память, а затем убиваются убийцей OOM ядра.

Есть ли способ ограничить счетчик или добавить подтверждение, если оно превышает некоторый порог?

1 Ответ

1 голос
/ 29 марта 2020

Это почти работает:

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...
...