نيوفيم ل 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 ويثبت LSP لـ Phpactor.

لاختبار LSP، أنشأت مشروع Laravel جديد باستخدام Laravel Breeze. من دليل المشروع، افتح Neovim وفتح ProfileController باستخدام <leader>ff. في Neovim، يتم تمييز العديد من أوامر لوحة المفاتيح بـ <leader>، الذي يتم تعيينه إلى space افتراضيًا. لذا للعثور على ملف، اكتب space + f + f. ثم يمكنك البحث باستخدام أداة البحث الضبابية.

عند تحميل المتحكم لأول مرة، سيبدأ 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 وثائق رائعة وتستحق القراءة بالتأكيد.

لدى Jess Archer دورة رائعة لإعداد Neovim على Laracasts. إذا لم تكن مشتركًا في Laracasts، لا أستطيع أن أوصي بها بما فيه الكفاية. لقد كنت مستخدمًا مدى الحياة منذ عام 2017. إذا كنت مهتمًا، يرجى استخدام رابط الإحالة الخاص بي.

أنشأ DHH (مُبدع Ruby on Rails) حزمة Omakub كوسيلة سريعة لإعداد بيئة تطوير على Ubuntu Linux. حتى إذا كنت لا تستخدم Ubuntu، فإن مستودع Omakub يستحق الاطلاع عليه لأنه يحتوي على العديد من التكوينات والأدوات الجيدة، بما في ذلك Neovim مع LazyVim.

إذا كنت تريد شيئًا أكثر بساطة من LazyVim، فإن Kickstart.nvim هو نقطة انطلاق جيدة. يمكنك مشاهدة هذا الفيديو من TJ DeVries حول كيفية البدء. حتى إذا كنت ترغب في الاستمرار في استخدام LazyVim، فإن هذا المورد لا يزال رائعًا لتعلم المزيد حول تكوين Neovim.

آمل أن يساعدك هذا في البدء في رحلتك مع Neovim. إنه محرر قوي وقابل للتكوين بشكل لا نهائي. على الرغم من أنه ليس قويًا مثل PhpStorm، إلا أنه يمكن أن يقترب منك مجانًا ويحتاج إلى موارد أقل من وحدة المعالجة المركزية.

حتى لو كنت لا تخطط لاستخدام Neovim كمحررك الأساسي، أعتقد أنه لا يزال من المفيد تعلم اختصارات لوحة المفاتيح. عادةً ما أقسم وقتي بين Neovim و PhpStorm وأحاول الحفاظ على اختصارات لوحة المفاتيح مماثلة قدر الإمكان. لحسن الحظ، تجعل الإضافة IdeaVim لـ JetBrains IDEs هذا الأمر بسيطًا.

لإرشادك، أنشأت مستودعًا يحتوي على جميع الملفات التي أنشأناها في هذا المنشور.

يرجى إعلامي إذا كان لديك أي أسئلة أخرى حول الإعداد أو أي ميزات إضافية قد أكون قد فاتتني.

شكرًا للقراءة!

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