Bagaimana saya melakukan redo (yaitu "undo undo") di Vim?

697

Di Vim, saya melakukan terlalu banyak membatalkan. Bagaimana saya membatalkan ini (yaitu, ulang)?

flybywire
sumber
106
karena saya sudah mengumpulkan 2 suara dekat, saya pikir ini milik sini karena vim adalah editor seorang programmer.
flybywire
28
Saya setuju, ini terkait dengan pemrograman dan ini adalah pertanyaan nyata.
DigitalRoss
41
Seseorang di sekitar sini berkeliling dan menandai setiap pertanyaan Vim sebagai "milik SU" meskipun komunitas telah lama memutuskan bahwa Vim milik SO, itu menjadi alat pemrograman.
Brian Carper
@ Brian: Apakah Anda memiliki tautan ke dokumen tempat konsensus ini tercapai?
terlalu banyak php
12
meta.stackexchange.com/questions/20251/… tapi saya ingat ini muncul tahun lalu kapan-kapan. Vim / Emacs adalah IDE. Selain itu bahasa yang digunakan dalam file konfigurasi untuk keduanya adalah bahasa scripting Turing-lengkap, sehingga tindakan pengaturan Vim itu sendiri pemrograman untuk memulai.
Brian Carper

Jawaban:

907

Ctrl+r

John Millikin
sumber
2
Saya hanya ingin membuang plugin undoTree di luar sana, sangat luar biasa untuk saat-saat Anda tampaknya mengacaukan diri Anda dengan kesibukan undo dan redos.
Penjual Jake
3
Jika saya membaca tentang vi, maka jari saya hanya bertindak sendiri. Perintah vi tidak bekerja pada stackoverflow. :-)
ciscogambo
2
Catatan untuk pengguna Mac: Ctrl + r di terminal Mac akan merusak hari Anda di vim. Tidak tahu kombo kunci yang tepat di terminal Mac untuk membatalkan, tetapi pasti TIDAK Ctrl + r!
tpartee
@partee Saya hanya menggunakan Ctrl + r dalam vim di bawah aplikasi Terminal macOS - tidak ada masalah di sini.
Jase
3
Mungkin @tpartee berarti Cmd + rmengacaukan segalanya? Ini tentu saja melakukan sesuatu yang aneh; tetapi Ctrl + rhanya bekerja dengan baik untuk saya (Mac + tmux + vim)
dwanderson
133

Lihat juga :undolist, yang menawarkan banyak jalur melalui riwayat undo. Ini berguna jika Anda secara tidak sengaja mengetik sesuatu setelah membatalkan terlalu banyak.

Peter
sumber
22
@amindfv: ambil nomor dari :undolistdan ketik :undo 178(katakan) untuk mundur ke langkah 178.
Peter
apakah ada cara untuk menunjukkan apa yang sebenarnya akan dibatalkan :undolist?
csharpfolk
2
@csharpfolk Gunakan plugin undotree ( github.com/mbbill/undotree )
54

Gunakan :earlier/ :later. Untuk mengulang semua yang perlu Anda lakukan

later 9999999d

(dengan asumsi bahwa Anda pertama kali mengedit file paling banyak 9999999 hari yang lalu), atau, jika Anda ingat perbedaan antara kondisi undo saat ini dan yang diperlukan, gunakan Nh, Nmatau Nsmasing-masing untuk jam, menit dan detik. + :later N<CR><=> Ng+dan :later Nfuntuk menulis file.

ZyX
sumber
1
:laterbekerja untuk saya vi(bukan vim - mencari "vi" di google tetapi semua hasil untuk "vim"), terima kasih!
Luc
@ Luc Hampir di mana pun Anda memiliki viperintah itu adalah symlink ke vim executable atau salinannya. Tidak sepenuhnya di mana-mana.
ZyX
@ZyX Saya berharap itu benar. Saya hanya menggunakan vi setelah bash melempar a vim: command not found. Hal berikutnya yang saya lakukan adalah alias vim=vikarena saya mengetiknya secara otomatis, tetapi ini adalah vi yang lama. Juga, redo (ctrl + r) akan berfungsi dengan baik seandainya vi menjadi alias untuk vim.
Luc
2
9999999d adalah 27395 tahun yang lalu. Saya berasumsi bahwa fitur undo tidak diterapkan di vi saat itu. Anda mungkin ingin menghemat usaha pengetikan yang lengkap dan menggunakan angka yang masuk akal. 9999d correspongs hingga sekitar 27 tahun, 999d hingga 2,7 tahun. Saya kira dalam kebanyakan kasus itu sudah cukup ...
ChristophK
45

