2013-09-06 3 views
0

Я создал отображение в визуальном и нормальном режиме, чтобы ускорить перемещение в локальной области кода. если я нажимаю 1 + кнопку направления, она заменяется на 10 вместо 1.Отображение Vimrc не ведет себя так, как ожидалось

vmap 1j 10j | vmap 1k 10k | vmap 1h 10h | vmap 1l 10l 
nmap 1j 10j | nmap 1k 10k | nmap 1h 10h | nmap 1l 10l 

Это хорошо работает. Однако, когда я печатаю быстро, я непреднамеренно набираю 11 вместо 1, поэтому '11j' insead of '1j'. Это перемещает меня на 110 линий вниз, а не на 11.

Хотелось бы двигаться только 11 в заданном направлении вместо 110, когда я делаю эту ошибку.

Vim интерпретирует это как 1, а затем добавляет мое сопоставление, чтобы получить 110. Аналогично, если я набираю '21j', это интерпретируется как '210j'.

ответ

2

Это должно делать то, что вы. Однако я не уверен, почему он работает так, как он. Кажется, что старый счетчик не очищается, когда вы меняете счет внутри отображения, а новый счет добавляется к старому счету. (Обратите внимание, что я только положил 0 в отображение, а не 10)

Я также использовал v:count, чтобы найти счет карты вместо перегрузки 1j. v:count возвращает 0, если счет не указан.

function TenMovement(type) 
    if v:count == 1 
     return '0'.a:type 
    else 
     return a:type 
    endif 
endfunction 

nnoremap <expr> j TenMovement('j') 
nnoremap <expr> k TenMovement('k') 
nnoremap <expr> l TenMovement('l') 
nnoremap <expr> h TenMovement('h') 

vnoremap <expr> j TenMovement('j') 
vnoremap <expr> k TenMovement('k') 
vnoremap <expr> l TenMovement('l') 
vnoremap <expr> h TenMovement('h') 
+0

Это решение удовлетворяет всем требования, которые я предложил. – Andrew

1

Чтобы исправить это, вы должны прервать введенный ранее счет. <C-\><C-n> работает как <Esc> в обычном режиме, но избегает звуковой сигнал, когда нет очереди Количество:

nmap 1j <C-\><C-n>10j 

Для визуального режима, выбор должен быть воссоздан с gv:

vmap 1j <C-\><C-n>gv10j 
+0

Это влияет на то, что '111j' перемещает' 10j', что может быть нежелательным. – FDinoff

+0

Это работает, но поскольку @FDinoff предложил 111j, он перемещается только по 10 линиям. – Andrew

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