在Emacs中编辑PHP有什么好的设置?

时间:2009-05-26 20:46:41

标签: php emacs editor autocomplete

我将在今年夏天为我的工作做一些PHP编辑,我正在寻找一个有效的Emacs设置来编辑它。我已经对Emacs投入了大量资金,因此转换到另一个编辑器是不值得的。

现在,我有nXhtml-mode,它提供了一个带有语法高亮的PHP模式(在野外至少有三个不同的模式)以及用于编辑嵌入在HTML中的PHP的MuMaMo。我刚刚开始使用Auto-CompleteAnything来编程和一般的Emacs内容。

我真正想要的是让Emacs真正理解项目的有效方法,而不仅仅是突出显示。 Etags看起来是一个不错的选择,但看起来生成新标签的过程有点艰巨和手动(或至少不可见)。 Etags的优点在于它们可以与Anything和Auto-Complete很好地集成。其他可能的选项是gtags(虽然我对安装非elisp文件犹豫不决,只是为了复杂性),vtagsSemantic,我之前和之前一样搞砸了设置起来很复杂,加上看起来它不支持PHP。

另一个选项是Imenu,但它只适用于当前缓冲区,我希望能够跳转到其他文件中的函数定义(最好使用Anything来完成名称)。

我将要开展的项目不是那么大(总共大约30,000行),所以Etags的开销可能不会是一个大问题,但如果有更好的话我宁愿不使用它溶液

那么您首选的PHP编辑系统是什么?

4 个答案:

答案 0 :(得分:23)

除了您已熟悉的功能外,我建议您使用以下功能。

ETag的

我不使用ETag,但SO How to programmatically create/update a TAGS file with emacs 上已经存在一个问题。虽然没有发布好的答案,但它可能是一个很好的切入点。

调试

Flymake是一种快速进行语法检查的模式。它也支持PHP。它会在您键入时立即提示语法错误。 Emacs 23附带的Flymake版本包含PHP支持。如果您有以前的版本,请在 Emacs and PHP: On-the-fly syntax checking with Flymake 上查看Sacha Chua的帖子。

另一个有用的包是Geben,允许您以交互方式调试脚本。对于PHP,您可以使用XDebug。有关如何执行此操作的详细教程,请参阅 Debug php in emacs with geben

文档查找

PHP模式有一个很好的功能,可以在Web浏览器(M-x php-search-documentationC-c C-f)中查看PHP手册中的函数定义。您可以将其与Emacs-W3M结合使用,以获取相关的手册页而无需离开Emacs。

答案 1 :(得分:5)

web-model.el(在web-mode.org上可用)处理嵌入在html文档中的非常好的php块。这个主要模式还将突出显示js和css部分。

答案 2 :(得分:3)

作为ETag的替代品,请考虑GNU Global,即“GTags”。 Global在查找标签表方面更加智能,而且更新速度相当快。 Emacs-fu有一篇关于doing this on-the-fly的好文章。

顺便说一句,如果您使用Windows Emacs版本的GNU Global Windows端口,请使用DJGPP(“DOS”)版本。 MinGW(“Win32”)版本似乎有路径名的问题。

答案 3 :(得分:1)

除了 09 年 5 月 28 日给出的答案之外,我想我可以向其中添加一些包,以增强我在 Emacs 上的 PHP 体验。

自动完成

ac-php 在我看来是 Etags 的一个很好的补充。所有对标签的引用都可以用 etags 找到,但用 ac-php 定义。 ac-php 还可以配置应包含哪些目录。例如,在开发wordpress插件时,你可以在.ac-php-conf.json中添加包含wordpress文件的目录的引用(它驻留在项目根目录中),它会自动完成,跳转到引用等。这个包支持 company-modeauto-complete

以下是 ac-php 的示例配置:

(use-package ac-php
  :ensure t
  :bind (:map
         php-mode-map
         ("M-+" . ac-php-find-symbol-at-point)
         ("M-]" . ac-php-location-stack-back)
         ("<menu> r" . ac-php-remake-tags)
         ("<menu> R" . ac-php-remake-tags-all)))

另一种选择是使用 phpactor,但 Emacs 界面在撰写本文时仍处于 alpha 阶段,我也几乎没有任何经验 - 除了构造函数完成,它工作得很好。

错误检查

除了语法错误之外,Flycheck 还支持开箱即用的 phpMessDetectorphpCodeSniffer。这使您能够根据支持的编码标准和最佳实践获得更多增强的通知/警告/错误报告。

我喜欢用于静态分析的另一个包是 PHPStan Emacs interface,它报告您代码中的潜在错误(包括不正确的类型提示)。

其他格式

我也使用 phpcbf(显然已存档)。此包将缓冲区格式化为所需的编码标准。

语义

对于任何不了解的人,Semantic 是一个内置的 Emacs 包,并提供类似 IDE 的功能。这是一个如何为 php-mode 包含语义的示例:

(add-hook 'php-mode-hook (lambda ()
                           (require 'semantic/symref/grep)
                           (add-to-list 'semantic-symref-filepattern-alist '(php-mode "*.php" "*.inc"))
                           (semantic-mode)))

Imenu

为了包含 imenu 跳转到定义,另一个示例配置:

这是跳转到文件内方法和函数的侧边栏。

(use-package imenu-list
  :ensure t
  :config
  (setq imenu-list-focus-after-activation t)
  :bind (:map php-map
         ("<menu> \\" . imenu-list-smart-toggle)))

用于跳转到定义的 helm 支持示例配置在所有项目文件中

(use-package imenu-anywhere
  :ensure t
  :after helm
  :bind (:map php-map
         ("<menu> |" . helm-imenu-anywhere)))

额外调试

除了 geben 之外,我喜欢使用 psysh,它通过加入 eval(\Psy\sh()); 给出了该行代码的 repl,并允许访问所有定义以及任何其他人可以访问的内容(当然,在作曲家要求它之后)。

更方便的包

片段

对于已经使用过 Emacs 的每个人来说可能有点明显,但是 yasnippet 对于编写自己的模板也非常方便。还有一些包包含许多适用于各种语言的预定义模板,但我自己编写了自己的包,以使 Emacs 比我的设置更不臃肿,这也有助于我更轻松地记住它们。

项目管理

再次原谅显而易见的问题,但 Projectile 也是一个非常好的包,默认情况下它包含用于确定项目范围的 git 支持。

离线文档

如果您使用 Zeal 进行离线文档浏览,还有 zeal-at-point。示例配置,如果你使用,比方说:PHP、CodeIgniter 和 WordPress:

(use-package zeal-at-point
  :ensure t
  :bind (("<menu> z" . zeal-at-point))
  :config
  (add-to-list 'zeal-at-point-mode-alist '(php-mode . ("codeigniter" "wordpress" "php"))))