2017-03-20 4 views

답변

3

나는 방법을 발견했지만 그것은 약간 미친 같습니다

set statusline=%{substitute(line('$')\,'\\d\\zs\\ze\\%(\\d\\d\\d\\)\\+$'\,'\,'\,'g')} 

백 슬래시의 첫 번째 라운드는 set (나는 ,\ 자체를 탈출해야) 단지입니다. 실제로이 문자열하는 옵션을 설정하고있어 무엇

: 형식 문자열로

%{substitute(line('$'),'\d\zs\ze\%(\d\d\d\)\+$',',','g')} 

,이 라인은 %{...} 하나 개 포맷 코드가 포함되어 있습니다. ...에있는 모든 것이 표현식으로 평가되고 그 결과가 다시 대체됩니다.

내가 평가하는 표현식은 (실제 코드에 추가 한 경우, set에 대해이 코드를 이스케이프 처리해야합니다. 다시,)) 아직 더 백 슬래시를 강제 :

substitute(line('$'), '\d\zs\ze\%(\d\d\d\)\+$', ',', 'g') 

이것은 substitute 함수를 호출합니다. 인수는 소스 문자열, 정규 표현식, 대체 문자열 및 플래그 목록입니다.

우리가 시작하는 문자열은 line('$')입니다. 이 호출은 현재 버퍼의 라인 수 (또는 버퍼의 마지막 라인 수)를 반환합니다. 이것은 %L가 정상적으로 보여주는 것입니다.

우리가 찾고있는 검색 패턴은 \d(\d\d\d)+$ (특별한 광적 제거가 제거됨)입니다. 즉, 숫자 뒤에 하나 이상의 3 자리 그룹이 있고 그 뒤에 문자열이옵니다. 그룹핑은 vim에 \%(\)이며 "1 이상"은 \+이며 이는 \d\%(\d\d\d\)\+$입니다. 마술의 마지막 비트는 \zs\ze입니다. \zs은 일치하는 문자열의 시작을 설정합니다. \ze 끝이 설정됩니다. 이것은 마치 \zs 이전의 모든 것이 look-behind 패턴이고 \ze 이후의 모든 것이 look-ahead 패턴이었던 것처럼 작동합니다.

다음과 같이 표시됩니다. 소스 문자열에서 숫자가 앞에오고 그 다음에 정확히 N 자릿수 (N은 3의 배수)가 오는 모든 위치를 찾습니다. 이 작업은 오른쪽에서 시작하여 왼쪽으로 가면서 매번 3 자리를 건너 뛰는 것과 같습니다. 이것은 쉼표를 삽입해야하는 위치입니다.

대체 문자열은 ',' (쉼표)입니다. 길이가 0 인 문자열과 일치하기 때문에 을 ','으로 대체하여 소스 문자열에 효과적으로 삽입합니다.

마지막으로 g 플래그는 첫 번째 플래그뿐만 아니라 모든 일치 항목에 대해이를 수행합니다.

TL; DR :

  • line('$') 우리가
  • %{} 우리가
+0

statusline에 임의의 식을 삽입 할 수 있습니다를 원하는 "그러나 여기서 우리에게

  • substitute(..., '\d\zs\ze\%(\d\d\d\)\+$', ',', 'g') 쉼표를 추가 라인의 수를 제공 조금 미쳤어 요? " 그것은 아름다움입니다 :-). 두 가지 언급 : (1) 분리 기호를 변경해야하는 경우, 마지막 "\,"옆에 있습니다. (2) 구분 기호가 작은 따옴표 인 경우 "\ '\'"로 두 배가되어야합니다. –