vim超入門まとめ[.vimrcの例]

# はじめに
私自身vimを使い始めたのは最近のことですので、詳しい方からしたら今更感のあるものとなってしまうと思います。
また、見様見真似で覚えたことが多いので、粗もあるかと思います。ここはこうした方がよいなどございましたら更新していくつもりですので、コメントいただけると幸いです。

# vimとは
テキストエディタの一つで、ターミナル上で動作する。

## vimを使い始めたきっかけ
Ubuntuを使い始めたこと

## vimの利点[主観]
・ターミナル上で動作するため、ssh接続でテキスト編集ができる。
・キーボードのみで操作可能なので、ターミナル操作からの流れでキーボードから手を話すことなく作業が可能。
・コピー＆ペーストが素早く、自分のソースコードを再利用したりオープンソースを活用しやすい。
・`.vimrc`というファイルによって簡単に設定ができる。

## vimの欠点[主観]
・メモ帳のイメージで使用するととてつもなく不便。
・コマンドを覚えるまでのハードルが（少し）高い。
・vim以外のテキストエディタを使えなくなる。（笑）

# vim入門
## 1.基本操作
・基本的な移動は←↓↑→の順に`h`,`j`,`k`,`l`
・`i`を押すとインサートモード。ここではメモ帳のようにテキスト編集可能。移動は十字キー
・`Esc`を押すとノーマルモードに戻る
・`:w`で保存
・`:q`でvimを閉じる
・`:wq`で保存して終了

## 2.カット＆ヤンク＆ペースト
### １行

|コマンド|動作|
|---:|---:|
|dd|カット|
|yy|ヤンク|
|p|ペースト|

### n行　（コマンドのnには任意の数字を入れてください）

|コマンド|動作|
|---:|---:|
|ndd|カット|
|nyy|ヤンク|
|p|ペースト|

### ビジュアルモード
視覚的に見ながら複数選択ができるモード

wordでいうところの、`Shift`キーを押したまま矢印キーを押すもの。
マウスで左を押したままカーソルを移動するもの。

・`v`でビジュアルモードに移行
・ノーマルモードと同じ移動ができる
・選択中に`y`でヤンク、`d`でカット、自動でノーマルモードに戻るのでそのまま`p`でペーストできる
・`Esc`でノーマルモードに戻ることができる

このとき、よく使うのが`ggvGy`で、これは`一番上から一番下までヤンク`という意味です。`:%y`もほぼ同じですが、こちらの方が打ちやすく個人的には好きです。このとき、最後の行の１文字目までしか選択してくれないことには注意してください。
→コメントで教えていただいたのですが、`ggVGy`ですべてヤンクできます。

## 3.他のファイルからヤンク＆ペースト
ここまで、コピーやペーストのやり方を記してきましたが、別でvimを起動すると貼り付けることができません。
そこで、vim上で他のファイルを開く必要があります。

### vimを分割
そのまま別ファイルを開いても構いませんが、vimを分割した方が使いやすいです。

|コマンド|動作|
|---:|:---|
|:split|縦に一つタブを作成して同一ファイルを開く|
|:vsplit|横に一つタブを作成して同一ファイルを開く|
|:new|縦に分割して新規ファイルを開く|
|:vnew|横に分割して新規ファイルを開く|

分割したタブへ移動したい時は`Ctrl+w w`、`Ctrl+w h`、`Ctrl+w j`、`Ctrl+w k`、`Ctrl+w l`で移動できます。
分割したタブを閉じたい時は`:q`で閉じることができます。変更を加えていた場合は`:wq`となります。

### 別ファイルを開く
- `:vnew filename`で指定したファイルを開く
- `:new filename`でファイルを開く
- `:open filename`でファイルを開く
- `:open path/to/filename`で別ディレクトリのファイルを開ける

このとき、開きたいファイル名やパスがわからない時は`:open .`のようにするとフォルダの中身の一覧が見られるし、ディレクトリ移動もできます。

## 4.`.vimrc`について
`.vimrc`とはvimを設定するファイルのことです。基本的にはホームディレクトリに置きます。ドットがついているので`$ ls`をした時には表示されないので邪魔にはならないので心配しないでください。もしあるか不安なら`$ ls -a`で存在を確認できます。

### `.vimrc`の例
私が現在使用しているものです。他の方のものを見て好きなものを抜き出しているので、パクリがあるかもしれません。何かあれば消させていただきますので、ご指摘ください。

