如果我的问题不是很清楚,我很抱歉。我不知道如何表达它。
我想使用 VIM 为我所在的一些类(class)写论文。我遇到的问题是编辑器中的行格式。如果我没有用回车键明确地打破行尾,当我尝试在文本中移动光标时,如果我有一个跨越多行的句子,它会跳过多行。有什么方法可以使光标能够像在大多数文字处理器中那样在文本中移动?
最佳答案
经常使用的问题
noremap j gj
noremap k gk
选项是,它破坏了 <vcount>
功能,如果您的文本中有跨多行的行。
示例:您想要 10k
(向上 10 行),因为您在侧边栏中使用相对数字,但是有一个 4 行高度的多行。因此,您最终有效地在所需行上方的 6 行( 6k
)处,您从相对数字中读取。您必须手动计算!烦人...特别是如果您在当前位置和所需位置之间有多条多线 - 不是 Vim-istic!
我喜欢我的 <vcount>
与我的 :relativenumber
一起使用,这就是为什么我写了以下函数和映射来解决与此相关的所有问题。
这些函数让您可以使用 10j
等命令。或 10k
正如预期的那样,尽管多行具有使用 gj
的所有优点和 gk
作为您的默认移动映射:
编辑: 我刚刚在 reddit 上找到了以下内容,这比我自己的解决方案要好得多。这是可能的最短版本:
nnoremap <expr> j v:count ? 'j' : 'gj'
nnoremap <expr> k v:count ? 'k' : 'gk'
(如果你使用 noremap
而不是 nnoremap
,那么这在视觉和普通模式下都有效)
为了更好地理解和完整的“更长”版本:
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
https://stackoverflow.com/questions/20975928/