vim을 떠나지 않고 파일의 일부에서 단어를 어떻게 계산합니까?


10

텍스트로 가득 찬 파일이 있습니다 (예 : Markdown 또는 LaTeX). 이 파일의 일부에 포함 된 단어 수를 세고 싶습니다.

:! wc -w %현재 버퍼에서 wc -w를 실행할 수 있다는 것을 알고 있습니다 . 그리고 관심있는 섹션을 명명 된 레지스터에 넣을 수 있다는 것을 알고 있습니다. 명령 또는 파이프에서 사용하기 위해 명명 된 레지스터를 운영 체제에 보내는 방법이 있지만 추측 할 수는 없습니다. 또는 레지스터에서 단어를 계산하는 더 좋은 방법이 있습니까?

내 유스 케이스는 vim에서 많은 비 프로그래밍 작성 (노트, 논문 등)을하고 편집 도중 파일의 주어진 섹션에 몇 단어를 추가했는지 계산하고 싶습니다. 세션.

답변:


16

를 사용 gCTRL+g하면 다음을 얻을 수 있습니다.

Col 1 of 118-121; Line 1 of 5; Word 1 of 142; Byte 1 of 678

선택 항목에 대해서만 단어 수를 얻으려면 시각적 모드에서이 기능을 사용할 수도 있습니다.이 기능은와 같은 텍스트 개체와 함께 특히 유용합니다 ip. (예를 들어 vipg<C-g>현재 단락의 단어 수를 얻는 데 사용할 수 있습니다 ).

참조 : :help word-count:help text-objects.


위의 옵션이 더 좋을 수도 있지만 wc유틸리티를 사용 하여 섹션의 단어 수를 계산할 수도 있습니다 . :! wc -w %사용 하는 양식 외에을 사용할 수도 있습니다 :%!wc -w. 이렇게하면 쉘 도구 (이 경우 %전체 버퍼)에 대한 모션이 필터링 되지만 다른 범위 (예 : :1,5!wc -w처음 5 줄, !,+5!wc -w현재 및 다음 5 줄 등)를 사용할 수도 있습니다. 시각 모드에서 텍스트를 선택하고 입력 :!wc -w하여 선택 항목을 필터링 할 수도 있습니다.

이렇게하면 동작이 셸 도구의 출력 u으로 바뀌지 만 실행 취소 할 수 있습니다 .

참조 :help :range!, :help range그리고 이 대답 내가 범위의 더 많은 예제를 제공합니다.


검색하는 동안 이와 같은 것을 찾았지만 첫 번째 g는 위치 지정자가 아니라 계산 명령의 일부라는 것을 놓쳤습니다. 이 솔루션은 이제 의미가 있습니다. 분명히 비주얼 모드에서도 읽어야합니다. 나는 그것을 자주 사용하지 않습니다.
Colin McFaul 2016 년

1
나는 당신이 g<C-g>그런 식으로 사용할 수 있다는 것을 몰랐 습니다. 대박!
EvergreenTree

3

이것이 가능한 방법은 순수한 vimscript 방식과 wc방법입니다.

순수한 Vim 방식

search and replace 명령을 사용하여이를 수행 할 수 있습니다. 예를 들면 다음과 같습니다.

:%s/\<\w\{-}\>//gn

이것이하는 것은 주어진 패턴을 다른 것으로 바꾸는 대신 패턴의 발생 횟수 만 계산합니다. 이것은 n플래그 때문입니다 . 특정 섹션 (이 경우 5-15 행)의 단어를 세려면 다음과 같이 할 수 있습니다.

:5,15s/\<\w\{-}\>//gn

따라서 선택 내용을 레지스터에 넣을 필요가 없습니다. 대신 사용할 수있는 5-15항목에 대한 더 많은 가능성을 보려면 의 도움말 항목을 읽으십시오 cmdline-ranges. 이 작업을 자주 수행하려면 매핑 (또는 명령)을 작성하는 것이 좋습니다. 또한 hlsearch활성화 한 경우 :nohlsearch나중에 강조 표시를 지우 려면 실행해야 할 수도 있습니다 .

wc방법

같은 일을 할 수 있습니다 wc. 명령으로 cmdline-ranges영역을 선택하는 데 사용할 수있는 것과 같은 방법 :s으로 외부 명령과 함께 영역을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

:5,15!wc -w

wc명령을 통해 5-15 행을 실행합니다 . 이것의 단점은 해당 행 범위를 명령 출력으로 대체한다는 것입니다. 을 눌러이 변경을 취소 할 수 있습니다 u. 또한 vimscript 솔루션은 다른 언어에서는 작동 \w하지 않을 수 있습니다. 다른 언어에서는 일반적으로 단어 문자와 일치하지 않기 때문 입니다. wc이보다 더 잘 할 수 있습니다 \w. 또한이 작업을보다 빠르게 수행 할 수있는 멋진 명령이 있습니다.

command -range=% -addr=lines WordCount execute '<count>!wc -w' | .y a | undo | echo @a

이것은 a레지스터를 방해합니다 .

노트

이것은 g<C-g>키 조합으로 시각적 모드에서 달성 될 수있는 것으로 보인다 . 이에 대한 설명은 Carpetsmoker의 답변을 참조하십시오.


이것들은 그것들을 전역으로 만들기 위해 n과 함께 ag가 필요합니다. 두 번째는 또한 처음에 s가 필요합니다.
Colin McFaul 2016 년

1
고마워요
EvergreenTree

1
사용 \w처음에는 좋은 아이디어 같은 소리를하지만, 테스트 후 나는 많은 문제를 발견했다. 가장 큰 것은 ASCII가 아닌 문자와 일치하지 않으므로 같은 단어 über는 건너 뛰는 것입니다 ( 어제 에 대한 질문 이있었습니다 ). 또한와 같은 단어 e-mail는 2 단어로 계산됩니다. 왜냐하면 a -가 없기 때문에 \w( -예를 들어 영어에서는 다소 드물지만 네덜란드에서는 매우 일반적입니다). 이 방식으로 무시되는 다른 문자들이있을 수 있는데, 이것은 나의 마지막 요점을 알려줍니다. "단어"로 간주되는 규칙은 다를 수 있습니다 ...
Martin Tournoij

... 다양한 언어로 wc로케일에서 "적절한"도구를 선택할 수 있습니다 (GNU가 wc실제로이 문제를 처리 하는지 여부 는 GNU 도구가 뛰어난 유니 코드 지원으로 잘 알려져 있지 않습니다).
Martin Tournoij 2016 년

그것 참 흥미 롭네. wc솔루션에 플러스로 추가 할 수 있습니다 .
EvergreenTree

1

단어 사용 :

:.,+4 s/\i\+/&/gn

. 현재 줄을 나타냅니다.

또한 .vimrc 파일에 다음을 넣습니다.

:cabbrev zzcc   s/./&/gn

:cabbrev zzcw   s/\i\+/&/g

입력 할 수 있습니다 :

:.,+6 zzcw

~로 zzcw확장됩니다s/\i\+/&/g

이것은 zzcw(나를 위해) 아무것도 일치하지 않는 이상한 이름입니다.

부작용은 전체 파일이 선택되고 강조 표시되는 것입니다.

파일에 여러 줄 트윗을 입력하고 너무 많은 문자가 없는지 확인한 후 트윗을 트위터에 붙여넣고 싶었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.