[Part 4] Coding on Vim: การตั้งค่า Vim ใน .vimrc

บทความนี้เราจะมาพูดถึงเรื่องไฟล์ .vimrc กันว่ามันไว้ใช้ทำอะไรและมีประโยชน์อย่างไร ซึ่งหลายๆ คนอาจจะเคยเห็นไฟล์ที่เขียนลงท้ายด้วย rc (suffix) มาบ้างแล้ว เช่น .bashrc .bowerrc อะไรประมาณนี้ ซึ่งเดียวเราจะมาดูรายละเอียดกัน

 

ทำความรู้จักกับไฟล์ rc 

จริงๆ แล้วไฟล์ที่ลงท้ายด้วย rc จะอยู่ใน OS ตระกลูพวก Unix, Linux (ผมไม่แน่ใจว่า windows ใช้อะไร) ซึ่งย่อมาจาก คำว่า “run commands” ใช้หรับ intial setting , startup parameter สำหรับโปรแกรมนั่นๆ โปรแกรมที่ใช้ก็พวกโปรแกรมทั่วๆ ไป, Server process, OS ต่างๆ ซึ่งบางโปรแกรมอนุญาตให้เราเขียนไฟล์ rc ใหม่ตาม syntax ของเขาเพื่อให้เราปรับแต่งโปรแกรมได้เอง

การตั่งค่าหรือเขียนไฟล์ rc นั่นมันก็ขึ้นอยู่แต่ละโปรแกรมว่าให้แก้ได้จากที่ไหน บางทีอาจจะมีฟังก์ชันในโปรแกรมให้แก้ไขได้เลย หรือบางทีก็ต้องใช้พวก text editor เข้าไปแก้เอง ซึ่งจริงๆ แล้วไฟล์ Setting นั่นมีหลายนามสกุลก็แล้วแต่ว่าโปรแกรมนั่นใช้ไฟล์ตั่งค่าเป็นอะไร และเมื่อแก้เสร็จก็ต้อง restart process หรือไม่ก็แล้วแต่โปรแกรมนั่นอีกทีนึงครับ

 

ทำความรู้จักไฟล์ vimrc

ตอนนี้คงรู้จักไฟล์ rc กันไปแล้ว ต่อไปเราจะมาเริ่มกันที่เนื้อหาของบทความเราคือไฟล์ vimrc และอย่างที่บอกคือไฟล์มีไว้แล้วเราปรับแต่ vim ของเราให้เทพขึ้น แบบที่ผมได้สอนไปในบทความก่อนๆ ในตัวอย่างการลง Plugin ใน Part 2[link] ซึ่งบทความก่อนๆ นั่นไม่ได้อธิบายอะไรไว้มาก นอกจาการลงไว้ตั่งค่า Plugin แล้ว เราก็ยังสามารถเขียนฟังก์ชัน และเรียกใช้มันได้อีกด้วย เหมือนกับเขียนโปรแกรมที่สามารถประกาศ ฟังก์ชัน ตัวแปร แม้กระทั่งประกาศ if-else ได้เลย

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

 

ไฟล์ .vimrc หาได้จากที่ไหน

ปกติไฟล์จะอยู่ใน ~/.vimrc  ส่วนมากก็แค่พิมพ์ cd เพื่อเข้าไปที่ root path ก็จะเจอเลย แต่ถ้าใครไม่เจอในเครื่อง ไม่ต้องตกใจ เราสามารถสร้างเองได้ อ่านเพิ่มเติม[link]

 

ตั่งค่าพื้นฐานเกี่ยวกับ Keyborad

สำหรับเรื่องที่เราจะมาพูดกันก่อนเลยก็คือการ map คีย์บอร์ดบน vim นั่นเอง แน่นอนว่าบางที่คีย์มาตรฐานที่เขาให้เรามานั่นมันกดไม่ถนัด เราอาจจะทำการ map ฟังก์ชันใหม่เพื่อให้ง่ายต่อการใช้งาน หรือไม่อยากพิมพ์คำสั่งอะไรบ่อยๆ เราก็ map เข้าไปเรียกฟังก์ชันบางอย่างแทนก็ได้ เดียวผมขออธิบายก่อนว่าปกติเรา map กันยังไง หลักๆ ที่ผมจะใช้คือมี map , noremap ซึ่งสองอันนี้แตกต่างกันนิดหน่อย ดังนี้

  • map: เป็นการ map คีย์ใน Normal mode และจะมีการเรียกใช้งาน recursive
  • noremap: เป็นการ map คีย์ใน Normal Mode เช่นเดียวกัน แต่ว่าจะไม่เรียก recursive

