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 2015年

1
あなたがg<C-g>そのように使えるとは思いもしませんでした。驚くばかり!
EvergreenTree 2015年

3

これを実現するには、純粋なvimscriptの方法と方法の2つの方法がありますwc

純粋なvimの方法

これを行うには、検索と置換コマンドを使用できます。例えば:

:%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が必要です(そうでない場合、1行につき1ワードのみに一致します)。2番目のものも最初にsが必要です。
Colin McFaul 2015年

1
修正、申し訳ありません。
EvergreenTree

1
使用して\w最初の素敵なアイデアのように聞こえるが、それをテストした後、私は多くの問題を発見しました。最大のものは、それが非ASCII文字と一致しないことです。そのため、のような単語überは単にスキップされます(これについては昨日質問がありました)。また、のようなe-mail単語は、-にないので2単語として数えられます\w(aを使用する-ことは英語ではやや一般的ではありませんが、たとえばオランダ語では非常に一般的です)。この方法で無視される他の文字がある可能性があります。それが最後のポイントになります。「単語」と見なされるものに関する規則は異なる場合があります...
Martin Tournoij

...さまざまな言語で、「適切な」ツールなどwcがロケールで選択される可能性があります(GNUがwc実際にこれを処理するかどうかはわかりませんが、GNUツールは優れたUnicodeサポートでよく知られていません)。
Martin Tournoij、2015年

それは興味深い。私はそれをwcソリューションにプラスとして追加するかもしれません。
EvergreenTree

1

言葉の場合:

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

. 現在の行を示します。

また、.vimrcファイルに次のコードを追加しました。

:cabbrev zzcc   s/./&/gn

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

私は文字が打てます:

:.,+6 zzcw

zzcwに拡大しますs/\i\+/&/g

これzzcwは、(私にとって)何にも一致しない奇妙な名前です。

副作用は、ファイル全体が選択されて強調表示されることです。

ファイルに複数行のつぶやきを入力し、文字が多すぎないことを確認して、つぶやきをTwitterに貼り付けられるようにしたいと思っていました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.