Làm cách nào để chuyển đến vị trí chỉnh sửa cuối cùng của tôi?


68

Tôi thường thay đổi ở giữa một tệp lớn, sử dụng ggđể nhảy lên trên cùng để kiểm tra một cái gì đó và sau đó nhận ra rằng tôi đã quên đặt dấu ở nơi tôi đang chỉnh sửa. Có cách tích hợp nào để nhảy đến vị trí của dòng thay đổi cuối cùng không?

Câu trả lời:


84

Các `.lệnh sẽ đưa bạn đến sự thay đổi cuối cùng của bạn.

Dấu ấn `đi đến một dấu và .là dấu "đặc biệt" được tự động đặt ở vị trí thực hiện thay đổi cuối cùng. Xem :help `.để biết thêm thông tin.

Ngoài ra còn ``có nó sẽ đưa bạn trở lại nơi con trỏ đã ở trước khi bạn thực hiện bước nhảy cuối cùng. Xem : giúp đỡ`` để biết thêm thông tin.

Một dấu hiệu hữu ích khác là `^; đây là vị trí mà con trỏ là lần cuối cùng khi chế độ chèn bị dừng. Xem :help `^.

Xem :help mark-motionsđể biết thêm thông tin chung về việc sử dụng nhãn hiệu (bao gồm một số nhãn hiệu "đặc biệt" khác được đặt tự động).


7
Bạn cũng có thể sử dụng g;g,để di chuyển giữa các vị trí trong danh sách thay đổi. Xem :h g;:h g,
Peter Rincker

3
Bạn cũng có thể sử dụng '(dấu nháy đơn) thay vì `(backtick).
Sparhawk

21

Đây là một cách tiếp cận khác phù hợp với kịch bản đã cho của bạn và sẽ chuyển đến nơi bạn đã ở ngay trước dòng gg(không đến dòng thay đổi cuối cùng).

Sử dụng CtrlO

Khi bạn nhấn gg, vị trí con trỏ cũ của bạn sẽ được đẩy vào danh sách nhảy . Từ :help jumplist:

Nhảy được ghi nhớ trong một danh sách nhảy. Với lệnh CTRL-OCTRL-Ibạ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.

[Càng]

Nếu bạn sử dụng lệnh nhảy, số dòng hiện tại sẽ được chèn vào cuối danh sách nhảy. Nếu cùng một dòng đã có trong danh sách nhảy, nó sẽ bị xóa. Kết quả là khi lặp lại, CTRL-Obạn sẽ quay lại vị trí cũ chỉ một lần.

Điều này đòi hỏi bạn phải sử dụng Vim (không phải vi) với +jumplisttính năng này. Nếu :echo has('jumplist')in 1, sau đó bạn có thể sử dụng này.


19

Để thêm vào câu trả lời của dnetserr và bình luận của Peter Rincker's, Vim duy trì một danh sách các thay đổi và có một số lệnh liên quan đến điều này.

:changes

sẽ liệt kê các thay đổi, cho bạn thấy chúng ở đâu và chúng là gì. Ví dụ:

change line  col text
    2     8   17 #include <stdio.h>
    1     3    0 #include "stm32f407.auto.h"
>

Dòng với các >chương trình mà bạn đang ở trong ngăn xếp thay đổi, giống như danh sách nhảy ( :jumps) hoặc ngăn xếp thẻ ( :tags). Cũng giống như danh sách nhảy và ngăn xếp thẻ, bạn có thể duyệt qua danh sách này.

Trong chế độ bình thường, các chuyển động là g;đi đến một vị trí thay đổi trước đó và g,đi đến vị trí tiếp theo. Bạn cũng có thể nhập số lượng thay đổi trước g;hoặc g,đến thay đổi đó từ danh sách. Ở trên, 2g;sẽ đưa tôi đến nơi xảy ra thay đổi liên quan đến stdio.h.

Khi ở giữa ngăn xếp, các số từ :changescập nhật để hiển thị khoảng cách tương đối. Ví dụ:

change line  col text
    1     8   17 #include <stdio.h>
>   0     3    0 #include "stm32f407.auto.h"
    1    10    4 other

Điều này cho thấy rằng tôi có thể quay lại một ( 1g;hoặc chỉ g;) hoặc chuyển tiếp một ( 1g,hoặc chỉ g,).

Điều này thật tuyệt nếu thay đổi bạn muốn thực sự xảy ra một vài sửa đổi trước đây

Nhược điểm của điều này là nó dường như không hoạt động như một chuyển động bình thường. Ví dụ: bạn không dg;thể xóa từ con trỏ đến vị trí thay đổi trước đó, trong khi đó d'.d'^thực hiện công việc như chuyển động.


15

g; sẽ đi đến dòng chỉnh sửa trước đó.


3
Bạn cũng có thể sử dụng g, (dấu phẩy) để đến vị trí chỉnh sửa mới hơn.
James

5

Vì lệnh hoàn tác trong Vi sẽ hoạt động như một lần làm lại khi lệnh cuối cùng được hoàn tác, tôi đã sử dụng uunhư một phương tiện để quay lại nơi tôi chỉnh sửa lần cuối.

Nếu bạn đang chạy Vim với nocompatiblebộ (như hầu hết mọi người làm), bạn muốn sử dụng utheo sau CTRL+Rđể hoàn tác & làm lại. Nếu không uusẽ làm việc như trong Vi.


Nó sẽ nếu :set nocompatiblekhông được sử dụng.
muru

2
My vim(with nocompatible) thực hiện hai lần hoàn tác với uu, nhưng tôi sử dụng uCTRL+rcho cùng một hiệu ứng.
Shahbaz

Câu trả lời này có lợi thế là nó cũng hoạt động với vi, trong trường hợp bạn không có vim trên Aix / HPUX / Solaris / các biến thể Unix khác.
Guntram Blohm
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.