การข้ามข้อความในโหมดแทรก


321

ขณะที่อยู่ในโหมดแทรกใน Vim มีวิธีใดบ้างที่จะข้ามข้อความที่ย้ายตัวละครบางตัวไปข้างหน้าและข้างหลังนอกเหนือจากการใช้ปุ่มลูกศร?

ถ้าผมกดh, j, kและlขณะอยู่ในโหมดแทรกตัวละครที่เกิดขึ้นจริงจะพิมพ์บนหน้าจอแทนการย้ายผ่านข้อความ

วิธีที่ฉันทำในขณะนี้คือต้องหันไปใช้Ctrl+ [( Esc) และข้ามไปตามเนื้อความในตอนนั้น แต่เห็นได้ชัดว่าไม่ได้ผล


ในฐานะที่เป็นเคล็ดลับนอกเหนือจากนี้: มันยังมีประโยชน์ถ้าคุณทำแผนที่หลบหนีไปยังรหัสผสมที่ใกล้กว่า (เช่นimap jk <Esc>) เพื่อที่คุณจะได้ไม่ต้องเสียโมเมนตัมของคุณและเข้าถึงแป้นพิมพ์ของคุณเพื่อกดปุ่ม
tsujin

3
ฉันชอบมัน ( <ESC>) แมปไปที่kjแทนที่จะjk; เพื่อนของฉันDijkstraคือการตำหนิ!
ดร. Beco

7
ฉันมีjkและkjดังนั้นฉันเพียงกดมันเหมือนปุ่มใหญ่ด้วยสองนิ้วและไม่สำคัญว่าฉันจะกลับมาเป็นปกติ
Edu Ruiz

คำตอบ:


648

ดูเหมือนว่าคุณจะใช้กลุ่มที่ไม่เหมาะสม แต่อาจเป็นเพราะไม่คุ้นเคยกับมันมากนัก

วิธีที่ถูกต้องคือกดEscไปที่ที่คุณต้องการทำการแก้ไขเล็ก ๆ น้อย ๆ แก้ไขกลับไปและแก้ไขต่อไป มันมีประสิทธิภาพเพราะเสียงเรียกเข้ามีการเคลื่อนไหวมากกว่าตัวละครปกติไปข้างหน้า / ถอยหลัง / ขึ้น / ลง หลังจากคุณเรียนรู้เพิ่มเติมแล้วสิ่งนี้จะเกิดขึ้นได้มากขึ้น

นี่คือกรณีการใช้งานสองสามกรณี:

  • คุณพิมพ์ "ตั้งใจ" โดยไม่ได้ตั้งใจ ไม่มีปัญหาลำดับEscFfrdAจะแก้ไขข้อผิดพลาดและนำคุณกลับไปยังตำแหน่งที่คุณแก้ไข การFfเคลื่อนไหวจะเลื่อนเคอร์เซอร์ของคุณไปด้านหลังไปยังอักขระ "f" ตัวแรกที่พบ เปรียบเทียบกับCtrl+ DeldEndซึ่งทำหน้าที่เหมือนกันในโปรแกรมแก้ไขทั่วไป แต่ใช้การกดแป้นมากกว่าและทำให้คุณขยับมือออกจากบริเวณตัวอักษรและตัวเลขของแป้นพิมพ์
  • คุณพิมพ์โดยไม่ได้ตั้งใจ "คุณพิมพ์โดยไม่ได้ตั้งใจ" แต่ต้องการแก้ไขให้เป็น "คุณพิมพ์โดยเจตนา" จากนั้นEsc2bcwจะลบคำที่คุณต้องการแก้ไขและนำคุณเข้าสู่โหมดแทรกเพื่อให้คุณสามารถพิมพ์ซ้ำได้ทันที ในการกลับสู่การแก้ไขเพียงกดAแทนEndดังนั้นคุณจึงไม่ต้องขยับมือเพื่อไปถึงEndกุญแจ
  • คุณพิมพ์ "เมาส์" โดยไม่ตั้งใจแทน "เมาส์" ไม่มีปัญหา - ดีCtrl+ เก่าwจะลบคำก่อนหน้าโดยไม่ต้องออกจากโหมดแทรก และมันจะเร็วกว่ามากในการลบคำเล็ก ๆ ออกไปเพื่อแก้ไขข้อผิดพลาดภายใน ฉันเคยชินกับมันว่าฉันได้ปิดหน้าเบราว์เซอร์เมื่อฉันพิมพ์ข้อความนี้ ... !
  • จำนวนการทำซ้ำส่วนใหญ่จะใช้น้อย ก่อนที่จะทำการเคลื่อนที่คุณสามารถพิมพ์ตัวเลข และการเคลื่อนไหวจะถูกทำซ้ำจำนวนครั้งนี้ ตัวอย่างเช่น15hจะนำเคอร์เซอร์ของคุณ 15 ตัวกลับมาและ4j จะเลื่อนเคอร์เซอร์ลง 4 บรรทัด เริ่มใช้พวกมันแล้วคุณจะคุ้นเคยกับมันในไม่ช้า หากคุณทำผิดพลาดสิบตัวอักษรกลับมาจากเคอร์เซอร์คุณจะพบว่าการกดปุ่ม10 ครั้งนั้นช้ากว่าการเลื่อนเคอร์เซอร์ซ้ำมาก ดังนั้นคุณสามารถพิมพ์คีย์ได้อย่างรวดเร็ว12h(โดยคร่าว ๆ ว่าคุณต้องเลื่อนเคอร์เซอร์ไปกี่ตัว) และเลื่อนไปข้างหน้าสองครั้งllเพื่อแก้ไขข้อผิดพลาดอย่างรวดเร็ว

แต่ถ้าคุณยังคงต้องการที่จะทำ traversals ข้อความขนาดเล็กโดยไม่ต้องออกโหมดแทรกทำตามrson 's คำแนะนำและการใช้งาน+Ctrl Oจากตัวอย่างแรกที่ฉันได้กล่าวถึงข้างต้นCtrl+ OFfจะย้ายคุณไปยังอักขระ "f" ก่อนหน้าและปล่อยให้คุณอยู่ในโหมดแทรก


33
+1 คำตอบที่ยอดเยี่ยมและขอบคุณสำหรับตัวอย่างทั้งหมดที่คุณให้!
Andreas Grech

79
นอกจากนี้ยังเป็นที่น่าสังเกตว่าคุณสามารถใช้Ctrl+oเพื่อออกคำสั่งเดียวในโหมดปกติ บางครั้งสิ่งนี้จะช่วยให้คุณได้รับสิ่งที่คุณต้องการโดยเฉพาะเมื่อรวมกับคำสั่งการเคลื่อนไหว t / T และ f / F
แรนดี้มอร์ริส

6
"คุณดูเหมือนจะใช้ vim ในทางที่ผิด แต่เป็นไปได้ว่าคุณไม่คุ้นเคยกับมันมากนัก" เป็นการวางตัวเล็กน้อย ไม่มี?
David Rivers

17
นี่เป็นข้อมูลเชิงลึกที่ยอดเยี่ยมเกี่ยวกับวิธีใช้ Vim อย่างถูกต้อง อย่างไรก็ตามฉันพบว่าการกด "Esc" เป็นความเจ็บปวดและฉันคิดว่ามันคุ้มค่าที่จะชี้ให้เห็นว่าคุณสามารถแมปคีย์ที่เข้าถึงได้ง่ายขึ้นไปยังฟังก์ชันนั้นเช่น "imap jj <esc>"
สมมาตร

25
เพื่อแก้ไขการพิมพ์ผิดคุณไม่ควรออกจากโหมดแทรก เป็นกลุ่มที่มีประสิทธิภาพเพราะคุณสร้างการกระทำปรมาณูทำซ้ำได้ การแทรกคำที่พิมพ์ผิดและการแก้ไขจะสร้างการกระทำสองอย่างแยกกัน วิธีที่ถูกต้องในการแก้ไขการพิมพ์ที่ผิดพลาดโดยไม่ต้องออกจากโหมดแทรก หากหมายถึงการใช้ปุ่มลูกศรเพื่อไปที่นั่นก็ไม่เป็นไร กลุ่มมีปุ่มลัดสำหรับนำทางในโหมดแทรก :h ins-special-keysตรวจสอบ ctrl-h: backspace,: ctrl-wลบคำ, ctrl-u: ลบไปยังจุดเริ่มต้นของบรรทัดalt-b: กลับไปที่คำ
everett1992

152

ขณะอยู่ในโหมดแทรกให้ใช้CtrlOเพื่อไปยังโหมดปกติสำหรับคำสั่งเดียว:

CTRL-O h  move cursor left 
CTRL-O l  move cursor right
CTRL-O j  move cursor down
CTRL-O k  move cursor up

ซึ่งอาจเป็นวิธีที่ง่ายที่สุดในการทำสิ่งที่คุณต้องการและจดจำได้ง่าย

ปุ่มควบคุมที่มีประโยชน์อื่น ๆ ในโหมดแทรก:

CTRL-W    delete word to the left of cursor
CTRL-O D  delete everything to the right of cursor
CTRL-U    delete everything to the left of cursor
CTRL-H    backspace/delete
CTRL-J    insert newline (easier than reaching for the return key)
CTRL-T    indent current line
CTRL-D    un-indent current line

สิ่งเหล่านี้จะกำจัดสวิตช์ที่สิ้นเปลืองจำนวนมากกลับสู่โหมดปกติ


13
ขอบคุณ. นี่ควรเป็นคำตอบที่ถูกต้อง มันมีประโยชน์จริง ๆ
Atcold

1
สำหรับ mac ของฉันมันเป็นตัวพิมพ์เล็ก o ไม่ใช่ตัวพิมพ์ใหญ่ O. นั้นแตกต่างจาก "Standard vim" หรือไม่? ฉันเห็นสถานที่มากมายที่พวกเขาดูเหมือนจะพูดตัวพิมพ์ใหญ่ (ยกเว้นว่าเป็นเพียงการเขียนเลอะเทอะ) คุณยืนยันได้ไหม
Floris

ตกลงมีประโยชน์มาก อย่างไรก็ตามชุดค่าผสมที่น่าสนใจฉันมีเวลาหายากและนี่คือการลบบรรทัด มีการประเมินค่าต่ำมากในกรณีที่มีการแทรกบรรทัดโดยไม่ตั้งใจ
patrik

5
@Floris Vim ไม่แยกความแตกต่างระหว่างตัวอักษรตัวใหญ่และตัวเล็กสำหรับการรวม ctrl นั่นเป็นเหตุผลที่ไม่สามารถแมป ctrl + shift + บางสิ่งได้
Mahmoud Al-Qudsi

92

โหมดแทรก

การเคลื่อนไหว

hjkl

แม้จะมีสิ่งที่ Pavel Shved กล่าวไว้ว่าควรใช้ความคุ้นเคยกับEscaping โหมดแทรก - นี่เป็นตัวอย่างของการแม็พสำหรับการนำทางอย่างรวดเร็วภายในโหมดแทรก:

" provide hjkl movements in Insert mode via the <Alt> modifier key
inoremap <A-h> <C-o>h
inoremap <A-j> <C-o>j
inoremap <A-k> <C-o>k
inoremap <A-l> <C-o>l

สิ่งนี้จะทำให้Alt+ hในโหมดแทรกไปทางซ้ายอักขระหนึ่งตัวAlt+ jลงไปhjklเรื่อย ๆ ตามลำดับในโหมดปกติ

คุณต้องคัดลอกรหัสนั้นลงในไฟล์ vimrc ของคุณเพื่อโหลดมันทุกครั้งที่คุณเริ่มใช้ vim (คุณสามารถเปิดได้โดยพิมพ์การ:new $myvimrcเริ่มต้นในโหมดปกติ)


การเคลื่อนไหวในโหมดปกติใด ๆ

เนื่องจากAltคีย์ตัวดัดแปลงไม่ได้ถูกแมป (เป็นสิ่งที่สำคัญ) โดยค่าเริ่มต้นคุณสามารถดึงฟังก์ชันการทำงานอื่น ๆ (หรือทั้งหมด) แบบเดียวกันจากโหมดปกติไปยังโหมดแทรก เช่น
การย้ายไปยังจุดเริ่มต้นของคำปัจจุบันด้วยAlt+ b:

inoremap <A-b> <C-o>b
inoremap <A-w> <C-o>w


(การใช้งานอื่น ๆ ของAltในโหมดแทรก)

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

" Insert the rest of the line below the cursor.
" Mnemonic: Elevate characters from below line
inoremap <A-e> 
    \<Esc>
    \jl
        \y$
    \hk
        \p
        \a
" Insert the rest of the line above the cursor.
" Mnemonic:  Y depicts a funnel, through which the above line's characters pour onto the current line.
inoremap <A-y> 
    \<Esc>
    \kl
        \y$
    \hj
        \p
        \a

(ฉันใช้การ\ ต่อเนื่องบรรทัดและการเยื้องเพื่อเพิ่มความชัดเจน - คำสั่งถูกตีความราวกับว่าเขียนในบรรทัดเดียว)


ปุ่มลัดในตัวสำหรับการแก้ไข

CTRL-H   delete the character  in front of the cursor (same as <Backspace>)
CTRL-W   delete the word       in front of the cursor
CTRL-U   delete all characters in front of the cursor (influenced by the 'backspace' option)

(ไม่มีปุ่มลัดในตัวที่โดดเด่นสำหรับการเคลื่อนไหวในโหมดแทรก)

อ้างอิง: :help insert-index


โหมดบรรทัดคำสั่ง

ชุดของการแมปนี้ทำให้มีการเคลื่อนไหวAlt + ด้านบนในบรรทัดคำสั่ง:hjkl

" provide hjkl movements in Command-line mode via the <Alt> modifier key
cnoremap <A-h> <Left>
cnoremap <A-j> <Down>
cnoremap <A-k> <Up>
cnoremap <A-l> <Right>

หรือมิฉะนั้นการแมปเหล่านี้จะเพิ่มการเคลื่อนไหวทั้งในโหมดแทรกและโหมดบรรทัดคำสั่งในคราวเดียว:

" provide hjkl movements in Insert mode and Command-line mode via the <Alt> modifier key
noremap! <A-h> <Left>
noremap! <A-j> <Down>
noremap! <A-k> <Up>
noremap! <A-l> <Right>


คำสั่งการแมปสำหรับการดึงคำสั่งโหมดปกติไปยังโหมดบรรทัดคำสั่งดูแตกต่างจากคำสั่งการแมปโหมดแทรก (เนื่องจากโหมดบรรทัดคำสั่งขาดโหมดแทรกCtrl+ O):

" Normal mode command(s) go… --v <-- here
cnoremap <expr> <A-h> &cedit. 'h' .'<C-c>'
cnoremap <expr> <A-j> &cedit. 'j' .'<C-c>'
cnoremap <expr> <A-k> &cedit. 'k' .'<C-c>'
cnoremap <expr> <A-l> &cedit. 'l' .'<C-c>'

cnoremap <expr> <A-b> &cedit. 'b' .'<C-c>'
cnoremap <expr> <A-w> &cedit. 'w' .'<C-c>'


ปุ่มลัดในตัวสำหรับการเคลื่อนไหวและการแก้ไข

CTRL-B       cursor to beginning of command-line
CTRL-E       cursor to end       of command-line

CTRL-F       opens the command-line window (unless a different key is specified in 'cedit')

CTRL-H       delete the character  in front of the cursor (same as <Backspace>)
CTRL-W       delete the word       in front of the cursor
CTRL-U       delete all characters in front of the cursor

CTRL-P       recall previous command-line from history (that matches pattern in front of the cursor)
CTRL-N       recall next     command-line from history (that matches pattern in front of the cursor)
<Up>         recall previous command-line from history (that matches pattern in front of the cursor)
<Down>       recall next     command-line from history (that matches pattern in front of the cursor)
<S-Up>       recall previous command-line from history
<S-Down>     recall next     command-line from history
<PageUp>     recall previous command-line from history
<PageDown>   recall next     command-line from history

<S-Left>     cursor one word left
<C-Left>     cursor one word left
<S-Right>    cursor one word right
<C-Right>    cursor one word right

<LeftMouse>  cursor at mouse click

อ้างอิง: :help ex-edit-index


@YovelJindle: ขอบคุณ! :) ฉันได้เพิ่มข้อมูลเกี่ยวกับการปรับเปลี่ยนโหมดบรรทัดคำสั่ง (วิธีนี้แตกต่างจากโหมดแทรกเล็กน้อย)
Aaron Thoma

