我将在今年夏天为我的工作做一些PHP编辑,我正在寻找一个有效的Emacs设置来编辑它。我已经对Emacs投入了大量资金,因此转换到另一个编辑器是不值得的。
现在,我有nXhtml-mode,它提供了一个带有语法高亮的PHP模式(在野外至少有三个不同的模式)以及用于编辑嵌入在HTML中的PHP的MuMaMo。我刚刚开始使用Auto-Complete和Anything来编程和一般的Emacs内容。
我真正想要的是让Emacs真正理解项目的有效方法,而不仅仅是突出显示。 Etags看起来是一个不错的选择,但看起来生成新标签的过程有点艰巨和手动(或至少不可见)。 Etags的优点在于它们可以与Anything和Auto-Complete很好地集成。其他可能的选项是gtags(虽然我对安装非elisp文件犹豫不决,只是为了复杂性),vtags或Semantic,我之前和之前一样搞砸了设置起来很复杂,加上看起来它不支持PHP。
另一个选项是Imenu,但它只适用于当前缓冲区,我希望能够跳转到其他文件中的函数定义(最好使用Anything来完成名称)。
我将要开展的项目不是那么大(总共大约30,000行),所以Etags的开销可能不会是一个大问题,但如果有更好的话我宁愿不使用它溶液
那么您首选的PHP编辑系统是什么?
答案 0 :(得分:23)
除了您已熟悉的功能外,我建议您使用以下功能。
我不使用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-documentation
或C-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-mode
和 auto-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 还支持开箱即用的 phpMessDetector 和 phpCodeSniffer。这使您能够根据支持的编码标准和最佳实践获得更多增强的通知/警告/错误报告。
我喜欢用于静态分析的另一个包是 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 跳转到定义,另一个示例配置:
这是跳转到文件内方法和函数的侧边栏。
(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"))))