Edited at

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


はじめに

私自身vimを使い始めたのは最近のことですので、詳しい方からしたら今更感のあるものとなってしまうと思います。

また、見様見真似で覚えたことが多いので、粗もあるかと思います。ここはこうした方がよいなどございましたら更新していくつもりですので、コメントいただけると幸いです。


vimとは

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


vimを使い始めたきっかけ

Ubuntuを使い始めたこと


vimの利点[主観]

・ターミナル上で動作するため、ssh接続でテキスト編集ができる。

・キーボードのみで操作可能なので、ターミナル操作からの流れでキーボードから手を話すことなく作業が可能。

・コピー&ペーストが素早く、自分のソースコードを再利用したりオープンソースを活用しやすい。

.vimrcというファイルによって簡単に設定ができる。


vimの欠点[主観]

・メモ帳のイメージで使用するととてつもなく不便。

・コマンドを覚えるまでのハードルが(少し)高い。

・vim以外のテキストエディタを使えなくなる。(笑)


vim入門


1.基本操作

・基本的な移動は←↓↑→の順にh,j,k,l

iを押すとインサートモード。ここではメモ帳のようにテキスト編集可能。移動は十字キー

Escを押すとノーマルモードに戻る

:wで保存

:qでvimを閉じる

:wqで保存して終了


2.カット&ヤンク&ペースト


1行

コマンド
動作

dd
カット

yy
ヤンク

p
ペースト


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

コマンド
動作

ndd
カット

nyy
ヤンク

p
ペースト


ビジュアルモード

視覚的に見ながら複数選択ができるモード

wordでいうところの、Shiftキーを押したまま矢印キーを押すもの。

マウスで左を押したままカーソルを移動するもの。

vでビジュアルモードに移行

・ノーマルモードと同じ移動ができる

・選択中にyでヤンク、dでカット、自動でノーマルモードに戻るのでそのままpでペーストできる

Escでノーマルモードに戻ることができる

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

→コメントで教えていただいたのですが、ggVGyですべてヤンクできます。


3.他のファイルからヤンク&ペースト

ここまで、コピーやペーストのやり方を記してきましたが、別でvimを起動すると貼り付けることができません。

そこで、vim上で他のファイルを開く必要があります。


vimを分割

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

コマンド
動作

:split
縦に一つタブを作成して同一ファイルを開く

:vsplit
横に一つタブを作成して同一ファイルを開く

:new
縦に分割して新規ファイルを開く

:vnew
横に分割して新規ファイルを開く

分割したタブへ移動したい時はCtrl+w wCtrl+w hCtrl+w jCtrl+w kCtrl+w lで移動できます。

分割したタブを閉じたい時は:qで閉じることができます。変更を加えていた場合は:wqとなります。


別ファイルを開く

:open filenameで指定したファイルを開く

:open path/to/filenameで別ディレクトリのファイルを開ける

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


4..vimrcについて

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


.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で1行コメントアウト
autocmd BufNewFile,BufRead *.py nnoremap <C-i> <Home>i#<Esc>
" Ctrl+sで1行アンコメントアウト
autocmd BufNewFile,BufRead *.py nnoremap <C-s> <Home>x<Esc>
" Ctrl+eでスクリプト実行
autocmd BufNewFile,BufRead *.py nnoremap <C-e> :terminal python %
" C++について
" Ctrl+iで1行コメントアウト
autocmd BufNewFile,BufRead *.cpp nnoremap <C-i> <Home>i//<Esc>
" Ctrl+sで1行アンコメントアウト
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行までカット

np
n個ペースト


移動系

コマンド
動作

Ctrl+d
半ページダウン

Ctrl+u
半ページアップ

Ctrl+f
1ページダウン

Ctrl+b
1ページアップ

zz
カーソル行を中心

zt
カーソル行を一番上


検索&置換系

コマンド
動作

/name
nameという文字列を検索

:s/before/after
カレント行の先頭のbeforeをafterに置換

:s/before/after/g
カレント行のすべてのbeforeをafterに置換

n
検索結果を次へ

Shift+n
検索結果を前へ


矩形選択モード

一斉に字下げする際に重宝します。

Ctrl+vで矩形選択モードに移行

$で長さの違う行をすべて選択

yでヤンク、dでカット

Escでノーマルモードに戻る