ฉันรู้ว่าการรัน:map
คำสั่งที่ไม่มีอาร์กิวเมนต์ควรให้รายการของการจับคู่ที่ผู้ใช้กำหนดเอง แต่ตัวอย่างเช่นเมื่อฉันกด Ctrl-W Ctrl-I จะเกิดอะไรขึ้น ไม่ปรากฏใน:map
คำสั่ง
ฉันจะรู้ได้อย่างไรว่ากุญแจทำอะไร?
:help CTRL-W_CTRL-I
หรือ:help CTRL-W_i
ฉันรู้ว่าการรัน:map
คำสั่งที่ไม่มีอาร์กิวเมนต์ควรให้รายการของการจับคู่ที่ผู้ใช้กำหนดเอง แต่ตัวอย่างเช่นเมื่อฉันกด Ctrl-W Ctrl-I จะเกิดอะไรขึ้น ไม่ปรากฏใน:map
คำสั่ง
ฉันจะรู้ได้อย่างไรว่ากุญแจทำอะไร?
:help CTRL-W_CTRL-I
หรือ:help CTRL-W_i
คำตอบ:
คุณทำไม่ได้
นี่คือซอร์สโค้ด C สำหรับสิ่งที่<C-w><C-i>
ทำ:
normal.c
:
/*
* This table contains one entry for every Normal or Visual mode command.
* The order doesn't matter, init_normal_cmds() will create a sorted index.
* It is faster when all keys from zero to '~' are present.
*/
static const struct nv_cmd
{
int cmd_char; /* (first) command character */
nv_func_T cmd_func; /* function for this command */
short_u cmd_flags; /* NV_ flags */
short cmd_arg; /* value for ca.arg */
} nv_cmds[] =
{
[...]
{Ctrl_W, nv_window, 0, 0},
};
[...]
/*
* CTRL-W: Window commands
*/
static void
nv_window(cmdarg_T *cap)
{
if (!checkclearop(cap->oap))
do_window(cap->nchar, cap->count0, NUL); /* everything is in window.c */
}
window.c
:
/*
* all CTRL-W window commands are handled here, called from normal_cmd().
*/
void
do_window(
[..]
) {
switch (nchar)
{
[..]
case 'i': /* Go to any match */
case Ctrl_I:
type = FIND_ANY;
/* FALLTHROUGH */
[..]
default: beep_flush();
break;
ฉันไม่แน่ใจทั้งหมดว่าtype
จะหยิบตัวแปรขึ้นมาได้อย่างไรฉันไม่รู้สึกเหมือนกำลังค้นหาอยู่ แต่ประเด็นคือไม่มีสิ่งอำนวยความสะดวกที่จะพูดจริง ๆ ว่า "คีย์นี้ถูกแมปกับฟังก์ชันนี้" โดยพื้นฐานแล้วมันเป็นเพียงstruct
แผนที่char
สำหรับฟังก์ชั่นและการใช้งานการกดแป้นที่สอง ( <C-i>
) เป็นเพียงความน่าเกลียดแบบเฉพาะกิจ!
สิ่งนี้แตกต่างจาก Emacs โดยที่ (ฉันเข้าใจ) ทุกอย่างอยู่ใน Lisp และการแมปแบบกำหนดเองของคุณจะไม่แตกต่างจากการแม็พเริ่มต้นของ Emacs แต่ใน Vim คุณมีการแมป "เวทมนต์" ที่จัดทำโดยรหัส C ซึ่งแมปกับฟังก์ชั่น C ที่ไม่เคยเปิดเผยใน Vim ฉันมักจะพูดว่าเป็นกลุ่มที่มีความคิดที่ดีกว่า แต่ Emacs มีการใช้งานที่ดีกว่า ;-)
ดังนั้นวิธีเดียวคือค้นหาในไฟล์ช่วยเหลือ นี่คือเหตุผลที่ฉันปิดนี้เป็นซ้ำของฉันจะนำทางไปยังหัวข้อวิธีในเอกสารที่เป็นกลุ่มของตั้งแต่ที่เป็นเพียงการปฏิบัติคำตอบที่ทุกคนสามารถให้ เราอาจโต้แย้งว่าคำอธิบายในเชิงลึกเกี่ยวกับคำถามนั้นสามารถให้ได้ (อย่างที่ฉันเพิ่งทำไป) และถ้าคุณเถียงว่าแทนที่จะให้คำตอบ (ลบตอนนี้) ฉันอาจจะบอกว่า "คุณ ' ถูกต้องขออภัยในความผิดพลาด "และเปิดใหม่อีกครั้ง ;-)
ไม่ว่าจะด้วยวิธีใดก็ตามให้แสดงตัวอย่างสั้น ๆ ของการประชุมด้วยตัวอย่าง:
:help w
- การแมปโหมดปกติสำหรับw
(ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่);:help g8
- การแมปโหมดปกติสำหรับg8
;:help v_o
- การแมปโหมดภาพสำหรับo
; โหมดอื่น ๆ ใช้c
สำหรับบรรทัดคำสั่งและส่วนi
แทรก;:help CTRL-W
- การแมปโหมดปกติสำหรับ<C-w>
;:help i_CTRL-W
- การแมปโหมดแทรกสำหรับ<C-w>
;:help CTRL-W_CTRL-I
- การแมปโหมดปกติสำหรับ<C-w><C-i>
;:help i_CTRL-G_<Down>
- <C-g><Down>
การทำแผนที่โหมดแทรกcommandline completion
เป็นกลุ่มความช่วยเหลือในการใช้ CTRL-D (ฉันเรียกมันว่า "ค้นหาความช่วยเหลือ") พิมพ์:h CTRL-W
แล้วกด <CTRL-D> และคุณจะได้รับรายชื่อของคำสั่งทั้งหมดที่มีสตริง "CTRL-W", CTRL-W, CTRL-W_^, CTRL-W-<Down>, ...
เช่น, พิมพ์:h g8<CTRL-D>
และคุณจะเห็นg8
และ8g8
เป็นวิชาช่วยเหลือที่มีอยู่ หากไม่มีสิ่งนี้คุณจะต้องพิมพ์หัวข้อความช่วยเหลืออย่างแน่นอนและค้นหาสตริงที่แน่นอนซึ่งใช้งานได้ยาก
มันอยู่ในไฟล์ช่วยเหลือเป็นกลุ่มที่ :help index
หากคุณต้องการทราบว่าคีย์ใดที่ไม่ได้รับการแมปตามค่าเริ่มต้นให้ดู
:help map-which-keys
หมายเหตุ: ข้างต้นเป็นลิงค์ที่คลิกได้ไปยังคู่มืออ้างอิง vimล่าสุด
ฉันคิดว่าคุณสามารถรับการแมปผ่านคำสั่งต่อไปนี้
:nmap - Mapping on normal mode
:cmap - Mapping on command mode
:vmap - Mapping on visual mode
หวังว่ามันจะช่วย!