Câu trả lời:
http://vim.wikia.com/wiki/Diff_cản_buffer_and_the_origen_file
Dưới đây là một chức năng và lệnh để xem sự khác biệt giữa tệp hiện đang được chỉnh sửa và phiên bản chưa sửa đổi của nó trong hệ thống tệp. Chỉ cần đặt cái này trong vimrc của bạn hoặc trong thư mục plugin, mở tệp, thực hiện một số sửa đổi mà không lưu chúng và thực hiện
:DiffSaved
.function! s:DiffWithSaved() let filetype=&ft diffthis vnew | r # | normal! 1Gdd diffthis exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype endfunction com! DiffSaved call s:DiffWithSaved()
Để thoát khỏi chế độ xem khác nhau, bạn có thể sử dụng
:diffoff
lệnh.Dưới đây là một chức năng tương tự, được điều chỉnh để bắt chước
'cvs diff'
lệnh ...
:w !diff % -
diff
. %
đề cập đến filepath hiện đang mở. Tại sao tất cả điều này là một đối số cho :w
lệnh? Ngoài ra, làm thế nào để -
được gán cho nội dung của bộ đệm làm việc? Là tự động trong vim, rằng nội dung của bộ đệm (hoặc có thể là một phạm vi cụ thể trong bộ đệm) được gán cho stdin cho các lệnh shell?
:w
bởi vì chúng tôi đang viết tệp vào lệnh (bật stdin
). Trong lệnh, -
bảo nó đọc từ stdin
.
:w !git diff % -
cho phiên bản màu, nếu bạn đã cài đặt git!
fatal: bad flag '-' used after filename
khi chạy :w !git diff % -
.
Bởi vì một số người hỏi về một lời giải thích cho lệnh
:w !diff % -
Đây là nỗ lực của tôi để viết một câu trả lời chi tiết hơn:
Tôi giả sử rằng bạn đang làm việc trên một hệ thống với cat
echo
cài đặt và cài đặt (ví dụ như hầu hết mọi GNU / Linux, Mac OS, BSD và các hệ thống tương tự UNIX khác).
Lệnh trên hoạt động như sau:
Cú pháp lưu tệp trong vim là:
:w <filename>
Cú pháp để thực thi lệnh shell trong vim là:
:!<command>
Bên trong môi trường shell do vim phát hành %
sẽ trỏ đến tên tệp hiện tại. Bạn có thể xác minh điều này bằng cách thực hiện như sau:
:!echo %
Điều này sẽ xuất tên tệp (hoặc một lỗi, nếu vim đã chạy mà không có tên tệp).
Sử dụng cat chúng ta cũng có thể xuất nội dung của tệp:
:!cat %
Điều này sẽ trả về nội dung tệp ở trạng thái lưu cuối cùng của nó hoặc lỗi nếu nó chưa bao giờ được lưu.
Chương trình diff có thể đọc từ đầu vào tiêu chuẩn (stdin). Trang người đàn ông của nó nêu như sau:
[...] Nếu TẬP TIN là '-', hãy đọc đầu vào tiêu chuẩn. [...]
Thực thi lệnh save mà không có tên tệp mà thay vào đó là lệnh shell đằng sau nó khiến vim ghi nội dung tệp vào stdin của shell thay vì lưu nó trong tệp vật lý. Bạn có thể xác minh điều này bằng cách thực hiện
:w !cat
Điều này sẽ luôn luôn in các tập tin nội dung hiện tại (mà sẽ được ghi vào một tập tin thay thế).
Đặt nó cùng nhau (hoặc tl; dr): Tệp được "lưu" vào stdin, diff được chạy với tên tệp và stdin làm đầu vào.
Biết điều này cũng có thể so sánh các tệp với vimdiff đang làm một cái gì đó như thế này - đây chỉ là một ý tưởng bạn không muốn làm điều này:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(Sau đó mở chỉ đọc và đóng vimdiff bằng cách sử dụng :qall
)
vim - -c ":vnew $1 |windo diffthis"
, làm cho nó có thể thực thi được, ví dụ như lưu nó trong PATH vimdiffWithStdin
và sau đó so sánh với lệnh sau trong vim::w !vimdiffWithStdin %
:w !vimdiff % /dev/stdin
. Tôi không biết nếu một thủ thuật tương tự tồn tại cho các cửa sổ.
Tôi luôn thích sự khác biệt - công việc tốt, đơn giản.
từ vimrc_example.vim:
" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
if !exists(":DiffOrig")
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
\ | wincmd p | diffthis
endif
w !diff % -
là nó cũng hoạt động trên các nguồn từ xa (ví dụ vim sftp://example.com/foo.txt
:)
Nguồn sau đây và sử dụng: lệnh DIFF
function! s:diff()
let tmpa = tempname()
let tmpb = tempname()
earlier 100h
exec 'w '.tmpa
later 100h
exec 'w '.tmpb
update
exec 'tabnew '.tmpa
diffthis
vert split
exec 'edit '.tmpb
diffthis
endfunction
command! -nargs=0 DIFF call <SID>diff()
Không chính xác những gì bạn đang tìm kiếm nhưng SCMDiff.vim thực sự tuyệt vời. Một phím bấm và nó làm nổi bật tệp hiện tại của bạn với sửa đổi đầu trong một repo kiểm soát nguồn. Nó có nghĩa là để làm việc với nhiều SCMS. Tôi sử dụng nó với lực lượng.
Có một plugin, dựa trên các câu trả lời khác nhau ở đây: https://github.com/gangleri/vim-diffsatted
Nó cung cấp :w !diff % -
phương thức và liên quan nhiều hơn diffthis
một.
Ngoài ra, undotree cũng cho phép điều này, nhưng cũng nhiều hơn nữa (khác nhau giữa các điểm kiểm tra hoàn tác khác nhau). Tương tự như Gundo .
Tôi có thể giới thiệu histwin plugin .
Mặc dù nó không khác với phiên bản đã lưu hiện tại của tệp (giống như các câu trả lời khác), nhưng nó có thể thay đổi vimdiff kể từ khi bạn bắt đầu chỉnh sửa và thậm chí phát lại các thay đổi của bạn theo thứ tự. Sự khác biệt cho thấy nếu bạn tiết kiệm trung gian.
Ngoài ra, nó sẽ hiển thị một danh sách tất cả các nhánh lịch sử hoàn tác và cho phép bạn chuyển đổi hoặc khác biệt giữa chúng.
PS: Mặc dù plugin không tự động theo dõi các khoảnh khắc trong lịch sử chỉnh sửa vì mỗi lần thay đổi tệp, bạn có thể "gắn thẻ" rõ ràng thời điểm khi bạn lưu tệp để sau này bạn có thể vimdiff với nó, nếu bạn muốn điều đó. Có lẽ điều này có thể được tự động?
Nếu bạn muốn sử dụng vim để so sánh như trong vimdiff, bạn có thể làm một cái gì đó như thế này:
Chỉnh sửa .vimrc của bạn và thêm:
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
Từ đó, bạn sẽ thấy các thay đổi của mình và có thể thoát khỏi chế độ xem khác bằng cách sử dụng qall
like trong vimdiff bằng cách nhấn F8 trong chế độ lệnh. Thay thế F8 bằng bất kỳ phím nào bạn thích.
Chỉnh sửa: Đã thêm -M để không cho phép bất kỳ sửa đổi nào, vì nó không được lưu.
Vim: Error reading input, exiting...
bất kỳ ý tưởng những gì đang xảy ra ở đây?
git hỗ trợ lệnh sau
:w !git diff --no-index -- % -
ánh xạ nó tới một lệnh bằng cách thêm đoạn mã sau vào ~ / .vimrc của bạn
command GitDiff execute "w !git diff --no-index -- % -"
Bây giờ thực thi :GitDiff
trở thành một lệnh nhỏ tiện dụng để nhanh chóng hiển thị khác biệt trước mỗi lần lưu.
Bạn có thể tạo vim tạo bản sao lưu cuối cùng và bản sao lưu gốc bằng:
:set backup
:set patchmode=.orig
Sau đó, bạn có thể mở chúng trong một tách:
:vsp %:p~ or :vsp %:.orig
Và từ đó làm:
:vimdiff in each buffer
Nếu bạn chết không có thức ăn thừa nhưng muốn vimdiff, bạn cũng có thể làm:
ggVGy # copy the whole buffer
:vnew # open a split
CTRL-W w # switch to it
shift-P # paste at start
và sau đó làm: diffthis trên mỗi phân chia
Những thay đổi bạn vừa chỉnh sửa [ bộ đệm ], tức là những thay đổi khác với phiên bản đã lưu trước đó (trong thư mục dir hoạt động), những thay đổi này có thể khác với phiên bản chỉ mục cuối cùng ( Git ). Tôi đã ánh xạ cả hai:
" Find diff inbetween currrent buffer and ... A{last index version} vs B{last saved version in working directory}
" - A{last index version}: the file as you last commited it
" git diff to vimdiff against the index version of the file:
nnoremap <leader>gd <Esc>:Gvdiff<CR><Esc>:echo "currentBuffer vs lastIndexVersion (last commited)"<CR>
" - B{last saved version in working directory}: the file you last :w,
" not neccesary commited it (not commited for sure if it is in NO git project)
" https://vim.fandom.com/wiki/Diff_current_buffer_and_the_original_file
nnoremap <leader>gd2 <Esc>:DiffSaved<CR><Esc>:echo "currentBuffer vs lastSaved (not neccesary equal to last commited)"<CR>
function! s:DiffWithSaved()
let filetype=&ft
diffthis
vnew | r # | normal! 1Gdd
diffthis
exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction
com! DiffSaved call s:DiffWithSaved()
Ví dụ về vimdiff vs Gdiff.
Hơn nữa, để vimdiff
tập tin đồng âm dễ dàng trong đường dẫn khác:
" vimdiff homonym file
nnoremap <leader>dh <Esc>:vsplit %:p:h/../__/%:t <bar> :windo diffthis<Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left>
"E.g."$ vim /path01/proj02_pg064/processorder.php
":vsplit %:p:h/../proj01_pg05/%:t | :windo diffthis
Gdiff
nếu có thể và nếu không (ví dụ không phải là dự án Git) thì thực hiện a :vimdiff
. Với try-catch-endtry
. Nhưng cách này :DiffWithSaved
trong một dự án Git là thiếu.
:w !diff % -
cấp trên thay thế khi bạn đang sử dụng vim trên một số lượng lớn các hộp mà bạn không thể dễ dàng thay đổi .vimrc? (Miễn là họ đã cài đặt diff.)