VIM Super Fast Navigation


92

สิ่งเดียวที่ฉันพลาดเกี่ยวกับการใช้โปรแกรมแก้ไขอื่น ๆ คือการค้นหาตำแหน่งของฉันด้วยเมาส์ ฉันสามารถมองไปยังพื้นที่เฉพาะบนไฟล์ด้วยการเคลื่อนไหวของเมาส์และคลิกฉันก็อยู่ที่นั่น ด้วย VIM ฉันต้อง jjjjjkkkkkkjjjjhhhh ... เกือบจะมีแล้วโอ้อึฉันพลาด 3 ตัวอักษร lll

ฉันกำลังเรียนรู้ที่จะทำเครื่องหมายและฉันพบปลั๊กอินบุ๊กมาร์กที่ยอดเยี่ยมฉันสามารถสร้างเครื่องหมายและทำลายมันด้วย<f3>และนำทางไปยังเครื่องหมายเหล่านั้นโดยขออภัยที่ลืมเครื่องหมายเมื่อไฟล์ถูกปิด

คุณทั้งหมดนำทางไฟล์ได้อย่างไร? ฉันรู้ว่าฉันสามารถทำ 5j7k4j5h และอื่น ๆ ได้ แต่ต้องมีปลั๊กอินที่สามารถอ่านสายตาของฉันและวางเคอร์เซอร์ในที่ที่ฉันต้องการจริงๆ ..

ฉันยังได้เรียนรู้การใช้ /% เพื่อค้นหาคำที่ต้องการ มันช่วยได้ แต่อักขระที่ตรงกันทั้งหมดจะถูกเน้นผ่านเอกสาร


