2013-12-06 2 views
0

Я сделал два простых nmap с в Vim, который перемещает курсор в 10 раз вправо и влево, нажав Alt - г и Alt - ZВИМ - Игнорировать timoutlen для определенных ключей отображения макросов

nmap <ESC>z 10l 
nmap <ESC>Z 10h 

Он отлично работает.

Теперь я хотел бы добавить два одинаковых nmap сек, удаляющие 10 раз

nmap d<ESC>z 10x 
nmap d<ESC>Z 10X 

Это работает почти нормально, и следует за ВИМ логику работы с последующим курсором двигаться.

К сожалению, это раз, если я не нажимаю Altг или AltZ быстро после d. Я нахожу это странным, потому что я не сопоставил ничего только d. И если я нажму w или W после d, я могу ждать столько, сколько захочу.

Я знаю, что есть встроенная карта с такими объявлениями dw и dW.

На мой вопрос: Есть ли способ, которым я могу получить свой собственный nmap s, чтобы принять длительные задержки между нажатиями клавиш?

+0

у вас есть у вас ' z', но в вашем тексте вы говорите' Alt-z'. Какой из них вы используете? –

+0

То же самое. 'Alt-z' отправляет' Esc', за которым следует 'z' – XPlatformer

ответ

1

Вы правы, что по умолчанию для сопоставленных ключей применяется 'timeoutlen' (по умолчанию 1 с). Я считаю это полезным, но если вы действительно хотите, чтобы ваши начальные сопоставления ожидали бесконечно долго, вам нужно определить карту только по первому ключу, затем запросить и обработать оставшиеся ключи самостоятельно.

function! MapOrDefault() 
    let c = nr2char(getchar()) 
    return c == "\<A-z>" ? '10x' : 'd' . c 
endfunction 
nnoremap <expr> d MapOrDefault() 

Примечание: Хотя это технически эквивалент, я рекомендовал бы предпочесть Vim ключ-обозначения (<A-z>) вместо загадочного <Esc>z.

Примечание: You should use :noremap; он делает отображение неустойчивым к переназначению и рекурсии.

+0

Спасибо. Это было полезно. Проблема только в том, что - это два символа, но я могу просто разобрать один символ за раз. – XPlatformer

+1

Посмотрите на мой пример; это всего лишь один символ, представленный ключевой входной последовательностью '' + 'z'. По крайней мере, в моем GVIM это правильно обрабатывается. Если нет, вам нужно обнаружить '', а затем получить следующий с другим' getchar() '. –

Смежные вопросы