네오빔 for PHP 및 라라벨

PHP와 라라벨 개발에 Neovim을 사용하고 싶었다면 이 가이드가 도움이 될 것입니다. VSCode를 사용하는 경우 이 post를 확인하세요.

이 글에서는 LazyVim과 함께 Neovim을 사용하겠습니다. LazyVim은 기본적으로 많은 기능과 도구를 갖춘 환상적인 Neovim 설정입니다. 저는 Vim과 Neovim을 구성하는 데 인정하고 싶은 것보다 더 많은 시간을 보냈습니다. LazyVim은 그 시간을 거의 모두 줄여줍니다. LazyVim 구성에 익숙해지기 시작하면 처음부터 직접 구성을 만드는 것도 고려해 볼 수 있습니다.

이 게시물은 최신 버전의 Neovim(게시 시점 기준 v0.10.0)을 사용한다고 가정합니다. 설치가 필요한 경우 여기에서 OS에 맞게 다운로드할 수 있습니다.

네오빔을 설치한 후에는 LazyVim을 사용하겠습니다. LazyVim을 사용하지 않으려면 설정을 그대로 사용해도 되지만, 이 글에서는 설정이 훨씬 더 복잡합니다.

러지빔을 설치하려면 리포지토리를 복제하여 Neovim 구성 폴더(~/)로 이동해야 합니다.config/nvim).

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

복제가 완료되면 지금은 필요하지 않고 구성 변경 사항을 버전 관리하고 싶을 수 있으므로 .git 폴더를 제거할 수 있습니다.

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

Windows를 사용하는 경우 설치 지침을 따를 수 있습니다 여기.

이 작업이 완료되면 Neovim을 실행하면 LazyVim의 모든 플러그인과 종속성을 끌어내립니다

기본적으로 LazyVim은 필요에 따라 탐색할 수 있는 멋진 메뉴를 제공합니다.

레이지빔은 최근 PHP 지원을 빠르게 추가하는 업데이트를 추가했습니다. 홈 화면에서 x를 클릭하여 엑스트라 메뉴로 이동하거나 :LazyExtras를 입력하기만 하면 됩니다.

메뉴에서 먼저 슬래시를 입력한 다음 php, 즉 /php를 입력하면 PHP를 검색할 수 있습니다. <코드>/는 Neovim에서 검색을 시작합니다.

<코드>lang.php 줄에 커서를 놓고 <코드>x를 눌러 추가를 토글합니다. 그런 다음 Neovim을 다시 시작합니다. 이제 Neovim이 PHP 구문을 지원하고 Phpactor LSP를 설치합니다.

LSP를 테스트하기 위해 Laravel Breeze로 새 Laravel 프로젝트를 만들었습니다. 프로젝트 디렉토리에서 Neovim을 열고 <코드><leader<ff를 사용하여 <코드>ProfileController를 엽니다. Neovim에서는 많은 키보드 명령 앞에 <leader 키가 접두사로 붙는데, 이 키는 기본적으로 스페이스로 설정되어 있습니다. 따라서 파일을 찾으려면 <코드>스페이스 + f + f를 입력합니다. 그런 다음 퍼지 파인더를 사용하여 검색할 수 있습니다.

컨트롤러를 처음 로드할 때 Phpactor는 일반적으로 프로젝트의 Git 루트에서 코드베이스 색인화를 시작합니다.

또한 많은 오류 및 기타 진단을 볼 수 있습니다. 이러한 기능은 코드 완성, 정의로 이동, 리팩토링 및 기타 여러 기능과 함께 LSP에서 제공합니다.

기본 컨트롤러를 수정하려면 Controller로 이동하여 gd를 클릭하여 정의로 이동합니다.

정의로 이동 후 클래스 정의로 돌아가서 gr를 클릭하여 Controller 클래스에 대한 참조로 이동할 수 있습니다. 다음으로 ctrl+o를 사용하여 이전 위치로 돌아갈 수 있습니다.

