当我在vim中撰写长段文本(例如LaTeX中的段落)时,它会将我的文本换行成多行,这是很好的。但是,如果我尝试使用“j”和“k”(或上下箭头)导航这些行,则会跳过整个段落。我通过突出显示段落并按下gq
来解决了这个问题。这会在每行末尾插入换行符。
我的问题是,是否有一种自动化此操作的方法,这样我就不必不断地突出显示文本并按下gq
?
当我在vim中撰写长段文本(例如LaTeX中的段落)时,它会将我的文本换行成多行,这是很好的。但是,如果我尝试使用“j”和“k”(或上下箭头)导航这些行,则会跳过整个段落。我通过突出显示段落并按下gq
来解决了这个问题。这会在每行末尾插入换行符。
我的问题是,是否有一种自动化此操作的方法,这样我就不必不断地突出显示文本并按下gq
?
您可以使用textwidth
选项来限制行的宽度(请参见:help tw
)。
例如,如果您想将宽度限制为80列,可以使用:
:set tw=80
使用此选项,当您输入的内容长于80列时,Vim将自动插入换行符。
gq
来重新对齐。你可以通过输入 :set fo+=a
自动化此过程。请阅读关于此的 :help fo
和 :help fo-table
。但是,不幸的是,此模式(在 :set fo+=a
后)效果不太好,还存在一些问题。 - Dmitry Frank你需要稍微退后一步,使用gj
和gk
来在被包裹的行内向下和向上移动。
由于gj
和gk
在被包裹的行内的作用与非被包裹的行内的j
和k
完全相同,因此你可以安全地将j
或<down>
映射到gj
,将k
或<up>
映射到gk
,使其完全无缝切换。
--编辑--
是的,这并没有解决Eddy当前的问题,但它解决了他最初的问题(在被包裹的行内进行垂直移动),这导致他采取了一个糟糕的解决方法,进而陷入了这种情况。
这些是我使用的映射。它们处理了我到目前为止遇到的所有情况。
" Modify the up/down keys so that they move per virtual (rather than
" physical) line if a line is displayed wrapped and no count for the
" command has been specified. Always use logical line steps for quickfix
nnoremap <expr> k ((v:count) ? 'k' : ((&buftype == 'quickfix') ? 'k' : 'gk'))
nnoremap <expr> j ((v:count) ? 'j' : ((&buftype == 'quickfix') ? 'j' : 'gj'))
nnoremap <expr> <Up> ((v:count) ? 'k' : ((&buftype == 'quickfix') ? 'k' : 'gk'))
nnoremap <expr> <Down> ((v:count) ? 'j' : ((&buftype == 'quickfix') ? 'j' : 'gj'))
xnoremap k gk
xnoremap j gj
vnoremap <Up> gk
vnoremap <Down> gj
" Move to start and end of virtual line (this will default to normal behaviour
" if the line isn't wrapped)
nnoremap 0 g0
nnoremap <Home> g0
nnoremap ^ g^
nnoremap $ g$
nnoremap <End> g$
" These mappings need to deal with virtual line numbers in 'insert' mode,
" but they need to do it without messing up normal 'completion menu' operation
inoremap <expr> <Up> pumvisible() ? "\<Up>" : "\<C-o>gk"
inoremap <expr> <Down> pumvisible() ? "\<Down>" : "\<C-o>gj"