在Vim中任意宽度的窗口中以80个字符换行


126

无论我的实际窗口宽度如何,我都想使用Vim的软包装功能(:set wrap)以80个字符包装一些代码。

我还没有找到一种方法来做-所有的软包装似乎都与窗户的宽度有关

  • textwidth并且wrapmargin都用于硬包装(它们在文件中插入换行符)
  • 垂直拆分成多个窗口,并在其中之一上使用:vertical resize 80(可能:set breakat=允许任何字符中断)(即使有点破烂),但:set number由于行号占用了可变的列数(因此取决于在文件长度上),这些都是80的一部分。

有什么办法可以在vim中做到这一点? 根据其他消息来源,它看起来没有希望

现在,我的近似值只是/^.\{80}\zs.\+作为默认搜索,因此至少要突出显示。我曾考虑:syntax为其添加一个项目,但是当它与其他语法项目重叠时,该项目就中断了,所以我放弃了这个想法。


实际上,您是如何设置默认搜索的?
thethinman 2010年

Answers:


37

你可以

  • 通过:set numberwidth=6和为行号列设置一个较大的最小宽度
  • 那么您可以使用:set columns=86(或使用鼠标)将窗口调整为适当的大小。

如果您编辑的文件中有一百万行,则可能会遇到麻烦,但这不太可能。您也这样浪费屏幕栏的6列。因此仍然存在各种各样的问题。

您可以使用突出过去的80列:match像它说,在这里这里

除此之外,我看不到任何方法可以做到这一点。似乎这将是一个不错的功能。


不幸的是,如果调整窗口大小,vim不会保持列设置。这将导致平铺窗口管理器出现不幸的情况,如果窗口太宽,则没有很好的方法来自动换行到80列。
引力

这行得通,但是并不粘滞。我想下一步是设置一个autocmd,以使列保持所需的文件类型新的所需大小。
xer0x

1
这是正确的答案,因为它确认您没有这样做。而且我敢肯定,我不是唯一不想为此改变终端窗口大小的人。我想为非vim使用提供更多宽度。
Sridhar Sarnobat '18

20

试试这个:

set columns=80
autocmd VimResized * if (&columns > 80) | set columns=80 | endif
set wrap
set linebreak
set showbreak=+++

if (&columns > 80) |如果始终需要80列,则可以删除。


在我的iTerm终端上,这使窗口变小了。我不确定这是否与我的环境有关(我看到您正在使用自动调整大小来做某事),但是否则这是不可取的。(还是)感谢你的建议。
Sridhar Sarnobat,

autocmd确实对我来说很完美(使用guake终端)。
mzcarlos

通过Amuritty中的Tmux + NeoVim可以像魅力一样工作。
MEH

16

对于软包装,我没有解决方案,但是对于标记列,从Vim 7.3(于2010-08-15发布)开始,:set colorcolumn=80将突出显示列80。颜色将取决于语法文件。

请参见Vim 80列布局问题:h colorcolumn


引号不是有效的网址,因此很有意义。定位器名称不应包含无效的URL字符,因此不应修复其他网站开发人员的错误。
暗影巫师为您耳边

1
Shadow Wizard指的是我的答案的先前版本,其中我想知道如何使用Markdown在URL中放置单引号。然后ib建议使用%27,它起作用了。谢谢,ib。
ftvs

最近发现如何仅突出显示:let w:eighty_column_match = matchadd('ColorColumn', '\%81v.\+', 100)
80〜以后的

colorwidth一点是其他原因的帮助,所以我很高兴你张贴了这个。
Sridhar Sarnobat '18

2

你试过了'linebreak'吗?

        *'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
  'linebreak' 'lbr' boolean (default off)
        local to window
        {not in Vi}
        {not available when compiled without the  |+linebreak|
        feature}
If on Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen.  Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
it only affects the way the file is displayed, not its contents.  The
value of 'showbreak' is used to put in front of wrapped lines.
This option is not used when the 'wrap' option is off or 'list' is on.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.

3
嗯......不过breakat只是一个图形(不长),所以我不看我怎么可以使用它来强制软包80 ....
风铃草

嗯,我想知道是否有可能制作一个正则表达式来匹配总长度(加上中间的空格)小于或等于n个字符的单词。
Shane Creighton-Young

@ ShaneCreighton-Young:^.{,80}\b适用于使用软/展开标签的人。注意这是perl regex,而不是vim regex。
Mark K Cowan

0

没有好的方法。我们可以破解一个临时setlocal softwrapautocmd,如果我们修改@eborisch答案。如果我们每次进入缓冲区都调整大小,并且当局部变量时我们调整为特定长度softwrap,我们将获得所需的行为。

假设我们想自动换行到80列,我们可以在中编写以下内容.vimrc

augroup softwrap
    autocmd VimResized * if (exists('b:softwrap') && &columns > 80) | set columns=80 | endif
    autocmd BufEnter * set columns=999
augroup END

要打开特定缓冲区的模式,请使用以下命令:

let b:softwrap=1
set columns=80

这只是将我的文件变成乱码。
Suuuehgi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.