はじめに
phpファイル保存時にLint処理(php -l)を行ない、エラーがあればQuickFixに表示するプラグインを作ってみました。
(多分もう世の中にあると思いますが。。。)
今まではプラグインを使用することはあっても、自力でvimのプラグインを作成することはなかったので、まずは簡単なものから。。。
勉強中なのでもっとよいものが書けるように頑張ります。
一応githubにのせてます
もし何かのお役に立てば幸いです。
https://github.com/MasaharuSuizu/vim-php-lint
インストール方法 & 使い方
詳しくは
https://github.com/MasaharuSuizu/vim-php-lint
に載せています。
一応、日本語と頑張って英語でも書きました。
本当はプラグインにしなくてもいいんですけどね。。。
たいした内容ではないので、.vimrcに下記をコピペすれば同じことができます。
コメントも載せておきます。
augroup PHP
autocmd! " 書き込みのプレ処理autocmdBufWritePre *.php call PHPPre() " 書き込みのポスト処理autocmdBufWritePost *.php call PHPPost() " 書き込みのプレ処理function PHPPre()endfunction " 書き込みのポスト処理 " PHPLint " コードの整形function PHPPost() " php -lの実行結果を変数に代入let Lint_Result = system(&ft . ' -l ' . bufname("")) " No syntax errorsの文字列がmatchするかチェックlet Match_Result = matchstr(Lint_Result,'No syntax errors') " エラーがあるときだけLintの結果を出力するif len(Match_Result)==0 " 半角スペースごとに配列を分割let splitErrorMsg = split(Lint_Result,' ')let lineFlg =0let lineNumber =0 " エラーメッセージからエラーの行数を拾う " エラーメッセージのlineの後がエラーの行数みたいfor word in splitErrorMsg
if lineFlg ==1let lineNumber = word
:breakelseif word =='line'let lineFlg =1endifendifendfor " QuickFixのリストの末尾にエラーの内容を追加するlet qflist = []
call add(qflist, {'filename': bufname(""),'type': 'i','lnum': lineNumber,'col': 1,'text': Lint_Result})call setqflist(qflist) " QuickFixを表示
:copenelse " QuickFixを閉じる
:ccloseendifendfunction
augroup END
php_cs_fixerプラグインやtagファイルを使われている方へのおまけ
本当は、自身の.vimrcではphp_cs_fixerプラグインとの連携や、
tagファイルの自動更新処理(コマンドたたいているだけですが。。。)
とも連携させています。
それもコードを載せておきます。
これも何かのお役に立てば幸いです。
tagファイルのパスは変えてくださいね
" ---------------------------- PHP用の設定 ----------------------------
augroup PHP
autocmd! " 書き込みのプレ処理autocmdBufWritePre *.php call PHPPre() " 書き込みのポスト処理autocmdBufWritePost *.php call PHPPost() " 書き込みのプレ処理function PHPPre()endfunction " 書き込みのポスト処理 " PHPLint " コードの整形function PHPPost() " php -lの実行結果を変数に代入let Lint_Result = system(&ft . ' -l ' . bufname("")) " No syntax errorsの文字列がmatchするかチェックlet Match_Result = matchstr(Lint_Result,'No syntax errors') " エラーがあるときだけLintの結果を出力するif len(Match_Result)==0 " 半角スペースごとに配列を分割let splitErrorMsg = split(Lint_Result,' ')let lineFlg =0let lineNumber =0 " エラーメッセージからエラーの行数を拾う " エラーメッセージのlineの後がエラーの行数みたいfor word in splitErrorMsg
if lineFlg ==1let lineNumber = word
:breakelseif word =='line'let lineFlg =1endifendifendfor " QuickFixのリストの末尾にエラーの内容を追加するlet qflist = []
call add(qflist, {'filename': bufname(""),'type': 'i','lnum': lineNumber,'col': 1,'text': Lint_Result})call setqflist(qflist) " QuickFixを表示
:copenelse " QuickFixを閉じる
:cclose " php_cs_fixerを利用してコードを整形call PHPCs() " tagファイル更新call UpdateCtags()endifendfunction " php_cs_fixerプラグインの設定function PHPCs() " If php-cs-fixer is in $PATH, you don't need to define line belowletg:php_cs_fixer_path ="/usr/local/bin/php-cs-fixer"" define the path to the php-cs-fixer.pharletg:php_cs_fixer_level ="psr2"" which level ?letg:php_cs_fixer_config ="default"" configuration "let g:php_cs_fixer_config_file = '.php_cs' " configuration fileletg:php_cs_fixer_php_path ="php"" Path to PHP " If you want to define specific fixers:letg:php_cs_fixer_fixers_list ="linefeed,short_tag,indentation"letg:php_cs_fixer_enable_default_mapping =1" Enable the mapping by default (<leader>pcd)letg:php_cs_fixer_dry_run =0" Call command with dry-run optionletg:php_cs_fixer_verbose =0" Return the output of command if 1, else an inline information.
:call PhpCsFixerFixFile()syntaxonendfunction " Ctags自動生成処理function UpdateCtags() " 外部コマンドを叩く
:call system('ctags -R /var/www/html 2> /dev/null && mv ./tags /var/www/')endfunction
augroup END
将来的には連携したものをgithubに載せる予定です。
わてくしの他の記事の紹介
■ vimをIDEっぽくしたいなぁ1 ~クラスや関数の宣言元にF3ボタンで別タブを開きジャンプする~
■ vimをIDEっぽくしたいなぁ2 ~taglistを使いメソッド、変数、定数の一覧を表示する~
■ vimをIDEっぽくしたいなぁ3 ~nerdtreeを使い、vimを開いた状態でディレクトリをツリー表示、そこから別ファイルに飛んじゃおう~
■ vimをIDEっぽくしたいなぁ4 ~function,switch,foreachをテンプレファイルにしておいて、ワンタッチで呼び出す。あ、.vimrc使います~
■ vimをIDEっぽくしたいなぁ5 ~vimを開いたまま再帰的なgrepをしてプロジェクト内のファイル検索。検索結果一覧から目的箇所へジャンプしましょう。あ、ちゃんと別タブで開きます。~
■ vimをIDEっぽくしたいなぁ6 ~SublimeTextのように行またぎの選択(multiple selection)を可能にするvim-multiple-cursorsを導入してみよう~
■ vimをIDEっぽくしたいなぁ7 ~自動コマンドを活用しよう。たまにはvimscriptを書くか。行末のスペース削除や構文チェック~