프팩터가 잘 작동한다면 주저하지 마시고 계속 사용하시기 바랍니다. 라라벨의 일부 마법과 누락된 유형으로 인해 어려움을 겪고 있지만 완전히 무료이며 오픈 소스입니다. 모델, 파사드 및 기타 프레임워크 기능에 대한 스텁을 생성하여 더 나은 자동 완성을 제공하는 Laravel IDE Helper와 같은 것을 사용하여 이 문제를 개선할 수 있습니다.

개인적으로는 VSCode 출신이라면 익숙한 Intelephense LSP를 사용한 경험이 더 좋았었습니다. 안타깝게도 인텔리펜스 프리미엄 버전이 없으면 Phpactor의 일부 기능을 사용할 수 없으므로 인텔리펜스를 사용한다면 구매를 권장합니다. 단일 라이선스로 VSCode, Neovim 및 LSP를 지원하는 다른 모든 편집기에서 작동합니다.

Intephense를 설정하려면 LazyVim 구성을 수정해야 합니다. <코드>~/.config/nvim 폴더에서 <코드>옵션.lua를 열고 다음 줄을 추가합니다:

vim.g.lazyvim_php_lsp = "intelephense"

이렇게 하면 LazyVim이 인텔펜스를 설정합니다. 하지만 Phpactor를 제거해야 할 수도 있습니다. 이를 위해 <코드>&’;리더&’;cm를 입력하면 Mason이 열립니다. 메이슨은 다양한 포맷터, 린터, LSP를 설치하기 위한 도구입니다. 메이슨 메뉴에서 Phpactor를 찾아 <코드>X로 제거합니다.

레이지 엑스트라 포 PHP를 설치했으므로 라라벨 핀트와 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 문서에서 바로 가져왔습니다.

다음으로 네오빔에서 바로 테스트를 실행할 수 있도록 Neatest를 설정하겠습니다. 이것은 :LazyExtras를 입력한 다음 “test.core”를 검색하고 X로 토글하여 추가할 수 있는 또 다른 LazyVim 추가 기능입니다.

그런 다음 Neotest Pest 플러그인을 설치해야 합니다. php.lua 구성에 다음 블록을 추가합니다.

return {
  {
    ...
  },
  {
    -- PHP 테스트 실행을 위한 neotest-pest 플러그인 추가.
    -- 필요한 경우 PHPUnit용 패키지도 사용할 수 있습니다.
    "nvim-neotest/neotest",
    dependencies = { "V13Axel/neotest-pest" },
    opts = { adapters = { "neotest-pest" } },
  }
}

테스트 구성이 완료되면 테스트 파일을 로드하고, <leader<tr로 개별 테스트를 실행하거나 <leader<tt로 전체 파일을 실행할 수 있습니다.

테스트 결과 요약을 토글하려면 <leader<to를 사용합니다.

라 라벨 블레이드 지원 추가는 조금 더 복잡합니다. LazyVim에는 대부분의 언어에 대해 구문 강조 표시를 지원하도록 트리시터가 설정되어 있습니다. 그러나 Blade는 기본적으로 설치되어 있지 않으므로 추가해야 합니다.

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 구성을 확장합니다.

네오빔을 다시 시작하면 :TSInstall blade를 실행하여 파서를 다운로드할 수 있습니다.

다음으로 코드 지원을 개선하기 위해 몇 가지 Treesitter 쿼리를 추가해야 합니다. 이를 위해 Neovim 내에서 몇 가지 새 파일을 만들어야 합니다.

:TSEditQuery 인젝션 블레이드를 입력하고 다음 내용을 추가합니다.

