Vim自动换行

41

当我在vim中撰写长段文本(例如LaTeX中的段落)时,它会将我的文本换行成多行,这是很好的。但是,如果我尝试使用“j”和“k”(或上下箭头)导航这些行,则会跳过整个段落。我通过突出显示段落并按下gq来解决了这个问题。这会在每行末尾插入换行符。

我的问题是,是否有一种自动化此操作的方法,这样我就不必不断地突出显示文本并按下gq


你是在询问自动插入换行符的自动换行吗? - JaredPar
3个回答

66

您可以使用textwidth选项来限制行的宽度(请参见:help tw)。

例如,如果您想将宽度限制为80列,可以使用:

:set tw=80

使用此选项,当您输入的内容长于80列时,Vim将自动插入换行符。


25
问题在于,当在现有行中添加新词时,你必须选择段落并按下 gq 来重新对齐。你可以通过输入 :set fo+=a 自动化此过程。请阅读关于此的 :help fo:help fo-table。但是,不幸的是,此模式(在 :set fo+=a 后)效果不太好,还存在一些问题。 - Dmitry Frank
1
另外,它不会在没有空格的情况下断行。只是觉得值得一提。 - cprn

36

你需要稍微退后一步,使用gjgk来在被包裹的行内向下和向上移动。

由于gjgk在被包裹的行内的作用与非被包裹的行内的jk完全相同,因此你可以安全地将j<down>映射到gj,将k<up>映射到gk,使其完全无缝切换。

--编辑--

是的,这并没有解决Eddy当前的问题,但它解决了他最初的问题(在被包裹的行内进行垂直移动),这导致他采取了一个糟糕的解决方法,进而陷入了这种情况。


谢谢,这很好,因为我在我的 LaTeX 文档中使用 SVN 版本控制,所以现在 diff 不会显示由于换行和单词换行而更改的大量行。 - Eddy

0

这些是我使用的映射。它们处理了我到目前为止遇到的所有情况。

" 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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接