ฉันจะนับคำในส่วนของไฟล์ได้อย่างไรโดยไม่ต้องปล่อย vim?


10

ฉันมีไฟล์ที่เต็มไปด้วยข้อความ (พูดว่า Markdown หรือ LaTeX) ฉันต้องการนับจำนวนคำในไฟล์นี้

ฉันรู้ว่าฉันสามารถทำได้:! wc -w %เพื่อรัน wc -w บนบัฟเฟอร์ปัจจุบัน และฉันรู้ว่าฉันสามารถดึงส่วนที่น่าสนใจไปลงทะเบียนชื่อ ฉันเดาว่าจะมีวิธีการส่งการลงทะเบียนที่มีชื่อไปยังระบบปฏิบัติการเพื่อใช้ในคำสั่งหรือไพพ์ แต่ฉันไม่สามารถหาได้ หรือมีวิธีที่ดีกว่าในการนับคำในการลงทะเบียน?

กรณีการใช้งานของฉันคือฉันเขียนการเขียนโปรแกรมที่ไม่ใช่จำนวนมาก (บันทึกย่อ, วิทยานิพนธ์, ฯลฯ ) เป็นกลุ่มและฉันต้องการที่จะนับจำนวนคำที่ฉันได้เพิ่มลงในส่วนที่กำหนดของไฟล์ในระหว่างการแก้ไข เซสชั่น

คำตอบ:


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 -w5 บรรทัดแรก!,+5!wc -wสำหรับปัจจุบันและ 5 บรรทัดถัดไป) คุณยังสามารถเลือกข้อความในโหมดภาพและพิมพ์:!wc -wเพื่อกรองการเลือกของคุณ

โปรดทราบว่าสิ่งนี้จะแทนที่การเคลื่อนไหวด้วยผลลัพธ์ของเครื่องมือเชลล์ แต่คุณสามารถuยกเลิกได้

ดู:help :range!, :help rangeและคำตอบนี้ที่ผมยกตัวอย่างเพิ่มเติมของช่วง


ฉันพบสิ่งนี้ในขณะค้นหา แต่พลาดไปว่า g แรกเป็นส่วนหนึ่งของคำสั่งการนับไม่ใช่ตัวระบุตำแหน่ง วิธีแก้ปัญหานี้สมเหตุสมผลแล้ว เห็นได้ชัดว่าฉันควรอ่านบนโหมด Visual; ฉันไม่ได้ใช้บ่อย
โคลิน McFaul

1
ฉันไม่รู้ว่าคุณสามารถใช้g<C-g>วิธีนี้ได้ ! น่ากลัว
EvergreenTree

3

มีสองวิธีนี้สามารถทำได้วิธี vimscript บริสุทธิ์และwcวิธีการ

วิธีที่เป็นกลุ่มบริสุทธิ์

คุณสามารถใช้การค้นหาและแทนที่คำสั่งเพื่อทำสิ่งนี้ ตัวอย่างเช่น:

:%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

สิ่งนี้รันบรรทัด 5 ถึง 15 ผ่านwcคำสั่ง ข้อเสียของสิ่งนี้คือมันแทนที่ช่วงของบรรทัดนั้นด้วยเอาต์พุตของคำสั่ง uคุณสามารถยกเลิกการเปลี่ยนแปลงนี้ได้โดยการกด นอกจากนี้โปรดทราบว่าโซลูชัน vimscript อาจไม่ทำงานกับภาษาที่แตกต่างกันเนื่องจาก\wไม่ตรงกับสิ่งที่ปกติจะเป็นอักขระคำในภาษาอื่น อาจจะดีกว่าที่กว่านี้wc \wนอกจากนี้ต่อไปนี้เป็นคำสั่งแฟนซีเพื่อให้ทำสิ่งนี้ได้เร็วขึ้น:

command -range=% -addr=lines WordCount execute '<count>!wc -w' | .y a | undo | echo @a

โปรดทราบว่าสิ่งนี้จะขัดขวางการaลงทะเบียน

บันทึก

ปรากฏว่าสิ่งนี้สามารถทำได้ในโหมดภาพด้วยการg<C-g>รวมคีย์ ดูคำตอบของ Carpetsmoker สำหรับคำอธิบายนี้


สิ่งเหล่านี้ต้องการ ag พร้อมกับ n เพื่อทำให้เป็นโกลบอล (มิเช่นนั้นจะจับคู่หนึ่งคำต่อบรรทัดเท่านั้น) คนที่สองก็ต้องการ s ในตอนแรก
โคลิน McFaul

1
แก้ไขด้วยความเสียใจ
EvergreenTree

1
การใช้\wเสียงเหมือนความคิดที่ดีในตอนแรก แต่หลังจากทดสอบแล้วฉันพบปัญหาจำนวนหนึ่ง สิ่งที่ใหญ่ที่สุดคือมันจะไม่ตรงกับตัวละครที่ไม่ใช่แอสไอเอียดังนั้นคำเหมือนüberถูกข้ามไป (มีคำถามเกี่ยวกับเรื่องนี้เมื่อวานนี้) นอกจากนี้คำเช่นe-mailนี้นับเป็น 2 คำเนื่องจาก-ไม่ได้อยู่ใน\w(การใช้ a -ค่อนข้างแปลกในภาษาอังกฤษ แต่เป็นภาษาดัตช์ที่พบบ่อยมาก) อาจมีตัวละครอื่น ๆ ที่ถูกเพิกเฉยในแบบนี้ซึ่งนำเราไปสู่จุดสุดท้ายของฉัน: อนุสัญญาว่าด้วยสิ่งที่ถือเป็น "คำ" อาจแตกต่างกัน ...
Martin Tournoij

... ในภาษาต่าง ๆ และเครื่องมือ "เหมาะสม" เช่นwcอาจหยิบขึ้นมาในสถานที่ (ฉันไม่รู้ว่า GNU wcเกี่ยวข้องกับเรื่องนี้จริงหรือไม่เครื่องมือ GNU ไม่เป็นที่รู้จักสำหรับการสนับสนุน Unicode ที่ยอดเยี่ยมของพวกเขา)
Martin Tournoij

นั่นน่าสนใจ. ฉันอาจเพิ่มนั่นเป็นข้อดีในการ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.