การนำทางในโหมดแทรก


20

hjklในที่สุดผมก็ตัดสินใจที่จะทิ้งปุ่มลูกศรสำหรับการนำทางในความโปรดปรานของ ฉันใช้Vim hardmodeปลั๊กอินเพื่อปิดใช้งานปุ่มลูกศร

ฉันคุ้นเคยกับการนำทางค่อนข้างเร็ว แต่ปรากฎว่าการนำทางในโหมดแทรกนั้นเป็นไปไม่ได้

มีวิธีแก้ปัญหานี้หรือไม่? (โหมดแทรกที่มีอยู่ไม่ใช่วิธีการแก้ปัญหา)


8
ใช่: ใช้ปุ่มลูกศร :-) นั่นคือสิ่งที่พวกเขาทำเพื่อ ;-)
Martin Tournoij

@Carpetsmoker ถ้าปุ่มลูกศรที่มีอยู่ผมจะใช้พวกเขาแทน hjkl ....
stdcall

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

คุณสามารถผูกแป้นพิมพ์เพื่อใช้ลูกศรเป็นทางลัดเช่น <kbd> super </kbd> + <kbd> j </kbd> เพื่อเลื่อนลง <kbd> super </kbd> สามารถเป็นปุ่มใดก็ได้ตัวอย่างเช่น <kbd> Caps Lock </kbd> นั้นค่อนข้างธรรมดา
ivanjermakov

คำตอบ:


26

คุณมีตัวเลือกมากมาย ทางเลือกเดียวและ IMO อย่างปลอดภัยและง่ายที่สุดคือเพียงหยุดการปิดใช้งานปุ่มลูกศร ฉันเข้าใจว่าทำไม vimmers ไม่ยอมใครง่ายๆหลายคนพูดแบบนี้

คุณไม่ควรใช้ปุ่มลูกศรอีกเลย! ทุกครั้งที่คุณใช้ปุ่มลูกศรคุณเสียเวลา 3 นาทีลูกสุนัขตายและมีคนเปลี่ยนไปใช้ Emacs!

(เห็นได้ชัดว่าฉันล้อเล่น) อย่างไรก็ตามมีจุดประสงค์สำหรับปุ่มลูกศร มีประโยชน์อย่างยิ่งสำหรับการนำทาง:

  • ในโหมดแทรก

  • ในบรรทัดคำสั่ง

โดยทั่วไปเมื่อผู้คนบอกคุณว่าไม่ต้องใช้ปุ่มลูกศรนั่นเป็นเพราะพวกเขาต้องการให้คุณเรียนรู้การนำทางในรูปแบบที่คล้าย ๆ หากคุณพอใจhjklและส่วนใหญ่คุณใช้ปุ่มลูกศรในโหมดแทรกไม่มีเหตุผลที่ดีที่จะบังคับให้คุณไม่ใช้มัน

ตัวเลือก # 2 คือการแมปใหม่ctrl-hjklให้ทำหน้าที่เหมือนปุ่มเคอร์เซอร์ นี่เป็นสิ่งที่ดีเพราะคุณสามารถอยู่บ้านได้และมันก็เข้ากันได้ดีกับหน่วยความจำกล้ามเนื้อที่คุณได้เรียนรู้การใช้hjklในโหมดปกติแล้ว ในความเป็นจริงนี้คือสิ่งที่ผมทำ ข้อเสียที่สำคัญของวิธีการนี้คือในอาจเป็นความเจ็บปวดในการติดตั้งใน terminal vim เพราะ<C-j>ผลิตNULไบต์ ฉันได้รับสิ่งนี้โดยใช้ Gvim ฉันไม่ทราบว่ามีการแก้ไขที่ง่ายสำหรับกลุ่มคอนโซลหรือไม่

ตัวเลือก # 3 คือการใช้<C-o>เพื่อทำการเคลื่อนไหวโหมดปกติขนาดเล็ก ตัวอย่างเช่นหากคุณกำลังพิมพ์

Hello world!
     cursor^

และคุณรู้ว่าคุณลืมเครื่องหมายจุลภาคแทนที่จะทำleftleftleftleftleftleftคุณสามารถทำได้<C-o>b<C-o>hหรือ<C-o>2Foหรือการรวมกันของการเคลื่อนไหวโหมดปกติที่คุณต้องการ

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

อาจมีวิธีอื่นด้วยเช่นกัน แต่สิ่งเหล่านี้เป็นวิธีที่ฉันชอบซึ่งได้ผลกับฉัน


2
ที่น่าสนใจ - ผมทราบคุณใช้<c-o>gkและ<c-o>gjแทนและ<Up> <Down>ทำไมถึงเป็นอย่างนั้น?
Kyle Strand

4
@ kylestrand gkและgjมองขึ้นไปบนบรรทัดแม้ว่าบรรทัดนั้นจะถูกพัน
DJMcMayhem