@ เซน: คุณหมายถึงอะไรโดย "winkey" ฉันไม่ได้อ้างอิงคีย์ Windows ในคำตอบของฉัน คุณหมายถึงAltกุญแจหรือไม่
Aaron Thoma

Shift - ซ้าย / ขวาเพื่อย้ายทั้งคำ !! ฉันไม่รู้ได้อย่างไรว่า ขอบคุณ.
Floris

จริง ๆ แล้วในโหมดเทอร์มินัล alt ส่ง esc โดยอัตโนมัติก่อนคำสั่งของคุณ ........
Fuseteam

26

หากคุณเป็นคนเจ้าเล่ห์ให้ข้ามไปอ่านคำตอบนี้ OTOH ถ้าคุณยังใหม่ต่อกลุ่มและกำลังมองหาเคล็ดลับที่เป็นประโยชน์ที่คุณไม่เคยพบในบทเรียนและบล็อกกลุ่มไอเอ็มเอฟหลายร้อยอ่านใน ... :-)

วิธี un-orthodox (vim) สองสามวิธี

มันคือปี 2014 และในฐานะคนที่เพิ่งกลับมาที่vimฉันเมื่อเร็ว ๆ นี้ฉันสามารถเสนอมุมมองและเคล็ดลับบางอย่างที่อาจขัดแย้ง

