Edited at

vimって極めればvscode並のIDEになるんじゃないの? - 最強のvimrcを晒す。

『なる』

今や、速度的にもSublimeに負けてるvim。

あ、vimmerなんですね(格好付けw)』と笑われる時代になってしまいました。

ずっと仲間だったvimmerも軒並みsublimeか、高機能のvscodeに浮気してる始末。

寂しかった僕は『じゃあvscode並のvimにすればいいじゃん』と思いました。

去っていったvimmerも唸るvimにする為に・・・!

今回は、4年かけて自分が完成したと思い込んでいるvimを、

初心者の方でもコピペ3分で作っていきます。

スクリーンショット 2019-04-08 0.55.05.png

※中央上がエディタ画面、左がディレクトリツリー、右上がターミナル、下がエディタで開いてる機械学習ファイルの実行ログ。全てvimで出してます。

今回は以下の内容を紹介していきます。


  • インサートモードでもマウスでコピーアンドペースト

  • ファイルのツリー表示

  • 16言語の補完(ディレクトリ補完も有)

  • vim画面でプログラム実行/出力

  • vim画面でシェルを開く

  • 各種便利ショートカット

  • 覚えづらいコマンドのショートカット化


まずは必要なライブラリのインストール


terminal

brew update

brew install vim python cmake go mono node rust


vimrcをコピー

vimのカスタマイズは~/.vimrc内に書き込めます。

vi ~/.vimrcで開いて、下のコードをコピーしましょう。

313行あるので、この文をクリックして開いて下さい。


~/.vimrc

" setting

if has('vim_starting')
set nocompatible
endif

if !filereadable(expand('~/.vim/autoload/plug.vim'))
if !executable("curl")
echoerr "You have to install curl or first install vim-plug yourself!"
execute "q!"
endif
echo "Installing Vim-Plug..."
echo ""
silent !\curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
let g:not_finish_vimplug = "yes"
autocmd VimEnter * PlugInstall
endif

" plugin
call plug#begin(expand('~/.vim/plugged'))
Plug 'mattn/vim-starwars'
"" space + ne -> sidebar
Plug 'scrooloose/nerdtree'
Plug 'jistr/vim-nerdtree-tabs'
"" ga -> align
Plug 'junegunn/vim-easy-align'
"" space + qr -> exec script
Plug 'thinca/vim-quickrun'
Plug 'Shougo/vimproc.vim', {'do' : 'make'}
"" gcc -> comment
Plug 'tpope/vim-commentary'
"" option bar
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
"" auto bracket
Plug 'Raimondi/delimitMate'
Plug 'tpope/vim-surround'
"" auto format
Plug 'Chiel92/vim-autoformat'
"" error detect
Plug 'scrooloose/syntastic'
"" delete white space
Plug 'bronson/vim-trailing-whitespace'
"" auto complete
Plug 'sheerun/vim-polyglot'
Plug 'Valloric/YouCompleteMe'
Plug 'ervandew/supertab'
"" html
Plug 'hail2u/vim-css3-syntax'
Plug 'gorodinskiy/vim-coloresque'
Plug 'tpope/vim-haml'
Plug 'mattn/emmet-vim'
"" javascript
Plug 'jelera/vim-javascript-syntax'
"" php
Plug 'arnaud-lb/vim-php-namespace'
"" python
Plug 'davidhalter/jedi-vim'
Plug 'raimon49/requirements.txt.vim', {'for': 'requirements'}
"" space + sh -> vimshell
Plug 'Shougo/vimshell.vim'
"" snippet
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
call plug#end()
filetype plugin indent on
let mapleader="\<Space>"

"" ultisnip
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
let g:UltiSnipsEditSplit="vertical"

"" youcompleteme
let g:ycm_server_python_interpreter = '/usr/bin/python2.7'
let g:ycm_python_binary_path = '/usr/bin/python2.7'
let g:ycm_global_ycm_extra_conf = '~/.vim/plugged/YouCompleteMe/.ycm_extra_conf.py'
let g:ycm_auto_trigger = 1
let g:ycm_min_num_of_chars_for_completion = 1
let g:ycm_autoclose_preview_window_after_insertion = 1
let g:ycm_key_list_select_completion = ['<Down>']
let g:ycm_key_list_previous_completion = ['<Up>']
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "ᐅ"
let g:ycm_key_list_stop_completion = ['<C-y>', '<Enter>']
let g:ycm_seed_identifiers_with_syntax = 1
let g:SuperTabDefaultCompletionType = '<C-n>'
let g:make = 'gmake'
if exists('make')
let g:make = 'make'
endif