4
ฉันไม่คิดว่ามันจะเพียงพอที่จะรับประกันคำตอบทั้งหมดด้วยตัวเอง แต่ฉันชอบปิดใช้งานปุ่มลูกศรในโหมดปกติ (ซึ่งเป็นสิ่งที่บังคับให้ฉันต้องเรียนรู้ HJKL) และเปิดใช้งานในโหมดอื่น ๆ ทั้งหมด ( noremap <Up> <NOP>... ) . คุณใช้เวลามากพอในโหมดปกติเพื่อเรียนรู้ HJKL แต่จะอยู่ที่นั่นเมื่อคุณต้องการ หรืออย่างน้อยฉันก็พบว่าสิ่งนี้เป็นพื้นกลางที่สะดวกสบายระหว่างการปล่อยให้พวกเขาปิดหรือเปิดตลอดเวลาและมันไม่จำเป็นต้องทำการแมปคีย์อื่น ๆ (ผู้คนจำนวนมากเช่น Ctrl-HJKL สำหรับเคลื่อนย้ายระหว่างบานหน้าต่าง)
Itai Ferber

Btw, BASH และคณะสนับสนุนการเชื่อมโยงปุ่ม vi ด้วยการจับคู่เหล่านี้คุณสามารถ <ESC> และใช้ hjkl เพื่อดูประวัติ cmd (ขึ้น / ลง) หรือดัดแปลงคำสั่งปัจจุบัน (ซ้าย / ขวา)
Rolf

9

ฉันชอบที่จะใช้ปุ่มควบคุมเพื่อเปลี่ยนhjklปุ่มการเคลื่อนไหวเป็นปุ่ม "สากล" นี่คือบิตที่เกี่ยวข้องของฉัน.vimrc:

" In insert or command mode, move normally by using Ctrl
inoremap <C-h> <Left>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-l> <Right>
cnoremap <C-h> <Left>
cnoremap <C-j> <Down>
cnoremap <C-k> <Up>
cnoremap <C-l> <Right>

inoremapงบนำไปใช้กับโหมดแทรกในขณะที่cnoremapคนที่นำไปใช้กับโหมดคำสั่ง (ฉันใช้การแมปนี้มานานจนลืมไปแล้วว่ามีวิธีใดบ้างในการสำรวจประวัติโหมดคำสั่งโดยไม่ใช้หรือไม่)

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


3

กดescจากนั้นใช้hjklและwWbBและการนำทางอื่น ๆ ที่คุณต้องการ จุดแข็งของโหมดยากคือการให้คุณเรียนรู้ที่จะนำทางด้วยการเคลื่อนไหวเป็นกลุ่มที่ซับซ้อนมากขึ้น ทำการแก้ไขเล็กน้อยจากนั้นย้ายไปยังตำแหน่งใหม่โดยใช้โหมดปกติ

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


3

หากคุณต้องการย้ายตำแหน่งมากกว่าหนึ่งหรือสองตำแหน่ง ...

... ทางเลือกที่ดีที่สุดคือการตีESCย้ายไปมาและกลับไปที่โหมดแทรกอีกครั้ง

ไม่มีจุดใดในการสร้างการแมปที่ต้องการ<C-h>เลื่อนไปทางซ้ายแล้วเริ่มกดปุ่มหลายครั้งเกินไป ... ในฐานะผู้ใช้ที่เป็นกลุ่มคุณไม่ควรกดปุ่มเดิมหลาย ๆ ครั้งเพื่อให้เกิดการเคลื่อนไหวที่ชาญฉลาด

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

หากคุณต้องการย้ายหนึ่งหรือสองตำแหน่งในโหมดแทรก ...

... ทางเลือกที่ดีคือการกำหนดการเคลื่อนไหวบางอย่างโดยใช้<Leader>กุญแจของคุณ:

(ฉันใช้,เป็น<Leader>กุญแจสำคัญเนื่องจากรู้สึกใกล้ชิดและนิ้วมือของฉันสบายใจ)

noremap! <Leader>h <left>   "move cursor left
noremap! <Leader>j <down>   "move cursor down
noremap! <Leader>k <up>     "move cursor up   
noremap! <Leader>l <right>  "move cursor right
noremap! <Leader>w <esc>wi  "move one word forward
noremap! <Leader>e <esc>ei  "move forward to the end of word
noremap! <Leader>b <esc>bi  "move one word backward

1

หากคุณเพียงแค่ต้องปรับเปลี่ยนจำนวนเล็ก ๆ <Ctrl-O>h/j/k/lของข้อความหรือคำที่คุณสามารถใช้

<Ctrl-O> นำคุณกลับสู่โหมดปกติสำหรับคำสั่งนั้นจากนั้นปล่อยคุณกลับสู่โหมดแทรกดังนั้นจึงช่วยให้คุณสามารถกดปุ่มได้จำนวนหนึ่งหากคุณจำเป็นต้องเข้าสู่โหมดปกติสำหรับการเคลื่อนไหวเล็ก ๆ

Ref: 1. http://vim.wikia.com/wiki/Use_Ctrl-O_instead_of_Esc_in_insert_mode_mappings

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