(g)Vimを取得して現在のファイルの文字数を表示するにはどうすればよいですか?


86

私は、よくあるプログラミングフォーラムのチュートリアルや記事を書くのが好きです。このフォーラムには投稿ごとの文字数制限があります。過去にNotepad ++を使用して投稿を書いたことがありますが、ステータスバーにライブの文字カウントが保持されます。私はgVimを使い始めており、この時点でNotepad ++に戻りたくありませんが、この文字数をカウントすることは非常に便利です。カウントを超えてしまうと、通常は投稿をNotepad ++に貼り付けるので、制限を超えるのに十分なタイミングでトリミングしたことがわかります。

:set ruler役立つ提案を見てきましたが、これは現在の行の現在の列インデックスを介して文字数を提供するだけです。段落区切りを使用しなかった場合、これは素晴らしいことですが、1つの段落で数千文字を読むのは快適ではないことに同意するでしょう。

私はヘルプを読んで、それrulerformatがうまくいくと思ったが、statuslineそれが使用するフォーマットを調べた後、現在のバッファの文字数を与えるものは何も見なかった。

これを追加するプラグインがあることを確認しましたが、つま先をgVimに浸しているので、それらが何をするかを理解する前にランダムなプラグインをロードしたいかどうかはわかりません。vimに組み込まれているものを使用したいのですが、存在しない場合は存在しません。

目標を達成するにはどうすればよいですか?プラグインが関係する場合、それを使用しますか?

回答:


140

g CTRL-G通常モードでを押して、カーソルとファイルに関する統計を表示します。

Linuxを使用wc -mしている場合は、現在のファイルの文字数を取得するために使用できます

:!wc -m %

リアルタイムで更新されないため、このコマンドを次のようなものにマップすることをお勧めします。

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

19
g CTRL-Gこれが存在することは知りませんでした。いいね!
ジェイソンダウン

ニース私が使用することを忘れておくVimの中でコマンドを強打!
エディ・B

3
g <cg>はクロスプラットフォームで機能します。
AndrewPK 14年

の使用に関する詳細情報はどこで入手でき! [...] %ますか?

ヘルプはこちらです:vimdoc.sourceforge.net/htmldoc/various.html#:!cmd。シェルコマンドを頻繁に使用する場合は、次のプラグインも確認してください:stevelosh.com/projects/clam
mrucci 14

24
:help count-items

代替アラのドライランを行うことができることを示唆しています

:%s/./&/gn

(一致した文字の数を報告します)、またはstrlen()視覚的に選択されたテキストを空想する:

:echo strlen(@")

( "は名前のないレジスタです)

ステータスラインで%{myfunc()}そのような式を呼び出すことができるので、良い出発点かもしれません。テキスト全体を選択してからヤンクする必要があるため、すべての時間をカウントするのは少し時間がかかりますが、「-registerでバイト数を表示することは既に可能です。本当に数を知りたい場合はバッファ内の文字の:バッファ内のすべてのテキストを視覚的に選択してヤンクするだけで、ソリューションは次のようになります。

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

これにより、「-register」内の文字数がわかります(現在のバッファを選択してヤンクした場合のバイト数と同じです)。


ソリューションはWindowsでも機能します(bashコマンドでは機能しません)。
-dastrobu

g<CTRL-g>受け入れられた答えのメソッドのように、カウントが1秒後に消えないことが気に入っています。
チェスター

8

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を入れてからこの質問を見つけました:)
マット

@マット:それで、解決策は何ですか?
アキラ

1
通常モードでのmrucciのソリューション「g ^ g」は、私にとっては十分でした。迅速なデバッグのために必要だったので、ステータスラインでその情報を取得しようとする時間がありませんでした。
マット


1
ドキュメントは曖昧でわかりにくいため、実行する必要のある特定のコマンドがset statusline+=\ %o\ %N (興味深いことに、たとえば "t S"アイテムでは機能しない)ことに注意してください。次に、ステータスラインが変更されていない場合、executeを実行する必要がありますset laststatus=2。私にとっては、既存の透明ステータスラインを新しいものに置き換えました。これは黒一色で、「バイトカウント」アイテムのみを持っています。
ハイエンジェル

3

:wを使用してファイルを保存する習慣がある場合、これを行うたびに、ステータスは書き込まれた文字数を返します。たとえば、この文の最後に:wを実行し(はい、gvimを使用してこのメ​​モを作成しています)、報告された:245C written。


このゴルフは一回限りの使用で美しくなります。
Ciro Santilli新疆改造中心法轮功

3

次を使用して、ステータスラインにバッファのバイトカウントを表示する式を追加できます。

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

または、オプション変数を直接変更して、すべてのエスケープを回避できます。

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

これを試してみると、gVimは閉じられていない式のシーケンスについて不平を言っています。括弧が欠落していることに気づきましたが、それを修正しても役に立ちません。書き直したものは次のとおりです。:set statusline =%{line2byte(line( "$"))}
OwenP

@OwenPは:現在では修正されなければならない
アキラ

1
おそらく...%{ line2byte(line(\"$\")+1))-1 }、最後の行の文字がカウントに含まれるようにしたいでしょう。ただし、この方法ではマルチバイト文字は正しくカウントされません。
直観

1
また、スペースをエスケープするか、単にスペースを取り除く必要があると思います。
直観

@intuitedの提案を含めるように編集され、ステータスラインを上書きするのではなく、ステータスラインに追加されます。
joeytwiddle

0

回避策mrucciの答えを受け入れるまで使用していました。

ファイルを保存するために:wを実行すると、コマンドは書き込まれたバイト数を出力することを偶然発見しました。これは多かれ少なかれ文字数なので、これまでのところ十分に近づいています。mrucciの回答も気に入っています。単語数もあるので、おそらくこの回答よりも多いでしょう。


0

テキストのファイルコピーを保持する場合は、テキストをディスクに書き込むだけです。デフォルトでは、文字カウントが表示されます。

あなたがファイルを保存したくない場合は、単にあなたにテキストを保存/dev/null:w!/dev/null

wc文字を数えることもできます::%!wc -c-ただしU、テキストを復元するためにヒットすることを忘れないでください。

これが頻繁に必要な場合は、これらのコマンドをキーシーケンスにマッピングするだけです。- は+ として入力:map #wc :w!/dev/null^[する^[必要があることに注意してください。CtrlV 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.