สามารถคอมไพล์สลับระหว่างช่องว่างและแท็บโดยอัตโนมัติ?


196

ฉันใช้แท็บสำหรับการเยื้องในโปรแกรมหลามของฉัน แต่ฉันต้องการที่จะทำงานร่วมกัน (ใช้ git) กับคนที่ใช้ช่องว่างแทน

มีวิธีที่ git แปลงระหว่างช่องว่างและแท็บโดยอัตโนมัติ (เช่น 4 ช่องว่าง = 1 แท็บ) ในการผลัก / ดึงข้อมูลหรือไม่? (คล้ายกับการแปลง CR / LF)


33
PEP8 เป็นปัญหาของฉันอย่างแม่นยำ ทุกคนติดตามมันและฉันติดอยู่กับแท็บของฉัน ฉันคิดว่าการเยื้องหนึ่งครั้ง = หนึ่งแท็บเป็นสิ่งที่ถูกต้องที่จะทำ (เพราะเหตุใดช่องว่างเหตุใดจึงต้องเว้นวรรค 4 ช่อง PEP8 ไม่ได้อธิบายว่า ... ) อย่างไรก็ตามด้วยเคล็ดลับคอมไพล์นี้ฉันสามารถใช้แท็บบนคอมพิวเตอร์ของฉันและแบ่งปันรหัสของฉันกับผู้ติดตาม PEP8 ทั้งหมดได้อย่างมีความสุข
Olivier Verdier

7
Oh! ฉันใช้ TextMate และฉันสามารถแปลงระหว่างช่องว่างเป็นแท็บได้ สิ่งนี้คือเมื่อฉันกดแท็บฉันชอบแท็บแก้ไขเพื่อเขียน ... ดังนั้นถ้าฉันเช็คเอาต์โครงการหลามด้วยช่องว่างฉันจะแทรกแท็บทั้งหมด ฉันต้องแปลงเป็นแท็บด้วยตนเอง แต่เมื่อฉันเช็คอินดูเหมือนว่าการลบ 1,000 ครั้งการเพิ่ม 1000 ครั้งและผู้ทำงานร่วมกันของฉันจะไม่พอใจ :-)
Olivier Verdier

6
เหตุผล PEP8 ระบุช่องว่างแทนแท็บเป็นเพราะกฎการเยื้องต่อเนื่อง มีสองวิธีในการดำเนินการต่อบรรทัดที่ยาวเกินไปภายใน parenthetical หากคุณเริ่มต้นบรรทัดใหม่ทันทีหลังจากที่ผู้ปกครองคุณเพียงแค่เยื้องหนึ่ง หากคุณใส่เนื้อหาของ parenthetic แทนในบรรทัดแรกคุณต้องดำเนินการ parenthetical ต่อไปที่บรรทัดถัดไปที่ระดับการเยื้องของการเปิด parenthetical หากคุณใช้แท็บที่ใช้งานไม่ได้
John Christopher Jones

2
@JohnChristopherJones สำหรับสถานการณ์นั้นสามารถใช้แท็บเพื่อจับคู่การเยื้องกับบรรทัดก่อนหน้าจากนั้นเว้นวรรคเพื่อให้ตรงกับตำแหน่งในบรรทัดก่อนหน้า สามารถแปลงเป็นช่องว่างได้อย่างง่ายดาย น่าเสียดายที่การย้อนกลับนั้นไม่เป็นความจริงเพราะมันส่งข้อมูลการเยื้องกับข้อมูลการจัดตำแหน่ง
Patrick Parker

คำตอบ:


196

นี่คือทางออกที่สมบูรณ์:

ในที่เก็บของคุณเพิ่มไฟล์.git/info/attributesที่มี:

*.py  filter=tabspace

Linux / Unix

ตอนนี้รันคำสั่ง:

git config --global filter.tabspace.smudge 'unexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'expand --tabs=4 --initial'

OS X

