มีวิธีใดบ้างที่จะขอประหยัดในกลุ่มขึ้นไปเพื่อผูกมัดคอมไพล์?


11

ฉันยังใหม่กับโลกแห่ง Vim และฉันต้องการสร้างมันขึ้นมาเพื่อให้ทุกครั้งที่ฉันบันทึกไฟล์มันถูกผูกมัดกับการควบคุมเวอร์ชัน เป็นไปได้ไหม

คำตอบ:


4

คุณสามารถใช้คำสั่งอัตโนมัติของ Vim ได้:

:autocmd BufWritePost * execute '!git add % && git commit -m %'

ไม่ได้ทดสอบ แต่ควรเพิ่มไฟล์และส่งไฟล์ด้วยชื่อไฟล์ว่าส่งข้อความ
คุณต้องการ BufWritePost เนื่องจากถูกทริกเกอร์หลังจากเขียนไฟล์ ฉันคิดว่ามีกรณีที่น่ารำคาญหรือไม่ปลอดภัยอยู่มากมาย


4

ฉันใช้ข้อความอัตโนมัติเป็นกลุ่มซึ่งฉันวางไว้ใน. 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'

1
ไม่มีเครื่องหมายคำพูดเดี่ยวตอนท้ายคำสั่ง cmd ทันทีหลังจาก fi
Andrew-Dufresne

2
รุ่นนี้ใช้งานได้เฉพาะเมื่อคุณอยู่ในไดเรกทอรีรากของ repo ของคุณ วิธีการแก้ปัญหาที่ดีกว่าคือautocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'จากคำตอบ SO
แอนดรู-Dufresne

สิ่งนี้ใช้ได้กับฉันใน linux มีความคิดว่าจะทำให้มันทำงานบน windows ได้อย่างไร?
user334287

2

คุณอาจต้องการดูปลั๊กอินผู้ลี้ภัยมันเป็นปลั๊กอินคอมไพล์ที่มีประสิทธิภาพมากสำหรับกลุ่ม นอกจากนี้คุณยังสามารถตั้งค่าautocmdเป็นdonothingsuccessfullyแนะนำ แต่มีมันปรากฏขึ้น:Gcommitหรือ:Gstatus(ซึ่งคุณสามารถเชอร์รี่เลือกการเปลี่ยนแปลงเพื่อเพิ่มในดัชนีคอมไพล์)


1

การสร้างคำตอบที่ผู้อื่นให้ไว้:

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 เพื่อดำเนินการต่อ" (แต่หากการกระทำไม่ทำงานคุณจะไม่ทราบว่ามันล้มเหลว)


0

คุณสามารถทำแมโครนี้หรือทำการแมปคำสั่งใหม่ได้

(ตรวจสอบ/programming/117150/can-i-re-map-commands-in-vim )

ฉันไม่แน่ใจว่ามันเป็นตัวเลือกที่ดี ตอนนี้ฉันไม่ชำนาญเรื่อง git และฉันรู้ว่าบางครั้งมันแตกต่างจาก svn แต่ฉันจะไม่ทำสิ่งนี้โดยอัตโนมัติด้วย svn กระทำจะต้องมีความหมายและไม่ได้บันทึกบางอย่างในเวลาปกติ

ตามปกติคุณยอมรับเนื่องจากคุณเพิ่มฟังก์ชั่นแก้ไขข้อผิดพลาด ... ไม่ใช่เพียงเพราะคุณทำงานกับไฟล์ คุณจะไม่จบลงด้วยโครงการที่ไม่ได้รวบรวมหรือฟังก์ชั่นที่ยังไม่เสร็จ


นั่นเป็นความจริง แต่ฉันก็ต้องการมีสคริปต์ข้ามคืนที่จะย้ายไฟล์ที่รวบรวมจาก repo "save-on-commit" ไปเป็น repo "การเปลี่ยนแปลงที่มีความหมาย" ได้สำเร็จ
gonzo.floyd

ไม่ใช่ความคิดที่ไม่ดีเลยสำหรับ Git "กระทำบ่อย ๆ " เป็นคำขวัญ มันทำงานได้ดีขึ้นด้วยวิธีนี้เช่นกันเพราะคุณสามารถทำงานพร้อมกันในไฟล์เดียวกันกับนักพัฒนาหลายคนและปัญหาที่น้อยที่สุด มันจะค่อนข้างมีประโยชน์หากจะขอเข้าสู่กลไกการบันทึกของกลุ่ม
Metagrapher