ใช้ shift + left หรือ shift + right เพื่อสำรวจคำ

ในขณะที่การทำซ้ำเป็นแนวคิดที่ทรงพลังในเสียงเรียกเข้าฉัน (ส่วนตัว) พบว่ามันแปลกที่การใช้มันอาจบังคับให้ฉันนับ (บรรทัดตัวอักษรคำพูด ฯลฯ ) หรือคาดเดา สมองของฉันมักจะทำงานเหมือน "ฉันต้องการเคอร์เซอร์อยู่ที่นั่น " และไม่ชอบ "ฉันต้องการเคอร์เซอร์ _5_words_to_the_left_" ความสามารถในการเลื่อนเคอร์เซอร์อย่างรวดเร็วและสังเกตด้วยตาที่จุดแทรกด้วยวิธีนี้ทำให้ฉันสามารถคำนึงถึงสิ่งที่ฉันกำลังแก้ไขแทนที่จะต้องนับจำนวนฮ็อพที่ฉันต้องทำเพื่อไปยังที่ที่ฉันต้องการแก้ไข

เปิดโหมดเมาส์และใช้ล้อเมาส์และคลิก

... เพื่อนำทางเนื้อหาขนาดใหญ่

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

ในฐานะโบนัสคลิก + ลากทำให้คุณอยู่ในโหมดภาพ

