วิธีการย้ายหน้าจอโดยไม่เลื่อนเคอร์เซอร์ในกลุ่ม?


598

ฉันเพิ่งค้นพบCtrl+ EและCtrl+ Yลัดสำหรับกลุ่มที่ย้ายตามลำดับหน้าจอขึ้นและลงด้วยขั้นตอนหนึ่งบรรทัดโดยไม่ต้องย้ายเคอร์เซอร์

คุณรู้คำสั่งใด ๆ ที่ทำให้เคอร์เซอร์อยู่ที่ใด แต่ย้ายหน้าจอเพื่อให้บรรทัดที่มีเคอร์เซอร์กลายเป็นบรรทัดแรก? (มีคำสั่งสำหรับบรรทัดสุดท้ายจะเป็นโบนัสที่ดี)

ฉันสามารถทำสิ่งนี้ได้ด้วยการกดCtrl+ E(หรือCtrl+ Y) ตามจำนวนครั้งที่เหมาะสม แต่การมีคำสั่งที่ทำสิ่งนี้โดยตรงจะดี

ความคิดใด ๆ


คำถามนี้ไม่ควรอยู่ในส่วนที่เป็นกลุ่ม?
จอห์น

คำตอบ:


877
  • zz- ย้ายบรรทัดปัจจุบันไปที่ตรงกลางของหน้าจอ
    ( ระวังด้วยzzหากคุณเกิดขึ้นCaps Lockโดยไม่ตั้งใจคุณจะบันทึกและออกvim!)
  • zt - ย้ายบรรทัดปัจจุบันไปที่ด้านบนของหน้าจอ
  • zb - ย้ายบรรทัดปัจจุบันไปที่ด้านล่างของหน้าจอ

9
@HappyGreenKidNaps แผนที่ที่ล็อคปุ่มเพื่อควบคุม ASAP!
แอรอน

ฉันแนบไปกับตัวล็อคของฉันโดยเฉพาะกับมาโคร C จำนวนมาก แต่คุณมีตัวเลือกอื่น ก่อนอื่นให้ค้นหาคีย์ที่ไม่ได้แมป (ตรวจสอบตัวอักษรทั้งสองกรณีลองเพิ่มตัวแก้ไขหรือผู้นำโดยใช้สัญลักษณ์หรือปุ่มฟังก์ชั่น ฯลฯ ) และแมปกับชุดตัวพิมพ์ใหญ่ 'เสี่ยง' ประการที่สองกำหนดค่า vimundo ตามความชอบของคุณเพื่อให้คุณสามารถกู้คืนจากโอ๊ะโอได้ (ไม่ใช่แฮ็กที่ไม่ได้พกพาเข้ามา :) ประการที่สามทำเช่นเดียวกัน แต่จากการกำหนดค่าคีย์บอร์ดผู้ใช้ของคุณเช่น Windows key + Z; สำหรับแผนที่ลำดับลองหรือxdotool triggerhappyในที่สุดแสดงสถานะการล็อคตัวพิมพ์ใหญ่ของคุณ (ไม่สามารถทำได้ใน Vimscript) ...
John P

2
การสอบถามสถานะการล็อคแคปของคุณนั้นขึ้นอยู่กับสภาพแวดล้อม ฉันได้ยินมาว่ามันไม่สามารถทำได้ใน Vimscript และ ณ จุดนี้ฉันก็ยอมรับมัน หากคุณต้องการที่จะไปลงที่ถนนมีxev -q, cat /proc/bus/input/devicesเพื่อหาอุปกรณ์ในการสอบถามและการevtestหรือthd ... --dump /dev/input/event<#>เพื่อตรวจสอบรัฐ ฯลฯ หากคุณอย่างจะต้องทำให้แมปทั้งระบบที่แลกเปลี่ยนอย่างน้อยสองล็อคเช่นหมวก <-> NUM - แต่ปัญหาก็คือลืมไปแล้วว่ามันเปิดอยู่เพราะถ้าคุณต้องการมันมาก่อนคุณจะใช้มันต่อไปไม่ว่าจะใช้แผนที่ใด เสี่ยงต่อการแตกเป็นกลุ่มก่อนไฟล์ / ผู้ใช้ / ระบบ
John P

