동일한 줄 텍스트 자동 강조 표시


13

나는 숙련 된 vim 닌자가 잠시 동안 이것을하는 것을 보았지만 시작할 생각은 없었다.

A) 내용이 동일한 연속적인 선이 강조되도록 vims 배경색을 설정하는 방법이 있습니까?

B) 누군가가 그렇게하는 방법을 알고 있다면 강조 표시가 연속 줄에서 발생했지만 첫 번째 단어 (전체 줄 아님) 만 고려하는 것이 좋습니다.

강조 표시가 다른 색상으로 구성 될 수있는 경우 두 번째 조정은 일치하는 줄 수에 따라 사용됩니다 (또는 AB에 따라 단어가 활성화 됨). 그래서 우리는 초록색, 3-5 연속 선, 주황색, 6+, 빨간색과 일치하는 두 개의 연속 선 만 있습니다.


답변:


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 또는 Mediummatch가 뒤에 오는 경우, Critical이들의 요구 사항이 더 느슨하고 Lowwrt 와 비슷합니다 Medium.

강조 표시는 3 번째 또는 6 번째 줄을 추가 한 직후에 나타나지 않지만 추가 한 후에 조금 움직입니다. 정확히 무엇이 트리거되는지 확실하지 않습니다.

B의 경우 정규식을 다음과 같이 바꿀 수 있다고 생각합니다.

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

일반적으로, 모든 교체 (.*)와 함께 (\S+).*\1함께 \1.*, 또는 무엇이든 당신을 위해 단어를 구성한다.


나는이 질문에 필요한 강조 표시를 수행하는 방법 때문에이 대답에 진드기를 주었다. @ Mats 정규 표현식은 좋지만 실제 질문에 대답하지 않습니다 (강조 표시 변경).
Martin York

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>


그런 정규식을 자동 배포하는 방법이 있습니까? 그것은 분명한 묘사를 제공합니다.
muru

1
나는 그것을 손으로하고있다. vim에서 가장 쉬운 빠른 방법은 yy10p정규 표현식을 사용하여 줄을 바꾸고 제거하고 칠하려는 부분을 선택하는 것 r<space>입니다. 어쩌면 나는 '이 줄의 선택을 제외한 모든 것을 공백으로 바꾸십시오'라는 명령을 추가하여 약간의 속도를 낼 것입니다.
Matt Boehm

와! 그것은 약간의 노력입니다!
muru

1
gist.github.com/mattboehm/da63a48eedf6f14375aa 보다 빠른 속도로 (정말 못생긴) vim 함수를 만들었 습니다 . 일반 / 시각 모드에서 ,r라인을 선택하고 히트 한 다음 라인을 결합 <space>하십시오.
매트 Boehm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.