นับความยาวสตริงที่ถูกเน้นใน VIM


24

ฉันสงสัยว่ามีวิธีนับสัญลักษณ์ที่เน้นอยู่ในvim(รวมถึงช่องว่างสีขาว) หรือไม่?

UPDATE

โหมดภาพ VIM

มันแสดงให้เห็นจำนวนแถวหากการเลือกของฉันอยู่ในหลายแถว ฉันต้องการสัญลักษณ์นับ

คำตอบ:


28

Vim ไม่ได้ทำสิ่งนั้นเว้นแต่ว่าฉันทำอะไรหายไป หากฉันเน้นข้อความโดยใช้เมาส์หรือพิมพ์vและเลื่อนเคอร์เซอร์ฉันจะเห็นที่ด้านล่างของหน้าจอ

- ภาพ - 12

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

นอกจากนี้คุณยังสามารถเลือกภูมิภาคของข้อความและประเภทg Ctrl-Gที่จะแสดงจำนวนบรรทัดคำและไบต์ที่เลือก


4
(ตะลึง) ไม่ผมใช้วิธีที่เป็นกลุ่มห่ามานานและไม่เคยทราบว่า ? แต่ในการป้องกันของฉันฉันกำลังคิดเกี่ยวกับการได้รับหมายเลขโดยทางโปรแกรม
njd

คำตอบที่ดี แต่ลองดูคำถามที่อัปเดต เช่นเดียวกับ @njd ฉันไม่ได้สังเกตว่า
Nemoden

1
@Nemoden: ลองส่วนที่สองของคำแนะนำของ garyjohn (g Ctrl-G) ควรแสดงบรรทัดเช่น "เลือก # จาก # Lines; # ของ # Words; # of # Bytes"
peth

โอ้ ความผิดฉันเอง. ฉันไม่รู้ว่าเพราะเหตุใดฉันจึงข้ามโซลูชันที่สอง มันได้ผล. ขอขอบคุณ!
Nemoden

12
นี่ไม่ได้เปิดใช้งานโดยค่าเริ่มต้นในบางระบบ เพียงเพิ่มset showcmdของคุณvimrcเพื่อเปิดใช้งาน
Tyler Holien

8

เสียงเรียกเข้าพลิกระหว่างการแสดงจำนวนตัวอักษรและการนับบรรทัดสำหรับข้อความที่มองเห็นได้ขึ้นอยู่กับสิ่งที่และวิธีการที่คุณเห็นภาพ (vim 7.4 patched ถึงกันยายน 2015)

V will display line count
v$ will display character count

หากคุณเห็นภาพมากกว่าหนึ่งบรรทัดระบบจะแสดงการนับบรรทัดเท่านั้น

g-CTRL-G displays 'byte count' which seems to be 'char count' +1 per line

ตามที่คำถามบอกไว้ว่าแม้แต่การvสลับปกติจากการนับตัวอักษรไปจนถึงการนับบรรทัดหากการเลือกครอบคลุมหลายบรรทัด อย่างไรก็ตามg CTRL-Gทำงานได้ดี
joeytwiddle

2
:function VisualLength()
:  exe 'normal "xy'
:  echo "Visual: " . strlen(@x) . "\n"
:  exe 'normal gv'
:endfunction

:map ,q "xy:call VisualLength()<CR>
  1. ก่อนอื่นคุณดึงส่วนที่เลือกปัจจุบัน (เป็นบัฟเฟอร์ x)

  2. จากนั้นคุณแสดงความยาวของบัฟเฟอร์นั้น: strlen(@x)
    (The - VISUAL -แสดงในบรรทัดสถานะปิดบังสิ่งนี้ดังนั้นเราจึงต้องเพิ่มบรรทัดใหม่)

  3. ไฮไลต์ช่วงภาพก่อนหน้า: gv

สิ่งนี้ไม่ได้คำนึงว่าโหมดภาพนั้นเป็นแบบ line-, character- หรือ block-mode แต่มันก็เพียงพอแล้วสำหรับกรณีส่วนใหญ่


2

ฉันเห็นจากภาพหน้าจอของคุณว่าคุณกำลังใช้งาน Windows ดังนั้นคำตอบนี้อาจไม่ช่วยคุณเท่าไหร่ แต่สำหรับคนอื่น ๆ ...

ฟีเจอร์ under-used (IMO) ของ Vim คือการให้คำสั่งภายนอกทำการยกของหนัก

สำหรับกรณีนี้หากคุณอยู่ในระบบคล้าย UNIX คุณสามารถใช้wcคำสั่งเพื่อทำเช่นนั้นได้

วิธีที่ง่ายที่สุดคือการแทนที่ข้อความที่เลือกด้วยผลลัพธ์ของคำสั่งโดยพิมพ์ (ด้วยข้อความที่เลือก):

:!wc

(จากนั้นกด Enter)

สิ่งนี้จะแสดงในบรรทัดคำสั่งของคุณดังนี้:

'<,'>!wc

หลังจากที่คุณอ่านข้อมูลคุณสามารถเลิกทำuเพื่อกลับไปยังที่ที่คุณเริ่ม

หมายเหตุ: การประมวลผลนี้ดำเนินการกับทั้งบรรทัดเท่านั้น หากคุณต้องการเส้นบางส่วนฉันคิดว่า @ garyjohn g_CTRL-Gเป็นทางออกที่ดีที่สุดของคุณ

คุณสามารถหลีกเลี่ยงความจำเป็นในการเลิกทำโดยเรียกใช้แทน:

:w !wc

"เขียน" บรรทัดที่เลือกนี้ไปยังอินพุตมาตรฐานของคำสั่งและผลลัพธ์ของคำสั่งจะแสดงในบัฟเฟอร์ชั่วคราวใหม่โดยไม่ต้องแตะต้องเดิม ดู:help :write_cข้อมูลเพิ่มเติม

หมายเหตุ: ฉันได้รับ:write_cข้อมูลจาก: /programming/1237780/vim-execute-shell-command-without-filtering

ตอนนี้โดยทั่วไป:

ตัวอย่างนี้มีความwcเรียบง่าย แต่คุณสามารถจินตนาการว่านี่เป็นวิธีการที่ทรงพลังได้อย่างไร UNIX มีคำสั่งประมวลผลข้อความจำนวนมากที่มีอยู่แล้วและคุณสามารถใช้คำสั่งเหล่านั้นใน Vim ได้อย่างง่ายดายโดยไม่จำเป็นต้องสัมผัส Vimscript (yech)

นอกจากนี้โปรแกรม commandline ใด ๆ ที่คุณเขียนว่าดีลกับ stdin / stdout จะไม่เพียง แต่ให้ประโยชน์แก่คุณในเทอร์มินัลของคุณ แต่ยังอยู่ใน Vim ด้วย

ตัวอย่างเช่นฉันพบว่าตัวเองทำงานtidyและjson-formatจากภายในเป็นกลุ่มเพื่อทำให้ไฟล์ที่ฉันดูอ่านง่ายขึ้น

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


1

สำหรับวิธีการเขียนโปรแกรมภายใน vimscript สิ่งนี้ใช้ได้สำหรับฉันเมื่อการเลือกถูก จำกัด ภายในหนึ่งบรรทัด:

let amount = virtcol("'>") - virtcol("'<")

(การใช้virtcol(..)แทนcol(..)จะทำงานได้ตามที่คาดไว้เมื่อ:set ve=allมีการใช้งาน)

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