For example, I have the following expression mapping:
You see,
function! DelNthSpace()
let col=match(getline('.'), '[[:blank:] ]', col('.'), v:count1)
return virtcol([line('.'), col+1])."|s \e"
endfunction
nnoremap s DelNthSpace()
v:count1
is already handled here. But if I try to replace second space with such function that is located, for example, at virtual column 35
(it will be if you place cursor on the return statement), then this tries to go to column 235
and replace it because this will be transformed from 2s
to 2{DelNthSpace()}
-> 235|s ^[
. Now I am prepending bare useless |
at the start of return statement which consumes unneeded count, but I do not like this solution as it uses two movements instead of one.
ОБНОВЛЕНИЕ: я должен был предоставить больше контекста:
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>
, он выйдет из визуального режима (или мне придется добавить хак, который скажет, из какого режима была вызвана функция). Я не знаю этого хака и не могу определить разные отображения для обычного и визуального режимов.
@_
работает для этого. Я не знаю способа сделать это в режиме ожидания оператора (и я действительно не знал о@_
). - person ZyX   schedule 03.03.2015