پلاگین ها و ترفند هایی که باعث میشه تو vim بهترین باشم.

چند ماهی میگذره که ادیتور اصلیم رو به vim تغییر دادم. حدس بزنید به چه دلیلی. ( راهنمایی:‌ سرعت و کارایی و سبک بودن نیست).

موس ام خراب شد 🙂

نگران نباشید. بعدا یه موس خریدم.

کار کردن بدون موس توی vs code فکر کنم غیر ممکن باشه. حتی اگه همه شورتکات ها رو هم بلد باشید کی حوصله داره پنجاه تا دکمه رو هم زمان بگیره که یه کار ساده انجام بشه؟

طبعا در ابتدا اونقدر ها هم سریع نبودم. هنوز خیلی از پلاگین های واجب رو نصب نکرده بودم و این باعث میشد اعصابم خورد بشه. از اونجا سفر دور و دراز من برای پیدا کردن پلاگین های جدید شروع شد و تا حالا هم ادامه داره.

پلاگین های کلیشه ای و تکراری که با یه سرچ کوچیک پیدا میشن رو معرفی نمیکم ولی اگر مایل بودید از فایل vimrc ام که آخر مقاله گذاشتم میتونید اون ها رو پیدا کنید.

پلاگین ها

vim-surround

این رو همین دیروز پیدا کردم. وقتی میخواید دور یه کلمه ” یا ‘ یا {} و… قرار بدید مثلا hello رو به ‘hello’ تغییر بدید احتمالا باید این چیز ها رو بزنید:

hhh i ' esc llll i '

ولی با این پلاگین با ‘cs سر و ته قضیه رو هم میارید. استفاده های دیگه هم داره که توی داکیومنت هاش میتونید بخونید و باعث میشه زندگی تون عوض بشه.

ستاره های گیتهاب : 8.5K

گیتهاب: https://github.com/tpope/vim-surround

Emmet-vim

توی vs code وقتی می نوشتیم class. و تب یا اینتر رو میزدیم چیزی که نوشتیم تبدیل میشد به :

<div class=&quotclass&quot></div>

نبود این قابلیت توی ویم باعث شد اوقات جهنمی ای داشته باشم. راستش میدونستم پلاگینی که توی vs code این کار رو میکنه اسمش emmet هست ولی نمیدونستم یه نسخه ویم هم داره. اگر به html زیاد سروکار دارید بدون این پلاگین نمیتونید زندگی کنید.

البته یه فرق جزئی داره و اون هم اینه که به جای زدن اینتر برای کامل شدن نوشته باید ctrl + y + , رو بزنید که زیاد هم فرق نداره. میتونید عوضش کنید.

ستاره های گیتهاب: 5.3K

گیتهاب: https://github.com/mattn/emmet-vim

NERD Commenter

این هم یکی دیگه از قابلیت های خوب vs code بود که خیلی راحت با / + ctrl یک یا چند خط رو کامنت میکردیم. این پلاگین همین مشکل رو حل میکنه.

ستاره های گیتهاب: 3.9K

گیتهاب: https://github.com/preservim/nerdcommenter

Vim Tmux Navigator

اگر ویم رو توی tmux باز میکنید احتمالا صفحه رو به چند قسمت تقسیم کردید و مدام لازم دارید بین اون ها جا به بشید. ctrl + b + فلش رو بریزید دور و فقط با نگه داشتن ctrl و زدن کلید های جا به جا شدن توی ویم که همون h, j, k و l باشه بین پنجره ها جا به جا بشید.

خیلی خیلی سریع تر میشید.

البته نیاز به یکم تغییر توی خود tmux هم دارید که داکیومنت ها در موردش توضیح داده و اصلا هم سخت نیست.

ستاره های گیتهاب: 3.2K

گیتهاب:‌https://github.com/christoomey/vim-tmux-navigator

vim-devicons

فکر کردید ویم یه محیط فقط منتی بی روحه؟؟ این پلاگین مشتی بر دهان شما خواهد بود.

تنها کاری که میکنه اینه که مثلا اگر از nerd tree استفاده میکنید کنار اسم فایل ها ایکون اون ها رو هم قرار میده. این شکلی:

فقط حواستون باشه برای اینکه این پلاگین کار کنه باید فونت ترمینال تون رو به یکی از فونت های نرد(Nerd Fonts) مثل fira code و hack تغییر بدید. یکم کار میبره ولی خب قشنگ تر میشه 🙂

ستاره های گیتهاب: 3.6K

گیتهاب: https://github.com/ryanoasis/vim-devicons

ترفند ها

فقط دو تا ترفند دارم ولی اونقدر خوب هست که دنبال چیز دیگه ای نباشم.

عوض کردن caps lock به ctrl

