วิธีอื่นในการออกจากโหมดแทรกนอกเหนือจาก Escape


74

เหตุผลหลักที่ฉันชอบพูดจาชอบ emacs ก็คือการเคลื่อนไหวของมือฉันอยู่ห่างจากแถวบ้านต่ำมาก (แม้ในฐานะโปรแกรมเมอร์) อย่างไรก็ตามครั้งหนึ่งที่ฉันทำเช่นนี้คือออกจากโหมดแทรกโดยการกด Escape

ฉันเพิ่งเรียนรู้ว่าฉันสามารถใช้ Ctrl + C เพื่อออกจากโหมดแทรกได้เช่นกัน อย่างไรก็ตามนี่ไม่ใช่การปรับปรุงจริง ๆ

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


1
คุณสามารถแมปคีย์ผสมได้ทุกที่และคุณไม่สามารถทำอะไรได้เลย นั่นคือสิ่งที่คุณหมายถึงอะไร
yo '

3
เรียนรู้ Ctrl + c ทางลัด THX!
Philippe Gachoud

วิธีการเกี่ยวกับการทำแผนที่ Caps Lock เป็น Esc?
Kolob Canyon

@PhillippeGachaud: อย่าใช้ Ctrl-C เพื่อทดแทน Esc Ctrl-C ไม่เหมือนกับ Escape มันเป็น Escape ที่บังคับและอาจทำงานแตกต่างกันในบางสถานการณ์
Lie Ryan

คำตอบ:


60

การเชื่อมโยงทั่วไปที่คุณจะเห็นคือjjเนื่องจากทำงานได้ดีกับเค้าโครง QWERTY หากคุณใช้การวางตำแหน่งแถวบ้าน

inoremap jj <ESC>

ในกรณีนี้ให้พิมพ์ตัวอักษรjj- คุณควรรอ 1 วินาที (โดยค่าเริ่มต้น) ระหว่างการพิมพ์อักขระที่สอง (ดู:help 'timeout'รายละเอียด)

นอกจากนี้ยังมีc-oสิ่งที่จะนำคุณออกจากการแทรกทำให้คุณทำคำสั่งปกติหนึ่งคำสั่งจากนั้นจึงใส่กลับเข้าไปในส่วนแทรก

http://vim.wikia.com/wiki/Avoid_the_escape_key


1
ใน dvorak jเป็นcกุญแจสำคัญ ดังนั้นสิ่งนี้จะไม่เลวร้ายนัก (พิมพ์cc) ฉันยังสามารถผูกhh(qwerty jkey = dvorak h) ซึ่งจะบูตฉันเฉพาะเมื่อฉันพิมพ์shhhhhhhหรืออะไร
durron597

7
cc เป็นชุดของตัวอักษรสองตัวที่ใช้กันทั่วไปในภาษาอังกฤษเป็นอย่างน้อย ดังนั้นอาจไม่ใช่ตัวเลือกที่ดีที่สุด
Nick J Adams เมื่อ

4
วิธีการเกี่ยวกับการล้อเลียนjk? ค้นหาสองปุ่มที่อยู่ติดกันใน Dvorak แต่ไม่ใช่ชุดค่าผสมทั่วไปในภาษาที่คุณต้องการ ยกตัวอย่างเช่นเป็นเทียบเท่าตำแหน่งของtn jk
David Lord

1
ฉันชอบมีjk/ kjออกจากโหมดปกติแม้ใน Dvorak; พวกมันเป็นปุ่ม "c" และ "v" บนคีย์บอร์ด QWERTY ดังนั้นมันจึงง่ายสำหรับตัวชี้ซ้ายและนิ้วกลาง
alxndr

2
ฉันคิดว่าเราทำได้ดีกว่า - ใช้iiแทน ใช่คุณต้องเลื่อนนิ้วออกจากแถวบ้าน แต่ก็ยังสบาย และยิ่งไปกว่านั้นคุณสามารถสลับไปมาระหว่างโหมดต่างๆโดยไม่ต้องเลื่อนนิ้ว
Sridhar Sarnobat

38

