현재 파일의 문자 수를 표시하기 위해 (g) Vim을 어떻게 얻을 수 있습니까?


85

나는 자주 프로그래밍 포럼을위한 튜토리얼과 기사를 쓰고 싶다. 이 포럼에는 게시물 당 글자 수 제한이 있습니다. 과거에 메모장 ++을 사용하여 게시물을 작성했으며 상태 표시 줄에 라이브 문자 수를 유지합니다. gVim을 더 많이 사용하기 시작했고이 시점에서 메모장 ++로 돌아가고 싶지는 않지만이 문자 수를 갖는 것이 매우 유용합니다. 카운트를 넘어 가면 보통 포스트를 메모장 + +에 붙여 넣고 한계에 도달하기에 충분히 손질 된 시점을 볼 수 있습니다.

:set ruler도움이 될만한 제안을 보았지만 현재 줄의 현재 열 색인을 통해 문자 수만 제공합니다. 단락 나누기를 사용하지 않으면 좋을 것입니다. 그러나 한 단락에서 수천 문자를 읽는 것이 불편하다는 데 동의 할 것입니다.

도움말을 읽고 rulerformat작동 한다고 생각 했지만 statusline형식 을 살펴본 후 현재 버퍼의 문자 수를 제공하는 것을 보지 못했습니다.

나는 이것을 추가하는 플러그인이 있다는 것을 보았지만 여전히 발가락을 gVim에 담그고 있으며 내가하는 일을 이해하기 전에 임의의 플러그인을로드하고 싶지는 않습니다. vim에 내장 된 것을 사용하고 싶지만 존재하지 않으면 존재하지 않습니다.

목표를 달성하려면 어떻게해야합니까? 플러그인과 관련이 있다면 플러그인을 사용하고 얼마나 잘 작동합니까?

답변:


140

를 눌러 g CTRL-G일반 모드에서 커서 및 파일에 대한 통계를 표시합니다.

리눅스에 있다면 wc -m현재 파일에서 문자 수를 얻는 데 사용할 수 있습니다

:!wc -m %

실시간으로 업데이트되지 않기 때문에이 명령을 다음과 같이 매핑 할 수 있습니다.

map <F4> :!wc -m %<CR>

19
g CTRL-G나는 이것이 존재하는지 몰랐다. 좋은!
Jason Down

Vim에서! bang 명령을 사용하는 것을 잊어 버렸습니다.
Eddie B

3
g <cg>는 크로스 플랫폼에서 작동합니다.
AndrewPK

사용에 대한 자세한 정보는 어디서 찾을 수 있습니까 ! [...] %?
Wok

도움말은 여기에 있습니다 : vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . 쉘 명령을 많이 사용한다면 stevelosh.com/projects/clam 플러그인도 확인하십시오 .
mrucci

24
:help count-items

교체 알라의 드라이 런을 할 수 있다고 제안합니다.

:%s/./&/gn

(그러면 일치하는 문자 수를 다시보고) strlen()시각적으로 선택된 텍스트를 멋지게 표현 합니다.