"" auto-format
au BufWrite * :Autoformat

"" vim-airline
let g:airline_theme = 'powerlineish'
let g:airline#extensions#syntastic#enabled = 1
let g:airline#extensions#branch#enabled = 1
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tagbar#enabled = 1
let g:airline_skip_empty_sections = 1

"" emmet
autocmd FileType html imap <buffer><expr><tab>
\ emmet#isExpandable() ? "\<plug>(emmet-expand-abbr)" :
\ "\<tab>"

"" nerdtree
let g:NERDTreeChDirMode=2
let g:NERDTreeIgnore=['\.rbc$', '\~$', '\.pyc$', '\.db$', '\.sqlite$', '__pycache__']
let g:NERDTreeSortOrder=['^__\.py$', '\/$', '*', '\.swp$', '\.bak$', '\~$']
let g:NERDTreeShowBookmarks=1
let g:nerdtree_tabs_focus_on_files=1
let g:NERDTreeMapOpenInTabSilent = '<RightMouse>'
let g:NERDTreeWinSize = 30
let NERDTreeShowHidden=1
set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.pyc,*.db,*.sqlite
nnoremap <Leader>dir :NERDTreeTabsToggle<CR>
autocmd BufWritePre * :FixWhitespace
augroup NERD
au!
autocmd VimEnter * NERDTree
autocmd VimEnter * wincmd p
augroup END

"" quickrun
nnoremap <Leader>go :QuickRun<CR>
nnoremap <C-U>qr :QuickRun<CR>
let g:quickrun_config={'*': {'split': ''}}
let g:quickrun_config.cpp = {
\ 'command': 'g++',
\ 'cmdopt': '-std=c++11'
\ }

"" vim-easy-align
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)

"" vimshell
"" nnoremap <Leader>sh :VimShellPop<CR>
nnoremap <Leader>sh :vertical terminal<CR>
let g:vimshell_user_prompt = 'fnamemodify(getcwd(), ":~")'
let g:vimshell_prompt = '$ '

"" syntastic
let g:syntastic_always_populate_loc_list=1
let g:syntastic_error_symbol='✗'
let g:syntastic_warning_symbol='⚠'
let g:syntastic_style_error_symbol = '✗'
let g:syntastic_style_warning_symbol = '⚠'
let g:syntastic_auto_loc_list=1
let g:syntastic_aggregate_errors = 1

"" jedi-vim
let g:jedi#popup_on_dot = 0
let g:jedi#goto_assignments_command = "<leader>g"
let g:jedi#goto_definitions_command = "<leader>d"
let g:jedi#documentation_command = "K"
let g:jedi#usages_command = "<leader>n"
let g:jedi#rename_command = "<leader>r"
let g:jedi#show_call_signatures = "0"
let g:jedi#completions_command = "<C-Space>"
let g:jedi#smart_auto_mappings = 0
let g:jedi#force_py_version = 3
autocmd FileType python setlocal completeopt-=preview

"" syntastic
let g:syntastic_python_checkers=['python', 'flake8']
let g:polyglot_disabled = ['python']
let python_highlight_all = 1

"" vim-airline
let g:airline#extensions#virtualenv#enabled = 1
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
if !exists('g:airline_powerline_fonts')
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = '|'
let g:airline_left_sep = '▶'
let g:airline_left_alt_sep = '»'
let g:airline_right_sep = '◀'
let g:airline_right_alt_sep = '«'
let g:airline#extensions#branch#prefix = '⤴' "➔,,
let g:airline#extensions#readonly#symbol = '⊘'
let g:airline#extensions#linecolumn#prefix = '¶'
let g:airline#extensions#paste#symbol = 'ρ'
let g:airline_symbols.linenr = '␊'
let g:airline_symbols.branch = '⎇'
let g:airline_symbols.paste = 'ρ'
let g:airline_symbols.paste = 'Þ'
let g:airline_symbols.paste = '∥'
let g:airline_symbols.whitespace = 'Ξ'
else
let g:airline#extensions#tabline#left_sep = ''
let g:airline#extensions#tabline#left_alt_sep = ''
let g:airline_left_sep = ''
let g:airline_left_alt_sep = ''
let g:airline_right_sep = ''
let g:airline_right_alt_sep = ''
let g:airline_symbols.branch = ''
let g:airline_symbols.readonly = ''
let g:airline_symbols.linenr = ''
endif

