Можно ли определить в отображении, ожидающем оператора, будет ли движение линейным, блочным или нормальным? - PullRequest
8 голосов
/ 19 декабря 2011

При объявлении сопоставления с помощью omap или onoremap я хотел бы иметь возможность обрабатывать случай, когда движение будет блочным, линейным или стандартным.

Например, давайте рассмотрим следующий блок:

abcd
efgh
ijkl
mnop

Курсор находится на букве f.Предположим, что я определяю карту операторов от K до :normal! vjl (переходите к букве k).

onoremap K :normal! vjl<cr>

Интересно, что когда я запускаю dvK, dK, d<strong>^V</strong>K, я получаю соответственно

abcd   abcd   abcd
el     el     eh
mnop   mnop   il
              mnop

Но когда я запускаю dVK, это не сработает, я получаю точно так же, как с dvK.

Я пытался использовать visualmode() (отображение определено как@=visualmode()<cr>jl<cr>, но это не работает. Похоже, что возвращаемое значение этой функции не сразу изменяется при использовании v, V или CTRL-V в режиме ожидания оператора.

Кто-нибудьесть подсказка пожалуйста?
спасибо

Ответы [ 2 ]

0 голосов
/ 28 августа 2017

Чтобы достичь желаемого, вы можете просто определить

onoremap K :<c-u>normal! jl<cr>

Обратите внимание, что это движение, сформированное бывшей командой, всегда символьно (см. :h movement

Затем выможете свободно использовать dv, или dV, или d^V, чтобы заставить движение быть другим типом и получить то, что вы хотите.

0 голосов
/ 25 января 2012

Я написал несколько ответов об отображениях, ожидающих оператора. В одном из них 1 я набросал схему функции, которая должна обрабатывать различные случаи (выбор символов, строки, блоков) в соответствии с документами:

 g@{motion}     Call the function set by the 'operatorfunc' option.
        The '[ mark is positioned at the start of the text
        moved over by {motion}, the '] mark on the last
        character of the text.
        The function is called with one String argument:
            "line"  {motion} was |linewise|
            "char"  {motion} was |characterwise|
            "block" {motion} was |blockwise-visual|
        Although "block" would rarely appear, since it can
        only result from Visual mode where "g@" is not useful.
        {not available when compiled without the |+eval|
        feature}

Вот пример, который подсчитывает количество пробелов с <F4>:>

nmap <silent> <F4> :set opfunc=CountSpaces<CR>g@
vmap <silent> <F4> :<C-U>call CountSpaces(visualmode(), 1)<CR>

function! CountSpaces(type, ...)
  let sel_save = &selection
  let &selection = "inclusive"
  let reg_save = @@

  if a:0  " Invoked from Visual mode, use '< and '> marks.
    silent exe "normal! `<" . a:type . "`>y"
  elseif a:type == 'line'
    silent exe "normal! '[V']y"
  elseif a:type == 'block'
    silent exe "normal! `[\<C-V>`]y"
  else
    silent exe "normal! `[v`]y"
  endif

  echomsg strlen(substitute(@@, '[^ ]', '', 'g'))

  let &selection = sel_save
  let @@ = reg_save
endfunction

1 vim вызывает функцию из vmap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...