เวิร์กโฟลว์ใน Git อาจแตกต่างอย่างสิ้นเชิงจากการโค่นล้ม คุณอาจไม่เคยทำสิ่งนี้ใน svn เพราะมันจะเป็นการล่วงละเมิด แต่มันมีประโยชน์อย่างสมบูรณ์ในระบบคอมไพล์ ตัวอย่างเช่นเซิร์ฟเวอร์การรวมการทดสอบบางประเภทอาจติดกับสาขาทดสอบ กระทำโดยอัตโนมัติเมื่อบันทึกนั้นมีประโยชน์มาก เมื่อคุณไปถึงจุดที่บางสิ่งที่ใช้งานได้คุณจะใช้ git rebase เพื่อบีบกิจกรรมทั้งหมดให้เป็นข้อความเดียวที่มีความหมายแล้วรวมเข้ากับสาขาของคุณ หากสิ่งนี้ฟังดูน่ากลัวหรือซับซ้อนมันเป็นเพราะคุณถูกปรับให้เข้ากับข้อ จำกัด ของแหล่งข้อมูล vcs ที่ไม่เผยแพร่
Caleb

0

ฉันรู้ว่าคำถามนี้เก่าและเป็นการส่งเสริมตนเองที่เห็นได้ชัด แต่ฉันเขียนปลั๊กอิน Vim ที่จะทำให้เชลล์สคริปต์บางตัวทำงานหลังจากautocmdเหตุการณ์Vim ที่เจาะจง ตัวอย่างเช่นสคริปต์ที่ชื่อ.bufwritepost.vimhook.shจะถูกเรียกใช้ (พร้อมกัน) ทุกครั้งที่มีการเรียกใช้BufWritePostคำสั่ง จากนั้นคุณสามารถรวมตรรกะใด ๆ ก็ตามที่คุณต้องการในการแสดงคอมไพล์ภายในสคริปต์นั้นได้อย่างง่ายดาย ปลั๊กอินจะถือว่าข้อกำหนดการตั้งชื่อเฉพาะของสคริปต์เหล่านี้และยังรองรับสคริปต์ "hook" ซึ่งเรียกเฉพาะไฟล์ที่ตรงกับชื่อบางชื่อหรือมีนามสกุลที่แน่นอน

รายละเอียดแบบเต็ม: https://github.com/ahw/vim-hooks


0

ฉันต้องการรายงานปัญหาของฉัน

ฉันมี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

คำอธิบาย:

  1. สำหรับ windows ฉันเปลี่ยนไดเร็กตอรี่เป็นตำแหน่งไฟล์ vimrc นี่ไม่ใช่สิ่งที่ดีที่สุดและฉันอาจเปลี่ยนแปลงในภายหลังเพื่อคล้ายกับ linux อย่าคิดจริงจังเกินไป แต่คุณอาจต้องการใช้เป็นแนวทาง gitจะต้องมีในเส้นทาง (เช่นคุณควรจะสามารถที่จะพิมพ์git <ENTER>ในcmd.exe)
  2. สำหรับ Linux ฉันตรวจสอบก่อนว่าฉันกำลังแก้ไข vimrc.vim ที่ถูกต้อง
  3. บันทึกไดเรกทอรีการทำงานปัจจุบันไปที่ tempdir
  4. เปลี่ยนไดเร็กทอรีเป็นไฟล์ vimrc.vim
  5. ทำคอมไพล์ทำ
  6. กลับไปยังไดเรกทอรีการทำงานก่อนหน้า
  7. ฉันผลักดันการเปลี่ยนแปลงคอมไพล์ด้วยตนเอง

หมายเหตุ:

  1. คำสั่งที่สามารถ "ล่ามโซ่" |ในกลุ่มด้วย โซ่จะยกเลิกหากคำสั่งใดล้มเหลว \ที่จะทำลายไปหลายเส้นเริ่มต้นบรรทัดถัดไปด้วย
  2. สิ่งนี้สามารถขยายไปยังไฟล์ ftplugin ตัวกรองของคุณจะถูก*.vimและexpand($VIMCONF)."/ftplugin/"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.