Bagaimana cara saya melompat ke lokasi hasil edit terakhir saya?

68

Saya sering membuat perubahan di tengah file besar, gunakan gguntuk melompat ke atas untuk memeriksa sesuatu, dan kemudian menyadari bahwa saya lupa untuk menetapkan tanda di mana saya mengedit. Apakah ada cara bawaan untuk melompat ke lokasi baris yang terakhir diubah?

bdesham
sumber

Jawaban:

84

The `.perintah akan membawa Anda ke perubahan terakhir Anda.

The `pergi ke tanda, dan .merupakan "khusus" tanda yang diatur secara otomatis ke posisi di mana perubahan terakhir dibuat. Lihat :help `.untuk informasi lebih lanjut.

Ada juga ``yang akan membawa Anda kembali ke tempat kursor berada sebelum Anda melakukan lompatan terakhir Anda. Lihat : bantuan`` untuk informasi lebih lanjut.

Tanda lain yang bermanfaat adalah `^; ini adalah posisi di mana kursor terakhir kali ketika mode insert dihentikan. Lihat :help `^.

Lihat :help mark-motionsbeberapa info umum tentang penggunaan tanda (termasuk beberapa tanda "khusus" lainnya yang secara otomatis ditetapkan).

howardh
sumber
7
Anda juga dapat menggunakan g;dan g,untuk berpindah di antara posisi dalam daftar perubahan. Lihat :h g;dan:h g,
Peter Rincker
3
Anda juga dapat menggunakan '(apostrof) alih-alih `(backtick).
Sparhawk
21

Berikut ini pendekatan lain yang sesuai dengan skenario yang Anda berikan, dan akan melompat ke tempat Anda sebelumnya sebelum gg(bukan ke baris yang diubah terakhir).

Menggunakan CtrlO

Ketika Anda menekan gg, posisi kursor lama Anda didorong ke daftar lompatan . Dari :help jumplist:

Lompatan diingat dalam daftar lompatan. Dengan perintah CTRL-Odan CTRL-IAnda dapat pergi ke posisi kursor sebelum lompatan yang lebih lama, dan kembali lagi. Dengan demikian Anda dapat naik dan turun daftar. Ada daftar lompatan terpisah untuk setiap jendela. Jumlah entri maksimum adalah 100.

[...]

Jika Anda menggunakan perintah lompat, nomor baris saat ini dimasukkan di akhir daftar lompat. Jika baris yang sama sudah ada di daftar lompatan, itu dihapus. Hasilnya adalah ketika mengulangi CTRL-OAnda akan kembali ke posisi lama hanya sekali.

Ini mengharuskan Anda menggunakan Vim (bukan vi) dengan +jumplistfitur tersebut. Jika :echo has('jumplist')dicetak 1, maka Anda dapat menggunakan ini.

wchargin
sumber
19

Untuk menambah jawaban dnetserr dan komentar Peter Rincker, Vim menyimpan daftar perubahan, dan memiliki beberapa perintah yang terkait dengan ini.

:changes

akan mendaftar perubahan, menunjukkan kepada Anda di mana mereka berada dan apa itu. Sebagai contoh:

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

Baris dengan >menunjukkan di mana di tumpukan perubahan Anda, jenis seperti daftar lompat ( :jumps) atau tag tumpukan ( :tags). Juga seperti daftar lompat dan tumpukan tag, Anda dapat melintasi daftar ini.

Dalam mode normal, gerakannya adalah g;untuk pergi ke lokasi perubahan sebelumnya, dan g,untuk pergi ke yang berikutnya. Anda juga dapat mengetikkan nomor perubahan sebelum g;atau g,untuk pergi ke perubahan itu dari daftar. Di atas, 2g;akan membawa saya ke tempat perubahan yang melibatkan stdio.h terjadi.

Ketika di tengah tumpukan, angka-angka dari :changespembaruan menunjukkan jarak relatif. Sebagai contoh:

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

Ini menunjukkan bahwa saya dapat kembali satu ( 1g;atau hanya g;) atau meneruskan satu ( 1g,atau hanya g,).

Ini bagus jika perubahan yang ingin Anda lakukan benar-benar terjadi beberapa modifikasi yang lalu

Kerugian dari ini adalah bahwa ia tampaknya tidak bertindak seperti gerakan normal. Misalnya, Anda tidak dg;dapat menghapus dari kursor ke lokasi perubahan sebelumnya, sedangkan d'.dan d'^lakukan sebagai gerakan.

John O'M.
sumber
15

g; akan menuju ke baris yang sebelumnya diedit.

dnetserr
sumber
3
Anda juga dapat menggunakan g, (koma) untuk menuju ke posisi pengeditan yang lebih baru.
James
5

Karena perintah undo di Vi akan bertindak sebagai re-do ketika perintah terakhir dibatalkan, saya telah menggunakan uusebagai sarana untuk kembali ke tempat saya terakhir diedit.

Jika Anda menjalankan Vim dengan nocompatibleset (seperti kebanyakan orang), Anda ingin menggunakan udiikuti oleh CTRL+Runtuk membatalkan & mengulang. Kalau tidak uuakan bekerja seperti di Vi.

hlovdal
sumber
Itu akan jika :set nocompatibletidak digunakan.
muru
2
My vim(with nocompatible) melakukan dua undo with uu, tapi saya menggunakan udan CTRL+runtuk efek yang sama.
Shahbaz
Jawaban ini juga memiliki kelebihan yaitu berfungsi dengan vi, jika Anda tidak memiliki vim pada Aix / HPUX / Solaris / varian Unix lainnya.
Guntram Blohm