Làm thế nào để di chuyển màn hình mà không di chuyển con trỏ trong Vim?


598

Gần đây tôi phát hiện ra Ctrl+ ECtrl+ Ycác phím tắt cho Vim mà lần lượt di chuyển màn hình lên xuống với một bước một dòng, mà không cần di chuyển con trỏ .

Bạn có biết bất kỳ lệnh nào để con trỏ ở vị trí của nó nhưng di chuyển màn hình để dòng có con trỏ trở thành dòng đầu tiên không? (có một lệnh cho dòng cuối cùng sẽ là một phần thưởng tốt đẹp).

Tôi có thể đạt được điều này bằng cách nhấn thủ công Ctrl+ E(hoặc Ctrl+ Y) số lần thích hợp, nhưng có một lệnh mà bằng cách nào đó thực hiện điều này trực tiếp sẽ rất tốt.

Có ý kiến ​​gì không?


Không nên đặt câu hỏi này trong phần Vim?
Giăng

Câu trả lời:


877
  • zz- di chuyển dòng hiện tại đến giữa màn hình
    ( Cẩn thận vớizz , nếu bạn Caps Lockvô tình gặp phải, bạn sẽ lưu và thoát vim!)
  • zt - di chuyển dòng hiện tại lên trên cùng của màn hình
  • zb - di chuyển dòng hiện tại xuống dưới cùng của màn hình

9
@HappyGreenKidNaps Bản đồ mũ khóa để kiểm soát càng sớm càng tốt!
Aaron

Tôi khá gắn bó với khóa mũ của mình, đặc biệt là xử lý nhiều macro C, nhưng bạn có các tùy chọn khác. Trước tiên, hãy tìm một khóa chưa được ánh xạ (kiểm tra cả hai trường hợp cho các chữ cái; thử thêm một công cụ sửa đổi hoặc nhà lãnh đạo, sử dụng một biểu tượng hoặc phím chức năng, v.v.) và ánh xạ nó vào tổ hợp 'rủi ro' nhạy cảm với trường hợp. Thứ hai, cấu hình vimundo theo ý thích của bạn để bạn có thể phục hồi từ một oops. (Các bản hack không di động đến :) Thứ ba, thực hiện tương tự nhưng từ cấu hình bàn phím người dùng của bạn, ví dụ: phím Windows + Z; đối với bản đồ theo trình tự, hãy thử xdotoolhoặc triggerhappy. Cuối cùng, hiển thị trạng thái khóa mũ của bạn (không thể thực hiện trong Vimscript.) ...
John P

2
Truy vấn trạng thái khóa mũ của bạn rất phụ thuộc vào môi trường. Tôi đã nghe nói rằng nó không thể được thực hiện trong Vimscript và tại thời điểm này tôi đã chấp nhận nó. Nếu bạn muốn đi trên con đường đó, có xev -q, cat /proc/bus/input/devicesđể tìm thiết bị để truy vấn và evtesthoặc thd ... --dump /dev/input/event<#>kiểm tra trạng thái, v.v. Nếu bạn nhất định phải thực hiện ánh xạ lại toàn hệ thống, ít nhất là trao đổi hai khóa như mũ <-> num - nhưng vấn đề là quên nhiều hơn, bởi vì nếu bạn muốn nó trước đây, bạn sẽ tiếp tục sử dụng nó, bằng bất kỳ bản đồ nào. Rủi ro phá vỡ Vim trước các tập tin / người dùng / hệ thống.
John P

Các tùy chọn tập lệnh Vim khác: bật 'xác nhận' để xác nhận thoát / rời / vv.; để viết, tôi tin rằng bạn sẽ cần một autocommand cho BufWritePre với confirm(). Ngoài ra, thay vì ánh xạ khóa mũ thành ctrl, bạn có thể ánh xạ nó tới một khóa hoặc tổ hợp được hiểu nhưng không bị ánh xạ bởi Vim, và sau đó mô phỏng khóa mũ riêng trong khi ở chế độ chèn / thay thế, bằng tay hoặc bằng thứ gì đó như github.com/tpope/ vim-capslock . Bạn có thể sẽ không cần nó bên ngoài Vim, nhưng nếu có, hãy viết một tập lệnh xmodmap để hoàn nguyên các thay đổi của bạn hoặc xem chương trình có hỗ trợ ánh xạ của chính nó không (và ghi chú.)
John P

3
zt / zz / zb - con trỏ cố định và di chuyển màn hình sang t op / centre (tiếng Đức: ' z entrum') / b ottom <---> H / M / L - màn hình cố định và di chuyển con trỏ đến H igh / M iddle / Vị trí L ow
eli

626

Ngoài ra:

  • Ctrl- yDi chuyển màn hình lên một dòng
  • Ctrl- eDi chuyển màn hình xuống một dòng
  • Ctrl- uDi chuyển con trỏ và sàng lọc lên trang
  • Ctrl- dDi chuyển con trỏ và màn hình xuống ½ trang
  • Ctrl- bDi chuyển màn hình lên một trang, con trỏ đến dòng cuối cùng
  • Ctrl- fDi chuyển màn hình xuống một trang, con trỏ đến dòng đầu tiên

