2011-02-09 82 views
16
enter image description here

VIM與長線(網屏線)hjkl移動

突出顯示的文本是在其中我要移動的陣列。在按j鍵移動一行之前,我必須按g鍵。有沒有我的.vimrc映射,我可以使用hjkl移動屏幕線,而不是每次按g。

感謝您的幫助 馬蒂亞斯

+0

我使用VIM 7.2,並且我不需要每次都擊中g: -/ – Mikhail 2011-02-09 14:50:53

+2

Mikhail,我有7.2和我需要。可能這是一個配置問題。例如,要查找是否已將j映射到一系列命令,可以鍵入「:map j」。 – 2011-02-09 14:54:47

+0

我有VIM 7.2.33,我必須按下它們。 – 2011-02-09 14:56:33

回答

14

我使用下面的代碼片段,它有助於所有形式的導航,包括像$到行尾等事情。

" mapping to make movements operate on 1 screen line in wrap mode 
function! ScreenMovement(movement) 
    if &wrap 
     return "g" . a:movement 
    else 
     return a:movement 
    endif 
endfunction 
onoremap <silent> <expr> j ScreenMovement("j") 
onoremap <silent> <expr> k ScreenMovement("k") 
onoremap <silent> <expr> 0 ScreenMovement("0") 
onoremap <silent> <expr>^ScreenMovement("^") 
onoremap <silent> <expr> $ ScreenMovement("$") 
nnoremap <silent> <expr> j ScreenMovement("j") 
nnoremap <silent> <expr> k ScreenMovement("k") 
nnoremap <silent> <expr> 0 ScreenMovement("0") 
nnoremap <silent> <expr>^ScreenMovement("^") 
nnoremap <silent> <expr> $ ScreenMovement("$") 
20

您可以重新映射jk鍵(不知道你是否真的需要hl ..)

:map j gj 
:map k gk 

一旦你嘗試和喜歡他們,加他們到你的.vimrc沒有領先:

+4

這有效,但不應該使用`:noremap`,這樣j不會遞歸映射?在這個例子中並不重要,但是進入... – naught101 2012-04-25 02:34:59

7

你可以簡單地重新映射j和k(例如)到gj和gk:

" map j to gj and k to gk, so line navigation ignores line wrap 
nmap j gj 
nmap k gk 
1

這是編輯長文本文件(如乳膠文檔)時的好主意。但編輯代碼並不是一個好主意,因爲它可能會導致一些宏(就像Jelera在Ned的答案中所記錄的那樣)。我的妥協是,只有當它能夠在插入(和替換)模式,而不是爲別的(我不知道,我在插入模式下使用使用導航鍵任宏):

" move on soft lines in insert mode 
inoremap <Down> <C-o>g<Down> 
inoremap <Up> <C-o>g<Up> 

(改編自this answer