将光标移动到Vim中的长软包裹线

时间:2014-01-07 15:48:16

标签: vim text formatting

如果我的问题不是很明确,我很抱歉。我不确定如何表达它。

我想使用VIM为我所在的某些类编写论文。我遇到的问题是编辑器中行的格式化。如果我没有使用回车键明确地断开行的结尾,当我尝试将光标移动到文本中时,如果我有一个跨越多行的句子,它会跳过多行。是否有任何方法可以使光标能够在文本中移动,就像在大多数文字处理器中一样?

4 个答案:

答案 0 :(得分:33)

常用的问题

noremap j gj  
noremap k gk 

选项是,它会破坏<vcount>功能,如果您的文字中有一行,这些行跨越多行。
示例:您想要10k(向上10行),因为您在侧边栏中使用相对数字,但是有4行高度的多行。因此,您最终有效地在您想要的行之上的6行(6k),您从相对数字读取。你必须手动计算!烦人...特别是如果你当前位置和你想要的位置之间有多条多线 - 而不是Vim- istic

我喜欢我的<vcount>功能以及我的:relativenumber,这就是我编写以下功能的原因。映射以解决与此相关的所有问题 这些函数允许您按预期使用10j10k之类的命令,尽管存在多行,并具有使用gjgk作为默认移动映射的所有优点: / p>

修改 我刚刚在reddit上找到了以下内容,这比我自己的解决方案要好得多。这是最短的版本:

nnoremap <expr> j v:count ? 'j' : 'gj'
nnoremap <expr> k v:count ? 'k' : 'gk'

“更长”版本,以便更好地理解和完整:

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

答案 1 :(得分:7)

这是因为默认的jk动作跨物理线移动,而不是可见的,软包裹的屏幕线(当你有:set wrap)。您可以使用gjgk命令。

如果您希望默认使用该行为,可以将其添加到~/.vimrc中重新映射默认密钥:

noremap j gj
noremap k gk

答案 2 :(得分:3)

您是否在vim命令行中尝试了以下操作:

:set nowrap

答案 3 :(得分:0)

我发现此解决方案的另一个版本除了在物理或虚拟行之间移动外,还可以在跳转列表中添加大于5行的跳转,从而允许我们使用Ctrl-o和C​​trl-i。

" source: https://www.vi-improved.org/vim-tips/
nnoremap <expr> j v:count ? (v:count > 5 ? "m'" . v:count : '') . 'j' : 'gj'
nnoremap <expr> k v:count ? (v:count > 5 ? "m'" . v:count : '') . 'k' : 'gk'

它使用嵌套的三元运算符将跳转添加到跳转列表中