ฉันจะได้รับ (g) เป็นกลุ่มเพื่อแสดงจำนวนตัวอักษรของไฟล์ปัจจุบันได้อย่างไร


85

ฉันชอบที่จะเขียนบทเรียนและบทความสำหรับฟอรั่มการเขียนโปรแกรมฉันบ่อย ฟอรัมนี้มีการ จำกัด จำนวนอักขระต่อการโพสต์ ฉันเคยใช้ Notepad ++ ในอดีตเพื่อเขียนโพสต์และยังคงนับตัวละครสดในแถบสถานะ ฉันเริ่มใช้ gVim มากขึ้นและฉันไม่ต้องการกลับไปที่ Notepad ++ ณ จุดนี้ แต่มันมีประโยชน์มากที่จะมีจำนวนตัวอักษรนี้ ถ้าฉันนับมากกว่านี้ฉันมักจะวางโพสต์ลงใน Notepad ++ ดังนั้นฉันจะเห็นได้ว่าเมื่อใดที่ฉันตัดเล็มพอที่จะรับได้

ฉันเคยเห็นคำแนะนำที่:set rulerจะช่วยได้ แต่สิ่งนี้จะให้จำนวนตัวอักษรผ่านดัชนีคอลัมน์ปัจจุบันของบรรทัดปัจจุบันเท่านั้น นี่คงจะดีถ้าฉันไม่ได้ใช้ตัวแบ่งย่อหน้า แต่ฉันแน่ใจว่าคุณเห็นด้วยว่าการอ่านตัวอักษรหลายพันตัวในย่อหน้าเดียวไม่สะดวก

ฉันอ่านความช่วยเหลือและคิดว่าrulerformatจะใช้งานได้ แต่หลังจากดูstatuslineรูปแบบแล้วมันใช้ฉันไม่เห็นอะไรเลยที่ให้การนับตัวอักษรสำหรับบัฟเฟอร์ปัจจุบัน

ฉันเห็นว่ามีปลั๊กอินที่เพิ่มสิ่งนี้ แต่ฉันยังคงจุ่มนิ้วเท้าของฉันลงใน gVim และฉันไม่แน่ใจว่าฉันต้องการโหลดปลั๊กอินแบบสุ่มก่อนที่ฉันจะเข้าใจสิ่งที่พวกเขาทำ ฉันต้องการที่จะใช้บางสิ่งบางอย่างในตัวเพื่อเป็นกลุ่ม แต่ถ้ามันไม่มีอยู่มันก็ไม่มีอยู่จริง

ฉันควรทำอย่างไรเพื่อให้บรรลุเป้าหมาย หากเกี่ยวข้องกับปลั๊กอินคุณใช้มันและมันทำงานได้ดีแค่ไหน?

คำตอบ:


140

กดg CTRL-Gในโหมดปกติเพื่อแสดงสถิติบางอย่างเกี่ยวกับเคอร์เซอร์และไฟล์

หากคุณอยู่ใน linux คุณสามารถใช้wc -mเพื่อรับจำนวนตัวอักษรในไฟล์ปัจจุบัน

:!wc -m %

เนื่องจากไม่ได้รับการอัปเดตตามเวลาจริงคุณอาจต้องการจับคู่คำสั่งนี้กับสิ่งที่ต้องการ:

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

19
g CTRL-Gฉันไม่รู้ว่ามันมีอยู่จริง ดี!
เจสันลง

ดีฉันลืมที่จะใช้! คำสั่งปังใน Vim
Eddie B

3
g <cg> ทำงานข้ามแพลตฟอร์มซึ่งเป็นสิ่งที่ดี
AndrewPK

ฉันจะหาข้อมูลเพิ่มเติมเกี่ยวกับการใช้งานได้! [...] %ที่ไหน?
กระทะ

ความช่วยเหลืออยู่ที่นี่: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd ถ้าคุณทำให้การใช้งานหนักของคำสั่งเชลล์ตรวจสอบยังปลั๊กอินนี้: stevelosh.com/projects/clam
mrucci

24
:help count-items

แนะนำว่าคุณสามารถทำ Ala ทดแทนได้

:%s/./&/gn

(ซึ่งจะรายงานจำนวนตัวอักษรที่ตรงกันกลับคืนมา) หรือคุณstrlen()นึกถึงข้อความที่เลือกทางสายตา:

