อะไรคือความแตกต่างระหว่างคำสั่งการแมปแมปแมปใหม่, nnoremap และ vnoremap ในกลุ่ม?


1113

ความแตกต่างระหว่างคืออะไรremap, noremap, nnoremapและvnoremapคำสั่งการทำแผนที่ในกลุ่ม?


1
ข้อควรระวังvnoremapและvmapทำงานในโหมด Visual AND Select ที่จะมีการทำแผนที่เฉพาะในโหมดภาพและเสียง, การใช้งานและxmap xnoremap
เบอนัวต์

คำตอบ:


1626

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

:mapและ:noremapเป็นเวอร์ชันแบบเรียกซ้ำและไม่ใช่แบบเรียกซ้ำของคำสั่งการแม็พต่างๆ หมายความว่าถ้าคุณทำ:

:map j gg
:map Q j
:noremap W j

jggจะได้รับการแมปไป Qจะยังถูกแมปไปggเพราะjจะขยายสำหรับการทำแผนที่ recursive Wจะถูกแมปกับj(และไม่ให้gg) เพราะjจะไม่ได้รับการขยายสำหรับการทำแผนที่ที่ไม่เกิดซ้ำ

ตอนนี้จำได้ว่าเป็นกลุ่มเป็นบรรณาธิการกิริยา มันมีโหมดปกติภาพและโหมดอื่น ๆ

สำหรับการแม็พแต่ละชุดเหล่านี้มีการแม็พที่ทำงานในโหมดปกติ, ภาพ, เลือกและโอเปอเรเตอร์ ( :mapและ:noremap), หนึ่งภาพที่ทำงานในโหมดปกติ ( :nmapและ:nnoremap), หนึ่งภาพในโหมดภาพ ( :vmapและ:vnoremap) เป็นต้น

สำหรับคำแนะนำเพิ่มเติมเกี่ยวกับสิ่งนี้โปรดดู:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes

8
ขอบคุณสำหรับคำตอบ! นอกจากนี้จะใช้เมื่อเรียกซ้ำและเมื่อใดที่ไม่ใช้ซ้ำ
Chetan

14
@Chetan: มันขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ ฉันมักจะใช้การไม่เรียกซ้ำบ่อยกว่า แต่ถ้าคุณได้กำหนดการทำแผนที่ที่ค่อนข้างซับซ้อนโดยใช้การไม่เรียกซ้ำและการทำแผนที่อื่นที่ทำทุกอย่างที่การทำแผนที่ครั้งแรกทำและมากกว่านั้น แบบดั้งเดิมแทนที่จะพิมพ์ใหม่ทั้งหมดแบบไม่เรียกซ้ำอีกครั้ง (โดยเฉพาะถ้าคุณต้องการปรับแต่งแบบดั้งเดิม)
DrAl

10
ฉันได้สันนิษฐานว่าจะเป็นตรงข้ามของบางอย่างnoremap mapฉันหมายถึงสิ่งที่ลบการแมป ขอบคุณสำหรับคำตอบ. มันทำให้ฉันกระจ่าง
Pavan Manjunath

