Bagaimana Anda 'mengulang' perubahan setelah 'membatalkan' dengan Emacs?

268

Artikel ini mengatakan bahwa "Emacs telah diulang karena Anda dapat membalikkan arah saat membatalkan, dengan demikian membatalkan membatalkan".

Apa artinya ini? Bagaimana cara pengguna melakukan ulang dengan Emacs?

prosseek
sumber
3
Jawaban di bawah jawaban yang diterima memberi tahu Anda bagaimana , jika itu sebabnya Anda melihat jawaban ini, yang, mengingat bagaimana ini ditulis, saya berharap sebagian besar orang benar-benar mencari itu.
Aaron Hall
Saya baru saja menekan spasi, dan kemudian membatalkan setelah itu membatalkan ruang dan mengulangi membatalkan yang Anda lakukan sampai sampai pada akhir dan kemudian mulai kembali lagi ... Saya tahu ada banyak cara yang lebih rumit, tapi ini cepat dan mudah, dan itulah cara saya roll.
nroose

Jawaban:

294

Versi singkat: dengan membatalkan undo. Jika Anda membatalkan, dan kemudian melakukan perintah non-editing seperti C-f, maka membatalkan berikutnya akan membatalkan membatalkan, menghasilkan pengulangan.

Versi yang lebih panjang:

Anda dapat menganggap membatalkan sebagai operasi pada setumpuk operasi. Jika Anda melakukan beberapa perintah (bahkan perintah navigasi seperti C-f) setelah urutan operasi undo, semua undo didorong ke tumpukan operasi. Jadi membatalkan berikutnya membatalkan perintah terakhir. Misalkan Anda memiliki urutan operasi yang terlihat seperti ini:

  1. Masukkan "foo"
  2. Sisipkan "bar"
  3. Masukkan "Saya suka spam"

Sekarang, Anda membatalkan. Ini membatalkan tindakan terakhir, menghasilkan daftar berikut:

  1. Masukkan "foo"
  2. Sisipkan "bar"

Jika Anda melakukan sesuatu selain membatalkan pada saat ini - katakanlah, C-ftumpukan operasi terlihat seperti ini:

  1. Masukkan "foo"
  2. Sisipkan "bar"
  3. Masukkan "Saya suka spam"
  4. Batalkan memasukkan "Saya suka spam"

Sekarang, ketika Anda membatalkan, hal pertama yang dibatalkan adalah yang dibatalkan. Menghasilkan tumpukan asli Anda (dan status dokumen):

  1. Masukkan "foo"
  2. Sisipkan "bar"
  3. Masukkan "Saya suka spam"

Jika Anda melakukan perintah modifikasi untuk memecahkan urutan undo, perintah itu ditambahkan setelah undo dan dengan demikian hal pertama yang harus dibatalkan setelahnya. Misalkan Anda mundur dari "bar" alih-alih memukul C-f. Maka Anda akan memilikinya

  1. Masukkan "foo"
  2. Sisipkan "bar"
  3. Masukkan "Saya suka spam"
  4. Batalkan memasukkan "Saya suka spam"
  5. Hapus "bilah"

Penambahan / penambahan ulang ini terjadi tanpa batas waktu. Dibutuhkan sedikit membiasakan diri, tetapi itu benar-benar memberi Emacs mekanisme undo / redo yang sangat fleksibel dan kuat.