เมื่อเปิดใช้งานเมาส์การคลิกและการลากจะมีผลต่อการสลับไปยังโหมดแสดงภาพและทำเครื่องหมายพื้นที่สำหรับ yanking

และใช้ล้อเลื่อน

ใช้เมาส์ (ล้อ) เพื่อเลื่อนไปรอบ ๆ และคลิกเพื่อจัดตำแหน่งเคอร์เซอร์ (duh) ใช้งานได้ ดูhttp://usevim.com/2012/05/16/mouse/สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้

และดังนั้น ...

นี่คือสิ่งที่ฉันเรียกว่าทันสมัยกว่า (โดยใช้เมาส์ล้อเลื่อนและอื่น ๆ ) วิธีการนำทางที่เป็นกลุ่มมีประสิทธิภาพเท่ากันขึ้นอยู่กับความชอบของคุณในการป้อนข้อมูล

HTH


6
@MilesRout ใช่ฉันมีข้อจำกัดความรับผิดชอบ แต่ในความร้ายแรงทั้งหมดฉันคิดว่ามีสัดส่วนที่ดีของผู้ใช้ที่เป็นกลุ่มที่สมองทำงานเหมือนกับฉัน นั่นคือ ... สมองของฉันมักจะทำงานเหมือน "ฉันต้องการเคอร์เซอร์อยู่ที่นั่น" และไม่ชอบ "ฉันต้องการเคอร์เซอร์5_words_to_the_left " และวิธีการทั่วไปของเสียงเรียกเข้าไม่ได้ผลดีสำหรับคนเหล่านั้น ฉันชอบเป็นกลุ่มเพราะก) มันมีให้ทุกที่และข) มีคุณสมบัติที่ทรงพลัง อย่างไรก็ตามฉันไม่รู้สึกว่าจำเป็นต้องปฏิบัติตามกลไกการตั้งค่าเริ่มต้นทั้งหมด
Shyam Habarakada

