ฉันจะระบุ“ คำที่อยู่ใต้เคอร์เซอร์” บนบรรทัดคำสั่งของ VIM ได้อย่างไร


86

ฉันต้องการเขียนคำสั่งที่ระบุ "คำที่อยู่ใต้เคอร์เซอร์" ใน VIM ตัวอย่างเช่นสมมติว่าฉันมีเคอร์เซอร์อยู่บนคำและทำให้ปรากฏสองครั้ง ตัวอย่างเช่นหากคำนั้นเป็น "abc" และฉันต้องการ "abcabc" ฉันสามารถพิมพ์:

:s/\(abc\)/\1\1/

แต่ฉันต้องการที่จะสามารถย้ายเคอร์เซอร์ไปที่ "def" และใช้คำสั่งเดียวกันเพื่อเปลี่ยนเป็น "defdef":

:s/\(def\)/\1\1/

ฉันจะเขียนคำสั่งในบรรทัดคำสั่งเพื่อให้ทำสิ่งนี้ได้อย่างไร

:s/\(*whatever is under the commandline*\)/\1\1

คำตอบ:


74

<cword>คือคำที่อยู่ใต้เคอร์เซอร์ (: help <cword>)

ขออภัยฉันควรจะตอบให้ครบถ้วนกว่านี้

คุณสามารถ nmap คำสั่งได้หรือชุดของการกดแป้นพิมพ์สำหรับคนขี้เกียจจะทำงาน:

b #go to beginning of current word
yw #yank to register

จากนั้นเมื่อคุณพิมพ์รูปแบบของคุณคุณสามารถกด<control-r>0<enter>ซึ่งจะวางเนื้อหาของทะเบียน 0-th ในคำสั่งของคุณ

คุณยังสามารถสร้างคำสั่งสำหรับสิ่งนี้:

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

ซึ่งจะจับคู่การกดปุ่ม '\' และ 'w' ในเวลาเดียวกันเพื่อแทนที่บรรทัดคำสั่งของคุณด้วย

:s/\(<currentword>\)/

17
ฉันขอขอบคุณคำตอบที่ดี แต่ผมอาจจะแนะนำyiwมากกว่าbywเพียงเพราะของหน่วยความจำของกล้ามเนื้อ ในสถานการณ์ที่เคอร์เซอร์ของคุณอยู่แล้วที่จะเกิดขึ้นบนตัวอักษรตัวแรกในคำว่าคุณจะต้องละเว้นbและเพียงแค่พิมพ์ywVS คุณอาจละเว้นในi yiwอุบัติเหตุสามารถเกิดขึ้นได้และการแก้ไขความผิดพลาดนั้นเป็นการกดแป้นที่มากกว่า :)
Jacob Swartwood

132

ขณะอยู่ในโหมดบรรทัดคำสั่งCTRL+ R CTRL+ Wจะแทรกคำไว้ใต้เคอร์เซอร์

ดูความช่วยเหลือสำหรับc_CTRL-Rรายชื่อของการลงทะเบียนพิเศษอื่น ๆ ทั้งหมด:

:help c_CTRL-R

29
yiwP

yiw: ดึงคำด้านใน (คำที่อยู่ใต้เคอร์เซอร์) คำสั่งนี้ยังเลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของคำ

P: วางก่อนเคอร์เซอร์

จากนั้นคุณสามารถแมปเช่น: < ALT > - Dกับคำสั่งนี้:

:nmap < ALT >-D yiwP

4
คำถามนี้เจาะจงเกี่ยวกับการระบุ "คำที่อยู่ใต้เคอร์เซอร์" จากบรรทัดคำสั่งของ Vim ไม่ใช่จากโหมดคำสั่ง
Nathan Fellman

12

อีกวิธีง่ายๆในการทำเช่นนี้คือการใช้*คำสั่ง

ในโหมดปกติเมื่ออยู่เหนือคำให้พิมพ์

*:s//\0\0<Enter>

* ทำให้รูปแบบการค้นหาเป็นคำปัจจุบัน (เช่น \ <abc \>)