" function
"" xaml
augroup MyXML
autocmd!
autocmd Filetype xml inoremap <buffer> </ </<C-x><C-o>
autocmd Filetype html inoremap <buffer> </ </<C-x><C-o>
augroup END

"" The PC is fast enough, do syntax highlight syncing from start unless 200 lines
augroup vimrc-sync-fromstart
autocmd!
autocmd BufEnter * :syntax sync maxlines=200
augroup END

"" Remember cursor position
augroup vimrc-remember-cursor-position
autocmd!
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
augroup END

"" txt
augroup vimrc-wrapping
autocmd!
autocmd BufRead,BufNewFile *.txt call s:setupWrapping()
augroup END
if !exists('*s:setupWrapping')
function s:setupWrapping()
set wrap
set wm=2
set textwidth=79
endfunction
endif

"" make/cmake
augroup vimrc-make-cmake
autocmd!
autocmd FileType make setlocal noexpandtab
autocmd BufNewFile,BufRead CMakeLists.txt setlocal filetype=cmake
augroup END

"" python
augroup vimrc-python
autocmd!
autocmd FileType python setlocal
\ formatoptions+=croq softtabstop=4
\ cinwords=if,elif,else,for,while,try,except,finally,def,class,with
augroup END

" shortcut leader=Space
"" save
nnoremap <Leader>w :w<CR>
nnoremap <Leader>qqq :q!<CR>
nnoremap <Leader>eee :e<CR>
nnoremap <Leader>wq :wq<CR>
nnoremap <Leader>nn :noh<CR>

"" split
nnoremap <Leader>s :<C-u>split<CR>
nnoremap <Leader>v :<C-u>vsplit<CR>

"" Tabs
nnoremap <Tab> gt
nnoremap <S-Tab> gT
nnoremap <Leader>t :tabnew<CR>

"" ignore wrap
nnoremap j gj
nnoremap k gk
nnoremap <Down> gj
nnoremap <Up> gk

"" Sft + y => yunk to EOL
nnoremap Y y$

"" + => increment
nnoremap + <C-a>

"" - => decrement
nnoremap - <C-x>

"" move 15 words
nmap <silent> <Tab> 15<Right>
nmap <silent> <S-Tab> 15<Left>
nmap <silent> ll 15<Right>
nmap <silent> hh 15<Left>
nmap <silent> jj 15<Down>
nmap <silent> kk 15<Up>

"" pbcopy for OSX copy/paste
vmap <C-x> :!pbcopy<CR>
vmap <C-c> :w !pbcopy<CR><CR>

"" move line/word
nmap <C-e> $
nmap <C-a> 0
nmap <C-f> W
nmap <C-b> B
imap <C-e> <C-o>$
imap <C-a> <C-o>0
imap <C-f> <C-o>W
imap <C-b> <C-o>B

" base
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8
set bomb
set binary
set ttyfast
set backspace=indent,eol,start
set tabstop=4
set softtabstop=0
set shiftwidth=4
set expandtab
set splitright
set splitbelow
set hidden
set hlsearch
set incsearch
set ignorecase
set smartcase
set nobackup
set noswapfile
set fileformats=unix,dos,mac
syntax on
set ruler
set number
set gcr=a:blinkon0
set scrolloff=3
set laststatus=2
set modeline
set modelines=10
set title
set titleold="Terminal"
set titlestring=%F
set statusline=%F%m%r%h%w%=(%{&ff}/%Y)\ (line\ %l\/%L,\ col\ %c)\
set autoread
set noerrorbells visualbell t_vb=
set clipboard+=unnamed,autoselect
set mouse=a
set whichwrap=b,s,h,l,<,>,[,]

" template
augroup templateGroup
autocmd!
autocmd BufNewFile *.html :0r ~/vim-template/t.html
autocmd BufNewFile *.cpp :0r ~/vim-template/t.cpp
autocmd BufNewFile *.py :0r ~/vim-template/t.py
augroup END
" snippet
let g:UltiSnipsSnippetDirectories=["~/vim-snippets/"]


@EqualL2 さん情報

