Thursday, March 27, 2014

Vim Plugin: Debug PHP ด้วย Vdebug

https://github.com/joonty/vdebug

plugin ตัวนี้ support xdebug protocol ทำให้สามารถ debug ได้หลายภาษา ส่วนตัวใช้กับ PHP project ทำงานได้ดีครับ

Tools

  • Vim + Vdebug
  • Chrome + Xdebug helper plugin
  • Apache + xdebug config

ขั้นตอนการ debug

  1. Set apache ให้ support xdebug
  2. Set break point ใน php code ด้วย Vdebug [F10]
  3. Run vdebug เป็น server รอการติดต่อจาก xdebug [F5]
  4. Enable xdebug helper ให้เข้า debug mode
  5. สร้างคำขอจาก Chrome [เรียก url หรือ ajax]

หลังจากนั้น Vdebug จะสร้าง tab ใหม่ที่มีหน้าต่างเหมือน debug mode ของ IDE ทั่วๆไปและเราสามารถ step over, step in, step out หรือ หยุด debug [F6] ได้ไม่แตกต่างจาก IDE เลย

Vim Tip: search แบบ '*' ด้วย '/'

flow การทำงานใน vim หลังจากเปิด file ขึ้นมา ปกติจะตามด้วยการ search หาตำแหน่งที่ต้องการแก้ไขด้วยคำสั่ง / ตามด้วยบางส่วนของคำ ซึ่งมักจะเจอคำที่ไม่เกี่ยวข้อง

มี search อีกแบบที่เหมาะกับการเขียนโปรแกรมคือ เมื่อ cursor อยู่บนคำที่ต้องการค้น สามารถใช้ * ค้นคำนั้นแบบเต็มคำได้เลย เหมาะกับค้นหาการใช้งานของ ฟังก์ชันหรือตัวแปร

แต่ถ้าเราเปิด file ขึ้นมาแล้วรู้ชื่อตัวแปรหรือฟังก์ชันที่ต้องการแก้ เราจะต้องใช้คำสั่ง /\<config\> เพื่อที่จะหาคำว่า config แบบเต็มคำ คำสั่งนี้จะทำงานเหมือน * แต่ cursor จะอยู่ที่ไหนก็ได้

การพิมพ์ \<\> นั้นยุ่งยากพอสมควร แต่เราสามารถ map key ให้เติม \<\> ได้ง่ายๆด้วย

cnoremap <C-w> <Home>\<<End>\><CR>

วิธีใช้คือ search ปกติด้วย / เช่น

/config

แทนที่จะกด enter ให้ ใช้ ^w แทน ซึ่ง mapping นี้จะทำงานตามลำดับดังนี้

  1. กระโดยไปที่ตำแหน่งหน้าสุด (Home key)
  2. พิมพ์ \<
  3. กระโดดไปที่ตำแหน่งหลังสุด (End key)
  4. พิมพ์ \>
  5. พิมพ์ enter (CR)

ในที่นี้ map ด้วย key ^w ตั้งใจให้หมายถึง word แต่จะ map ด้วย key อะไรก็แล้วแต่ถนัดครับ

แสดง buffer list บน tabline ด้วย vim-airline

หลายคนคงรู้จักหรือเคยใช้ vim-airline กันบางแล้ว ส่วนใครที่ยังไม่รู้จัก vim-airline คือ plugin ที่ใช้ประโยชน์จาก statusline ให้แสดงข้อมูลที่เกี่ยวกับ file, project, scm หรือ ข้อมูลจาก plugin อื่นๆที่ support ได้อย่างสวยงาม ทำให้ vim ดู modern ขึ้นมาทันที

แต่ที่จะพูดถึงวันนี้คือการนำเอา tabline มาใช้ประโยชน์ให้แสดง buffer list ทำให้ไม่ไปเบียดเบียน statusline หรือสร้าง window มาจำลองเป็น buffer bar