คำตอบที่ดีทั้งหมดในขณะที่เรายังอยู่ในหัวข้อที่ฉันคิดว่าฉันสามารถทดลองกับบางสิ่งเช่น nG (ไปที่หมายเลขบรรทัด) f% (ค้นหาอักขระตัวแรกของสิ่งที่ฉันกำลังมองหาหรือตามที่บางคนแนะนำให้ใช้ w เพื่อก้าวไปข้างหน้า ไปยังคำถัดไป
Helmut Granda

คำตอบ:


174

ลอง$ vimtutorมันจะสอนทุกสิ่งที่คุณจำเป็นต้องรู้เพื่อเริ่มต้น

hjkl เป็นส่วนปลายสุดของภูเขาน้ำแข็งและไม่ค่อยมีใครใช้อย่างน้อยในกรณีของฉัน

wWEeและBbgegEทั้งหมดอนุญาตให้ย้ายทีละคำ:

  • wและeก้าวไปข้างหน้าWและEคำนึงถึงช่องว่างและเครื่องหมายวรรคตอน

    " here the * marks the default location of the cursor
    " and each letter shows where you jump when you hit the key.
    
    Latin: Lorem ipsum dolor sit amet.
                       *   e   e    e
                       *   E   E     E
    *    w w     w     w     w   w   w
    *      W     W     W     W   W   W
    
  • bและgeย้อนกลับBและgEคำนึงถึงช่องว่างและเครื่องหมายวรรคตอน

    Latin: Lorem ipsum dolor sit amet.
    b    b b     b     *
    B      B     B     *
         ge    ge    ge*
        ge
         gE    gE    gE*
    

fFtTใช้เพื่อเข้าถึงอักขระเฉพาะในบรรทัดปัจจุบันและ;,ใช้เพื่อทำซ้ำการเคลื่อนไหวนั้นในทิศทางเดียวกันสำหรับ;และในทิศทางตรงกันข้ามสำหรับ,:

  • fmกระโดดไปmข้างหน้าและFถอยหลัง

    Latin: Lorem ipsum dolor sit amet.
    *          fm    ;            ;
               ;     Fm          *
    
  • tmกระโดดก่อนที่จะmก้าวไปข้างหน้าTถอยหลัง

    Latin: Lorem ipsum dolor sit amet.
    *         tm    ;            ;
              ;     Tm           *
    

/? ใช้เพื่อข้ามไปยังรูปแบบที่เกิดขึ้นครั้งแรกจากตำแหน่งเคอร์เซอร์ปัจจุบัน:

  • /pattern ไปข้างหน้า

    Latin: Lorem ipsum dolor sit amet.
    *            /ips
    
  • ?pattern ย้อนกลับไป

    Latin: Lorem ipsum dolor sit amet.
    ?Lat             *
    

0$ ใช้เพื่อข้ามไปยังอักขระตัวแรกและตัวสุดท้ายของบรรทัด

    (whitespace)Latin: Lorem ipsum dolor sit amet.(whitespace)
    0                  *                                     $

^g_ ใช้เพื่อข้ามไปยังอักขระที่พิมพ์ได้ตัวแรกและตัวสุดท้ายของบรรทัด

    (whitespace)Latin: Lorem ipsum dolor sit amet.(whitespace)
                ^      *                         g_

เดี่ยวและรวมกัน()[]{}ใช้เพื่อย้ายวลีโดยวลีหรือย่อหน้าทีละย่อหน้าหรือบล็อกโค้ดโดยบล็อกโค้ด

<C-b>และ<C-f>ใช้เพื่อเลื่อนหน้าจอไปข้างหลังและข้างหน้า

<C-u>และ<C-d>ใช้ในการเลื่อนครึ่งหน้าจอไปข้างหลังและข้างหน้า

H, MและLเลื่อนเคอร์เซอร์ไปที่ด้านบนตรงกลางด้านล่างของวิวพอร์ตตามลำดับ

zt, zzและzbย้ายสายใต้เคอร์เซอร์ไปที่ด้านบนตรงกลางด้านล่างของวิวพอร์ตตามลำดับ

และอื่น ๆ

:help motion.txt จะทำให้คุณประทับใจ


17
ฉันมักจะไม่ทำแบบนี้ แต่ความคิดเห็นนี้เป็นเพียงคำตอบที่ดีเท่านั้น!
jojo

ด้วยเหตุผลบางอย่างฉันไม่เคยใช้ H, M หรือ L มาก่อนเคล็ดลับดีๆ!
คริส

การเพิ่ม]}และ[{(2 การกดแป้นพิมพ์) ข้ามไปที่จุดสิ้นสุดหรือจุดเริ่มต้นของขอบเขต (เช่นกำหนดโดย{ ... }
Matthew Woo

3
อย่างนี้คงไม่ได้โดดตอบคำถาม OP how to jump to a line he's seeing like using a mouseบน ฉันรู้และใช้การผูกคีย์ทั้งหมดที่คุณกล่าวถึงตลอดเวลา แต่ก็ยังไม่มีประสิทธิภาพเท่ากับการชี้เมาส์เมื่อกระโดดระยะไกล
Penghe Geng

ใช่ H, M, L ง่ายต่อการจำ: สูงกลางต่ำ;)
@Chris

25

นอกจากคำสั่งการเคลื่อนไหวของ vim แล้วฉันพบว่าปลั๊กอิน vim ชื่อEasyMotionมีประโยชน์มากในการนำทางหากคุณคุ้นเคยกับ vimperator หรือ pentadactyl EasyMotion เพียงแค่นำโหมดคำใบ้กลับมาเป็นกลุ่ม นี่คือการสาธิตแบบเคลื่อนไหวและนี่คือวิดีโอสอน หวังว่าจะเป็นประโยชน์สำหรับคุณ


ข้อดีของ easymotion คือคุณสามารถไปที่ใดก็ได้บนหน้าจอด้วยการกดแป้นพิมพ์เพียง 3 ครั้ง
Xavier T.

+1: EasyMotion เป็นเครื่องบินเจ็ทแพ็คของการเคลื่อนไหวของ Vim (โดยวิธี PreciseJump ด้วยจริงๆแล้ว EasyMotion เป็นลูกชายของ PreciseJump)
Dmitry Frank

2
ผู้เขียน EasyMotion ได้สายสถานะที่ยอดเยี่ยมนี้ในการสาธิตอย่างไร?
Cyrille

1
'บรรทัดสถานะสุดยอดเยี่ยม' คือปลั๊กอินที่เรียกว่า 'Powerline' ที่นี่: vim.org/scripts/script.php?script_id=3881
DEzra

คุณช่วยอัปเดต url สาธิตแบบเคลื่อนไหวได้ไหม มันไม่ทำงานอีกต่อไป
brauliobo

20

มีหลายล้านวิธีที่จะเคลื่อนที่ไปรอบ ๆ เป็นกลุ่มนี้เป็นหนึ่งในพื้นที่ที่แข็งแกร่งจริงๆ ฉันใช้{และ}จำนวนมากซึ่งเลื่อนขึ้นและลงไปยังบรรทัดว่างถัดไปในทิศทางนั้น %มีประโยชน์สำหรับการเลื่อนไปมาในวงเล็บที่ตรงกัน (ทุกชนิด) WและBเดินหน้าถอยหลังด้วย "คำ"

การทบทวนส่วนการเคลื่อนที่ไปรอบ ๆของคู่มือ Vim อาจคุ้มค่า


4
สิ่งที่ควรค่าแก่การกล่าวถึงคือการเพจขึ้นและลงโดยใช้ Ctl + U และ Ctl + D ตามลำดับ
นิค

10

เป็นกลุ่มรองรับเมาส์! ลองดูสิ (ใน. vimrc ของคุณ):

set mouse=a

sidenote : ในฐานะผู้ใช้หน้าจอฉันพบว่าฉันต้องการ

set ttymouse=xterm2

สำหรับสิ่งนี้ในการทำงาน


4
น่ารู้อย่างไรก็ตามฉันจะยังคงตามล่าหาการนำทางที่รวดเร็วสมบูรณ์แบบโดยไม่ต้องใช้เมาส์
Helmut Granda

9

โดยส่วนตัวแล้วฉันชอบใช้:

"/<chars><enter>" to quickly move to somewhere   ( extremely fast! trust me! )
":<number>" to go to some line, 
"ctrl + f/b" to forward/back
"g;" to move to the last editing place.
"w/b" to move by word
"jklh" to move your cursor to the exact position

5

ด้วยตัวเลือกrelativenumber( : help relativenumber - รวมอยู่ใน Vim 7.3 ) คุณสามารถไปที่เส้นใต้ตาของคุณด้วยการเคลื่อนไหว[count]kหรือ[count]jการเคลื่อนไหวซึ่งคุณให้คุณเคลื่อนที่ไปในแนวปัจจุบันด้วยการเคลื่อนไหวftwebตามที่ @romainl อธิบาย


ตัวเลือกที่ดี เร็วกว่า easymotion
Penghe Geng

5

นอกเหนือจาก{, }, (, ), <number>cb, <number>cB, <number>cWและ%ผมใช้เทคนิคการนำดังกล่าว

  • ciw, diw( ciW, diW). ฯลฯ เพื่อแก้ไข / ลบคำอย่างรวดเร็วภายใต้เคอร์เซอร์ (รวมถึงอักขระที่ไม่ใช่ช่องว่าง)
  • ci(, ci"( ca(, ca") ฯลฯ เพื่อแก้ไขอย่างรวดเร็วภายในวงเล็บเครื่องหมายคำพูด (รวมถึงวงเล็บเครื่องหมายคำพูด) เช่นเดียวกับd.
  • ทำเครื่องหมายด้วยตัวอักษร CAPITAL เพื่อตั้งค่าทั่วโลก (ข้ามไฟล์) และคงอยู่ (เมื่อปิดบัฟเฟอร์) ตัวอย่างเช่นmAจะสร้างเครื่องหมายสากลAที่สามารถใช้ได้กับ'Aคำสั่ง (หรือ`Aเพื่อเคารพคอลัมน์)
  • gf เพื่อไปยังไฟล์อย่างรวดเร็วภายใต้เคอร์เซอร์
  • f, t( F, T) เพื่อเลื่อนไปยังตัวอักษรก่อนอักขระไปทางขวา (ซ้าย) (ใช้;เพื่อทำซ้ำ) สิ่งเหล่านี้มีประโยชน์อย่างยิ่งสำหรับdและcคำสั่ง (ใช้.เพื่อทำซ้ำ)
  • ^]เพื่อย้ายไปที่แท็กและ^Tย้ายกลับ

และวิธีอื่น ๆ อีกมากมายในการย้าย :)

