教你怎么配置Emacs的PHP开发环境
Table of Contents
最近,给我逮到一个机会安利emacs. 天,这简直正中我的下怀啊. 我把我喜欢的那些功能 都讲了一笔,从dired到动态缩写扩展,再到ispell这种广受赞誉的包. 我跟他们讲拥有这么一个完全可编程的,自文档的编辑器是多么的强力. 我相信,经过我的布道,一定有新人加入我们的部落中.
然后,在昨天的时候,有人吻了我一个问题差点颠覆了我的观点: 该用哪个mode来编辑PHP呢? 考虑到我写代码大多数都是PHP,你可能会觉得我早已有了明确的答案. 可惜,我现在的解决方案用到了一些hacked code,我并不建议普通人使用我现在的这种解决方案. 这下糟了. 我只能草草结束会议并承诺去寻找目前最新的PHP解决方案是什么再告诉他们.
PHP事实上是一门对编辑器来说很棘手的编程语言. 因为它的写作风格很多变,它即可能写的好些是C语言代码一样,也可能写成一坨由C,HTML,CSS及JavaScript混在一起的东西. Emacs上的一个老问题就是总是有太多的不完美的解决方案. 看看emacs wiki 你就知道我是什么意思了. 你会看到太多方案,但是没有一个方案是完美的.
不过经过我艰苦卓绝的实验,我相信我已经成功找到用emacs编辑PHP的合理方案. 下面是配置的过程:
1 Step 1: Setup Melpa
2 Step 2: Install the Melpa available PHP Mode
Emacs自带了一个PHP mode, 但是这个php-mode 更现代些. 它的README 中甚至提及了PHP 7, 说明这个php-mode足够新,能够支持最新的语法.
用Melpa安装这个mode超级简单. 只需要运行: M-x package-install
然后输入 php-mode
即可.
安装好后,我将缩进设置为2个空格而不是空格,关闭对HTML的支持并启用subword-mode. 所有这些设置都由一个函数来完成,并且该函数被纳入到 php-mode-hook
中了:
(defun bs-php-mode-hook () (setq indent-tabs-mode nil) (setq c-basic-offset 2) (setq php-template-compatibility nil) (subword-mode 1)) (add-hook 'php-mode-hook 'bs-php-mode-hook)
3 Step 3: Install Web-Mode.el
上面的php-mode比较适合于以PHP为主的文件. 对于那些包含HTML,CSS和Javascript的文件就要用到web-mode.el 了. web-mode的安装 与配置跟php-mode类似:
(defun bs-web-mode-hook () (local-set-key '[backtab] 'indent-relative) (setq indent-tabs-mode nil) (setq web-mode-markup-indent-offset 2 web-mode-css-indent-offset 2 web-mode-code-indent-offset 2)) (add-hook 'web-mode-hook 'bs-web-mode-hook)
Web-mode.el特别好用,我觉得它几乎就能满足我所有的PHP需求了. 如果真的是这样的话,我可能会弃用php-mode. 不过就目前来说,我觉得在两个mode之间切换蛮好的.
4 Step 4: Add a Quick Mode Toggle
收到EmacsWiki上这条tip的启发, 我写了个函数来快在php-mode和web-mode之间快速切换. 下面是这个函数的源代码:
(defun toggle-php-flavor-mode () (interactive) "Toggle mode between PHP & Web-Mode Helper modes" (cond ((string= mode-name "PHP") (web-mode)) ((string= mode-name "Web") (php-mode)))) (global-set-key [f5] 'toggle-php-flavor-mode)
现在我只要按下F5就能切换到另一种编辑模式下了.
我还可以指定哪些文件是纯代码,哪些文件是纯标签的. 我可以通过代码来指定在 snippets
目录中的文件,总是用 web-mode
打开; 在 lib
下的文件,总是用 php-mode
打开.
这就是拥有一款完全编程能力编辑器的乐趣呀. 我的地盘我做主!
5 Step 5: Bonus - Setup aggressive auto-completion
为了让Emacs更好用,我决定试试ac-php, 这是一个能提供函数和类名补全的库. 我按照这里写的过程安装, 按下面写的方法更新我的 .emacs
文件, 在我的项目根目录中创建一个名为 .ac-php-conf.json
的空文件,然后执行 M-x ac-php-remake-tags-all
. 完成这些操作后, emacs就可以实现自动补全了:
(defun bs-php-mode-hook () (auto-complete-mode t) ;; « (require 'ac-php) ;; « (setq ac-sources '(ac-source-php )) ;; « (yas-global-mode 1) ;; « (setq indent-tabs-mode nil) (setq php-template-compatibility nil) (setq c-basic-offset 2))
丢弃了乱糟糟的PHP代码,替之以现代的,功能繁多的,易安装的牛逼代码,这种感觉真是太好了.