PHPおよびLaravelのためのNeovim

もしNeovimを使ってPHPやLaravelの開発を始めたい場合、このガイドが役立つでしょう。VSCodeを使用している場合は、この記事をチェックしてください。

この記事では、NeovimとLazyVimを使用します。LazyVimは、多くの機能とツールが標準で備わった素晴らしいNeovimのセットアップです。VimやNeovimの設定に思った以上に時間を費やしてしまいましたが、LazyVimを使えばそのほとんどの時間を省略できます。LazyVimの設定に慣れてきたら、自分専用の設定を一から作成することも考えてみてください。

この記事では、最新バージョンのNeovim(公開時点でv0.10.0)を使用していることを前提としています。まだインストールしていない場合は、OSに合わせてこちらから入手できます。

Neovimをインストールしたら、LazyVimを使用します。LazyVimを使いたくない場合は、自分の設定を使っても構いませんが、この記事ではその設定がもっと複雑になります。

LazyVimをインストールするには、リポジトリをクローンして、Neovimの設定フォルダー(MacOS/Linuxでは~/.config/nvim)に移動します。

git clone https://github.com/LazyVim/starter ~/.config/nvim

クローンした後は、.gitフォルダーを削除しても構いません。現在は必要ないため、設定変更のバージョン管理を行いたい場合に備えておくと良いでしょう。

rm -rf ~/.config/nvim/.git

それが終わったら、Neovimを実行し、LazyVimのためのすべてのプラグインと依存関係を引き出します

箱から出して、LazyVimは必要に応じてナビゲートするための素敵なメニューを提供します。

LazyVim は最近、PHPサポートを素早く追加するアップデートを追加しました。

メニューからPHPを検索するには、まずスラッシュを入力し、次にphpを入力します。/はNeovimの検索を開始します。

lang.php行にカーソルを置いたまま、xを押してエクストラを切り替えます。それからNeovimを再起動します。これで、NeovimがPHP構文をサポートし、Phpactor LSPをインストールします。

LSPをテストするために、Laravel Breezeで新しいLaravelプロジェクトを作成しました。プロジェクトディレクトリからNeovimを開き、<leader>ffを使ってProfileControllerを開きます。Neovimでは、多くのキーボード・コマンドの前に<leader>キーが付きますが、デフォルトではspaceに設定されています。ファイルを探すには、space + f + fとタイプする。

初めてコントローラをロードするとき、Phpactorはコードベースのインデックスを作成します。

また、多くのエラーやその他の診断も表示されます。

ベースコントローラーを変更したい場合は、Controllerに移動し、gdをクリックしてGoto Definitionに移動できます。

Goto Definitionの後、クラス定義に戻り、grをクリックしてControllerクラスのGoto Referencesに移動できます。次に、ctrl+oで前の場所にジャンプして戻ることができます。

Phpactorを使い続けることをためらわないでください。PhpactorはLaravelのマジックや足りない型と格闘していますが、完全にフリーでオープンソースです。

個人的には、Intelephense LSPを使用したほうが良い経験ができました。残念ながら、Intelephenseのプレミアム版を使わないとPhpactorのいくつかの機能が使えなくなります。

Intelephenseをセットアップするには、LazyVimの設定を変更する必要があります。~/.config/nvimフォルダでoptions.luaを開き、次の行を追加します:

vim.g.lazyvim_php_lsp = "intelephense"

LazyVimにIntelephenseの設定を指示します。ただし、Phpactorを削除する必要があるかもしれません。それを実現するために、<leader>cmと入力してMasonを開くことができます。Masonは、さまざまなフォーマッター、リンター、LSPをインストールするためのツールです。MasonメニューからPhpactorを見つけ、Xを使ってアンインストールしてください。

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に戻って未使用のインポートを追加し、インデントを乱すと、保存時にフォーマットがトリガーされます。

もう1つのオプションの変更として、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リンターを削除します。
    "mfussenegger/nvim-lint",
    optional = true,
    opts = {
      linters_by_ft = {
        php = {},
      },
    },
  },
}

これらの設定は、LazyVimのドキュメントから取得しています。

次にNeatestをセットアップして、Neovimからテストを実行できるようにする。:LazyExtrasと入力し、”test.core “を検索し、Xで切り替えることで追加できる。

次に、Neotest Pプラグインをインストールする必要がある。php.luaの設定に以下のブロックを追加します。

return {
  {
    ...
  },
  {
    -- PHPのテストを実行するためのneotest-pestプラグインを追加します。 
    -- 必要であれば、PHPUnit用のパッケージも用意されています。
    "nvim-neotest/neotest",
    dependencies = { "V13Axel/neotest-pest" },
    opts = { adapters = { "neotest-pest" } },
  }
}

