วิธีใช้ Editorconfig Generator สร้าง .editorconfig เพื่อจบปัญหาฟอร์แมตโค้ดในทีมอย่างถาวร
สร้างไฟล์ .editorconfig ที่มีกฎ indent, line ending, charset และ whitespace แบบเดียวกันทั้งทีมด้วย Editorconfig Generator ออนไลน์ฟรี ทำงานในเบราว์เซอร์ทั้งหมด
Table of Contents
วิธีใช้ Editorconfig Generator สร้าง .editorconfig เพื่อจบปัญหาฟอร์แมตโค้ดในทีมอย่างถาวร
tabs หรือ spaces? LF หรือ CRLF? เว้นวรรค 2 หรือ 4 ช่อง? การโต้เถียงเรื่องฟอร์แมตโค้ดเหล่านี้อยู่ในวงการเรามาหลายสิบปี และจุดร่วมของมันคือผลลัพธ์หลัง compile เหมือนกันหมด แต่กลับสร้าง diff noise ใน pull request เป็นภูเขา ไม่มีอะไรทำลายอารมณ์การรีวิวมากไปกว่าการเปิด PR แล้วเจอครึ่งหนึ่งของไฟล์ที่เปลี่ยนเพราะ editor ของเพื่อนร่วมทีมคนหนึ่งบันทึกไฟล์ด้วย CRLF หรือหลงเหลือ trailing whitespace ตอน save
Editorconfig Generator คือเครื่องมือออนไลน์ฟรีที่เปลี่ยนปัญหาเหล่านี้ให้เป็นเรื่องจบในไฟล์เดียว คุณตั้งค่ากฎของทีม ทั้ง indent style, indent size, line ending, charset, การตัด trailing whitespace และกฎ final newline แล้วเครื่องมือจะสร้างไฟล์ .editorconfig ที่พร้อม commit ทันที พร้อม override แยกตามประเภทไฟล์ ลองใช้ได้เลยที่ /th/tools/editorconfig-generator โดยทำงานในเบราว์เซอร์ 100% ข้อมูลโปรเจกต์ของคุณไม่ถูกส่งออกไปไหน
ในคู่มือนี้เราจะพาไปดูว่าทำไมไฟล์ .editorconfig ถึงได้ผลจริง วิธีใช้ generator ทีละขั้น และแต่ละการตั้งค่าควบคุมอะไรบ้าง เพื่อให้คุณเลือกค่า default ที่เหมาะสมได้โดยไม่ต้องเดา
ทำไมต้องใช้ Editorconfig Generator?
- editor อ่านไฟล์นี้ได้ในตัว — VS Code, JetBrains IDE (IntelliJ, WebStorm, PyCharm), Vim, Sublime Text และ editor ยุคใหม่ส่วนใหญ่รองรับ .editorconfig ตั้งแต่แกะกล่อง เพื่อนร่วมทีมแค่ clone repo แล้ว editor ก็ทำตามกฎทันที ไม่ต้องติดตั้งอะไรเพิ่ม
- ไฟล์เดียว ครอบคลุมทุกภาษา — ไฟล์เดียวที่ root ของ repo คุมทุกประเภทไฟล์ พร้อม section สำหรับ override ราย pattern ไฟล์ Python ใช้ 4 spaces ส่วน YAML ใช้ 2 spaces ก็ประกาศได้ในที่เดียว
- จบปัญหา line ending ข้ามระบบปฏิบัติการ — นักพัฒนาบน Windows, macOS และ Linux ต้องเจอปัญหา CRLF กับ LF ที่มองไม่เห็นตามืดตาย กฎ end_of_line ไขปัญหานี้ให้ทุกคนพร้อมกันในครั้งเดียว
- หมดคำถามว่า "indent กี่ช่อง" — คนใหม่ในทีมไม่ต้องเดา หน้า wiki ที่เคยเขียนวิธีตั้งค่า editor ก็ลบทิ้งได้ และ reviewer ไม่ต้องคอมเมนต์ให้แก้ indentation อีกต่อไป
- ทำงาน client-side ล้วน และฟรี — generator ประมวลผลในเบราว์เซอร์ทั้งหมด ไม่มีบัญชี ไม่มีการอัปโหลด ไม่มี tracking ตั้งค่า ดาวน์โหลด แล้ว commit ได้เลย
- เสริมกับเครื่องมืออื่นได้ลงตัว — formatter และ linter ยังจำเป็นอยู่ แต่ทุกอย่างจะทำงานแม่นยำขึ้นเมื่อ editor เองไม่แทรก whitespace ที่ไม่สม่ำเสมอตั้งแต่แรก
ฟีเจอร์หลัก
| ฟีเจอร์ | หน้าที่ |
|---|---|
| Indent style | เลือก spaces หรือ tabs เป็น indent_style ของโปรเจกต์ |
| Indent size | เลือกค่า indent_size (2, 4 หรือกำหนดเอง) สำหรับไฟล์ที่เข้าเงื่อนไข |
| End-of-line rule | ตั้ง end_of_line เป็น LF หรือ CRLF เพื่อให้ทุก platform save ไฟล์เหมือนกัน |
| Charset control | ประกาศ charset (utf-8, utf-8-bom, latin-1, ascii) กันปัญหา encoding |
| Trailing-whitespace | เปิด trim_trailing_whitespace เพื่อไม่ให้ช่องว่างท้ายบรรทัดหลุดเข้าไปใน diff อีก |
| Final-newline rule | บังคับ insert_final_newline ให้ทุกไฟล์จบสะอาดตามที่เครื่องมือฝั่ง POSIX คาดหวัง |
| Per-file-type override | เพิ่ม section อย่าง [*.md] หรือ [*.py] เพื่อผ่อนหรือเปลี่ยนกฎหลักเฉพาะจุด |
| Copy and download | ดู preview ไฟล์ที่สร้างแล้วดาวน์โหลดเป็น .editorconfig หรือคัดลอกไปใส่ clipboard |
- preview แบบเรียลไทม์ อัปเดตทุกครั้งที่เปลี่ยน option คุณเห็นชัดว่าไฟล์สุดท้ายจะหน้าตาเป็นอย่างไรก่อนตัดสินใจ commit
- ค่า default (spaces, indent 2, LF, utf-8, เปิด trimming และ final newline) เป็นจุดเริ่มต้นที่ปลอดภัยและตรงกับธรรมเนียมของโปรเจกต์ JavaScript และ TypeScript ยุคใหม่ส่วนใหญ่
- override sections คือสิ่งที่ทำให้ไฟล์นี้เป็นมิตรกับทีมจริง ๆ แค่ข้อยกเว้นของ markdown ไฟล์เดียวก็ช่วยลดการเดินงานเอกสารได้มหาศาล
วิธีใช้งาน
- เปิด generator — เข้าไปที่ Editorconfig Generator ไม่ต้องติดตั้งและไม่ต้องสมัครอะไร
- เลือกการตั้งค่าหลัก — เลือก indent style (spaces หรือ tabs) และ indent size, line ending (LF คือคำตอบของโปรเจกต์ยุคใหม่เกือบทั้งหมด) และ charset (utf-8 เว้นแต่คุณมีเหตุผลด้าน legacy)
- สลับกฎเรื่อง whitespace — ปล่อยให้ trim_trailing_whitespace และ insert_final_newline เปิดอยู่เว้นแต่มีเหตุผลเฉพาะ และทำเครื่องหมาย root = true เพื่อให้ editor หยุดค้นหา config จาก directory แม่
- เพิ่ม override รายประเภทไฟล์ — เพิ่ม section สำหรับข้อยกเว้นที่โปรเจกต์ต้องการ เช่น เก็บ trailing double spaces ใน markdown หรือบังคับ tabs ใน Makefile
- ดาวน์โหลดแล้ว commit — ดาวน์โหลดไฟล์ บันทึกเป็น .editorconfig ที่ root ของ repository แล้ว commit ครั้งต่อไปที่ใครในทีมเปิดโปรเจกต์ editor จะ apply ทุกกฎให้อัตโนมัติ
การตั้งค่าที่ช่วยจบการโต้เถียง
นี่คือตัวอย่างไฟล์ที่ generator สร้างขึ้นพร้อมคำอธิบาย ครอบคลุมการตั้งค่าที่ทำงานหนักที่สุด:
# บอก editor ให้หยุดค้นหาไฟล์ .editorconfig จาก directory ที่อยู่สูงขึ้น root = true [*] charset = utf-8 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true indent_style = space indent_size = 2 [*.py] indent_size = 4 [Makefile] indent_style = tab [*.md] trim_trailing_whitespace = false
root = true ต้องอยู่บนสุดก่อน section header ใด ๆ มันบอก editor ว่าไฟล์นี้คือขอบเขตของโปรเจกต์ หากไม่ใส่ editor อาจไล่ขึ้นไปตาม directory tree แล้วหยิบ config จากโฟลเดอร์แม่ที่ไม่เกี่ยวข้องมาผสม จนได้พฤติกรรมแบบฮือฮาที่หาสาเหตุยาก
indent_style และ indent_size ตอบการโต้เถียงเก่าแก่ที่สุดในวงการเขียนโปรแกรมอย่างเด็ดขาด ฝั่งไหนที่ทีมเลือกก็ได้ ประเด็นคือการตัดสินใจถูกบันทึกไว้ตรงที่ทุก editor มองเห็น ส่วน [*.py] แสดงให้เห็นว่าการรองรับภาษาที่มาตรฐานชุมชนใช้ 4 spaces นั้นง่ายแค่ไหน โดยไม่ต้องบังคับให้โค้ดส่วนอื่นต้องตามไปด้วย
end_of_line ต้องพูดถึงเป็นพิเศษเพราะทำงานร่วมกับ Git อย่างละเอียดอ่อน editor เขียน bytes ลงไป แต่ core.autocrlf ของ Git สามารถเขียน bytes เหล่านั้นใหม่เงียบ ๆ ตอน checkout และ commit ถ้าทีมใช้หลายระบบปฏิบัติการ คอมโบที่เชื่อถือได้ที่สุดในปัจจุบันคือใช้ LF ทุกที่ใน editor คู่กับไฟล์ .gitattributes ที่ประกาศ * text=auto eol=lf ใน repository โดยกฎใน .editorconfig จะช่วยให้ editor ไม่แทรก CRLF กลับเข้ามา ส่วน dev บน Windows ที่ toolchain ต้องการ CRLF จริง ๆ ค่อยตั้ง core.autocrlf=true เฉพาะเครื่องตัวเอง แต่ประวัติ commit ก็ยังคงสม่ำเสมอเหมือนเดิม
charset ป้องกันบั๊กคลาสสิกที่คนหนึ่ง save ไฟล์เป็น Latin-1 แล้วทุกตัวอักษรพิเศษใน diff กลายเป็นอักขระประหลาด การประกาศ utf-8 อย่างชัดเจน (และเลี่ยงแบบมี BOM เว้นแต่ระบบเก่าบน Windows เรียกร้อง) ทำให้ไฟล์มี bytes เหมือนกันทุกเครื่อง
trim_trailing_whitespace เก็บกวาดช่องว่างที่สะสมท้ายบรรทัดจากการ copy-paste และการ save แบบไม่ระวัง อักขระมองไม่เห็นพวกนี้เป็นต้นเหตุอันดับต้น ๆ ของ diff noise และเมื่อ editor ลบมันทิ้งตอน save มันก็จะไม่มีวันเกิดขึ้นอีก
insert_final_newline ทำให้ทุกไฟล์จบด้วย newline ตามที่เครื่องมือฝั่ง POSIX คาดหวัง และปิดปากคำเตือน "no newline at end of file" ที่โผล่มาใน diff ซ้ำ ๆ
สุดท้าย per-file-type overrides คือเครื่องหมายของ config ที่โตมาด้วยกันดี โดย [*.md] ในตัวอย่างคือข้อยกเว้นที่มีชื่อเสียงที่สุดในระบบนิเวศนี้ เพราะ Markdown ใช้ช่องว่างสองตัวท้ายบรรทัดเป็นการขึ้นบรรทัดใหม่แบบ force ถ้า trim ทิ้งจะทำลายการจัดหน้าเอกสารที่ตั้งใจไว้ การเขียน comment อธิบายข้อยกเว้นไว้ในไฟล์เลยจะช่วยกันไม่ให้ใคร "แก้ให้ถูก" ทีหลัง
กรณีใช้งานจริง
Onboarding ทีมใหม่
นักพัฒนาใหม่ clone repository เปิดใน editor ที่ตัวเองชอบ แล้วกฎ indentation และ line ending ทั้งหมดก็ถูก apply ให้อัตโนมัติ ไม่มีหน้า wiki ชื่อ "วิธีตั้งค่า editor" ให้ไล่อ่าน ไม่มี checklist ของ plugin และไม่มี PR สัปดาห์แรกที่เต็มไปด้วยคอมเมนต์เรื่องฟอร์แมต config เดินทางมาพร้อมโค้ด ซึ่งก็คือที่ที่มันควรอยู่
Monorepo ที่ผสมหลายภาษา
Monorepo คือสถานที่ที่ .editorconfig เปล่งประกายที่สุด ไฟล์เดียวที่ root ตั้งกฎพื้นฐาน ส่วน override sections ให้แต่ละภาษาใช้ธรรมเนียมของตัวเอง 2 spaces สำหรับ TypeScript และ JSON, 4 สำหรับ Python, tabs สำหรับ Makefile และตามที่ YAML ใน CI pipeline ต้องการ แทนที่จะไล่ตั้งค่า editor ราย directory แบบที่ครึ่งทีมลืม ไฟล์เดียวที่ commit ไว้ครอบคลุมทั้งต้นไม้โปรเจกต์
สุขอนามัยของโปรเจกต์ open source
โปรเจกต์ open source รับ patch จากคนแปลกหน้าบนทุกระบบปฏิบัติการและทุก editor ที่จินตนาการได้ ไฟล์ .editorconfig ที่ commit ไว้ทำให้ contributor บน Windows ที่ใช้ CRLF และคนบน Linux ที่ใช้ Vim ค่า default ส่ง diff ที่หน้าตาเหมือนมาจากเครื่องเดียวกัน reviewer ได้ใช้สมาธิกับโค้ดแทนที่จะเป็น whitespace
ทำให้ whitespace diff เงียบลง
ทีมที่ย้าย repository รุ่นเก๋ามักเจอว่าครึ่งหนึ่งของทุก diff คือ trailing whitespace กับ final newline ที่หายไป เปิดกฎ trim และ final-newline รัน normalization commit เดียวผ่าน formatter แล้วตั้งแต่วันนั้น git diff และ git blame -w จะโชว์แต่การเปลี่ยนแปลงจริงเท่านั้น นี่คือวิธีเร่ง code review ที่ถูกที่สุดเท่าที่เคยมีมา
แนวทางปฏิบัติที่ดี
- Commit ไว้ที่ root ของ repository — ไฟล์นี้มีผลเมื่อมันเดินทางไปกับโค้ดเท่านั้น วางไว้ที่ root ของทุก repo ที่ทีมแตะต้อง
- ใช้คู่กับ formatter — EditorConfig คุมพื้นฐานของ editor ส่วน formatter อย่าง Prettier หรือ Black บังคับส่วนที่เหลือ ทั้งสองเสริมกัน ไม่ใช่แทนกัน
- เก็บ override ให้น้อยที่สุด — ทุก override section คือสิ่งที่ต้องมานั่งอธิบาย เพิ่มเมื่อธรรมเนียมจริงเรียกร้องเท่านั้น เช่น กฎ trailing space ของ Markdown
- อธิบายข้อยกเว้นไว้ในไฟล์ — comment หนึ่งบรรทัดเหนือ [*.md] ว่าทำไมถึงปิด trimming จะกัน PR เก็บกวาดใจดีไม่ให้ลบมันทิ้ง
- จับคู่ line ending กับ Git — ตกลงใช้ LF ใส่กฎใน .editorconfig แล้วสะท้อนเดียวกันใน .gitattributes เพื่อให้พฤติกรรม editor กับการ normalize ของ Git เห็นพ้องกัน
- รีวิวการแก้ไฟล์นี้เหมือนโค้ด — ไฟล์จิ๋วนี้เปลี่ยนพฤติกรรมของ developer ทุกคนในโปรเจกต์ ให้ความสำคัญกับการแก้ไขมันเท่ากับ build configuration
เริ่มสร้าง .editorconfig ของคุณวันนี้
การโต้เถียงเรื่องฟอร์แมตคือการเสวนาที่ถูกที่สุดในการปิดตลอดกาล ไฟล์เล็ก ๆ หนึ่งไฟล์ สร้างในหนึ่งนาที commit ครั้งเดียว เปิด Editorconfig Generator เลือกการตั้งค่าของทีม เพิ่ม override ที่แต่ละภาษาต้องการ แล้ววางผลลัพธ์ไว้ที่ root ของ repository diff ของคุณจะเงียบลง review จะไวขึ้น และไม่มีใครต้องออกมาปกป้องรูปแบบ indentation ของตัวเองอีกเลย
เครื่องมือที่เกี่ยวข้องที่คุณอาจชอบ:
- TSConfig Generator — สร้าง tsconfig.json สำหรับโปรเจกต์ TypeScript ด้วย workflow คลิกเลือกแบบเดียวกัน
- ESLint Config Generator — สร้าง ESLint configuration ให้กฎ linting สอดคล้องกับ style rules ใน .editorconfig ของคุณ
- Git Branch Name Generator — คุมความสม่ำเสมออีกจุดของ repo ด้วยชื่อ branch ที่เป็นระเบียบตาม convention
โค้ดที่สม่ำเสมอไม่ได้แปลว่าทุกคนต้องคิดเหมือนกัน แต่แปลว่า editor ของทุกคนต้องทำงานเหมือนกัน ส่ง config ไปที่ repo แล้วปล่อยให้เครื่องจักรดูแลเรื่องที่เหลือ
คำถามที่พบบ่อย
ถ: ต้องติดตั้ง plugin เพิ่มไหมถ้าอยากให้ editor ของฉันเคารพไฟล์นี้?
ตอบ: editor ยุคใหม่ส่วนใหญ่ ทั้ง VS Code, JetBrains IDE, Sublime Text และ Vim หรือ Emacs รุ่นใหม่ รองรับ .editorconfig ในตัวหรือเปิดใช้มาแล้วตั้งแต่ติดตั้ง มีบ้างในสภาพแวดล้อมเก่า ๆ ที่ต้องลง plugin เล็ก ๆ แต่การสนับสนุนใน ecosystem ถือว่าครอบคลุมเกือบทั้งหมด
ถ: การเพิ่มไฟล์ .editorconfig จะจัดฟอร์แมตโค้ดเดิมใหม่ทั้งหมดหรือเปล่า?
ตอบ: ไม่ ไฟล์นี้เปลี่ยนวิธีที่ editor จัดฟอร์แมตตอนคุณพิมพ์และ save เท่านั้น ไม่ได้แตะไฟล์ที่มีอยู่แล้ว ถ้าอยาก normalize codebase เก่า ให้รัน formatter หนึ่งรอบใน commit แยกต่างหากหลังจาก .editorconfig เข้าที่แล้ว
ถ: ควรวางไฟล์ไว้ตรงไหน?
ตอบ: ที่ root ของ repository ข้างไฟล์อย่าง README และ package.json editor จะค้นหาขึ้นไปจากทุกไฟล์ที่เปิด ไฟล์ที่ root จึงคุมทั้งโปรเจกต์ คุณยังวางไฟล์เพิ่มใน subdirectory เพื่อควบคุมแบบละเอียดขึ้นได้
ถ: ต่างจาก formatter หรือ linter อย่างไร?
ตอบ: ทั้งหมดทำงานคนละชั้นกัน EditorConfig บอก editor ว่าจะจัดการพื้นฐานอย่าง indentation และ line ending อย่างไรขณะคุณทำงาน formatter เขียนไฟล์ใหม่ตาม style spec ที่สมบูรณ์ ส่วน linter แจ้งเตือนการละเมิดกฎ stack ที่ดีใช้ทั้งสามอย่าง โดยมี EditorConfig เป็นเส้นฐานที่เปิดทำงานตลอด
ถ: generator ส่งการตั้งค่าของฉันขึ้น server ไหนหรือเปล่า?
ตอบ: ไม่ เครื่องมือนี้ทำงานในเบราว์เซอร์ของคุณทั้งหมด การตั้งค่าถูก render แบบ local และส่งมอบเป็นไฟล์ดาวน์โหลด ไม่มีข้อมูลโปรเจกต์ของคุณไปผูกกับ server ใดเลย