Vim: Di chuyển con trỏ đến vị trí cuối cùng của nó


251

Có thể trong (g) Vim để di chuyển con trỏ đến vị trí trước đó (trong khi ở chế độ bình thường)? Một cái gì đó để quay vòng qua lại trong danh sách các vị trí con trỏ trước đó sẽ là lý tưởng. Nhưng cũng chỉ cần chuyển sang vị trí cuối cùng là đủ (một cái gì đó giống như cd -trong bash với các thư mục).

Đây là một minh chứng nhỏ:

line |1| <- cursor position
line 2
line 3
line 4

Và giả sử tôi đã làm 2j, đây là bây giờ:

line 1
line 2
line |3| <- cursor position
line 4

Bây giờ tôi muốn nhấn một cái gì đó (không phải 2krõ ràng) để quay trở lại vị trí đầu tiên và có thể đến các vị trí trước đó.

Câu trả lời:


409

Cách nhanh nhất là đánh một trong hai:

''

(hai dấu nháy đơn) hoặc:

``

(hai backticks). Lưu ý rằng sự khác biệt là backtick đi đến cùng một vị trí trên dòng, trong khi dấu nháy đơn đi đến đầu dòng. Trên bàn phím Vương quốc Anh, dấu nháy đơn dễ tiếp cận hơn, vì vậy tôi có xu hướng sử dụng bàn phím đó. Có rất nhiều dấu hiệu hữu ích như thế này, xem :help mark-motions.

Đối với một số chuyển động khác (không phải 2jtôi nghĩ), cũng có danh sách nhảy cho phép bạn điều hướng qua lại giữa một số chuyển động. CtrlOCtrlIlàm điều hướng này, nhưng xem :help jump-motionsđể biết thêm thông tin.


3
thực tế không ai trong số họ cư xử đúng như tôi mong đợi nhưng tôi đoán không có gì khác.
Idan K

1
@Idan K - làm thế nào `` (double backtick) không cung cấp cho bạn chính xác những gì bạn muốn? (Ngoại trừ khía cạnh "lịch sử").
Dan

3
@Dan: nếu tôi thử nó ở ví dụ trên thì tôi thấy hành vi này: Tôi đứng trên dòng 1, sau đó nhấn jhai lần liên tiếp (bây giờ tôi đang ở dòng 3), sau đó nhấn backtick gấp đôi cho tôi dòng 1 và tôi mong đợi nó di chuyển đến dòng 2.
Idan K

2
Tôi nghĩ bạn phải di chuyển (2j hoặc một cái gì đó), sau đó chỉnh sửa (hoặc thực hiện bất kỳ hành động nào để sửa đổi văn bản), sau đó sử dụng '' để quay trở lại vị trí trước đó. Điều đó không hợp lý khi sử dụng "2j", không làm gì và quay trở lại vị trí trước đó
Asenar

8
@IdanK Jumplist chỉ được cập nhật (tức là vị trí con trỏ trước đó được ghi lại) khi bạn sử dụng một "bước nhảy" thực sự, đó là (tôi nghĩ) bất kỳ lệnh chuyển động nào ngoài các i j k lchuyển động. (Danh sách đầy đủ, từ các tài liệu trợ giúp, là "'"', "`", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" and the commands that start editing a new filevậy.) Vì vậy, điều này sẽ không "hoàn tác" 2jhoặc tương tự, nhưng nó sẽ hoạt động cho hầu hết mọi thứ khác. Điều này có ý nghĩa bởi vì 2jet al. đã có các nghịch đảo đơn giản ( 2k, v.v.), trong khi những cái khác thì không.
Kyle Strand

61

Bạn cũng có thể sử dụng g;g,để di chuyển qua lại trong danh sách các vị trí chỉnh sửa trước đó của mình .

Trên bàn phím không phải của Hoa Kỳ

Trên bố trí bàn phím Thụy Sĩ và Đức của tôi, việc gõ phím ;bất tiện đòi hỏi phải sử dụng Shiftphím. Do đó, tôi định nghĩa g-như một bí danh thuận tiện hơn cho g;trong $MYVIMRC:

" Map g- as an alias for g;
nnoremap g- g;

Mặc dù tôi rất thích điều này, nhưng nó sẽ chỉ chuyển giữa các thay đổi trong một tệp. Nếu bạn chỉnh sửa bộ đệm 1, sau đó chỉnh sửa bộ đệm 2, nó sẽ không quay trở lại bộ đệm 1.
thouliha

39

Tại sao không ai tìm ra vấn đề với câu trả lời của DrAl ? Các ''hoặc ``sẽ không giải quyết vấn đề ban đầu của bài viết này! Hai lệnh này sẽ không hoạt động đối với một số chuyển động con trỏ như2j , ít nhất là đối với tôi. Nó sẽ làm cho newbie để vim bối rối hơn.

Hành vi của ''hay ``, và CtrlIhay CtrlOđược dựa trên danh sách nhảy. Các 2jsẽ không lưu các thay đổi vị trí vào danh sách nhảy do đó, những lệnh sẽ không làm việc cho 2j.

''hoặc ``chuyển đổi giữa vị trí cuối cùng và vị trí hiện tại. CtrlICtrlOlàm việc thông qua lịch sử danh sách nhảy.

g;g,di chuyển qua các vị trí chỉnh sửa, cũng được sử dụng rất thường xuyên.


1
Cảm ơn đã chỉ ra điều này! Tôi tự hỏi, những gì sẽ làm việc cho các trường hợp như 2j, sau đó?

33

Ngay từ trợ giúp (: nhảy giúp):

: ju [mps] In danh sách nhảy (không phải lệnh chuyển động). {không có trong Vi} {không khả dụng nếu không có | + jumplist | đặc tính}

                          *jumplist*

Nhảy được ghi nhớ trong một danh sách nhảy. Với lệnh CTRL-O và CTRL-I, bạn có thể đi đến các vị trí con trỏ trước khi nhảy cũ hơn và quay lại. Do đó bạn có thể di chuyển lên và xuống danh sách. Có một danh sách nhảy riêng cho mỗi cửa sổ. Số lượng mục nhập tối đa được cố định là 100. {không khả dụng nếu không có | + jumplist | đặc tính}

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.