ดูข้อมูลเพิ่มเติมได้ที่: http://www.thegeekstuff.com/2009/03/8-essential-vim-editor-navigation-fundamentals/

ปล. สำหรับผู้ใช้รางมีปลั๊กอินที่มีประโยชน์มากคุณอาจต้องการตรวจสอบด้วย


3

นี้เป็นสถานที่ที่ดีที่จะได้เรียนรู้คำสั่งการนำหลักบางส่วนของอำนาจ / ความเร็วของการเป็นกลุ่มมาจากการรวมกันของการเคลื่อนไหวด้วยการกระทำเช่นcw-> การเปลี่ยนแปลงคำd10j-> ลบ 10 บรรทัดลง ฯลฯ นอกจากนี้และนี้เป็นที่น่าสนใจอ่าน


2

คุณสามารถ:set nohlsearchปิดไฮไลต์ของอักขระค้นหาของคุณได้

ฉันนำทางโดยใช้ ctags มากเกินไป


github.com/richoH/dotfiles/blob/master/vimrc คุณอาจพบสิ่งที่มีประโยชน์อื่น ๆ ในนั้น
richo

ขอบคุณสำหรับเคล็ดลับฉันกำลังตรวจสอบ vimrc ของคุณและพบบันทึกของคุณซึ่งคุณได้ตั้งค่าให้ไฮไลต์บรรทัดเมื่อคุณมีอักขระถึง 80 ตัวเมื่อเขียนอีเมลหรือเอกสาร ทำไมคุณถึงเขียนอีเมลใน VIM? ฉันเข้าใจเอกสารสำหรับการใช้งานส่วนตัวของคุณ แต่ไม่แน่ใจเกี่ยวกับอีเมล
Helmut Granda

