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/&/\&/eg
silent s/</\</eg
silent s/>/\>/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 " 全ての改行を削除