Если вы когда-либо хотели использовать Neovim для разработки PHP и Laravel, это руководство должно помочь вам начать. Если вы используете VSCode, то обратите внимание на этот пост.
В этом посте я буду использовать Neovim с LazyVim. LazyVim – это фантастическая установка Neovim с множеством функций и инструментов из коробки. Я потратил больше времени, чем хотел бы признать, на настройку Vim и Neovim. LazyVim сокращает почти все это время. Как только вы начнете чувствовать себя комфортно при настройке LazyVim, вы можете подумать о создании собственной конфигурации с нуля.
Установка
Этот пост предполагает, что вы используете последнюю версию Neovim (v0.10.0 на момент публикации). Если вам нужно установить его, вы можете скачать его для своей ОС здесь.
После установки Neovim мы будем использовать LazyVim. Вы можете использовать свою конфигурацию, если не хотите использовать LazyVim, но эта настройка намного сложнее для этого поста.
Чтобы установить LazyVim, вам нужно клонировать репозиторий и переместить его в папку конфигурации Neovim, (~/.config/nvim
на MacOS/Linux).
git clone https://github.com/LazyVim/starter ~/.config/nvim
После клонирования вы можете удалить папку .git
, поскольку сейчас она вам не нужна, и вы можете захотеть контролировать изменения конфигурации.
rm -rf ~/.config/nvim/.git
Если вы используете Windows, вы можете следовать инструкциям по установке здесь.
После этого вы можете запустить Neovim, и он извлечет все плагины и зависимости для LazyVim
Из коробки LazyVim предоставляет приятное меню для навигации по мере необходимости.
LazyVim PHP Extras
LazyVim недавно добавил обновление для быстрого добавления поддержки PHP. Чтобы попасть в меню дополнительных возможностей, достаточно нажать x
на главном экране или набрать :LazyExtras
.
В меню можно искать PHP, набрав сначала слэш, затем php
, таким образом /php
. С /
начинается поиск в Neovim.
Подведя курсор к строке lang.php
, нажмите x
, чтобы переключить дополнительные параметры. Затем перезапустите Neovim. Теперь Neovim будет поддерживать синтаксис PHP и установит Phpactor LSP.
Чтобы проверить LSP, я создал новый проект Laravel с помощью Laravel Breeze. Из директории проекта откройте Neovim и откройте ProfileController
с помощью <leader>ff
. В Neovim многие клавиатурные команды имеют префикс с клавишей <leader>
, которая по умолчанию установлена на пробел
. Поэтому, чтобы найти файл, наберите space + f + f
. Затем вы можете просто искать с помощью нечеткого искателя.
При первой загрузке контроллера Phpactor начнет индексировать вашу кодовую базу, обычно с корня Git проекта.
Вы также увидите множество ошибок и других диагностик. Они предоставляются LSP вместе с завершением кода, переходом к определению, рефакторингом и многими другими функциями.
Если вы хотите изменить базовый контроллер, вы можете перейти к Controller
и нажать gd
для Goto Definition.
После Goto Definition вы можете вернуться вниз к определению класса и нажать gr
для Goto References для класса Controller
. Затем вы можете использовать ctrl+o
, чтобы вернуться к предыдущим местам.
Пожалуйста, не стесняйтесь продолжать использовать Phpactor, если он вам подходит. Он борется с некоторыми магическими и недостающими типами в Laravel, но он полностью бесплатный и с открытым исходным кодом. Вы можете улучшить ситуацию, используя что-то вроде Laravel IDE Helper, который генерирует заглушки для моделей, фасадов и других функций фреймворка для лучшего автодополнения.
Лично у меня был лучший опыт использования Intelephense LSP, с которым вы, вероятно, знакомы, если вы пришли из VSCode. К сожалению, без премиум-версии Intelephense вы лишаетесь некоторых возможностей Phpactor, поэтому я рекомендую приобрести его, если вы используете Intelephense. Одна лицензия работает с VSCode, Neovim и любыми другими редакторами, поддерживающими LSP.
Чтобы установить Intelephense, вам нужно изменить конфигурацию LazyVim. В папке ~/.config/nvim
откройте options.lua
и добавьте следующую строку:
vim.g.lazyvim_php_lsp = "intelephense"
Это указывает LazyVim на установку Intelephense. Однако вам может понадобиться удалить Phpactor. Чтобы сделать это, вы можете набрать <leader>cm
, который откроет Mason. Mason – это инструмент для установки различных форматеров, линтеров и LSP. В меню Mason найдите Phpactor и удалите его с помощью X
.
Настройка форматирования Laravel Pint
После установки Lazy Extras for PHP, Laravel Pint и PHP-CS-Fixer были установлены. Однако PHP-CS-Fixer установлен по умолчанию. Чтобы изменить это, мы можем создать новый файл в конфигурации Neovim: ~/.config/nvim/lua/plugins/php.lua
. Вы можете назвать этот файл как угодно, но в этом посте мы будем использовать его для всех наших настроек, связанных с PHP/Laravel.
В этот файл можно включить следующее:
return {
{
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
}
Это делает Pint форматером по умолчанию, и он будет возвращаться к PHP-CS-Fixer, если не будет найден. С этим изменением я могу вернуться к ProfileController
и добавить неиспользуемый импорт, испортить отступы, а сохранение вызовет форматирование.
Еще одно необязательное изменение, которое вы можете сделать, это удалить phpcs, если вы его не используете. В файле php.lua
просто добавьте еще один блок, подобный следующему:
return {
{
-- Установите Laravel Pint в качестве PHP-форматера по умолчанию с PHP CS Fixer в качестве запасного варианта.
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
{
-- Удалите phpcs linter.
"mfussenegger/nvim-lint",
optional = true,
opts = {
linters_by_ft = {
php = {},
},
},
},
}
Я взял эти конфигурации прямо из LazyVim docs.
Тестирование
Далее мы настроим Neatest, чтобы можно было запускать тесты прямо в Neovim. Это еще одно дополнение LazyVim, которое можно добавить, набрав :LazyExtras
, затем найти “test.core” и переключить с помощью X
.
Затем нам нужно установить плагин Neotest Pest. Добавьте следующий блок в конфигурацию php.lua
.
return {
{
...
},
{
-- Добавьте плагин neotest-pest для запуска PHP-тестов.
-- При необходимости доступен пакет и для PHPUnit.
"nvim-neotest/neotest",
dependencies = { "V13Axel/neotest-pest" },
opts = { adapters = { "neotest-pest" } },
}
}
После установки конфигурации тестирования загрузите тестовый файл, и вы можете запускать отдельные тесты с помощью <leader>tr
или весь файл с помощью <leader>tt
.
Используйте <leader>to
, чтобы переключить сводку результатов тестирования.
Синтаксис Blade
Добавление поддержки Laravel Blade немного сложнее. В LazyVim есть Treesitter, поддерживающий подсветку синтаксиса для большинства языков. Однако Blade не установлен по умолчанию, поэтому нам нужно добавить его.
return {
{
...
},
{
-- Добавьте парсер Treesitter для Laravel Blade, чтобы обеспечить подсветку синтаксиса Blade.
"nvim-treesitter/nvim-treesitter",
opts = function(_, opts)
vim.list_extend(opts.ensure_installed, {
"blade",
"php_only",
})
end,
config = function(_, opts)
vim.filetype.add({
pattern = {
[".*%.blade%.php"] = "blade",
},
})
require("nvim-treesitter.configs").setup(opts)
local parser_config = require("nvim-treesitter.parsers").get_parser_configs()
parser_config.blade = {
install_info = {
url = "https://github.com/EmranMR/tree-sitter-blade",
files = { "src/parser.c" },
branch = "main",
},
filetype = "blade",
}
end,
},
}
Мы расширяем стандартный конфиг Treesitter, чтобы установить новый тип файла и вытащить парсер Blade.
После перезапуска Neovim вы можете запустить :TSInstall blade
для загрузки парсера.
Далее нам нужно добавить несколько запросов Treesitter для лучшей поддержки кода. Для этого нам нужно создать несколько новых файлов в Neovim.
Blade Injections
Тип :TSEditQuery injections blade
и добавить следующее содержимое:
((text) @injection.content
(#not-has-ancestor? @injection.content "envoy")
(#set! injection.combined)
(#set! injection.language php))
; tree-sitter-comment injection
; if available
((comment) @injection.content
(#set! injection.language "comment"))
; could be bash or zsh
; or whatever tree-sitter grammar you have.
((text) @injection.content
(#has-ancestor? @injection.content "envoy")
(#set! injection.combined)
(#set! injection.language bash))
((php_only) @injection.content
(#set! injection.language php_only))
((parameter) @injection.content
(#set! injection.include-children) ; You may need this, depending on your editor e.g Helix
(#set! injection.language "php-only"))
Blade Highlights
Введите :TSEditQuery highlights blade
и добавьте:
(directive) @tag
(directive_start) @tag
(directive_end) @tag
(comment) @comment
Blade Folds
Введите :TSEditQuery folds blade
и добавьте:
((directive_start) @start
(directive_end) @end.after
(#set! role block))
((bracket_start) @start
(bracket_end) @end
(#set! role block))
HTML Injections
И наконец, мы добавим несколько запросов-инъекций для поддержки Alpine. Введите :TSEditQuery
и добавьте:
;; extends
; AlpineJS attributes
(attribute
(attribute_name) @_attr
(#lua-match? @_attr "^x%-%l")
(quoted_attribute_value
(attribute_value) @injection.content)
(#set! injection.language "javascript"))
; Blade escaped JS attributes
; <x-foo ::bar="baz" />
(element
(_
(tag_name) @_tag
(#lua-match? @_tag "^x%-%l")
(attribute
(attribute_name) @_attr
(#lua-match? @_attr "^::%l")
(quoted_attribute_value
(attribute_value) @injection.content)
(#set! injection.language "javascript"))))
; Blade PHP attributes
; <x-foo :bar="$baz" />
(element
(_
(tag_name) @_tag
(#lua-match? @_tag "^x%-%l")
(attribute
(attribute_name) @_attr
(#lua-match? @_attr "^:%l")
(quoted_attribute_value
(attribute_value) @injection.content)
(#set! injection.language "php_only"))))
Теперь, после добавления всего, сохранения и перезапуска, у вас должна появиться подсветка синтаксиса для файлов Blade!
Для получения дополнительной информации и инструкций по установке посетите repo для парсера Blade Treesitter.
Snippets
LazyVim поставляется с плагином для легкого создания сниппетов. Чтобы создать PHP сниппеты, вы можете создать новый файл: ~/.config/nvim/snippets/php.json
, как показано ниже:
{
"strict types": {
"prefix": "strict",
"description": "Add strict types declaration",
"body": [
"declare(strict_types=1);"
]
},
"inv": {
"prefix": "inv",
"description": "Create PHP __invoke method",
"body": [
"public function __invoke(${1}): ${2:void}",
"{",
" ${3}",
"}",
""
]
},
"public method": {
"prefix": "pubf",
"description": "Create a public method",
"body": [
"public function ${1}(${2}): ${3:void}",
"{",
" ${0}",
"}",
""
]
},
"protected method": {
"prefix": "prof",
"description": "Create a protected method",
"body": [
"protected function ${1}(${2}): ${3:void}",
"{",
" ${0}",
"}",
""
]
},
"private method": {
"prefix": "prif",
"description": "Create a private method",
"body": [
"private function ${1}(${2}): ${3:void}",
"{",
" ${0}",
"}",
""
]
},
"public static method": {
"prefix": "pubsf",
"description": "Create a public static method",
"body": [
"public static function ${1}(${2}): ${3:void}",
"{",
" ${0}",
"}",
""
]
},
"pest test (it) method": {
"prefix": "it",
"description": "Create a pest test",
"body": [
"it('${1}', function () {",
" // Arrange",
" ${0}",
"",
" // Act",
"",
" // Assert",
"",
"});"
]
}
}
Вы можете добавить в этот файл любые другие сниппеты, которые вам нужны, или создать файлы для других языков, чтобы добавить сниппеты.
Дополнительные плагины
Laravel.nvim
Этот плагин можно использовать для быстрого запуска команд Artisan с отличной функцией поиска с помощью <leader>la
. Или вы можете перечислить все маршруты в вашем приложении, используя <leader>lr
.
return {
{
...
},
{
-- Добавьте плагин Laravel.nvim, который дает возможность запускать команды Artisan
-- из Neovim.
"adalessa/laravel.nvim",
dependencies = {
"nvim-telescope/telescope.nvim",
"tpope/vim-dotenv",
"MunifTanjim/nui.nvim",
"nvimtools/none-ls.nvim",
},
cmd = { "Sail", "Artisan", "Composer", "Npm", "Yarn", "Laravel" },
keys = {
{ "la", ":Laravel artisan" },
{ "lr", ":Laravel routes" },
{ "lm", ":Laravel related" },
},
event = { "VeryLazy" },
config = true,
opts = {
lsp_server = "intelephense",
features = { null_ls = { enable = false } },
},
},
}
Blade-Nav.nvim.
Добавляет возможность использовать Goto File в представлениях Blade для перехода к компонентам и другим представлениям с помощью gf
.
return {
{
...
},
{
-- Добавляет плагин blade-nav.nvim, который предоставляет возможности Goto File
-- для файлов Blade.
"ricardoramirezr/blade-nav.nvim",
dependencies = {
"hrsh7th/nvim-cmp",
},
ft = { "blade", "php" },
},
}
Дополнительные советы
Одним из огромных преимуществ LazyVim является документация. Если вы привыкли что-то делать в VSCode и хотите это сделать в Neovim, есть шанс, что в LazyVim это уже встроено. Я рекомендую просто пройтись по каждому разделу LazyVim, чтобы узнать о нем больше.
Вероятно, один из самых важных разделов – это карты клавиш. LazyVim использует файл which-key.nvim, чтобы помочь вам запомнить настроенные сочетания клавиш, пока вы находитесь в редакторе, но для получения полного списка нажмите здесь.
Вам нужна поддержка Git? В LazyVim для этого есть LazyGit, который является действительно хорошим терминальным UI для Git. Используйте <leader>gg
, чтобы открыть его. Вы даже можете установить LazyGit напрямую, используя что-то вроде Homebrew, чтобы просто запустить его прямо в командной строке, используя lazygit
.
Нужны дополнительные инструменты, такие как PHPStan или Psalm? Используйте <leader>cm
или :Mason
, чтобы вызвать меню Mason и найти то, что вам нужно. В нем есть популярные линеры и форматтеры, которые можно установить.
Дополнительные ресурсы
LazyVim Docs
Как я уже говорил выше, LazyVim предоставляет потрясающую документацию, и ее определенно стоит прочитать.
Neovim как IDE для PHP и JavaScript
Джесс Арчер проводит фантастический курс по настройке Neovim на Laracasts. Если вы еще не подписаны на Laracasts, я не могу не порекомендовать вам это. Я являюсь пожизненным пользователем с 2017 года. Если вас это заинтересовало, воспользуйтесь моей реферальной ссылкой.
Omakub
DHH (создатель Ruby on Rails) создал пакет Omakub как быстрый способ установить среду разработки на Ubuntu Linux. Даже если вы не используете Ubuntu, репо для Omakub стоит посмотреть, так как в нем есть много хороших конфигураций и инструментов, один из которых – Neovim с LazyVim.
Kickstart.nvim
Если вам нужно что-то более минимальное, чем LazyVim, то Kickstart.nvim – это хорошее начало. Вы можете посмотреть это видео от TJ DeVries о том, как начать работу. Даже если вы хотите продолжать использовать LazyVim, это все равно отличный ресурс, чтобы узнать больше о настройке Neovim.
Summary
Надеюсь, это поможет вам начать путешествие по Neovim. Это мощный редактор, который можно бесконечно настраивать. Хотя он и не такой мощный, как PhpStorm, но он может сделать вас довольно близким к нему бесплатно и требует меньше ресурсов процессора.
Даже если вы не планируете использовать Neovim в качестве основного редактора, я думаю, что изучение привязок клавиш все равно будет полезным. Я обычно делю свое время между Neovim и PhpStorm и стараюсь, чтобы мои связки клавиш были как можно более похожими. К счастью, плагин IdeaVim для IDEs JetBrains упрощает эту задачу.
Для справки я создал repo со всеми файлами, которые мы создали в этом посте.
Пожалуйста, дайте мне знать, если у вас есть другие вопросы по настройке или дополнительные возможности, которые я мог упустить.
Спасибо за чтение!