Проблема с часто используемой опцией
noremap j gj
noremap k gk
в том, что он разбивает функциональность <vcount>
, если у вас есть строки в тексте, которые охватывают несколько строк.
Пример: вы хотите 10k
(перейдите на 10 строк), потому что вы используете относительные числа на боковой панели, но это многострочный с высотой 4 строки. Поэтому вы оказываетесь эффективно на 6 линиях (6k
) над вашей желаемой строкой, которую вы читаете из ваших относительных чисел. Вам придется вычислять вручную! Раздражающе ... Особенно, если у вас несколько многострочных между вашим текущим положением и вашим желаемым положением - не Vim- istic!
Мне нравится моя <vcount>
функция вместе с моим :relativenumber
, поэтому я написал следующие функции: & отображение, чтобы решить все проблемы, связанные с этим.
Эти функции позволяют использовать такие команды, как 10j
или 10k
, как и ожидалось, несмотря на наличие мультилиний со всеми преимуществами использования gj
и gk
как ваши отображения движения по умолчанию:
Edit: Я просто нашел следующее на reddit, что намного лучше, чем мое собственное решение.Это кратчайший возможный вариант:
nnoremap <expr> j v:count ? 'j' : 'gj'
nnoremap <expr> k v:count ? 'k' : 'gk'
"Longer" версия для лучшего понимания и полноты:
nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')
Источник:http://www.reddit.com/r/vim/comments/2k4cbr/problem_with_gj_and_gk/
Мой старый раствор:
nnoremap <silent> j :<C-U>call Down(v:count)<CR>
vnoremap <silent> j gj
nnoremap <silent> k :<C-U>call Up(v:count)<CR>
vnoremap <silent> k gk
function! Down(vcount)
if a:vcount == 0
exe "normal! gj"
else
exe "normal! ". a:vcount ."j"
endif
endfunction
function! Up(vcount)
if a:vcount == 0
exe "normal! gk"
else
exe "normal! ". a:vcount ."k"
endif
endfunction
Дополнительная информация здесь в дополнение к ответам: http://vim.wikia.com/wiki/Move_cursor_by_display_lines_when_wrapping –