ตัวเลือกสคริปต์ Vim อื่น ๆ : เปิด 'ยืนยัน' เพื่อยืนยันออก / ออก / ฯลฯ สำหรับการเขียนผมเชื่อว่าคุณจะต้อง autocommand สำหรับ BufWritePre confirm()กับ นอกจากนี้แทนที่จะจับคู่ตัวพิมพ์ใหญ่ล็อคกับ ctrl คุณสามารถแมปไปยังคีย์หรือชุดค่าผสมที่เข้าใจได้ แต่ไม่ได้แมปโดย Vim แล้วเลียนแบบตัวพิมพ์ใหญ่ล็อคเฉพาะในขณะที่อยู่ในโหมดแทรก / แทนที่ด้วยมือหรืออย่างgithub.com/tpope/ เป็นกลุ่ม-CapsLock คุณอาจไม่จำเป็นต้องใช้นอกเหนือจาก Vim แต่ถ้าคุณเขียนสคริปต์ xmodmap เพื่อย้อนกลับการเปลี่ยนแปลงของคุณหรือดูว่าโปรแกรมรองรับการแมปของตัวเอง (และจดบันทึก)
John P

3
zt / zz / zb - เคอร์เซอร์คงที่และย้ายหน้าจอไปที่t op / center (เยอรมัน: ' z entrum') / b ottom <---> H / M / L - หน้าจอคงที่และเลื่อนเคอร์เซอร์ไปที่H igh / M iddle / L ow position
eli

626

นอกจากนี้:

  • Ctrl- yเลื่อนหน้าจอขึ้นหนึ่งบรรทัด
  • Ctrl- eเลื่อนหน้าจอลงหนึ่งบรรทัด
  • Ctrl- uเลื่อนเคอร์เซอร์ & หน้าจอขึ้น½หน้า
  • Ctrl- dเลื่อนเคอร์เซอร์ & หน้าจอลง½หน้า
  • Ctrl- bเลื่อนหน้าจอขึ้นหนึ่งหน้าเคอร์เซอร์ไปที่บรรทัดสุดท้าย
  • Ctrl- fเลื่อนหน้าจอลงหนึ่งหน้าเลื่อนเคอร์เซอร์ไปที่บรรทัดแรก

Ctrl- yและCtrl- eเปลี่ยนเฉพาะตำแหน่งเคอร์เซอร์หากเลื่อนออกจากหน้าจอ

ได้รับความอนุเคราะห์จากhttp://www.lagmonster.org/docs/vi2.html


91
@ulidtko: efter (หลังจากในสวีเดน), สมัยก่อน (หมายถึงอดีต), ขึ้น, ลง, กลับ, ไปข้างหน้า (คำกลับไปกลับมามีความยาวขึ้นและลงดังนั้นพวกเขาจึงย้ายหน้าจอในระยะทางที่ไกลกว่า)
Moberg

12
ฉันเดาว่าเมื่อวานเมื่อวานนี้จะเป็นความทรงจำที่ดีกว่าแม้ว่า ^^
Moberg

ทั้ง Ctrl-u และ Ctrl-d ย้ายเคอร์เซอร์: " เคอร์เซอร์จะถูกย้ายจำนวนบรรทัดเดียวกันในไฟล์ (ถ้าเป็นไปได้เมื่อบรรทัดถูกตัดและเมื่อกดปุ่มสิ้นสุดไฟล์อาจมีความแตกต่าง) "
Lex R

ขอบคุณ @LexR ฉันได้อัปเดตคำตอบเพื่อสะท้อนความแตกต่างนั้นแล้ว
Paul Wheeler