ติดตั้ง coreutils เป็นครั้งแรกด้วยการชง:

brew install coreutils

ตอนนี้รันคำสั่ง:

git config --global filter.tabspace.smudge 'gunexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'gexpand --tabs=4 --initial'

ระบบทั้งหมด

ตอนนี้คุณสามารถตรวจสอบไฟล์ทั้งหมดของโครงการของคุณ คุณสามารถทำได้ด้วย:

git checkout HEAD -- **

และไฟล์หลามทั้งหมดจะมีแท็บแทนที่จะเว้นวรรค

แก้ไข : เปลี่ยนคำสั่งบังคับให้ชำระเงิน คุณควรทำงานของคุณก่อนแน่นอน


1
ตัวกรองที่สะอาดไม่ทำงานสำหรับฉัน เมื่อฉันเพิ่มคอมไพล์ ฉันได้รับข้อผิดพลาดว่า "ข้อผิดพลาด: ตัวกรองภายนอกขยาย --tabs = 4 - การเริ่มต้นไม่สำเร็จ" ฉันใช้ Windows นั่นสร้างความแตกต่างหรือไม่?
Jeremy Hicks

2
@Jeremy: expand / unexpand เป็นคำสั่ง unix คุณจะต้องค้นหาพอร์ต Windows หรือรายการเทียบเท่าหรือใช้บางอย่างเช่นCygwin
Tim

1
ฉันได้พบรุ่นที่ใช้งานได้แล้วsourceforge.net/projects/gnuwin32/files/coreutils/5.3.0
hazzik

3
@ Marc-Andréจุดที่ดี ฉันใช้ coreutils เวอร์ชันจริง ๆ (ติดตั้งhomebrewแล้วเรียกใช้brew install coreutils)
Olivier Verdier

2
ดูเหมือนว่ามันจะไม่ทำงานอีกต่อไปตัวกรองไม่ทำอะไรเลยสำหรับฉัน หลังจากเช็คเอาต์ไฟล์ยังคงมีช่องว่าง มีการอัพเดทอะไรบ้าง?
ฟิลิปป์ลุดวิก

141

ใช่วิธีแก้ปัญหาหนึ่งที่อาจเกิดขึ้นได้คือการใช้ไดรเวอร์ตัวกรองแอตทริบิวต์ git (ดูเพิ่มเติมที่หนังสือ GitPro ) เพื่อกำหนดกลไกรอยเปื้อน / ทำความสะอาด

ข้อความแสดงแทน

ทางนั้น:

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

คุณสามารถประกาศไดรเวอร์ตัวกรองนี้ (ชื่อที่นี่ ' tabspace') ใน.git/info/attributes(สำหรับตัวกรองที่ใช้กับไฟล์ทั้งหมดภายใน Git repo) โดยมีเนื้อหาดังต่อไปนี้:

*.py  filter=tabspace

ตอนนี้รันคำสั่ง:

# local config for the current repo
git config filter.tabspace.smudge 'script_to_make_tabs'
git config filter.tabspace.clean 'script_to_make_spaces'

ดูคำตอบของOlivierสำหรับตัวอย่างการทำงานที่เป็นรูปธรรมของชุดคำสั่งเปื้อน / ทำความสะอาด


