在 vim 中,如何在自动换行的单行内向上移动?

在 vim 中,如何在自动换行的单行内向上移动?

截屏
(点击图片放大)

看看上面的图片,这是一行声明了一个巨大的列表。现在假设我的光标在第一个元素上'i',我按“j”,然后光标直接转到该行,但我想要的是光标转到下面new_s=''单词的“s”'she''i'

有什么办法可以做到这一点?

答案1

j光标向下移动一个物理线路。您可以使用gj向下移动一个显示行

答案2

现有的答案是正确的。

我想补充一点,当您处理非换行文本时,j/kgj/是严格等效的。因此,以下映射既无害(如果您不这样做),又有用(如果您):gk:set wrap:set wrap

nnoremap j gj
nnoremap k gk

答案3

我喜欢这里的脚本: http://vim.wikia.com/wiki/Move_cursor_by_display_lines_when_wrapping “映射以使移动在换行模式下在 1 个屏幕行上运行

函数!ScreenMovement(movement)
  if &wrap && b:gmove == 'yes'
    返回 "g" 。 a:movement
  else
    return a:movement
  endif
endfunction
onoremap j ScreenMovement("j")
onoremap k ScreenMovement("k")
onoremap 0 ScreenMovement("0")
onoremap ^ ScreenMovement("^")
onoremap $ ScreenMovement("$")
nnoremap j ScreenMovement("j")
nnoremap k ScreenMovement("k")
nnoremap 0 ScreenMovement("0")
nnoremap ^ ScreenMovement("^")
nnoremap $ ScreenMovement("$")
vnoremap j ScreenMovement("j")
vnoremap k ScreenMovement("k")
vnoremap 0 ScreenMovement("0")
vnoremap ^ ScreenMovement("^")
vnoremap $ ScreenMovement("$")
vnoremap j ScreenMovement("j")
" 切换 showbreak
功能! TYShowBreak()
  if &showbreak == ''
    set showbreak=>
  否则
    设置 showbreak=
  endif
endfunction
let b:gmove = "yes"
function!TYToggleBreakMove()
  if exist("b:gmove") && b:gmove == "yes"
    let b:gmove = "no"
  else
    let b:gmove = "yes"
  endif
endfunction
nmap,b TYShowBreak()
nmap,bb TYToggleBreakMove()

然后,您可以使用 ,b 来显示行是否换行(上面的示例使用 '>' 字符)。然后,如果您设置了换行,则 ,bb 将关闭屏幕移动

此外,我还在 VIMRC 中将包装设置为绑定:

"--- wrap toggle with f2 key---"
function! ToggleWrap()
set wrap!|set wrap?
endfunction

"F2 toggles wrap
nmap <f2> :call ToggleWrap()<CR>
vmap <F2> <C-C>:call ToggleWrap()<CR>
imap <F2> <C-O>:call ToggleWrap()<CR>i

答案4

如果您输入 gj,光标将向下移动一行,而输入 gk 则将光标向上移动一行。我假设您处于普通控制台窗口中?

干杯

相关内容