もた日記

くだらないことを真面目にやる

Vimメモ : Neovimで開発環境を段階的に構築する(7)コメントアウト、Undo、カーソル移動など

今回は開発するときにあると便利な比較的ユーザ数が多いプラグインを紹介していく。

コメントアウト

コメントアウトをサポートするプラグインとしては下記が挙げられる。

Repository スター数
scrooloose/nerdcommenter 3367
tpope/vim-commentary 2588
tomtom/tcomment_vim 1010

例えばvim-commentaryの場合は、gccと入力すると現在行をコメントアウトし、ビジュアルモードで行選択してからgcと入力すると選択行をコメントアウトできる。そして、コメントアウトされた行に対して実行すればコメントアウトを解除できる。

Plug 'tpope/vim-commentary'

Undo

Undo操作をサポートするプラグインとしては下記が挙げられる。

Repository スター数
sjl/gundo.vim 1360
mbbill/undotree 1280

例えばundotreeの場合は、:UndotreeToggleコマンドを実行することで以下のようなUndo履歴が表示されるのでUndo/Redoが管理しやすくなる。

Plug 'mbbill/undotree'

nmap <F5> :UndotreeToggle<CR>

f:id:wonder-wall:20190825214002p:plain

カーソル移動

カーソル移動をサポートするプラグインとしては下記が挙げられる。

Repository スター数
easymotion/vim-easymotion 4498
justinmk/vim-sneak 1556

例えばvim-easymotionの場合は、下記設定を追加することでsキーの後に移動したい文字列の先頭2文字入力することで移動が可能になる。

Plug 'easymotion/vim-easymotion'

nmap s <Plug>(easymotion-overwin-f2)

f:id:wonder-wall:20190825215306p:plain

この場合、sの後にfiを入力すると赤字で候補キーが表示されるので、候補キーを入力することでその場所へカーソルが移動する(aまたはsを入力)。なお、候補が1つしかない場合は候補キーは表示されずに直接カーソル移動する。

f:id:wonder-wall:20190825215321p:plain

囲み文字の編集

囲み文字の編集をサポートするプラグインとしては下記が挙げられる。

Repository スター数
tpope/vim-surround 6980
machakann/vim-sandwich 426

例えばvim-surroundの場合は、"Hello world!"という文字列上でcs"'を入力すると'Hello world!'のように"'に変更できる。
さらにds'を入力するとHello world!のように'を削除できる。
また、矩形ビジュアルモードでHello world!を選択した後でS"を入力すると"Hello world!"のように"で囲むことができる。

Plug 'tpope/vim-surround'

なお、vim-surroundの操作を.キーでリピートできるようにするにはvim-repeatを使用するとよい。

Repository スター数
tpope/vim-repeat 1450
Plug 'tpope/vim-repeat'

自動で閉じ括弧

自動で閉じ括弧(引用符なども)を入力するプラグインとしては下記が挙げられる。

Repository スター数
jiangmiao/auto-pairs 2236
Raimondi/delimitMate 1595

例えばauto-pairsの場合は、(を入力すると自動で)も入力されるようになる。

Plug 'jiangmiao/auto-pairs'

まとめ

今回の~/.config/nvim/init.vim

call plug#begin('~/.vim/plugged')
Plug 'joshdick/onedark.vim'
Plug 'itchyny/lightline.vim'
Plug 'ntpeters/vim-better-whitespace'
Plug 'Yggdroot/indentLine'
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
Plug 'majutsushi/tagbar', { 'on': 'TagbarToggle' }
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
Plug 'airblade/vim-rooter'
Plug 'tpope/vim-fugitive'
Plug 'airblade/vim-gitgutter'
Plug 'xuyuanp/nerdtree-git-plugin', { 'on': 'NERDTreeToggle' }
Plug 'sheerun/vim-polyglot'
Plug 'dense-analysis/ale'
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'kassio/neoterm'
Plug 'tpope/vim-commentary'
Plug 'mbbill/undotree'
Plug 'easymotion/vim-easymotion'
Plug 'tpope/vim-surround'
Plug 'tpope/vim-repeat'
Plug 'jiangmiao/auto-pairs'
call plug#end()

set number
set termguicolors
" airblade/vim-gitgutter
set updatetime=100

let g:python_host_prog = $HOME . '/.pyenv/versions/neovim2/bin/python'
let g:python3_host_prog = $HOME . '/.pyenv/versions/neovim3/bin/python'

" joshdick/onedark.vim
colorscheme onedark
" itchyny/lightline.vim
let g:lightline = {'colorscheme': 'onedark'}
" sheerun/vim-polyglot
" let g:polyglot_disabled = ['csv']
" SirVer/ultisnips
let g:UltiSnipsExpandTrigger='<c-j>'

" dense-analysis/ale
let g:ale_set_highlights = 0
let g:ale_linters = {'python': ['flake8']}
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
let g:ale_fixers = {
  \   '*': ['remove_trailing_lines', 'trim_whitespace'],
  \   'python': ['black'],
  \ }
" let g:ale_fix_on_save = 1
nmap <silent> <C-k> <Plug>(ale_previous_wrap)
nmap <silent> <C-j> <Plug>(ale_next_wrap)

" scrooloose/nerdtree
nmap <C-e> :NERDTreeToggle<CR>
" majutsushi/tagbar
nmap <F8> :TagbarToggle<CR>
" junegunn/fzf.vim
nmap <C-p> :History<CR>
" mbbill/undotree
nmap <F5> :UndotreeToggle<CR>
" easymotion/vim-easymotion
nmap s <Plug>(easymotion-overwin-f2)

" neoclide/coc.nvim
inoremap <silent><expr> <TAB>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

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

inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"

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)
nnoremap <silent> K :call <SID>show_documentation()<CR>

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

" kassio/neoterm
let g:neoterm_default_mod='belowright'
let g:neoterm_size=10
let g:neoterm_autoscroll=1
tnoremap <silent> <C-w> <C-\><C-n><C-w>
nnoremap <silent> <C-n> :TREPLSendLine<CR>j0
vnoremap <silent> <C-n> V:TREPLSendSelection<CR>'>j0

:CocConfigの設定。

{
        "diagnostic.enable": false,
        "python.linting.enabled": false,
        "python.jediPath": "~/.pyenv/versions/neovim3/lib/python3.7/site-packages/"
}

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

wonderwall.hatenablog.com

wonderwall.hatenablog.com