Vim 80列布局问题


417

我在Vim中执行80列指示的方式似乎不正确:set columns=80。有时我也可以set textwidth,但是我希望能够看到和预期set columns替代品的线路溢出。

这有一些不幸的副作用:

  1. 我不必set number担心会在行号顺序不同的文件之间进行拆分;即<100行文件和> = 100行文件将需要两个不同的set columns值,这是因为用于额外数字显示的额外列。
  2. 我也开始新的(g)Vim会话,而不是垂直拆分窗口。这是因为每次打开或关闭窗格时都会vsplit强制我执行操作set columns,因此开始新会话的麻烦较少。

要进行80个字符的显示set numbers,垂直拆分等时,如何处理?


60
在许多圈子中,它被认为是良好的代码风格。例如,Python的样式指南(PEP8)建议使用79个字符行:python.org/dev/peps/pep-0008
cdleary,

4
这不是绝对的“您必须有80个字符行”,但是它确实使它在某些系统上更易于阅读,例如,任何不在控制台中运行的基于控制台的应用程序都可以在其大小上进行调整。
马修·沙利

47
@davr:首先,它更容易阅读。一些研究表明,最短的行长(每行76个字符)最容易接受,并且在线阅读最快。您是否知道这一点:阅读时突然眼睛错了?80个字符很少会发生这种情况。其次,我经常在1600像素宽的显示器上并排编辑和比较两个文件。仅当文件的行数不超过80个字符时,此方法才有效。因此,我经常重新排长队才能有效地工作。
2009年

25
@davr对于并行编辑多个文件非常有用。
aehlke

2
自从我采用了80个字符的行宽(来自内核编码风格)以来,我在C / C ++和JS代码中的错误都更少了。我偶尔会被一对夫妇淹没,但很少...
Mark K Cowan 2014年

Answers:


586

我在我的.vimrc中进行了设置:

highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.\+/

对于超过80列限制的文本,这会以微妙的红色突出显示背景(无论如何,在GUI模式下都是微妙的-在终端模式下则是如此)。


3
好点子!我将其更改为“ ctermbg =暗红色”和“ guibg =#FFD9D9”,以更好地适应我的需求(gvim中的浅色背景和cterm模式中的暗色)。
HS。

10
我认为一个微妙的修正是/\%81v.\+/-由于某种原因。*突出显示了字符不存在的地方。
2008年

14
我认为这条线对于匹配正则表达式会稍微好一点:match OverLength /\%>80v.\+/这不会突出显示“行尾”字符,而且也更直观,因为您只需将数字设置为所需的数字即可线长为+1。
大卫·特雷

8
由于某种原因,它仅在我的视频中为我打开的第一个打开的缓冲区(第一个选项卡的第一个窗口)中
起作用

3
如果此解决方案仅在您的第一个缓冲区中起作用,请查看stackoverflow.com/a/10993757/9822
Jesse Vogt 2013年

769

从vim 7.3开始,您可以使用set colorcolumn=80set cc=80简称)。

由于早期版本不支持此功能,因此我.vimrc改用:

if exists('+colorcolumn')
  set colorcolumn=80
else
  au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
endif

另请参阅有关该colorcolumn选项的在线文档


26
您甚至可以使用:set cc = + 1
graywh 2010年

1
has(“ colorcolumn”)对我不起作用。我不得不使用exist(“&colorcolumn”)代替。
SpoonMeiser

5
非常好,除了vim <7.1.40不支持matchadd。
格雷格·扬德尔

19
您还可以使用highlight ColorColumn ctermbg=7
null_radix


54

较短的方法:

match ErrorMsg '\%>80v.\+'

8
我真的很喜欢这样做,因为它不会污染我的缓冲区,垂直线较长!(Y)
尼卡比曹

ErrorMsg是一个highlight-group。Vim中有很多默认的高亮组,您可以根据需要在这种情况下使用的颜色编码来使用它们。
crisron

49

我更喜欢:

highlight ColorColumn ctermbg=gray
set colorcolumn=80

我喜欢这一个。我使用黑色而不是灰色,并且由于我的背景几乎是黑色但还不是很黑,所以它更加微妙。
等腰振荡

30

西蒙·霍华德的答案很好。但是/\%81v.\+/无法突出显示超过列81的选项卡。因此,根据我在VIM Wiki上发现的内容以及HS上面的颜色选择,我做了一些调整:

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%>80v.\+/

现在,VIM将突出显示超出列80的所有内容。