ฉันใช้ mutt + vim เพื่ออ่านและเขียนอีเมลส่วนใหญ่ของฉัน ฉันยังใช้ปลั๊กอิน It's all text เพื่อเขียนเนื้อหาเว็บจำนวนมากเป็นกลุ่ม ฉันเปิดใช้การตัดคำสำหรับอีเมล แต่สำหรับลิงก์ ฯลฯ การแจ้งเตือนจะมีประโยชน์หากฉันจัดรูปแบบไม่ถูกต้องหรือหากคำพูดที่ซ้อนกันยาวเกินไป
richo

0

ฉันได้เขียนปลั๊กอินโดยคำนึงถึงการนำทางที่รวดเร็วเป็นพิเศษเรียกว่า move-less:

https://github.com/anschnapp/move-less

ช่วยให้คุณค้นหาไฟล์หลุมได้อย่างสะดวกสบายโดยการเลื่อนด้วย ( h j k l-keys) คุณไม่เปลี่ยนตำแหน่งเคอร์เซอร์ของคุณในขณะที่เลื่อนไซต์ของรู (ตามเคล็ดลับการพับ) หากคุณยกเลิกการค้นหาคุณเพิ่งเริ่มต้น

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

https://github.com/easymotion/vim-easymotion

ถ้าคุณรวมทั้งคุณยังสามารถนำไปล่วงหน้ากระโดดประวัติศาสตร์และคุณสามารถข้ามไปมาระหว่างต้นทางและปลายทางเป้าหมายของคุณเพียงแค่ผ่านและ<c-o><c-i>


0

ฉันมีแผนภาพนี้เท่านั้น!

▼/▶ Cursor   ▽/▷ Target
┌───────────── 0      
│  ┌────────── ^      $ ──────────────┐
│  │  ┌─────── Fo     fe ────────┐    │
│  │  │┌────── To     te ───────┐│    │
│  │  ││ ┌──── ge     w ───┐    ││    │
│  │  ││ │ ┌── b      e ─┐ │    ││    │ 
│  │  ││ │ │  ┌h      l┐ │ │    ││    │
▽  ▽  ▽▽ ▽ ▽  ▽▼      ▼▽ ▽ ▽    ▽▽    ▽
   echo "A cheatsheet from quickref.me"
                 - SCREEN 1 START
   ┌─┬─────────▷ #!/usr/bin/python
   │ │     ┌───▷     
   │ │     │     print("Hello")
   │ │     { } ▶ print("Vim")
   │ │       │   print("!")
   │ │       └─▷    
   │ │ ┌───┬───▷ print("Welcome")
G gg H M L k j ▶ print("to")
│        │   └─▷ print("quickref.me")
│        │       print("/vim")
│        │     
│        └─────▷ 
│                - SCREEN 1 END
└──────────────▷ print("SCREEN 2")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.