ฉันรู้ว่าการรัน: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
หวังว่ามันจะช่วย!