テスト用の設定をした状態で、テストファイルをロードし、<leader>trで個々のテストを実行するか、<leader>ttでファイル全体を実行します。

<leader>toでテスト結果の要約を表示します。

Laravel Bladeのサポートを追加するのはもう少し複雑です。LazyVimには、ほとんどの言語のシンタックスハイライトをサポートするTreesitterがセットアップされています。

return {
  {
    ...
  },  
  {
    -- Bladeのシンタックスハイライトを提供するために、Laravel Blade用のTreesitterパーサーを追加します。
    "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,
  },
}

新しいファイルタイプを設定し、Bladeパーサーをプルダウンするために、デフォルトのTreesitter設定を拡張します。

Neovimを再起動したら、:TSInstall bladeを実行してパーサーをダウンロードします。

次に、より良いコードサポートのためにTreesitterクエリを追加する必要があります。

:TSEditQueryインジェクション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"))

:TSEditQuery highlights bladeとタイプし、:

(directive) @tag
(directive_start) @tag
(directive_end) @tag
(comment) @comment

:TSEditQuery folds bladeとタイプし、:

((directive_start) @start
    (directive_end) @end.after
    (#set! role block))


((bracket_start) @start
    (bracket_end) @end
    (#set! role block))

最後に、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ファイルのシンタックスハイライトが表示されるはずです!

より詳しい情報とインストール方法については、Blade Treesitterパーサーのrepoを参照してください。

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",
      "",
      "});"
    ]
  }
}

このファイルに他のスニペットを追加したり、他の言語のファイルを作成してスニペットを追加することができます。

このプラグインは、<leader>laを使用した素晴らしい検索機能でArtisanコマンドを素早く実行するために使用できます。または、<leader>lrを使用して、アプリケーション内のすべてのルートを一覧表示できます。

return { 
  {
    ...
  },
  {
    --Artisanコマンドを実行する機能を提供するLaravel.nvimプラグインを追加します
    --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 } },
    },
  },
}

return { 
  {
    ...
  },
  {
    --Bladeファイル用のGoto File機能
    --を提供するblade-nav.nvimプラグインを追加します。
    "ricardoramirezr/blade-nav.nvim",
    dependencies = {
      "hrsh7th/nvim-cmp",
    },
    ft = { "blade", "php" },
  },
}

LazyVimの1つの大きな利点は、ドキュメントです。VSCodeで慣れていて、Neovimでやりたいことがあれば、LazyVimにすでに組み込まれている可能性があります。

おそらく最も重要なセクションの一つはキーマップです。LazyVimはwhich-key.nvimを使ってエディタにいる間に設定されたキーキャップを覚えるのを助けてくれますが、完全なリストはこちらをクリックしてください。

Gitのサポートが必要ですか?LazyVimはLazyGitでそれをカバーしています。<leader>gg で開けます。lazygitを使ってコマンドラインから直接実行することもできます。

PHPStanやPsalmのような追加ツールが必要ですか?<leader>cmまたは:Masonを使ってMasonメニューを表示し、必要なものを検索してください。

上で述べたように、LazyVimは素晴らしいドキュメントを提供しており、それは間違いなく読む価値があります。

Jess ArcherはLaracastsでNeovimをセットアップするための素晴らしいコースを持っています。もしあなたがLaracastsに加入していないのであれば、お勧めしきれません。私は2017年から生涯ユーザーです。もし興味があれば、私の紹介リンクを使ってください。

DHH(Ruby on Railsの作成者)は、Ubuntu Linux上で開発環境をセットアップする迅速な方法としてOmakubパッケージを作成しました。Ubuntuを使っていなくても、Omakubのレポはチェックアウトする価値があります。LazyVimを使ったNeovimなど、いい設定やツールがたくさんあるからです。

LazyVimよりもう少しミニマルなものが欲しいなら、Kickstart.nvimがいいスタートです。TJ DeVriesによるビデオで始め方を見ることができます。LazyVim を使い続けたい場合でも、Neovim の設定についてより詳しく知るための素晴らしいリソースです。

Neovimを使い始めるきっかけになれば幸いです。Neovimは無限に設定可能な強力なエディタだ。

Neovimをメインのエディタとして使うつもりがなくても、キーバインドを学ぶことは有益だと思います。私は通常、NeovimとPhpStormの間で時間を分け、キーバインドをできるだけ同じに保つようにしています。幸いなことに、JetBrains IDEs用のIdeaVimプラグインはこれを簡単にしてくれます。

参考までに、この投稿で作成したすべてのファイルを含むレポを作成しました。

セットアップに関する他の質問や、私が見落としたかもしれない追加機能があれば教えてください。

読んでくださってありがとうございます!

Source:
https://seankegel.com/neovim-for-php-and-laravel