Das Problem mit der oft verwendet
noremap j gj
noremap k gk
Option ist, dass Es bricht die <vcount>
Funktionalität, wenn Sie Zeilen in Ihrem Text haben, die sich über mehrere Zeilen erstrecken.
Beispiel: Sie wollen 10k
(gehen Sie 10 Zeilen), weil Sie relative Zahlen in der Seitenleiste verwenden, aber es ist eine Multilinie mit 4 Zeilen Höhe. Daher enden Sie effektiv bei 6 Zeilen (6k
) über Ihrer gewünschten Zeile, die Sie aus Ihren relativen Zahlen lesen. Sie müssten manuell berechnen! Ärgerlich ... Vor allem, wenn Sie mehrere Multilinien zwischen Ihrer aktuellen Position und Ihrer gewünschten Position haben - nicht istisch!
Ich mag meine <vcount>
Funktion zusammen mit meinem :relativenumber
, weshalb ich die folgenden Funktionen & Mapping geschrieben, um alle damit verbundenen Probleme zu lösen.
Diese Funktionen können Sie verwenden, um Befehle wie 10j
oder 10k
wie erwartet, trotz der Anwesenheit von Multilinien mit allen Vorteilen von gj
und gk
als Standard-Bewegungszuordnungen verwenden:
Edit: ich folgend nur gefunden auf Reddit, das ist so viel besser als meine eigene Lösung.Dies ist kürzestmögliche Version:
nnoremap <expr> j v:count ? 'j' : 'gj'
nnoremap <expr> k v:count ? 'k' : 'gk'
"Längerer" -Version für ein besseres Verständnis und Vollständigkeit:
nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')
Quelle:http://www.reddit.com/r/vim/comments/2k4cbr/problem_with_gj_and_gk/
Meine alte Lösung:
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
einige weitere Informationen hier zusätzlich zu den Antworten: http://vim.wikia.com/wiki/Move_cursor_by_display_lines_when_wrapping –