¿Cuál es una buena configuración para editar PHP en Emacs?

6 minutos de lectura

Voy a hacer algo de edición de PHP para mi trabajo este verano, y estoy buscando una configuración efectiva de Emacs para editarlo. Ya estoy muy interesado en Emacs, por lo que no vale la pena cambiar a otro editor.

Ahora mismo, tengo modo nXhtml, que proporciona un modo PHP con resaltado de sintaxis (hay al menos tres diferentes en la naturaleza), así como MuMaMo para editar PHP incrustado en HTML. acabo de empezar a usar Autocompletar y Cualquier cosa para programación y cosas generales de Emacs, respectivamente.

Lo que realmente estoy buscando es una forma efectiva de lograr que Emacs entienda realmente el proyecto, más allá de simplemente resaltarlo. Etiquetas parece una buena opción, pero parece que el proceso para generar nuevas etiquetas es algo arduo y manual (o al menos no invisible). Lo bueno de Etags es que se integran bien con Anything y Auto-Complete. Otras posibles opciones son gtags (aunque dudo en instalar archivos que no sean elip, solo por la complejidad), etiquetas vo Semánticocon el que me he metido antes y parece complicado de configurar, además no parece que tenga soporte para PHP.

Otra opción es Imenupero solo funciona para el búfer actual, y me gustaría poder saltar a definiciones de funciones en otros archivos (preferiblemente usando Anything para completar el nombre).

Los proyectos en los que trabajaré no son tan grandes (alrededor de 30,000 líneas en total), por lo que la sobrecarga de Etags probablemente no sea un problema tan grande, pero prefiero no usarlo si hay una solución mejor.

Entonces, ¿cuál es su sistema de edición de PHP preferido?

avatar de usuario
viam0zah

Además de las funciones con las que ya está familiarizado, le sugiero las siguientes.

Etiquetas electrónicas

No uso ETags, pero ya hay una pregunta en SO Cómo crear/actualizar mediante programación un archivo TAGS con emacs. Sin embargo, no se publicó una buena respuesta, pero puede ser un buen punto de entrada para tener una idea.

depuración

Flymake es un modo de comprobar la sintaxis sobre la marcha. Tiene soporte para PHP también. Insinúa errores de sintaxis inmediatamente mientras escribe. La versión Flymake enviada con Emacs 23 contiene soporte para PHP. Si tiene una versión anterior, consulte la publicación de Sacha Chua en Emacs y PHP: verificación de sintaxis sobre la marcha con Flymake.

Otro paquete útil es Geben que le permite depurar sus scripts de forma interactiva. Para PHP, puede usar XDebug. Hay un tutorial detallado sobre cómo hacerlo, consulte Depurar php en emacs con geben.

Búsqueda de documentación

El modo PHP tiene una buena función para buscar la definición de la función en el manual de PHP en su navegador web (M-x php-search-documentation o C-c C-f). Puedes combinarlo con Emacs-W3M para obtener la página de manual relevante sin salir de Emacs.

  • +1 para la función de documentación de búsqueda de php de la que no tenía idea.

    – Will Sampson

    5 de junio de 2013 a las 22:24

  • El enlace para depurar con Emacs/geben está roto ☹

    – Hola angel

    17 de febrero de 2015 a las 13:45


  • Archivo de Internet del enlace ahora desaparecido.

    – Mark A. Hershberger

    15/03/2018 a las 21:02

web-model.el (disponible en modo-web.org) maneja bastante bien los bloques php incrustados en un documento html. Este modo principal también resaltará las partes js y css.

Como alternativa a ETags, considere GNU Global, también conocido como “GTags”. Global es mucho más inteligente a la hora de encontrar tablas de etiquetas y es bastante rápido de actualizar. Emacs-fu tiene una buena publicación sobre haciendo esto sobre la marcha.

Por cierto, si está usando el puerto de Windows de GNU Global con una compilación de Windows Emacs, use la versión DJGPP (“DOS”). La compilación MinGW (“Win32”) parece tener un problema con los nombres de ruta.

avatar de usuario
jeffrey

Además de la respuesta dada el 28 de mayo de 2009, creo que puedo agregarle algunos paquetes que mejoraron mi experiencia con PHP en Emacs.

Autocompletar

ac-php es, en mi opinión, una buena adición a Etags. Todas las referencias a una etiqueta se encontrarán con etags, pero la definición con ac-php. ac-php también se puede configurar en qué directorios se deben incluir. Por ejemplo, al desarrollar un complemento de wordpress, puede agregar una referencia al directorio que contiene los archivos de wordpress en .ac-php-conf.json (que reside en la raíz del proyecto) y se completará automáticamente, saltará a la referencia, etc. Este paquete admite company-mode y auto-complete.

Aquí hay un ejemplo de configuración de 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)))

Otra opción sería usar phpfactorpero la interfaz de Emacs se encuentra en el momento de escribir esto todavía en la etapa alfa, con la que apenas tengo experiencia, excepto por la finalización del constructor, que funciona bastante bien.

Comprobación de errores

Además de los errores de sintaxis, Flycheck admite phpMessDetector y phpCodeSniffer fuera de la caja. Esto le permite tener un mejor informe de notificación/advertencia/error basado en el estándar de codificación compatible y las mejores prácticas.

Otro paquete que me gusta para el análisis estático es Interfaz PHPStan Emacsque informa posibles errores en su código (incluidas sugerencias de tipo incorrecto).

Formato adicional

yo también uso phpcbf (que aparentemente está archivado). Este paquete formatea el búfer en el estándar de codificación deseado.

Semántico

Para cualquiera que no sepa nada, Semantic es un paquete integrado de Emacs y proporciona funciones similares a IDE. Aquí hay un ejemplo de cómo incluir semántica para el modo php:

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

Imenú

Para incluir imenu saltando a definiciones, otra configuración de ejemplo:

Esta es la barra lateral para saltar a en archivo métodos y funciones.

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

Configuración de ejemplo para soporte de timón al saltar a definiciones en todos los archivos del proyecto:

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

Depuración adicional

Además de geben, me gusta usar psicópataque al caer eval(\Psy\sh()); da una respuesta en esa línea de código y da acceso a todas las definiciones y cualquier otra cosa a la que uno tenga acceso (por supuesto, después de requerirlo en el compositor).

Paquetes más prácticos en general

fragmentos

Tal vez un poco obvio para todos los que ya tienen experiencia con Emacs, pero Yasnippet también es muy útil para escribir sus propias plantillas. También hay paquetes que incluyen muchas plantillas predefinidas para todo tipo de lenguajes, pero yo escribo la mía para mantener Emacs un poco menos hinchado de lo que ya está mi configuración, también me ayuda a recordarlos más fácilmente.

Gestión de proyectos

Disculpe la obviedad nuevamente, pero Projectile también es un paquete muy bueno que, de forma predeterminada, incluye soporte de git para definir el alcance del proyecto.

Documentación fuera de línea

Si usa Zeal para buscar documentación sin conexión, también hay zeal-at-point. Configuración de ejemplo, si usa, digamos: PHP, CodeIgniter y 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"))))

¿Ha sido útil esta solución?