อะไรคือความแตกต่างระหว่างคำสั่ง map, noremap, abbrev และ noreabbrev?


19

คำสั่งเหล่านี้เปลี่ยนการกดแป้นหนึ่งชุดไปเป็นชุดอื่น แต่อย่างใด แต่ฉันค่อนข้างคลุมเครือซึ่งคำสั่งหนึ่งเหมาะสมที่สุดสำหรับบางสถานการณ์ นอกจากนี้ยังมี!สายพันธุ์ของพวกเขาเช่นกัน ในขณะนี้การใช้งานของพวกเขานั้นค่อนข้างจับจดดังนั้นฉันจะรู้ได้อย่างไรว่ามีข้อผิดพลาดอะไรบ้าง โดยเฉพาะอย่างยิ่งหมายเหตุเกี่ยวกับรุ่นของโหมดต่าง ๆ อาจมีประโยชน์เนื่องจากฉันได้เรียนรู้จาก Peter Rincker ในความคิดเห็นที่cmapสามารถขยายได้ทุกที่ในบรรทัดและไม่เพียง แต่เมื่อฉันใช้:คำสั่ง ฉันสามารถใช้ความระมัดระวังแบบใดกับข้อผิดพลาดที่อาจเกิดขึ้นได้


ส่วนถัดไปคือเมตาบิต: เราควรใช้แบบฟอร์มใดในขณะตอบคำถามบนไซต์นี้ - ฉันควรถามสิ่งนี้กับ Meta หรือเพิ่มลงในคำถามหรือไม่
muru

ฉันจะบอกว่ามันขึ้นอยู่กับ ฉันจะใช้ noremap version เสมอหากแสดงแผนที่ ด้วยวิธีนี้ผู้คนมักจะเคยชินกับการใช้การแมปที่ไม่เกิดซ้ำในเวอร์ชันที่เรียกซ้ำ ยกเว้นกรณีที่มีเหตุผลในการใช้แผนที่โดยเฉพาะตัวอย่างเช่นในการทำแผนที่ <Plug>
akshay

คำตอบ:


21

ครั้งแรกmapและnoremapมีความคล้ายคลึงกันในการที่ว่าแต่ละสร้างแมปสำหรับผิวธรรมดา, ภาพเลือกและผู้ประกอบการที่ค้างอยู่โหมดพร้อมกัน เป็นกลุ่มรายละเอียดนี้ใน:help map-overview:

Overview of which map command works in which mode.  More details below.
     COMMANDS                    MODES ~
:map   :noremap  :unmap     Normal, Visual, Select, Operator-pending
:nmap  :nnoremap :nunmap    Normal
:vmap  :vnoremap :vunmap    Visual and Select
:smap  :snoremap :sunmap    Select
:xmap  :xnoremap :xunmap    Visual
:omap  :onoremap :ounmap    Operator-pending
:map!  :noremap! :unmap!    Insert and Command-line
:imap  :inoremap :iunmap    Insert
:lmap  :lnoremap :lunmap    Insert, Command-line, Lang-Arg
:cmap  :cnoremap :cunmap    Command-line

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

'n' (สำหรับปกติ), 'v' (สำหรับภาพและเลือก), 'c' (สำหรับคำสั่ง), 'x' (สำหรับโหมดภาพ), 's' (สำหรับเลือก), 'o' (สำหรับผู้ดำเนินการที่รอดำเนินการ )

ตัวอย่างเช่น

nmap n nzz

จะสร้างโหมดปกติ, nการทำแผนที่ของ

ตอนนี้noremapเป็นเพียงรุ่นที่ไม่ใช่ recursive mapของ

ดังนั้นการแม็พที่ไม่เกิดซ้ำคืออะไร? Vim ก็มีคำตอบเช่นกันด้วย:help map-recursive:

If you include the {lhs} in the {rhs} you have a recursive mapping.  When
{lhs} is typed, it will be replaced with {rhs}.  When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times.  The
only problem is that the only way to stop this is by causing an error.  The
macros to solve a maze uses this, look there for an example.  There is one
exception: If the {rhs} starts with {lhs}, the first character is not mapped
again (this is Vi compatible).
For example: >
   :map ab abcd
will execute the "a" command and insert "bcd" in the text.  The "ab" in the
{rhs} will not be mapped again.

ตัวอย่างของสิ่งนี้คือการทำแผนที่ต่อไปนี้:

:imap j k

:imap k j

ตอนนี้เสียงเรียกเข้าจะแทนที่ j ด้วย k และ k ด้วยจำนวนอนันต์ j ดังนั้นจึงจะแสดงข้อผิดพลาดที่คุณได้สร้างการทำแผนที่แบบเรียกซ้ำ

นี่คือเหตุผลที่แนะนำโดยทั่วไปว่าคุณเกือบตลอดเวลา (ยกเว้นเมื่อคุณมี<Plug>การแมปหรือคล้ายกัน) ใช้การแมปที่ไม่เกิดซ้ำ สิ่งนี้จะป้องกันการค้างเป็นกลุ่มเมื่อคุณสร้างการแมปแบบเรียกซ้ำ ดังนั้นการแม็พแบบไม่เรียกซ้ำจึงเป็นวิธีที่ปลอดภัยกว่าในการแม็พคำสั่งในกลุ่ม

ด้วยข้อมูลข้างต้นเราจะเห็นได้ว่า:noreabbrevเป็นเพียง:abbrevคำสั่งที่ไม่ใช่แบบเรียกซ้ำ

คุณสามารถใช้:abbrevเฉพาะในโหมดแทรกเปลี่ยนและคำสั่งเท่านั้น :abbrevใช้สำหรับสร้างตัวย่อ (ทางลัดหรือที่รู้จักว่า Vim สามารถขยายได้) การกระจายสั้น ๆ คือการใช้:map/ :noremapเพื่อสร้างการแมป:abbrev/ :noreabbrevเพื่อสร้างตัวย่อหรือเมื่อใดก็ตามที่คุณต้องการให้ Vim ขยายการพิมพ์ของคุณ


1
การหลีกเลี่ยงการแฮงค์ไม่ใช่เหตุผลเดียวที่ใช้noreรูปแบบของคำสั่ง map อีกเหตุผล (และในความคิดของฉันสำคัญกว่า) ที่จะใช้พวกเขาคือพวกเขาทำให้การแมปของคุณน่าเชื่อถือ / คาดการณ์ได้ หากคุณใช้รูปแบบธรรมดาและrhsมีรหัสที่มีการแมปกับสิ่งอื่น ๆ การทำแผนที่ของคุณอาจมีพฤติกรรมที่แตกต่างไปจากเดิมอย่างสิ้นเชิง
รวย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.