Ctrl- yCtrl- echỉ thay đổi vị trí con trỏ nếu nó sẽ bị di chuyển khỏi màn hình.

Được phép của http://www.lagmonster.org/docs/vi2.html


91
@ulidtko: sau (sau tiếng Thụy Điển), yore (có nghĩa là quá khứ), lên, xuống, trở lại, về phía trước. (Các từ trở lại và chuyển tiếp dài hơn lên và xuống, do đó, tự nhiên chúng di chuyển màn hình một khoảng cách dài hơn;)
Moberg

12
Tôi đoán yester, vì trong ngày hôm qua sẽ là một người ghi nhớ tốt hơn mặc dù vậy ^^
Moberg

Cả Ctrl-u và Ctrl-d đều di chuyển con trỏ: " Con trỏ được di chuyển cùng một số dòng trong tệp (nếu có thể; khi các dòng quấn và khi nhấn vào cuối tệp có thể có sự khác biệt). "
Lex R

Cảm ơn @LexR, tôi đã cập nhật câu trả lời để phản ánh sự khác biệt đó.
Paul Wheeler

1
:help CTRL-EnóiMnemonic: Extra lines.
Niko Bellic

39

Vim yêu cầu con trỏ phải ở trong màn hình hiện tại mọi lúc, tuy nhiên, bạn có thể đánh dấu cuộn vị trí hiện tại xung quanh và sau đó quay lại vị trí của bạn.

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

1
lưu ý rằng nếu bạn chỉ quan tâm đến việc đi đến dòng được đánh dấu, bạn có thể sử dụng 'g
Matt Briggs

4
"Vim yêu cầu con trỏ phải ở trong màn hình hiện tại mọi lúc" Người dùng Vim muốn tự hào rằng mọi thứ đều có thể định cấu hình trong vim. Cái này thì không. Tôi không muốn con trỏ của mình di chuyển trong khi tôi đang cuộn tập tin. Dealbreaker cho tôi
gadelat

8
Tôi chưa bao giờ có một tình huống mà tôi muốn con trỏ ở một nơi nào đó mà bạn không thể nhìn thấy nó. Chắc chắn, con trỏ di chuyển xung quanh khi bạn cuộn nhưng bạn có thể quay lại nơi bạn đang ở một cách tầm thường (để bạn có thể thấy bạn thực sự ở đâu, không chỉ là phỏng đoán). Double back-tick cho một, Ctrl-Ocho một cái khác thực sự tuyệt vời và "backtick, period" đưa bạn trở lại nơi bạn đã chỉnh sửa lần cuối.
dash-tom-bang

3
@gedalat, rất khó chịu trong các trình chỉnh sửa khác khi bạn di chuyển đi, không biết con trỏ của bạn ở đâu nữa và phải sử dụng chuột để nhấp vào đâu đó chỉ để bạn có thể lấy lại con trỏ. Hoặc bạn nghĩ rằng mình đang "ở đây", bắt đầu nhập và nó đột nhiên nhảy trở lại vị trí của con trỏ, tại thời điểm đó bạn không thể quay lại nơi bạn đã cuộn, vì chỉ có các vị trí con trỏ được theo dõi. Có con trỏ theo nơi bạn đi được cho là một điều tốt.
Shahbaz

