X

給 PHP 和 HTML 專用的 VIM 縮排(Indent)

Vim 在寫 *.html 和 *.php 時, 在 HTML 排版上, 都有些不夠聰明的狀況.

  • *.html => 自動排版會將所有 HTML Tag 都排在同一列, 等同於沒有縮排.
  • *.php => 自動排版會將 HTML Tag 排在在同一列外, 按 Enter 後, 游標會在第一個位置, 不會做聰明的縮排動作.

註: 下述太多不想看, 只想直接解決的, 只要下載 html.vim(於 indent/html.vim) 和 php.vim(於 Better indent support for php with html), 將這兩個檔案放到 ~/.vim/indent, 再於 .vimrc 加入 
filetype indent on 就完成囉~

要解決上述的問題, 由下面兩個步驟來解決:

  1. 設定 VIM 讓 HTML 正確縮排(Indent) - 先讓 HTML 正確縮排
  2. 設定 VIM 讓 *.php 做 HTML 縮排(Indent) - 讓 *.php 遇到 HTML 時, 能用 HTML 縮排來排版

設定 VIM 讓 HTML 正確縮排(Indent)

首先讓 HTML 能正確的縮排, 步驟如下:

  1. indent/html.vim - alternative html indent script
  2. 下載 html.vim
  3. mkdir ~/.vim/indent
  4. mv html.vim ~/.vim/indent
  5. 於 ~/.vimrc 加入 filetype indent on (Enable filetype detection and use of indent plugins)

設定 VIM 讓 *.php 做 HTML 縮排(Indent)

HTML 既然都可以縮排, 本來想法是把 filetype=php 指成 html, 就可以先頂著用, 不過這樣子在寫 php 時又得要換回來, 有點麻煩.

此篇 Better indent support for php with html 有另外一種解法, 解法沒有研究, 不過稍微看看, 大概是下面的流程:

  1. 縮排時先執行 indent/html.vim, 如果有做過縮排, 就結束.
  2. 若沒有縮排, 再執行 indent/php.vim (php.vim 的內容在下面)

php.vim # 將下面的文字存成 php.vim, 並搬到 ~/.vim/indent 下即可. (此 php.vim 轉載自: "Better indent support for php with html")


" Better indent support for PHP by making it possible to indent HTML sections
" as well.
if exists("b:did_indent")
  finish
endif

" This script pulls in the default indent/php.vim with the :runtime command
" which could re-run this script recursively unless we catch that:
if exists('s:doing_indent_inits')
  finish
endif
let s:doing_indent_inits = 1
runtime! indent/html.vim
unlet b:did_indent
runtime! indent/php.vim
unlet s:doing_indent_inits

function! GetPhpHtmlIndent(lnum)
  if exists('*HtmlIndent')
    let html_ind = HtmlIndent()
  else
    let html_ind = HtmlIndentGet(a:lnum)
  endif
  let php_ind = GetPhpIndent()
  " priority one for php indent script
  if php_ind > -1
    return php_ind
  endif
  if html_ind > -1
    if getline(a:num) =~ "^<?" && (0< searchpair('<?', '', '?>', 'nWb')
          \ || 0 < searchpair('<?', '', '?>', 'nW'))
      return -1
    endif
    return html_ind
  endif
  return -1
endfunction

setlocal indentexpr=GetPhpHtmlIndent(v:lnum)
setlocal indentkeys+=<>>

相關網頁

Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.