:echo strlen(@")

("คือการลงทะเบียนที่ไม่มีชื่อ)

เนื่องจากคุณสามารถโทรหานิพจน์ในสถานะของคุณเช่น%{myfunc()}นั้นอาจเป็นจุดเริ่มต้นที่ดี การนับตลอดเวลาอาจใช้เวลานานเพราะคุณจะต้องเลือกข้อความทั้งหมดแล้วดึงมันออกมา แต่อาจแสดงจำนวนไบต์ใน "- ลงทะเบียนก็โอเคสำหรับคุณแล้วถ้าคุณต้องการทราบจำนวนจริง ๆ ของตัวอักษรในบัฟเฟอร์: เพียงแค่เลือกข้อความทั้งหมดที่มองเห็นในบัฟเฟอร์และดึงมันดังนั้นวิธีแก้ปัญหาจะเป็น:

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

ซึ่งให้จำนวนตัวอักษรใน "-register (ซึ่งเท่ากับจำนวนไบต์ถ้าคุณเลือกและดึงบัฟเฟอร์ปัจจุบัน)


โซลูชันยังทำงานบน Windows (ซึ่งคำสั่ง bash จะไม่ทำงาน)
dastrobu

ฉันชอบที่การนับไม่หายไปหลังจากวินาทีเช่นg<CTRL-g>วิธีการในคำตอบที่ยอมรับ
เชสเตอร์

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และหมายเลขไบต์ที่แสดงใน statusline ของคุณคือจำนวนตัวอักษร (ไม่เป็นความจริงกับตัวอักษรแบบหลายไบต์แน่นอน) ctrloกลับไปที่คุณมาจากมี


1
ปัญหานี้มีปัญหากับตัวอักษรแบบหลายไบต์ ผมพบว่าคำถามนี้หลังจากวาง% o ใน statusline ของฉัน :)
แมตต์

@ Matt: ดังนั้นอะไรคือทางออก?
akira

1
ทางออกของ mrucci "g ^ g" ในโหมดปกติดีพอสำหรับฉัน ฉันต้องการมันเพื่อการดีบักอย่างรวดเร็วดังนั้นฉันจึงไม่ได้ใช้เวลาในการลองและรับข้อมูลนั้นในสถานะ
Matt


1
เนื่องจากเอกสารที่คลุมเครือและสับสนมันเป็นที่น่าสังเกตว่าเฉพาะคำสั่งหนึ่งต้องดำเนินการคือset statusline+=\ %o\ %N (น่าสนใจมันไม่ทำงานสำหรับเช่น t "S" รายการ) แล้วถ้าคุณเห็น statusline เดิมก็เพราะคุณ gotta set laststatus=2ดำเนินการ สำหรับฉันมันถูกแทนที่ด้วยสถานะความโปร่งใสที่มีอยู่ด้วยอันใหม่เป็นสีดำทึบและมีเพียงรายการ "จำนวนไบต์"
สวัสดีแองเจิล

3

หากคุณไม่เคยใช้: w เพื่อบันทึกไฟล์ทุกครั้งที่คุณทำเช่นนี้สถานะจะรายงานจำนวนตัวอักษรที่เขียนกลับมา ตัวอย่างเช่นในตอนท้ายของประโยคนี้ฉันทำ: w (ใช่ฉันใช้ gvim เพื่อเขียนบันทึกนี้) และรายงาน: 245C เขียน


กอล์ฟนี้สวยงามสำหรับการใช้งานครั้งเดียว
Ciro Santilli 新疆改造中心法轮功六四事件

3

คุณสามารถผนวกนิพจน์เพื่อแสดง bytecount ของบัฟเฟอร์ในบรรทัดสถานะด้วย:

: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 ยังผนวกเข้ากับบรรทัดสถานะแทนที่จะเขียนทับมัน
joeytwiddle

0

วิธีแก้ปัญหาที่ฉันใช้จนกระทั่งฉันยอมรับคำตอบของ mrucci:

ฉันค้นพบโดยบังเอิญว่าเมื่อฉัน: w เพื่อบันทึกไฟล์คำสั่งจะแสดงจำนวนไบต์ที่เขียน นี่เป็นจำนวนอักขระที่มากหรือน้อยดังนั้นมันจึงเข้าใกล้พอ ฉันชอบคำตอบของ mrucci เช่นกันอาจจะมากกว่านี้เพราะมันมีจำนวนคำด้วย


0

หากคุณเก็บสำเนาไฟล์ข้อความของคุณเพียงแค่เขียนข้อความไปยังดิสก์ - จำนวนตัวอักษรจะปรากฏขึ้นตามค่าเริ่มต้น

หากคุณไม่ต้องการที่จะเก็บไฟล์เพียงบันทึกข้อความของคุณ:/dev/null:w!/dev/null

นอกจากนี้คุณยังสามารถwcนับจำนวนตัวอักษรของคุณ: :%!wc -c- แต่อย่าลืมกดUเพื่อคืนค่าข้อความของคุณ

หากคุณต้องการนี้มักจะเพียง map คำสั่งเหล่านี้ไปเป็นลำดับที่สำคัญ: :map #wc :w!/dev/null^[- ทราบว่า^[จะต้องป้อนเป็น+CtrlV Esc

ในฐานะที่เป็นตัวบ่งชี้แรกของขนาดตัวอักษรเพียงเปิดหมายเลขบรรทัด ยอมรับ: สิ่งนี้ต้องมี arithmetics จิต ;-)


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 ด้วย; หรือเนื่องจากฉันไม่ค่อยใช้มันเป็นตัวอักษรตัวแรกของคำสั่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.