4
@MilesRout มีศาสนามากมายรอบ ๆ สิ่งนี้เป็นกลุ่มดังนั้นฉันจะไม่เถียงกับคุณในเรื่องนี้ วิธีการนับการทำซ้ำไม่ได้ช่วยฉันและคำตอบที่ยอมรับก็เรียกมันว่าเป็นสิ่งที่ใช้อย่างหนักน้อยเกินไป ฉันสามารถเดาได้ว่าทำไมถึงเป็นเช่นนั้น การใช้ w, b ฯลฯ สำหรับการนำทางไปยังสถานที่ใกล้เคียงนั้นยอดเยี่ยมมาก แต่สำหรับการก้าวต่อไปล้อเลื่อนของเมาส์ทำงานได้ดีขึ้นมากสำหรับฉัน ไชโย
Shyam Habarakada

4
+1 ฉันไม่เข้าใจการลงคะแนน มีข้อจำกัดความรับผิดชอบ เอาไปถ้าคุณชอบมันและข้ามมันถ้าคุณไม่
fangmobile.com

นี่เป็นคำตอบที่เป็นประโยชน์มาก
Slava

1
ในฐานะที่เป็นคนที่เพิ่งย้ายไปเป็นกลุ่ม VIM ฉันพบว่าหลักฐานของคำตอบนี้เป็นจุดที่แน่นอนความสามารถในการบอกจำนวนการซ้ำที่จำเป็นเพื่อวางตำแหน่งเคอร์เซอร์ในจุดที่กำหนดอาจหรืออาจไม่ใช่สิ่งที่มาพร้อมกับ ประสบการณ์. ตอนนี้ @ShyamHabarakada มากสมองของฉันก็ไม่ทำงานเช่นนั้น ไม่ว่ามันจะเป็นเรื่องที่ไม่เป็นไปได้เช่นไรฉันก็ทำการแมป fn + hjkl ใหม่กับปุ่มลูกศรเพื่อการเคลื่อนไหวที่เล็กมาก สำหรับการเคลื่อนไหวครั้งใหญ่ฉันมักจะประมาณจำนวนครั้งของการเกิดซ้ำและจากนั้นปรับกับสิ่งเหล่านั้น สำหรับฉันนั่นเป็นวิธีที่เร็วที่สุดที่ฉันจะทำได้
Jacoscaz

