Vim

開発ツール

Vim

概要

VimはBram Moolenaar氏によって開発されたオープンソースのテキストエディタです。Viエディタの改良版として作られ、モーダル編集という独特な操作方法と高い拡張性で、多くのプログラマーに愛用されています。

詳細

Vimは1991年にリリースされ、「Vi IMproved」の略称として開発されました。ほとんど全てのUnix系システムにプリインストールされており、SSHでのリモートサーバー作業やコマンドライン環境での開発において不可欠なツールです。現在はBram Moolenaar氏によって100%近く維持されています。

Vimの最大の特徴はモーダル編集システムです。ノーマルモード(コマンド実行)、インサートモード(テキスト入力)、ビジュアルモード(範囲選択)などのモードを切り替えながら編集を行います。この独特な操作方法により、マウスを使わずキーボードのみで全ての操作を高速に実行できます。

強力な正規表現によるマクロ機能、豊富なプラグインシステム、Vimscriptによるカスタマイズ、バッファ・ウィンドウ管理、タブ機能、分割表示など、高度なテキスト編集機能を提供します。設定はvimrcファイルで管理され、ユーザーの好みに応じて細かくカスタマイズできます。

メリット・デメリット

メリット

  • どこでも利用可能: ほぼ全てのLinuxディストリビューションに標準インストール
  • 極めて軽量: 最小限のシステムリソースで動作
  • 高速操作: モーダル編集によるキーボード中心の効率的な操作
  • 無料・オープンソース: 完全に無料で利用可能
  • 強力なカスタマイズ: Vimscriptによる柔軟な拡張性
  • リモート作業対応: SSH経由でのサーバー作業に最適
  • バージョン管理親和性: テキストベース設定でGit管理が容易

デメリット

  • 急峻な学習曲線: 独特な操作方法の習得に時間が必要
  • 限定的なメンテナンス: 主にBram Moolenaar氏1人による開発
  • GUI機能の制限: ターミナルベースでGUI統合機能が限定的
  • 初心者には困難: 最初の操作方法を覚えるまでが大変
  • プラグイン管理: 高度な機能にはプラグインの知識が必要
  • 現代的機能の不足: Neovimと比較して新機能の導入が遅い
  • 設定の複雑さ: 最適な設定には深い知識が必要

主要リンク

書き方の例

基本vimrc設定

" .vimrc - 基本設定
set nocompatible              " Vi互換モードを無効化

" 基本設定
set number                    " 行番号を表示
set relativenumber           " 相対行番号を表示
set ruler                    " カーソル位置を表示
set showcmd                  " コマンドを表示
set showmode                 " モードを表示
set cursorline              " カーソル行をハイライト
set laststatus=2            " ステータスラインを常に表示

" インデント設定
set autoindent              " 自動インデント
set smartindent             " スマートインデント
set cindent                 " C言語インデント
set tabstop=4               " タブ幅
set shiftwidth=4            " シフト幅
set expandtab               " タブをスペースに変換
set softtabstop=4           " ソフトタブ

" 検索設定
set incsearch               " インクリメンタル検索
set hlsearch                " 検索結果をハイライト
set ignorecase              " 大文字小文字を無視
set smartcase               " 大文字が含まれる場合は大文字小文字を区別

" 表示設定
set wrap                    " 行の折り返し
set linebreak               " 単語の境界で折り返し
set showmatch               " 対応する括弧をハイライト
set list                    " 不可視文字を表示
set listchars=tab:▸\ ,trail:▫,extends:❯,precedes:❮,nbsp:Ø

" ファイル設定
set encoding=utf-8          " 文字エンコーディング
set fileencoding=utf-8      " ファイルエンコーディング
set fileformat=unix         " ファイル形式
set backup                  " バックアップファイルを作成
set backupdir=~/.vim/backup " バックアップディレクトリ
set undofile                " アンドーファイルを作成
set undodir=~/.vim/undo     " アンドーディレクトリ

" 色とテーマ
syntax enable               " シンタックスハイライト
colorscheme desert          " カラースキーム
set background=dark         " 背景色

" キーマッピング
let mapleader = ","         " リーダーキーを設定
nnoremap <Leader>w :w<CR>   " ,w で保存
nnoremap <Leader>q :q<CR>   " ,q で終了
nnoremap <Leader>h :nohlsearch<CR> " ,h で検索ハイライト解除
nnoremap j gj               " 表示行での移動
nnoremap k gk               " 表示行での移動

" 分割ウィンドウ設定
set splitbelow              " 水平分割時は下に開く
set splitright              " 垂直分割時は右に開く
nnoremap <C-h> <C-w>h       " Ctrl+h で左ウィンドウに移動
nnoremap <C-j> <C-w>j       " Ctrl+j で下ウィンドウに移動
nnoremap <C-k> <C-w>k       " Ctrl+k で上ウィンドウに移動
nnoremap <C-l> <C-w>l       " Ctrl+l で右ウィンドウに移動

プラグイン管理(vim-plug)