นอกเหนือจากทางเลือกในตัว<C-[>และ<C-c>สำหรับการ<Esc>อ้างถึงจากผู้อื่นโซลูชันที่ได้รับความนิยมอีกวิธีหนึ่งคือทำการแมปใหม่<CapsLock>เป็น Escape เพิ่มเติม สิ่งนี้ทั้งบน Qwerty และ Dvorak keyboard

วิธีนี้คุณสามารถกด Esc ได้อย่างง่ายดายด้วยนิ้วก้อยซ้ายโดยไม่ต้องเอามือออกจาก HomeRow (โดยบังเอิญ CapsLock คือที่ที่ Escape เคยอยู่บนคีย์บอร์ดเมื่อถูกประดิษฐ์ vi)

การแมปใหม่สามารถทำได้:

  • บน Windows โดยใช้ยูทิลิตี้AutoHotKey
  • บน Mac โดยใช้ยูทิลิตี้KeyRemap4MacBookและอื่น ๆ
  • บน Linux นั้นแตกต่างกันไปตามสภาพแวดล้อมเดสก์ทอป ตัวอย่างเช่นใน Linux Mint / Cinnamon เป็นเพียงเรื่องของการเลือกตัวเลือกที่เหมาะสมในเมนู -> คีย์บอร์ด -> รูปแบบแป้นพิมพ์ -> ลักษณะการทำงานของ Caps Lock อีกทางหนึ่ง แต่น้อยกว่านั้นมันสามารถทำการแมปใหม่ที่ระดับ Xorg โดยใช้โปรแกรม xmodmap และให้มันรัน.Xmodmapไฟล์ต่อไปนี้:

    clear Lock
    keycode 0x42 = Escape
    

    ระบบสามารถตั้งค่าให้รันโดยอัตโนมัติทุกครั้งที่เข้าสู่ระบบโดยวางกลยุทธ์เชลล์สคริปต์ต่อไปนี้ (สมมติว่า.Xmodmapคุณอยู่ที่บ้านของคุณ~) ในห่วงโซ่ของไฟล์ที่มาจากการล็อกอินอัตโนมัติ:

    if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
    fi
    

    อย่างไรก็ตามเป็นเรื่องยุ่งยากเนื่องจากไฟล์ที่มาจริงแตกต่างกันไปตามสภาพแวดล้อม (เดสก์ท็อป) ที่ใช้ ตัวอย่างเช่นฉันมี xmodmap เรียกว่าเป็นรายการใน Cinnamon "แอปพลิเคชันเริ่มต้น" (ซึ่งช่วยให้ฉันทำมากกว่าการปรับแต่งการแมปคีย์มาตรฐาน GUI แบบเดิม)

บางคนไปได้ไกลกว่านั้นและตั้งโปรแกรมปุ่ม CapsLock เพื่อทำงาน:

  • เป็นCtrlกุญแจสำคัญโดยการกดค้างไว้
  • เป็นEscปุ่มกดและปล่อยอย่างรวดเร็ว

สิ่งนี้สามารถทำได้บน Windows และ Mac โดยการตั้งค่า / การตั้งโปรแกรมยูทิลิตี้การแมปที่เหมาะสม (โดยเฉพาะสำหรับคำแนะนำ AutoHotkey สามารถพบได้ที่นี่และสำหรับ KeyRemap4MacBook ตรวจสอบที่นี่ ) บน Linux ใช้โปรแกรมXcape


2
เห็นด้วยอย่างเต็มที่. การมีปุ่ม ctrl ในแถวบ้านช่วยเพิ่มความสะดวกในการใช้งาน (เลื่อนผ่านความสำเร็จด้วย ctrl + n เลื่อนดูไฟล์ด้วย ctrl + f / ctrl + b หนีด้วย ctrl +] ฯลฯ คีย์ผสมเหล่านี้ทั้งหมดทำได้ง่ายขึ้น วิธีนี้.
John O'M.

1
เกี่ยวกับการกดปุ่มCtrl(ที่ตำแหน่งปกติ) โดยไม่ต้องบิดนิ้วก้อย: คุณสามารถกดมันด้วยฝ่ามือภายนอกของมือตามที่อธิบายไว้ที่นี่ (ฉันพบเคล็ดลับที่ฉลาดนี้ดีใน 'Net เวลาที่จะให้มัน กลับมา :) และความรุ่งโรจน์ถึงผู้ที่คิดค้นมันขึ้นมา)
Giovanni Maggiorani

FWIW KeyRemap4MacBook ได้รับการเปลี่ยนชื่อ Karabiner: pqrs.org/osx/karabiner/index.html.en
alxndr

ฉันลองใช้วิธีแก้ไขปัญหานี้ แต่พบว่าฉันกด Caps Lock โดยไม่ตั้งใจเมื่อกด Shift บางครั้งซึ่งน่ารำคาญ ดังนั้นระยะของคุณอาจแตกต่างกันไปขึ้นอยู่กับความพิ้งกี้ซ้ายของคุณ :)
Godsmith

2
หากคุณทำการแมปCtrlไปยังAlt( Cmd) และในทางกลับกันก็ <C-[>จะส่องแสงจริงๆ พิ้งกี้อ่อนแอนิ้วหัวแม่มือแข็งแรง ใน QWERTY คุณไม่จำเป็นต้องออกจากบ้านแถวนั้นเพราะใน Dvorak มันไม่ค่อยดี แต่ก็ยอมรับได้
Nash Bridges

28

การแมปที่ฉันใช้คือ:

inoremap jk <esc>
inoremap kj <esc>

ด้วยวิธีนี้คุณสามารถกดjและkในเวลาเดียวกันโดยไม่ต้องกังวลว่าจะกดปุ่มไหนก่อน


70
แต่ฉันกำลังเขียนหนังสือเกี่ยวกับการเล่น Edsgar Dijkstra เล่น blackjack ใน Reykjavik! ;)
durron597

ทั้งสองเป็นสิ่งที่น่ากลัวหากคุณต้องการเขียนภาษาดัตช์
Hielke Walinga

12

<C-[>และสองทางเลือกพื้นเมือง<C-c><Esc>

ดู:help i_<esc>และ:help i_ctrl-cซึ่งจะอธิบายความแตกต่างระหว่างและ<C-c><Esc>


สิ่งเหล่านี้ไม่ใช่การปรับปรุงเนื่องจาก Ctrl อยู่ไกลจากแถวบ้านเท่าที่ Escape คือ
durron597

4
@ durron597 บนแป้นพิมพ์ QWERTY Ctrl อาจอยู่ไกลจากแถวบ้าน แต่มีความแตกต่างที่สำคัญ: อยู่ใต้แถวบ้าน คุณแค่ขยับนิ้วของคุณเพื่อกดในขณะที่ Esc คุณต้องหมุนมือทั้งสองเล็กน้อย นอกจากนี้ยัง<C-[>มีความสมมาตรที่ดีกับมัน (นิ้วก้อยเล็ก ๆ เคลื่อนที่ไปในทิศทางตรงกันข้าม)
wchargin

6
โปรดทราบว่า<C-c> ไม่เหมือนกัน<Esc>ทุกประการ
wchargin

2
ตกลง การใช้งานแบบประจำของ<C-c>สามารถแบ่งปลั๊กอินและ autocmds ได้อย่างละเอียด
เดวิดลอร์ด

ในเครื่องของฉันมันใช้งานได้ <C - [> แต่ใช้เวลาครึ่งวินาทีในการลงทะเบียนนานกว่า <Cc>
Alexander Mills

4

คุณสามารถแมปCaps LockไปControl โดยไม่ต้องใช้โปรแกรมภายนอกใด ๆ :

  • ในMac OS Xไปที่การตั้งค่าระบบ> คีย์บอร์ด -> คีย์ตัวปรับแต่ง
  • ในLinuxดำเนินการ:setxkbmap -option caps:ctrl_modifier
  • ในWindowsแก้ไขรีจิสทรีของคุณ

สิ่งนี้จะนำControlไปสู่แถวบ้านทำให้ง่ายต่อการกดการควบคุมจังหวะที่ปรับเปลี่ยนทั้งหมดรวมถึงCtrl-[และCtrl-Cโหมดการออกจากส่วนแทรกทั้งสองใน Vim

อีกทางเลือกหนึ่งที่ด้านล่างของคำตอบของเขาจิโอวานนี่แสดงให้เห็นแผนที่Caps Lockจะดำเนินการทั้งในControl และ Escapeขึ้นอยู่กับความยาวของสื่อมวลชน แต่ต้องติดตั้งซอฟต์แวร์พิเศษ

Ctrl-[เป็นทางเลือกที่แนะนำEscapeเพราะมันมักจะทำงานเช่น

หนึ่งความแตกต่างที่เห็นได้ชัดด้วยCtrl-Cคือว่าเมื่อออกจากการแก้ไขในโหมดภาพ blockwise , Ctrl-Cจะทำให้การเปลี่ยนแปลงที่คุณทำบนบรรทัดปัจจุบัน แต่จะไม่ทำซ้ำการเปลี่ยนแปลงในช่วงสายอื่น ๆ ในบล็อกซึ่งเป็นจุดของโหมดการว่า

มันจะไม่ตรวจหาตัวย่อหรือเรียกใช้งานเหตุการณ์ InsertLeave ดู:help i_CTRL-C


4

ผมขอแนะนำให้ใช้ปลั๊กอินของฉันเป็นกลุ่ม-easyescape

Plug "zhou13/vim-easyescape"
let g:easyescape_chars = { "j": 1, "k": 1 }
let g:easyescape_timeout = 100
cnoremap jk <ESC>
cnoremap kj <ESC>

ปัญหาของการเรียงลำดับแผนที่อย่างง่ายinoremap jj <ESC>คือ Vim จะหยุดชั่วคราวเมื่อคุณพิมพ์jหรือkอยู่ในโหมดแทรก การหยุดชั่วคราวทำให้เกิดการรบกวนทางสายตาซึ่งคุณอาจสังเกตเห็นหรือไม่ก็ได้ vim-easyescapeไม่มีปัญหาดังกล่าวและรองรับการหมดเวลาที่กำหนดเอง


3

ในเทอร์มินัล vi และ Vim alt+ single-normal-mode-keyจะทำงานเพื่อแก้ไขอย่างรวดเร็วในเทอร์มินัลส่วนใหญ่

สิ่งนี้ทำงานได้เพราะเทอร์มินัลส่วนใหญ่ส่งตัวดัดแปลง alt เป็นอักขระยกเว้น ตัวอย่างเช่นเมื่อคุณพิมพ์จำลองสถานีส่งสองตัวละครในการเขียนโปรแกรมการทำงาน:alt+k , Vi และ Vim ตีความสิ่งนี้ตามที่คุณคาดหวัง มันออกจากโหมดแทรก (เนื่องจากการหลบหนี) และดำเนินการคำสั่งโหมดปกติ (ในตัวอย่างการเลื่อนเคอร์เซอร์ขึ้นหนึ่งบรรทัด)esck

วิธีนี้เป็นวิธีที่สะดวกในการออกจากโหมดแทรกหากแป้นพิมพ์ของคุณมีปุ่ม alt ติดกับสเปซบาร์ (เพื่อให้สามารถกดด้วยนิ้วหัวแม่มือโดยปล่อยนิ้วของคุณบนแถวหน้าแรก) ตราบใดที่คุณใช้เครื่องจำลองขั้ว ด้วยพฤติกรรมนี้และไม่รังเกียจที่จะใช้คำสั่งโหมดปกติ


2
คุณสามารถอธิบายรายละเอียดเกี่ยวกับสิ่งที่เป็นsingle-normal-mode-key? คุณหมายถึง Escape หรือ
kenorb

กดปุ่มเดียวที่คุณจะใช้ในโหมดปกติสามารถใช้ในโหมดแทรกด้วยปุ่ม alt เช่น Alt + x เพื่อลบอักขระ
ewatt

2
ฉันไม่เข้าใจคำตอบนี้เช่นกัน; Alt + x จริง ๆ แล้วดูเหมือนว่าจะทำอะไรที่แตกต่างจาก Alt ในโหมดปกติหรือไม่ และปุ่มอื่นบางอันดูเหมือนจะไม่ทำงาน? แต่บางทีฉันอาจใช้ผิด .. บางทีคุณอาจขยายคำตอบของคุณเล็กน้อยเพื่ออธิบายวิธีการใช้งานและเชื่อมโยงไปยังเอกสาร Vim บางอย่างก็จะดี :-) ขอบคุณ! :-)
Martin Tournoij

ที่จริงแล้วขึ้นอยู่กับการกำหนดค่าเทอร์มินัลของคุณและไม่ได้ตั้งค่าตามที่คุณแนะนำ
Christian Brabandt

1
ฉัน upvoting สิ่งนี้จากนั้นตรวจสอบประวัติและตระหนักว่าด้วยเหตุผลบางประการที่ผู้ดำเนินรายการได้ทำการแก้ไขเพื่อเพิ่มข้อความ 99% จากอากาศบาง ๆ แทนที่จะเพียงแค่แสดงความคิดเห็นเหมือนกับที่พวกเราที่เหลือคาดว่าจะทำ ดังนั้นฉันต้องย้อนกลับการลงคะแนนของฉัน แน่นอนว่าเกิดอะไรขึ้นที่นี่นอกเหนือจากการแก้ไขที่เหมาะสม? ฉันเคยปฏิเสธการแก้ไขที่ก่อกวนน้อยกว่ามาก เนื้อหาใหม่นั้นเยี่ยมยอดแน่นอน แต่ไม่ได้อยู่ในคำตอบนี้ มันควรจะเป็นของตัวเอง
underscore_d

3

FWIW ฉันใช้:

:map! ;l ^[
:vmap ;l ^[

รู้สึกคล้ายกับกดปุ่ม Return ฉันใช้;เป็นผู้นำสำหรับการแมปโหมดแทรกอื่นด้วย

ครั้งเดียวที่ฉันต้องพิมพ์ ';' + ตัวอักษรคือเมื่อรหัสกอล์ฟ; ฉันไม่มีข้อขัดแย้งใด ๆ


อาจจะดีกว่าในการทำแผนที่เพื่อหนีจากการทำแผนที่ไปที่ ^ [ใช่มั้ย :)
Alexander Mills

2

ฉันใช้Ctrl+ 3มาหลายครั้งฉันพบว่าพิมพ์ได้ง่ายกว่าตัวเลือกอื่น ๆ และดูเหมือนว่าจะใช้งานได้ดี (อย่างน้อยบน Linux) Caps Lockแผนที่ของฉันถูกแมปไว้Ctrlด้วยดังนั้นจึงสะดวกสบายในการพิมพ์

ฉันพยายามใช้Ctrl+ cสำหรับบางเวลา แต่ผมมีปัญหาบางอย่างกับมันซึ่งผมจำไม่ได้ว่าตอนนี้ แต่ผมก็ไม่ได้รับพฤติกรรมเดียวกันแน่นอนเป็นEscเหมือนที่ฉันได้รับในขณะนี้กับ+Ctrl3


2
Ctrl-3 ควรทำอะไรกันแน่?
Christian Brabandt

ฉันไม่รู้ว่ามันใช้งานได้ดี แต่ทำงานได้ดีEscในวานิลลา ฉันพบว่าสังเกตุได้จากการทดสอบชุดค่าผสมไม่ทราบรายละเอียดเกี่ยวกับวิธีการทำงานของ internals
elias

1
นี่ไม่ใช่สิ่ง vi, ทำงานบนเปลือกด้วย มีประโยชน์มากในกรณีที่คุณเปิดใช้งานโหมด vi บนเชลล์ด้วย bindkey -v
golfadas

1

หากคุณมีแป้นพิมพ์ของสหรัฐอเมริกาอังกฤษ, กดCtrl- เทียบเท่าสำหรับการกด[ Escนี่เป็นวิธีที่ง่ายในการออกจากโหมดแทรก อีกวิธีหนึ่งคือใช้-Ctrlc

หากคุณเป็นกลุ่มในโหมดง่าย ( -y) คุณจะต้องกดCtrl- l(Control-L) เพื่อออกจากโหมดแทรก

นอกจากนี้ยังมีCtrl+ oซึ่งจะเพียงโหมดแทรกทางออกชั่วคราวเพียงเพื่อดำเนินการคำสั่งอย่างใดอย่างหนึ่งและส่งกลับไปยังโหมดแทรก (ดู: :help i_CTRL-O)

หรือCtrl+ rแต่มันเป็นเพียงสำหรับการแทรกเนื้อหาของการลงทะเบียนหรือการแสดงออกเช่นCtrl+ r, =5*5(ดู: :help i_CTRL-R, :help c_CTRL-RและStackOverflow โพสต์ )

อ่านเพิ่มเติมได้ที่: หลีกเลี่ยงคีย์ escapeที่ vim wikia


3
FYI: ใช้Ctrl+rสำหรับการแทรกการลงทะเบียน (รวมถึงการลงทะเบียนนิพจน์=) Ctrl+oหากคุณต้องการที่จะดำเนินการอย่างใดอย่างหนึ่งออกคำสั่งการใช้งานชั่วคราว
Sukima

1

ฉันได้ตัดสิน<A-e>เพื่อการหลบหนี:

noremap  <A-e> <Esc>
snoremap <A-e> <Esc>
inoremap <A-e> <Esc>
tnoremap <A-e> <Esc>

" For some reason in command line mode '\e' is interpreted as Enter.
cnoremap <A-e> <C-c>

แก้ไข: เพิ่งพบว่า<C-\><C\n>จะส่งคุณไปยังโหมดปกติจากโหมดอื่นใด นอกจากนี้ยังมีพฤติกรรมโดยรวมที่ดีขึ้น การจับคู่กลายเป็น:

noremap <A-e> <C-\><C-n>
noremap! <A-e> <C-\><C-n>

0
nnoremap <C-I> <C-I>
vnoremap <Tab> <Esc>gV
onoremap <Tab> <Esc>
inoremap <Tab> <Esc>`^

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


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