Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

3年間育てた自分のvimrcを解説

$
0
0

はじめに

Vim歴多分3年ぐらいです。
育て上げたvimrcをざっくりと分割して解説してみるテスト。
良くない記述方法や改善点あれば是非コメントで教えてください。
このvimrcファイルはこちら

初期設定

初期設定 Part1

お決まりの設定。
set nocompatibleは最近の環境では必要ないらしいが念のため。
MyAugroupはプラグイン設定でも使用している為最初の方に記述。

if0|endifsetencoding=utf-8scriptencoding utf-8if&compatiblesetnocompatibleendiflet s:is_windows = has('win16')|| has('win32')|| has('win64')let s:is_mac = has('mac')

augroup MyAugroup
  autocmd!
augroup END

初期設定 Part2

vimで使うディレクトリやファイルの場所を設定。
Windows環境の時はファイルパスの \/にする set shellslashを使用。
プラグインがうまく動かない場合があるが、今のところ大丈夫。

if s:is_windowssetshellslashlet s:vimfiles_dir = expand('~/vimfiles')elselet s:vimfiles_dir = expand('~/.vim')endiflet s:vimcache_dir   = expand('~/.cache/vim')let s:viminfo= s:vimcache_dir.'/viminfo'let s:backup_dir     = s:vimcache_dir.'/backup'let s:swap_dir       = s:vimcache_dir.'/swap'let s:undo_dir       = s:vimcache_dir.'/undo'let s:view_dir       = s:vimcache_dir.'/view'let s:dein_dir       = s:vimcache_dir.'/dein.vim'let s:dein_toml      = s:vimfiles_dir.'/rc/dein.toml'let s:dein_cache_dir = expand('~/.cache/dein')let s:local_vimrc    = s:vimfiles_dir.'/local.vimrc'

初期設定 Part3

vimで使うディレクトリの作成とdeinのインストールを行う。

function! s:make_dir(dir) abort  " silent! call mkdir(dir, 'p')if!isdirectory(a:dir)call mkdir(a:dir,'p')endifendfunctioncall s:make_dir(s:vimcache_dir)call s:make_dir(s:backup_dir)call s:make_dir(s:swap_dir)call s:make_dir(s:undo_dir)call s:make_dir(s:view_dir)if!isdirectory(s:dein_dir)echomsg'dein.vim does not exists.'if executable('git')
    execute '!git clone https://github.com/Shougo/dein.vim' s:dein_direlseechomsg'git does not exists.'endifendif

初期設定 Part4

<Leader>のキーマップにに ,を使用する。
以前は clever-f.vimを使用していたので ,は不要でしたが、消してしまったので ,が使えなくて不便。

letg:mapleader =','

初期設定 Part5

guioptionはGVimをCLI風にする設定。
下の方の記述はGUIでない時の設定ははモードごとにカーソルを切り替える用。
フォントはRictyを使用。
macmetaはMacVim用。

if has('gui_running')setguioptions-=aguioptions-=isetguioptions-=rguioptions-=Lsetguioptions-=eguioptions-=mguioptions+=M guioptions-=tguioptions-=T guioptions-=gsetguioptions+=cif s:is_windowsset renderoptions=type:directx,renmode:5setguifont=Ricty_Diminished:h13.5:cSHIFTJIS,MS_Gothic:h13elseif s:is_macsetguifont=Ricty\ Regular:h17set macmetaset transparency=10endifelselet&t_ti .="\e[1 q"let&t_SI .="\e[5 q"let&t_EI .="\e[1 q"let&t_te .="\e[0 q"endif

dein.vim設定

deinの設定。
プラグインの設定内容はまた元気がある時にやるかもしれない。
toml読み込みは遅いらしいがdein.vimはキャッシュ機能があるので問題なし。
call dein#call_hook('source')vim-singletonを起動するための設定。
silent! execute 'helptags' s:dein_dir . '/doc/'はdein.vimのヘルプを生成するための行。

