19

我希望 vim 为我着色“长”行。以 80 列为例,我想突出显示超过该长度的行。以下是我认为 .vimrc 文件应该包含的大致内容,尽管它 (1) 不起作用,并且 (2) 使用 Perl 的正则表达式语法来说明我的观点,因为我不太了解 Vim:

...
highlight Excess ctermbg=0
au Syntax * syn match Excess /.{80,}$/
...

这(至少在我看来)应该标记超过 80 列的行。理想情况下,我希望能够仅对超过 80 列的行的部分进行着色,因此如果一行是 85 列,则第 81 到第 85 列将被突出显示。

我确信 Vim 可以做到这一点,只是不能由我掌舵。

4

6 回答 6

32

我需要自动命令为我工作:

augroup vimrc_autocmds
  autocmd BufEnter * highlight OverLength ctermbg=darkgrey guibg=#111111
  autocmd BufEnter * match OverLength /\%75v.*/
augroup END

如果您的目标是平均 80 列,也喜欢使用 75 的想法。

取自:

http://blog.ezyang.com/2010/03/vim-textwidth/

没有 : highlight + match 可能失败的可能原因BufEnter只能使用一次。多次使用意味着旧的被覆盖。如何添加多个亮点

于 2012-06-12T09:22:20.317 回答
17

我的 vimrc 中有这个。
我在这里找到它:Vim 80 列布局问题

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%81v.*/

您可能想根据自己的喜好调整颜色。

于 2008-12-27T19:38:06.240 回答
3

因为我不喜欢 Vim 7.3 的列标记,所以我只使用第 80 列之后的突出显示文本……至少 95% 的时间我都想要这样。

在另外 5% 的时间里,我写了这个小扩展来快速禁用高亮:

https://gist.github.com/fgarcia/9704429#file-long_lines-vim

于 2014-03-22T10:26:41.813 回答
1

我使用以下方法:

hi gitError ctermbg=Red
match gitError /^.*\s$/
2match gitError /^.\{120\}.*$/

(这些匹配一些 git 预提交钩子)

第二行应该是你感兴趣的。

于 2008-12-27T16:06:19.663 回答
1

这使用自动命令来调整 OverLength 值以匹配您的文件类型。

" highlight lines longer than `textwidth` size for each filetype
autocmd FileType *
    \ if &textwidth |
    \    exec 'match OverLength /\%' . string(&textwidth+2) . 'v.*/' |
    \ endif
于 2017-03-31T10:16:39.517 回答
1

我喜欢其他答案,但也希望能够打开和关闭它们。我真的不知道自己在做什么,但是今天早上经过一番努力后,我发现了一些似乎可行的方法:

highlight OverLength ctermbg=darkgrey ctermfg=white guibg=#292929

fun! LongLineHighlightInit()
    if !exists("w:llh")
        call LongLineHighlightOn()
    endif
endfunction

fun! LongLineHighlightOn()
    let w:llh = matchadd("OverLength", '\%80v.')
endfunction

fun! LongLineHighlightOff()
    call matchdelete(w:llh)
    let w:llh = 0
endfunction

fun! LongLineHighlightToggle()
    if !exists("w:llh") || w:llh == 0
        call LongLineHighlightOn()
    else
        call LongLineHighlightOff()
    endif
endfunction

augroup LongLineHighlight
    autocmd BufWinEnter * call LongLineHighlightInit()
augroup end

nnoremap <silent> <Leader>8 :call LongLineHighlightToggle()<CR>

使用 matchadd 和 matchdelete(而不是简单的“匹配”)意味着高亮不会干扰使用匹配高亮的任何其他内容。

但这也要求我们将返回的匹配组 ID 存储在与高亮机制匹配的范围内,即窗口范围(即同一缓冲区上的两个窗口可以独立使用 match/matchadd/matchdelete 设置不同的高亮)。因此,“w:”范围变量。

当创建一个新窗口时(由 BufWinEnter 事件检测,然后检查 'w:llh' 变量是否未定义),我们默认打开突出显示。

于 2021-05-19T17:02:09.777 回答