【问题标题】:What is a good setup for editing PHP in Emacs?在 Emacs 中编辑 PHP 的好设置是什么?
【发布时间】:2010-10-29 02:23:50
【问题描述】:

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

现在,我有nXhtml-mode,它提供了一种带有语法高亮的 PHP 模式(至少有三种不同的模式),以及用于编辑嵌入在 HTML 中的 PHP 的 MuMaMo。我刚开始分别使用Auto-CompleteAnything 进行编程和一般的Emacs 东西。

我真正想要的是一种让 Emacs 真正理解项目的有效方法,而不仅仅是突出显示。 Etags 看起来是个不错的选择,但看起来生成新标签的过程有点费力和手动(或者至少不是隐形的)。 Etags 的好处是它们可以很好地与任何东西和自动完成集成。其他可能的选项是gtags(虽然我犹豫是否安装非 elisp 文件,只是为了复杂性)、vtagsSemantic,我之前已经搞砸了,而且设置起来似乎很复杂,另外好像不支持 PHP。

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

我将从事的项目并没有那么大(总共大约 30,000 行),所以 Etags 的开销可能不会是什么大问题,但如果有更好的,我宁愿不使用它解决方案。

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

【问题讨论】:

    标签: php emacs editor autocomplete


    【解决方案1】:

    除了你已经熟悉的功能,我建议你以下。

    ETags

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

    调试

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

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

    文档查找

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

    【讨论】:

    【解决方案2】:

    web-model.el(在web-mode.org 上可用)可以很好地处理嵌入在 html 文档中的 php 块。这个主模式也会高亮js和css部分。

    【讨论】:

      【解决方案3】:

      作为 ETags 的替代品,请考虑使用 GNU Global,即“GTags”。 Global 在查找标签表方面要聪明得多,并且更新速度相当快。 Emacs-fu 有一篇关于doing this on-the-fly 的好帖子。

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

      【讨论】:

        【解决方案4】:

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

        自动完成

        ac-php 在我看来是对 Etags 的一个很好的补充。所有对标签的引用都可以用 etags 找到,但定义用 ac-php。 ac-php 也可配置为应包含哪些目录。例如,在开发 wordpress 插件时,您可以在 .ac-php-conf.json(位于项目根目录)中添加对包含 wordpress 文件的目录的引用,它会自动完成、跳转到引用等。此包支持 @ 987654330@和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 还支持开箱即用的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跳转到定义,另一个示例配置:

        这是用于跳转到in-file方法和函数的侧边栏。

        (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"))))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-03
          • 1970-01-01
          • 2012-01-29
          • 2011-08-03
          • 2010-11-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多