کلید ctrl رو خیلی استفاده می کنیم ولی قبول دارید برای فشرندش انگشت کوچیکه باید 180 درجه بزنه؟ چرا با caps lock که استفاده کمتری داره عوضش نمیکنید؟ باور کنید کارتون خیلی راحت و سریع تر میشه. هر وقت خواستید با حروف بزرگ بنویسید هم به جای caps lock شیفت رو بگیرید. به جایی بر نمیخوره.

برای این کار برید توی تنظیمات>کیبورد>advanced و از بخش caps lock behavior گزینه caps lock is also a ctrl رو انتخاب کنید. شاید توی سیستم شما فرق کنه ولی کلیت اش همینه.

استفاده از jk به جای esc

برای خروج از insert mode و همه مد های ویم باید از esc استفاده کنیم. این هم به عنوان یک دکمه پر کاربرد یکم دوره. میتونید به جاش از کلید های jk استفاده کنید. اگر j و k رو پشت سر هم بزنید همون کار رو انجام میده. البته به شرط اینکه این رو به فایل vimrc اضافه کنید:

inoremap jk <ESC>

میتونید از jj هم استفاده کنید.

همین دو تا کار تغییر بزرگی توی زندگی تون ایجاد میکنه.


این هم از فایل vimrc ام.

به نظرم جالب ترین جا همه چیز هایی هست که مربوط به یک پلاگین خاص نیست و بیشتر مربوط به ادیتوره. بیشترش رو میتونید بعد از خط 36 تا 52به بعد پیدا کنید. همه پلاگین ها و البته تنظیمات عظیم اون ها رو میتونید اینجا ببینید:

 call plug#begin('~/.vim/nvim-plugged')

Plug 'preservim/nerdtree'

Plug 'neoclide/coc.nvim', { 'branch': 'release' 

Plug 'christoomey/vim-tmux-navigator'

Plug 'pangloss/vim-javascript'

Plug 'morhetz/gruvbox'

Plug 'Xuyuanp/nerdtree-git-plugin'

Plug 'tiagofumo/vim-nerdtree-syntax-highlight'

Plug 'ryanoasis/vim-devicons'

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

Plug 'preservim/nerdcommenter'

Plug 'airblade/vim-gitgutter'

Plug 'mattn/emmet-vim'

Plug 'epilande/vim-react-snippets'

Plug 'mxw/vim-jsx'

Plug 'SirVer/ultisnips'

Plug 'tpope/vim-surround'

call plug#end()
:set number
set termguicolors

colorscheme gruvbox
let g:gruvbox_contrast_dark='hard'

let mapleader = &quot&quot

inoremap jk <ESC>

nmap <leader>rn <Plug>(coc-rename)

:set tabstop=2
:set shiftwidth=2
:set expandtab


&quot use tab to trigger snippets
let g:UltiSnipsExpandTrigger=&quot<tab>&quot
let g:UltiSnipsJumpForwardTrigger=&quot<c-b>&quot
let g:UltiSnipsJumpBackwardTrigger=&quot<c-z>&quot

&quot
&quot nerdtree
&quot
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists(&quots:std_in&quot) | NERDTree | endif

autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists(&quots:std_in&quot) | exe
'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif

map <C-n> :NERDTreeToggle<CR>

let g:NERDTreeIgnore = ['^node_modules$']

&quot
&quotcoc.nvim config
&quot
let g:coc_global_extensions = [
	 'coc-snippets',
	 'coc-pairs',
	 'coc-tsserver',
	 'coc-eslint',
	 'coc-prettier',
	 'coc-json']
 

&quot TextEdit might fail if hidden is not set.
set hidden

&quot Some servers have issues with backup files, see #649.
set nobackup
set nowritebackup

&quot Give more space for displaying messages.
set cmdheight=2

&quot Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
&quot delays and poor user experience.
set updatetime=300

&quot Don't pass messages to |ins-completion-menu|.
set shortmess+=c

&quot Always show the signcolumn, otherwise it would shift the text each time
&quot diagnostics appear/become resolved.
if has(&quotpatch-8.1.1564&quot)
  &quot Recently vim can merge signcolumn and number column into one
  set signcolumn=number
else
  set signcolumn=yes
endif

&quot Use tab for trigger completion with characters ahead and navigate.
&quot NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
&quot other plugin before putting this into your config.
inoremap <silent><expr> <TAB>
       pumvisible() ? &quot<C-n>&quot :
       <SID>check_back_space() ? &quot<TAB>&quot :
       coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? &quot<C-p>&quot : &quot<C-h>&quot

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# 's'
endfunction

&quot Use <c-space> to trigger completion.
if has('nvim')
  inoremap <silent><expr> <c-space> coc#refresh()
else
  inoremap <silent><expr> <c-@> coc#refresh()
endif

&quot Make <CR> auto-select the first completion item and notify coc.nvim to
&quot format on enter, <cr> could be remapped by other vim plugin
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
                              : &quot<C-g>u<CR><c-r>=coc#on_enter()<CR>&quot

&quot Use `[g` and `]g` to navigate diagnostics
&quot 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)