:s//ทำการแทนที่โดยใช้รูปแบบการค้นหาปัจจุบันและ\0ในส่วนการแทนที่คือสตริงที่ตรงกัน

จากนั้นคุณสามารถทำพฤติกรรมนี้ซ้ำโดยพูดทับคำว่า "def" โดยพิมพ์ซ้ำอีกครั้งหรือพิมพ์

*@:

@: เพียงแค่ทำซ้ำคำสั่ง ex สุดท้ายโดยไม่จำเป็นต้องมี <Enter> ในกรณีนี้การแทนที่

คุณยังสามารถบันทึกแมโครด่วนเพื่อทำสิ่งนี้โดยใช้qคำสั่ง

qd*:s//\0\0<Enter>q

จากนั้นทำซ้ำเนื้อหาในใจของคุณโดยพิมพ์

@d

เมื่อเกินคำที่คุณต้องการเพิ่มเป็นสองเท่า เนื่องจากนี่เป็นเพียงอักขระเดียวที่น้อยกว่าโซลูชันก่อนหน้านี้จึงอาจไม่คุ้มค่าสำหรับคุณเว้นแต่คุณจะใช้คำสั่งอื่น ๆ ระหว่างการเพิ่มคำซึ่งจะเปลี่ยนพฤติกรรมของ@:


1

คุณต้องหลีกเลี่ยงแบ็กสแลชภายในการแมป คุณยังสามารถรวมสตริงการแทนที่ไว้ในการแมป

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

1
ywPx

จะทำในสิ่งที่คุณอธิบาย

ywPxw

จะเลื่อนเคอร์เซอร์ไปที่คำถัดไป


คำถามนี้เจาะจงเกี่ยวกับการระบุ "คำที่อยู่ใต้เคอร์เซอร์" จากบรรทัดคำสั่งของ Vim ไม่ใช่จากโหมดคำสั่ง
Nathan Fellman

โปรดอธิบายคำตอบเช่นนั้นทุกตัวอักษรในคำสั่ง
Vitaly Zdanevich

0

@ user11211 มีวิธีที่ง่ายที่สุดในการทำซ้ำคำภายใต้เคอร์เซอร์:

yiwP

ดึงคำภายใน (เลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของคำ) วาง (ก่อนเคอร์เซอร์)

เช่น. ตรง [t] ไปข้างหน้า ----> straightforwar [d] ตรงไปตรงมา

[] คือเคอร์เซอร์

ทำอย่างละเอียด...

คุณอาจต้องการให้เคอร์เซอร์ตามหลังคำที่ซ้ำกันของคุณ:

yiwPea

ตรงไปข้างหน้า ----> ตรงไปตรงมาตรงไปตรงมา []

บันทึก:

yiw

คือดึงคำภายใน (ไม่มีช่องว่าง)

yaw

ดึงทุกคำ (รวมถึงช่องว่างต่อท้าย)

yawPea

จึงเป็นคำที่ซ้ำกันรวมถึงช่องว่างและตำแหน่งเคอร์เซอร์

ตรง [t] ไปข้างหน้า ----> ตรงไปตรงมาตรงไปตรงมา []


คำถามนี้เจาะจงเกี่ยวกับการระบุ "คำที่อยู่ใต้เคอร์เซอร์" จากบรรทัดคำสั่งของ Vim ไม่ใช่จากโหมดคำสั่ง
Nathan Fellman

1
คุณสามารถใช้คำสั่งปกติ (โหมดคำสั่ง) ใด ๆ ด้านบนภายในโหมดคำสั่งโดยนำหน้าด้วย: ปกติ ... ตัวอย่างเช่น: yiwP ปกติจะทำเช่นเดียวกับ yiwP ในโหมดปกติ แน่นอนว่านี่เป็นวิธีที่ช้ากว่าในการทำสิ่งที่คุณขอ
BBW ก่อน Windows

-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>

คุณช่วยแสดงความคิดเห็นเกี่ยวกับสิ่งนี้ได้ไหม
Nathan Fellman

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