14

ผู้คนจำนวนมากในชุมชน Vim ให้เหตุผลว่าคุณไม่ควรนำทางในโหมดแทรกว่าไม่ใช่วิธี Vim ฉันคิดว่านี่เป็นความรู้สึกที่ไม่ถูกต้องที่เรียนรู้เมื่อเปลี่ยนจากตัวแก้ไขมาตรฐานเป็นกลุ่ม

Vim นั้นมีประสิทธิภาพมากที่สุดเมื่อคุณใช้เครื่องมือในการสร้างปรมาณู, การกระทำซ้ำหรือการค้นหา

คุณสามารถนำทางในขณะที่อยู่ในโหมดแทรกได้หากคุณแก้ไขข้อผิดพลาดที่คุณทำในส่วนแทรกเดียวกัน คุณไม่ควรนำทางนอกช่วงข้อความที่คุณแก้ไข

หากคุณทำผิดพลาดในขณะที่ป้อนข้อความและออกจากโหมดแทรกเพื่อแก้ไขคุณจะไม่สามารถทำซ้ำตามที่ตั้งใจได้.จะทำการแก้ไขซ้ำ

Vim รองรับคีย์การนำทางในโหมดแทรกจำนวนมาก เห็นได้ชัดว่ามีปุ่มลูกศรบ้านและสิ้นสุด แต่ยังมีทางลัดอื่น ๆ อีกมากมาย :h ins-special-keysดู


4

ใน GVim คุณสามารถใช้เมาส์ได้ แต่อย่างสุจริตมีอะไรผิดปกติกับการใช้ปุ่มลูกศร? มีเหตุผลที่พวกเขาอยู่บนแป้นพิมพ์


9
แต่เหตุผลนั้นไม่รองรับผู้ใช้กลุ่ม จุดแข็งจุดแข็งจุดหนึ่งของศูนย์กลางคือคุณสามารถทำทุกสิ่งได้โดยไม่ต้องละมือจากแถวบ้านของแป้นพิมพ์ โดยเฉพาะอย่างยิ่งการเคลื่อนไหว hjkl
Aaron Thoma

1
ฉันเห็นด้วยกับ @ammoQ ไม่มีอะไรผิดปกติกับการใช้ปุ่มลูกศร หากใช้ปุ่มลูกศรให้ผลผลิตเพิ่มขึ้นให้ไปกับมัน
อึนวูซอง

