如果我的问题不是很明确,我很抱歉。我不确定如何表达它。
我想使用VIM为我所在的某些类编写论文。我遇到的问题是编辑器中行的格式化。如果我没有使用回车键明确地断开行的结尾,当我尝试将光标移动到文本中时,如果我有一个跨越多行的句子,它会跳过多行。是否有任何方法可以使光标能够在文本中移动,就像在大多数文字处理器中一样?
答案 0 :(得分:33)
常用的问题
noremap j gj
noremap k gk
选项是,它会破坏<vcount>
功能,如果您的文字中有一行,这些行跨越多行。
示例:您想要10k
(向上10行),因为您在侧边栏中使用相对数字,但是有4行高度的多行。因此,您最终有效地在您想要的行之上的6行(6k
),您从相对数字读取。你必须手动计算!烦人...特别是如果你当前位置和你想要的位置之间有多条多线 - 而不是Vim- istic !
我喜欢我的<vcount>
功能以及我的:relativenumber
,这就是我编写以下功能的原因。映射以解决与此相关的所有问题
这些函数允许您按预期使用10j
或10k
之类的命令,尽管存在多行,并具有使用gj
和gk
作为默认移动映射的所有优点: / 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)
这是因为默认的j
和k
动作跨物理线移动,而不是可见的,软包裹的屏幕线(当你有:set wrap
)。您可以使用gj
和gk
命令。
如果您希望默认使用该行为,可以将其添加到~/.vimrc
中重新映射默认密钥:
noremap j gj
noremap k gk
答案 2 :(得分:3)
您是否在vim命令行中尝试了以下操作:
:set nowrap
答案 3 :(得分:0)
我发现此解决方案的另一个版本除了在物理或虚拟行之间移动外,还可以在跳转列表中添加大于5行的跳转,从而允许我们使用Ctrl-o和Ctrl-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'
它使用嵌套的三元运算符将跳转添加到跳转列表中