Michael Ekstrand
sumber
117
Kalau-kalau ini terdengar mengganggu, keuntungan utama adalah bahwa Anda selalu dapat kembali ke keadaan sebelumnya. Di sebagian besar editor, membatalkan beberapa perubahan dan kemudian mengetik karakter secara tidak sengaja akan membuat Anda 'terdampar' tanpa cara untuk mengulang apa yang telah Anda batalkan. Emacs membuat ini sepele.
phils
3
Saya kira dalam konstruksi Anda, jika seseorang ingin melakukannya di atas kertas, Anda akan membutuhkan dua tumpukan. Karena misalnya, pada titik di mana Anda menulis "Sekarang, Anda membatalkan. Itu membatalkan tindakan terakhir, menghasilkan berikut daftar: "Anda (dapat dimengerti) tidak menunjukkan pembatalan, dan jika dia telah melakukan banyak pembatalan, Anda tidak akan menunjukkannya sampai sesuatu dilakukan untuk memecahkan urutan pembatalan, maka Anda akan menambahkannya. Cara lain untuk menunjukkannya adalah dengan memiliki satu daftar, dan menambahkan undo ke daftar bahkan sebelum rusak tetapi untuk mencatat di mana kursor ada dalam daftar, jadi kami tahu di mana undo bekerja mundur dari
barlop
25
Kedengarannya menyebalkan.
Felipe
13
Saya tidak tahu mengapa jawaban ini diterima ketika itu bahkan tidak memberitahu Anda BAGAIMANA .
Aaron Hall
8
Sayangnya jawaban ini tidak mengatakan apa-apa tentang perintah redo yaitu Cg C- /.
vishnuprasanth
211

Untuk membatalkan: C-_

Untuk mengulang setelah membatalkan: C-g C-_

Ketikkan beberapa kali C-_ untuk mengulang apa yang telah dibatalkan oleh C-_ Untuk mengulang perintah emacs beberapa kali, jalankan perintah Anda lalu ketik C-xzdan kemudian ketik berkali-kali pada ztombol untuk mengulangi perintah (menarik ketika Anda ingin menjalankan beberapa kali makro)

Jérôme Radix
sumber
4
Untuk mengulangi hal-hal yang dapat Anda gunakan C-u, misalnya C-u 8 *(memasukkan delapan * di mana tanda sisipan berada). Jadi Anda bisa gunakan C-u x C-_untuk membatalkan langkah x .
Patrick
10
Ini tidak ada hubungannya dengan pertanyaan awal, tetapi setelah menjalankan makro keyboard (dengan C-x e), Anda bisa menekan esesering yang Anda perlukan untuk menjalankannya lagi.
Christian Berg
7
Juga, C-/dan C-x ualternatif membatalkan ikatan kunci, setara dengan C-_. Saya lebih suka C-/karena lebih mudah dipukul.
Rory O'Kane
8
Peringatan: ketika jawaban ini mengatakan bahwa C-g C-_akan "mengulang setelah membatalkan", itu hanya berlaku saat Anda pertama kali menekan kombinasi. Setelah itu, ulangi kunci undo Anda tanpa C-g. Jadi untuk mengulang tiga kali tepat setelah kehancuran, ketik C-g C-_ C-_ C-_. Jika Anda mengetik C-g C-_ C-g C-_ C-g C-_, Anda hanya akan berputar-putar, membatalkan pengulangan dari ...
Rory O'Kane
@ RoryO'Kane Saya tidak tahu banyak tentang emacs, jadi tolong perbaiki saya di mana saya salah, tetapi mengingat bahwa Cg C-_ tidak memiliki efek setelah redo, mungkinkah itu karena ia hanya beroperasi setelah sebuah undo (seperti uraian "redo after an undo" menyarankan. Jadi tidak terlalu banyak sehingga berputar-putar mengulangi undo atau redo dll. itu tidak melakukan apa-apa karena undo tidak hanya dilakukan sebelumnya. jadi Cg C- _ Cg C-_ tidak akan berputar setelah yang pertama, itu benar-benar tidak melakukan apa-apa
barlop
56
  • Untuk membatalkan sekali:C-/
  • Untuk membatalkan dua kali: C-/ C-/
  • Untuk mengulang sekali, segera setelah membatalkan:C-g C-/
  • Untuk mengulang dua kali, segera setelah melepas: C-g C-/ C-/. Catatan yang C-gtidak diulang.
  • Untuk membatalkan segera lagi , sekali:C-g C-/
  • Untuk membatalkan segera lagi, dua kali: C-g C-/ C-/
  • Untuk mengulang lagi , sama ...