accolade: ฉันใช้ hjkl บ่อยกว่าปุ่มลูกศรเมื่อใช้ vi แต่การสลับระหว่างโหมดกลายเป็นการกระทำจิตใต้สำนึกสำหรับฉัน
Erich Kitzmueller

4

หากต้องการการนำทางที่ดีขึ้นเล็กน้อยในโหมดแทรกทำไมไม่จับคู่ปุ่มบางปุ่ม

imap <C-b> <Left>
imap <C-f> <Right>
imap <C-e> <End>
imap <C-a> <Home>
" <C-a> is used to repeat last entered text. Override it, if its not needed

หากคุณสามารถหลีกเลี่ยงการทำให้คีย์ Meta ทำงานในเทอร์มินัลของคุณคุณสามารถเลียนแบบโหมด emacs ได้ดียิ่งขึ้น การนำทางในโหมดปกติดีกว่า แต่การเคลื่อนไหวที่สั้นลงจะช่วยให้อยู่ในโหมดแทรกได้

สำหรับการข้ามที่นานขึ้นฉันชอบการแปลเริ่มต้นต่อไปนี้:

<Meta-b>    maps to     <Esc><C-left>

สิ่งนี้จะเลื่อนไปที่โหมดปกติและกลับคำ


2

ฉันเชื่อHomeและEnd(และPageUp/ PageDn) ยังทำงานได้ตามปกติขณะอยู่ในโหมดแทรก แต่นอกเหนือจากนั้นฉันไม่เชื่อว่ามีปุ่มมาตรฐานอื่น ๆ ที่กำหนดไว้สำหรับการข้ามผ่านข้อความ


แต่อาจเป็นไปได้ว่าไม่มีวิธีใดในการสำรวจข้อความโดยใช้ปุ่มตัวอักษรเท่านั้น?
Andreas Grech

5
แน่นอนว่ามีคือถ้าคุณไม่ต้องการที่จะสามารถที่จะพิมพ์ตัวอักษรบางอย่าง ... ;)
ฮอบส์

@hobbs แล้ว ctrl + hjkl ล่ะ? นั่นควรสมเหตุสมผล
user4052054

1

ขออภัยเป็นกลุ่มไม่ได้ทำงานอย่างนั้น

คุณควรเปลี่ยนเป็นโหมด "ปกติ" นำทางจากนั้นกลับไปแทรกอีกครั้ง


1

คุณสามารถสร้างการแมปที่ทำงานในโหมดแทรก วิธีการทำเช่นนั้นคือผ่าน inoremap หมายเหตุ 'i' ที่จุดเริ่มต้นของคำสั่ง (noremap มีประโยชน์ในการหลีกเลี่ยงการชนแผนที่ที่สำคัญ) ข้อสรุปคือ 'n' สำหรับโหมด 'ปกติ' คุณสามารถคาดเดาได้ว่ากลุ่มที่คิดว่าเป็น 'ปกติ';)

อย่างไรก็ตามคุณต้องการนำทางไปรอบ ๆ ในข้อความโดยใช้โหมด 'ปกติ' เสียงเรียกเข้าเป็นสิ่งที่ยอดเยี่ยมสำหรับสิ่งนี้และพลังทั้งหมดนั้นมีให้ในโหมดปกติ เป็นกลุ่มแล้วมีวิธีง่าย ๆ ที่จะได้รับจากโหมดปกติเพื่อแทรกโหมด (เช่น i, I, a, A, A, o, O) เคล็ดลับคือการทำให้ง่ายต่อการเข้าสู่โหมดปกติ วิธีที่จะทำเช่นนั้นคือทำการแมปหลบหนีไปยังกุญแจที่สะดวกสบายมากขึ้น แต่คุณต้องการสิ่งที่ไม่ขัดแย้งกับการพิมพ์ปกติของคุณ ฉันใช้:

inoremap jj <Esc>

ตั้งแต่ jj (นั่นคือ 2 j พิมพ์ทีละอันอย่างรวดเร็ว) ดูเหมือนจะไม่ปรากฏในคำศัพท์ของฉัน อื่น ๆ จะทำการแมปไปยังที่ที่สะดวกสบาย

