題 如何讓(g)Vim顯示當前文件的字符數?


我喜歡為我經常編程的論壇編寫教程和文章。此論壇每個帖子都有字符數限制。我過去使用過Notepad ++來編寫帖子,它會在狀態欄中保留實時字符數。我開始更多地使用gVim了,我現在真的不想回到Notepad ++,但是這個字符非常有用。如果我超過計數,我通常最後將帖子粘貼到Notepad ++中,這樣我就可以看到當我修剪到足以達到極限時。

我見過那些建議 :set ruler 會有所幫助,但這只通過當前行的當前列索引給出字符數。如果我不使用分段符號,這將是很好的,但我相信你會同意在一個段落中閱讀幾千個字符並不舒服。

我閱讀了幫助並認為 rulerformat 會工作,但看完後 statusline 它使用的格式我沒有看到任何給出當前緩衝區字符數的東西。

我已經看到有插件可以添加這個,但是我仍然把我的腳趾浸入gVim中,我不確定我是否想在我了解它們之前加載隨機插件。我更喜歡使用vim內置的東西,但如果它不存在則不存在。

我該怎麼做才能實現目標?如果它涉及插件,你是否使用它以及它的工作情況如何?


76
2018-06-07 16:26


起源




答案:


g CTRL-G 在正常模式下顯示光標和文件的一些統計信息。

如果你在linux中,你可以使用 wc -m 獲取當前文件中的字符數

:!wc -m %

由於它沒有實時更新,您可能希望將此命令映射到以下內容:

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

130
2018-06-07 21:23



g CTRL-G 我不知道這存在。太好了! - Jason Down
很好,我一直忘記在Vim中使用!bang命令 - Eddie B
g <c-g>跨平台工作,這很好。 - AndrewPK
我在哪裡可以找到有關使用的更多信息 ! [...] %? - Wok
幫助在這裡: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd 。如果你大量使用shell命令,請檢查這個插件: stevelosh.com/projects/clam 。 - mrucci


:help count-items

建議,你可以做一個乾的替換ala

:%s/./&/gn

(然後報告匹配的字符數)或你喜歡的 strlen() 在視覺選擇的文本上:

:echo strlen(@")

(“是未命名的登記冊)

因為您可以在狀態行中調用表達式,例如 %{myfunc()} 這可能是一個很好的起點。計算所有時間可能會耗費一些時間,因為您必須選擇整個文本然後將其拉出來,但可能顯示“-register中的字節數已經可以了。如果您真的想知道這個數字緩衝區中的字符:只是在視覺上選擇緩衝區中的所有文本並將其拉出來。因此,解決方案是:

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

它為您提供了“-register中的字符數(如果您選擇並抽取當前緩衝區,則與字節數相同)。


23
2018-06-07 16:58



解決方案也適用於Windows(不會使用bash命令)。 - dastrobu
我喜歡計數在一秒鐘之後不會消失 g<CTRL-g> 接受的答案中的方法。 - Chester


: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 並且狀態行中顯示的字節數是字符數(當然,多字節字符不正確)。回到你來自哪裡 CTRLØ


6
2018-06-08 05:03



這對多字節字符有問題。將%o放入我的狀態行後,我發現了這個問題:) - Matt
@Matt:那麼,解決方案是什麼? - akira
mrucci在正常模式下的解決方案“g ^ g”對我來說已經足夠了。我需要它來進行快速調試,所以我沒有花時間嘗試在狀態行中獲取該信息。 - Matt
vimdoc.sourceforge.net/htmldoc/options.html#'statusline“ - Tyler Szabo
由於文檔含糊不清且令人困惑,因此值得注意的是,需要執行的特定命令是 set statusline+=\ %o\ %N  (有趣的是,它不適用於例如“t S”項目)。然後,如果您看到狀態行未更改,那是因為您必須執行 set laststatus=2。對我來說,它用新的替換了現有的透明狀態線,是純黑色,只有“字節數”項。 - Hi-Angel


對mrucci答案的增強:

您可以使用 wc 在Linux上,無需先通過指向保存文件 :w命令輸出如下:

:w !wc -m

你可以把它映射到mrucci提到的東西。


6
2017-07-15 08:48





如果您習慣使用:w來保存文件,則每次執行此操作時,狀態都會報告寫入的字符數。例如,在這句話的結尾我做了一個:w(是的,我使用gvim寫這個筆記)並報告:245C寫的。


3
2018-05-31 11:03



這款高爾夫球場一次性使用非常精美。 - Ciro Santilli 新疆改造中心 六四事件 法轮功


您可以附加表達式以在狀態行中顯示緩衝區的bytecount:

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

或者您可以直接更改選項變量以避免所有轉義:

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

3
2018-06-07 17:00



當我嘗試這個時,gVim抱怨一個未閉合的表達序列。我注意到你錯過了一個括號,但修復它也無濟於事。以下是我重寫的內容:set statusline =%{line2byte(line(“$”))} - OwenP
@OwenP:現在應該修好了 - akira
可能你想要的 ...%{ line2byte(line(\"$\")+1))-1 } 這樣它就包含了計數中最後一行的字符。但是,此方法不會正確計算多字節字符數。 - intuited
另外我認為你需要逃離空間,或者只是擺脫它們。 - intuited
編輯包括@ intuited的建議,也附加到狀態行而不是覆蓋它。 - joeytwiddle


解決方法我一直在使用,直到我接受了mrucci的回答:

我意外地發現當我:w保存文件時,該命令輸出寫入的字節數。這或多或少是一個字符數,所以到目前為止已經足夠接近了。我也喜歡mrucci的答案,可能比這個還要多,因為它也有字數。


0
2017-10-22 15:47





如果保留文本的文件副本,只需將文本寫入磁盤 - 默認情況下會顯示字符數。

如果您不想保留文件,只需將文本保存到 /dev/null:w!/dev/null

你也可以 wc 統計你的角色: :%!wc -c  - 但別忘了打 ü 恢復你的文字。

如果您經常需要這個,只需將這些命令映射到一個鍵序列: :map #wc :w!/dev/null^[  - 注意 ^[ 必須輸入為 按Ctrl+V  退出

作為文本大小的第一個指標,只需打開行號;承認:這需要一些心理算術;-)


0
2018-06-08 06:59