วิธีค้นหาการตอบสนองแบบ case-ins ใน Vim


1650

ฉันต้องการค้นหาคำตัวพิมพ์ใหญ่เช่น COPYRIGHT ในไฟล์ ฉันพยายามทำการค้นหาเช่น:

/copyright/i    # Doesn't work

แต่มันไม่ทำงาน ฉันรู้ว่าใน Perl หากฉันให้iค่าสถานะเป็น regex มันจะเปลี่ยน regex ให้เป็น regex แบบไม่ต้องสนใจตัวพิมพ์เล็ก - ใหญ่ ดูเหมือนว่า Vim มีวิธีการของตนเองในการระบุ regex ที่ไม่คำนึงถึงขนาดตัวพิมพ์

คำตอบ:


2106

คุณสามารถใช้\cลำดับหนีได้ทุกที่ในรูปแบบ ตัวอย่างเช่น:

/\ccopyrightหรือ/copyright\cแม้กระทั่ง/copyri\cght

ที่จะทำสิ่งที่ตรงกันข้าม (กรณีที่มีความละเอียดอ่อนที่ตรงกัน) ใช้\C(เมืองหลวง C) แทน


516
นอกจากนี้ยัง\cสามารถปรากฏที่ใดก็ได้ในรูปแบบดังนั้นหากคุณพิมพ์รูปแบบแล้วตัดสินใจว่าคุณต้องการการค้นหาแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เพียงเพิ่ม\cที่ส่วนท้าย
Alok Singhal

269
ฉันชอบที่จะเพิ่มset ignorecaseสำหรับการค้นหาที่ไม่สนใจขนาดตัวพิมพ์ใน vimrc ของฉันและฉันสามารถใช้\Cเพื่อทำการค้นหาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ที่คล้ายกับ @AlokSinghal ที่กล่าวถึง
Nick McCurdy

164
นอกจากนี้ยังมีset smartcaseซึ่งจะเปลี่ยนเป็นการค้นหาแบบตรงตามตัวพิมพ์ใหญ่ - เล็กโดยอัตโนมัติหากคุณใช้ตัวพิมพ์ใหญ่
Zaz

83
เพียงแค่ต้องการเพิ่มความคิดเห็นของ Zaz set smartcaseใช้เฉพาะเมื่อset ignorecaseมีการใช้งานแล้ว ฉันนิ่งงันอยู่ครู่หนึ่ง ดูเคล็ดลับที่เป็นกลุ่ม
Tan Wang

12
@coderMe มันเป็นตัวพิมพ์ใหญ่\cกับ\C
Aaron McDaid

680

เช่นเดียวกับข้อเสนอแนะสำหรับ\cและignorecaseฉันพบว่าsmartcaseมีประโยชน์มาก หากคุณค้นหาสิ่งที่มีอักขระตัวพิมพ์ใหญ่มันจะทำการค้นหาแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก หากคุณค้นหาสิ่งที่เป็นตัวพิมพ์เล็กอย่างหมดจดมันจะทำการค้นหาแบบตัวเล็กและตัวพิมพ์เล็ก คุณสามารถใช้\cและ\Cเพื่อแทนที่สิ่งนี้:

:set ignorecase
:set smartcase
/copyright      " Case insensitive
/Copyright      " Case sensitive
/copyright\C    " Case sensitive
/Copyright\c    " Case insensitive

ดู:

:help /\c
:help /\C
:help 'smartcase'

83
ปัญหาignorecaseคือมันมีผลกระทบต่อการทดแทนเช่นเดียวกับการค้นหา ฉันพบว่ามันสมเหตุสมผลแล้วที่จะมีการค้นหาแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่การแทนที่ด้วยตัวพิมพ์เล็กและตัวพิมพ์ใหญ่โดยค่าเริ่มต้น แต่ไม่มีทางที่จะทำอย่างนั้นฉันรู้
huyz

150
เป็นที่น่าสังเกตว่าในการทำงานของคุณยังจำเป็นที่จะต้องsmartcase set ignorecaseเคล็ดลับที่ดีแม้ว่าขอบคุณ!
Skilldrick

12
ผมเชื่อว่าคุณก็สามารถใช้เป็น \ C :%s/lowercasesearch\C/replaceString/gในการแสดงออกของการค้นหาของคุณสำหรับการแทนเช่นนี้ สิ่งนี้ไม่ได้สร้างฟังก์ชั่นเริ่มต้นที่คุณต้องการ แต่มันจะช่วยให้คุณบังคับให้ต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ในขณะที่ยังคงได้รับประโยชน์จากสมาร์ทโฟนเมื่อทำการค้นหา
Anthony DiSanti

23
คุณยังสามารถตั้งค่าIสถานะในการทดแทนเพื่อบังคับให้รูปแบบเป็นกรณี ๆ ไป กด:%s/lowercasesearch/replaceString/gIไลค์
Rory O'Kane