การเปลี่ยนแปลงที่สำคัญอื่น ๆ ที่ฉันทำคือการเปลี่ยนปุ่ม CAPSLOCK และปุ่มควบคุมบนแป้นพิมพ์ของฉัน (โดยใช้การกำหนดค่าแป้นพิมพ์ของโฮสต์คอมพิวเตอร์) เนื่องจากฉันแทบจะไม่เคยใช้ CAPSLOCK และมีปุ่มขนาดใหญ่ที่สวยงามตรงที่ฉันต้องการ (นี่เป็นเรื่องปกติสำหรับผู้ใช้ Emacs ข้อเสียคือเมื่อคุณพบว่าตัวเองอยู่บนแป้นพิมพ์ 'ไม่รวม'! Aaarggh!)

เมื่อคุณทำการแมปใหม่ CAPSLOCK คุณสามารถใช้การแมปโหมดแทรกต่อไปนี้ได้อย่างสะดวกสบาย:

โปรดทราบว่าบางปุ่มถูกแมปไว้ในโหมดแทรกแล้ว (backward-kill-word คือ Cw (Control-w) โดยค่าเริ่มต้นคุณอาจมีการผูกที่คุณต้องการอยู่แล้วกล่าวว่าฉันชอบ Ch ดังนั้นใน. vimrc ของฉัน :

inoremap <C-h> <C-w>

แต่คุณอาจต้องการกระตุกกล้ามเนื้อหน่วยความจำเดียวกันในโหมดปกติดังนั้นฉันแมป Ch เป็น:

nnoremap <C-h> db

(d) elete (b) ackwards บรรลุสิ่งเดียวกันด้วยคอร์ดคีย์เดียวกัน การแก้ไขอย่างรวดเร็วประเภทนี้เป็นสิ่งที่ฉันพบว่ามีประโยชน์ในทางปฏิบัติสำหรับการพิมพ์ผิด แต่ยึดติดกับโหมดปกติสำหรับการเลื่อนไปมาในข้อความและมีอะไรมากกว่าการฆ่าคำก่อนหน้า เมื่อคุณเข้าสู่นิสัยของการเปลี่ยนโหมด (โดยใช้การแมปแน่นอน) มันจะมีประสิทธิภาพมากกว่าโหมดแทรกการแมปใหม่


การแมปที่ดีสำหรับการหลบหนี - ฉันคิดว่ามันจะทำงานได้ทุกอย่างยกเว้นภาษาอาหรับทับศัพท์!
jjt

0

คุณสามารถใช้imapเพื่อแมปคีย์ใด ๆ ในโหมดแทรกกับหนึ่งในเคอร์เซอร์คีย์ ชอบมาก

imap h <Left>

ตอนนี้ทำงานได้เหมือนในโหมดปกติเลื่อนเคอร์เซอร์ (การแมป h ด้วยวิธีนี้เห็นได้ชัดว่าเป็นตัวเลือกที่ไม่ดี)

ต้องบอกว่าฉันไม่คิดว่าวิธีมาตรฐานในการเคลื่อนย้ายในข้อความโดยใช้ VIM คือ "ไม่ได้ผล" มีวิธีที่มีประสิทธิภาพมากในการสำรวจข้อความในโหมดปกติ (เช่นใช้ w และ b หรือ / และ? หรือ f และ F และอื่น ๆ )


1
ฉันไม่ได้บอกว่าวิธีมาตรฐานในการเคลื่อนย้ายข้อความในกลุ่มไม่มีประสิทธิภาพ สิ่งที่ฉันพูดก็คือมันค่อนข้าง "น่ารำคาญ" ที่ต้องออกจากโหมดแทรกเพื่อย้อนตัวละครไปสองสามตัวแล้วต้องกลับไปแทรกอีกครั้ง แต่แล้วอีกครั้งอาจจะเป็นเพราะผมยังไม่ได้ใช้มากทีเดียวที่จะเป็นกลุ่มเลย :)
Andreas Grech

นี่คือทางออกที่ฉันกำลังมองหา ฉันใช้ imap <Ch> <Left> (ฉันรู้ว่ามันลบตัวอักษร แต่ฉันมี backspace) ซึ่งเป็นสิ่งที่ฉันต้องการขอบคุณ
user4052054

0

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

inoremap <A-$> <C-o>$
inoremap <A-^> <C-o>^
inoremap <A-h> <Left>
inoremap <A-l> <Right>
inoremap <A-O> <C-O>O
inoremap <A-o> <C-o>o
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.