Ketika kita mengedit file, kita biasanya melakukan banyak UNDO berturut-turut, katakanlah, 20 kali. Dalam VIM, itu biasanya dilakukan dengan menekan u
20 kali, dan itu membuat VIM naik "ke atas" di tumpukan sejarah 20 posisi. Jika Anda kemudian memastikan change
, semua 20 perintah sejarah terakhir hilang, dan digantikan oleh change
. Saya ingin membuatnya change
tanpa kehilangan 20 posisi itu. Jadi saya kira saya ingin memberitahu VIM untuk berhenti merekam riwayat sebelum saya melakukannya change
, dan melanjutkan riwayat sesudahnya (tidak ingin change
dalam sejarah).
EDIT
Mencoba menjadi lebih jelas: Saya memiliki fungsi FF
yang memperbarui baris terakhir file ketika buffer ditulis. Jadi, jika saya melakukan 20 undos + write
, yang terakhir write
membuka cabang undo baru. Saya mencoba menambahkan undojoin
di dalam FF
(mencoba mengikuti saran oleh jlmg di bawah), tetapi urutan write-undo-write memberikan kesalahan: undojoint tidak diizinkan setelah membatalkan . Saya malah bisa melakukan beberapa sed ....
setelah meninggalkan vim
sebagai gantinya, tetapi karena saya menggunakan ini melalui SSH
saya lebih suka solusi vim-only (jalankan perintah setelah membongkar buffer tidak menulis ke file).
EDIT 2 Coba lakukan ini di VIM: buka file kosong, dan lakukan:
i1<ESC>:wa2<ESC>:wa3<ESC>:wa4<ESC>uu:w
Jika sekarang Anda melakukan <CTRL>R
, VIM akan menulis '3' kembali, selanjutnya <CTRL>R
Anda mendapatkan 4
. Ini terjadi bahkan jika Anda melakukan :w
setelah masing-masing <CTRL>R
. Namun, jika setiap kali Anda melakukan :w
Anda menjalankan fungsinya melalui BufWritePre
, <CTRL>R
tidak akan menulis 3
kembali. Dan inilah yang ingin saya lakukan, itu sebabnya saya menulis untuk 'menunda hisotry', tapi mungkin yang saya minta tidak mungkin, selain bekerja dengan penuh undotree()
.
vi
, tetapi bagi sayavi
perintah undo membatalkan sekali, dan kemudian ketika Anda menekanu
lagi membatalkan undo ("redo"). Itu nyata vi. Jadi saya dan pengguna lain dari situs ini mungkin tidak tahu jawaban atas pertanyaan Anda.vim.se
, saya akan mencobanya. Ngomong-ngomong, sepertinya Sato tahu bagaimana membantu.sed
, tetapi sed tidak dapat melakukan undo Anda, jadi bagaimana cara kerjanya? Jika Anda dapat "menangguhkan sejarah", perilaku seperti apa yang Anda harapkan dari vim ketika Anda melakukan undo sesudahnya? Satu-satunya perilaku yang dapat saya visualisasikan adalah mengelompokkan perubahan tersebut (bersama dengan undo) dalam satu blok undo, maka jawaban saya. Tapi kalau bukan itu, apa?Jawaban:
Anda tidak perlu menangguhkan riwayat Vim. Data aktual membentuk pohon, dan Anda dapat mengambilnya dengan
undotree()
fungsinya. Tentu saja ada sejumlah plugin yang mengubahnya menjadi sesuatu yang lebih ramah pengguna, seperti gundo , mundo , dan undotree . Jika Anda juga mengaktifkan undo persistence (lih.:h undo-persistence
) Anda dapat dengan mudah menavigasi seluruh perubahan sejarah file.sumber
undotree()
harus membantu?change
tidak muncul sama sekali, di mana pun, dihistory
, atau diundo
pohon. Itu sebabnya pertanyaan saya adalah untuk "menangguhkan sejarah".:earlier
, yang menerima satuan waktu dan akan menyeberang membatalkan cabang jika perlu (mis.:earlier 1h
Membuat buffer terlihat seperti itu satu jam yang lalu). Jika Anda tidak dapat menggunakan unit waktu (karena perubahannya terlalu berdekatan?) Maka Anda harus menggunakang-
berjalan undo tree beberapa langkah sekaligus.Jika saya mengerti Anda dengan benar apa yang Anda inginkan adalah bahwa setelah melakukan undo harus membatalkan itu
change
dan 20 membatalkan .Ketika vim mengeksekusi fungsi atau perintah, semua tindakan yang dilakukannya dibatalkan bersama-sama. Saya tidak yakin apakah tindakan itu mungkin termasuk undos. Mungkin bagian dokumentasi ini dapat membantu:
Sayangnya, saya mencoba menggunakan
:undo 2 | undojoin | normal ohi
, tetapi saya mendapat pesan kesalahanE790: undojoin is not allowed after undo
.Namun, jika tindakan dilakukan dalam fungsi seperti ini:
kemudian memanggilnya dengan
:call F()
melakukan tindakanundo
dan lainnya dalam satu blok undo. Perhatikan bahwa karena Anda menggunakan undo Anda membuat cabang undo baru. Setelah selesai, Anda dapat menggunakan perintah mode normalg-
, untuk membatalkanF()
; menggunakanu
akan seperti yang dilakukan:undo 3
di awal.sumber
undo
, semua yang Anda lakukan dalam fungsiF()
Anda tidak membuka cabang undo baru. Dalam kasus saya,F()
dijalankan setiap kali saya menulis file, dan jika saya melakukannyaundo
dan kemudian menulis file,F()
buka cabang undo baru. Aku mencoba denganundojoin
di awalF()
, tetapi urutan write-undo-write memberikan kesalahan:undojoint not allowed after undo
.:undojoin
tidak bekerja untuk apa yang Anda inginkan, menyebutkan kesalahan yang sama, dan saya tidak menyarankan untuk digunakan:undojoin
pada awalF()
.F()
dimaksudkan untuk melakukan apa yang:undojoin
tidak bisa, yaitu bergabung dengan undo dan perintah lain dalam satu blok undo.g-
dang+
.