1
:help CTRL-Eพูดว่าMnemonic: Extra lines.
Niko Bellic

39

Vim ต้องการให้เคอร์เซอร์อยู่ในหน้าจอปัจจุบันตลอดเวลาอย่างไรก็ตามคุณสามารถบุ๊กมาร์กตำแหน่งปัจจุบันเลื่อนไปมาแล้วกลับไปยังตำแหน่งที่คุณอยู่

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g

1
โปรดทราบว่าหากคุณสนใจเพียงแค่ไปที่บรรทัดบุ๊กมาร์กคุณสามารถใช้ 'g
Matt Briggs

4
"กลุ่มต้องเคอร์เซอร์อยู่ในหน้าจอปัจจุบันตลอดเวลา" ผู้ใช้กลุ่มต้องการที่จะโอ้อวดว่าทุกอย่างสามารถกำหนดค่าได้ในกลุ่ม อันนี้ไม่ได้ ฉันไม่ต้องการให้เคอร์เซอร์เคลื่อนที่ขณะที่ฉันเลื่อนดูไฟล์ Dealbreaker สำหรับฉัน
gadelat

8
ฉันไม่เคยมีสถานการณ์ที่ฉันต้องการให้เคอร์เซอร์อยู่ที่ใดที่หนึ่งที่คุณมองไม่เห็น แน่นอนว่าเคอร์เซอร์จะเลื่อนไปมาเมื่อคุณเลื่อน แต่คุณสามารถกลับไปยังที่ที่คุณอยู่ได้เล็กน้อย (เพื่อให้คุณเห็นว่าคุณอยู่ตรงไหนไม่ใช่แค่เดา) เพิ่มติ๊กสองอันCtrl-Oสำหรับอีกอันหนึ่งอันยอดเยี่ยมอีกอันหนึ่งและ "backtick, period" ทำให้คุณกลับไปยังตำแหน่งที่คุณแก้ไขครั้งล่าสุด
dash-tom-bang

3
@gedalat มันน่ารำคาญอย่างมากในเครื่องมือแก้ไขอื่น ๆ เมื่อคุณเลื่อนออกไปไม่ทราบว่าเคอร์เซอร์ของคุณอยู่ที่ไหนอีกต่อไปและต้องใช้เมาส์คลิกที่ใดที่หนึ่งเพื่อที่คุณจะได้เคอร์เซอร์กลับมา หรือคุณคิดว่าคุณเป็น "ที่นี่" เริ่มพิมพ์และทันใดนั้นก็กลับไปที่ที่เคอร์เซอร์อยู่ตรงจุดที่คุณไม่สามารถย้อนกลับไปที่ที่คุณเลื่อนได้เพราะตำแหน่งเคอร์เซอร์เท่านั้นที่ถูกติดตาม การเลื่อนเคอร์เซอร์ไปตามจุดที่คุณไปนั้นเป็นสิ่งที่ดี
Shahbaz

