Tôi chưa quen với thế giới của Vim và tôi muốn làm cho nó để mỗi lần tôi lưu một tệp, nó được cam kết kiểm soát phiên bản. Điều này có thể không?
Tôi chưa quen với thế giới của Vim và tôi muốn làm cho nó để mỗi lần tôi lưu một tệp, nó được cam kết kiểm soát phiên bản. Điều này có thể không?
Câu trả lời:
Bạn có thể sử dụng autocommands của Vim:
:autocmd BufWritePost * execute '!git add % && git commit -m %'
Điều đó chưa được kiểm tra nhưng cần thêm tệp và cam kết với tên tệp là thông điệp cam kết.
Bạn muốn BufWritePost vì điều này được kích hoạt sau khi tệp được viết. Tôi tưởng tượng có rất nhiều trường hợp cạnh khó chịu hoặc không an toàn.
Tôi sử dụng một autocommand vim mà tôi đặt trong .vimrc của tôi. Lệnh trước tiên thực hiện kiểm tra thô rằng chúng tôi đang làm việc trong thư mục git (bằng cách kiểm tra sự tồn tại của thư mục .git, trong thư mục hiện tại hoặc sử dụng git rev-parse
), sau đó sử dụng git -a -m %
sao cho chỉ các tệp đã được thêm trước đó được dàn dựng và cam kết .
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
, từ câu trả lời SO
Dựa trên các câu trả lời mà người khác đã cung cấp:
autocmd BufWritePost * execute ':silent ! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m "Auto-commit: saved %"; fi > /dev/null 2>&1'
Điều này là hoàn toàn minh bạch. Bạn sẽ không nhận được thông báo "Nhấn enter để tiếp tục" (nhưng nếu cam kết không hoạt động, bạn sẽ không biết nó thất bại).
Bạn chắc chắn có thể làm trắng macro này hoặc với ánh xạ lại lệnh.
(Kiểm tra /programming/117150/can-i-re-map-commands-in-vim )
Tôi không chắc đó là một lựa chọn tốt. Bây giờ tôi không thành thạo git và tôi biết đôi khi nó khác với svn. Nhưng tôi sẽ không thực hiện tự động cam kết này với svn. Cam kết cần phải có ý nghĩa và không tiết kiệm một số thời gian thường xuyên.
Bạn thường cam kết vì bạn đã thêm một chức năng, sửa lỗi, ... không chỉ vì bạn đã làm việc trên một tệp. Bạn sẽ không kết thúc với dự án không biên dịch hoặc hàm chưa hoàn thành.
Tôi biết câu hỏi này đã cũ và đây là tự quảng cáo trắng trợn, nhưng tôi đã viết một plugin Vim sẽ kích hoạt một số tập lệnh shell nhất định để chạy sau các autocmd
sự kiện Vim cụ thể . Ví dụ, một tập lệnh có tên .bufwritepost.vimhook.sh
sẽ được chạy (đồng bộ) mỗi khi BufWritePost
lệnh được kích hoạt. Sau đó, bạn có thể dễ dàng bao gồm bất kỳ logic nào bạn muốn để thực hiện cam kết git bên trong tập lệnh đó. Plugin giả định các quy ước đặt tên cụ thể của các tập lệnh này và cũng hỗ trợ các tập lệnh "hook" chỉ kích hoạt các tệp khớp với các tên nhất định hoặc có các phần mở rộng nhất định.
Chi tiết đầy đủ: https://github.com/ahw/vim-hooks
Tôi muốn báo cáo về vấn đề này.
Tôi có vimrc.vim
một kho lưu trữ git ( $VIMCONF
, với bootstrap .vimrc) và ánh xạ <Leader>ve
("chỉnh sửa vim") để mở vimrc trong một tab mới. Điều này không ảnh hưởng đến thư mục làm việc hiện tại.
Vì vậy, nếu tôi chỉnh sửa vimrc.vim
từ một vim bắt đầu trong một thư mục khác bên ngoài kho lưu trữ vim git của tôi, cách tiếp cận được thảo luận bởi Nick Edwards sẽ thất bại. Hack của tôi là như sau (cho windows và linux)
if has('win32')
" The git command has to be passed to git. So we need to call bash.exe.
autocmd BufEnter *vimrc.vim silent! lcd %:p:h
autocmd BufWritePost *vimrc.vim if expand('<amatch>') =~ substitute(expand('$VIMCONF\vimrc.vim'), '\', '/', "g") | execute '! git add % & git commit -m %' | endif
else " Linux
autocmd BufWritePost *vimrc.vim
\ if expand('<amatch>') =~ expand($VIMCONF)."/vimrc.vim" |
\ let tempdir = getcwd() | execute 'cd' fnameescape(expand('<amatch>:h')) |
\ execute '! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m % ; fi' |
\ execute 'cd' fnameescape(tempdir) |
\ endif
endif
Giải trình:
git
đã được trong đường dẫn (tức là bạn sẽ có thể gõ git <ENTER>
vào cmd.exe
)tempdir
Ghi chú:
|
. Chuỗi sẽ hủy bỏ nếu bất kỳ lệnh nào thất bại. Để vượt qua một số dòng bắt đầu dòng tiếp theo với \
.*.vim
vàexpand($VIMCONF)."/ftplugin/"