ฉันยังใหม่กับโลกแห่ง Vim และฉันต้องการสร้างมันขึ้นมาเพื่อให้ทุกครั้งที่ฉันบันทึกไฟล์มันถูกผูกมัดกับการควบคุมเวอร์ชัน เป็นไปได้ไหม
ฉันยังใหม่กับโลกแห่ง Vim และฉันต้องการสร้างมันขึ้นมาเพื่อให้ทุกครั้งที่ฉันบันทึกไฟล์มันถูกผูกมัดกับการควบคุมเวอร์ชัน เป็นไปได้ไหม
คำตอบ:
คุณสามารถใช้คำสั่งอัตโนมัติของ Vim ได้:
:autocmd BufWritePost * execute '!git add % && git commit -m %'
ไม่ได้ทดสอบ แต่ควรเพิ่มไฟล์และส่งไฟล์ด้วยชื่อไฟล์ว่าส่งข้อความ
คุณต้องการ BufWritePost เนื่องจากถูกทริกเกอร์หลังจากเขียนไฟล์ ฉันคิดว่ามีกรณีที่น่ารำคาญหรือไม่ปลอดภัยอยู่มากมาย
ฉันใช้ข้อความอัตโนมัติเป็นกลุ่มซึ่งฉันวางไว้ใน. vimrc ของฉัน คำสั่งก่อนทำการตรวจสอบอย่างหยาบว่าเรากำลังทำงานในไดเรกทอรี git (โดยการตรวจสอบการมีอยู่ของไดเรกทอรี. git ไม่ว่าจะเป็นในไดเรกทอรีปัจจุบันหรือใช้git rev-parse
) จากนั้นใช้git -a -m %
เพื่อให้เฉพาะไฟล์ที่ได้รับการเพิ่มก่อนหน้านี้ .
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'
จากคำตอบ SO
คุณอาจต้องการดูปลั๊กอินผู้ลี้ภัยมันเป็นปลั๊กอินคอมไพล์ที่มีประสิทธิภาพมากสำหรับกลุ่ม นอกจากนี้คุณยังสามารถตั้งค่าautocmd
เป็นdonothingsuccessfully
แนะนำ แต่มีมันปรากฏขึ้น:Gcommit
หรือ:Gstatus
(ซึ่งคุณสามารถเชอร์รี่เลือกการเปลี่ยนแปลงเพื่อเพิ่มในดัชนีคอมไพล์)
การสร้างคำตอบที่ผู้อื่นให้ไว้:
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'
นี่คือความโปร่งใสอย่างสมบูรณ์ คุณจะไม่ได้รับข้อความ "กด Enter เพื่อดำเนินการต่อ" (แต่หากการกระทำไม่ทำงานคุณจะไม่ทราบว่ามันล้มเหลว)
คุณสามารถทำแมโครนี้หรือทำการแมปคำสั่งใหม่ได้
(ตรวจสอบ/programming/117150/can-i-re-map-commands-in-vim )
ฉันไม่แน่ใจว่ามันเป็นตัวเลือกที่ดี ตอนนี้ฉันไม่ชำนาญเรื่อง git และฉันรู้ว่าบางครั้งมันแตกต่างจาก svn แต่ฉันจะไม่ทำสิ่งนี้โดยอัตโนมัติด้วย svn กระทำจะต้องมีความหมายและไม่ได้บันทึกบางอย่างในเวลาปกติ
ตามปกติคุณยอมรับเนื่องจากคุณเพิ่มฟังก์ชั่นแก้ไขข้อผิดพลาด ... ไม่ใช่เพียงเพราะคุณทำงานกับไฟล์ คุณจะไม่จบลงด้วยโครงการที่ไม่ได้รวบรวมหรือฟังก์ชั่นที่ยังไม่เสร็จ
ฉันรู้ว่าคำถามนี้เก่าและเป็นการส่งเสริมตนเองที่เห็นได้ชัด แต่ฉันเขียนปลั๊กอิน Vim ที่จะทำให้เชลล์สคริปต์บางตัวทำงานหลังจากautocmd
เหตุการณ์Vim ที่เจาะจง ตัวอย่างเช่นสคริปต์ที่ชื่อ.bufwritepost.vimhook.sh
จะถูกเรียกใช้ (พร้อมกัน) ทุกครั้งที่มีการเรียกใช้BufWritePost
คำสั่ง จากนั้นคุณสามารถรวมตรรกะใด ๆ ก็ตามที่คุณต้องการในการแสดงคอมไพล์ภายในสคริปต์นั้นได้อย่างง่ายดาย ปลั๊กอินจะถือว่าข้อกำหนดการตั้งชื่อเฉพาะของสคริปต์เหล่านี้และยังรองรับสคริปต์ "hook" ซึ่งเรียกเฉพาะไฟล์ที่ตรงกับชื่อบางชื่อหรือมีนามสกุลที่แน่นอน
รายละเอียดแบบเต็ม: https://github.com/ahw/vim-hooks
ฉันต้องการรายงานปัญหาของฉัน
ฉันมีvimrc.vim
ในพื้นที่เก็บข้อมูลคอมไพล์ ( $VIMCONF
ด้วย bootstrap .vimrc) และแมป<Leader>ve
("แก้ไขเป็นกลุ่ม") เพื่อเปิด vimrc ในแท็บใหม่ สิ่งนี้จะไม่ส่งผลกระทบกับไดเร็กทอรีการทำงานปัจจุบัน
ดังนั้นหากฉันแก้ไขvimrc.vim
จากกลุ่มที่เริ่มต้นในไดเรกทอรีอื่นนอกคลังเก็บคอมไพล์ของฉันวิธีที่ Nick Edwards พูดถึงจะล้มเหลว แฮ็คของฉันมีดังต่อไปนี้ (สำหรับ windows และ 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
คำอธิบาย:
git
จะต้องมีในเส้นทาง (เช่นคุณควรจะสามารถที่จะพิมพ์git <ENTER>
ในcmd.exe
)tempdir
หมายเหตุ:
|
ในกลุ่มด้วย โซ่จะยกเลิกหากคำสั่งใดล้มเหลว \
ที่จะทำลายไปหลายเส้นเริ่มต้นบรรทัดถัดไปด้วย*.vim
และexpand($VIMCONF)."/ftplugin/"