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

NSLog0
NSLog0
Mar 12 · 4 min read

โพสเก่าจาก Blog เดิม มิถุนายน 31, 2017

Image for post
Image for post

บทความนี้เราจะมาพูดถึงเรื่องไฟล์ .vimrc วิธีการใช้งานและประโยนช์ของมัน และวิธีการตั้งค่าการใช้งานไฟล์ rc ของเรา ซึ่งผมก็เคยได้พูดกันไปในการติดตั้ง Plugin มาแล้ว ในความนี้ผมจะมาอธิบายการใช้งานในเชิงลึกอีกครั้งนึง

Introduction rc files

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


Introduction .vimrc

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


Where to find .vimrc?

" setup key with recursive
map <leader>w :w<CR>
map <leader>q :q<CR>
" setup key with non-recursive
noremap W j
" setup key for call plugin function
map <C-n> :NERDTreeToggle<CR>

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

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

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


How recursive mapping works

1: map j gg
2: map Q j
3: noremap W j

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


How to call a Pluging function via keyboard

" setup key for call plugin function
map <C-n> :NERDTreeToggle<CR>

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

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


How to call a default command in vim with vimrc

set encoding=utf-8 " file encode" The advantage of having the status line displayed always is, you can see the current mode, file name, file status, ruler, etc.
set laststatus=2
" fix backspace notworking
set backspace=indent,eol,start
" display status line/colmun number at buttom
set ruler
" display line number
set number
" open highlight syntax
syntax on
" set theme
colorscheme petrel

อันนี้เป็นตัวอย่างการเรียกใช้งานตั่งค่าต่างๆ ที่มากับตัว 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 มาลง ก็สามารถตั้งเข้าไปได้ ให้โค้ดสวยงามขึ้น

Setting Plugins with vimrc

" plugin settinglet 
g:airline_theme='luna'let
g:airline#extensions#tabline#enabled = 1let g:airline#extensions#tabline#left_sep = ' 'let g:airline#extensions#tabline#left_alt_sep = '|'let g:airline_powerline_fonts = 1

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


Making your own function in vim

let s:comment_map = { 
\ "c": '\/\/',
\ "cpp": '\/\/',
\ "go": '\/\/',
\ "java": '\/\/',
\ "javascript": '\/\/',
\ "lua": '--',
\ "scala": '\/\/',
\ "php": '\/\/',
\ "python": '#',
\ "ruby": '#',
\ "rust": '\/\/',
\ "sh": '#',
\ "desktop": '#',
\ "fstab": '#',
\ "conf": '#',
\ "profile": '#',
\ "bashrc": '#',
\ "bash_profile": '#',
\ "mail": '>',
\ "eml": '>',
\ "bat": 'REM',
\ "ahk": ';',
\ "vim": '"',
\ "tex": '%',
\ }
function! ToggleComment()
if has_key(s:comment_map, &filetype)
let comment_leader = s:comment_map[&filetype]
if getline('.') =~ "^\\s*" . comment_leader . " "
" Uncomment the line
execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
else
if getline('.') =~ "^\\s*" . comment_leader
" Uncomment the line
execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
else
" Comment the line
execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
end
end
else
echo "No comment leader found for filetype"
end
endfunction
nnoremap <leader><Space> :call ToggleComment()<CR>
vnoremap <leader><Space> :call ToggleComment()<CR>

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


Bonus: Setting for coding

" coding indent setting
set tabstop=2 " change tab width
set shiftwidth=2 " affects what happens when you press >>, << or =
set softtabstop=2 " tell backspace gose back step or tab width
set expandtab " convert tab to space

สำหรับหัวข้อนี้จะมาสอนการตั้งค่า Indent หรือว่าการย่อหน้าโค้ดเพื่อให้อ่านได้ง่ายขึ้น

  • 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]


AlgorithmTut

May the force be with you. **Tut stand for Tutorial**

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store