diff --git a/docs/manual/languages.adoc b/docs/manual/languages.adoc index 4b97aea..8a981dc 100644 --- a/docs/manual/languages.adoc +++ b/docs/manual/languages.adoc @@ -16,6 +16,7 @@ Language specific support means there is a combination of language specific plug * Dart: <> * Go: <> * Lua: <> +* PHP: <> Adding support for more languages, and improving support for existing ones are great places where you can contribute with a PR. diff --git a/docs/release-notes/rl-0.5.adoc b/docs/release-notes/rl-0.5.adoc index 6c38c3c..2d02973 100644 --- a/docs/release-notes/rl-0.5.adoc +++ b/docs/release-notes/rl-0.5.adoc @@ -5,6 +5,11 @@ [[sec-release-0.5-changelog]] === Changelog +https://github.com/vagahbond[vagahbond]: +* Added phan language server for PHP. + +* Added phpactor language server for PHP. + https://github.com/horriblename[horriblename]: * Added transparency support for tokyonight theme. diff --git a/modules/languages/default.nix b/modules/languages/default.nix index e2d5b05..f7e16c6 100644 --- a/modules/languages/default.nix +++ b/modules/languages/default.nix @@ -25,6 +25,7 @@ in { ./svelte.nix ./java.nix ./lua.nix + ./php.nix ]; options.vim.languages = { diff --git a/modules/languages/php.nix b/modules/languages/php.nix new file mode 100644 index 0000000..4346e67 --- /dev/null +++ b/modules/languages/php.nix @@ -0,0 +1,100 @@ +{ + pkgs, + config, + lib, + ... +}: +with lib; +with builtins; let + cfg = config.vim.languages.php; + + defaultServer = "phpactor"; + servers = { + phpactor = { + package = pkgs.phpactor; + lspConfig = '' + lspconfig.phpactor.setup{ + capabilities = capabilities, + on_attach = default_on_attach, + cmd = ${ + if isList cfg.lsp.package + then nvim.lua.expToLua cfg.lsp.package + else '' + { + "${getExe cfg.lsp.package}", + "language-server" + }, + '' + } + } + ''; + }; + + phan = { + package = pkgs.php81Packages.phan; + lspConfig = '' + lspconfig.phan.setup{ + capabilities = capabilities, + on_attach = default_on_attach, + cmd = ${ + if isList cfg.lsp.package + then nvim.lua.expToLua cfg.lsp.package + else '' + { + "${getExe cfg.lsp.package}", + "-m", + "json", + "--no-color", + "--no-progress-bar", + "-x", + "-u", + "-S", + "--language-server-on-stdin", + "--allow-polyfill-parser" + }, + '' + } + } + ''; + }; + }; +in { + options.vim.languages.php = { + enable = mkEnableOption "PHP language support"; + + treesitter = { + enable = mkEnableOption "Enable PHP treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = nvim.types.mkGrammarOption pkgs "php"; + }; + + lsp = { + enable = mkEnableOption "PHP LSP support" // {default = config.vim.languages.enableLSP;}; + + server = mkOption { + description = "PHP LSP server to use"; + type = with types; enum (attrNames servers); + default = defaultServer; + }; + + package = mkOption { + description = "PHP LSP server package, or the command to run as a list of strings"; + example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]''; + type = with types; either package (listOf str); + default = servers.${cfg.lsp.server}.package; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; + }) + (mkIf cfg.lsp.enable { + vim.lsp.lspconfig = { + enable = true; + sources.php-lsp = servers.${cfg.lsp.server}.lspConfig; + }; + }) + ]); +}