Jika Anda telah menekan tombol apa saja (baik mengetik karakter atau hanya menggerakkan kursor) sejak perintah undo terakhir Anda, tidak perlu mengetik C-gsebelum undo / redo berikutnya. C-ghanyalah kunci aman untuk memukul yang tidak melakukan apa-apa sendiri, tetapi dianggap sebagai kunci non-undo untuk menandai akhir dari urutan undo Anda. Menekan perintah lain seperti C-fakan bekerja juga; hanya saja itu akan memindahkan kursor dari tempat Anda memilikinya.

Jika Anda menekan C-gatau perintah lain ketika Anda tidak bermaksud, dan Anda sekarang kehancuran di arah yang salah, cukup tekan C-guntuk membalikkan arah Anda lagi. Anda harus membatalkan semua langkah melalui ulang dan tak sengaja yang tidak disengaja sebelum Anda mencapai undo yang Anda inginkan, tetapi jika Anda terus memukul C-/, pada akhirnya Anda akan mencapai kondisi yang Anda inginkan. Faktanya, setiap negara bagian yang pernah dijangkau oleh penyangga dapat dijangkau, jika Anda menekan C-gsekali dan kemudian menekan C-/waktu yang cukup.

Pintas alternatif untuk undo, selain C-/, adalah C-_, C-x u, dan M-x undo.

Lihat Undo dalam Manual Emacs untuk detail lebih lanjut tentang sistem undo Emacs.

Rory O'Kane
sumber
38

Bagi mereka yang ingin memiliki fungsionalitas undo / redo yang lebih umum, seseorang telah menulis undo-tree.el. Ini memberikan tampilan dan nuansa non-Emacs undo, tetapi memberikan akses ke seluruh 'pohon' dari undo history.

Saya suka sistem undo bawaan Emacs, tetapi menganggap paket ini sangat intuitif.

Inilah komentar dari file itu sendiri:

Emacs memiliki sistem undo yang kuat. Berbeda dengan sistem undo / redo standar dalam perangkat lunak yang paling, ini memungkinkan Anda untuk memulihkan setiap negara di masa lalu penyangga (sedangkan sistem undo / redo standar bisa kehilangan negara masa lalu segera setelah Anda mengulang). Namun, kekuatan ini ada harganya: banyak orang merasa sistem undo Emac membingungkan dan sulit digunakan, menelurkan sejumlah paket yang menggantikannya dengan sistem undo / redo yang kurang kuat tetapi lebih intuitif.

