Mungkin tidak menggunakan undo-tree dalam mode jahat?


12

Seringkali saya bertemu bug di undo-tree, di mana saya tidak bisa mengulang, dengan bug yang diketahui berikut , laporan lain & reddit utas .

primitive-undo: Unrecognized entry in undo list undo-tree-canary

Ini benar - benar buruk dan dapat menyebabkan hilangnya pekerjaan jika Anda tidak sengaja menyimpan versi terbaru file tersebut.


Karena saya tidak pernah menggunakan fungsi undo tree branching, mungkinkah menggunakan emacs linear undo dengan mode jahat?


Catatan: Saya sudah mencoba pengaturan (global-undo-tree-mode -1)langsung setelah (evil-mode 1)itu menonaktifkan membatalkan pohon, tetapi mengulang (Ctrl-R) tidak berfungsi setelah melakukan ini.


2
Emacs tidak memiliki perintah 'redo' (Anda malah menghentikan urutan undo, dan kemudian membatalkan urutan sebelumnya dari perintah undo). Sepertinya apa yang Anda lakukan telah bekerja dengan benar.
phils

1
Jika tujuan Anda adalah untuk memperbaiki pembatalan, harap hubungi pembuatnya dan tulis email untuk mereka. Mengeluh pada emacs-devel tidak akan memperbaiki keadaan. Demikian juga, jika tujuan Anda adalah untuk memungkinkan Evil menggunakan vanilla undo, buka tiket pada pelacak bugnya. Perlu diingat bahwa membatalkan vanili hanya membatalkan, tidak ada pengulangan sama sekali, hanya membatalkan membatalkan, maka mengapa membatalkan pohon digunakan di tempat pertama.
wasamasa

1
Tujuan saya adalah untuk membatalkan / mengulang. Aku tidak terlalu sibuk bagaimana. Karena saya tidak menggunakan fungsi pohon dari undo-tree, saya pikir mungkin paling mudah untuk menggunakan emacs built-in undo. Meski begitu, saya telah melaporkan bug ke penulis undo-tree.
ideasman42

Saya memiliki masalah yang sama persis, ini terjadi sekali sehari dan sangat membuat frustrasi
cjohansson

Jawaban:


7

Penulis undo-tree.el, Toby Cubitt, saat ini terlalu sibuk untuk memperbaiki bug khusus ini. Jika dia punya waktu di masa depan, dia mungkin akan menyelidiki masalah ini lebih lanjut. Penulis telah mengindikasikan bahwa ia mengalami kesulitan mereproduksi kesalahan dengan andal, dan baru-baru ini tidak dapat mereproduksi dengan menggunakan cabang master. Ini hanya terjadi ketika menggunakan undo / redo-in-region. Sementara itu penulis menyarankan untuk mematikan fitur undo / redo-in-region.

Saya akan sangat mendorong siapa pun yang termotivasi untuk datang dengan cara yang dapat diandalkan untuk mereproduksi masalah mulai dari emacs -qmenggunakan rilis stabil Emacs saat ini (misalnya, 25.2.1) dan juga dengan versi terbaru dari cabang utama, dan kemudian kirimkan penerima tersebut ke nomor pelacakan bug 16377 dengan salinan karbon kepada para peserta (Stefan, Toby, Barry, dan Keith).

Nomor pelacakan utama adalah 16377, dan ada nomor pelacakan terkait 16523:

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=16377

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=16523

Berikut ini solusinya yang mematikan undo/redo-in-regionfitur:

(setq undo-tree-enable-undo-in-region nil)

1
Penanganan masalah ini tidak berhasil - Saya mencobanya dan kadang-kadang masih rusak.
ideasman42

@ ideasman42 - Sejauh yang saya tahu, Toby Cubitt adalah saat menyadari bahwa kesalahan dapat terjadi ketika undo-tree-enable-undo-in-regionadalah nil; dan, saya juga belum pernah melihatnya terjadi di luar menggunakan undo-in-region. Jika Anda dapat membuat resep untuk mereproduksi kesalahan, silakan laporkan ke tim Emacs - salinan karbon untuk Dr. Cubitt juga akan membantu, dan jika tidak terlalu banyak masalah, saya yakin akan menghargai resep jika Anda dapat menemukan yang bisa diandalkan. Maaf Anda mengalami masalah ...
hukum

