init.vim を晒す

vim の `hjkl` って左から順に `←↓↑→` ですね。DanceDanceRevolution[^1] と同じですね！
使い始めの頃から特に迷わなかった理由が判明しました。

小話はさておき、neovim に移行してしばらく経ったので init.vim を晒しておく。

`init.vim` 全体は後ろの方に記載。

nvim の `init.vim` は普通にインストールしていれば `~/.config/nvim/init.vim` にあるはず。

## 使用イメージ

以下の操作を行った時の録画。

- ファイルを開いて、関連ファイルを隣に開く
- README.md のコマンドを実行する

タブ・ウインドウ分割とターミナルモードの使用感がこんな感じになる。

![nvim_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740774/203363d2-30df-807e-c15e-9769c169a535.gif)

詳細な動きとしては

- nvim を開く
    - ファイルツリーからファイルを開く
    - 画面分割
    - 右側に関連ファイルを開く
    - 適当に文字列を検索
    - 右側でも検索
- タブを増やす
    - README を開く
    - ターミナルを出してディレクトリ移動
    - README を開く
    - コマンドをコピペして実行

をやっている。

## お気に入りポイント

タブとウィンドウ分割を多用するので、`<space> + h/j/k/l` でウィンドウ移動、
`<space> + y/u/i/o` でタブ操作ができるようにしている。

以前は `<space> + h/j/k/l` でウィンドウ移動だけ設定していたが、
「指を一個上にしたらタブ移動になると嬉しいな」でタブ操作のリマップを増やした。とても快適。

ウィンドウ分割は `:vs` と `:sp` で、もともと短いのでそのまま使用。

### その他便利設定

よくある設定

- `<leader>` キーを設定する
  - `<space>` に設定している
- ターミナルモードから `<esc>` でノーマルモードに戻れるようにする
  - デフォルトのコマンドはなんであんなに複雑なんだろうか
- コメントアウトのリマップ (プラグインの機能)
  - 他のエディタだと `ctrl + /` が多いので、それに近い `<leader> + /` に設定。
  - ただし、一行でもビジュアルモードで選択が必要。

その他には、`<space> + v` でタブ文字を探しやすくしたり、
全角スペースを色付けしたり、業務上ちょっと必要だったバイナリ編集用のコマンドとかを
入れたりしている。

最近知ったが、環境変数が使える。

### お気に入りポイント抜粋

```vim
" ウィンドウ移動
nnoremap <leader>h <c-w>h
nnoremap <leader>j <c-w>j
nnoremap <leader>k <c-w>k
nnoremap <leader>l <c-w>l

" タブ移動
nnoremap <leader>y gT
nnoremap <leader>o gt
nnoremap <leader>i :tabnew<enter>
nnoremap <leader>u :-tabnew<enter>

" プラグイン関係
nnoremap <leader>n :NvimTreeToggle<enter>
map <leader>/ gc

" 保存
nnoremap <leader>s :w<enter>

" ターミナルモード設定
command! -nargs=* Term split | terminal <args>
nnoremap <leader>t :Term<enter>
tnoremap <Esc> <c-\><c-n>
```

## lua ファイルでの設定について

vim の設定ファイルが `.vimrc` で、nvim では `init.vim` になるが、nvim では
lua 言語がサポートされていて `init.lua` で設定することもできる。

.vim から .lua を読み込むことも、 .lua で vim コマンドを使うこともできるので、無理やり変換する必要はない。

筆者は init.vim を .vimrc からほぼそのまま移行して、一部のプラグインだけ lua ファイルで設定している。

init.vim から .vimrc を呼び出して vim と neovim の設定を共通化することもできるが、vim は素のままにしておくことにした。

## init.vim 全体