リンターチェックは現在はsyntasticよりも下記のプラグインの方が高性能でした。

ALE

インストールされる際は、下記を追記してください。


~/.vimrc

Plug 'w0rp/ale'


@yoddy さん情報

上記vimrcには、hjklバインドのショートカットを入れております。

そのため、通常hjklを使用されている方には動作不具合となるというお声がいくつかございましたので、同様にお困りの方は下記部分を削除してご使用ください。


~/.vimrc

nmap <silent> ll 15<Right>

nmap <silent> hh 15<Left>
nmap <silent> jj 15<Down>
nmap <silent> kk 15<Up>



vimrcをコピーし終わったら、プラグインのインストール


terminal

cd ~/

vim +PlugInstall +qall
cd .vim/plugged/YouCompleteMe/
/usr/bin/python2.7 ./install.py --all


完了!実際にvimを開いてみましょう。

さぁviコマンドで新しい世界に!

実際に実装されてるコマンド一覧を下記してみました。

長いので、この文をクリックして開いて下さい。



  • Space + dir ⇛ カレントディレクトリのファイルが左に開く。

選択してEnterでファイルが開きます。

選択してTでファイルが別タブに開きます。



  • Space + sh ⇛ カレントディレクトリのターミナルが右側に開く。

ここでプログラムを実際に実行したり、grepしたりgitできます。

grep, gitなどのプラグインもありますが、コマンドを覚えるのが面倒です。

ターミナルを開いた方が楽!



  • Space + go ⇛ vimで開いているファイルを実行して、下画面にログを出す。

C言語やPythonなど、ファイルを開きながらプログラムを実行できちゃうのです。

プログラミングコンテストなどで必須。


  • コメントアウトしたい行をマウスでもビジュアルでも複数選択して、 gcc

自動コメントアウトしてくれます


  • 文章を綺麗に整えたい複数文章を選択して、 ga(整列したい文字)


test.py

a = 2 + 5

aaaa = 2 + 5
aaa = 2 + 5

# ⇑の3行を選択して、ga=と押すと下のように整理される。
a = 2 + 5
aaaa = 2 + 5
aaa = 2 + 5



  • 適当にファイルを開いて、 ./ と書いてみる

ディレクトリの補完が効いてます


  • 適当にファイルを開いて、普通にプログラムを書いたり、変数を入力

プログラム命令の補完、変数の補完が効いてます


  • Space + w ⇛ セーブ。:wと同じです。 


  • Space + qqq ⇛ 強制終了。:q!と同じです。


  • Space + wq ⇛ セーブ終了。:wqと同じです。


  • Space + t ⇛ タブを開く。:tabnewと同じです


  • Shift + y ⇛ 文末までの行をコピー


  • + ⇛ 数字の上でやると、数字が増えていきます。


  • - ⇛ 数字の上でやると、数字が減っていきます。


  • tab(エスケープコードで) ⇛ 15文字ずつ右に移動します。


  • Shift + tab(エスケープコードで) ⇛ 15文字ずつ左に移動します。


  • emacs/bash風移動


Ctl + e ⇛ 文末まで移動

Ctl + a ⇛ 文頭まで移動

Ctl + f ⇛ 一文字後に移動

Ctl + b ⇛ 一文字前に移動



自分にあったテーマを探す

まずvimのテーマは2種類存在します。

以下が、世に出ている全てのテーマが一覧されているサイトです。


ターミナル自体のテーマ

https://github.com/lysyi3m/macos-terminal-themes


Vim自体のテーマ

https://vimcolors.com/

ちなみに私は、sublimeやatomでも有名なayuというのを使っています。

スクリーンショット 2019-04-07 23.14.57.png


まとめ 「vimは最高なんだ・・・vimは最高なんだ・・・」

vimって操作覚えるのも一苦労だと思うんです。

でも、全ての環境で動くのはvimだけなんです。(emacsはテトリス遊ぶ時だけ使う)

それって最強かつ最高のブランドだと思うんですね。

サーバーが死にかけてる時、「ssh接続してもvim使えないから中のファイル見れない・・・」なんて超ダサい

普段からvimという極限状態の環境に慣れる事で、エンジニアのレベルって上がると思うんです。

これを読んで頂いた方も是非、今日からvimmerの仲間になりましょう!

twitterやってます⇛https://twitter.com/klono_ryuta