В vim, как мне сделать собственное движение границы слова?

Насколько я понимаю, w распознает границы слов, разбивая текст на 3 группы:

1) символы, указанные в настройке iskeyword (буквы, цифры и подчеркивание)

2) другие непечатаемые знаки (символы)

3) пробельные символы

Каждый раз, когда вы нажимаете w, он переходит к следующей группе 1 или группе 2. Я хотел бы настроить его так, чтобы он переходил только к следующей группе 1, перепрыгивая через «слова-символы».

Что почти работает, так это:

nnoremap w /\k\+<CR>

который использует класс символов iskeyword \k. Но это уродливо, потому что имитирует выполнение поиска, что меняет выделение, загромождает историю поиска и черт знает что еще. Есть ли способ сделать эту работу «чистой», как обычно работает команда w?


person Ein    schedule 02.03.2012    source источник
comment
Я не совсем понимаю, что вы хотите. W помогает? Он имеет две группы символов: пробельные и непробельные, поэтому он всегда идет к первому символу после следующего пробела.   -  person Dan Hulme    schedule 03.03.2012
comment
Нет, это не совсем работает: W объединяет символьные символы вместе с буквенными символами. Что я хочу, так это эффективно объединить символы с пробелами, чтобы символы пропускались, но все же создавали границы слов.   -  person Ein    schedule 03.03.2012


Ответы (2)


Я думаю, вы ищете режим ожидания оператора, он же xmap, smap и семья.

Я сделал несколько примеров этих в других ответах на SO:

Наиболее подходящим примером может быть

Вы также найдете некоторые похожие методы, которые могут быть вам полезны.

person sehe    schedule 02.03.2012
comment
Я помню это. Отличный ответ. - person lucapette; 03.03.2012
comment
Сделать правильное движение для операторов — это здорово, и этот ответ ТАК научил меня кое-чему новому. Но что действительно делает меня несчастным, так это то, что я имитирую выполнение поиска для перемещения, и мне пришлось бы сделать это, чтобы определить мои соответствующие xmap и omap. - person Ein; 03.03.2012
comment
@Nuno: для протокола: в документах говорится, что поиск внутри vimscript (функции) не повлияет на ваш «текущий» шаблон поиска, историю поиска и т. д. (В любом случае, любой другой побочные эффекты можно было бы просто восстановить в той же функции) - person sehe; 03.03.2012
comment
Как определить функцию, которая перемещает курсор к следующему /\k\+ результату поиска? - person Ein; 03.03.2012
comment
Это, :search('\m\k\+', 'W'), переместит курсор к следующим /\k\+ результатам поиска. В качестве бонуса это не испортит вашу историю поиска или выделение. См. :h search() для получения дополнительной информации. - person Peter Rincker; 03.03.2012
comment
@PeterRincker Спасибо! Если вы опубликуете это как ответ, я приму это. - person Ein; 03.03.2012

Я, возможно, не очень помогу здесь. Я даже не знаю, что означает \k в этом контексте, но вы можете решить две неотложные проблемы, которые вы представляете:

nnoremap w /\k\+<CR>:nohl<CR>:call histdel("search", -1)<CR>

Это некрасиво, и подсветка может мерцать, но, возможно, это укажет вам правильное направление.

person Explosion Pills    schedule 02.03.2012