Sử dụng hoàn tác liên tục của Vim?


96

Một trong những tính năng mới trong Vim 7.3 là 'undo liên tục', cho phép lưu undotree vào một tệp khi thoát khỏi bộ đệm.

Thật không may, tôi đã không thể kích hoạt nó đúng cách, hoặc tôi phải sử dụng sai. Đây là những gì tôi đã thử cho đến nay:

Tôi đã thêm phần sau vào ~ / .vimrc

set undofile                " Save undos after file closes
set undodir=$HOME/.vim/undo " where to save undo histories
set undolevels=1000         " How many undos
set undoreload=10000        " number of lines to save for undo

Sau đó, tôi được cho là sẽ có thể mở bất kỳ tệp nào, chỉnh sửa nó, sau đó lưu-đóng nó và khi tôi mở lại, tôi sẽ có thể hoàn tác / làm lại như thể tôi chưa bao giờ rời đi. Thật không may, điều này dường như không đúng, vì không có hoàn tác nào được viết.

Ghi chú:

  1. Tôi đang sử dụng Win 7 bằng Vim 7.3 từ dự án Vim không có kem. Hoàn tác liên tục được nướng trong.

  2. $ HOME / .vim / undo tồn tại trên hệ thống tệp của tôi


38
Chỉ cần nhấn mạnh, điểm 2) là rất quan trọng. Vim sẽ không tạo thư mục cho bạn và lùi lại dai dẳng sẽ không hoạt động cho đến khi bạnmkdir ~/.vim/undo
PUK

2
+1. Xin lỗi, trên Linux, nó hoạt động ... cảm ơn đã cho tôi biết về nó!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Đối với bất kỳ khách truy cập tương lai nào cho câu hỏi này: KHÔNG đặt dấu ngoặc kép xung quanh giá trị của undodir! Tôi bị mắc kẹt với vấn đề này trong một thời gian - sử dụng một đồng tiền tuyệt đối, không có dấu ngoặc kép xung quanh nó.
ngây thơ

Câu trả lời:


51

Đặt cái này vào của bạn .vimrcđể tạo undodirnếu nó không tồn tại và cho phép hoàn tác liên tục. Đã thử nghiệm trên cả Windows và Linux.

" Put plugins and dictionaries in this dir (also on Windows)
let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
    " Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif

5
Điều này có thể thích hợp hơn cho việc tạo thư mục::silent call system('mkdir -p ' . &undodir)
Kyle Strand

1
Tôi sử dụng &bởi vì tôi setsự undodirchứ không phải là letting nó. (Trong tâm trí tôi, sự khác biệt giữa letsetlà một trong rất nhiều, rất nhiều, rất nhiều "tính năng" khủng khiếp đáng kinh ngạc của Vimscript, nhưng YMMV.)
Kyle Strand

1
Cảm ơn Kyle, bạn nên tạo .vimnếu nó không tồn tại. Rất tiếc, -pcờ không tồn tại trên Windows nên tôi đã chỉnh sửa câu trả lời để gọi mkdirhai lần để đảm bảo tính tương thích của Windows.
Matthias Braun

2
Ah. Lý do chính của tôi để sử dụng -pcờ thực sự là để tránh lỗi khi thư mục tồn tại. Tôi có lệnh bên trong một if has('win32')khối, vì vậy tôi chỉ sử dụng mkdirmà không cần -ptrên Windows.
Kyle Strand

4
Tại sao không sử dụng mkdir()? Sau đó, điều này có thể trở thành call mkdir(myUndoDir, 'p'):, hoạt động như thế nào mkdir -p.
nelst từ

8

Tôi đã thử điều này trong _gvimrc của mình:

" Persistent undo
try 
    set undodir=C:\vim\undodir
    set undofile
catch
endtry

Nó bắt đầu hoạt động như được quảng cáo khi tôi xóa dấu ngoặc nhọn try-catch, do đó:

" Persistent undo
set undodir=C:\vim\undodir
set undofile

Tôi đã phải tạo thư mục.


if has('persistent_undo')
Arelav

silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav

set undodir=~/.config/nvim/backups
Arelav

1
endif"Thêm nhắn nhận xét để tăng độ dài tin nhắn
Arelav

3

Tôi cho rằng $ HOME không hoạt động như quảng cáo.

Trên hệ thống của tôi, :echo $HOMEhiển thị H: \, nhưng : e $HOME/cho biết: ~/tên tệp không hợp lệ.

Bạn có thể thử với một đường dẫn tuyệt đối để xem liệu nó có chữa được không


Tôi có thể |: echo $ HOME | và |: e $ HOME / | không có vấn đề gì, nhưng tôi đã thử thay đổi mọi thứ. Nó dường như hiệu quả vào đôi khi, và không hiệu quả với những người khác. Đặc biệt, nó không bao giờ lưu các bản sao lưu khi tôi đang chỉnh sửa tệp ~ / .vimrc của mình.
duckworthd

Trên windows 7 tôi đang sử dụng $TEMP. Khi tôi nhìn set undodir?nó cho thấy ~/AppData/Local/Temp. Hoàn tác tệp vẫn tồn tại và tự tải chính xác. Có lẽ $TEMPsẽ đáng tin cậy hơn?
slwek

1

Điều này hiện hoạt động như mong đợi: file.txtmở trong bộ đệm Vim 7.4 trên Windows 7, :setlocal undofilesau đó lưu thay đổi vào bộ đệm và hoàn tác .file.txt.un~được tạo cùng với vì :set undodir?báo cáo rằng "undodir =." theo mặc định - tức là không cần chỉ định điều này theo cách thủ công. Bạn cũng có thể :set undofiletrong một mô hình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.