Dokumentasi Vim

<Undo>      or                  *undo* *<Undo>* *u*
u           Undo [count] changes.  {Vi: only one level}

                            *:u* *:un* *:undo*
:u[ndo]         Undo one change.  {Vi: only one level}

                            *CTRL-R*
CTRL-R          Redo [count] changes which were undone.  {Vi: redraw screen}

                            *:red* *:redo* *redo*
:red[o]         Redo one change which was undone.  {Vi: no redo}

                            *U*
U           Undo all latest changes on one line.  {Vi: while not
            moved off of it}
geowa4
sumber
30

Dalam mode perintah, gunakan Utombol untuk membatalkan dan Ctrl+ runtuk mengulang. Lihat http://www.vim.org/htmldoc/undo.html .

Xinus
sumber
Bagaimana dengan mode insert?
YuFeng Shen
1
@YuFengShen kekuatan vim ada dalam mode perintah. kita tidak perlu mengulang dalam mode penyisipan
Tomas Hrubovcak
Tautan ini (secara efektif) rusak.
Peter Mortensen
14

Pertama-tama tekan Esctombol untuk keluar dari mode edit.

Kemudian,

Untuk membatalkan , gunakan ukunci sebanyak yang ingin Anda batalkan.

Untuk mengulang , gunakan tombol Ctrl+r

Amol Udage
sumber
11

Lihat bagian "undo" dan "redo" dari dokumen Vim .

: red [o] (Mengulang satu perubahan yang dibatalkan) dan {count} Ctrl+ r(Mengulangi {count} perubahan yang dibatalkan) keduanya ok.

Juga ,: {{}} awal (pergi ke keadaan teks lebih lama {count} kali) selalu bisa menjadi pengganti untuk undo dan redo.

Wangxinalex
sumber
5

CTRL+r

Huruf "r" adalah huruf kecil.

mimetnet
sumber
9
Sebenarnya, itu seharusnya tidak masalah - konsol tradisional tidak memiliki perbedaan antara ^rdan ^R, dan Vim mengikuti itu.
ephemient
@ephemient: setuju. Di MS-DOS, Anda bahkan tidak bisa mengetikkan huruf kecil ^X(di mana Xbisa huruf apa saja).
nyuszika7h
Di Vim, Ctrl-shift-R (ctrl dengan huruf besar R) adalah mode ganti.
Paul Stelian
5

Menggunakan VsVim untuk Visual Studio?

Saya menemukan ini ketika bereksperimen dengan VsVim, yang menyediakan binding untuk perintah Vim di Visual Studio .

Saya tahu tentang CtrlrVim sendiri, tetapi pengikatan khusus ini tidak berfungsi di VsVim (setidaknya tidak di pengaturan saya?).

Apa yang tidak bekerja bagaimanapun, adalah perintah :red. Ini sedikit lebih merepotkan daripada yang di atas, tetapi masih baik ketika Anda benar-benar membutuhkannya.

Kjartan
sumber
Diturunkan karena pertanyaannya adalah menanyakan secara khusus tentang vim, bukan Visual Studio.
John Von Neumann
3
@JohnVonNeumann ini adalah terkait dengan Vim, atau binding setidaknya vim, hanya dalam konteks VS. Itulah yang membawa saya ke pertanyaan ini. Menghukum seseorang karena menambahkan sedikit info lebih lanjut tampaknya agak keras dan tidak pantas untuk Anda pikir, bahkan jika itu mungkin sedikit meluas melampaui ruang lingkup OP?
Kjartan
2

Secara praktis, :undolistsulit untuk digunakan dan pelacakan Vim :earlierdan :laterwaktu perubahan hanya dapat digunakan untuk perbaikan butir saja.

Karena itu, saya menggunakan plug-in yang menggabungkan fitur-fitur ini untuk menyediakan pohon visual undos yang dapat dijelajahi, yang disebut "Gundo."

Jelas, ini adalah sesuatu untuk digunakan hanya ketika Anda membutuhkan perbaikan yang halus, atau Anda tidak yakin dengan keadaan pasti dari dokumen yang ingin Anda kembalikan. Lihat: Gundo. Buat grafik Vim batalkan pohon dengan gaya

gregory
sumber