EMACS-DOCUMENT

=============>集思广益

教你怎么配置Emacs的PHP开发环境

最近,给我逮到一个机会安利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

Melpa 是一个代码库,emacs可以从这里直接拉取package. 在以前,为Emacs添加一个package需要经历下载,解压,编译这么多步骤. 不过现在这些动作都被自动化串联起来了,而且全部都在Emacs中完成的. 你可以按照这里 的说明来添加Melpa. 如果你用的是新版Emacs的话,基本上只需要把下面代码添加到 .emacs 就行了.

(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))

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就可以实现自动补全了:

{completion}

(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代码,替之以现代的,功能繁多的,易安装的牛逼代码,这种感觉真是太好了.