การ set vim-airline ให้แสดง buffer list สามารถดูได้ที่
https://github.com/bling/vim-airline#smarter-tab-line

เมือ set ตามด้านบนแล้ว tabline ซึ่งปกติเอาไว้แสดง tab ที่เปิดอยู่จะแสดง buffer list แทนในกรณีที่ไม่ได้เปิด tab (คือมี tab เดียว) และเมื่อไหร่ก็ตามที่มีการสร้าง tab tabline ก็จะแสดงข้อมูล tab แทน

การสลับระหว่าง buffer หรือ tab ที่แสดงอยู่บน tabline ตอนนี้มีอยู่สอง mode ทำให้อาจจะสับสน ถ้าเราอยากย้ายไปที่ buffer/tab ที่ติดกัน แต่ต้องจำหรือดูว่าตอนนี้อยู่ใน mode tab หรือ mode buffer เพื่อที่จะใช้ คำสั่ง prev/next ที่ต่างกัน

อันนี้เป็น mapping ง่ายๆ ที่ผมใช้อยู่ เป็นการสลับ prev/next buffer/tab ที่เรามองเห็น ด้วย H และ L โดยไม่ต้องรู้ว่าที่เห็นอยู่เป็น tab หรือ buffer

function s:NextTabLine()
  if tabpagenr('$') == 1
    bnext
  else
    tabnext
  endif
endfunction

function s:PrevTabLine()
  if tabpagenr('$') == 1
    bprev
  else
    tabprev
  endif
endfunction

nnoremap <silent> H :call <SID>PrevTabLine()<CR>
nnoremap <silent> L :call <SID>NextTabLine()<CR>

Vim Plugin: xolox/vim-session

vim-session เป็น plugin ที่ผมใช้ทุกวัน เหมาะกับงานที่เป็น project base

vim-session เป็นส่วนขยายของคำสั่ง mksession โดยเพิ่มความง่ายในการ save และ load session และได้เพิ่มความสามารถในการ save options เพิ่มเติมจาก mksession

ถ้าลง plugin ครั้งแรก อาจจะสับสนหน่อย เพราะจะมี message แจ้งการ load session แบบ auto หรือ message ตอนปิด vim
แนะนำให้ set ตัวแปรตามนี้ใน vimrc

let g:session_autoload='no'
let g:session_autosave='yes'

หมายถึงไม่ต้อง load session ใดๆตอนเปิด และ save session ปัจจุบันตอนปิด

วิธีใช้ที่ผมใช้อยู่คือ

  1. เริ่ม project ใหม่ [ปกติทำครั้งเดียว แล้วลืมไปได้เลย] เปิด vim ที่ directory ของ project หรือ เปิด vim แล้ว cd ไปที่ directory ของ project แล้ว ใช้ คำสั่ง

    :SaveSession project-name

    ขั้นตอนนี้ทำแค่ครั้งเดิยวตลอดการทำงาน ของ project
    หลังจากนั้นเราก็ทำงานปกติ load file, split window, เปิด tab
    เวลาจะหยุดทำงาน เราสามารถปิด vim ได้เลย vim-session จะ save session ปัจจุบันให้ (set ตัวแปรนี้ใน vimrc เหมือนด้านบน)

  2. กลับเข้าทำงานกับ project
    ขั้นนี้เป็นสิ่งที่่ทำทุกวันเวลาเริ่มงาน สิ่งที่ต้องทำคือ ใช้คำสั่ง

    :OpenSession project-name

    โดยที่ project-name คือชื่อที่ save ตอนแรก แล้วทุกอย่างก็จะ set ตามที่เราเคยปิดไปเช่น current directory จะอยู่ที่ project, file ที่เคยเปิดไว้, window ที่ split ไว้, tab ที่เปิดไว้, colorscheme, font และอื่นๆ จะยังเหมือนเดิม ทำให้เราเริ่มทำงานได้ง่ายขึ้น