4
มันไม่สำคัญสำหรับกรณีการใช้งานส่วนใหญ่ แต่ควรสังเกตว่า:mapฯลฯ ไม่สามารถใช้งานได้ในทุกโหมดทุกประการ(โดยเฉพาะโหมดปกติโหมดภาพโหมดเลือกและ โหมดที่รอดำเนินการ) หากคุณต้องการให้การแมปทำงานในโหมดแทรกบรรทัดคำสั่งหรือ lang-arg คุณต้องใช้:map!ฯลฯ (ที่มา: vimdoc.sourceforge.net/htmldoc/map.html#map-overview )
Ken Bellows

3
@whytheq noremap = การทำแผนที่แบบไม่เรียกซ้ำ
Dan Bechard

281

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

mapคือ "รูท" ของคำสั่งการแม็พแบบเรียกซ้ำทั้งหมด รูปแบบรูทจะใช้กับโหมด "ปกติ", "visual + select" และ "รอดำเนินการ" (ฉันใช้คำว่า "รูต" เหมือนกับภาษาศาสตร์ )

noremapคือ "รูท" ของคำสั่งการแม็พที่ไม่ใช่แบบเรียกซ้ำทั้งหมด mapรูปแบบรากนำไปใช้กับโหมดเดียวกับ (ลองคิดว่าnoreคำนำหน้าหมายถึง "ไม่ใช่แบบเรียกซ้ำ")

(โปรดทราบว่านอกจากนี้ยังมี!โหมดเช่นเดียวกับmap!ที่ใช้กับการแทรก & บรรทัดคำสั่ง)

ดูด้านล่างสำหรับความหมาย "แบบเรียกซ้ำ" ในบริบทนี้

การจัดเตรียมโหมดตัวอักษรเช่นnแก้ไขโหมดที่การทำแผนที่สามารถเลือกชุดย่อยของรายการโหมดที่ใช้งานได้ (เช่น "ภาพ" เท่านั้น) หรือเลือกโหมดอื่นที่mapไม่สามารถใช้กับ (เช่น "แทรก")

ใช้help map-modesจะแสดงตารางไม่กี่ตารางที่อธิบายวิธีควบคุมโหมดที่ใช้ในการทำแผนที่

ตัวอักษรโหมด:

  • n: ปกติเท่านั้น
  • v: ภาพและเลือก
  • o: รอดำเนินการ
  • x: ภาพเท่านั้น
  • s: เลือกเท่านั้น
  • i: ใส่
  • c: บรรทัดคำสั่ง
  • l: insert, command-line, regexp-search (และอื่น ๆ เรียกว่า "โหมดหลอก" Lang-Arg ")

"วนซ้ำ " หมายถึงการทำแผนที่ขยายไปยังผลลัพธ์จากนั้นผลลัพธ์จะขยายไปยังผลลัพธ์อื่นและอื่น ๆ

การขยายจะหยุดลงเมื่อหนึ่งในนั้นเป็นจริง:

  1. ผลลัพธ์จะไม่ถูกแมปกับสิ่งอื่นอีกต่อไป
  2. มีการใช้การแมปที่ไม่ใช่แบบเรียกซ้ำ (เช่น "noremap" [หรือหนึ่งใน ilk] คือการขยายครั้งสุดท้าย)

ณ จุดนั้น "ความหมาย" เริ่มต้นของ Vim ของผลลัพธ์สุดท้ายจะถูกนำไปใช้ / ดำเนินการ

" ไม่เรียกซ้ำ " หมายถึงการทำแผนที่จะขยายเพียงครั้งเดียวและผลลัพธ์นั้นถูกนำไปใช้ / ดำเนินการ

ตัวอย่าง:

 nmap K H
 nnoremap H G
 nnoremap G gg

สาเหตุดังกล่าวข้างต้นKที่จะขยายไปHแล้วHจะขยายไปGและหยุด มันหยุดเพราะเหตุnnoremapซึ่งขยายและหยุดทันที ความหมายของGจะถูกดำเนินการ (เช่น "ข้ามไปยังบรรทัดสุดท้าย") อย่างมากที่สุดการแมปที่ไม่เกิดซ้ำจะถูกนำไปใช้ในห่วงโซ่การขยายตัว (มันจะเป็นการขยายครั้งสุดท้ายที่จะเกิดขึ้น)

การทำแผนที่ของGที่จะggใช้เฉพาะถ้าคุณกดแต่ไม่ถ้าคุณกดG Kการจับคู่นี้ไม่ส่งผลกระทบต่อการกดKไม่ว่าจะGมีการแมปซ้ำหรือไม่เนื่องจากเป็นบรรทัดที่ 2 ที่ทำให้การขยายตัวKหยุดลงดังนั้นบรรทัดที่ 3 จะไม่ถูกใช้


4
สิ่งหนึ่ง: mapใช้ได้กับโหมดปกติ, ภาพ, เลือกและโหมดรอดำเนินการเท่านั้นไม่ใช่สำหรับทุกโหมด
Brian McCutchon

1
ควรได้รับคำตอบ
Tycholiz

นี่เป็นวิธีที่ดีกว่าคำตอบที่ได้รับการยอมรับ
MilMike

19

สิ่งหนึ่งที่แตกต่างคือ:

  • :map ไม่nvo== + ปกติ (ภาพ + เลือก) + ผู้ประกอบการอยู่ระหว่างดำเนินการ
  • :map!ทำic == แทรก + โหมดบรรทัดคำสั่ง

ตามที่ระบุไว้ในhelp map-modesตาราง

ดังนั้น: ไม่ได้แมปไปทุกโหมดmap

ต้องการแมโหมดทั้งหมดที่คุณจำเป็นต้องใช้ทั้งและ:map:map!


5
ระวัง !! command modeเป็นอีกชื่อทางประวัติศาสตร์สำหรับnormal modeได้แก่ chapt 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ) ตัวย่อ 'c' ใช้สำหรับ 'command-line' กล่าวอีกนัยหนึ่งโดยค่าเริ่มต้น: แผนที่ lhs กับ rhs map! lhs rhs แบบเรียกซ้ำสำหรับการแทรก + คำสั่งโหมดLINE นั่นคือถ้าremapตัวเลือกเริ่มต้นถูกปิดใช้งานอย่างชัดเจนด้วยset noremap[!]ใน ~ / .vimrc ในกรณีนั้นการทำแผนที่จะไม่เกิดซ้ำ (ไม่แนะนำให้เลือก)
Cbhihe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.