:echo strlen(@")

( "는 이름이없는 레지스터입니다)

상태 표시 줄에서 표현식을 호출하면 %{myfunc()}좋은 출발점이 될 수 있습니다. 전체 텍스트를 선택한 다음 잡아야하기 때문에 모든 시간을 계산하는 데 약간의 시간이 소요될 수 있습니다. 버퍼의 문자 수 : 버퍼의 모든 텍스트를 시각적으로 선택하고 잡아 당기면 해결책은 다음과 같습니다.

 :set statusline=%{strlen(@")}

"-레지스터에있는 문자 수를 제공합니다 (현재 버퍼를 선택하고 잡아 당기는 경우 바이트 수와 동일).


솔루션은 Windows에서도 작동합니다 (bash 명령은 그렇지 않습니다).
dastrobu

나는 g<CTRL-g>수용 된 답변 의 방법 과 같이 1 초 후에 카운트가 사라지지 않는다는 것을 좋아합니다 .
체스터

7

mrucci의 답변 향상 :

다음과 같이 명령 출력을 지정 wc하여 파일을 먼저 저장하지 않고도 Linux에서 사용할 수 있습니다 :w.

:w !wc -m

mrucci가 언급 한 것과 매핑 할 수 있습니다.


6
:help statusline

너에게 준다

o N   Byte number in file of byte under cursor, first byte is 1.
      Mnemonic: Offset from start of file (with one added)

또한 문제에 대한 좋은 해결 방법입니다. 버퍼의 끝으로 가면 G상태 표시 줄에 표시된 바이트 번호는 문자 수입니다 (물론 멀티 바이트 문자에는 해당되지 않음). 에서 온 곳으로 돌아갑니다 ctrlo.


1
이것은 멀티 바이트 문자에 문제가 있습니다. 내 상태 표시 줄에 % o를 넣은 후이 질문을 찾았습니다.
Matt

@ 매트 : 그렇다면 해결책은 무엇입니까?
akira

1
일반 모드에서 mrucci의 솔루션 "g ^ g"가 충분했습니다. 빠른 디버그를 위해 필요했기 때문에 상태 표시 줄에서 해당 정보를 얻는 데 시간이 걸리지 않았습니다.
Matt


1
문서가 모호하고 혼동되기 때문에 실행할 필요가있는 특정 명령이 set statusline+=\ %o\ %N 흥미 롭다 는 점에 주목할 가치가 있습니다 (흥미 적으로 "t S"항목에는 작동하지 않습니다) . 그런 다음 상태 표시 줄이 변경되지 않으면 실행해야하기 때문 set laststatus=2입니다. 나를 위해 기존의 투명 상태 표시 줄을 검은 색으로 표시하고 "바이트 수"항목 만있는 새 상태 표시 줄로 바꿨습니다.
Hi-Angel

3

파일을 저장하기 위해 : w를 사용하는 습관이 있다면, 이렇게 할 때마다 상태는 기록 된 문자 수를 다시보고합니다. 예를 들어,이 문장의 끝에 나는 : w (예,이 메모를 작성하기 위해 gvim을 사용하고 있습니다)를했으며 245C가 기록되었습니다.


이것은 한 번의 사용법으로 아름답게 골프를칩니다.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

3

다음과 같이 상태 표시 줄에 버퍼의 바이트 수를 표시하는 표현식을 추가 할 수 있습니다.

:set statusline+=\ %{\ line2byte(line(\"$\")+1)-1\ }B

또는 모든 탈출을 피하기 위해 옵션 변수를 직접 변경할 수 있습니다.

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'

이 작업을 시도하면 gVim이 닫히지 않은 표현식 시퀀스에 대해 불평합니다. 괄호가 누락되었지만 문제를 해결해도 도움이되지 않습니다. 다음에 다시 쓴 내용은 다음과 같습니다. : set statusline = % {line2byte (line ( "$"))}
OwenP

@OwenP : 지금 수정해야합니다
akira

1
...%{ line2byte(line(\"$\")+1))-1 }카운트에서 마지막 줄의 문자를 포함하기 를 원할 것입니다. 그러나이 방법은 멀티 바이트 문자를 올바르게 계산하지 않습니다.
직관

1
또한 공간을 탈출하거나 제거해야한다고 생각합니다.
intuited

@intuited의 제안을 포함하도록 편집되었으며 상태 표시 줄에 덮어 쓰지 않고 추가되었습니다.
joeytwiddle

0

해결 방법 mrucci의 답변을 수락 할 때까지 사용했습니다.

실수로 파일을 저장하기 위해 : w를 쓰면 명령이 쓴 바이트 수를 출력한다는 것을 알았습니다. 이것은 거의 문자 수이므로 지금까지 충분히 가깝습니다. 나는 mrucci의 대답도 좋아합니다. 단어 개수도 있기 때문에 아마도 이것보다 더 좋습니다.


0

텍스트의 파일 사본을 유지하는 경우 텍스트를 디스크에 쓰면 문자 수가 기본적으로 표시됩니다.

파일을 유지하지 않으려면 텍스트를 /dev/null다음 위치에 저장하십시오 :w!/dev/null.

당신은 또한 wc당신의 문자를 셀 수 있습니다 : :%!wc -c-하지만 U텍스트를 복원하기 위해 누르는 것을 잊지 마십시오 .

이 작업이 자주 필요한 경우 다음 명령을 키 순서에 매핑하면됩니다 :map #wc :w!/dev/null^[.- ^[Ctrl+ 로 입력해야합니다 V Esc.

텍스트 크기의 첫 번째 지표로 줄 번호를 켜십시오. 인정 : 이것은 약간의 정신 산술이 필요합니다 ;-)


0

이 질문을하고 답변을 읽은 후 (mrucci 덕분에)이 줄을 내 .vimrc 초기화 파일에 추가했습니다.

# get full statistics on the current buffer (not perfect, may redraw screen)
map ;gg           G$g<C-G>''
# get full statistics on the current position in the buffer
map ;gh           g<C-G>

나는 그것을 vim에 맡긴다 : 사용자가 무엇을하는지 파악하도록 돕는다.

개인적으로 Vim 매핑을 시작하는 것이 유용하다는 것을 알았습니다. 또는 나는 그것들을 명령의 첫 문자로 거의 사용하지 않기 때문에.

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