同一行テキストの自動強調表示


13

熟練したvim忍者がしばらく前にこれを行うのを見ましたが、開始するつもりはありませんでした。

A)vimsの背景色を設定して、同じ内容の連続する行を強調表示する方法はありますか。

B)誰かがそれを行う方法を知っている場合、これに対する素晴らしい調整は、強調表示が連続した行で行われ、最初の単語のみ(行全体ではない)を考慮する場合です。

一致する行(またはABに依存する単語がアクティブである)の数に基づいて、強調表示を異なる色に構成できる場合の2番目の調整が使用されます。そのため、緑色に一致する2つの連続した行、3〜5の連続した行、次にオレンジ、6 +に続いて赤の2つの連続した行のみがあります。


回答:


10

次のmatchセットは(A)で動作するようです:

:syn match Low /\v(.+)\n(\1\n)/
:syn match Medium /\v(.+)\n(\1\n){2,4}/
:syn match Critical /\v(.+)\n(\1\n){5,}/
:hi Critical  ctermfg=red
:hi Medium  ctermfg=yellow
:hi Low  ctermfg=green

ここでは順序が重要であるようです。Lowor Mediumマッチが後に続く場合、Criticalこれらのより緩い要件に包まれます。同様にLowwrt についても同様ですMedium

ハイライトは、たとえば3行目または6行目のデュープラインを追加した直後には表示されませんが、追加後に少し移動すると表示されます。何がそれを引き起こすのか正確にはわかりません。

Bについては、正規表現を次のように置き換えることができると思います。

/\v(\S+).*\n(\1.*\n)/

一般に、すべての(.*)with (\S+).*および\1with \1.*、またはあなたにとって言葉を構成するものはすべて置き換えてください。


この質問に答えたのは、私に必要な強調表示の方法(質問で表されているように)を行うためです。@Mattsの正規表現は素晴らしいですが、私が尋ねた実際の質問には答えません(強調表示を変更します)。
マーティンヨーク

8

開始点として、重複行に一致する検索パターンを次に示します(先頭の空白の変更を無視します)。

              \zs                marks start of the pattern. Everything before here will not be highlighted
 ^                               start of the line
  \s*                            leading whitespace
       .\+                       match 1 or more non-newline characters
     \(   \)                     and use parens to capture this in match group 1

            \n                   match the newline character
                 \(        \)\+  1 or more
                      \1         copies of what was in the match group 1
                   \s*  \n       with leading whitespace followed by a newline
/^\s*\(.\+\)\n\zs\(\s*\1\n\)\+   the full regex

:help pattern このような正規表現の作成方法に関する詳細情報を提供します

:help syntax この正規表現を取得し、強調表示されるものに変換する方法を示します

構文スクリプトを書くことを学ぶのは難しい場合があるので、良い短期的な解決策は'incsearch'、検索が強調表示され、上記の検索を行うためにキーをマッピングするように設定することによってこれを「オンザフライ」で行うことです。nnoremap <F5> /^\s*\(.\+\)\n\zs\(\s*\1\n\)\+<CR>


そのような正規表現を配布する自動化された方法はありますか?このような明確な描写を提供します。
ムル

1
私は手作業でやっています。vimで最も簡単な簡単な方法はyy10p、完全な正規表現を使用して行のように実行し、削除してヒットする部分を選択することですr<space>。少しスピードを上げるために、「この行の選択を除くすべてをスペースで置き換える」コマンドを追加するかもしれません。
マットベーム

うわー!それはかなりの努力です!
ムル

1
:私は少し速く、この作るために(本当に醜い)vimの機能を作っgist.github.com/mattboehm/da63a48eedf6f14375aa。行を選択し、ヒット,rしてから<space>、通常/視覚モードで行を結合します。
マットベーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.