Например, у меня есть следующее отображение выражения:
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>
, он выйдет из визуального режима (или мне придется добавить хак, который скажет, из какого режима была вызвана функция). Я не знаю этого хака и не могу определить разные отображения для нормального и визуального режимов.