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
就完成囉~
要解決上述的問題, 由下面兩個步驟來解決:
- 設定 VIM 讓 HTML 正確縮排(Indent) - 先讓 HTML 正確縮排
- 設定 VIM 讓 *.php 做 HTML 縮排(Indent) - 讓 *.php 遇到 HTML 時, 能用 HTML 縮排來排版
設定 VIM 讓 HTML 正確縮排(Indent)
首先讓 HTML 能正確的縮排, 步驟如下:
- 於 indent/html.vim - alternative html indent script
- 下載 html.vim
- mkdir ~/.vim/indent
- mv html.vim ~/.vim/indent
- 於 ~/.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 有另外一種解法, 解法沒有研究, 不過稍微看看, 大概是下面的流程:
- 縮排時先執行 indent/html.vim, 如果有做過縮排, 就結束.
- 若沒有縮排, 再執行 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_initsfunction! 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
endfunctionsetlocal indentexpr=GetPhpHtmlIndent(v:lnum)
setlocal indentkeys+=<>>