もた日記

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

Vimメモ : Neovimで開発環境を段階的に構築する(6)プログラム実行

プログラム実行

プログラム実行をサポートするプラグインとしては下記が挙げられる。

Repository スター数
tpope/vim-dispatch 1966
skywind3000/asyncrun.vim 921
kassio/neoterm 752
thinca/vim-quickrun 614

Neovimでは:terminalコマンドでターミナルエミュレータを起動できるので、:terminalコマンドのラッパーであるneotermを試してみる。

Plug 'kassio/neoterm'

neotermでは:Tnewコマンドで新しいターミナルエミュレータを起動でき、起動時の位置やサイズは下記オプションで設定できる。

let g:neoterm_default_mod='belowright'
let g:neoterm_size=10

また、コマンド実行時に画面下部の実行結果が表示されるようにneoterm_autoscrollと、C-wでターミナル内の挿入モードを抜けてウィンドウ移動できるように設定を追加しておく。

let g:neoterm_autoscroll=1
tnoremap <silent> <C-w> <C-\><C-n><C-w>

例えば、:Tnewを2回実行するとターミナルエミュレータが2つ起動し、それぞれにIDが割り当てられる。
neotermでは:T {command}のようにしてコマンドを実行するが、:2T {command}のようにIDを指定しての実行もできる(IDを指定しない場合は最後にアクティブになったターミナルエミュレータが対象になる)ので、:1T date:2T python %を実行した結果は以下のようになる。
なお、毎回コマンドを入力するのが面倒であれば:Tmap python %のように:Tmapでコマンドを登録すると、,ttで登録したコマンドを呼び出すことができる。

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

neotermではREPLでの実行もサポートしているので下記設定を追加すると、C-nを押すことでノーマルモードでは現在行、ビジュアルモードでは選択している行の内容をREPLで実行できる。
サポートしているREPLはこのページを参照。

nnoremap <silent> <C-n> :TREPLSendLine<CR>j0
vnoremap <silent> <C-n> V:TREPLSendSelection<CR>'>j0

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

まとめ

今回の~/.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'
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>

" 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