読者です 読者をやめる 読者になる 読者になる

neovim 入門1

概要

重い腰を上げてneovimの設定をすることにしたので、ログを残していきます。
現在使っているvimの設定はこちら
neovimとvimの設定を共存させることもできるみたいだが、今回はとりあえず設定ファイルは分けることにして一からneovim環境を整える
公式のリポジトリ : https://github.com/neovim/neovim

環境

  • OS : maxOS Sierra

インストール

ソースからビルドとする方法とパッケージを入れる方法があるが今回はパッケージでインストール
どちらの方法も公式のREADMEに書いてある

$brew tap neovim/neovim
$brew install neovim
$which nvim
/usr/local/bin/nvim
$nvim #neovimが起動する

設定

まずはneovimを起動して :h nvimしてヘルプを確認
どうやらneovimのディレクトリ構成はXDG Base Directory Specificationをサポートしているらしい
$XDG_CONFIG_HOMEを設定していないなら ~/.config/nvim にinit.vimを置けば~/.vimrcの代わりになる
設定ファイルを置くべき場所とファイル名がわかったので、早速設定を開始

vimの設定が大体はそのまま使えるみたいなので、vimの設定をもとに設定を作ったのが下記

"init.vim
let g:home = expand('~')
let g:vim_home = g:home .'/.config/nvim'
let g:rc_dir   = g:vim_home . '/rc'

"分割したファイルを読み込み
function s:load_rc(file)
  execute 'source ' . g:rc_dir . '/' . a:file . '.vim'
endfunction

if filereadable(expand(g:rc_dir .  '/settings.vim'))
    call s:load_rc('settings')
endif

if filereadable(expand(g:rc_dir . '/mapping.vim'))
    call s:load_rc('mapping')
endif

if filereadable(expand(g:rc_dir . '/color.vim'))
    call s:load_rc('color')
endif

if filereadable(expand(g:rc_dir . '/filetypes.vim'))
    call s:load_rc('filetypes')
endif
"setting.vim
"------------------------------------------------------------
"検索関係
"------------------------------------------------------------
"{{{
"検索時に大文字・小文字を区別しない。ただし、検索後に大文字小文字が
"混在しているときは区別する
set ignorecase
set smartcase
"検索結果をハイライト表示
set hlsearch
"逐次検索をオン
set incsearch
"Kでカーソル下の単語のhelpを引く
set keywordprg=:help
"}}}


"------------------------------------------------------------
"編集関係
"------------------------------------------------------------
"{{{
"タブ設定
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab
" '<'や'>'でインデントする際に'shiftwidth'の倍数に丸める
set shiftround
"オートインデント
set autoindent
"オートインデント、改行、インサートモード開始直後にバックスペースキーで
"削除できるようにする。
set backspace=indent,eol,start
"検索時にファイルの下まで行ったら上まで戻る
set wrapscan
"閉じ括弧入力時に対応している括弧が画面内にある場合に、一瞬開き括弧にジャンプ
set showmatch
"対応括弧のハイライト表示を0.1秒に
set matchtime=1
"コマンドライン補完を便利に
set wildmenu
"テキスト挿入の自動折り返しに日本語を対応
set formatoptions+=mM
"移動コマンドを使ったとき、行頭に移動しない
set nostartofline
"バッファが変更されているとき、コマンドをエラーにするのでなく、
"保存するかどうか確認を求める
set confirm
"ビジュアルモードで文字の無いところにもカーソル移動を可能に
set virtualedit=block
"キーコードはすぐにタイムアウト
set notimeout
"マッピングは200ms待つ
set ttimeout ttimeoutlen=200
"スワップファイルを作らない
set noswapfile
"バックアップファイルを作らない
set nobackup
"undoファイルを作らない
set noundofile
"クリップボードを他のアプリと共有
set clipboard+=unnamedplus
"対応括弧を追加
set matchpairs& matchpairs+=<:>
"スペルチェック時に日本語を除外
set spelllang=en,cjk
"ファイルを開いた時に,カーソル位置を最後にカーソルがあった位置まで移動
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
"}}}

