Как выделить длинные абзацы?

Я знаю, как выделить длинные строки. Либо :

:match ErrorMsg '\%>140v.\+'

который я предпочитаю "способу colorcolumn":

:set colorcolumn=140

Так, например, текст:

Vim — текстовый редактор, написанный Б. Муленааром и впервые выпущенный публично в 1991 году. Он основан на редакторе vi, общем для Unix-подобных систем. Vim — это бесплатное программное обеспечение с открытым исходным кодом.

выделяется, начиная с «Vim свободен и т. д.»

Но как я могу добиться того же результата для абзаца (в этом примере 3 строки), например:

[Empty line]
Vim is a text editor written by B. Moolenaar and first released publicly in 1991. 
It is based on the vi editor common to Unix-like systems. 
Vim is free and open source software
[Empty line]

заранее спасибо


person ThG    schedule 28.03.2014    source источник
comment
тогда весь документ будет отображаться в одном (выделенном) цвете, верно? потому что ваш документ состоит из абзацев и пустых строк. или я неправильно понимаю вопрос?   -  person Kent    schedule 28.03.2014
comment
@Kent: вот именно. И эти абзацы могут состоять (это чистый текст, а не код) из 1, 2, 3 и т. д. строк, причем эти абзацы разделяются одной строкой. Я хочу видеть в этом примере все абзацы, состоящие из › 140 символов.   -  person ThG    schedule 28.03.2014


Ответы (1)


Это сложно, потому что вы должны указать (в одном регулярном выражении)

  1. условие абзацев (которые я предполагаю, что это строки, разделенные не более чем одной новой строкой, т.е. пустые строки создают новые абзацы)
  2. подсчет символов (выделить после 140 символов)

Вот лучшее, чего я добился; он все еще каким-то образом совпадает со следующими абзацами, если текущий слишком мал:

:match ColorColumn /\%(\%^\|\n\n\)\%(\%(.\+\n\)*.*\)\&\_.\{140}\%(\zs.\|\n\zs.\)/

Объяснение:

  • привязывается к началу буфера или к пустой строке
  • соответствует непустой строке (строкам)
  • и дополнительные символы И
  • соответствовать 140 символам и/или новым строкам
  • затем начните совпадение со следующего символа или, если это новая строка (которая не отображается правильно), следующий символ после него

Буду рад, если кто-то улучшит это.

person Ingo Karkat    schedule 28.03.2014
comment
Большое спасибо за ответ. Однако, похоже, есть небольшой сбой: он работает только для 3-строчных абзацев. Это может быть связано с тем, что он все равно каким-то образом совпадает со следующими абзацами, если текущий слишком мал. Но, как я только что прокомментировал @Kent (я должен был быть более точным), эти абзацы могут состоять из 1, 2, 3 и т. д. строк, причем эти абзацы разделяются одной строкой. Параграф ‹ 140 символов следует считать правильным. Это побуждает меня попросить вас - если у вас есть достаточно времени - объяснить ваше регулярное выражение. В любом случае, еще раз спасибо. - person ThG; 28.03.2014
comment
Спасибо, я добавил объяснение; теоретически регулярное выражение должно работать (я думаю); возможно, некоторые ограничения реализации Vim мешают его использованию. - person Ingo Karkat; 28.03.2014
comment
попробовал еще раз, и это сработало хорошо. Спасибо за ответ и за ваши объяснения (кстати, это регулярное выражение не для слабонервных новичков, таких как я...) - person ThG; 29.03.2014