В Vim, почему я не могу переназначить ключи на `w`? - PullRequest
7 голосов
/ 16 июня 2011

По моему .vimrc:

noremap z w

Когда я проверяю сопоставления, :map z показывает только:

z         * w

Когда я нажимаю z, мой курсор перемещается, как ожидалось (к следующему слову). Однако, когда я пытаюсь использовать что-то вроде diz или ciz, ничего не происходит. Внизу моего экрана появляются di и ci, когда я их печатаю, но как только я набираю z, Вим радостно бездействует. diw и ciw все еще работают, как и ожидалось.

Что еще мне нужно сделать? Есть ли режим отображения, о котором я не знаю?

Ответы [ 5 ]

10 голосов
/ 16 июня 2011

Проблема в том, что iw - это отдельный текстовый объект, он не является модификатором i + motion w.Вам необходимо отобразить iz и az в этом случае:

onoremap iz iw
onoremap az aw

.Обратите внимание, что это будет ждать, пока вы нажмете z только в течение некоторого времени (см. :h 'timeoutlen').Чтобы он работал как iw (например, подождите z навсегда), вам следует попробовать следующее:

function s:MapTOPart(tostart)
    let char=getchar()
    if type(char)==type(0)
        let char=nr2char(char)
    endif
    return a:tostart.((char is# 'z')?('w'):(char))
endfunction

onoremap iz iw
onoremap az aw
onoremap <expr> i <SID>MapTOPart('i')
onoremap <expr> a <SID>MapTOPart('a')

Вам придется сделать то же самое для всех i* и a*текстовые объекты, которые вы используете, потому что с приведенным выше кодом хорошо работают только iz и az;по какой-то причине iw необходимо либо набрать слишком медленно, либо ввести iww.

4 голосов
/ 16 июня 2011

Проблема не в попытке связать с 'w', а в том, что вы используете 'неправильное' отображение. Конечно, :noremap z w - это то, что вам нужно, когда вы находитесь в обычном режиме, но после d или c Vim больше не находится в обычном режиме!

Такие команды, как d и c, вводят новый режим, который называется «Режим ожидания оператора». Google для получения дополнительной информации, или смотрите :help Operator-pending в vim. Поэтому вам нужна следующая дополнительная строка в вашей ~ / .vimrc :

onoremap z w

После этого diz и ciz должны работать нормально.

2 голосов
/ 16 июня 2011

Я думаю, что причина проста:

iw «внутреннее слово», выберите [количество] слов (см. | Слово |).Пробел между словами тоже учитывается.При использовании в визуальном режиме «iw» переключается в визуальный символьный режим.

Вы можете переназначить w на z, но iw - это одна команда, а не i + w.Пример: dz работает после:

: omap z iw

1 голос
/ 16 июня 2011

Я не думаю, что vim позволяет вам переназначать движения - и в вашем примере, 'w' - это часть движения ('iw'), а не команда.

Преобразование клавиши 'z' в команду 'w' сработало, потому что vim позволяет вам переназначать команды.

0 голосов
/ 16 июня 2011

Это, вероятно, из-за того, что z используется для самой серии команд. Проверить: h z

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