vimdiff สำหรับ git diffs สามารถเริ่มต้นในแท็บของกระบวนการปัจจุบันได้หรือไม่

Jan 20 2021

สมมติว่าฉันเปิดบัฟเฟอร์ไฟล์และ:terminalแยกเปิดใน 1 หน้าแท็บ ฉันต้องการสร้างแท็บใหม่ที่ฉันเรียกใช้vimdiffแต่มีการแสดงความแตกต่างของคอมไพล์ ฉันกำลังพยายามที่git difftool HEAD~1จะแสดงในกระบวนการกลุ่มปัจจุบันของฉันในหน้าแท็บอื่น

เป็นไปได้บน Vim 8 โดยไม่มีปลั๊กอินหรือไม่?

ชนิดของฉันได้รับยานี้เมื่อฉันทำและดำเนินการแล้ว:tab terminal git difftool HEAD~1อย่างไรก็ตามสิ่งนี้เริ่มต้นกระบวนการย่อยเป็นกลุ่มและฉันต้องการหลีกเลี่ยงสิ่งนั้น

คำถามประเภทนี้: ฉันจะเข้าสู่โหมด vimdiff ได้อย่างไรเมื่อเปิดสองแยกแล้ว? แต่สำหรับคอมไพล์นั้นต่างกัน

คำตอบ

2 NikolasTapia Jan 20 2021 at 17:03

ขณะนี้เป็นที่แน่นอน doable ในวานิลลาvim, ผมขอแนะนำให้คุณลองดูที่ยอดเยี่ยมของ tpopevim-fugitiveปลั๊กอิน จากนั้นคุณก็ต้องทำ:tab Gdiffเพื่อให้ได้สิ่งที่คุณต้องการ

หากคุณไม่ต้องการติดตั้งปลั๊กอินใด ๆ สิ่งต่อไปนี้อาจใช้งานได้โดยสมมติว่าไฟล์ปัจจุบันอยู่ในหมายเลขบัฟเฟอร์ 1:

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. ในแท็บที่เพิ่งเปิดใหม่ :vert sb 1 | windo diffthis

คำอธิบาย

  1. ขั้นแรกให้เปิดแท็บใหม่tabnewและโหลดเนื้อหาของHEAD^เวอร์ชันของไฟล์ในบัฟเฟอร์ 1 ลงในนั้น
  2. เปิดการแบ่งแนวตั้งที่มีบัฟเฟอร์ 1 ด้วยvert sb 1จากนั้นจึงส่งปัญหา:diffthisไปยังบัฟเฟอร์ทั้งหมดในแท็บเพื่อเข้าสู่โหมด diff

แก้ไข

OP ขอคำอธิบายเพิ่มเติมเกี่ยวกับขั้นตอนที่ 1 git showต้องการการป้อนข้อมูลของแบบฟอร์ม<rev>:<path>ซึ่ง<path>จะต้องสัมพันธ์กับรากของแผนผังการทำงาน ตัวอย่างเช่นถ้าเส้นทางแน่นอนของไฟล์ในบัฟเฟอร์ที่ 1 คือ/a/b/foo.extเพื่อให้bมีของ.gitโฟลเดอร์ (เช่นbเป็นรากของ repo ของคุณ) เพื่อให้การทำงานอย่างถูกต้องคุณจะต้องเรียกมันด้วยgit show HEAD^:b/foo.eใช้อย่างใดอย่างหนึ่ง/a/b/foo.extหรือfoo.extไม่ได้ผล ดังนั้นฉันจึงใช้git rev-parse --show-prefixเส้นทางของโฟลเดอร์ปัจจุบันที่สัมพันธ์กับ git root (ซึ่งจะเป็นb/) ในตัวอย่างนี้

จากนั้นฉันใช้vimการขยายพา ธ เพื่อต่อท้ายชื่อของไฟล์ (นั่นคือfoo.ext) #1บอกvimดึงข้อมูลเส้นทางของแฟ้มสิ่งที่อยู่ในการโหลดบัฟเฟอร์ 1 และ:tสารสกัดจาก "หาง" ซึ่งเป็นทุกอย่างหลังจากสุดท้ายในเส้นทางที่ส่งกลับโดย/ #1ในบางกรณี#1และ#1:tเท่ากัน แต่ก็ไม่ได้เป็นเช่นนั้นเสมอไป ตัวอย่างเช่นถ้าคุณขับรถvim b/foo.extแล้ว#1จะกลับมาแทนเพียงb/foo.ext foo.extตรวจสอบ:help expandข้อมูลเพิ่มเติม

แน่นอนคุณสามารถป้อนเส้นทางด้วยตนเองได้เช่นเดียวกับใน:tabnew | r! git show HEAD^:b/foo.extและจะใช้งานได้ แต่เวอร์ชันด้านบนเป็นแบบสคริปต์หรือคุณสามารถกำหนดให้กับแผนที่ได้