recursive คืออะไร งง ใช่ไหมครับ? ถ้าใครชอบเขียนโปรแกรมแบบ recursive บางคนอาจจะเข้าใจแล้วก็ได้ ซึ่งความหมายมันคือ ถ้าเราใช้ map ในการตั่งค่าคีย์ของเราแล้วแปลว่าถ้าเรากดคีย์ใดก็ตามที่มีการ map คีย์เดียวกัน มันจะไปเรียกฟังก์ชันนั่นๆ เรื่อยๆ จนกว่าจะไม่เจอการ map อ่านแล้ว งง ใช่ไหมครับ ผมอาจจะอธิบายไม่ดีเท่าไร แต่มาดูตัวอย่างในบรรทัดที่ 4,5 ในโค้ดนะครับ

ถ้าผมตั่งค่าให้กด Q แล้วไปเรียกใช้ j (คีย์ปกติคือการเลือน cursor ลง) มันจะไม่ทำงาน แต่มันจะเรียกบรรทัดที่ 5 มาทำงานแทน เราจะได้ ฟังก์ชันการทำงานของ gg (การเลือน cursor ไปบรรทัดแรกสุดของไฟล์) แทน เพราะมันทำงานแบบ recursive เพราะไปหาว่าตัวมันถูก map ไว้ไหนบ้างแล้วเรียกตัวเองจนกว่าจะไม่เจอแล้วจึงทำงานคำสั่งที่นั่นๆ แต่ในขณะเดียวกันในบบรรทัดที่ 8 มันจะไม่เรียก 4,5 มาทำงานเพราะเราตั่งมันเป็น noremap คือไม่มีการทำงานแบบ recursive ครับ 

เพราะงั่นถ้าคิดจะ map คีย์อะไร  ก็คำนวนดีๆ นะครับ ไม่งั่นจะชนกันมั่วๆ ได้

อีกการทำงานนึงของการ map ในตัวอย่างบรรทัดที่ 11 ที่ผมทำไว้คือการกด <ctrl-n> แล้วให้ไปเรียกใช้งานคำสั่ง Plugin ชื่อว่า NERDTree[link]  แทนที่เราจะพิมพ์ :NERDTreeToggle ใน vim ตอนเป็น Normal Mode เอง เราก็ทำให้มันเป็นการกดสะเลย ซึ่งเราสามารถทำแบบนี้ได้กับทุกๆ Plugin ที่เราต้องการ เพียง map คำสั่งไปให้ถูกครับ

สำหรับคำสั่งในการ map นั่นมีเยอะเหมือนกันถ้าใครต้องการอ่านเพิ่มเติมลองเข้าไปที่ vim wiki ตามลิ้งได้ครับ จะมีบอกไว้อย่างละเอียดเลย

 

เรียนรู้การเรียกใช้คำสั่งของระบบ

อันนี้เป็นตัวอย่างการเรียกใช้งานตั่งค่าต่างๆ ที่มากับตัว vim ซึ่งขอบอกไว้ก่อนว่า option นั่นเยอะมาก ผมแนะนำว่าอยากเล่นหรือแก้ หรือปรับ option ไหนลองเข้าไปอ่าน vim doc หรือ stackoverflow เอานะครับ หรือถ้าใครขี้เกียจหามีคนทำระบบ GUI ไว้กด setting option บน Mac ไว้ link และผมอธิบายไม่ได้หมด จะเอาที่ผมใช้หลักๆ เพื่อใช้งานกรเขียนโปรแกรมเท่านั่น กลับมาเข้าเรื่องต่อนะครับ ผมจะอธิบายคราวๆ ว่าผมตั่งค่าไว้อะไรไว้สำหรับช่วยเขียนโปรแกรมมัง

  • encoding: ตัวนี้คือตั่งค่าให้ไฟล์เป็น utf8 เสมอเวลาสร้างไฟล์ อ่านไฟล์ครับ
  • laststatus: ตัวนี้ตั่งเพื่อให้ vim แสดงชื่อไฟล์ status ต่างๆ mode ที่กำลังทำงาน และ file status แสดงตลอดเวลา โดยใส่เลข 2 สำหรับอ่านเพิ่มเติมตามนี้ครับ link
  • backspace=indent,eol,start: ตัวนี้พอดีว่าผมตั่งค่าเพราะผมเพิ่งอัพ vim เป็น เวอร์ชั่น 8 บน Mac เพราะผมใช้ Plugin ตัวนึงที่ไม่สามารถทำงานกับ vim ที่ติดมากับ Mac ได้เพราะมัน เวอร์ชัน 7 แต่พออัพแล้วเกิดปัญหาคือ ปุ่ม delete/backspace มันไม่ทำงานเลยต้องตั่งค่าใหม่ เพื่อกลับทำงานปกติ
  • number: อันนี้ให้โชว์เลขบรรทัด
  • syntax on: อันนี้ให้เปิดการทำงาน Highlight syntax ทำให้มันมีสีสัน
  • colorscheme: ไว้สำหรับแต่ธีม หรือโหลดตัว Highlight syntax มาลง ก็สามารถตั่งเข้าไปได้ ให้โค้ดสวยงามขึ้น

