ProofGeneral/PG@99f91e873e -> ProofGeneral/PG@3a99da2755 agda/agda@fbf9d159c3 -> agda/agda@4f82f9b90a amake/flutter.el@004c91e070 -> amake/flutter.el@e71235d400 babashka/neil@a38be9f082 -> babashka/neil@6728367eff beancount/beancount-mode@71c1622246 -> beancount/beancount-mode@7b437abcf0 chachi/cuda-mode@7dd07a20c3 -> chachi/cuda-mode@c3dae31b3d clojure-emacs/cider@105da319b0 -> clojure-emacs/cider@8fdb53e8be dominikh/go-mode.el@636d36e37a -> dominikh/go-mode.el@602d73e226 emacs-geiser/geiser@b6b4ac070d -> emacs-geiser/geiser@97ce88463f emacs-geiser/guile@d5175439c0 -> emacs-geiser/guile@5a856c2982 emacs-gnuplot/gnuplot@7138b139d2 -> emacs-gnuplot/gnuplot@4c6b18f71f emacs-lsp/lsp-dart@1f52e81c93 -> emacs-lsp/lsp-dart@9ffbafb7dc emacs-lsp/lsp-haskell@18a7c7881f -> emacs-lsp/lsp-haskell@ba49fa9822 emacs-lsp/lsp-java@4909c14b90 -> emacs-lsp/lsp-java@868600bf7f emacs-lsp/lsp-metals@fa4072cbe7 -> emacs-lsp/lsp-metals@0dc938be11 emacs-lsp/lsp-sourcekit@bb2b7e0278 -> emacs-lsp/lsp-sourcekit@63ff1ab638 emacs-lsp/lsp-treemacs@1d43e9e030 -> emacs-lsp/lsp-treemacs@fb1a07ae0a emacs-straight/adaptive-wrap@f5bc153273 -> emacs-straight/adaptive-wrap@d75665b9c8 emacs-straight/auctex@451b0f08b0 -> emacs-straight/auctex@08881d08ce emacs-straight/csv-mode@cdb73a771b -> emacs-straight/csv-mode@6979fc18eb emacs-straight/org-mode@f398724bd5 -> emacs-straight/org-mode@6a5d0ed342 emacs-straight/rainbow-mode@0740f31f30 -> emacs-straight/rainbow-mode@2e6b18609c emacs-straight/sml-mode@d114e5a27f -> emacs-straight/sml-mode@021233f60a emacsmirror/paredit@9a2c4b37fc -> emacsmirror/paredit@037b9b8acb ericdallo/jet.el@7d5157aac6 -> ericdallo/jet.el@c9a92675ef erlang/otp@2a64588d4a -> erlang/otp@c66bf53cde factor/factor@d143007778 -> factor/factor@31dc1a386b fosskers/sly-overlay@4c6135c260 -> fosskers/sly-overlay@d629450590 fxbois/web-mode@005aa62d6f -> fxbois/web-mode@0c83581d1e gcv/julia-snail@f7784c5007 -> gcv/julia-snail@dff92c4250 greghendershott/racket-mode@40ecb87f40 -> greghendershott/racket-mode@dba66c4536 hhvm/hack-mode@ccf20511f0 -> hhvm/hack-mode@343e45f2a6 https://repo.or.cz/org-contacts.git@d0cb221502c9 -> https://repo.or.cz/org-contacts.git@f0a430442b2a hvesalai/emacs-scala-mode@4c6d636b86 -> hvesalai/emacs-scala-mode@bd0638c32a idris-hackers/idris-mode@38dd2380dc -> idris-hackers/idris-mode@09de86a8f0 ifitzpatrick/graphql-doc.el@d37140267e -> ifitzpatrick/graphql-doc.el@17755a2466 jart/disaster@16bba9afb9 -> jart/disaster@b20f8e1ef9 joaotavora/sly@ba40c8f054 -> joaotavora/sly@742355f755 jorgenschaefer/emacs-buttercup@a1a86b027f -> jorgenschaefer/emacs-buttercup@bf01a33f8b jrblevin/markdown-mode@8aab017f47 -> jrblevin/markdown-mode@6102ac5b73 jschaf/powershell.el@f2da15857e -> jschaf/powershell.el@38727f1cda jwiegley/emacs-async@f317b0c9c3 -> jwiegley/emacs-async@43f97d7e68 ledger/ledger-mode@b0e65f74a5 -> ledger/ledger-mode@a6be7a2d79 nonsequitur/inf-ruby@0cfe8b2fb1 -> nonsequitur/inf-ruby@b234625c85 ocaml/dune@96ed5fb42f -> ocaml/dune@a7924e322e ocaml/merlin@9fa77dbe81 -> ocaml/merlin@e016abfac6 oer/org-re-reveal@dbd8ffb3e5 -> oer/org-re-reveal@91610ba9b0 org-noter/org-noter@68646b685a -> org-noter/org-noter@6f292d7f1e org-roam/org-roam@8667e44187 -> org-roam/org-roam@0b9fcbc97b rust-lang/rust-mode@a529a45181 -> rust-lang/rust-mode@c87f6f82bd seagle0128/grip-mode@7c42b8f61d -> seagle0128/grip-mode@9adac9c989 technomancy/fennel-mode@a4ddd1750f -> technomancy/fennel-mode@f4bd34e1c3 From this point on, Org will be pinned to tagged releases.
:lang php
Description unfold
This module adds support for PHP 5.3+ (including PHP8) to Doom Emacs.
- ctags-based code completion (
company-php
andphpctags
) - eldoc support (
ac-php
andphp-extras
) - REPL (
psysh
) - Code refactoring commands (
php-refactor-mode
) - Unit-test commands (
phpunit
) - Support for
laravel
andcomposer
projects (with project-specific snippets) - LSP support (via the doom-module:+lsp flag)
- File templates
- Snippets
PHP was the first programming language I got paid to code in, back in the Cretaceous period (2003). My sincerest apologies go out to all the programmers who inherited my earliest PHP work. I know you're out there, writhing in your straitjackets.
Maintainers
Module flags
- +hack
- Add support for the Hack dialect of PHP by Facebook.
- +lsp
-
Enable LSP support for
php-mode
. Requires doom-module::tools lsp and a langserver (supports phpactor, intelephense, serenata, php-language-server). - +tree-sitter
- Leverages tree-sitter for better syntax highlighting and structural text editing. Requires doom-module::tools tree-sitter.
Packages
Hacks
No hacks documented for this module.
TODO Changelog
This module does not have a changelog yet.
Installation
Enable this module in your doom!
block.
This module requires php
(5.3+) and composer
.
If doom-module:+lsp is enabled, you'll also need one of these LSP servers:
- Phpactor requires
php
7.3+. - Intelephense requires
node
andnpm
.
PHP
MacOS
PHP 5.5 comes prepackaged with newer versions of MacOS. These instructions are provided for reference:
brew tap homebrew/homebrew-php
brew install php@8.0 # or php53, php54, php55
brew install composer
# If you use intelephense:
brew install node
brew install npm
Arch Linux
sudo pacman --needed --noconfirm -S php composer # or php53, php54, php55
# If you use intelephense:
sudo pacman -S nodejs npm
openSUSE
sudo zypper install php-composer
# If you use intelephense:
sudo zypper install nodejs npm
Debian
sudo apt-get install php php-common
# If you use intelephense:
sudo apt-get install nodejs npm
LSP Support
There are a number of currently supported LSP servers:
- Intelephense (Recommended)
- phpactor
- Serenata
- felixbecker (Considered unsupported)
Intelephense is currently the only server that supports automatic installation,
which will trigger either when you open a PHP project or manually invoke
lsp-install-server
through M-x.
The others have to be installed manually and added to your $PATH
.
Dependencies
pysh
(REPL)phpctags
(better code completion)phpunit
(unit test commands)phpcbf
, provided bysquizlabs/php_codesniffer
(for code formatting)phpactor
(for LSP if intelephense isn't desired)
composer global require \
psy/psysh \
phpunit/phpunit \
techlivezheng/phpctags \
squizlabs/php_codesniffer \
phpactor/phpactor
You must ensure that $HOME/.composer/vendor/bin
is in $PATH
, so these
executables are visible to Emacs:
# place this in your profile file, like ~/.bash_profile or ~/.zshenv
export PATH="~/.composer/vendor/bin:$PATH"
You may also need to regenerate your envvar file by running $ doom env
on the
command line.
NOTE phpactor doesn't have to be installed via composer
, just has to exist in
your $PATH
.
NOTE Phpactor cannot be installed, globally at least, with PHP ^8.
TODO Usage
This module's usage documentation is incomplete. Complete it?
PHPUnit
This module provides an interface to PHPUnit through a number of commands as
detailed below. By default, it loads configuration from the root phpunit.xml
.
phpunit-current-project
Launch all tests for the projectphpunit-current-class
Launch all tests for the current class/fixturephpunit-current-test
Launch the current test at point
If for some reason, the default phpunit.xml
is in a different location (or you
use the phpunit.xml.dist
convention) , the path can be changed via
phpunit-configuration-file
(setq phpunit-configuration-file "phpunit.xml")
Composer
This module provides several convenience methods for triggering composer commands:
Binding | Function |
---|---|
<localleader> m c c | composer |
<localleader> m c i | composer-install |
<localleader> m c r | composer-require |
<localleader> m c u | composer-update |
<localleader> m c d | composer-dump-autoload |
<localleader> m c s | composer-run-scripts |
<localleader> m c v | composer-run-vendor-bin-command |
<localleader> m c o | composer-find-json-file |
<localleader> m c l | composer-view-lock-file |
These are all run via M-x too.
TODO Configuration
This module's configuration documentation is incomplete. Complete it?
Docker Compose
A lot of projects rely on running inside docker compose (ie Laravel), and as
such a minor mode has been configured to attempt to run tests inside the php-fpm
(by default) container.
This mode is disabled by default, to opt-in set +php-run-tests-in-docker
to t
in
your config. If this is done during Emacs running, you will also have to reload
php-mode
(i.e. through M-x php-mode
)
If you wish to specify a different container, modify the
+php-default-docker-container
variable (ideally inside a .dir-locals.el
file)
((php-mode . ((+php-default-docker-container . "php-octane"))))
Troubleshooting
"I'm missing functionality on lsp-mode"
Unfortunately, intelephense currently operates under a "freemium" model, and as such requires a license for extended features. Once purchased, this can be (insecurely) added directly to your config:
(setq lsp-intelephense-licence-key "<key>")
A more recommended approach would be to utilise Emacs' own auth-sources
for
storing authentication info, which can also be encrypted.
Create a file in your home directory (which can optionally be encrypted, verify
your auth-sources
has the correct values) called ~/.authinfo
:
machine * login intelephense password <key>
And add the following to your config:
(defun my-fetch-password (&rest params)
(require 'auth-source)
(let ((match (car (apply #'auth-source-search params))))
(if match
(let ((secret (plist-get match :secret)))
(if (functionp secret)
(funcall secret)
secret))
(error "Password not found for %S" params))))
(setq lsp-intelephense-licence-key (my-fetch-password :user intelephense))
Frequently asked questions
This module has no FAQs yet. Ask one?
TODO Appendix
This module has no appendix yet. Write one?