"------------------------------------------------------------
"表示関係
"------------------------------------------------------------
"{{{
"行番号を表示
set number
"ルーラ表示
set ruler
"タブや改行を非表示
set nolist
"マルチバイト文字の表示をいいかんじに
set ambiwidth=double
"折り返し
set wrap
"長い行も表示
set display=lastline
"ステータスラインを常に表示する
set laststatus=2
"コマンドラインの高さを2行に
set cmdheight=2
"タイプ途中のコマンドを画面最下行に表示
set showcmd
"タイトル表示
set title
"カーソル行を可視化
set cursorline
"ビープの代わりにビジュアルベル(画面フラッシュ)を使う
set visualbell
"ビジュアルベルも無効化する
set t_vb=
"フォールディング設定
set foldmethod=marker
" デフォルト不可視文字は美しくないのでUnicodeで綺麗に
set listchars=tab:»-,trail:-,extends:»,precedes:«,nbsp:%,eol:"カーソルが内行の内容を隠蔽しない
set conceallevel=0
"補完メニューの幅
set pumheight=15
"カーソルの表示を変更
let $NVIM_TUI_ENABLE_CURSOR_SHAPE=2
"}}}
"mapping.vim
"Yの動作をDやCと同じにする
map Y y$
"<ESC>2回で検索後の強調表示を解除する
nnoremap <ESC><ESC> :nohl<CR><C-L>
"j k を表示行移動できるよう変更
nnoremap j gj
nnoremap k gk
" 検索後にジャンプした際に検索単語を画面中央に持ってくる
nnoremap n nzz
nnoremap N Nzz
nnoremap * *zz
nnoremap # #zz
nnoremap g* g*zz
nnoremap g# g#zz
".vimrcを開く
nnoremap ,ev :tabe $HOME/.vimrc<CR>
".vimrcを再読み込み
nnoremap ,rv :source $HOME/.vimrc<CR>
"ヤンクした文字列でカーソル位置の単語を置換
nnoremap <silent> cy  ce<C-r>0<ESC>:let@/=@1<CR>:noh<CR>
vnoremap <silent> cy  c<C-r>0<ESC>:let@/=@1<CR>:noh<CR>
nnoremap <silent> ciy  ciw<C-r>0<ESC>:let@/=@1<CR>:noh<CR>

"ウィンドウ幅の変更
nnoremap + 5<C-W>+
nnoremap _ 5<C-W>-
nnoremap > 5<C-W>>
nnoremap < 5<C-W><
"ウィンドウ移動に使用するのでsの元の機能を削除(ci)
nnoremap s <Nop>
"s + hjkl でウィンドウ間を移動
nnoremap sh <C-w>h
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl <C-w>l
nnoremap sw <C-w>w
"ウィンドウそのものを移動
nnoremap sJ <C-w>J
nnoremap sK <C-w>K
nnoremap sL <C-w>L
nnoremap sH <C-w>H

"次のタブに移動
nnoremap sn  :tabn<CR>
"前のタブに移動
nnoremap sp  :tabp<CR>
"タブの作成
nnoremap st :<C-u>tabnew<CR>

"ビジュアルモードでインデント変更後に再選択
vnoremap <  <gv
vnoremap >  >gv
"インサートモード中でも隣のウィンドウに移動
inoremap <C-W><C-W> <ESC><C-W><C-W><ESC>
"filetypes.vim
"ファイルタイプに関係する設定
augroup filetypeds
    autocmd!
    autocmd BufNewFile,BufRead,BufReadPre *.{md,mkd,mark*} set filetype=markdown
    autocmd BufNewFile,BufRead,BufReadPre *.{json} set filetype=json conceallevel=0
    autocmd InsertEnter *.json setlocal conceallevel=0 concealcursor=
    autocmd InsertLeave *.json setlocal conceallevel=0 concealcursor=inc
    autocmd BufRead,BufNewFile,BufReadPre *.coffee   set filetype=coffee
    autocmd BufRead,BufNewFile *.scss set filetype=scss.css
    autocmd FileType scss set iskeyword+=-
augroup END