((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가 블레이드를 강조 표시합니다를 입력하고 추가:

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

:TSEditQuery가 블레이드를 접습니다를 입력하고 추가:

((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 트리시터 파서에 대한 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 { 
  {
    ...
  },
  {
    -- Neovim에서 Artisan 명령을 실행하는 기능을 제공하는 Laravel.nvim 플러그인 추가
    -- 
    "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 보기에서 gf를 사용하여 컴포넌트 및 기타 보기로 이동하기 위해 Goto File을 사용하는 기능 추가.

return { 
  {
    ...
  },
  {
    -Goto File 기능을 제공하는 blade-nav.nvim 플러그인 추가
    -- Blade 파일용.
    "ricardoramirezr/blade-nav.nvim",
    dependencies = {
      "hrsh7th/nvim-cmp",
    },
    ft = { "blade", "php" },
  },
}

LazyVim의 큰 장점은 문서화 기능입니다. VSCode에서 익숙하게 사용하던 기능이 Neovim에서도 사용되기를 원한다면 LazyVim에 이미 해당 기능이 내장되어 있을 가능성이 높습니다. 이에 대해 자세히 알아보려면 LazyVim의 각 섹션을 살펴보는 것이 좋습니다.

아마도 가장 중요한 섹션 중 하나는 키맵일 것입니다. LazyVim은 which-key.nvim을 사용하여 편집기에 있는 동안 구성된 키캡을 기억할 수 있도록 도와주지만 전체 목록을 보려면 여기.

Git 지원을 원하시나요? LazyVim은 Git을 위한 정말 멋진 터미널 UI인 LazyGit으로 이를 지원합니다. <leader<gg를 사용하여 열 수 있습니다. 홈브류와 같은 것을 사용하여 명령줄에서 바로 실행할 수 있도록 lazygit로 직접 설치할 수도 있습니다.

PHPStan이나 Psalm 같은 추가 툴이 필요하신가요? &t leader&t cm 또는 :Mason를 사용해 Mason 메뉴를 불러와 필요한 것을 검색하세요. 인기 있는 린터와 포맷터를 설치할 수 있습니다.

위에서 언급했듯이 LazyVim은 놀라운 문서를 제공하며 꼭 읽어볼 가치가 있습니다.

Jess Archer는 Laracasts에서 Neovim 설정을 위한 멋진 강좌를 제공하고 있습니다. 라라캐스트를 구독하지 않으신다면 이 강의를 강력히 추천합니다. 저는 2017년부터 평생 사용자였습니다. 관심이 있으시다면 제 추천 링크를 이용하세요.

DHH(루비 온 레일즈 제작자)는 우분투 리눅스에서 개발 환경을 빠르게 설정할 수 있는 방법으로 Omakub 패키지를 만들었습니다. 우분투를 사용하지 않더라도 Omakub의 리포지토리에는 멋진 구성과 도구가 많이 있으므로 확인해 볼 가치가 있으며, 그 중 하나는 LazyVim이 포함된 Neovim입니다.

LazyVim보다 조금 더 최소한의 것을 원한다면 Kickstart.nvim이 좋은 출발점이 될 수 있습니다. 시작하는 방법은 TJ DeVries의 이 동영상을 참조하세요. LazyVim을 계속 사용하고 싶어도 Neovim 구성에 대해 자세히 알아볼 수 있는 훌륭한 리소스입니다.

네오빔 여정을 시작하는 데 도움이 되었기를 바랍니다. 무한대로 구성할 수 있는 강력한 편집기입니다. PhpStorm만큼 강력하지는 않지만 무료로 꽤 근접할 수 있고 CPU 리소스를 덜 필요로 합니다.

Neovim을 기본 편집기로 사용할 계획이 없더라도 키 바인딩을 익히는 것이 도움이 될 수 있다고 생각합니다. 저는 보통 Neovim과 PhpStorm에 시간을 나눠서 사용하고 키 바인딩을 최대한 비슷하게 유지하려고 노력합니다. 다행히도 JetBrains IDE용 아이디어빔 플러그인을 사용하면 이 작업이 간단해집니다.

참조를 위해 이 게시물에서 만든 모든 파일로 repo를 만들었습니다.

설정이나 제가 놓친 추가 기능에 대해 다른 질문이 있으면 알려주세요.

읽어주셔서 감사합니다!

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