2014-01-07 7 views
5

Es tut mir leid, wenn meine Frage nicht sehr klar ist. Ich bin mir nicht sicher, wie ich es formulieren soll.Bewegen Sie den Cursor durch lange weich umhüllte Zeilen in Vim

Ich möchte VIM verwenden, um Papiere für einige Klassen zu schreiben, in denen ich bin. Das Problem, das ich habe, ist mit der Formatierung von Zeilen im Editor. Wenn ich nicht explizit das Ende einer Zeile mit der Eingabetaste abbruche, wenn ich versuche, den Cursor durch den Text zu bewegen, überspringt es mehrere Zeilen, wenn ich einen Satz habe, der sich über mehr als eine Zeile erstreckt. Gibt es eine Möglichkeit, es so zu machen, dass der Cursor den Text ähnlich wie in den meisten Textverarbeitungsprogrammen durchläuft?

+1

einige weitere Informationen hier zusätzlich zu den Antworten: http://vim.wikia.com/wiki/Move_cursor_by_display_lines_when_wrapping –

Antwort

3

Haben Sie versucht, die folgenden in vim Befehlszeile:

:set nowrap 
+0

Schön, das hat es getan. Vielen Dank. –

+1

Ich empfehle auch ': set textwidth = 80' für den automatischen Zeilenumbruch. – Max

+0

Dieser Befehl scheint nichts zu tun, aber ich kann sehen, warum Sie so etwas wollen. Irgendeine Idee, warum es für mich nicht funktioniert? –

6

Das ist, weil der Standard-j und k Bewegungen über physikalische Leitungen bewegen, nicht die sichtbaren, Soft-wrapped Bildschirmzeilen (wenn Sie haben :set wrap). Sie können dazu die Befehle gj und gk verwenden.

Wenn Sie dieses Verhalten auf die Standard möchten, können Sie die Standardtasten neu zuordnen, indem Sie diese in Ihre ~/.vimrc setzen:

noremap j gj 
noremap k gk 
+0

Danke. Ich werde das machen. –

25

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 
+0

Gibt es eine Möglichkeit, dies auch horizontal zu tun? – f1lt3r

Verwandte Themen