น่าเสียดายที่มันใช้งานไม่ได้ ฉันทำตามคำแนะนำทั้งหมด แต่คอมไพล์ไม่ได้ใช้ fiter :-( เมื่อฉันเช็คเอาต์ตัวกรองรอยเปื้อนจะไม่ถูกนำมาใช้และเมื่อฉันเช็คอินไม่มีอะไรเกิดขึ้นเช่นกัน ... git นั้นน่าผิดหวังมากในบางครั้ง ...
Olivier Verdier

@ Olivier: แปลกฉันไม่เคยมีปัญหาใด ๆ กับมันตราบใดที่ฉัน จำกัด ขอบเขตของตัวกรองคุณลักษณะอย่างระมัดระวัง (สำหรับทรีย่อยเฉพาะสำหรับไฟล์ประเภทใดประเภทหนึ่งเท่านั้น) เพื่อไม่ให้เช็คเอาต์ / เช็คช้าลง อยู่ในขั้นตอน. ดูตัวอย่างstackoverflow.com/questions/62264/…
VonC

ขอบคุณ! ตอนนี้มันใช้งานได้ ดูโซลูชันที่สมบูรณ์: stackoverflow.com/questions/2316677/…
Olivier Verdier

@Vonc: บางทีเราควรลบ--globalธงเนื่องจากนี่จะแปลว่าคุณส่งช่องว่างไปยังทุกโครงการการทำงานร่วมกัน ...
Willem Van Onsem

@CommuSoft .gitattributesเฉพาะโครงการที่มีสิทธิ แต่ใช่มันง่ายกว่าที่จะเข้าใจว่าการตั้งค่านั้นถูกเก็บไว้ใน repo หรือไม่ ฉันได้แก้ไขคำตอบแล้ว
VonC

39

ข้อมูลที่มีประโยชน์มากสำหรับทุกคนที่ใช้ GitHub (หรือบริการอื่นที่คล้ายคลึงกัน)

~/.gitconfig

[filter "tabspace"]
    smudge = unexpand --tabs=4 --first-only
    clean = expand --tabs=4 --initial
[filter "tabspace2"]
    smudge = unexpand --tabs=2 --first-only
    clean = expand --tabs=2 --initial

จากนั้นฉันมีสองไฟล์: attributes

*.js  filter=tabspace
*.html  filter=tabspace
*.css  filter=tabspace
*.json  filter=tabspace

และ attributes2

*.js  filter=tabspace2
*.html  filter=tabspace2
*.css  filter=tabspace2
*.json  filter=tabspace2

ทำงานกับโครงการส่วนตัว

mkdir project
cd project
git init
cp ~/path/to/attributes .git/info/

ด้วยวิธีนี้ในที่สุดเมื่อคุณผลักงานของคุณไปที่ GitHub มันจะไม่ดูโง่ในมุมมองโค้ด8 space tabsซึ่งเป็นพฤติกรรมเริ่มต้นในเบราว์เซอร์ทั้งหมด

สนับสนุนโครงการอื่น ๆ

mkdir project
cd project
git init
cp ~/path/to/attributes2 .git/info/attributes
git remote add origin git@github.com:some/repo.git
git pull origin branch

ด้วยวิธีนี้คุณสามารถทำงานกับแท็บปกติใน2 space indentedโครงการได้

แน่นอนคุณสามารถเขียนโซลูชันที่คล้ายกันสำหรับการแปลง4 space to 2 spaceซึ่งเป็นกรณีถ้าคุณต้องการมีส่วนร่วมในโครงการที่เผยแพร่โดยฉันและคุณมักจะใช้ 2 ช่องว่างในขณะที่การพัฒนา


2
ที่เกี่ยวข้อง: การจัดเก็บการกำหนดค่า git เป็นส่วนหนึ่งของพื้นที่เก็บข้อมูล ; นอกจากนี้โปรดทราบว่าคุณสามารถใช้ (และส่ง) .gitattributesไฟล์ใน repo ของคุณได้
Tobias Kienzler

1

ถ้าคุณอยู่ในหน้าต่างแล้วคุณมีเพียงไม่กี่ขั้นตอนพิเศษที่จะได้รับ@Olivier Verdier ของการแก้ปัญหาในการทำงาน

  1. ดาวน์โหลดCoreUtilsสำหรับ windows
  2. หลังจากติดตั้งวางตำแหน่งการติดตั้งใน PATH ของคุณ ( วิธีเพิ่มตัวแปรพา ธ )
  3. ฉันเปลี่ยนชื่อ expand.exe เป็น gexpand.exe เนื่องจากมียูทิลิตี windows windows ขยาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.