راه اندازی Vim برای PHP و لاراول در سال 2024

من بیشتر قصد دارم سفر خودم را در راه اندازی Vim (نه Neovim!) برای PHP و laravel مستند کنم. با خیال راحت دنبال کنید.
ما قصد داریم از Vim+VimPlug+CoC.nvim استفاده کنیم، بنابراین باید nodej و npm را نصب کنیم. ناگفته نماند که باید Vim8+ را نیز داشته باشید. نسخه فعلی Vim در حال نوشتن این مقاله Vim-9.1 است
پس بیایید از یک تمیز شروع کنیم ~/.vimrc
اجازه می دهد این بلوک را که به طور خودکار VimPlug را نصب می کند، در بالای ما قرار دهیم ~/.vimrc
.
function! VimplugInstaller()
let data_dir = has('nvim') ? stdpath('data') . '/site' : '~/.vim'
if empty(glob(data_dir . '/autoload/plug.vim'))
silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
endfunction
call VimplugInstaller()
چندین پلاگین ضروری دنبال می شود:
call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'https://github.com/preservim/tagbar.git'
Plug 'vim-php/phpctags', {'for':'php'}
Plug 'honza/vim-snippets'
Plug 'SirVer/ultisnips'
Plug 'tpope/vim-commentary'
Plug 'sheerun/vim-polyglot'
Plug 'jwalton512/vim-blade'
call plug#end()
مهمترین آنها، coc.nvim است. بقیه برای بهبودهای مختلف است که به زودی به آنها خواهیم پرداخت، اما قبل از انجام، اجازه دهید چند افزونه برای coc.nvim تعریف کنیم و سایر پلاگین ها را پیکربندی کنیم.
"===[Coc.nvim]==="
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#_select_confirm() : "\u\"
" use to trigger completion and navigate to the next complete item
function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
inoremap <silent><expr> <Tab>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\" :
\ coc#refresh()
inoremap <expr><s-tab> coc#pum#visible() ? coc#pum#prev(1) : "\"
" Enhanced for pairs
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\u\\=coc#on_enter()\"
" Disable < expansion for pairs
autocmd FileType * let b:coc_pairs_disabled = ["<"]
"===[ Coc-Explorer ]==="
" set up coc-explorer to open in the current directory
let g:coc_explorer_global_mirror = 0
let g:coc_explorer_disable_default_keybindings = 1
let g:coc_explorer_global_root = 'current'
nnoremap <space>e <Cmd>CocCommand explorer<CR>
"===[ Coc Global Extensions ]==="
let g:coc_global_extensions = [
\ 'coc-html',
\ 'coc-css',
\ 'coc-pairs',
\ 'coc-emmet',
\ 'coc-explorer',
\ 'coc-phpactor',
\ 'coc-laravel',
\ 'coc-blade'
\ ]
" GoTo code navigation
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
" Use `[g` and `]g` to navigate diagnostics
" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)
"
" List code actions available for the current buffer
nmap <leader>ca <Plug>(coc-codeaction)
nnoremap <silent> K :call ShowDocumentation()<CR>
function! ShowDocumentation()
if CocAction('hasProvider', 'hover')
call CocActionAsync('doHover')
else
call feedkeys('K', 'in')
endif
endfunction
" Add `:Format` command to format current buffer
command! -nargs=0 Format :call CocActionAsync('format')
" Formatting selected code
vmap <leader>f <Plug>(coc-format-selected)
" coc-pairs
" disable characters for a specified filetypes
autocmd FileType markdown let b:coc_pairs_disabled = ['txt']
کد بالا، تکمیل برگه، جفتهای خودکار، کاوشگر فایل coc-explorer و دیگر کلیدبایدینگها را پیکربندی میکند تا بیشترین بهره را از coc.nvim ببرید.
در قسمت coc global extension ها را تعریف می کنیم که به صورت خودکار نصب شوند. من تصمیم گرفتم از phpactor استفاده کنم، ممکن است آن را تغییر دهید coc-intelephense
.
بیایید قطعات را نیز پیکربندی کنیم:
ما میتوانیم اسنیپتهایمان را با coc.nvim نیز مدیریت کنیم، اما من استفاده از UltiSnips را برای آن انتخاب میکنم.
"===[ SNIPPETS ]==="
"Use Ctrl j key to trigger the snippets, default was TAB but that conflicts with
"The Completion trigger see :h keycodes to change this to sth else
"Use Ctrl j and k to move visually within the snippet that was just triggered
"Ctrl l lists the available snippets
let g:UltiSnipsExpandTrigger=''
let g:UltiSnipsListSnippets=''
let g:UltiSnipsJumpForwardTrigger=''
let g:UltiSnipsJumpBackwardTrigger=''
let g:copypath_copy_to_unnamed_register = 1
Vim را ذخیره کرده و از آن خارج شوید و دوباره آن را باز کنید و منتظر بمانید تا افزونه ها و افزونه ها نصب شوند.
اگر پیام خطا از شما خواسته شد، کافی است اینتر را فشار دهید و منتظر بمانید تا افزونه ها و افزونه ها نصب شوند.
اکنون اجازه میدهیم افزونههای coc را پیکربندی کنیم.
صادر کند :CocConfig
از حالت فرمان Vim دستور دهید و موارد زیر را در داخل فایل قرار دهید.
{
"suggest.noselect": true,
"explorer.icon.enableNerdfont": true,
"explorer.file.reveal.auto": true
"languageserver": {
"phpactor": {
"command": "phpactor",
"args": ["language-server"],
"trace.server": "verbose",
"filetypes": ["php"]
}
}
}
اگر تصمیم گرفتید از نصب محلی phpactor استفاده کنید، فقط می توانید آن را حذف کنید coc-phpactor
با :CocUninstall coc-phpactor
و اصلاح کنید ~/.vim/coc-settings.json
برای اضافه کردن مسیری به فایل اجرایی phpactor و حذف کامل بلوک سرور زبان.
{
"phpactor.enable": true,
"phpactor.path": "/usr/bin/phpactor",
}
کلیدبندی ها:
تنها کلیدبایدینگهایی که باید بدانید، علاوه بر کلیدبندیهای معمول Vim، عبارتند از:
کلید | عمل |
---|---|
Tab | تکمیل |
gd | تعریف |
gy | تعریف نوع |
gi | پیاده سازی |
گرم | منابع |
[g | diagnostics prev |
]g | تشخیص بعدی |
حدود | اقدامات کد |
ک | اسناد شناور |
f (در حالت بصری) | کد قالب |
Ctrl-j | Snippet را بزرگ کنید و به Placeholder بعدی بروید |
Ctrl+k | به مکانگردان قبلی بروید |
Ctrl-l | فهرست اسنیپت ها |
Space-e | Explorer را باز کنید |
اکنون باید یک راه اندازی کارآمد و راحت برای کار با PHP و لاراول داشته باشیم.
اجازه می دهد تا چندین چیز دیگر را برای راحتی راه اندازی کنیم
موضوع:
این افزونه ها را به لیست افزونه ها اضافه کنید و با آن نصب کنید :PlugInstall
پس از تامین منابع ~/.vimrc
.
Plug 'ryanoasis/vim-devicons'
Plug 'catppuccin/vim', { 'as': 'catppuccin' }
Vim را برای استفاده از تم محبوب catppuccin راه اندازی کنید.
"===[ Theme ]==="
set background=dark
" Inspect $TERM instead of t_Co
if &term =~ '256color'
" Enable true (24-bit) colors instead of (8-bit) 256 colors.
if has('termguicolors')
let &t_8f = "\[38;2;%lu;%lu;%lum"
let &t_8b = "\[48;2;%lu;%lu;%lum"
let &t_TI = ""
let &t_TE = ""
set termguicolors
set mouse=a
colorscheme catppuccin_mocha
endif
else
colorscheme catppuccin_mocha
let &t_TI = ""
let &t_TE = ""
endif
if has('gui_running')
set mouse=a
set guicursor+=a:blinkon0
set guifont=FiraCodeNerdFont\ 12
colorscheme catppuccin_mocha
endif
"===[ Curosr Shape ]==="
let &t_SI = "\[6 q"
let &t_SR = "\[4 q"
let &t_EI = "\[2 q"
بلوک بالا باعث میشود vim از رنگهای termgui (در ترمینال با قابلیت termgui) استفاده کند و از اشکال مکاننمای مختلف برای حالتهای مختلف استفاده کند.
مطمئن شوید که $TERM
گزارش های متغیر xterm-256color
.
در تصویر زیر می توانید phpactor، coc-explorer و tagbar را در حال کار مشاهده کنید.
من یک خطا در نحو گذاشتم تا به شما نشان دهم عیبیابی درون خطی چگونه است.
بهتر است با مستندات و دستورات coc.nvim آشنا شوید.
مثلا دویدن :CocDiagnostics
یک کشو با تمام خطاهای یافت شده توسط coc.nvim باز می شود.
با فشار دادن اینتر روی هر مورد، به خط حاوی خطا میروید.
من نتوانستم یک پلاگین phpdoc مناسب برای Vim پیدا کنم، اما علاوه بر آن، این راه اندازی بسیار موثر است. تنها چیزهایی که می توانید به آن اضافه کنید، پلاگین های دلخواه شما برای مقابله با git و یافتن فازی است.
می توانید پیکربندی کامل من را در github (احتمالاً در شاخه Devel) Woland’s Vim پیدا کنید.
اگر نکته یا سوالی دارید، لطفا نظر خود را بنویسید.
آیا می توانم از این با Nvim استفاده کنم؟
بله، شما فقط باید تمام کدها را در آن قرار دهید ~/.config/nvim/init.vim
چرا از Nvim با lspconfig و cmp و غیره استفاده نمی کنید؟
زیرا پیکربندی زمان بیشتری طول میکشد و نتایج بهتر از چیزی نیست که coc به راحتی ارائه میکند.