vimを教えるのがめんどくさいので、代わりにリンク集を作っておく
一から説明するのは難易度も物量的なコストも非常に高いので、
代わりによさげなリンクを集めておく
あと、学習コスト、設定を煮詰めるコスト共に異様に高いので、正直、VS Codeとかでいいんじゃない?とも思う。
とりあえずチュートリアルぽいの
適当にひろったチュートリアル。まぁこの辺はどれでも
なんでコマンドモードがあるの?って質問への回答
vimは移動や検索が多様なのがポイントだよ、それにはコマンドモードがあるほうが便利なんだよ
っていう感じを伝えてくれる説明。
移動の仕方のもう少し詳しいまとめ
Vimを使いやすく設定する(Plugin無し)
デフォルトはいろいろ使いにくい設定なので、設定ファイルを編集して使いやすくする。
設定ファイルは~/.vimrc
にある(UNIX系の場合)
補足)vimrcのset系の見方
set ~~
でその機能がON。set no~~~
でその機能がOFF
言語に関する設定(必須)
先頭に下記を書いておく
set encoding=utf-8
scriptencoding utf-8
set termencoding=utf-8
set nobomb
set fileencodings=ucs-bom,utf-8,euc-jp,cp932,sjis,iso-2022-jp-3,iso-2022-jp,eucjp-ms,euc-jisx0213
set fileencoding=utf-8 " 保存時の文字コード
set fileformats=unix,dos,mac " 改行コードの自動判別、左側が優先される
見た目の設定
細かい設定が多いのでまとめて
set tw=0 " 自動で改行する画面幅(文字数)。0で改行なし
set wrap " 長い行を折り返して表示。こっちは見た目だけで改行はしない
set nocursorline " カーソル行を強調表示する。highlightで表示内容を変更
set showmatch " 括弧入力時に対応する括弧をフラッシュして表示
set matchtime=3 " 上記のshowmatchの表示秒数を3秒にする
set number " 行番号を表示
set nolist " タブや改行を表示。結構うざいのでnoにしとく
set notitle " タイトルを表示
set scrolloff=0
set cmdheight=2 " コマンドラインの高さ
" 下記4行、ステータスライン強化プラグインを使う場合はあまり触らないようにする
set noruler " ルーラーを表示
"set laststatus=2 " 常にステータス行を表示
"set noshowmode " 現在のモードを表示
"set showcmd " コマンドをステータス行に表示
" キーワードで色を変える
if has('syntax')
syntax enable
endif
インデントの設定
とりあえずこの辺設定しとく
set expandtab " タブをスペースに展開する
set tabstop=4 " タブの画面上での幅
set softtabstop=4 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set shiftwidth=4 " smartindentで増減する幅
set autoindent " 自動的にインデントする
set smartindent " 改行時に前の行の構文をチェックし次の行のインデントを増減する
set smarttab "新しい行を作った時に高度な自動インデントを行う
set backspace=indent,eol,start " バックスペースでインデントや改行を削除できるようにする
nnoremap <Leader>f :set foldmethod=indent<CR>
検索の設定
検索は基本/検索したい文字<CR>
。次検索はn
前検索はp
set incsearch " インクリメンタルサーチ. 1文字入力毎に検索を行う
set ignorecase " 検索パターンに大文字小文字を無視
set smartcase " 大文字小文字の両方が含まれている場合は大文字小文字を区別
set hlsearch " 検索結果をハイライト
" Leader+ESCキーでハイライトの切り替え
nnoremap <Leader><Esc> :<C-u>set nohlsearch!<CR>
set wrapscan " 検索時にファイルの最後まで行ったら最初に戻る
関数の定義元とかにジャンプしたい
ctagsでtagsファイル作る。あとは<C-]>
でジャンプ、<C-t>
で戻る
もう少し詳しい説明
universal-ctags公式:universal-ctags/ctags: A maintained ctags implementation
Windows版のバイナリ:universal-ctags/ctags-win32: Universal Ctags Win32 daily builds
画面を分割したい
<C-w>v
で縦分割
<C-w>s
で横分割
入れ子もOK
より詳しい説明
Vim のウィンドウ分割機能 - Vim のブログ
ターミナルでコマンド打ったり結果みながら作業したい
:term
でvim内でターミナルが起動する
ssh等のリモート接続を切断しても編集状態をそのままにしたい
vim単独では無理。ターミナル上でtmux
を起動し、そのうえでvim
を起動すればそれっぽくなる
tmuxを使い始めたので基本的な機能の使い方とかを整理してみた - 完熟トマト
PCごとに設定するのがめんどくさい
gitに.vimrc
おいて、それを落とすようにする
文中の全角スペースを表示して欲しい
下記をvimrcに追記
" 全角スペースの表示
function! ZenkakuSpace()
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=grey
endfunction
if has('syntax')
augroup ZenkakuSpace
autocmd!
autocmd ColorScheme * call ZenkakuSpace()
autocmd VimEnter,WinEnter,BufRead * let w:m1=matchadd('ZenkakuSpace', ' ')
augroup END
call ZenkakuSpace()
endif
補足)vimrcでのショートカットキー設定の見方
設定例のところどころでキー設定も行っているが、その補足。
vimrc
のショートカットキー設定はnmap
等のmap
系のコマンドで始まるので
その行を見れば、どのキーに何の機能を割り当てたのかがわかる。
下記のように書かれていればcontrolとkを同時押し
で~~~~
に書かれている機能が実行される、という意味。
<silent>
はひとまず無視しておいていい。無い場合もある。
nmap <silent> <C-k> ~~~~
<leader>
は「これを押したらショートカットの開始」という意味のキーで、ユーザーが任意に設定できる
下記の場合だと、「リーダーに設定したキー押して、それからxを押す」という意味。
nmap <silent> <Leader>x ~~~~
リーダーの設定例。上がスペースで下がコンマの場合。使いやすいものをお好みで設定。
let mapleader = "\<Space>"
let mapleader = ","
Pluginを使って、Vimを使いやすくする
機能拡張のプラグインを使って使いやすくする。
機能とプラグインのピックアップ基準は手元の自分のvimrcに記載があるもの。
以降、プラグインマネージャーとして
junegunn/vim-plug: Minimalist Vim Plugin Manager
使っている場合
デフォルトよりましな色合いにしたい
一例。vim カラースキーム
で検索したら色々でてくる
Plug 'rhysd/vim-color-spring-night'
colorscheme spring-night
gitの差分を行単位で目印して欲しい
airblade/vim-gitgutter
使う。詳細は下記。
Vimメモ : vim-gitgutterで差分を左端に表示する - もた日記
Plug 'airblade/vim-gitgutter'
" 目印行を常に表示する
if exists('&signcolumn') " Vim 7.4.2201
set signcolumn=yes
else
let g:gitgutter_sign_column_always = 1
endif
git周りを便利にしたい
tpope/vim-fugitive
を使う。
ステータスラインにブランチ名を表示する場合は次項のlightline.vim
の設定する。
詳しい使い方は下記。
VimmerなGit使いはfugitive.vimを今すぐ入れたほうがいい - SELECT * FROM life;
Plug 'tpope/vim-fugitive'
" vim-fugitive: Gitを便利に使う
" grep検索の実行後にQuickFix Listを表示する
autocmd QuickFixCmdPost *grep* cwindow
" コマンドをキー登録
nnoremap <silent> <Leader>g :Gstatus<CR>
nnoremap <silent> <Leader>d :Gdiff<CR>
nnoremap <silent> <Leader>b :Gblame<CR>
ステータスラインに色々情報を表示したい
itchyny/lightline.vim
を使う
公式:itchyny/lightline.vim: A light and configurable statusline/tabline plugin for Vim
Plug 'itchyny/lightline.vim' " ステータスラインの表示強化
set laststatus=2 " ステータスラインを常に表示
set noshowmode " 現在のモードを表示
set showcmd " 打ったコマンドをステータスラインの下に表示
set ruler " ステータスラインの右側にカーソルの現在位置を表示する
" let g:lightline = { 'colorscheme': 'wombat' }
" let g:lightline = { 'colorscheme': 'powerline' }
let g:lightline = {
\ 'colorscheme': 'powerline',
\ 'active': {
\ 'left': [ [ 'mode', 'paste' ],
\ [ 'gitbranch', 'readonly', 'filename', 'modified' ] ]
\ },
\ 'component_function': {
\ 'gitbranch': 'fugitive#head'
\ },
\ }
書式チェック(linter)と修正(fixer)を自動でして欲しい
w0rp/ale
使う
公式:dense-analysis/ale: Check syntax in Vim asynchronously and fix files, with Language Server Protocol (LSP) support
下記はpythonの例。
参考:ALE(on NeoVim)でPythonコードを楽に整形する - Qiita
Plug 'w0rp/ale'
" ファイル保存時にLinterを実行する
"let g:ale_lint_on_save = 1
" テキスト変更時にはLinterを実行しない
let g:ale_lint_on_text_changed = 'never'
" Linter(コードチェックツール)の設定
let g:ale_linters = {
\ 'python': ['flake8', 'mypy'],
\ }
" ファイル保存時にはFixerを実行しない
let g:ale_fix_on_save = 0
" テキスト変更時にはFixerを実行しない
let g:ale_fix_on_text_changed = 'never'
" Fixer(コード整形ツール)の設定
let g:ale_fixers = {
\ 'python': ['autopep8', 'black', 'isort'],
\ }
" 余分な空白があるときは警告表示
let b:ale_warn_about_trailing_whitespace = 0
" ALE実行時にでる目印行を常に表示
let g:ale_sign_column_always = 1
" Leader + l で表示非表示の切り替え
nmap <silent> <Leader>l :ALEToggle<CR>
" Leader + x でfixerの実行
nmap <silent> <Leader>x <Plug>(ale_fix)
" Ctrl + j/k でエラー行を移動する
nmap <silent> <C-k> <Plug>(ale_previous_wrap)
nmap <silent> <C-j> <Plug>(ale_next_wrap)
ctagsを自動で実行して欲しい
soramugi/auto-ctags.vim
使う。ファイル保存時に自動で実行してくれる。
Plug 'soramugi/auto-ctags.vim'
" Ctags auto-execution
let g:auto_ctags = 1
ファイル選択をツリーでしたい
scrooloose/nerdtree
を使う。
Plug 'scrooloose/nerdtree'
let NERDTreeShowHidden = 0 " 隠しファイルを表示しない(Iで切り替え)
nmap <silent> <Leader>n :NERDTreeToggle<CR>
ファイルの切り替えを素早くしたい
Shougo/unite.vim
を使う。
常用セットを覚えるだけでも随分違う
(キーはLeaderにアサインしたキー2連打がいい感じ使える)
Plug 'Shougo/unite.vim' " ファイルオープンを便利に
Plug 'Shougo/neomru.vim' " Unite.vimで最近使ったファイルを表示できるようにする
" 常用セット
nnoremap <Leader>, :Unite buffer file_mru<CR>
" バッファ一覧
nnoremap <Leader>ub :Unite buffer<CR>
" ファイル一覧
nnoremap <Leader>uf :UniteWithBufferDir -buffer-name=files file<CR>
" レジスタ一覧
nnoremap <Leader>ur :Unite -buffer-name=register register<CR>
" 最近使用したファイル一覧
nnoremap <Leader>um :Unite file_mru<CR>
" 全部乗せ
nnoremap <Leader>ua :UniteWithBufferDir -buffer-name=files buffer file_mru bookmark file<CR>
" sourcesを「今開いているファイルのディレクトリ」とする
noremap :uff :<C-u>UniteWithBufferDir file -buffer-name=file<CR>
"" ウィンドウを分割して開く
au FileType unite nnoremap <silent> <buffer> <expr> <C-J> unite#do_action('split')
au FileType unite inoremap <silent> <buffer> <expr> <C-J> unite#do_action('split')
"" ウィンドウを縦に分割して開く
au FileType unite nnoremap <silent> <buffer> <expr> <C-K> unite#do_action('vsplit')
au FileType unite inoremap <silent> <buffer> <expr> <C-K> unite#do_action('vsplit')
末尾の半角スペース表示して欲しい
bronson/vim-trailing-whitespace
を使う
Plug 'bronson/vim-trailing-whitespace' " 行末の半角スペースを可視化
インデントを視覚化して欲しい
Yggdroot/indentLine
使う。concealで非表示にされる項目があったりするので注意。様子見ながらつかう。
公式:Yggdroot/indentLine: A vim plugin to display the indention levels with thin vertical lines
Plug 'Yggdroot/indentLine'
"let g:indentLine_char_list = ['|', '¦', '┆', '┊']
"let g:indentLine_char_list = ['¦', '┆', '┊']
let g:indentLine_char = '|'
let g:indentLine_showFirstIndentLevel = 1
let g:indentLine_color_term = 244
let g:indentLine_color_gui = '#708090'
let g:indentLine_fileTypeExclude = [
\ 'markdown', 'help', 'nerdtree', 'calendar', 'thumbnail', 'tweetvim']
markdownのテーブルの整形とかしたい
たとえばmarkdownでテーブル書いてる場合とかに見た目を整形したい場合、
junegunn/vim-easy-align
使う。
基本的な使い方は、整形したい文字を選択してga*|
。最後の|
は区切り文字。
より詳しい説明
vim-easy-alignでvimmerへの道を極めよう - Qiita
Plug 'junegunn/vim-easy-align'
" 使い方:`gaip#` or `vipga#` `#`は区切り文字
" Start interactive EasyAlign in visual mode (e.g. vipga)
xmap ga <Plug>(EasyAlign)
" Start interactive EasyAlign for a motion/text object (e.g. gaip)
nmap ga <Plug>(EasyAlign)