&quot 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)

&quot Use K to show documentation in preview window.
nnoremap <silent> K :call <SID>show_documentation()<CR>

function! s:show_documentation()
  if (index(['vim','help'], &filetype) >= 0)
    execute 'h '.expand('<cword>')
  else
    call CocActionAsync('doHover')
  endif
endfunction

&quot Highlight the symbol and its references when holding the cursor.
autocmd CursorHold * silent call CocActionAsync('highlight')

&quot Symbol renaming.
nmap <leader>rn <Plug>(coc-rename)

&quot Formatting selected code.
xmap <leader>f  <Plug>(coc-format-selected)
nmap <leader>f  <Plug>(coc-format-selected)

augroup mygroup
  autocmd!
  &quot Setup formatexpr specified filetype(s).
  autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
  &quot Update signature help on jump placeholder.
  autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end

&quot Applying codeAction to the selected region.
&quot Example: `<leader>aap` for current paragraph
xmap <leader>a  <Plug>(coc-codeaction-selected)
nmap <leader>a  <Plug>(coc-codeaction-selected)

&quot Remap keys for applying codeAction to the current buffer.
nmap <leader>ac  <Plug>(coc-codeaction)
&quot Apply AutoFix to problem on the current line.
nmap <leader>qf  <Plug>(coc-fix-current)

&quot Map function and class text objects
&quot NOTE: Requires 'textDocument.documentSymbol' support from the language server.
xmap if <Plug>(coc-funcobj-i)
omap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap af <Plug>(coc-funcobj-a)
xmap ic <Plug>(coc-classobj-i)
omap ic <Plug>(coc-classobj-i)
xmap ac <Plug>(coc-classobj-a)
omap ac <Plug>(coc-classobj-a)

&quot Use CTRL-S for selections ranges.
&quot Requires 'textDocument/selectionRange' support of language server.
nmap <silent> <C-s> <Plug>(coc-range-select)
xmap <silent> <C-s> <Plug>(coc-range-select)

&quot Add `:Format` command to format current buffer.
command! -nargs=0 Format :call CocAction('format')

&quot Add `:Fold` command to fold current buffer.
command! -nargs=? Fold :call     CocAction('fold', <f-args>)

&quot Add `:OR` command for organize imports of the current buffer.
command! -nargs=0 OR   :call     CocAction('runCommand', 'editor.action.organizeImport')

&quot Add (Neo)Vim's native statusline support.
&quot NOTE: Please see `:h coc-status` for integrations with external plugins that
&quot provide custom statusline: lightline.vim, vim-airline.
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}

&quot Mappings for CoCList
&quot Show all diagnostics.
nnoremap <silent><nowait> <space>a  :<C-u>CocList diagnostics<cr>
&quot Manage extensions.
nnoremap <silent><nowait> <space>e  :<C-u>CocList extensions<cr>
&quot Show commands.
nnoremap <silent><nowait> <space>c  :<C-u>CocList commands<cr>
&quot Find symbol of current document.
nnoremap <silent><nowait> <space>o  :<C-u>CocList outline<cr>
&quot Search workspace symbols.
nnoremap <silent><nowait> <space>s  :<C-u>CocList -I symbols<cr>
&quot Do default action for next item.
nnoremap <silent><nowait> <space>j  :<C-u>CocNext<CR>
&quot Do default action for previous item.
nnoremap <silent><nowait> <space>k  :<C-u>CocPrev<CR>
&quot Resume latest coc list.
nnoremap <silent><nowait> <space>p  :<C-u>CocListResume<CR>


&quot vim-prettier
command! -nargs=0 Prettier :CocCommand prettier.formatFile
&quot
&quotfzf
&quot
nnoremap <C-p> :Files<CR>
nnoremap <C-b> :Buffers <CًًR>

&quot
&quotnerdcommenter
&quot

&quot Add spaces after comment delimiters by default
let g:NERDSpaceDelims = 1

let g:NERDTreeQuitOnOpen = 1

vmap ++ <plug>NERDCommenterToggle
nmap ++ <plug>NERDCommenterToggle

autocmd bufenter * if (winnr(&quot$&quot) == 1 && exists(&quotb:NERDTree&quot) && b:NERDTree.isTabTree()) | q | endif

&quot
&quotemmet
&quot
let g:user_emmet_settings = {
  'javascript' : {
      'extends' : 'jsx',
  },
}

نوشته پلاگین ها و ترفند هایی که باعث میشه تو vim بهترین باشم. اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

دیدگاهتان را بنویسید