Baik hilangnya data dengan undo / redo standar, dan kebingungan dari undo Emacs, berasal dari mencoba untuk memperlakukan sejarah undo sebagai urutan perubahan linear. Ini bukan. `Undo-tree-mode 'yang disediakan oleh paket ini menggantikan sistem undo Emacs dengan sistem yang memperlakukan sejarah undo seperti apa adanya: pohon perubahan yang bercabang. Ide sederhana ini memungkinkan perilaku yang lebih intuitif dari sistem undo / redo standar untuk dikombinasikan dengan kekuatan tidak pernah kehilangan sejarah. Bonus tambahan yang ditambahkan adalah bahwa undo history dapat disimpan dalam beberapa kasus lebih efisien, memungkinkan lebih banyak perubahan terakumulasi sebelum Emacs mulai membuang histori.

Trey Jackson
sumber
3
Fantastis! Siapa bilang emacs undo tidak terduga? :-)
Peter.O
Luar biasa! suara konseptual dan intuitif pengguna. Ini harus dalam paket default. Satu komentar: Saya berharap beberapa pesan peringatan juga ditampilkan ketika mengulang dari titik cabang, bukan hanya ketika kembali ke titik itu. Misalnya, ketika pengguna memanggil redo: 'Redoing from a branch point' atau 'Default redo branch used' - hanya untuk mengingatkan pengguna bahwa ada lebih dari satu cabang.
Basel Shishani
1
Pendekatan lain untuk masalah ini yang lebih sederhana untuk diimplementasikan dan tidak memerlukan visualizer adalah untuk HANYA menjaga titik cabang terakhir, dan memberikan 3 perintah: undo, redo, switch-branch. Undo / redo akan mengingatkan ketika cabang bercabang, dan beralih-cabang hanya akan beralih jika di cabang lain hanya mengeluarkan pesan 'tidak di cabang'. Jika percabangan terjadi kapan saja, titik cabang sebelumnya hilang. Ini akan menyelesaikan masalah kerugian negara dengan cukup baik dan dengan kompleksitas minimal.
Basel Shishani
1
Waspadalah ini memiliki bug lama dalam pengulangan yang dapat gagal secara acak: github.com/syl20bnr/spacemacs/issues/9903 - diketahui sejak tahun 2014
ideasman42
@ ideasman42 Tampaknya ini adalah "non-bug": dr-qubit.org/Lost_undo-tree_history.html
Dalker
19

Waspadalah terhadap suatu kekalahan membatalkan pohon untuk mengulang !

Banyak “starter kit” populer (prelude, purcell, spacemacs) dibundel dengan undo-tree. Sebagian besar (semua?) Bahkan mengaktifkannya secara otomatis. Seperti disebutkan, undo-tree adalah cara praktis untuk memvisualisasikan dan melintasi pohon undo / redo. Prelude bahkan memberinya kunci-kunci ( uu), dan juga C-x u.

Masalahnya adalah: undo-tree tampaknya merusak standar dan pengikatan Emacs yang terkenal redo :C-g C-/ .

Sebaliknya, kamu bisa menggunakan kunci simetris ini untuk undo / redo :

C-/     undo
C-S-/   redo

Ini berguna karena kadang-kadang Anda ingin mengulang dengan cepat tanpa membuka visualizer.

Micah Elliott
sumber
Ini. Saya menggunakan Spacemacs dan tidak tahu mengapa itu tidak berhasil untuk saya. Terima kasih!
mghaoui
11

Saya merasa sangat redo.elberguna untuk melakukan undo / redo "normal", dan saya biasanya mengikatnya ke CSz dan membatalkan ke Cz, seperti ini:

(when (require 'redo nil 'noerror)
    (global-set-key (kbd "C-S-z") 'redo))

(global-set-key (kbd "C-z") 'undo)

Cukup unduh file, letakkan di path lisp Anda dan rekatkan di atas di file Anda .emacs.

monotux
sumber
Komentar di header redo.el mengatakan bahwa itu dibuat untuk XEmacs. Apakah ada masalah menggunakannya di GNU Emacs dan Emacsen terkait lainnya?
A. Levy
Saya belum punya masalah, dan saya sudah menggunakannya selama minimal 6 bulan :)
monotux
4
Dari emacswiki.org/emacs/RedoMode : Namun, redo.el sudah ketinggalan zaman dan sering menghancurkan konten "buffer karena perilaku 'primitif-undo' sedikit berbeda dari yang lama sejak Emacs 22. RedoPlus adalah garpu redo.el dan berfungsi dengan benar dalam versi Emacs yang lebih baru. Anda bisa mendapatkan RedoPlus di sini: emacswiki.org/emacs/redo+.el
rofrol
2

Emacs 28 menambahkan perintah redo (dipanggil undo-redo).

Jika Anda ingin memiliki undo / redo yang lebih khas, perintah berikut ini dapat digunakan.

(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)
gagasanman42
sumber
1

Jika Anda ingin mengulang operasi terakhir, lakukan hal berikut.

  1. ESC
  2. Lakukan undo lain ( C + /)
anggur
sumber
0

Secara default, mengulang di Emacs memerlukan menekan Cg, lalu membatalkan.

Namun dimungkinkan menggunakan bawaan Emacs untuk membatalkan perintah redo juga.

Paket undo-fu , menggunakan fungsi undo bawaan bawaan Emacs untuk mengekspos undo dan redo.

gagasanman42
sumber