1
มันสามารถกำหนดค่าได้ @gadelat คุณเพียงแค่ต้องแผนที่นี้คำตอบมาก (ตำแหน่งเครื่องหมายด้วยmgเลื่อนรอบเครื่องหมายข้ามไปด้วย'gและคุณจะทำตอนนี้คุณสามารถเรียกใช้คีย์ที่กำหนดที่จะไปรอบ ๆ และมันจะรู้สึกเหมือนเคอร์เซอร์ไม่เคย leaved ตำแหน่งปัจจุบัน Voila..!
ดร. เบคโก

18

นี่คือทางออกของฉันใน vimrc:

"keep cursor in the middle all the time :)
nnoremap k kzz
nnoremap j jzz
nnoremap p pzz
nnoremap P Pzz
nnoremap G Gzz
nnoremap x xzz
inoremap <ESC> <ESC>zz
nnoremap <ENTER> <ENTER>zz
inoremap <ENTER> <ENTER><ESC>zzi
nnoremap o o<ESC>zza
nnoremap O O<ESC>zza
nnoremap a a<ESC>zza

เพื่อให้เคอร์เซอร์อยู่ตรงกลางของหน้าจอและหน้าจอจะเลื่อนขึ้นหรือลง


ฉันคิดว่าโซลูชันนี้เป็นสิ่งที่ OP ต้องการ ฉันใช้มันและมันก็ทำงานได้เหมือนมีเสน่ห์
Gustavo Pinsard

9
วิธีการเพียงแค่ตั้งค่า 'scrolloff' เพื่อครึ่งหนึ่งของค่าของ 'เส้น'?
rld

น่าเสียดายที่ "nnoremap o o <ESC> zza" สูญเสียการป้อนอัตโนมัติ แต่วิธีนี้สามารถแก้ไขได้โดยการเพิ่มและลบอักขระชั่วคราว '.' "nnoremap o o. <ESC> zzxa"
Neil McGill

ขอบคุณ @rld คำว่า 'scrolloff' ก็เป็นวิธีที่ดีหรืออาจจะดีกว่า ขอบคุณ! นี่คือข้อมูลอ้างอิง: vim.wikia.com/wiki/…
Henry

14

ที่จะออกจากเคอร์เซอร์ในคอลัมน์เดียวกันเมื่อคุณใช้Ctrl+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

คุณควรกำหนดตัวเลือกต่อไปนี้:

:set nostartofline

2
ฉันลืม / สับสนทุกครั้ง: zt / zz / zb - เคอร์เซอร์คงที่และย้ายหน้าจอไปที่t op / center (เยอรมัน: ' z entrum') / b ottom <---> H / M / L - หน้าจอคงที่และย้าย เคอร์เซอร์ถึงตำแหน่งH igh / M iddle / L ow
eli

8

ฉันประหลาดใจที่ไม่มีใครใช้Scrolloffตัวเลือกที่เก็บเคอร์เซอร์ไว้ตรงกลางของหน้า ลองกับ:

:set so=999

เป็นวิธีแรกที่แนะนำใน Vim wiki และทำงานได้ดี


3
และถ้าคุณไม่ต้องการให้เคอร์เซอร์เสมอที่จะขวาตรงกลางคุณสามารถตั้งค่าให้ค่าที่น้อยลง ตัวอย่างเช่น:set scrolloff=4จะต้องมีเคอร์เซอร์อยู่ห่างจากด้านบนหรือด้านล่างของหน้าต่างอย่างน้อย 4 บรรทัดดังนั้นคุณจะมีบริบทอย่างน้อยเสมอ
Soren

6

ฉันเคยใช้ทางลัดเหล่านี้ในอดีต ( หมายเหตุ: การกด ปุ่มแยกต่างหากเช่น tap z , ปล่อยให้ไปแตะที่ปุ่มถัดไป):

z enter -> ย้ายบรรทัดปัจจุบันไปที่ด้านบนของหน้าจอ

z . -> ย้ายบรรทัดปัจจุบันไปยังกึ่งกลางของหน้าจอ

z - -> ย้ายบรรทัดปัจจุบันไปที่ด้านล่าง

หากไม่ชัดเจน:

enterหมายถึงปุ่มReturnหรือEnter

.หมายถึงคีย์ DOT หรือ "full stop" ( .)

- หมายถึงปุ่ม HYPHEN (- )

สำหรับสิ่งที่มีค่าควรz.หลีกเลี่ยงอันตรายจากการบันทึกและการปิด Vi โดยพิมพ์โดยไม่ได้ตั้งใจZZหากเปิดใช้ตัวพิมพ์ใหญ่


5

คุณสามารถใส่คำสั่งเคอร์เซอร์ย้ายด้วยหมายเลขและคำสั่งนั้นจะทำซ้ำหลายครั้ง

10Ctrl+ EจะทำCtrl+ E10 ครั้งแทนที่จะเป็นหนึ่ง


4

zEnter ทำสิ่งที่คำถามนี้ถาม

มันทำงานได้อย่างแปลกประหลาดที่zzจะไม่ทำงาน (vim 7.4.1689 บน Ubuntu 2016.04 LTS ที่ไม่มี. vimrc พิเศษ)


4

คุณอาจพบคำตอบสำหรับ " การเรียกใช้ Vim ที่สัมพันธ์กับเคอร์เซอร์การทำแผนที่ที่กำหนดเอง " มีประโยชน์

คุณสามารถใช้ScrollToPercent(0)จากคำถามนั้นเพื่อทำสิ่งนี้


ฟังก์ชั่นที่ดีแน่นอน ขอบคุณ
ereOn

2

บางครั้งก็เป็นประโยชน์ในการเลื่อนข้อความที่มีKและJคีย์ดังนั้นฉันมีนี้โหมด "เลื่อน" ฟังก์ชั่นใน .vimrc ของฉัน (ยังผูกพันที่จะzs)

ดูscroll_mode.vim


2

ช่วยในการจำของฉันสำหรับการเลื่อน ...

การเพิ่มคำตอบอื่น ๆ ให้ความสนใจzeและzsความหมาย: เลื่อนหน้าจอไปทางซ้าย / ขวาของเคอร์เซอร์ (โดยไม่ต้องเลื่อนเคอร์เซอร์)

+-------------------------------+
^                               |
|c-e (keep cursor)              |
|H(igh)             zt (top)    |
|                   ^           |
|           ze      |      zs   |
|M(iddle)  zh/zH <--zz--> zl/zL |
|                   |           |
|                   v           |
|L(ow)              zb (bottom) |
|c-y (keep cursor)              |
v                               |
+-------------------------------+

ดูตำแหน่งของhและlและtและbและ (ด้วยคีย์บอร์ด qwertz) c-eและc-y(เช่น "y" ชี้ไปที่ด้านล่าง) บนแป้นพิมพ์เพื่อจดจำตำแหน่งที่หน้าจอเคลื่อนไหว


1

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

นอกจากนี้ยังเป็นเรื่องง่ายที่จะได้อย่างรวดเร็วสลับระหว่างเคอร์เซอร์บนบรรทัดแรกบรรทัดสุดท้ายและเคอร์เซอร์อยู่ตรงกลางโดยเพียงแค่คลิกj, kหรือlเมื่อคุณอยู่ในโหมดของปลั๊กอิน

ฉันคิดว่ามันจะเป็นแบบที่ดีที่นี่


1

ป้อนกลุ่มและประเภท:

:help z

zคือคำสั่ง vim สำหรับวาดใหม่ดังนั้นมันจะวาดใหม่ไฟล์ที่เกี่ยวข้องกับตำแหน่งที่คุณวางเคอร์เซอร์ ตัวเลือกที่คุณมีมีดังนี้:

z+- วาดไฟล์ใหม่ด้วยเคอร์เซอร์ที่ด้านบนของหน้าต่างและอักขระตัวแรกที่ไม่เว้นว่างในบรรทัดของคุณ

z-- วาดไฟล์ใหม่ด้วยเคอร์เซอร์ที่ด้านล่างของหน้าต่างและอักขระตัวแรกที่ไม่เว้นว่างในบรรทัดของคุณ

z.- วาดไฟล์ใหม่ด้วยเคอร์เซอร์ตรงกลางหน้าต่างและอักขระตัวแรกที่ไม่เว้นว่างในบรรทัดของคุณ

zt- วาดไฟล์ใหม่ด้วยเคอร์เซอร์ที่ด้านบนของหน้าต่าง

zb- วาดไฟล์ใหม่ด้วยเคอร์เซอร์ที่ด้านล่างของหน้าต่าง

zz- วาดไฟล์ใหม่ด้วยเคอร์เซอร์ตรงกลางหน้าต่าง

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