ניאובימ עבור PHP ולאראבל

אם אי פעם רציתם להשתמש ב-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 במהירות. פשוט לחץ 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. אז כדי למצוא קובץ, הקלד space + f + f. לאחר מכן, תוכל פשוט לחפש באמצעות מחפש ה-fuzzy.

כאשר טוענים את הקונטרולר בפעם הראשונה, Phpactor יתחיל לאנדקס את קוד המקור שלך, בדרך כלל מהשורש של Git של הפרויקט.

תראה גם הרבה שגיאות ודיאגנוסטיקות אחרות. אלו מסופקות על ידי ה-LSP יחד עם השלמת קוד, מעבר להגדרה, רפקטורינג ותכונות רבות נוספות.

אם אתה רוצה לשנות את הבקר הבסיסי, תוכל לנווט ל-Controller וללחוץ על gd כדי לעבור להגדרה.

לאחר מעבר להגדרה, תוכל לחזור למטה להגדרת המחלקה וללחוץ על gr כדי לעבור להפניות עבור מחלקת Controller. לאחר מכן, תוכל להשתמש ב-ctrl+o כדי לחזור למיקומים הקודמים שלך.

אל תהסס להמשיך להשתמש ב-Phpactor אם זה עובד לך. הוא נתקל בקשיים עם חלק מהקסמים והסוגים החסרים ב-Laravel, אך הוא לחלוטין חינמי וקוד פתוח. תוכל לשפר את זה על ידי שימוש בכלי כמו Laravel IDE Helper שמייצר שורות קוד לדגמים, פאצדות ותכונות אחרות של המסגרת כדי לספק השלמה אוטומטית טובה יותר.

אישית, חוויתי חוויה טובה יותר עם ה-LSP Intelephense, שאת רוב הסיכוי אתה מכיר אם אתה מגיע מ-VSCode. למרבה הצער, אתה מפסיד חלק מהתכונות של Phpactor ללא גרסת פרימיום של Intelephense, ולכן אני ממליץ לרכוש את הרישוי אם אתה משתמש ב-Intelephense. רישוי אחד עובד ב-VSCode, Neovim וכל עורך אחר שתומך ב-LSPs.

כדי להגדיר את Intelephense, תצטרך לשנות את קונפיגורציית LazyVim. בתיקיית ~/.config/nvim, פתח את options.lua והוסף את השורה הבאה:

vim.g.lazyvim_php_lsp = "intelephense"

זה אומר ל-LazyVim להגדיר את Intelephense. ייתכן שתצטרך להסיר את Phpactor, כדי לעשות זאת, תוכל להקליד <leader>cm שפותח את Mason. Mason הוא כלי להתקנת פורמטורים שונים, לינטרים, ו-LSPs. מתפריט Mason, מצא את Phpactor והסר אותו על ידי שימוש ב-X.

מכיוון שהתקנו את Lazy Extras עבור 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 אם Pint לא נמצא. עם שינוי זה, אני יכול לחזור ל-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.
    "mfussenegger/nvim-lint",
    optional = true,
    opts = {
      linters_by_ft = {
        php = {},
      },
    },
  },
}

אני לוקח את הקונפיגורציות הללו ישירות מתוך התיעוד של LazyVim.

לאחר מכן, נתקין את 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 כדי להפעיל סיכום של תוצאות הבדיקות.

הוספת תמיכה עבור 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.

הקלד :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"))

: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.

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

תוכל להוסיף כל חתימה נוספת שתרצה לקובץ זה, או ליצור קבצים לשפות אחרות כדי להוסיף חתימות.

תוסף זה יכול לשמש להפעלת פקודות 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 } },
    },
  },
}

מוסיף את היכולת להשתמש ב-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 שהיא ממש ממשק נוח ל-Git. השתמש ב-<leader>gg כדי לפתוח אותה. ניתן גם להתקין את LazyGit ישירות באמצעות משהו כמו Homebrew ולהריץ אותו ישירות בקו הפקודה באמצעות lazygit.

צריך כלי נוסף כמו PHPStan או Psalm? השתמש ב-<leader>cm או ב-:Mason כדי להעלות את תפריט Mason ולחפש את מה שאתה צריך. יש בו הרבה לינטורים ומעבדים פופולריים להתקנה.

כפי שציינתי למעלה, LazyVim מספקת תיעוד מצוין ושווה קריאה בהחלט.

ג'ס ארצ'ר יש לו קורס מצוין כדי להקים את Neovim ב-Laracasts. אם אינך מנוי ל-Laracasts, אני לא יכול להמליץ על זה מספיק. אני משתמש קבוע מאז 2017. אם זה משהו שמעניין אותך, אנא השתמש בקישור הפניה שלי.

DHH (יוצר Ruby on Rails) יצר את חבילת Omakub כדרך מהירה להקים סביבה לפיתוח על Ubuntu Linux. אפילו אם אינך משתמש ב-Ubuntu, המאגר של Omakub שווה בדיקה מכיוון שיש לו הרבה תצורות וכלים שימושיים, אחד מהם הוא Neovim עם LazyVim.

אם אתה מחפש משהו מינימלי יותר מ-LazyVim, אז Kickstart.nvim הוא התחלה טובה. תוכל לצפות בסרטון הזה של TJ DeVries על איך להתחיל. אפילו אם אתה רוצה להמשיך להשתמש ב-LazyVim, זה עדיין מקור מצוין ללמוד יותר על קונפיגורציית Neovim.

אני מקווה שזה יעזור לך להתחיל במסע שלך עם Neovim. זה עורך עוצמתי שניתן להתאים אותו אינסופית. אמנם לא עוצמתי כמו PhpStorm, הוא יכול להביא אותך קרוב מאוד בחינם ודורש פחות משאבי CPU.

אפילו אם אינך מתכוון להשתמש ב-Neovim כעורך הראשי שלך, אני חושב שעדיין יהיה מועיל ללמוד את קיצורי המקשים. אני בדרך כלל מחלק את זמני בין Neovim ל-PhpStorm ומנסה לשמור על קיצורי המקשים שלי דומים ככל האפשר. למרבה המזל, התוסף IdeaVim ל-IDEs של JetBrains מקל על כך.

למען ההפניה שלך, יצרתי מאגר עם כל הקבצים שיצרנו בפוסט הזה.

אנא יידע אותי אם יש לך שאלות נוספות לגבי ההגדרה או תכונות נוספות שעשיתי עליהם החמצה.

תודה שקראת!

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