【问题标题】:Vim 80 column layout concernsVim 80 列布局问题
【发布时间】:2010-09-19 02:59:07
【问题描述】:

我在 Vim 中进行 80 列指示的方式似乎不正确:set columns=80。 有时我也set textwidth,但我希望能够看到并预测使用set columns 替代方案的行溢出。

这有一些不幸的副作用:

  1. 我不能set number,因为害怕在具有不同行号顺序的文件之间进行拆分;即 = 100 行文件将需要两个不同的 set columns 值,因为用于附加数字显示的额外列。
  2. 我还开始新的 (g)Vim 会话,而不是垂直拆分窗口。这是因为vsplit 会在我每次打开或关闭窗格时强制我使用set columns,因此开始新会话不会那么麻烦。

想set numbers、垂直分割等时,80个字符的指示如何处理?

【问题讨论】:

  • 很多圈子都认为代码风格不错;例如,Python 的样式指南 (PEP8) 推荐 79 个字符行:python.org/dev/peps/pep-0008
  • 这不是绝对的“你必须有 80 个字符行”,但它确实使它在某些系统上更易于阅读,例如任何不在 GUI 控制台窗口内运行的基于控制台的应用程序调整大小。
  • @davr:首先,它更易于阅读。一些研究表明,短行长度(每行 76 个字符)最适合在线阅读并且最快。你知道吗:阅读时你的眼睛突然错了? 80 个字符很少发生这种情况。其次,我经常在 1600 像素宽的显示器上并排编辑或对比两个文件。这仅在文件的行数不超过 80 个字符时才有效。所以我经常重新排排排长队,然后才能有效地工作。
  • @davr 对于并排编辑多个文件非常有用。
  • 我在 C/C++ 和 JS 代码中产生的错误要少得多,因为我采用了 80 字符的行宽(来自内核编码风格)。我偶尔会溢出几个,但很少......

标签: vim coding-style


【解决方案1】:

使用 set colorcolumn 设置列线

set autoindent                                                                  
set smartindent                                                                 
set nowrap                                                                      
set hlsearch                                                                    
set tabstop=4                                                                   
set shiftwidth=4                                                                
syntax on                                                                       
set colorcolumn=80

【讨论】:

    【解决方案2】:

    西蒙霍华德的回答很棒。但是/\%81v.\+/ 无法突出显示超过第 81 列的选项卡。所以我做了一点调整,基于我在VIM wiki 上找到的东西和上面 HS 的颜色选择:

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

    现在 VIM 将突出显示超过第 80 列的任何内容。

    【讨论】:

    • 可能想在最后添加guifg=white。
    【解决方案3】:

    我更喜欢:

    highlight ColorColumn ctermbg=gray
    set colorcolumn=80
    

    【讨论】:

    • 我喜欢这个。我用黑色而不是灰色,因为我的背景几乎是黑色但不完全是黑色,所以它更微妙。
    【解决方案4】:

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

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

    来自 Damian Conway 的 talk。

    【讨论】:

      【解决方案5】:

      你也可以画线看看80个限制:

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

      结果:

      【讨论】:

        【解决方案6】:

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

        由于早期版本不支持这个,我的.vimrc改用:

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

        另见the online documentation on the colorcolumn option。

        【讨论】:

        • 你甚至可以自动将 'colorcolumn' 的值基于 'textwidth' ,例如 :set cc=+1
        • has("colorcolumn") 对我不起作用。我不得不使用 exists("&colorcolumn") 代替。
        • 很好,除了vim
        • 你也可以用highlight ColorColumn ctermbg=7改变列的颜色
        【解决方案7】:

        简约、不夸张的方法。只有第 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 将其限制为 Scala 和 Java 文件类型,因为这些是我当时正在研究的文件类型。我忽略了提及这一点。正在更新答案。
        • 你在截图中使用的是什么字体?我觉得它非常赏心悦目。
        • @Idigas:同意,我觉得在我最初设置 PuTTY 时,Comic Sans 可能是一个糟糕的选择 :)
        • 我无法让这个答案中的 sn-p 在 Vim 7.4 中工作。 (我也删除了 FileType 过滤器。)
        【解决方案8】:

        更短的方式:

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

        【讨论】:

        • 我真的很喜欢这个,因为它不会用很长的垂直线污染我的缓冲区! (Y)
        • ErrorMsg 是highlight-group。 Vim 中有很多默认的高亮组,您可以根据这种情况所需的颜色编码来使用它们。
        【解决方案9】:

        这个不在左侧字段中,但它是一张不错的小地图,如果您已打开行号,则可以将当前拆分的大小调整为 80 个字符:

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

        【讨论】:

          【解决方案10】:

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

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

          这需要 vim 7+,relativenumber 需要 7.3。

          【讨论】:

            【解决方案11】:

            好吧,看看 :help 列,它并没有真正被弄乱。

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

            所以通常你只是让控制台和窗口管理器通过注释掉set columns来完成他们的工作

            我不确定您所说的“看到并预期行溢出”是什么意思。 如果您希望 EOL 大致插入第 80 列,请使用 set textwidth 或 set wrapmargin;如果您只想要软包装(即换行,但没有实际的 EOL),请使用 set linebreak 和 set showbreak。

            【讨论】:

              【解决方案12】:

              我在我的 .vimrc 中设置了这个:

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

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

              【讨论】:

              • 好主意!我将其更改为“ctermbg=darkred”和“guibg=#FFD9D9”以更好地满足我的需求(gvim 为浅色背景,cterm 模式为深色)。
              • 我认为一个细微的修正是 /\%81v.\+/ -- 出于某种原因,.* 会突出显示不存在字符的地方。
              • 我认为这条线对于匹配正则表达式稍微好一些:match OverLength /\%>80v.\+/ 这不会突出显示“行尾”字符,而且更直观只需将数字设置为您想要的行长,而不是 +1。
              • 由于某种原因,它只能在我的 vim 中为我打开的第一个缓冲区(第一个选项卡的第一个窗口)中工作......
              • 查看stackoverflow.com/a/10993757/9822,如果此解决方案仅适用于您的第一个缓冲区。
              【解决方案13】:

              你可以试试这个:

              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
              

              这将在每个缓冲区中设置两个突出显示,一个用于 &amp;textwidth 设置之前的 8 列中的字符,另一个用于该列之外的字符。这样你就有了一定程度的期待。当然,如果您想要或多或少的预期,您可以调整它以使用不同的宽度(您会以失去这些列中语法突出显示的形式付出代价)。

              【讨论】:

                【解决方案14】:

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

                【讨论】:

                  【解决方案15】:

                  恐怕你已经对解决方案集施加了限制,好吧,让你得到空集。

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

                  除此之外,我不知道该告诉你什么。仅仅因为必须:set columns=80,就丢失了数字列、折叠列和拆分,这是一种耻辱。

                  【讨论】:

                  • 是的,我害怕...
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-08-06
                  • 2019-05-19
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多