1
Nó có thể cấu hình, @gadelat. Bạn chỉ cần ánh xạ chính câu trả lời này (đánh dấu vị trí bằng mg, cuộn xung quanh, đánh dấu bằng goto 'gvà bạn đã hoàn thành. Bây giờ bạn có thể gọi phím có thể định cấu hình để đi xung quanh và sẽ có cảm giác như con trỏ không bao giờ nhảy vào vị trí hiện tại. Voilá!
Bác sĩ Beco

18

Đây là giải pháp của tôi trong 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

Vì vậy, con trỏ sẽ ở giữa màn hình và màn hình sẽ di chuyển lên hoặc xuống.


Tôi nghĩ giải pháp này là nhiều hơn những gì OP cần. Tôi đã áp dụng nó và nó hoạt động như một nét duyên dáng.
Gustavo Pinsard

9
Làm thế nào về việc chỉ đặt 'cuộn' thành một nửa giá trị của 'dòng'?
Rld.

không may là "nnoremap o o <ESC> zza" mất tính tự động, nhưng điều này hoạt động xung quanh nó bằng cách thêm và xóa một ký tự tạm thời '.' "nnoremap o o. <ESC> zzxa"
Neil McGill

Cảm ơn bạn @rld, 'cuộn' cũng là một giải pháp tốt hoặc có thể tốt hơn. Cảm ơn! Đây là tài liệu tham khảo: vim.wikia.com/wiki/ đá
Henry

14

Để thoát khỏi con trỏ vào cột tương tự khi bạn sử dụng Ctrl+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

bạn nên xác định tùy chọn sau:

:set nostartofline

2
Tôi quên / nhầm lẫn mọi lúc: zt ​​/ zz / zb - con trỏ cố định và di chuyển màn hình sang t op / centre (tiếng Đức: ' z entrum') / b ottom <---> H / M / L - màn hình cố định và di chuyển con trỏ đến vị trí H igh / M iddle / L ow
eli

8

Tôi ngạc nhiên không ai sử dụng Scrollofftùy chọn giữ con trỏ ở giữa trang. Hãy thử với:

:set so=999

Đây là phương pháp được đề xuất đầu tiên trên wiki Vim và hoạt động tốt.


3
Và nếu bạn không muốn con trỏ luôn được ngay ở giữa, bạn có thể đặt nó vào một giá trị nhỏ hơn. Chẳng hạn, :set scrolloff=4sẽ yêu cầu con trỏ luôn cách xa trên cùng hoặc dưới cùng của cửa sổ ít nhất 4 dòng, vì vậy bạn luôn có ít nhất một chút bối cảnh.
Soren Bjornstad

6

Tôi đã sử dụng các phím tắt này trong quá khứ ( lưu ý: các phím riêng biệt, ví dụ: nhấn z , buông, nhấn phím tiếp theo):

z enter -> di chuyển dòng hiện tại lên trên cùng của màn hình

z . -> di chuyển dòng hiện tại đến giữa màn hình

z - -> di chuyển dòng hiện tại xuống dưới cùng

Nếu nó không rõ ràng:

entercó nghĩa là Returnhoặc Enterchìa khóa.

.có nghĩa là phím DOT hoặc "dừng hoàn toàn" ( .).

-có nghĩa là khóa HYPHEN ( -)

Đối với những gì nó có giá trị, z.tránh nguy cơ lưu và đóng Vi bằng cách vô tình gõ ZZnếu bật nắp khóa.


5

Bạn có thể tiền tố con trỏ di chuyển các lệnh bằng một số và điều đó sẽ lặp lại lệnh đó nhiều lần

10Ctrl+ Esẽ làm Ctrl+ E10 lần thay vì một.


4

zEnter không chính xác những gì câu hỏi này yêu cầu.

Nó hoạt động ở nơi lạ lùng zzsẽ không hoạt động (vim 7.4.1689 trên Ubuntu 2016.04 LTS không có .vimrc đặc biệt)



2

Đôi khi rất hữu ích khi cuộn văn bản bằng các phím KJ, vì vậy tôi có chức năng "chế độ cuộn" này trong .vimrc của tôi (cũng bị ràng buộc zs).

Xem scroll_mode.vim .


2

bản ghi nhớ của tôi để cuộn ...

Thêm vào các câu trả lời khác cũng chú ý đến zezs, có nghĩa là: di chuyển màn hình sang trái / phải của con trỏ (không di chuyển con trỏ)

+-------------------------------+
^                               |
|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                               |
+-------------------------------+

cũng nhìn vào vị trí của hltb(với bàn phím qwertz) c-ec-y(cũng là "y" bằng cách nào đó chỉ xuống phía dưới) trên bàn phím để nhớ nơi màn hình đang di chuyển.


1

Tôi đã viết một plugin cho phép tôi điều hướng tệp mà không di chuyển vị trí con trỏ. Nó dựa trên việc gấp các đường giữa vị trí của bạn và vị trí mục tiêu của bạn và sau đó nhảy qua nếp gấp, hoặc hủy bỏ nó và không di chuyển chút nào.

Nó cũng dễ dàng để nhanh chóng chuyển đổi giữa các con trỏ vào dòng đầu tiên, dòng cuối cùng và con trỏ ở giữa bằng cách chỉ cần click j, khoặc lkhi bạn đang ở trong chế độ của các plugin.

Tôi đoán nó sẽ phù hợp ở đây.


1

Nhập vim và gõ:

:help z

zlà lệnh vim để vẽ lại, vì vậy nó sẽ vẽ lại tệp tương ứng với vị trí bạn định vị con trỏ. Các tùy chọn bạn có như sau:

z+- Vẽ lại tệp bằng con trỏ ở trên cùng của cửa sổ và ở ký tự đầu tiên không trống của dòng của bạn.

z-- Vẽ lại tệp bằng con trỏ ở dưới cùng của cửa sổ và ở ký tự đầu tiên không trống của dòng của bạn.

z.- Vẽ lại tệp bằng con trỏ ở giữa cửa sổ và ở ký tự đầu tiên không trống của dòng của bạn.

zt- Vẽ lại tập tin với con trỏ ở trên cùng của cửa sổ.

zb- Vẽ lại tập tin với con trỏ ở dưới cùng của cửa sổ.

zz- Vẽ lại tập tin với con trỏ ở giữa cửa sổ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.