" プラグイン設定
call plug#begin('~/.vim/plugged')

" 必須プラグイン
Plug 'tpope/vim-sensible'          " 基本設定
Plug 'tpope/vim-surround'          " 囲み文字操作
Plug 'tpope/vim-commentary'        " コメント操作
Plug 'tpope/vim-fugitive'          " Git統合

" ファイラー
Plug 'preservim/nerdtree'          " ファイルツリー
Plug 'Xuyuanp/nerdtree-git-plugin' " NERDTree Git統合

" 検索・移動
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'           " ファジーファインダー
Plug 'easymotion/vim-easymotion'  " 高速移動

" 補完・LSP
Plug 'neoclide/coc.nvim', {'branch': 'release'} " 補完エンジン
Plug 'dense-analysis/ale'          " リンター

" 見た目
Plug 'vim-airline/vim-airline'     " ステータスライン
Plug 'vim-airline/vim-airline-themes' " テーマ
Plug 'morhetz/gruvbox'             " カラースキーム

" 言語サポート
Plug 'sheerun/vim-polyglot'        " 多言語サポート
Plug 'pangloss/vim-javascript'     " JavaScript
Plug 'leafgarland/typescript-vim'  " TypeScript

call plug#end()

" プラグイン設定
let g:gruvbox_contrast_dark = 'hard'
colorscheme gruvbox

" NERDTree設定
nnoremap <Leader>n :NERDTreeToggle<CR>
let NERDTreeShowHidden=1

" FZF設定
nnoremap <Leader>f :Files<CR>
nnoremap <Leader>b :Buffers<CR>
nnoremap <Leader>g :Ag<CR>

" Airline設定
let g:airline_theme='gruvbox'
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1

" CoC設定
inoremap <silent><expr> <TAB>
  \ pumvisible() ? "\<C-n>" :
  \ <SID>check_back_space() ? "\<TAB>" :
  \ coc#refresh()

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

カスタム関数例

" カスタム関数定義

" 行末の空白を削除する関数
function! TrimWhitespace()
    let l:save = winsaveview()
    keeppatterns %s/\s\+$//e
    call winrestview(l:save)
endfunction

" 現在のファイルをコピーする関数
function! CopyFile()
    let filename = expand('%:t')
    let new_name = input('New filename: ', filename)
    if new_name != '' && new_name != filename
        execute 'saveas ' . new_name
    endif
endfunction

" HTMLタグをエスケープする関数
function! HtmlEscape()
    silent s/&/\&amp;/eg
    silent s/</\&lt;/eg
    silent s/>/\&gt;/eg
endfunction

" 現在の行を複製する関数
function! DuplicateLine()
    let line = getline('.')
    call append('.', line)
endfunction

" 関数のキーマッピング
nnoremap <Leader>tw :call TrimWhitespace()<CR>
nnoremap <Leader>cf :call CopyFile()<CR>
vnoremap <Leader>he :call HtmlEscape()<CR>
nnoremap <Leader>dl :call DuplicateLine()<CR>

オートコマンド例

" オートコマンド設定
augroup vimrc_autocmds
    autocmd!
    
    " ファイルタイプ別設定
    autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab
    autocmd FileType javascript setlocal tabstop=2 shiftwidth=2 expandtab
    autocmd FileType html setlocal tabstop=2 shiftwidth=2 expandtab
    autocmd FileType css setlocal tabstop=2 shiftwidth=2 expandtab
    autocmd FileType markdown setlocal wrap linebreak
    
    " 保存時の処理
    autocmd BufWritePre *.py,*.js,*.html,*.css :call TrimWhitespace()
    
    " ファイル読み込み時の処理
    autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
    
    " 新規ファイル作成時のテンプレート
    autocmd BufNewFile *.py 0r ~/.vim/templates/python.py
    autocmd BufNewFile *.html 0r ~/.vim/templates/html.html
    
    " ウィンドウサイズ調整
    autocmd VimResized * wincmd =
    
augroup END

マクロとレジスタ活用

" マクロの例

" 1. qでマクロ記録開始、レジスタaに記録
" qa
" I"<Esc>A"<Esc>j
" q
" 上記マクロは行の最初と最後にダブルクォートを追加

" 2. マクロ実行
" @a (1回実行)
" 10@a (10回実行)

" レジスタの活用例
" "ayy     現在行をレジスタaにヤンク
" "ap      レジスタaの内容をペースト
" "Ayy     レジスタaに追記でヤンク
" "*yy     システムクリップボードにヤンク
" "+yy     セレクションクリップボードにヤンク

" 便利なコマンド例
" :reg     レジスタの内容を表示
" :marks   マークの一覧を表示
" :jumps   ジャンプリストを表示
" :changes 変更リストを表示

" 検索・置換の高度な例
" :%s/\v(pattern)/replacement/gc  " 確認しながら置換
" :g/pattern/d                    " パターンにマッチする行を削除
" :v/pattern/d                    " パターンにマッチしない行を削除
" :%s/\n//g                       " 全ての改行を削除