Сброс счетчика в <expr>отображениях - PullRequest
4 голосов
/ 24 ноября 2010

Например, у меня есть следующее отображение выражения: function! DelNthSpace() let col=match(getline('.'), '[[:blank:] ]', col('.'), v:count1) return virtcol([line('.'), col+1])."|s \e" endfunction nnoremap s DelNthSpace() Вы видите, v:count1 уже обработан здесь. Но если я попытаюсь заменить второй пробел такой функцией, которая расположена, например, в виртуальном столбце 35 (это будет, если вы поместите курсор на оператор return), тогда он попытается перейти к столбцу 235 и заменить это потому, что это будет преобразовано из 2s в 2{DelNthSpace()} -> 235|s ^[. Теперь я добавляю пустой бесполезный | в начале оператора возврата, который потребляет ненужное количество, но мне не нравится это решение, так как оно использует два движения вместо одного.

ОБНОВЛЕНИЕ : Я должен был предоставить больше контекста:

function! ToNthSpace()
    let col=match(getline('.'), '[[:blank:] ]', col('.'), v:count1)
    return virtcol([line('.'), col+1])."|"
endfunction
noremap <expr> s ToNthSpace()

Существует множество функций, которые их используют, одна имитирует команду замены, но транслитерирует ее аргумент (поэтому при вызове r$ii символ будет заменен на $, а вставка i, \tr$ii - символ с такое же отношение между t и \tt и некоторыми другими), другие являются движениями. Поскольку эти функции определяют движения, я не могу использовать :<C-u>, он выйдет из визуального режима (или мне придется добавить хак, который скажет, из какого режима была вызвана функция). Я не знаю этого хака и не могу определить разные отображения для нормального и визуального режимов.

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

Невозможно заставить vim игнорировать счет для отображения <expr>, однако вы можете легко изменить отображение, чтобы ваша функция работала:

nnoremap s :<C-U>exe 'normal!' DelNthSpace()<CR>

См. :help v:count для получения информации об использовании CTRL+U для удаления счетчика.

0 голосов
/ 07 ноября 2018

Чтобы подвести итог тому, что упомянул @Alexey, а также мой тест в режиме operator-pending, вы можете сделать следующее

nnoremap <expr> s "@_" . ToNthSpace()
vnoremap <expr> s "@_" . ToNthSpace()
onoremap <expr> s printf(":normal %s\<cr>", ToNthSpace())

Тогда 2, уже напечатанный в вашем примере, не будет иметь эффекта

...