เดียวไว้จะมาอธิบายที่เหลือใน video ด้านล่างนะครับ

 

วิธีการตั่งค่า Plugin จากฟังก์ชันที่เปิดให้ใช้งาน

อันนี้เป็นตัวอย่างการตั่งค่า Plugin ในไฟล์ vimrc ปกติแล้ว Plugin บางตัวอนุญาตให้เราตั่งค่าบางอย่างลงไปได้ โดยใน Document เขาจะอธิบายว่าต้องเขียนยังไง แต่หลักๆ นั่น syntax มันจะเป็นประมาณนี้ครับ และในตัวอย่างผมใช้ Plugin ชื่อ vim-airline เอาไว้แต่ง status bar ให้สวยงามแบบที่ผมทำดูในวีดีโอด้านล่างได้

 

เรียนวิธีการ เขียนฟังก์ชันขึ้นใช้งานเอง

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

 

หัวข้อพิเศษสอนตั่งค่า Indentation สำหรับการเขียนโปรแกรม

สำหรับหัวข้อนี้ผมจะถือว่าพิเศษนิดนึงเพราะผมจะมาสอนการตั่งค่า Indentation หรือว่าการย่อหน้าโค้ด และทำไมต้องทำ Indent ปกติถ้าใครเขียนโปรแกรมและใช้พวก linter เพื่อเช็ค syntax ปกติพวกนี้เขาจะเน้นเรื่องการทำให้โค้ดอ่านง่ายอย่างนึงคือการย่อหน้านั่นเอง หรือ บริษัท ไหนที่เขามีการทำ code review เขาก็จะเน้นเรื่องนี้ด้วยว่าคุณต้องย่อหน้าให้ถูก คนอื่นจะได้อ่านง่ายๆ และ review code ง่ายๆ ตามไปด้วย และกาาตั่งค่าที่ผมทำนั่นก็มีดังนี้

  • tabstop: คือการบอกให้ vim รู้ว่าถ้ามีการกด Tab ให้มันขยับไป 2 ช่อง ปกติมัน 4 ช่อง ถ้าผมจำไม่ผิด
  • shiftwidth: คือการตั่งค่าถ้ากด >> หรือ << เพื่อจัดย่อหน้าให้มันขยับไป 2 space
  • softtabstop: ถ้ามีการ delete/backspace ให้มันขยับกลับมาสอง space และ กด tab ให้ทำงานเป็น 2 space แบบข้อแรก ซึ่งจะตั่งให้สัมพันธ์กันครับ สำคัญมาก
  • expandtab: ตัวนี้ต้องเปิดการทำงานทุกครั่ง ถ้าไม่เปิดที่เราต้องมาด้านบนก็ไร้ความหมาย ตัวนี้คือการให้โปรแกรมเปลี่ยน hard tab เป็น soft tab คือเปลี่ยน tab ให้เป็น space สิ่งนึงที่ความรู้คือ tab และ space มันคนละแบบกันนะครับ มันกว้างไม่เท่ากันเลย เพราะมันคนละ ASCii กัน

ผมแนะนำให้ตั่งค่านะครับ เพราะจะได้ไม่มีปัญหาเรื่องการใช้งานพวก linter และให้ Indent ที่ตรงกันกับ Atom, Sublime หรือ IDE ตัวอื่นๆ เพราะถ้าเราไม่ทำแบบนี้ เวลาโค้ดเราไปอยู่เครื่องอื่น ถ้าเครื่องเราเป็น hard tab แต่ของคนอื่นเป็น soft tab มันจะทำให้โค้ดบรรทัดเพี้ยนได้นะครับ สำหรับเรื่อง hard/soft tab อันนี้ผมยังไม่อธิบายในนี้นะครับ ลองไปหาอ่านใน link ตามนี้ครับ [1][2]

บางคนจะสงสัยทำไมผมถึงใช้ 2 ตั้งค่า เพราะว่าที่ บริษัทผม และส่วนตัวผมเองใช้ 2 space ในกาจัด Indent โค้ดครับ ผมเลยตั่งเป็น 2 แต่ถ้าบริษัทไหน หรือใครชอบแบบอื่นก็ใส่เลขกันเอาได้ ตามใจชอบ และถ้าอยากได้ข้อมูลเพิ่มเติมให้ลองเปิด vim wiki อ่านได้เลยครับ

 

Facebook Comments