```vim
syntax on
filetype plugin indent on
set autoindent
set expandtab
set tabstop=4
set softtabstop=4
set shiftwidth=4
set backspace=2
set belloff=all
set listchars=eol:$,tab:>.,trail:_
set mouse=
" set number
" set list
" set bin noeol
" set ambiwidth=double

" let g:loaded_netrw = 1
" let g:loaded_netrwPlugin = 1

scriptencoding utf-8

" packer settings
luafile ~/.config/nvim/plugins/packer.lua

" load plugin settings
luafile ~/.config/nvim/plugins/settings/nvim-tree.lua

let mapleader="\<space>"
nnoremap U <c-r>

nnoremap H ^
nnoremap J 10j
nnoremap K 10k
nnoremap L $
vnoremap H ^
vnoremap J 10j
vnoremap K 10k
vnoremap L $

nnoremap <leader>h <c-w>h
nnoremap <leader>j <c-w>j
nnoremap <leader>k <c-w>k
nnoremap <leader>l <c-w>l

nnoremap <leader>y gT
nnoremap <leader>o gt
nnoremap <leader>i :tabnew<enter>
nnoremap <leader>u :-tabnew<enter>

nnoremap <leader>J :vs<enter>
nnoremap <leader>L :sp<enter>
nnoremap <leader>wh <c-w><
nnoremap <leader>wj <c-w>-
nnoremap <leader>wk <c-w>+
nnoremap <leader>wl <c-w>>
nnoremap <leader>ww <c-w>=

nnoremap <leader>s :w<enter>
nnoremap <c-s> :w<enter>
nnoremap <leader>n :NvimTreeToggle<enter>
map <leader>/ gc

nnoremap <leader>v :set fileformat=unix<enter>:set list!<enter>
nnoremap <leader>x :%!xxd
" nnoremap <leader>X :%!xxd -r
nnoremap <leader>z zi

" terminal settings
command! -nargs=* Term split | terminal <args>
nnoremap <leader>t :Term<enter>
tnoremap <Esc> <c-\><c-n>

" TIPS: command to replace with check: :%s/<object>/<target>/gc

" for tqdm in python. (vim version >= 8.2)
call setcellwidths([[0x2588, 0x258f, 1]])

" plugins

" ale
let g:ale_sign_column_always = 0
let g:ale_lint_on_text_changed = 'never'
let g:ale_lint_on_insert_leave = 0
let g:ale_lint_on_enter = 0

" github copilot
" let g:copilot_node_command = '/home/ubuntu/.asdf/shims/node'
let g:copilot_proxy = $HTTP_PROXY
let g:copilot_filetypes = {
    \ '*': v:true,
    \ }

" settings for vscode-neovim
if exists('g:vscode')
    let g:copilot_filetypes = {
        \ '*': v:false,
        \ }
else
    " orginary neovim
endif

" each setting for filetype could be moved to another file.
augroup fileTypeIndent
    autocmd!
    autocmd BufNewFile,BufRead *.yaml setlocal tabstop=2 softtabstop=2 shiftwidth=2 foldmethod=indent
    autocmd BufNewFile,BufRead *.yml setlocal tabstop=2 softtabstop=2 shiftwidth=2 foldmethod=indent
    autocmd BufNewFile,BufRead *.sh setlocal tabstop=2 softtabstop=2 shiftwidth=2 foldmethod=indent
    autocmd BufNewFile,BufRead *.ts setlocal tabstop=2 softtabstop=2 shiftwidth=2
    autocmd BufNewFile,BufRead *.tf set filetype=terraform
    autocmd BufNewFile,BufRead *.sql setlocal filetype=sql commentstring=--\ %s
augroup END

" colorize ideographic space
augroup highlightIdegraphicSpace
    autocmd!
    autocmd Colorscheme * highlight IdeographicSpace term=underline ctermbg=DarkGreen guibg=DarkGreen
    autocmd VimEnter,WinEnter * match IdeographicSpace /　/
augroup END

colorscheme desert
```

### packer.lua

ついでにプラグインマネージャー `packer` の設定も。こちらはあまりカスタマイズしていない。

```lua
local ensure_packer = function()
  local fn = vim.fn
  local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim'
  if fn.empty(fn.glob(install_path)) > 0 then
    fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path})
    vim.cmd [[packadd packer.nvim]]
    return true
  end
  return false
end

local packer_bootstrap = ensure_packer()

return require('packer').startup(function(use)
  use 'wbthomason/packer.nvim'
  use 'tpope/vim-commentary'
  use 'tpope/vim-fugitive'
  use 'dense-analysis/ale'
  use 'github/copilot.vim'
  use 'hashivim/vim-terraform'
  use {
      'nvim-tree/nvim-tree.lua',
      requires = 'nvim-tree/nvim-web-devicons',
      wants = 'nvim-web-devicons',
      config = function()
          require('nvim-web-devicons').setup {}
          require('nvim-tree').setup({
          })
      end
  }

  -- Automatically set up your configuration after cloning packer.nvim
  -- Put this at the end after all plugins
  if packer_bootstrap then
    require('packer').sync()
  end
end)
```

[^1]: 通称DDR またはダンレボ。1999年に一世を風靡した、リズムに合わせてパネルを踏むアーケードゲーム。