```.vimrc
set encoding=utf-8
scriptencoding utf-8

syntax on
" タブ入力を複数の空白入力に置き換える
set expandtab
" 画面上でタブ文字が占める幅
set tabstop=2
" 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set softtabstop=2
" 改行時に前の行のインデントを継続する
set autoindent
" 改行時に前の行の構文をチェックし次の行のインデントを増減する
set smartindent
" smartindentで増減する幅
set shiftwidth=2
" 行を表示
set number
" 自動コメントアウト無効
augroup auto_comment_off
  autocmd!
  autocmd BufEnter * setlocal formatoptions-=r
  autocmd BufEnter * setlocal formatoptions-=o
" 終了時に余計な空白を削除する
autocmd BufWritePre * :%s/\s\+$//ge

if has("autocmd")
  " ファイルタイプの検索を有効にする
  filetype plugin on
  " ファイルタイプに合わせたインデントを利用
  filetype indent on
  " sw=softtabstop, sts=shiftwidth, ts=tabstop, et=expandtab
  autocmd FileType c           setlocal sw=2 sts=2 ts=2 et
  autocmd FileType html        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType ruby        setlocal sw=2 sts=2 ts=2 et
  autocmd FileType js          setlocal sw=4 sts=4 ts=4 et
  autocmd FileType zsh         setlocal sw=4 sts=4 ts=4 et
  autocmd FileType python      setlocal sw=4 sts=4 ts=4 et
  autocmd FileType scala       setlocal sw=4 sts=4 ts=4 et
  autocmd FileType json        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType html        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType css         setlocal sw=4 sts=4 ts=4 et
  autocmd FileType scss        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType sass        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType javascript  setlocal sw=4 sts=4 ts=4 et
endif

" インクリメンタルサーチ（1文字入力ごとに検索する）
set incsearch
" 検索パターンに大文字小文字を区別しない
set ignorecase
" 検索パターンに大文字を含んでいたら大文字小文字を区別する
set smartcase
" 検索結果をハイライト
set hlsearch
" Escキー2度押しでハイライトの切り替え
nnoremap <silent><Esc><Esc> :<C-u>set nohlsearch!<CR>
" 行が折り返し表示されていた場合、行単位ではなく表示行単位でカーソル移動
nnoremap j gj
nnoremap k gk
nnoremap <down> gj
nnoremap <up> gk

" コマンドモードの補完
set wildmenu
" 保存するコマンド履歴の数
set history=5000

" マウスの有効化（カーソル移動・スクロール移動）
if has('mouse')
  set mouse=a
  if has('mouse_sgr')
    set ttymouse=sgr
  elseif v:version > 703 || v:version is 703 && has('patch632')
    set ttymouse=sgr
  else
    set ttymouse=xterm2
  endif
endif

" ペースト設定（クリップボードからコピーする際の自動インデント無効化）
if &term =~ "xterm"
  let &t_SI .= "\e[?2004h"
  let &t_EI .= "\e[?2004l"
  let &pastetoggle = "\e[201~"

  function XTermPasteBegin(ret)
    set paste
    return a:ret
  endfunction

  inoremap <special> <expr> <Esc>[200~ XTermPasteBegin{""}
  endif

" 自己流ショートカット
" Pythonについて
" Ctrl+iで１行コメントアウト
autocmd BufNewFile,BufRead *.py nnoremap <C-i> <Home>i#<Esc>
" Ctrl+sで１行アンコメントアウト
autocmd BufNewFile,BufRead *.py nnoremap <C-s> <Home>x<Esc>
" Ctrl+eでスクリプト実行
autocmd BufNewFile,BufRead *.py nnoremap <C-e> :terminal python %
" C++について
" Ctrl+iで１行コメントアウト
autocmd BufNewFile,BufRead *.cpp nnoremap <C-i> <Home>i//<Esc>
" Ctrl+sで１行アンコメントアウト
autocmd BufNewFile,BufRead *.cpp nnoremap <C-s> <Home>xx<Esc>
" Ctrl+bでmakeコマンド実行
autocmd BufNewFile,BufRead *.cpp nnoremap <C-b> :make
" Ctrl+bでmake runコマンド実行
autocmd BufNewFile,BufRead *.cpp nnoremap <C-e> :make run
" 空白行を追加するがノーマルモードを維持，上に空行挿入が使えなくなることに注意
nnoremap <S-o> o<Esc>


" カーソルの左右移動で行末から次の行への移動を可能にする
set whichwrap=b,s,h,l,<,>,[,],~
" カーソルラインをハイライト
color desert
set cursorline
" カレント行ハイライトを下線の代わりに文字強調にする
hi CursorLine term=bold cterm=bold guibg=Grey40

nnoremap x "_x
vnoremap x "_x
nnoremap X "_X
vnoremap X "_X
nnoremap s "_s
vnoremap s "_s

" BackSpaceを有効化
set backspace=indent,eol,start
" ヤンクとクリップボードを共有
set clipboard=unnamed,autoselect
```
`~/`以外に置きたい場合は、任意の場所に`.vimrc`を置いて、開き方を`$ vim -u path/to/.vimrc filename`とするとできます。

## 5.ここまでくればもうvimの良さに気がつくと思います！

#　おまけ
## その他のコマンド
先程は、触れやすくするために似たような動作をするコマンドを省略しましたので、それらを少しだけ紹介しておきます。

### コピー系
|コマンド|動作|
|---:|---:|
|:set number|行番号を表示|
|:n,m y|n行からm行までヤンク|
|:n,m d|n行からm行までカット|
|ｎp|ｎ個ペースト|

### 移動系
|コマンド|動作|
|---:|---:|
|Ctrl+d|半ページダウン|
|Ctrl+u|半ページアップ|
|Ctrl+f|１ページダウン|
|Ctrl+b|１ページアップ|
|zz|カーソル行を中心|
|zt|カーソル行を一番上|

### 検索＆置換系
|コマンド|動作|
|---:|---:|
|/name|nameという文字列を検索|
|:s/before/after|カレント行の先頭のbeforeをafterに置換|
|:s/before/after/g|カレント行のすべてのbeforeをafterに置換|
|n|検索結果を次へ|
|Shift+n|検索結果を前へ|

### 矩形選択モード
一斉に字下げする際に重宝します。
・`Ctrl+v`で矩形選択モードに移行
・`$`で長さの違う行をすべて選択
・`y`でヤンク、`d`でカット
・`Esc`でノーマルモードに戻る