2
可能要guifg=white在此末尾添加。
丹·贝查德

17

在此处输入图片说明

简约的,非主流的方法。仅太长的行的第79个字符会突出显示。它克服了一些常见问题:在新窗口上工作,溢出的单词正确突出显示。

augroup collumnLimit
  autocmd!
  autocmd BufEnter,WinEnter,FileType scala,java
        \ highlight CollumnLimit ctermbg=DarkGrey guibg=DarkGrey
  let collumnLimit = 79 " feel free to customize
  let pattern =
        \ '\%<' . (collumnLimit+1) . 'v.\%>' . collumnLimit . 'v'
  autocmd BufEnter,WinEnter,FileType scala,java
        \ let w:m1=matchadd('CollumnLimit', pattern, -1)
augroup END

注意:请注意,FileType scala,java这将其限制为Scala和Java源文件。您可能需要对此进行自定义。如果您忽略它,它将适用于所有文件类型。


为什么要添加FileType scala,java?(不为我工作)
Dorian

1
@Dorian将此限制为Scala和Java文件类型,因为这些是我当时正在使用的文件类型。我忽略了这一点。更新答案。
Dominykas Mostauskis 2014年

屏幕截图中使用的是哪种字体?我觉得这很令人高兴。
Rook

@Idigas:同意,我觉得当我最初设置PuTTY时,Comic Sans可能是一个错误的选择:)
Mark K Cowan 2014年

我无法获得此答案的摘录以在Vim 7.4中工作。(我也删除了FileType过滤器。)
Mnebuerquo

13

您也可以画线以查看80个限制:

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

结果:

在此处输入图片说明


13

标记仅第一个字符超出指定范围的好方法:

highlight ColorColumn ctermbg=magenta "set to whatever you like
call matchadd('ColorColumn', '\%81v', 100) "set column nr

从Damian Conway的讲话中


7

较新版本的vim允许使用一个:set numberwidth=x值,该值设置行号显示的宽度。我实际上并没有使用折叠等功能,因此我对此一无所知。但是,绘制一条细的垂直线超出了控制台应用程序的能力。GVim可能允许这样做(我不使用它,所以不能在此处发表评论)。


5

恐怕您对解决方案集施加了约束,好让您留空集。

使用:set textwidth=80可以解决您提到的所有问题,您不容易看到即将出现的行数限制。如果您使用:set ruler,则将启用状态栏上的x,y位置显示,您可以使用它查看所在的列。

除此之外,我不确定该告诉您什么。丢失数字列,折叠列和拆分很可惜,因为您必须:set columns=80


是的,我很担心……我希望有一种隐藏的方法可以像在更图形化的编辑器中那样绘制一条垂直的细线。
cdleary

5

您可以尝试以下方法:

au BufWinEnter * if &textwidth > 8
\ | let w:m1=matchadd('MatchParen', printf('\%%<%dv.\%%>%dv', &textwidth+1, &textwidth-8), -1)
\ | let w:m2=matchadd('ErrorMsg', printf('\%%>%dv.\+', &textwidth), -1)
\ | endif

这将在每个缓冲区中设置两个突出显示,一个突出显示设置为8列之前的字符,另一个突出显示&textwidth超出该列的字符。这样一来,您就有一定程度的期待。当然,如果您希望更多或更少的期望(可以在这些列中使用语法突出显示的形式来支付),则可以对其进行调整以使用其他宽度。


3

好吧,看着:help列,并没有使它变得混乱。

在控制台中,通常由控制台设置确定(即自动检测到);在GUI中,它确定gvim窗口的宽度(并由其确定)。

因此,通常您只需要通过注释掉控制台和窗口管理器来完成工作即可 set columns

我不确定“看到并预期行溢出”是什么意思。如果希望将EOL大致插入第80列,请使用set textwidthset wrapmargin;如果您只想进行自动换行(即换行,但没有实际的停产期),请使用set linebreakset showbreak


2

这是在左字段之外,但是它有一个不错的小地图,用于在行号位于以下时将当前拆分大小调整为80个字符:

" make window 80 + some for numbers wide  
noremap <Leader>w :let @w=float2nr(log10(line("$")))+82\|:vertical resize <c-r>w<cr> 

1

您可以尝试将窗口大小设置为允许80个字符的实际文本。但是,这仍然不适用于垂直分割。

let &co=80 + &foldcolumn + (&number || &relativenumber ? &numberwidth : 0)

这需要vim 7+,相对数为7.3。

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.