if isdirectory(s:dein_dir)&& executable('git')&& (executable('rsync')|| executable('xcopy'))letg:dein#install_process_timeout =600letg:dein#install_progress_type ='tabline'if has('vim_starting')
    execute 'set runtimepath^='.s:dein_direndifif dein#load_state(s:dein_dir)call dein#begin(s:dein_cache_dir)call dein#add(s:dein_dir, {'rtp': ''})call dein#load_toml(s:dein_toml)call dein#end()call dein#save_state()endifcall dein#call_hook('source')if dein#check_install()call dein#install()endif  " if dein#check_update()  "   call dein#update()  " endifsilent! execute 'helptags' s:dein_dir . '/doc/'endiffiletype plugin indent on

Options

この辺りは好み。
知らないオプションが出てきたときは :help 'オプション名'で引くと良い。
:optionコマンドや :help options-listでどんなオプションがあるか確認するのもオススメ。
optionは :optionsコマンドの順番通りに(多分)設定している。

Options Part1

set tags+=tags;は親ディレクトリのタグファイルも検出してくれる用設定。
listcharsで不可視文字をいい感じに表示するように。

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Options""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" important" moving around, searching and patternssetwhichwrap+=b,s,h,l,<,>,~,[,]setincsearchsetignorecasesetsmartcase" tagssettags+=tags;" displaying textsetscrolloff=5set breakindentsetshowbreak=>\setdisplay+=lastlinesetredrawtime=500setlistsetlistchars=tab:→\ ,eol:⏎,space:・,extends:>,precedes:<setnumbersetconceallevel=2setconcealcursor=nc" syntax, highlighting and spellingsethlsearchnohlsearch" multiple windowssetlaststatus=2setstatusline=%F%m%rsetstatusline+=%=setstatusline+=\ \|\ %{&fileformat},%{&fileencoding}%{(&bomb?\"(bom)\":\"\")}setstatusline+=\ \|\ %Ysetstatusline+=\ \|\ %l/%L,%c" set noequalalwayssetsplitright

Options Part2

tablineをいい感じに表示するvimscript。
書いた時の記憶があんまりないので内容は覚えてないけどTabの幅とかを自動で調節するので便利。
内容に意味は無いのでスキップ推奨->スキップ

" multiple tab pagessetshowtabline=2settabline=%!MyTabLine()function! MyTabLine()if!exists("s:tabline")let s:tabline= s:tab(16,32,8)endifreturn s:tabline.gen()endfunctionfunction! s:tab(size, maxsize, minsize) abortlet self = {}let self.size =a:sizelet self.maxsize =a:maxsizelet self.minsize =a:minsizefunction! self.gen() abort dictletleft= self.left()letright= self.right()let leftsize = strdisplaywidth(left)let rightsize = strdisplaywidth(right)let width =&columnslet middlesize = width - leftsize - rightsizelet middle = self.middle(middlesize)returnleft.middle.'%=%<'.rightendfunctionfunction! self.left() abort dictreturn' 'endfunctionfunction! self.right() abort dictreturn' 'endfunctionfunction! self.label(n) abort dictlet buflist = tabpagebuflist(a:n)let curbuf = buflist[tabpagewinnr(a:n)-1]let bufcount = len(buflist)>1 ? len(buflist) : ''let tabmod = len(filter(copy(buflist),'getbufvar(v:val, "&modified")')) ? '(+)' : ''let tabmod = getbufvar(curbuf,'&modified') ? '+' : tabmodlet fname = fnamemodify(bufname(curbuf),':t')let quickfix = getbufvar(curbuf,'&buftype')!~'quickfix' ? '' : '[Quickfix]'let nofile = getbufvar(curbuf,'&buftype')!~'nofile' ? '' : '[下書き]'let name ='[無題]'let name = len(quickfix) ? quickfix : namelet name = len(nofile) ? nofile : namelet name = len(fname) ? fname : namelet label =' '.a:n.tabmod.':'.bufcount.' '.name.' 'return labelendfunctionfunction! self.middle(middlesize) abort dictlet sep ='|'let labels = []for tabnr in range(1, tabpagenr('$'))let label = self.label(tabnr)let label = self.labelformat(label, sep, self.size, self.maxsize)call add(labels, label)endforlet maxsize = self.maxsizewhilea:middlesize < self.labelssize(labels, sep)&& maxsize > self.sizelet maxsize = maxsize -1leti=0whilei< len(labels)if maxsize < strdisplaywidth(labels[i].sep)let labels[i] = self.labelformat(labels[i], sep, self.size, maxsize)endifleti=i+1endwhileendwhileifa:middlesize < self.labelssize(labels, sep)let persize =a:middlesize / tabpagenr('$')let persize = max([persize, self.minsize])leti=0whilei< len(labels)let labels[i] = self.labelformat(labels[i], sep, self.size, persize)leti=i+1endwhileendifleti=0let strlabels =''whilei< len(labels)lettabn=i+1lethl=tabnis tabpagenr() ? '%#TabLineSel#' : '%#TabLine#'lethl .='%'.tabn.'T'let strlabels .=hl.labels[i].'%#TabLineFill#'.sepleti=i+1endwhilereturn strlabelsendfunctionfunction! self.labelssize(labels, sep) abort dictlet sum =0for label ina:labelslet sum = sum + strdisplaywidth(label.a:sep)endforreturn sumendfunctionfunction! self.substring(src,start,end) abort dictlet splitlabel = split(a:src,'\zs')returnjoin(splitlabel[a:start : a:end],'')endfunctionfunction! self.labelformat(label, sep, size, maxsize) abort dictlet label =a:labellet label .= repeat(' ',a:size - strdisplaywidth(a:label.a:sep))leti= strchars(label)while strdisplaywidth(label.a:sep)>a:maxsizelet label = self.substring(label,0,i).'> 'leti-=1endwhilereturn labelendfunctionreturn selfendfunction

Options Part3

backup、swap、undo、viewファイルは邪魔にならない場所に生成しているので一応使用。
keywordprg<S-k>押した時にVimのヘルプを引く設定。

" terminal" using the mousesetmouse=a" GUI" printingsetprintheader=%<%t%h%m%=%N" messages and infosetnovisualbellsetnoerrorbellssetshowcmdset belloff=allsethelplang=ja,en" selecting textsetclipboard+=unnamed" editing textsetbackspace=indent,eol,startsetpumheight=10setmatchtime=1setmatchpairs+=<:>setnrformats=hex" tabs and indentingsettabstop=4" tab widthsetshiftwidth=2" auto indent widthsetsofttabstop=2" tabkey spacesetexpandtab" softtabsetautoindentsetsmartindent" folding" diff mode" mapping" reading and writing filessetbackup
execute 'set backupdir='.s:backup_dir" the swap file
execute 'set directory='.s:swap_dirsetswapfile" command line editingsethistory=10000setwildmode=fullsetwildmenusetundofile
execute 'set undodir='.s:undo_dir" executing external commandssetkeywordprg=:help" running make and jumping to errors" system specific" language specificsetiminsert=0setimsearch=0" multi-byte characterssetfileencodings=utf8,cp932,eucjpsetambiwidth=double" varioussetviewoptions-=options
execute 'set viewdir='.s:view_dir
execute 'set viminfo+=n'.s:viminfo" phpletg:PHP_vintage_case_default_indent =1

AutoCommands

内容はざっくり以下の通り。

  • viewファイルを作成、ロードする
  • 自動で開いているファイルにcd(set autochdirで可能ですが、プラグインで不具合が出たのでautocmdで)
  • vimgrepで一部の拡張子を除外
  • QuickFixを自動で開く
  • 各言語用インデント設定
  • IMEの状態によってカーソルの色を変更
  • QuickFixを見やすく
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" AutoCommands""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
augroup MyAugroup  " view
  autocmd BufWritePost ?* if expand('%')!=''&& &buftype!~'nofile'|mkview|endif
  autocmd BufWinEnter ?* if expand('%')!=''&& &buftype!~'nofile'|silent loadview |endif  " set autochdir
  autocmd BufEnter * execute 'silent! lcd '.expand('%:h')  " auto jump
  autocmd BufReadPost * if line("'\"")>1&& line("'\"")<= line('$')| execute 'normal! g`"'|endif  " quickfix
  autocmd QuickFixCmdPrevimgrepsetlocalwildignore=*.gif,*.png,*.jpg,*.swf,*.flv,*.mp4,*.pdf,*.ttf,*.mp3,*.wav,tags
  autocmd QuickFixCmdPostvimgrepsetlocalwildignore<
  autocmd QuickFixCmdPost *grep* cwindow  " ftplugin
  autocmd FileType php setlocaltabstop=4shiftwidth=4softtabstop=4
  autocmd FileType javascript setlocaltabstop=2shiftwidth=2softtabstop=2
  autocmd FileType json setlocalconceallevel=0
  autocmd FileType html setlocaltabstop=2shiftwidth=2softtabstop=2
  autocmd FileType qf call s:MyFTPluginQuickfix()  " ftdetect
  autocmd BufNewFile,BufRead *.tpl setfiletype=php  " syntax
  autocmd VimEnter,ColorScheme * call s:MyHighlight()

augroup END

function! s:MyHighlight() abortif has('multi_byte_ime')|| has('xim')    " highlight Cursor guibg=DarkRed guifg=NONEhighlight CursorIM guibg=Green guifg=NONEendifendfunctionfunction! s:MyFTPluginQuickfix() abortsetlocalstatusline=%t%{exists('w:quickfix_title')?\ '\ '.w:quickfix_title\ :\ ''}\ %=%l/%Lsetlocalnowrapsetlocalcursorlineendfunction

Commands

内容は以下の通り。
いろいろな所から拝借。

command内容
Wsourcevimscriptファイルを読み込んで実行する
vimrc書いてるときとかに便利
CdCurrent今開いているファイルのディレクトリにcdする
Scratch保存しない一時ファイルを作成する
DiffOrig最後に保存したファイルとdiffする
VimGrepFile開いているファイルでvimgrepする
VimGrepDirカレントディレクトリでvimgrepする
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Commands""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""if exists('$MYVIMRC')
  command! EditMyVimrc edit $MYVIMRCendif
command! Wsource if&filetype=='vim'|write| source % |else| echo 'this is not vimfile.'|endif
command! CdCurrent cd %:p:h
command!-bang Scratch execute '<bang>'=='!' ? 'tabedit' : 'new'|setlocalbuftype=nofile noswapfile
command! DiffOrig vertnew|setbuftype=nofile | read ++edit # |0delete_ |diffthis|wincmdp|diffthis
command!-nargs=1 VimGrepFile execute 'vimgrep /\v<args>/j %:p'
command!-nargs=1 VimGrepDir execute 'vimgrep /\v<args>/j **'

Mapping

わかりにくそうなやつだけ以下にピックアップ。

  • ビジュアルモードで行ごとに . , @を使えるように。
  • <S-カーソルキー>でウィンドウの大きさを調節。連打できるので便利。
  • <Space>をプレフィックスとしてよく使うコマンドのエイリアスにしてる。
  • -はオプション切り替え系。
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Mappings""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""nnoremap<ESC><ESC> :<C-u>nohlsearch<CR><ESC>nnoremap Y y$nnoremap<expr> gj &wrap ? 'j' : 'gj'nnoremap<expr> gk &wrap ? 'k' : 'gk'nnoremap<expr>j&wrap ? 'gj' : 'j'nnoremap<expr>k&wrap ? 'gk' : 'k'vnoremap<expr> gj &wrap ? 'j' : 'gj'vnoremap<expr> gk &wrap ? 'k' : 'gk'vnoremap<expr>j&wrap ? 'gj' : 'j'vnoremap<expr>k&wrap ? 'gk' : 'k'nnoremapx"_xvnoremapx"_xnnoremap X "_Xvnoremap X "_X" nnoremap s <Nop>" vnoremap s <Nop>" nnoremap S <Nop>" vnoremap S <Nop>

cnoremap <C-p><Up>
cnoremap <C-n><Down>nnoremap<C-n> :<C-u>tabnext<CR>nnoremap<C-p> :<C-u>tabprevious<CR>vnoremap . :normal .<CR>vnoremap @ :<C-u>execute "'<,'>normal @".nr2char(getchar())<CR>nnoremap<S-UP><C-w>+nnoremap<S-Down><C-w>-nnoremap<S-Left><C-w><nnoremap<S-Right><C-w>>nnoremap<C-UP><C-w>Knnoremap<C-Down><C-w>Jnnoremap<C-Left><C-w>Hnnoremap<C-Right><C-w>Lnoremap<Space><Nop>nnoremap<Space>jo<ESC>nnoremap<Space>k O<ESC>nnoremap<Space>w :<C-u>write<CR>nnoremap<Space>q :<C-u>quit<CR>nnoremap<Space>Q :<C-u>quit!<CR>nnoremap<Space>bd :<C-u>bdelete<CR>nnoremap<Space><Space> %nnoremap<Space>* *Nnnoremap<Space>g* g*Nnnoremap<Space>n :<C-u>tabnext<CR>nnoremap<Space>p :<C-u>tabprevious<CR>nnoremap<Space>t :<C-u>tabedit<CR>nnoremap-<Nop>nnoremap-fh :<C-u>setfiletype html <Bar>setfiletype?<CR>nnoremap-fj :<C-u>setfiletype javascript <Bar>setfiletype?<CR>nnoremap-fp :<C-u>setfiletype php <Bar>setfiletype?<CR>nnoremap-fs :<C-u>setfiletype sql <Bar>setfiletype?<CR>nnoremap-fv :<C-u>setfiletypevim<Bar>setfiletype?<CR>nnoremap-fm :<C-u>setfiletype markdown <Bar>setfiletype?<CR>nnoremap-ft :<C-u>setfiletype text <Bar>setfiletype?<CR>nnoremap-eu :<C-u>setlocalfileencoding=utf8 fileencoding?<CR>nnoremap-es :<C-u>setlocalfileencoding=sjis fileencoding?<CR>nnoremap-w :<C-u>setlocalwrap!wrap?<CR>nnoremap-c :<C-u>setlocalcursorline!cursorline?<CR>nnoremap-n :<C-u>setlocalnumber!number?<CR>nnoremap-t :<C-u>setlocalexpandtab!expandtab?<CR>nnoremap-i :<C-u>setlocalignorecase!ignorecase?<CR>nnoremap-h :<C-u>setlocalhlsearchhlsearch?<CR>if exists('$MYVIMRC')nnoremap<F1> :<C-u>edit $MYVIMRC<CR>nnoremap<S-F1> :<C-u>tabedit $MYVIMRC<CR>endif
execute 'nnoremap <F2> :<C-u>edit '.s:local_vimrc.'<CR>'
execute 'nnoremap <S-F2> :<C-u>tabedit '.s:local_vimrc.'<CR>'
execute 'nnoremap <F3> :<C-u>edit '.s:dein_toml.'<CR>'
execute 'nnoremap <S-F3> :<C-u>tabedit '.s:dein_toml.'<CR>'

Colorscheme

最初に見つけたカラースキームを自動で読み込むやつ。
基本的に vim-hybridを使ってます。

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Colorscheme""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""function! s:find_colorscheme(colorschemes) abortforcolorschemeina:colorschemeslet result = split(globpath(&runtimepath,'colors/'.colorscheme['name'].'.vim'),'\n')if len(result)returncolorschemeendifendforreturn {'name': 'default','background': 'light'}endfunctionif has('gui_running')let s:colorschemes = [
        \  {'name': 'hybrid','background': 'dark'},
        \  {'name': 'desert','background': 'dark'},
        \]elselet s:colorschemes = [
        \  {'name': 'desert','background': 'dark'},
        \]endiflet s:colorscheme= s:find_colorscheme(s:colorschemes)syntax enable
execute 'set background='.s:colorscheme['background']
execute 'colorscheme' s:colorscheme['name']

local.vimrc読み込み

いろいろな環境でVimを使っているのでマシンごとの個別の設定を読み込んでいるファイルでやる。
例えばMacだとUSキーボードを使用しているのでコマンドを入力しやすくするために ;:を入れ替える設定をしています。

if filereadable(s:local_vimrc)
  execute 'source' s:local_vimrcendif

Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>