จะค้นหาข้อความที่เลือกใน Vim ได้อย่างไร?


61

ฉันรู้ว่าฉันสามารถใช้/ตามด้วย regex เพื่อค้นหาบางสิ่งบางอย่าง และฉันสามารถใช้?ค้นหาย้อนหลังได้ และฉันสามารถใช้nและNทำซ้ำการค้นหาไปข้างหน้าและข้างหลัง

นอกจากนี้ยังมีทางลัดสองทางที่ดี: *หรือ#จะค้นหาคำที่อยู่ใต้เคอร์เซอร์ (ไปข้างหน้า / ข้างหลัง) นั่นมีประโยชน์มาก! (นอกจากนี้ยังมีg*และg#ตัวแปร)

แต่ ... เมื่อฉันเลือกข้อความโดยใช้โหมดภาพ ( v) ฉันจะขอให้ Vim ค้นหาข้อความนั้นได้อย่างไร ดูอย่างรวดเร็ว:helpไม่ได้ ... ฮะ ... ช่วยฉันด้วย


3
ที่เกี่ยวข้องกับการค้นหาสำหรับการเลือกในกลุ่ม
Rodriguez

ขอบคุณสำหรับเคล็ดลับด้วย *และ#! คงจะดีถ้าคำถามของคุณยังจะอธิบายสิ่งที่g*และg#จะทำ;)
winklerrr

คำตอบ:


22

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

  • y(ดึงข้อความที่เลือกไปยังการ"ลงทะเบียนโดยค่าเริ่มต้น)
  • / (เข้าสู่โหมดค้นหา)
  • ( \ V) (ไม่บังคับให้ป้อนโหมด "ไม่มีเวทมนตร์" *)
  • Ctrl+ r "(แทรกข้อความจากการ"ลงทะเบียน)
  • Enter (Engage)

(*) โหมด "ไม่มีเวทมนตร์มาก" ตีความข้อความต่อไปนี้เป็นข้อความธรรมดาแทนที่จะเป็น regex ทราบว่า\และ/ยังคงเป็นพิเศษและจะต้องได้รับการจัดการในรูปแบบอื่น หากข้อความไม่มีตัวอักษรใด ๆ ที่พิจารณาว่าเป็นพิเศษคุณสามารถข้ามขั้นตอนนี้ได้

ที่มา: Vim Tips Wiki


1
ขอขอบคุณ! นี้เป็นที่เข้าใจมากขึ้นกว่า "วิธีการ" ที่vim.wikiaหน้า
winklerrr

64

คุณสามารถดึงข้อความที่ไฮไลต์มาก่อนได้ แล้วก็

  • /

  • Ctrlr

  • "

/ซึ่งจะวางสิ่งที่คุณได้ดึงหลัง


7
แนวคิดที่ดี ... ยกเว้นว่าข้อความที่วางจะถูกตีความเป็น regex ซึ่งไม่ต้องการ :-(
Denilson Sá Maia

4
หากนี่เกือบดีพอสำหรับคุณคุณสามารถทำได้/\V<C-r>"แทน โดย\Vการเติมคำค้นหาของคุณคุณจะบอกกลุ่มให้ใช้ "ไม่มีเวทย์มนตร์" แบ็กสแลชอาจทำให้คุณมีปัญหา ดู:help \V
idbrii

3
มันอาจช่วยอธิบายได้ว่าCtrl+Rเป็นวิธีที่คุณเข้าถึงการลงทะเบียนและ*เป็นเพียงการลงทะเบียนคลิปบอร์ดระบบ ตัวอย่างเช่นคุณยังสามารถ: yawเพื่อดึงคำลงทะเบียน"(การลงทะเบียนเริ่มต้น) จากนั้น/<C-r>"เพื่อค้นหาสตริงนั้น
Ben Davis

5
@ DenilsonSá - คุณสามารถใช้โซลูชันนี้ แต่แทนที่จะใช้/เพื่อทำการค้นหาของคุณให้ใช้ ?แทนเนื่องจากการค้นหาย้อนกลับเป็นเครื่องหมายสแลชตาม Escape จากนั้นคุณสามารถกดปุ่มNเพื่อค้นหาต่อไปในทิศทางไปข้างหน้า
Brad Parks

7

ฉันไม่เคยรู้สึกว่าจำเป็นต้องใช้ฟีเจอร์ดังกล่าว แต่เมื่อพิจารณาว่าคุณสามารถค้นหาฟีเจอร์ใด ๆ บน Vim ได้ฉันคิดว่าควรช่วย:

ค้นหาข้อความที่เลือกด้วยสายตา

ฉันไม่ได้ทดสอบ แต่ดูรหัสดูเหมือนว่าคุณกำลังค้นหาอยู่


4

คุณสามารถหาวิธีการที่จะสร้างพฤติกรรมนี้ที่นี่ที่วิกิพีเดียเป็นกลุ่ม


ดีฉันพบรุ่นเพื่อหลบหลีกเครื่องหมายทับเพื่อเป็นประโยชน์ vnoremap // y/\V<C-r>=escape(@",'/\')<CR><CR>
งานฝีมือ

1

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

เพิ่มรหัสต่อไปในตัวคุณและค้นหาเนื้อหาที่คุณเลือกโดยสายตา.vimrc นอกจากนี้คุณยังสามารถทดแทนทั่วโลกเนื้อหาที่เลือกโดย// /sหรือท้องถิ่นทดแทนบริบทที่เลือกโดยการแรกแล้วสายตาเลือกพื้นที่และ//:'<,'>s//{new_text}

set incsearch
set hlsearch
set ignorecase
function GetVisualSelection()
  let raw_search = @"
  let @/=substitute(escape(raw_search, '\/.*$^~[]'), "\n", '\\n', "g")
endfunction
xnoremap // ""y:call GetVisualSelection()<bar>:set hls<cr>
if has('nvim')
  set inccommand=nosplit
  xnoremap /s ""y:call GetVisualSelection()<cr><bar>:%s/
else
  xnoremap /s ""y:call GetVisualSelection()<cr><bar>:%s//
endif

การกำหนดค่าข้างต้นเป็นเพียงการค้นหา สำหรับการกำหนดค่า vim ทั้งหมดของฉันโปรดไปที่. vimrc


0

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


นั่นไม่ใช่พฤติกรรมเริ่มต้น ที่นี่เมื่อฉันกด / (ในขณะที่อยู่ในโหมดภาพ) มันเพิ่งแสดงพรอมต์ regex ที่ว่างรอให้ฉันพิมพ์บางอย่าง
Denilson Sá Maia

แปลกเพราะฉันไม่เคยทำอะไรเพื่อเปิดใช้งาน
นาธาน Fellman

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