1
หมายเหตุจากหน้าความช่วยเหลือ (มีประโยชน์หากคุณเป็น "*" ติดเหมือนฉัน):After "*" and "#" you can make 'smartcase' used by doing a "/" command, recalling the search pattern from history and hitting <Enter>.
mcella

291

คุณสามารถตั้งค่าicตัวเลือกเป็นกลุ่มก่อนการค้นหา:

:set ic

หากต้องการกลับไปที่การค้นหาที่คำนึงถึงขนาดตัวพิมพ์ให้ใช้:

:set noic

ic เป็นการจดชวเลข ignorecase


ตัวเลือกเดียวของคุณถ้าคุณโชคไม่ดีที่ยังใช้ Vi แทน Vim \cไม่ทำงานใน vi
bluppfisk


50

หากต้องการสลับระหว่างการค้นหาแบบตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็กฉันใช้การแม็พนี้ใน. vimrc ของฉัน

nmap <F9> :set ignorecase! ignorecase?


15
ใช่ แต่ignorecase?แสดงสถานะปัจจุบันของธง (ในบรรทัดคำสั่ง)
Boris Brodski

1
ขอบคุณ! สำหรับฉันนี่เป็นคำตอบที่มีประโยชน์ที่สุดในหน้าเว็บ: วิธีการสลับระหว่างสองโหมดอย่างรวดเร็วโดยขึ้นอยู่กับสิ่งที่คุณกำลังค้นหาในช่วงเวลาที่แน่นอน
Ben Hillier

30

คุณสามารถใช้vimrcคำสั่งเหล่านั้น:

  • set ignorecase - การค้นหาทั้งหมดของคุณจะคำนึงถึงขนาดตัวพิมพ์
  • set smartcase - การค้นหาของคุณจะต้องตรงตามตัวพิมพ์ใหญ่ - เล็กหากมีตัวพิมพ์ใหญ่

คุณต้องตั้งค่าignorecaseหากคุณต้องการใช้สิ่งที่smartcaseมีให้

ฉันเพิ่งเขียนบทความเกี่ยวกับคำสั่งการค้นหาเป็นกลุ่ม (ทั้งในตัวคำสั่งและปลั๊กอินที่ดีที่สุดในการค้นหาอย่างมีประสิทธิภาพ)


1
ดูเหมือนว่าset smartcaseจะไม่ทำการค้นหาแบบตัวเล็กและตัวพิมพ์เล็กถ้าฉันไม่ได้ใช้ตัวอักษรตัวพิมพ์ใหญ่ ... นั่นเป็นเรื่องปกติหรือไม่
caneta

1
ตกลงอ่านด้านล่างว่าคุณต้องตั้งค่าการเพิกเฉยและสมาร์ทcaseเพื่อให้ทำงานได้ ขอโทษด้วยกับเรื่องนั้น!
caneta

24

ตามที่คนอื่นแนะนำ:

:set ic

แต่สิ่งที่ยอดเยี่ยมคือคุณสามารถสลับโหมดดังกล่าวด้วย:

:set ic!

18

วางคำสั่งนี้ในไฟล์ vimrc ของคุณ

set ic 

ค้นหาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เสมอ


4
ฉันไม่รู้ว่าทำไม แต่เสียงเรียกร้องของฉันถูกตั้งค่าเป็นแบบไม่ตรงตามตัวพิมพ์ใหญ่ - เล็กเพื่อตอบโต้สิ่งนี้ set noicใช้
user1510539

18

vim[grep]คำสั่งเก่าที่ดี..

:vimgrep /example\c/ &
  • \c สำหรับกรณีตาย
  • \C สำหรับกรณีที่ละเอียดอ่อน
  • % คือการค้นหาในบัฟเฟอร์ปัจจุบัน

ป้อนคำอธิบายรูปภาพที่นี่


Cannot open file "&"
Vitaly Zdanevich

ผมคิดว่าเขาหมายถึงพวกเขาแทน% %
oarfish


10

ดังที่ @ huyz พูดถึงบางครั้งพฤติกรรมที่ต้องการนั้นใช้การค้นหาแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่เล็ก โซลูชันของฉันสำหรับสิ่งนั้น:

nnoremap / /\c
nnoremap ? ?\c

ด้วยสิ่งนี้เสมอเมื่อคุณกดปุ่ม/หรือ?จะเพิ่ม\cการค้นหาแบบตัวพิมพ์เล็ก


1
ไม่ใช่ข้อเสนอแนะที่ไม่ดี แต่มันทำให้คุณไม่สามารถใช้smartcaseตัวเลือกได้หรือไม่
Trebor Rude

ดูเหมือนว่าจะเป็นการแทนที่ \ csmartcase
Matthew Woo

4

Vim มี 2 โหมด

1. โหมดแก้ไข

  1. โหมดปกติ (Esc)

การค้นหาจะทำงานในโหมดปกติ

/ \ cสำหรับกรณีที่สำคัญ

/ \ c การค้นหา


แล้วโหมดภาพล่ะ?
user202729

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