『なる』
今や、速度的にもSublimeに負けてるvim。
『あ、vimmerなんですね(格好付けw)』と笑われる時代になってしまいました。
ずっと仲間だったvimmerも軒並みsublimeか、高機能のvscodeに浮気してる始末。
寂しかった僕は『じゃあvscode並のvimにすればいいじゃん』と思いました。
去っていったvimmerも唸るvimにする為に・・・!
今回は、4年かけて自分が完成したと思い込んでいるvimを、
初心者の方でもコピペ3分で作っていきます。
※中央上がエディタ画面、左がディレクトリツリー、右上がターミナル、下がエディタで開いてる機械学習ファイルの実行ログ。全てvimで出してます。
今回は以下の内容を紹介していきます。
- インサートモードでもマウスでコピーアンドペースト
- ファイルのツリー表示
- 16言語の補完(ディレクトリ補完も有)
- vim画面でプログラム実行/出力
- vim画面でシェルを開く
- 各種便利ショートカット
- 覚えづらいコマンドのショートカット化
まずは必要なライブラリのインストール
brew update
brew install vim python cmake go mono node rust
vimrcをコピー
vimのカスタマイズは~/.vimrc内に書き込めます。
vi ~/.vimrcで開いて、下のコードをコピーしましょう。
313行あるので、この文をクリックして開いて下さい。
" 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'))"" space + ne -> sidebar
Plug 'scrooloose/nerdtree'
Plug 'jistr/vim-nerdtree-tabs'"" ga -> align
Plug 'junegunn/vim-easy-align'"" space + go -> 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'"" 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'
call plug#end()
filetype plugin indent on
let mapleader="\<Space>""" youcompleteme
let g:ycm_server_python_interpreter ='/usr/bin/python2.7'let g:ycm_python_binary_path ='/usr/bin/python2.7'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>']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
"" 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
"" 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
"" quickrun
nnoremap <Leader>go :QuickRun<CR>
let g:quickrun_config={'*': {'split': ''}}"" 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,<,>,[,]
highlight Pmenu ctermbg=233 ctermfg=241
highlight PmenuSel ctermbg=233 ctermfg=166
highlight Search ctermbg=166 ctermfg=233
highlight Visual ctermbg=166 ctermfg=233
vimrcをコピーし終わったら、プラグインのインストール
cd ~/
vim +PlugInstall +qall
cd .vim/plugged/YouCompleteMe/
/usr/bin/python2.7 ./install.py --all
完了!実際にvimを開いてみましょう。
さぁviコマンドで新しい世界に! 選択してEnterでファイルが開きます。 ここでプログラムを実際に実行したり、grepしたりgitできます。 C言語やPythonなど、ファイルを開きながらプログラムを実行できちゃうのです。 自動コメントアウトしてくれます ディレクトリの補完が効いてます プログラム命令の補完、変数の補完が効いてます Space + w⇛ セーブ。:wと同じです。 Space + qqq⇛ 強制終了。:q!と同じです。 Space + wq⇛ セーブ終了。:wqと同じです。 Space + t⇛ タブを開く。:tabnewと同じです Shift + y⇛ 文末までの行をコピー +⇛ 数字の上でやると、数字が増えていきます。 -⇛ 数字の上でやると、数字が減っていきます。 tab(エスケープコードで)⇛ 15文字ずつ右に移動します。 Shift + tab(エスケープコードで)⇛ 15文字ずつ左に移動します。 emacs/bash風移動 Ctl + e ⇛ 文末まで移動
実際に実装されてるコマンド一覧を下記してみました。長いので、この文をクリックして開いて下さい。
* Space + dir⇛ カレントディレクトリのファイルが左に開く。
選択してTでファイルが別タブに開きます。
grep, gitなどのプラグインもありますが、コマンドを覚えるのが面倒です。
ターミナルを開いた方が楽!
プログラミングコンテストなどで必須。a=2+5aaaa=2+5aaa=2+5# ⇑の3行を選択して、ga=と押すと下のように整理される。a=2+5aaaa=2+5aaa=2+5
Ctl + a ⇛ 文頭まで移動
Ctl + f ⇛ 一文字後に移動
Ctl + b ⇛ 一文字前に移動
自分にあったテーマを探す
まずvimのテーマは2種類存在します。
以下が、世に出ている全てのテーマが一覧されているサイトです。
ターミナル自体のテーマ
https://github.com/lysyi3m/macos-terminal-themes
Vim自体のテーマ
ちなみに私は、sublimeやatomでも有名なayuというのを使っています。
まとめ 「vimは最高なんだ・・・vimは最高なんだ・・・」
vimって操作覚えるのも一苦労だと思うんです。
でも、全ての環境で動くのはvimだけなんです。(emacsはテトリス遊ぶ時だけ使う)
それって最強かつ最高のブランドだと思うんですね。
『サーバーが死にかけてる時、「ssh接続してもvim使えないから中のファイル見れない・・・」なんて超ダサい』
普段からvimという極限状態の環境に慣れる事で、エンジニアのレベルって上がると思うんです。
これを読んで頂いた方も是非、今日からvimmerの仲間になりましょう!
twitterやってます⇛https://twitter.com/klono_ryuta