Saya mengirim laporan bug tanpa tanggapan (beberapa bulan lalu). Proyek seperti ini yang banyak orang andalkan harus benar-benar memiliki pelacak bug publik.
ideasman42

16377 dan 16523 memang nomor pelacakan bug Emacs publik dan undo-treesecara resmi bagian dari elparepositori. Anda dapat menggunakan bug standar laporan Emacs; Namun, hasil akhirnya mungkin sama - yaitu, menunggu Dr. Cubitt menemukan waktu luang dalam jadwal sibuknya ... Pada titik tertentu, guru undo lain mungkin datang dan membantu dalam menjaga paket. Saya menghabiskan banyak waktu untuk membuat garpu kustom dari undo-tree yang dapat membatalkan / mengulang secara semi-linear, dan saya masih hanya memiliki pemahaman dasar tentang bagaimana semuanya bekerja ...
lawlist

1

Tampaknya Anda dapat mengedit evil-pkg.el di ~ / .emacs.d / elpa / evil-xxxxxxx / dir dan menghapus undo-tree sebagai persyaratan:

(define-package "evil" "20140109.605" "Extensible Vi layer for Emacs." '((goto-chg "1.6")))

sumber


Itu akan merusak undo / redo yang bukan apa yang diinginkan OP.
wasamasa

1
Penulis blog yang saya tautkan mengatakan itu memungkinkan dia untuk menggunakan vanilla undo emacs, yang tampaknya menjadi apa yang diinginkan OP ketika dia mengatakan "disable undo tree".
DaftWooly

1
Ini benar-benar harus menjadi pilihan terakhir, karena pada saat Anda memperbarui paket, penyesuaian ini akan ditimpa. Akan lebih baik untuk menemukan cara untuk mendapatkan perilaku yang Anda inginkan dengan mengkonfigurasi file init Anda.
zck

Saya setuju, sayangnya sepertinya ini satu-satunya cara untuk menonaktifkan undo-tree dalam kejahatan.
DaftWooly

Tidak bekerja untuk saya. Saya berkomentar persyaratan, dan pindah undo-treepaket keluar dari jalan sehingga tidak memuat. Sekarang menggunakan "redo" gagal dengan Wrong type argument: commandp, redo.
Hi-Angel

1

Edit, ini sekarang paket yang bisa digunakan untuk undo / redo dengan evil-mode - undo-fu .


Menambahkan jawaban untuk pertanyaan sendiri karena saya sudah menggunakan evil wo o undo-tree untuk beberapa waktu sekarang.

Ini bekerja sangat baik untuk membatalkan / mengulang yang membungkus emacs tanpa sesuatu yang berat seperti undo-treeatau redo+.

(global-undo-tree-mode -1)

(defun simple-redo ()
  (interactive)
  (let
    (
      (last-command
        (cond
          ;; Break undo chain, avoid having to press Ctrl-G.
          ((string= last-command 'simple-undo) 'ignore)
          ;; Emacs undo uses this to detect successive undo calls.
          ((string= last-command 'simple-redo) 'undo)
          (t last-command))))
    (condition-case err
      (progn
        (undo) t)
      (user-error
        (message "%s" (error-message-string err)))))
  (setq this-command 'simple-redo))

(defun simple-undo ()
  (interactive)
  (let
    (
      (last-command
        (cond
          ;; Emacs undo uses this to detect successive undo calls.
          ((string= last-command 'simple-undo) 'undo)
          ((string= last-command 'simple-redo) 'undo)
          (t last-command))))
    (condition-case err
      (progn
        (undo-only) t)
      (user-error
        (message "%s" (error-message-string err)))))
  (setq this-command 'simple-undo))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.