Skip to content

Instantly share code, notes, and snippets.

@thinca
Created December 25, 2011 07:52
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thinca/1518874 to your computer and use it in GitHub Desktop.
Save thinca/1518874 to your computer and use it in GitHub Desktop.
thinca's vimrc
" == Naming convention. == {{{1
" Command name
" - CamelCase
" Global function name
" - CamelCase
" Local function name
" - s:split_by_underbar
" Group name for autocmd
" - split-by-dash
" In vimrc, start with "vimrc"
" - vimrc-{unique-name}
" In vim plugin, start with "plugin"
" - plugin-{plugin-name}
" - plugin-{plugin-name}-{unique-name}
" In other custom files, start with "custom"
" - custom-{unique-name}
" == Initial process. == {{{1
" Startup time.
if has('vim_starting') && has('reltime')
let g:startuptime = reltime()
augroup vimrc-startuptime
autocmd! VimEnter * let g:startuptime = reltime(g:startuptime) | redraw
\ | echomsg 'startuptime: ' . reltimestr(g:startuptime)
augroup END
endif
" runtimepath.
set runtimepath&
" Even Windows use "$HOME/.vim".
let &runtimepath = substitute(&runtimepath,
\ escape($HOME, '\') . '/vimfiles', escape($HOME, '\') . '/.vim', 'g')
let g:rtputil#ignore_pattern = '^_'
call rtputil#new().bundle().bundle('labs')
\.append('~/.vim/custom').unify(':p:~').apply()
" localrc.vim
if has('vim_starting')
call localrc#load('.init.vimrc', getcwd())
endif
" singleton.vim
if !(has('unix') && $USER ==# 'root')
let g:singleton#ignore_pattern .= '\|/.vimgolf/put'
call singleton#enable()
endif
" vital.vim
let g:V = vital#of('vital')
call extend(s:, g:V, 'keep')
call g:V.load('Data.List').load('Data.String')
" == Utilities for vimrc. == {{{1
function! s:SID()
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_SID$')
endfunction
function! s:SIDP()
return '<SNR>' . s:SID() . '_'
endfunction
function! s:check_flag(flag)
if exists('b:' . a:flag)
return b:{a:flag}
endif
if exists('g:' . a:flag)
return g:{a:flag}
endif
return 0
endfunction
function! s:toggle_flag(flag)
if !exists(a:flag)
let {a:flag} = 1
else
let {a:flag} = !{a:flag}
endif
endfunction
function! s:get_range(type, mode)
if a:mode ==# 'o'
let vm = {
\ 'line' : 'V',
\ 'char' : 'v',
\ 'block' : "\<C-v>" }[a:type]
let [sm, em] = ['[', ']']
let save_sel = &selection
set selection=inclusive
elseif a:mode ==# 'v'
let [vm, sm, em] = [a:type, '<', '>']
end
let save_reg = @"
execute 'silent normal! `' . sm . vm . '`' . em . 'y'
let selected = @"
let @" = save_reg
if a:mode ==# 'o'
let &selection = save_sel
endif
return selected
endfunction
function! s:modulo(n, m)
let d = a:n * a:m < 0 ? 1 : 0
return a:n + (-(a:n + (0 < a:m ? d : -d)) / a:m + d) * a:m
endfunction
function! s:mkdir(file, ...)
let f = a:0 ? fnamemodify(a:file, a:1) : a:file
if !isdirectory(f)
call mkdir(f, 'p')
endif
endfunction
function! s:has_plugin(name)
return globpath(&runtimepath, 'plugin/' . a:name . '.vim') !=# ''
\ || globpath(&runtimepath, 'autoload/' . a:name . '.vim') !=# ''
endfunction
" == Encoding settings. == {{{1
" Use utf-8.
if &encoding !=? 'utf-8'
let &termencoding = &encoding
set encoding=utf-8
endif
" Must after set of 'encoding'.
scriptencoding utf-8
if has('guess_encode')
set fileencodings=ucs-bom,iso-2022-jp,guess,euc-jp,cp932
else
set fileencodings=ucs-bom,iso-2022-jp,euc-jp,cp932
endif
augroup vimrc-fileencoding
autocmd!
autocmd BufReadPost * if &modifiable && !search('[^\x00-\x7F]', 'cnw')
\ | setlocal fileencoding=
\ | endif
augroup END
" == Appearance settings. == {{{1
set guioptions+=M
syntax enable
augroup vimrc-highlight
autocmd!
autocmd ColorScheme * call s:highlight_additional()
autocmd VimEnter,WinEnter * call s:syntax_additional()
augroup END
function! s:syntax_additional()
let preset = exists('w:syntax_additional')
if &l:list
if !preset
let w:syntax_additional = matchadd('IdeographicSpace', '')
endif
elseif preset
call matchdelete(w:syntax_additional)
unlet w:syntax_additional
endif
endfunction
function! s:highlight_additional()
" Highlight "IdeographicSpace".
highlight IdeographicSpace term=underline ctermbg=DarkGreen guibg=DarkGreen
" Change the cursor color when IME is on.
highlight CursorIM guibg=Red guifg=NONE
let env = has('gui_running') ? 'gui' : 'cterm'
for hi in ['TabLine', 'TabLineSel']
let id = synIDtrans(hlID(hi))
let bg = synIDattr(id, 'bg', env)
let bg = bg =~# '^#\?\w\+$' ? env . 'bg=' . bg : ''
let attrs = filter(['bold', 'italic', 'reverse', 'inverse',
\ 'standout', 'underline', 'undercurl'],
\ 'synIDattr(id, v:val, env)')
let attr = empty(attrs) ? '' : env . '=' . join(attrs, ',')
execute 'highlight' hi . 'Number' env . 'fg=Red' bg attr
endfor
endfunction
" colorscheme.
set background=dark
if !s:is_windows() || has('gui_running')
" ['candycode', 'wuye', 'freya', 'leo']
colorscheme candycode
else "CUI win32
" ['oceandeep']
colorscheme default
endif
" Show (partial) command in the last line of the screen.
set showcmd
" Show invisible characters.
set list listchars=tab:^\ ,trail:_,extends:>,precedes:<
" Visual bell (Disable beep).
set visualbell t_bv=
" Display the last line as much as possible in a window.
set display=lastline
set matchpairs& matchpairs+=<:>
set laststatus=2 statusline=%!MakeStatusLine()
set showtabline=2 tabline=%!MakeTabLine()
" Don't show :intro when startup.
set shortmess& shortmess+=I
if has('kaoriya') && s:is_windows() && has('gui_running')
set ambiwidth=auto
else
set ambiwidth=double
endif
set helplang=ja,en
" Get character code on cursor with 'fileencoding'.
function! GetCharacterCode()
let str = iconv(matchstr(getline('.'), '.', col('.') - 1), &enc, &fenc)
let out = '0x'
for i in range(strlen(str))
let out .= printf('%02X', char2nr(str[i]))
endfor
if str ==# ''
let out .= '00'
endif
return out
endfunction
" Return the current file size in human readable format.
function! GetFileSize()
let size = &encoding ==# &fileencoding || &fileencoding ==# ''
\ ? line2byte(line('$') + 1) - 1 : getfsize(expand('%'))
if size < 0
let size = 0
endif
for unit in ['B', 'KB', 'MB']
if size < 1024
return size . unit
endif
let size = size / 1024
endfor
return size . 'GB'
endfunction
function! GetBufname(bufnr, tail)
let bufname = bufname(a:bufnr)
if bufname =~# '^[[:alnum:].+-]\+:\\\\'
let bufname = substitute(bufname, '\\', '/', 'g')
endif
let buftype = getbufvar(a:bufnr, '&buftype')
if bufname ==# ''
if buftype ==# ''
return '[No Name]'
elseif buftype ==# 'quickfix'
return '[Quickfix List]'
elseif buftype ==# 'nofile' || buftype ==# 'acwrite'
return '[Scratch]'
endif
endif
if buftype ==# 'nofile' || buftype ==# 'acwrite'
return bufname
endif
if a:tail
return fnamemodify(bufname, ':t')
endif
let fullpath = fnamemodify(bufname, ':p')
if exists('b:lcd') && b:lcd !=# ''
let bufname = matchstr(fullpath, '^\V\(' . escape(b:lcd, '\')
\ . '\v)?[/\\]?\zs.*')
endif
return bufname
endfunction
function! StatusLineExtra()
let extra = ''
for scope in ['w:', 'b:', 't:', 'g:']
if exists(scope . 'statusline_extra')
let extra .= {scope . 'statusline_extra'}
endif
endfor
return extra
endfunction
function! MakeStatusLine()
let line = ''
if s:check_flag('statusline_bufnr')
let line .= '[%n] ' " Buffer number.
endif
let line .= '%<' " Truncate point.
" Buffer name.
let line .= '%{GetBufname("", 0)}'
" Character encoding
let line .= " [%{(&fenc!=#''?&fenc:&enc).(&bomb?'(BOM)':'')}:"
" File format (+ &binary and &endofline)
let line .= "%{&ff.(&bin?'(BIN'.(&eol?'':'-noeol').')':'')}]"
let line .= '%y' " Filetype.
let line .= '%m' " Modified flag.
let line .= '%r' " Readonly flag.
let line .= '%h' " Help buffer hlag.
let line .= '%w' " Preview window flag.
" The state of SKK.
let line .= "%{exists('b:skk_on')&&b:skk_on?SkkGetModeStr():''}"
if exists('*eskk#statusline')
let line .= '%{eskk#statusline()}'
endif
if s:check_flag('statusline_highlight')
let line .= '[' . join(map(synstack(line('.'), col('.')),
\ 'synIDattr(v:val, "name")'.
\ '."(".synIDattr(synIDtrans(v:val), "name").")"'), ',') . ']'
endif
let line .= '%{StatusLineExtra()}'
" let line .= StatusLineExtra()
let line .= '%=' " Separation point.
if s:check_flag('statusline_filesize')
let line .= '[%{GetFileSize()}]' " Rough file size.
endif
if s:check_flag('statusline_char')
let line .= '[%{GetCharacterCode()}]' " Character code under the cursor.
endif
let line .= $LANG =~# '^ja' ? ' %l/%L %3v'
\ : ' %l/%LL %2vC' " Line and column.
let line .= ' %3p%%' " Percentage through file in lines.
return line
endfunction
function! s:tabpage_label(n)
let n = a:n
let bufnrs = tabpagebuflist(n)
let curbufnr = bufnrs[tabpagewinnr(n) - 1] " first window, first appears
let hi = n is tabpagenr() ? 'TabLineSel' : 'TabLine'
let label = ''
if getbufvar(curbufnr, '&filetype') =~# '^lingr-'
" lingr-vim
let unread = lingr#unread_count()
let status = lingr#status()
let label .= '%#' . hi . '#'
let label .= 'lingr - ' . status
if unread != 0
let label .= '(' . unread . ')'
endif
else
let no = len(bufnrs)
if no is 1
let no = ''
endif
let mod = len(filter(bufnrs, 'getbufvar(v:val, "&modified")')) ? '+' : ''
let sp = (no . mod) ==# '' ? '' : ' '
let fname = GetBufname(curbufnr, 1)
if no !=# ''
let label .= '%#' . hi . 'Number#' . no
endif
let label .= '%#' . hi . '#'
let label .= mod . sp . fname
endif
return '%' . a:n . 'T' . label . '%T%#TabLineFill#'
endfunction
function! MakeTabLine()
let titles = map(range(1, tabpagenr('$')), 's:tabpage_label(v:val)')
let sep = ' | '
let tabs = join(titles, sep) . sep . '%#TabLineFill#%T'
let info = '%#TabLine#'
if exists('t:tabline_extra')
let info .= t:tabline_extra . sep
endif
if s:has_plugin('cfi')
let info .= cfi#format('%s()' . sep, '')
endif
if exists('*Uptime')
let info .= Uptime(2) . sep
endif
let info .= fnamemodify(getcwd(), ":~") . ' '
return tabs . '%=' . info
endfunction
" == Behavior settings. == {{{1
" Enable FileType
filetype off " To reapply 'ftdetect/*.vim'.
filetype plugin indent on
" Search.
set ignorecase smartcase incsearch grepprg=internal
if has('migemo')
" 'migemo' option changes the behavior of "g?".
" NOTE: 'migemo' option is local to buffer.
set nomigemo migemodict=$HOME/.vim/dict/migemo/migemo-dict
endif
" Tab and indent.
set tabstop=2 shiftwidth=2 autoindent copyindent preserveindent
set cinoptions& cinoptions+=b1,l1,g0,N-s
set cinkeys& cinkeys+=0=break
" Auto reload when changed by external.
set autoread
" Enable backspace.
set backspace=indent,eol,start
" Allow move between line end and next line head.
set whichwrap=b,s,<,>,[,]
" Format settings for multi byte character.
set formatoptions& formatoptions+=mM formatoptions-=r formatoptions-=o
" The following needs autofmt plugin.
let g:plugin_format_disable = 1
set formatexpr=autofmt#japanese#formatexpr()
" Minimal number of screen lines to keep above and below the cursor.
set scrolloff=3
set nostartofline
set sidescroll=1 sidescrolloff=1
set modeline
" Open a window.
set splitbelow splitright
set switchbuf& switchbuf+=useopen
" Completion.
set complete& complete+=k
set completeopt& completeopt+=menuone completeopt-=preview
set infercase
" Command-line completion.
set wildmenu wildmode=list:longest,full
" Foldings.
set foldlevelstart=99
" History number for search and command mode.
set history=1000
set timeoutlen=5000
set nrformats& nrformats-=octal
" Backup.
set backup
set backupdir=./.backup,~/.backup
" Paths of swap file and backup file.
if $TMP !=# ''
execute 'set backupdir+=' . escape(expand($TMP), ' \')
elseif has('unix')
set backupdir+=/tmp
endif
let &directory = &backupdir
if has('persistent_undo')
set undodir=~/.backup
augroup vimrc-undofile
autocmd!
autocmd BufReadPre ~/* setlocal undofile
augroup END
endif
set backupcopy=yes
call s:mkdir(expand('~/.backup'))
if has('viminfo')
" TELLME: The history is not saved in specified number.
set viminfo='500,<500,s50,h,rA:,rB:
end
" Free move in Visual mode blockwise.
set virtualedit& virtualedit+=block
" Don't search tags file in current directory. And search upward.
set tags& tags-=tags tags+=./tags;
" view
set viewdir=~/.vim/view viewoptions-=options viewoptions+=slash,unix
augroup vimrc-view
autocmd!
autocmd BufLeave * if expand('%') !=# '' && &buftype ==# ''
\ | mkview
\ | endif
autocmd BufReadPost * if !exists('b:view_loaded') &&
\ expand('%') !=# '' && &buftype ==# ''
\ | silent! loadview
\ | let b:view_loaded = 1
\ | endif
autocmd VimLeave * call map(split(glob(&viewdir . '/*'), "\n"),
\ 'delete(v:val)')
augroup END
" autocmd
augroup vimrc-auto-cursorline
autocmd!
autocmd CursorMoved,CursorMovedI * call s:auto_cursorline('CursorMoved')
autocmd CursorHold,CursorHoldI * call s:auto_cursorline('CursorHold')
autocmd WinEnter * call s:auto_cursorline('WinEnter')
autocmd WinLeave * call s:auto_cursorline('WinLeave')
let s:cursorline_lock = 0
function! s:auto_cursorline(event)
if get(b:, 'cursorline_disable', 0)
return
endif
if a:event ==# 'WinEnter'
setlocal cursorline
let s:cursorline_lock = 2
elseif a:event ==# 'WinLeave'
setlocal nocursorline
elseif a:event ==# 'CursorMoved'
if s:cursorline_lock
if 1 < s:cursorline_lock
let s:cursorline_lock = 1
else
setlocal nocursorline
let s:cursorline_lock = 0
endif
endif
elseif a:event ==# 'CursorHold'
setlocal cursorline
let s:cursorline_lock = 1
endif
endfunction
augroup END
augroup vimrc-lcd
autocmd!
autocmd BufReadPre,BufFilePre * unlet! b:lcd
autocmd BufReadPost,BufFilePost,BufEnter * call s:lcd()
function! s:lcd()
if &l:buftype !=# '' && &l:buftype !=# 'help' ||
\ &l:filetype ==# 'vimfiler'
unlet! b:lcd
return
endif
if exists('b:lcd') &&
\ (b:lcd ==# '' || getcwd() =~# '^\V' . escape(b:lcd, '\') . '\$')
return
endif
let path = s:lcd_path()
if isdirectory(path)
lcd `=path`
let b:lcd = getcwd()
endif
endfunction
function! s:lcd_path()
let path = ''
let simple = expand('%:p:h')
if &l:buftype ==# 'help'
return simple
endif
let tf = tagfiles()
if !empty(tf)
let tagdir = fnamemodify(tf[0], ':p:h')
if tagdir !=# '' && simple[ : len(tagdir) - 1] ==# tagdir
return tagdir
endif
endif
let base = substitute(expand('%:p'), '\\', '/', 'g')
if base =~# '/src/'
let path = base[: strridx(base, '/src/') + 3]
endif
if path !=# ''
return path
endif
let base = simple
let dirs = ['.svn', '.git', '.bzr', '.hg']
if &l:filetype =~# '^\%(vim\|help\)$'
call add(dirs, 'doc')
endif
for d in dirs
let d = finddir(d, escape(base, ' ?*[]();') . ';')
if d !=# ''
let p = fnamemodify(d, ':p:h:h')
if strlen(path) < strlen(p)
let path = p
endif
endif
endfor
if path !=# ''
return path
endif
return simple
endfunction
augroup END
augroup vimrc-scratch-buffer
autocmd!
" Make a scratch buffer when unnamed buffer.
autocmd BufEnter * call s:scratch_buffer()
autocmd FileType qfreplace autocmd! vimrc-scratch * <buffer>
function! s:scratch_buffer()
if exists('b:scratch_buffer') || bufname('%') !=# '' || &l:buftype !=# ''
return
endif
let b:scratch_buffer = 1
call openbuf#add('scratch', bufnr('%'))
setlocal buftype=nofile nobuflisted noswapfile bufhidden=hide
augroup vimrc-scratch
autocmd! * <buffer>
autocmd BufWriteCmd <buffer> call s:scratch_on_BufWriteCmd()
augroup END
endfunction
function! s:scratch_on_BufWriteCmd()
silent! setl buftype< buflisted< swapfile< bufhidden< nomodified
autocmd! vimrc-scratch * <buffer>
if bufname('%') ==# '' && exists('b:scratch_buffer')
execute 'saveas' . (v:cmdbang ? '!' : '') ' <afile>'
filetype detect
endif
call openbuf#remove('scratch', bufnr('%'))
unlet! b:scratch_buffer
endfunction
augroup END
augroup vimrc-auto-mkdir
autocmd!
autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'), v:cmdbang)
function! s:auto_mkdir(dir, force)
if !isdirectory(a:dir) && (a:force ||
\ input(printf('"%s" does not exist. Create? [y/N]', a:dir)) =~? '^y\%[es]$')
call s:mkdir(a:dir)
endif
endfunction
augroup END
if executable('chmod')
augroup vimrc-autoexecutable
autocmd!
autocmd BufWritePost * call s:add_permission_x()
augroup END
function! s:add_permission_x()
let file = expand('%:p')
if getline(1) =~# '^#!' && !executable(file)
silent! call g:V.system('chmod a+x ' . shellescape(file))
endif
endfunction
endif
if has('vim_starting') && &binary " launched with -b option
augroup vimrc-xxd
autocmd!
autocmd BufReadPost * if &l:binary | setlocal filetype=xxd | endif
augroup END
endif
augroup vimrc-misc
autocmd!
" Jump to the last editing position.
autocmd BufReadPost * if line("'\"") && line("'\"") <= line('$')
\ | execute 'normal! g`"' | endif
" Set 'dictionary'.
autocmd FileType * if filereadable(expand('~/.vim/dict/' . &l:ft . '.dict'))
\ | let &l:dict='~/.vim/dict/' . &l:ft . '.dict' | endif
autocmd FileType * if &l:buftype !=# 'help' && &l:kp ==# '' &&
\ mapcheck('K', 'n') ==# ''
\ | silent! execute 'nnoremap <buffer> <unique> K <C-w>}' | endif
" Auto open/close Quickfix/location window.
autocmd QuickFixCmdPost [^l]* cwindow | redraw!
autocmd QuickFixCmdPost l* lwindow | redraw!
" Update filetype.
autocmd BufWritePost * if &l:filetype ==# '' || exists('b:ftdetect')
\ | unlet! b:ftdetect | filetype detect | endif
" Check timestamp more for 'autoread'.
autocmd WinEnter * checktime
autocmd BufReadPost bzr_log.* let &l:fileencoding = &termencoding
" Edit something to avoid the confirmation when aborting.
autocmd BufReadPost bzr_log.* if empty(getline(1))
\ | 1 delete _ | silent write
\ | endif
autocmd InsertEnter * if &l:foldmethod ==# 'expr'
\ | let b:foldinfo = [&l:foldmethod, &l:foldexpr]
\ | setlocal foldmethod=manual foldexpr=0
\ | endif
autocmd InsertLeave * if exists('b:foldinfo')
\ | let [&l:foldmethod, &l:foldexpr] = b:foldinfo
\ | endif
augroup END
" == Key mappings & command definition. == {{{1
" It is likely to be changed by $VIM/vimrc.
if has('vim_starting')
mapclear
mapclear!
endif
" Physical moving.
noremap j gj
noremap k gk
noremap gj j
noremap gk k
noremap <expr> 0 &l:wrap ? 'g0' : '0'
noremap <expr> g0 &l:wrap ? '0' : 'g0'
noremap <expr> ^ &l:wrap ? 'g^' : '^'
noremap <expr> g^ &l:wrap ? '^' : 'g^'
noremap <expr> $ &l:wrap ? 'g$' : '$'
noremap <expr> g$ &l:wrap ? '$' : 'g$'
" Yank to the end of line. (It is same as C and D)
nnoremap Y y$
" Current line at center of window and open the folding.
noremap n nzzzv
noremap N Nzzzv
" Very magic by default.
nnoremap / /\v
nnoremap ? ?\v
nnoremap <Space>/ :<C-u>set hlsearch<CR>/\v
nnoremap <Space>? :<C-u>set hlsearch<CR>?\v
cnoremap <expr> s/ getcmdline() =~# '^\A*$' ? 's/\v' : 's/'
cnoremap <expr> g/ getcmdline() =~# '^\A*$' ? 'g/\v' : 'g/'
cnoremap <expr> v/ getcmdline() =~# '^\A*$' ? 'v/\v' : 'v/'
cnoremap s// s//
cnoremap g// g//
cnoremap v// v//
" Control search highlight.
noremap <silent> <Plug>(vimrc-searchafter) Nzz:set hlsearch<CR>
map * <Plug>(visualstar-*)<Plug>(vimrc-searchafter)
map # <Plug>(visualstar-#)<Plug>(vimrc-searchafter)
map g* <Plug>(visualstar-g*)<Plug>(vimrc-searchafter)
map g# <Plug>(visualstar-g#)<Plug>(vimrc-searchafter)
nnoremap <silent> <ESC><ESC> :<C-u>set nohlsearch<CR>
" Search selected area.
vnoremap <silent> z/ <ESC>/\v%V
vnoremap <silent> z? <ESC>?\v%V
" Switch the tab page.
nnoremap <C-n> gt
nnoremap <C-p> gT
" Scroll + Move
nnoremap <C-j> <C-e>gj
nnoremap <C-k> <C-y>gk
" Swap ; and :
noremap ; :
noremap : ;
" Speedy :h
nnoremap <expr> <C-h>
\ printf(":\<C-u>%s ", (78 * 2 <= winwidth(0) ? 'vert ' : '') . 'h')
" Quick completion.
inoremap <C-]> <C-x><C-]>
" Create an undo point before <C-u> and <C-w>.
inoremap <expr> <C-u> (pumvisible() ? "\<C-e>" : '') . "\<C-g>u\<C-u>"
inoremap <expr> <C-w> "\<C-g>u\<C-w>"
inoremap <expr> <CR> pumvisible() ? "\<C-y>\<CR>" : "\<CR>"
inoremap <C-l> <C-o><C-l>
" To uppercase/lowercase the word immediately before.
inoremap <C-g><C-u> <ESC>gUiwgi
inoremap <C-g><C-l> <ESC>guiwgi
" Select the last changed.
nnoremap <expr> gc '`[' . getregtype()[0] . '`]'
onoremap <silent> gc :normal gc<CR>
onoremap <silent> gv :normal gv<CR>
onoremap q /["',.{}()[\]<>]<CR>
" Prevent a typing error.
nmap <C-@> <ESC>
imap <C-@> <ESC>
cmap <C-@> <C-c>
nnoremap <Left> <C-w>h
nnoremap <Down> <C-w>j
nnoremap <Up> <C-w>k
nnoremap <Right> <C-w>l
nnoremap <M-h> <C-w>h
nnoremap <M-j> <C-w>j
nnoremap <M-k> <C-w>k
nnoremap <M-l> <C-w>l
nnoremap <M-H> <C-w>H
nnoremap <M-J> <C-w>J
nnoremap <M-K> <C-w>K
nnoremap <M-L> <C-w>L
" Don't use commands.
noremap ZZ <Nop>
noremap ZQ <Nop>
noremap <C-z> <Nop>
" Mappings for command-line mode.
cnoremap <C-a> <C-b>
cnoremap <C-f> <Right>
cnoremap <C-b> <Left>
" Move the cursor not complete list.
cnoremap <Left> <Space><BS><Left>
cnoremap <Right> <Space><BS><Right>
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>
cnoremap <Up> <C-p>
cnoremap <Down> <C-n>
nnoremap <Space> <Nop>
" Quick save and quit.
nnoremap <silent> <Space>w :<C-u>update<CR>
nnoremap <silent> <Space>W :<C-u>update!<CR>
nnoremap <silent> <Space>q :<C-u>quit<CR>
nnoremap <silent> <Space>Q :<C-u>quit!<CR>
" Change encodings and formats.
nnoremap <Space>e <Nop>
nnoremap <silent> <Space>es :<C-u>setl fenc=cp932<CR>
nnoremap <silent> <Space>ee :<C-u>setl fenc=euc-jp<CR>
nnoremap <silent> <Space>eu :<C-u>setl fenc=utf-8<CR>
nnoremap <silent> <Space>ej :<C-u>setl fenc=iso-2022-jp<CR>
nnoremap <silent> <Space>ed :<C-u>setl ff=dos<CR>
nnoremap <silent> <Space>ex :<C-u>setl ff=unix<CR>
" Change statusline.
nnoremap <Space>s <Nop>
for [s:key, s:var] in [['n', 'bufnr'], ['c', 'char'],
\ ['s', 'filesize'], ['h', 'highlight']]
for [s:prefix, s:scope] in [['', 'g'], ['b', 'b'], ['w', 'w']]
execute printf('nnoremap <silent> <Space>s%s%s '
\ . ':<C-u>call <SID>toggle_flag("%s:statusline_%s")<CR>',
\ s:prefix, s:key, s:scope, s:var)
endfor
endfor
unlet! s:key s:var s:prefix s:scope
" Quick toggle options.
nnoremap <Space>o <Nop>
nnoremap <silent> <Space>oe :<C-u>setlocal expandtab! expandtab?<CR>
nnoremap <silent> <Space>of :<C-u>let &l:foldcolumn=1-&l:foldcolumn<CR>
\:setlocal foldcolumn?<CR>
nnoremap <silent> <Space>on :<C-u>setlocal number! number?<CR>
nnoremap <silent> <Space>ol :<C-u>setlocal list! list?<CR>
nnoremap <silent> <Space>ow :<C-u>setlocal wrap! wrap?<CR>
nnoremap <silent> <Space>op :<C-u>set paste! paste?<CR>
nnoremap <Space>t <Nop>
nnoremap <silent> <Space>tn :<C-u>tabnew<CR>
nnoremap <silent> <Space>tc :<C-u>tabclose<CR>
function! s:grep_same_ext(pat)
let exts = get({
\ 'c': ['c', 'h'],
\ 'cpp': ['cpp', 'h', 'hpp'],
\ }, &l:filetype, [expand('%:e')])
let files = join(map(exts, '"**/*." . v:val'), ' ')
silent! execute 'vimgrep /' . a:pat . '/j ' . files
endfunction
nnoremap <silent> <Space>grep :<C-u>call <SID>grep_same_ext('\C' . @/)<CR>
nnoremap <silent> <Space>Grep :<C-u>call <SID>grep_same_ext('\c' . @/)<CR>
nnoremap <silent> <Space><C-g> :<C-u>vimgrep /<C-r>// %<CR>
" <Space><C-n>, <Space><C-p>: Move window position {{{
nnoremap <silent> <Space><C-n> :<C-u>call <SID>swap_window(v:count1)<CR>
nnoremap <silent> <Space><C-p> :<C-u>call <SID>swap_window(-v:count1)<CR>
function! s:swap_window(n)
let curbuf = bufnr('%')
let target = s:modulo(winnr() + a:n - 1, winnr('$')) + 1
" 'hide' is necessary to keep the undo history.
execute 'hide' winbufnr(target) . 'buffer'
execute target . 'wincmd w'
execute curbuf . 'buffer'
endfunction
" }}}
" Shortcut enc and ff.
cnoreabbrev ++u ++enc=utf8
cnoreabbrev ++c ++enc=cp932
cnoreabbrev ++s ++enc=cp932
cnoreabbrev ++e ++enc=euc-jp
cnoreabbrev ++j ++enc=iso-2022-jp
cnoreabbrev ++x ++ff=unix
cnoreabbrev ++d ++ff=dos
cnoreabbrev ++m ++ff=mac
" This is for editing list separated by a arbitrary character such as $PATH.
nnoremap <silent> <Space>; :<C-u>call <SID>toggle_separate()<CR>
function! s:toggle_separate()
let c = getchar()
if type(c) == type(0)
let c = nr2char(c)
endif
if c !~# '[[:print:]]'
return
endif
if stridx(getline('.'), c) < 0
%s/\n/\=c
normal! m`$x``
else
execute '%s/\V' . escape(c, '\/') . '/\r/g'
silent global/^$/delete _
endif
endfunction
" Generate help tags.
command! -bar -bang Helptags call rtputil#helptags(<bang>1)
" Show the diff between the current buffer and the last saved file. {{{
" TODO: Become plugin.
function! s:diff_original()
if exists('b:diff_current')
execute bufwinnr(b:diff_current) 'wincmd w'
endif
if exists('b:diff_original')
diffoff
execute b:diff_original 'bwipeout'
unlet b:diff_original
return
endif
let bufnr = bufnr('%')
let ft = &l:filetype
let fenc = &l:fileencoding
if &modified
let source = '#' . bufnr
let file = '[last save]'
endif
if !exists('source')
silent! call g:V.system('svn info')
if !g:V.get_last_status()
let source = '!svn cat #' . bufnr
let file = '[svn HEAD]'
endif
endif
if !exists('source')
silent! call g:V.system('bzr info')
if !g:V.get_last_status()
let source = '!bzr cat #' . bufnr
let file = '[bzr tip]'
endif
endif
if !exists('source')
silent! let git_dir = g:V.system('git rev-parse --git-dir')
if git_dir !=# ''
let source = '!git cat-file blob HEAD:' .
\ expand('#' . bufnr . ':p')[strlen(fnamemodify(git_dir, ':p')) - 5:]
let source = substitute(source, '\\', '/', 'g')
let file = '[git HEAD]'
endif
endif
if !exists('source')
echo 'There is not the diff.'
return
endif
vertical new
let b:diff_current = bufnr
let bufnr = bufnr('%')
setlocal buftype=nofile
let &l:filetype = ft
let &l:fileencoding = fenc
file `=file . fnamemodify(bufname(b:diff_current), ':.')`
silent! execute 'read' source
0 delete _
diffthis
wincmd p
diffthis
let b:diff_original = bufnr
endfunction
nnoremap <silent> <Space>diff :call <SID>diff_original()<CR>
" }}}
" Translation interface. {{{
" trans.pl is a translation filter via web translation.
let g:trans = expand('~/.vim/bin/trans.pl')
let g:trans_vimproc = 0
if executable('perl') && filereadable(g:trans)
nnoremap <silent> <Space>tt :<C-u>set operatorfunc=<SID>echo_translate<CR>g@
nnoremap <silent> <Space>ts :<C-u>set operatorfunc=<SID>swap_translate<CR>g@
vnoremap <silent> <Space>tt :<C-u>echo <SID>translate(visualmode(), 1)<CR>
vnoremap <silent> <Space>ts :<C-u>call <SID>swap_translate(visualmode(), 1)<CR>
command! -nargs=+ Trans echo s:translate(<q-args>, 2)
function! s:echo_translate(type)
echo s:translate(a:type)
endfunction
function! s:swap_translate(type, ...)
let [save_reg, save_reg_type] = [getreg('"'), getregtype('"')]
let @" = s:translate(a:type, a:0 && a:1)
normal! gvp
call setreg('"', save_reg, save_reg_type)
endfunction
function! s:translate(type, ...)
if a:0 && a:1 is 2
let s = a:type
else
let s = s:get_range(a:type, a:0 && a:1 ? 'v' : 'o')
endif
if &filetype ==# 'help'
let s = substitute(s, '[*|]', '', 'g')
endif
if s =~# '^\S*$'
let s = substitute(s, '\(\l\)\(\u\)', '\1 \2', 'g')
let s = substitute(s, '[_-]', ' ', 'g')
let s = substitute(s, '\u\{2,}', '\0 ', 'g')
let s = substitute(s, '\s\+', ' ', 'g')
let s = substitute(tolower(s), '^\s*\|\s*$', '', 'g')
endif
echo 'During translation...'
let s = exists('*vimproc#system') && g:trans_vimproc
\ ? vimproc#system(['perl', g:trans], s)
\ : g:V.system('perl ' . shellescape(g:trans), s)
echo ''
redraw
return substitute(s, '^\_s*\|\_s*$', '', 'g')
endfunction
endif
" }}}
" -- Commands.
command! -nargs=1 -bang -bar -complete=file Rename
\ call s:move(<q-args>, <q-bang>, expand('%:h'))
command! -nargs=1 -bang -bar -complete=file Move
\ call s:move(<q-args>, <q-bang>, getcwd())
function! s:move(file, bang, base)
let pwd = getcwd()
cd `=a:base`
try
let from = expand('%:p')
let to = simplify(expand(a:file))
let bang = a:bang
if isdirectory(to)
let to .= '/' . fnamemodify(from, ':t')
endif
if filereadable(to) && !bang
echo '"' . to . '" is exists. Overwrite? [yN]'
if nr2char(getchar()) !=? 'y'
echo 'Cancelled.'
return
endif
let bang = '!'
endif
let dir = fnamemodify(to, ':h')
call s:mkdir(dir)
execute 'saveas' . bang '`=to`'
call delete(from)
finally
cd `=pwd`
endtry
endfunction
command! -nargs=? -bang -bar -complete=file Delete
\ call s:delete_with_confirm(<q-args>, <bang>0)
function! s:delete_with_confirm(file, force)
let file = a:file ==# '' ? expand('%') : a:file
if !a:force
echo 'Delete "' . file . '"? [y/N]:'
endif
if a:force || nr2char(getchar()) ==? 'y'
call delete(file)
echo 'Deleted "' . file . '"!'
else
echo 'Cancelled.'
endif
endfunction
" unique lines without sort.
command! -bar -range=% Unique <line1>,<line2>call s:unique_lines()
function! s:unique_lines() range
let lines = {}
let duplines = []
let lnum = a:firstline
for line in getline(a:firstline, a:lastline)
let line = '_' . line
if has_key(lines, line)
call insert(duplines, lnum)
else
let lines[line] = 1
endif
let lnum += 1
endfor
for lnum in duplines
execute lnum 'delete _'
endfor
endfunction
" FIXME: :diffoff make 'foldmethod' to "namual" (not restored).
command! -bar Diff if &diff | execute 'windo diffoff' | else
\ | execute 'windo diffthis' | endif
if executable('ctags')
" Execute ctags command. And echo for error.
command! -nargs=? -complete=file -bar CtagsR call CtagsR([<f-args>])
function! CtagsR(args)
let args = a:args
let dir = '.'
if !empty(args) && isdirectory(args[0])
let dir = args[0]
call remove(args, 0)
endif
if !empty(args) && args[0] !~# '^-'
echoerr 'Invalid options: ' . join(args)
return
endif
let tagfile = s:tagfile()
if tagfile !=# ''
let dir = fnamemodify(tagfile, ':h')
let args += ['-f', tagfile]
endif
if s:is_windows()
let enc = get({
\ 'utf-8': 'utf8',
\ 'cp932': 'sjis',
\ 'euc-jp': 'euc',
\ }, &l:fileencoding ==# '' ? &encoding : &l:fileencoding, '')
if enc !=# ''
let args += ['--jcode=' . enc]
endif
endif
let lang = get({
\ 'cpp': 'C++',
\ 'c': 'C++',
\ 'java': 'Java',
\ }, &l:filetype, '')
if lang !=# ''
let args += ['--languages=' . lang]
endif
call map(add(args, dir), 'shellescape(v:val)')
let cmd = printf('ctags -R --tag-relative=yes %s', join(args))
if s:is_windows()
let cmd = 'start /b ' . cmd
else
let cmd .= ' &'
endif
silent execute '!' . cmd
endfunction
function! s:tagfile()
let files = tagfiles()
return empty(files) ? '' : files[0]
endfunction
nnoremap <silent> <Space>tr :<C-u>CtagsR<CR>
endif
command! -bar Tasks execute 'vimgrep /\C\v<(TODO|FIXME|XXX):/ **/*.'
\ . expand('%:e')
" Show 'runtimepath'.
command! -bar RTP echo substitute(&runtimepath, ',', "\n", 'g')
" :HighlightWith {filetype} ['a 'b] XXX: Don't work in some case.
command! -nargs=+ -range=% HighlightWith
\ <line1>,<line2>call s:highlight_with(<q-args>)
function! s:highlight_with(args) range
if a:firstline == 1 && a:lastline == line('$')
return
endif
let c = get(b:, 'highlight_count', 0)
let ft = matchstr(a:args, '^\w\+')
if globpath(&rtp, 'syntax/' . ft . '.vim') ==# ''
return
endif
if exists('b:current_syntax')
let syntax = b:current_syntax
unlet b:current_syntax
endif
let save_isk= &l:isk " for scheme.
let hlname = 'highlightWith' . substitute(ft, '^.', '\u\0', '')
if c != 0
let hlname .= '_' . c
endif
execute printf('syntax include @%s syntax/%s.vim', hlname, ft)
let &l:isk= save_isk
execute printf('syntax region %s start=/\%%%dl/ end=/\%%%dl$/ '
\ . 'contains=@%s containedin=ALL',
\ hlname, a:firstline, a:lastline, hlname)
let b:highlight_count = c + 1
if exists('syntax')
let b:current_syntax = syntax
endif
endfunction
" Grep({text}, {pat} [, invert])
function! Grep(text, pat, ...)
let op = a:0 && a:1 ? '!~#' : '=~#'
return join(filter(split(a:text, "\n"), 'v:val' . op . 'a:pat'), "\n")
endfunction
" CommandGrep
function! Cgrep(cmd, pat, ...)
return Grep(Redir(a:cmd), a:pat, a:0 && a:1)
endfunction
function! s:cgrep(args, v)
let list = matchlist(a:args, '^\v(/.{-}\\@<!/|\S+)\s+(.+)$')
if empty(list)
call s:echomsg('Cgrep: Invalid arguments: ' . a:args)
return
endif
let pat = list[1] =~# '^/.*/$' ? list[1][1 : -2] : list[1]
echo Cgrep(list[2], pat, a:v)
endfunction
command! -nargs=+ -bang Cgrep call s:cgrep(<q-args>, <bang>0)
command! -nargs=+ Vars PP filter(copy(g:), 'v:key =~# "^<args>"')
" == Setting according to environments. == {{{1
" cygwin (UTF-8) {{{2
if has('win32unix')
set termencoding=
endif
" Use a mouse in terminal. {{{2
set mouse=a
" For GNU Screen and tmux. {{{2
if $WINDOW !=# '' || $TMUX !=# ''
let s:window = 1
" Use a mouse in screen.
if has('mouse')
set ttymouse=xterm2
endif
function! s:set_window_name(name)
let esc = "\<ESC>"
silent! execute '!echo -n "' . esc . 'k' . escape(a:name, '%#!')
\ . esc . '\\"'
redraw!
endfunction
command! -nargs=? WindowName call s:set_window_name(<q-args>)
function! s:auto_window_name()
let varname = 'window_name'
for scope in ['w:', 'b:', 't:', 'g:']
if exists(scope .varname)
call s:set_window_name(eval(scope . varname))
return
endif
endfor
if bufname('%') !~# '^\[A-Za-z0-9\]*:/'
call s:set_window_name('v:' . expand('%:t'))
endif
endfunction
augroup vimrc-screen
autocmd!
autocmd VimEnter * call s:set_window_name(0 < argc() ?
\ 'v:' . fnamemodify(argv(0), ':t') : 'vim')
autocmd BufEnter,BufFilePost * call s:auto_window_name()
autocmd VimLeave * call s:set_window_name(len($SHELL) ?
\ fnamemodify($SHELL, ':t') : 'shell')
augroup END
if $TMUX !=# ''
function! s:vim_plugin_test()
let file = expand('%:p')
let plugin = matchstr(file, s:vim_plugin_dir . '/\zs[^/]\+')
if plugin ==# ''
call s:print_error('Not in vim plugin.')
return
endif
call g:V.system(printf('tmux new-window "zsh -i -c \"cd %s/%s; vim\""',
\ s:vim_plugin_dir, plugin))
endfunction
endif
endif
" GUI {{{2
if has('gui_running')
" My default gui settings.
function! s:init_guioptions()
" GUI option to use by default.
winpos 0 0
" Disable Toolbar and menu, and use non-GUI tab pages line.
set guioptions-=T guioptions-=m guioptions-=e
" Hide any scrollbar.
set guioptions-=l guioptions-=r guioptions-=L guioptions-=R
if has('kaoriya') && s:is_windows()
set guioptions+=C " Remove caption (title) bar. Support Windows only.
endif
if s:is_windows()
set guifont=M+2VM+IPAG_circle:h9:cDEFAULT,MS_Gothic:h9:cDEFAULT
elseif has('x11')
set guifont=
elseif has('unix')
set guifont=M+2M+IPAG\ 9
endif
endfunction
command! -nargs=0 -bar InitGuioptions call s:init_guioptions()
let $MYGVIMRC = expand('~/.gvimrc')
if !filereadable($MYGVIMRC)
InitGuioptions
endif
" Save guioptions and window info to $MYGVIMRC when leaving vim.
augroup vimrc-guioptons
autocmd!
autocmd VimLeavePre * call s:save_options()
function! s:save_options()
if !exists('$MYGVIMRC')
return
endif
let [x, y] = $XMING ? [0, 0] : [getwinposx(), getwinposy()]
let options = [
\ 'set columns=' . &columns,
\ 'set lines=' . &lines,
\ 'winpos ' . x . ' ' . y,
\ 'set guioptions=' . &guioptions,
\ 'set guifont=' . escape(&guifont, '\ '),
\ ]
call writefile(options, $MYGVIMRC)
endfunction
augroup END
function! s:vim_plugin_test()
let file = expand('%:p')
let plugin = matchstr(file, s:vim_plugin_dir . '/\zs[^/]\+')
if plugin ==# ''
call s:print_error('Not in vim plugin.')
return
endif
call vimproc#system_bg(printf('gvim --cmd "cd %s/%s"',
\ s:vim_plugin_dir, plugin))
endfunction
" Do not use IM by default.
set iminsert=0 imsearch=0
else
" CUI {{{2
if executable('winclip')
nnoremap <silent> "+y :<C-u>set operatorfunc=<SID>winclip<CR>g@
nnoremap <silent> "*y :<C-u>set operatorfunc=<SID>winclip<CR>g@
vnoremap <silent> "+y :<C-u>call <SID>winclip()<CR>
vnoremap <silent> "*y :<C-u>call <SID>winclip()<CR>
vnoremap <silent> "+Y :w !winclip<CR><CR>
vnoremap <silent> "*Y :w !winclip<CR><CR>
function! s:winclip(...)
let s = s:get_range(a:0 ? a:1 : visualmode(), a:0 ? 'o' : 'v')
let temp = tempname()
call writefile(split(s, "\n", 1), temp, 'b')
silent! execute '!winclip ' . shellescape(temp)
call delete(temp)
endfunction
endif
if has('unix')
" Use meta keys in console.
function! s:use_meta_keys()
for i in map(
\ range(char2nr('a'), char2nr('z'))
\ + range(char2nr('A'), char2nr('Z'))
\ + range(char2nr('0'), char2nr('9'))
\ , 'nr2char(v:val)')
" <ESC>O do not map because used by arrow keys.
if i !~# '[O]'
execute 'nmap <ESC>' . i '<M-' . i . '>'
endif
endfor
endfunction
call s:use_meta_keys()
map <NUL> <C-Space>
map! <NUL> <C-Space>
endif
endif
" :VimPluginTest {{{2
if exists('*s:vim_plugin_test')
let s:vim_plugin_dir = expand('~/work/vim-plugins')
command! PluginTest call s:vim_plugin_test()
endif
" == Filetype settings. == {{{1
" Java
let g:java_highlight_functions = 'style'
let g:java_highlight_all = 1
let g:java_allow_cpp_keywords = 1
" Python
let g:python_highlight_all = 1
" Scheme
let g:is_gauche = 1
" gauref
let g:gauref_file = '~/.vim/ftplugin/scheme/gauche-refj.txt'
" bash
let g:is_bash = 1
" XML
let g:xml_syntax_folding = 1
" Vim
let g:vimsyntax_noerror = 1
let g:vim_indent_cont = 0
" lisp
let g:lisp_rainbow = 1
" Clojure
let g:vimclojure#HighlightBuiltins = 1
let g:vimclojure#ParenRainbow = 1
" bzr
let g:bzr_highlight_diff = 1
" doxygen
let g:doxygen_end_punctuation = '[.]'
" == Plugin settings. == {{{1
let s:user_rtp = expand('~/.vim')
let s:custom_rtp = expand('~/.vim/custom')
let s:plugin_info = s:user_rtp . '/info'
let s:temp_file_pat = join([
\ '/svn-commit\%(\.\d\+\)\?\.tmp$',
\ '.git/COMMIT_EDITMSG$',
\ '/bzr_log\..\{6}$',
\ ], '\|')
if $TMP !=# ''
let s:temp_file_pat .=
\ '\|^' . substitute(expand($TMP), '\', '[/\\\\]', 'g')
elseif has('unix')
let s:temp_file_pat .= '\|^/tmp/\|^/var/tmp/'
endif
" netrw.vim {{{2
let g:netrw_home = s:plugin_info . '/netrw'
" taglist.vim {{{2
let g:Tlist_Show_One_File = 1
let g:Tlist_Exit_OnlyWindow = 1
nnoremap <silent> <Leader>l :<C-u>TlistToggle<CR>
" vimshell.vim {{{2
let g:vimshell_vimshrc_path = $HOME . '/.vim/vimshrc'
let g:vimshell_enable_interactive = 1
let g:vimshell_temporary_directory = s:plugin_info . '/vimshell'
let g:vimshell_scrollback_limit = 100000
let g:vimshell_prompt = '% '
let g:vimshell_user_prompt = 'fnamemodify(getcwd(), ":~") . " " .' .
\ 'vimshell#vcs#info("(%s)-[%b]", "(%s)-[%b|%a]")'
let g:vimshell_ignore_case = 1
let g:vimshell_smart_case = 1
if !exists('g:vimshell_execute_file_list')
let g:vimshell_execute_file_list = {
\ 'rb': 'ruby',
\ 'pl': 'perl',
\ 'py': 'python',
\ 'scm': 'gosh',
\ 'hs': 'runghc',
\ 'scala': 'scala',
\ 'lua': 'lua',
\ 'jar': 'java -jar',
\ }
endif
nmap <Leader>sh <Plug>(vimshell_split_switch)
nmap <Leader>sH <Plug>(vimshell_split_create)
augroup vimrc-plugin-vimshell
autocmd!
autocmd FileType int-* call s:init_vimshell_int()
autocmd FileType term-* call s:init_vimshell_term()
augroup END
function! s:vimshell_complete_history()
if exists('b:interactive') && has_key(b:interactive, 'command_history')
call complete(len(vimshell#get_prompt()) + 1, b:interactive.command_history)
endif
return ''
endfunction
function! s:init_vimshell_int()
silent! iunmap <buffer> <C-l>
inoremap <silent> <buffer> <SID>(vimshell_complete_history)
\ <C-r>=<SID>vimshell_complete_history()<CR><C-p>
imap <buffer> <silent> <C-q> <SID>(vimshell_complete_history)
inoremap <buffer> <expr>
\ <C-k> unite#sources#vimshell_history#start_complete(1)
nnoremap <buffer> <expr>
\ <C-k> unite#sources#vimshell_history#start_complete(0)
nnoremap <buffer> <C-n> gt
nnoremap <buffer> <C-p> gT
endfunction
function! s:init_vimshell_term()
imap <buffer> <ESC> <Plug>(vimshell_term_send_escape)
inoremap <buffer> <ESC><ESC> <ESC>
endfunction
" vimfiler.vim {{{2
let g:vimfiler_as_default_explorer = 1
let g:vimfiler_execute_file_list = {}
for s:i in split(
\ 'asm,bash,c,cc,cf,cfg,cgi,class,clj,cnf,conf,cpp,cs,css,csv,diff,dtd,el,' .
\ 'erb,erl,go,groovy,h,hpp,hs,ini,io,jam,java,jax,js,json,jsp,lhs,log,lua,' .
\ 'map,mf,mkd,ml,ng,note,objectmacro,patch,php,pl,pm,po,pro,properties,ps1,' .
\ 'py,rb,reg,sablecc,scala,scm,sh,sql,ss,tex,txt,vba,viki,vim,vimgolf,xml,' .
\ 'xsl,xul,y,yaml,yml,zsh', ',')
let g:vimfiler_execute_file_list[s:i] = 'vim'
endfor
unlet s:i
" neocomplcache.vim {{{2
let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_enable_prefetch = 1
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_temporary_dir = s:plugin_info . '/neocomplcache'
let g:neocomplcache_snippets_dir = s:custom_rtp . '/snippets'
let g:neocomplcache_disable_caching_file_path_pattern =
\ s:temp_file_pat . '\m\|\[.*\]$'
let g:neocomplcache_max_list = 10000
let g:neocomplcache_max_keyword_width = 100
call s:set_default('g:neocomplcache_keyword_patterns',
\ {'javascript' : '\v\k+'})
if getftype('/usr/lib/llvm/libclang.so') ==# 'file' && 0
let g:neocomplcache_clang_use_library = 1
let g:neocomplcache_clang_library_path = '/usr/lib/llvm'
let g:neocomplcache_clang_debug = 1
else
call s:set_default('g:neocomplcache_plugin_disable',
\ {'clang_complete' : 1})
endif
let g:neocomplcache_auto_completion_start_length = 1
let g:neocomplcache_plugin_completion_length_list = {
\ 'snippets_complete' : 1,
\ 'buffer_complete' : 2,
\ 'syntax_complete' : 2,
\ 'tags_complete' : 3,
\ }
function! s:tab_wrapper()
if neocomplcache#sources#snippets_complete#expandable()
return "\<Plug>(neocomplcache_snippets_jump)"
elseif pumvisible()
return "\<C-y>"
elseif (!exists('b:smart_expandtab') || b:smart_expandtab) &&
\ !&l:expandtab && !search('^\s*\%#', 'nc')
return repeat(' ', &l:tabstop - (virtcol('.') - 1) % &l:tabstop)
endif
return "\<Tab>"
endfunction
inoremap <silent> <Plug>(adjust-indent) <ESC>==I
imap <silent> <expr> <Tab> <SID>tab_wrapper()
inoremap <expr> <C-f> neocomplcache#manual_filename_complete()
inoremap <expr> <C-y> pumvisible() ? neocomplcache#close_popup() : "\<C-y>"
inoremap <expr> <C-e> pumvisible() ? neocomplcache#cancel_popup() : "\<C-e>"
" Start editing with any key in the select mode.
" This overwrites :vmap.
augroup vimrc-plugin-snippets
autocmd!
autocmd VimEnter,BufEnter * call s:snippets_remap()
augroup END
function! s:snippets_remap()
smapclear
smapclear <buffer>
smap <silent> <Tab> <ESC>a<Plug>(neocomplcache_snippets_expand)
snoremap <C-h> _<C-h>
endfunction
" unite.vim {{{2
let g:unite_data_directory = s:plugin_info . '/unite'
let g:unite_enable_start_insert = 1
let g:unite_source_file_ignore_pattern = '/\.\%(svn\|/\)\?$\|/tags\%(-..\)\?$'
let g:unite_source_file_mru_limit = 1000
let g:unite_source_file_mru_ignore_pattern = s:temp_file_pat
nnoremap <silent> <Leader>z :<C-u>Unite -buffer-name=file
\ file_mru file buffer<CR>
nnoremap <silent> <Leader>a <Nop>
nnoremap <silent> <Leader>ab :<C-u>Unite -buffer-name=file buffer<CR>
nnoremap <silent> <Leader>af :<C-u>Unite -buffer-name=file file<CR>
nnoremap <silent> <Leader>aF :<C-u>UniteWithBufferDir -buffer-name=file file<CR>
nnoremap <silent> <Leader>a<C-f> :<C-u>UniteWithBufferDir -buffer-name=file file<CR>
nnoremap <silent> <Leader>am :<C-u>Unite -buffer-name=file file_mru<CR>
nnoremap <silent> <Leader>ar :<C-u>Unite -buffer-name=file file_rec<CR>
nnoremap <silent> <Leader>a<Tab> :<C-u>Unite -vertical tab<CR>
nnoremap <silent> <Leader>ah :<C-u>Unite help<CR>
nnoremap <silent> <Leader>ao :<C-u>Unite -buffer-name=outline -vertical -no-start-insert -create outline<CR>
nnoremap <silent> <Leader>at :<C-u>Unite tag<CR>
nnoremap <silent> <Leader>aT :<C-u>Unite tag/file<CR>
nnoremap <silent> <Leader>a<C-t> :<C-u>Unite tag/file<CR>
nnoremap <silent> <Leader>a: :<C-u>Unite history/command<CR>
nnoremap <silent> <Leader>a; :<C-u>Unite history/command<CR>
nnoremap <silent> <Leader>a/ :<C-u>Unite history/search<CR>
nnoremap <silent> <Leader>aq :<C-u>Unite qf<CR>
nnoremap <silent> <Leader>ag :<C-u>Unite -no-quit grep:**<CR>
nnoremap <silent> <C-]> :<C-u>Unite -immediately -no-start-insert tag:<C-r>=expand('<cword>')<CR><CR>
vnoremap <silent> <C-]> :<C-u>Unite -immediately -no-start-insert -input=<C-r>=escape(<SID>get_range(visualmode(), 'v'), '\ ')<CR> tag<CR>
nnoremap <silent> <C-w><C-]> :<C-u>Unite -immediately -no-start-insert -default-action=split tag:<C-r>=expand('<cword>')<CR><CR>
vnoremap <silent> <C-w><C-]> :<C-u>Unite -immediately -no-start-insert -input=<C-r>=escape(<SID>get_range(visualmode(), 'v'), '\ ')<CR> -default-action=split tag<CR>
call unite#set_substitute_pattern('file', '\$\w\+', '\=eval(submatch(0))', 200)
call unite#set_substitute_pattern('file', '[^~.]\zs/', '*/*', 20)
call unite#set_substitute_pattern('file', '/\ze[^*]', '/*', 10)
call unite#set_substitute_pattern('file', '^\ze[^*;@\\/]', '*', 9)
call unite#set_substitute_pattern('file', '^@@', '\=getcwd()."/*"', 2)
call unite#set_substitute_pattern('file', '^@', '\=expand("#:p:h")."/*"', 1)
call unite#set_substitute_pattern('file', '^\\', '~/*')
call unite#set_substitute_pattern('file', '^;v', '~/.vim/*')
call unite#set_substitute_pattern('file', '^;a', '~/.vim/autoload/*')
call unite#set_substitute_pattern('file', '^;b', '~/.vim/bundle/*')
call unite#set_substitute_pattern('file', '^;l', '~/.vim/labs/*')
call unite#set_substitute_pattern('file', '^;g', '~/.vim/plugin/*')
call unite#set_substitute_pattern('file', '^;s', '~/.vim/syntax/*')
call unite#set_substitute_pattern('file', '^;c', '~/.vim/custom/*')
call unite#set_substitute_pattern('file', '^;f', '~/.vim/custom/after/ftplugin/*')
call unite#set_substitute_pattern('file', '^;r', rtputil#split())
if has('win32') || has('win64')
call unite#set_substitute_pattern('file', '^;p', 'C:/Program Files/*')
endif
if isdirectory(expand('~/work/vim-plugins'))
call unite#set_substitute_pattern('file', '^;d', '~/work/vim-plugins/*')
endif
call unite#set_substitute_pattern('file', '\*\*\+', '*', -1)
call unite#set_substitute_pattern('file', '^\~', escape($HOME, '\'), -2)
call unite#set_substitute_pattern('file', '\\\@<! ', '\\ ', -20)
call unite#set_substitute_pattern('file', '\\ \@!', '/', -30)
call unite#set_substitute_pattern('file', ';', ' ', -31)
call unite#set_buffer_name_option('file', 'ignorecase', 0)
" custom_actions for unite. {{{3
" echo action {{{4
let s:unite_action = {
\ 'description': 'Echo the candidates for debug.',
\ 'is_selectable': 1,
\ }
function! s:unite_action.func(candidates)
PP a:candidates
endfunction
call unite#custom_action('common', 'echo', s:unite_action)
unlet! s:unite_action
" tabvsplit action {{{4
let s:unite_action = {
\ 'description': 'Open files to new tabpage with :vsplit.',
\ 'is_selectable': 1,
\ }
function! s:unite_action.func(candidates)
tabnew `=a:candidates[0].action__path`
for c in a:candidates[1 :]
vsplit `=c.action__path`
endfor
endfunction
call unite#custom_action('openable', 'tabvsplit', s:unite_action)
unlet! s:unite_action
" source action for file {{{4
let s:unite_action = {
\ 'description': ':source files',
\ 'is_selectable': 1,
\ }
function! s:unite_action.func(candidates)
for c in a:candidates
source `=c.action__path`
endfor
endfunction
call unite#custom_action('file', 'source', s:unite_action)
unlet! s:unite_action
command! UniteBeautifulAttack Unite -auto-preview colorscheme
" file delete action {{{4
let s:unite_action = {
\ 'description': 'delete selected files',
\ 'is_selectable': 1,
\ }
function! s:unite_action.func(candidates)
for c in a:candidates
let path = c.action__path
if filewritable(path)
call delete(path)
endif
endfor
endfunction
call unite#custom_action('file', 'delete', s:unite_action)
unlet! s:unite_action
" unite-grep.vim {{{2
if executable('ack')
" let g:unite_source_grep_command = 'ack'
" let g:unite_source_grep_default_opts = '-a'
endif
" unite-locate.vim {{{2
if s:is_windows() && executable('es')
let g:unite_locate_command = 'es -i -r -n %d %s'
endif
" alignta.vim {{{2
vnoremap <silent> <C-h> :Alignta<CR>
let g:alignta_default_arguments = '\S\+'
" rsense.vim {{{2
" let g:rsenseHome = expand("~/app/rsense")
" let g:rsenseUseOmniFunc = 1
" calendar.vim {{{2
let g:calendar_navi_label = ',,'
let g:calendar_mruler =
\ ',,,,,,,,,,,'
let g:calendar_wruler = ' '
nmap cal <Plug>CalendarV
nmap caL <Plug>CalendarH
" gist.vim {{{2
let g:gist_detect_filetype = 1
" skk.vim {{{2
let g:skk_large_jisyo = '~/.vim/dict/skk/SKK-JISYO.utf-8.L'
let g:skk_auto_save_jisyo = 1
let g:skk_keep_state = 1
let g:skk_egg_like_newline = 1
let g:skk_show_annotation = 1
let g:skk_use_face = 1
highlight default skk_henkan ctermbg=1 ctermfg=15 guibg=#0000FF guifg=#FFFFFF
" Following options are patched by id:krogue.
let g:skk_sticky_key = ';'
let g:skk_kakutei_key = '.'
let g:skk_use_color_cursor = 1
let g:skk_control_j_key = '<C-g><C-j>'
" eskk.vim {{{2
let g:plugin_skk_disable = 1
" let g:eskk_disable = 1
let g:eskk#large_dictionary = {
\ 'path': '~/.vim/dict/skk/SKK-JISYO.utf-8.L',
\ 'sorted': 1,
\ 'encoding': 'utf-8',
\}
let g:eskk#egg_like_newline = 1
let g:eskk#map_normal_keys = 0
let g:eskk#show_annotation = 1
let g:eskk#rom_input_style = 'msime'
let g:eskk#keep_state = 0
" let g:eskk#keep_state = 1
" let g:eskk#keep_state_beyond_buffer = 1
if s:is_windows() && !has('gui_running')
let g:eskk#enable_completion = 0
endif
let g:eskk#debug = 1
let g:eskk#directory = s:plugin_info . '/eskk'
let g:eskk#debug_profile = 1
if s:has_plugin('eskk')
augroup vimrc-plugin-eskk
autocmd!
autocmd CursorHold * silent EskkUpdateDictionary
autocmd User eskk-initialize-pre call s:init_eskk()
augroup END
endif
function! s:init_eskk()
let t = eskk#table#new('rom_to_hira*', 'rom_to_hira')
call t.add_map('va', '')
call t.add_map('vi', '')
call t.add_map('vu', '')
call t.add_map('ve', '')
call t.add_map('vo', '')
call t.add_map('z ', '')
call eskk#register_mode_table('hira', t)
unlet t
endfunction
" caw.vim {{{2
nmap <Leader>c <Plug>(caw:prefix)
vmap <Leader>c <Plug>(caw:prefix)
nmap <Plug>(caw:prefix)<Space> <Plug>(caw:i:toggle)
vmap <Plug>(caw:prefix)<Space> <Plug>(caw:i:toggle)
" open-browser.vim {{{2
nmap m<CR> <Plug>(openbrowser-open)
vmap m<CR> <Plug>(openbrowser-open)
" restart.vim {{{2
let g:restart_save_window_values = 0
let g:restart_sessionoptions = 'curdir,folds,help,localoptions,tabpages,unix'
nnoremap <silent> <Leader><Leader>res :<C-u>Restart<CR>
" submode.vim {{{2
" let g:submode_timeout = 0
" TELLME: The above setting do not work.
" Use the following instead of above.
let g:submode_timeoutlen = 1000000
call submode#enter_with('undo/redo', 'n', '', 'g-', 'g-')
call submode#enter_with('undo/redo', 'n', '', 'g+', 'g+')
call submode#map('undo/redo', 'n', '', '-', 'g-')
call submode#map('undo/redo', 'n', '', '+', 'g+')
call submode#enter_with('change-list', 'n', '', 'g;', 'g;')
call submode#enter_with('change-list', 'n', '', 'g,', 'g,')
call submode#map('change-list', 'n', '', ';', 'g;')
call submode#map('change-list', 'n', '', ',', 'g,')
call submode#enter_with('changetab', 'n', '', 'gt', 'gt')
call submode#enter_with('changetab', 'n', '', 'gT', 'gT')
call submode#map('changetab', 'n', '', 't', 'gt')
call submode#map('changetab', 'n', '', 'T', 'gT')
function! s:movetab(nr)
execute 'tabmove' s:modulo(tabpagenr() + a:nr - 1, tabpagenr('$'))
endfunction
let s:movetab = ':<C-u>call ' . s:SIDP() . 'movetab(%d)<CR>'
call submode#enter_with('movetab', 'n', '', '<Space>gt', printf(s:movetab, 1))
call submode#enter_with('movetab', 'n', '', '<Space>gT', printf(s:movetab, -1))
call submode#map('movetab', 'n', '', 't', printf(s:movetab, 1))
call submode#map('movetab', 'n', '', 'T', printf(s:movetab, -1))
unlet s:movetab
call submode#enter_with('winsize', 'n', '', '<C-w>>', '<C-w>>')
call submode#enter_with('winsize', 'n', '', '<C-w><', '<C-w><')
call submode#enter_with('winsize', 'n', '', '<C-w>+', '<C-w>-')
call submode#enter_with('winsize', 'n', '', '<C-w>-', '<C-w>+')
call submode#map('winsize', 'n', '', '>', '<C-w>>')
call submode#map('winsize', 'n', '', '<', '<C-w><')
call submode#map('winsize', 'n', '', '+', '<C-w>-')
call submode#map('winsize', 'n', '', '-', '<C-w>+')
call submode#enter_with('diff', 'n', '', '<Space><Space>diff')
call submode#map('diff', 'n', '', 'j', ']c') " next diff
call submode#map('diff', 'n', '', 'k', '[c') " prev diff
call submode#map('diff', 'n', '', 'h', 'do') " get diff
call submode#map('diff', 'n', '', 'l', 'dp') " put diff
call submode#map('diff', 'n', '', 'u', 'do]c') " get diff and next diff
call submode#map('diff', 'n', '', 'i', 'dp]c') " put diff and next diff
" fakeclip.vim {{{2
nmap "+Y "+y$
nmap "*Y "*y$
nmap "&Y "&y$
" altr.vim {{{2
call altr#define('%.c', '%.cpp', '%.cc',
\ '%.h', '%.hpp', '%.hh', '%.hxx', '%.h++')
call altr#define('%.coffee', '%.js')
nnoremap <silent> <C-Space> :<C-u>call altr#forward()<CR>
nnoremap <silent> <C-S-Space> :<C-u>call altr#back()<CR>
nnoremap <silent> <C-w><C-Space> :<C-u>split<CR>:call altr#forward()<CR>
nnoremap <silent> <C-w><C-S-Space> :<C-u>split<CR>:call altr#back()<CR>
" smartword.vim {{{2
nmap w <Plug>(smartword-w)
nmap b <Plug>(smartword-b)
nmap e <Plug>(smartword-e)
nmap ge <Plug>(smartword-ge)
vmap w <Plug>(smartword-w)
vmap b <Plug>(smartword-b)
vmap e <Plug>(smartword-e)
vmap ge <Plug>(smartword-ge)
omap <Leader>w <Plug>(smartword-w)
omap <Leader>b <Plug>(smartword-b)
omap <Leader>e <Plug>(smartword-e)
omap <Leader>ge <Plug>(smartword-ge)
" textobj-user.vim {{{2
" textobj-function {{{3
let g:textobj_function_no_default_key_mappings = 1
omap iF <Plug>(textobj-function-i)
omap aF <Plug>(textobj-function-a)
vmap iF <Plug>(textobj-function-i)
vmap aF <Plug>(textobj-function-a)
call textobj#user#plugin('camelcase', {
\ '-': {
\ '*pattern*': '\C\a[a-z0-9]\+',
\ 'select': ["a\<C-w>", "i\<C-w>"],
\ },
\ })
" operator-user.vim {{{2
" operator-replace {{{3
map mp <Plug>(operator-replace)
vmap p <Plug>(operator-replace)
" operator-camelize {{{3
map <Leader>oc <Plug>(operator-camelize)iw
map <Leader>oC <Plug>(operator-decamelize)iw
" operator-sequence {{{3
noremap <expr> <Leader>oU
\ operator#sequence#map("\<Plug>(operator-decamelize)", 'gU') . 'iw'
noremap <expr> <Leader>ou
\ operator#sequence#map("\<Plug>(operator-camelize)", ['b~']) . 'iw'
" ProjectEuler.vim {{{2
let g:projecteuler_dir = s:plugin_info . '/projecteuler/'
let g:projecteuler_user = 'thinca'
let g:projecteuler_problem_lang = 'ja'
" onlinejadge.vim {{{2
let g:onlinejudge_account = {'aoj': {'user': 'thinca'}}
" textmanip.vim {{{2
call submode#enter_with('textmanip', 'v', 'r', 'mv')
call submode#map('textmanip', 'v', 'r', 'h', '<Plug>(textmanip-move-left)')
call submode#map('textmanip', 'v', 'r', 'j', '<Plug>(textmanip-move-down)')
call submode#map('textmanip', 'v', 'r', 'k', '<Plug>(textmanip-move-up)')
call submode#map('textmanip', 'v', 'r', 'l', '<Plug>(textmanip-move-right)')
call submode#map('textmanip', 'v', 'rx', '<ESC>', '<ESC><ESC>')
" quickhl.vim {{{2
map <Leader>qh <Plug>(quickhl-toggle)
" twitvim.vim {{{2
let g:twitvim_api_root = "https://api.twitter.com/1"
let s:twitbuf = openbuf#new('twitvim/say', {
\ 'bufname': '[twitvim]',
\ 'reuse': 'always',
\ 'opener': '3new',
\ 'silent': 1,
\ })
nnoremap <silent> <Leader><Leader>v :<C-u>call <SID>twitvim_say_open()<CR>
function! s:twitvim_say_open(...)
let id = get(a:000, 0, 0)
if s:twitbuf.open()
if exists('b:in_reply_to_id')
unlet! b:in_reply_to_id
silent! % delete _
endif
setlocal buftype=nofile noswapfile bufhidden=hide
nnoremap <buffer> <silent> <CR> :<C-u>call <SID>twitvim_say()<CR>
nnoremap <buffer> q <C-w>c
let b:statusline_extra = s:twitvim_count()
augroup vimrc-plugin-twitvim
autocmd! WinEnter,CursorMovedI,InsertLeave <buffer>
\ let b:statusline_extra = s:twitvim_count()
augroup END
if id
let b:in_reply_to_id = id
let said = get(a:000, 1, '')
let user = matchstr(said, '^[^:]\+\ze:')
let mes = 'reply to: ' . said . "\n@" . user . ' '
0put =mes
$ delete _
$
startinsert!
endif
endif
endfunction
function! s:twitvim_say()
if exists('b:in_reply_to_id')
let id = b:in_reply_to_id
call S('twitvim:post_twitter', join(getline(2, '$'), "\n"), id)
else
BPosttoTwitter
endif
silent % delete _
close
endfunction
function! s:twitvim_count()
let start = exists('b:in_reply_to_id') ? 2 : 1
let num = len(substitute(join(getline(start, '$'), "\n"), '.', 'x', 'g'))
return '[' . (140 - num) . ']'
endfunction
augroup vimrc-plugin-twitvim
autocmd! FileType twitvim nnoremap <buffer> <silent> <CR>
\ :call <SID>twitvim_reply_open()<CR>
augroup END
function! s:twitvim_reply_open()
let curbuffer = eval(substitute(Redir('TwitVimShowCurbuffer'), "\n", '', 'g'))
let id = get(curbuffer.statuses, line('.'))
call s:twitvim_say_open(id, getline('.'))
endfunction
" EasyMotion.vim {{{2
let g:EasyMotion_leader_key = '<Leader><Leader>'
" lingr.vim {{{2
if !exists('g:lingr') && !s:is_windows()
" Only when started by the 'lingr' command(alias), lingr.vim is used.
" alias lingr="vim --cmd 'let g:lingr = 1' -c LingrLaunch"
let g:loaded_lingr_vim = 1
endif
let g:lingr_vim_user = 'thinca'
let g:lingr_vim_additional_rooms = [
\ 'vim',
\ 'gentoo',
\ 'vim_b_201009',
\ 'vimjolts',
\ 'editor',
\ 'vimperator',
\ 'bazaar',
\ 'filer',
\ 'git',
\ 'completion',
\ 'java_ja',
\ 'shell',
\ 'scala',
\ 'lingr',
\ 'lowlevel',
\ 'haskell',
\ 'ruby',
\ '_',
\ 'thinca',
\ 'onsg',
\ 'yokohamavim',
\ ]
let g:lingr_vim_rooms_buffer_height = len(g:lingr_vim_additional_rooms) + 1
let g:lingr_vim_count_unread_at_current_room = 1
augroup vimrc-plugin-lingr
autocmd!
autocmd User plugin-lingr-* call s:lingr_event(
\ matchstr(expand('<amatch>'), 'plugin-lingr-\zs\w*'))
autocmd FileType lingr-* call s:init_lingr(expand('<amatch>'))
augroup END
function! s:init_lingr(ft)
if exists('s:window')
nnoremap <buffer> <silent> <C-l>
\ :<C-u>call <SID>auto_window_name()<CR><C-l>
let b:window_name = 'lingr-vim'
endif
if a:ft ==# 'lingr-say'
setlocal statusline=%f\ %m
if exists('*eskk#statusline')
let &l:statusline .= '%{eskk#statusline()}'
endif
endif
endfunction
function! s:lingr_event(event)
if a:event ==# 'message' && exists(':WindowName')
execute printf('WindowName %s(%d)', 'lingr-vim', lingr#unread_count())
endif
endfunction
" ambicmd.vim {{{2
cnoremap <expr> <Space> ambicmd#expand("\<Space>")
cnoremap <expr> <CR> ambicmd#expand("\<CR>")
cnoremap <expr> <C-f> ambicmd#expand("\<Right>")
function! s:init_cmdwin()
inoremap <buffer> <expr> <Space> ambicmd#expand("\<Space>")
inoremap <buffer> <expr> <CR> ambicmd#expand("\<CR>")
inoremap <buffer> <expr> <C-f> ambicmd#expand("\<Right>")
inoremap <buffer> <expr> <C-h> col('.') == 1 ? "\<ESC>\<C-w>c" : "\<C-h>"
nnoremap <buffer> <ESC> <C-w>c
nnoremap <buffer> <ESC><ESC> <C-w>c
nnoremap <buffer> q <C-w>c
startinsert!
endfunction
augroup vimrc-plugin-ambicmd
autocmd CmdwinEnter * call s:init_cmdwin()
augroup END
" auto_source.vim {{{2
let g:auto_source#exclude = '\.gvimrc'
" github.vim {{{2
let g:github#debug = 1
let g:github#debug_file = s:plugin_info . '/github/debug-%Y-%m-%d.log'
" openbuf.vim {{{2
let g:openbuf#config = {
\ '_': {'default': 0},
\ 'test': {'openres': 'loaded'},
\ 'test/foo': {'default': 2},
\ }
" poslist.vim {{{2
let g:poslist_histsize = 1000
map <C-o> <Plug>(poslist-prev-pos)
map <C-i> <Plug>(poslist-next-pos)
map <Leader><C-o> <Plug>(poslist-prev-line)
map <Leader><C-i> <Plug>(poslist-next-line)
map <Space><C-o> <Plug>(poslist-prev-buf)
map <Space><C-i> <Plug>(poslist-next-buf)
" quickrun.vim {{{2
function! s:init_quickrun()
for [key, c] in items({
\ '<Leader>x': '>message',
\ '<Leader>p': '-runner shell',
\ '<Leader>"': '>variable:@"',
\ '<Leader>w': '>buffer',
\ '<Leader>q': '>>buffer',
\ '<Leader>ex': '-eval 1 >message',
\ '<Leader>ep': '-eval 1 -runner shell',
\ '<Leader>e"': '-eval 1 >variable:@"',
\ '<Leader>ew': '-eval 1 >buffer',
\ '<Leader>eq': '-eval 1 >>buffer',
\ })
execute 'nnoremap <silent>' key ':QuickRun' c '-mode n<CR>'
execute 'vnoremap <silent>' key ':QuickRun' c '-mode v<CR>'
endfor
let g:quickrun_config = {
\ '_': {
\ 'debug': 'ss',
\ 'input': '=%{b:input}', 'cmdopt': '%{b:cmdopt}', 'args': '%{b:args}',
\ 'runner': 'vimproc',
\ 'runner/vimproc/updatetime': 500,
\ },
\ 'clojure': {'command': 'clj', 'eval_template': '(print %s)'},
\ 'coffee': {'cmdopt': '-cbp'},
\ 'nilscript': {'exec': 'ng.exe %s %a'},
\ 'xmodmap': {},
\ 'mxml': {'exec': ['amxmlc %s', 'adl %s:r-app.xml'],
\ 'output_encode': '&termencoding'},
\ 'wsh': {'output_encode': '&termencoding'},
\ 'vimgolf': {
\ 'command': 'vim',
\ 'exec': ['cat > temp', '%c -u NONE -s %s temp >/dev/null 2>\&1',
\ 'cat temp', 'rm -f temp >/dev/null 2>\&1']},
\ }
if executable('C')
let g:quickrun_config.c = {'type': 'c/C'}
let g:quickrun_config.cpp = {'type': 'cpp/C'}
endif
map <Space>r <Plug>(quickrun-op)
endfunction
call s:init_quickrun()
augroup vimrc-plugin-quickrun
autocmd!
autocmd BufReadPost,BufNewFile [Rr]akefile{,.rb}
\ let b:quickrun_config = {'exec': 'rake -f %s'}
autocmd BufReadPost,BufNewFile */.vim/vimrc
\ let b:quickrun_config = {'runner': 'shell'}
augroup END
function! s:complete_open_scratch(a, c, p)
return filter(keys(extend(copy(g:quickrun#default_config),
\ g:quickrun_config)), 'v:val !=# "*" && v:val =~# "^".a:a')
endfunction
function! s:open_scratch()
let ft = input('type?', '', 'customlist,' . s:SIDP()
\ . 'complete_open_scratch')
if ft ==# ''
return
endif
if 78 * 2 < winwidth(0)
vnew
else
new
endif
let &l:filetype = ft
execute 'TemplateLoad Scratch.' . ft
endfunction
nnoremap <silent> <Leader><Leader>s :<C-u>call <SID>open_scratch()<CR>
" ref.vim {{{2
let g:ref_open = 'vsplit'
let g:ref_cache_dir = s:plugin_info . '/ref'
let g:ref_phpmanual_path = $HOME . '/local/share/doc/php'
if executable('refe2')
let g:ref_refe_cmd = 'refe2'
endif
let g:ref_alc_start_linenumber = 37
let g:ref_alc_use_cache = 1
let s:lynx_cmd = 'C:\Program Files\Lynx for Win32\lynx.exe'
if s:is_windows() && executable(s:lynx_cmd)
let g:ref_alc_cmd = [s:lynx_cmd, '-dump', '-nonumbers', '%s']
let g:ref_phpmanual_cmd = g:ref_alc_cmd
endif
nnoremap <silent> <Space>K
\ :<C-u>call ref#jump('normal', 'alc', {'noenter': 1})<CR>
vnoremap <silent> <Space>K
\ :<C-u>call ref#jump('visual', 'alc', {'noenter': 1})<CR>
nnoremap <Space><C-k> :<C-u>Ref alc<Space>
nnoremap <Space><C-h> :<C-u>Ref <C-r>=ref#detect()<CR><Space>
if !exists('g:ref_detect_filetype')
let g:ref_detect_filetype = {}
endif
function! g:ref_detect_filetype._(ft)
return &keywordprg ==# ':help' ? '' : 'man'
endfunction
" template.vim {{{2
augroup vimrc-plugin-template
autocmd!
autocmd FileType * if exists(':TemplateLoad')
\ | execute 'TemplateLoad /filetype/' . &l:filetype
\ | endif
autocmd User plugin-template-loaded call s:template_loaded()
autocmd BufEnter *bundle/custom/template/* setlocal makeprg=
augroup END
function! s:template_loaded()
silent %substitute/<%=\(.\{-}\)%>/\=eval(submatch(1))/ge
call histdel('/', -1)
if search('<+CURSOR+>')
normal! "_da>
endif
endfunction
" vcs.vim {{{2
nnoremap <silent> <Leader>va :<C-u>Vcs add<CR>
nnoremap <silent> <Leader>vb :<C-u>Vcs blame<CR>
nnoremap <silent> <Leader>vc :<C-u>Vcs commit<CR>
nnoremap <silent> <Leader>vd :<C-u>Vcs diff<CR>
nnoremap <silent> <Leader>vs :<C-u>Vcs status<CR>
nnoremap <silent> <Leader>vl :<C-u>Vcs log<CR>
nnoremap <silent> <Leader>vC :<C-u>Vcs commit %<CR>
nnoremap <silent> <Leader>vzc :<C-u>Vcs commit %<CR>
nnoremap <silent> <Leader>vzd :<C-u>Vcs diff %<CR>
" verifyenc.vim {{{2
" This is included in the KaoriYa ver by default.
" This plugin has a bug that autocmd is carried out endlessly.
let g:plugin_verifyenc_disable = 1
" dicwin.vim {{{2
" This config is enabled in only my own patch.
let g:dicwin_leader = "\<M-d>"
" == Misc. == {{{1
" Assist b:undo_ftplugin
function! SetUndoFtplugin(com)
let command = 'execute ' . string(a:com)
if exists('b:undo_ftplugin')
let command .= ' | ' . b:undo_ftplugin
endif
let b:undo_ftplugin = command
endfunction
command! -nargs=1 -bang -complete=command SetUndoFtplugin
\ call SetUndoFtplugin(<q-args>)
" syntax test
nnoremap <silent> <C-CR> :<C-u>echo join(map(synstack(line('.'), col('.')),
\ 'synIDattr(v:val, "name")
\ ."(".synIDattr(synIDtrans(v:val), "name").")"'), ',')<CR>
inoremap <silent> <C-CR> <C-o>:<C-u>echo join(map(synstack(
\ line('.'), col('.')), 'synIDattr(v:val, "name")
\ ."(".synIDattr(synIDtrans(v:val), "name").")"'), ',') "\n"<CR>
" Redirection with nestable.
function! Redir(...)
return call('quickrun#execute', a:000)
endfunction
" :Capture command. {{{
command! -nargs=+ -bang -complete=command Capture call s:capture(<q-args>)
function! s:capture(cmd)
let result = Redir(a:cmd)
call openbuf#open('capture', printf('[capture:%s]', a:cmd))
setlocal buftype=nofile noswapfile nobackup
silent put =result
silent 1,2 delete _
endfunction
" }}}
" :Halt command. {{{
let s:halt_file = expand('<sfile>:p:h') . '/info/halt_session.vim'
command! -bar -bang Halt call s:halt() | qall<bang>
function! s:halt()
if argc()
execute '1,' . argc() . 'argdelete'
endif
let ssop = &sessionoptions
let &sessionoptions = g:restart_sessionoptions
mksession `=s:halt_file`
let &sessionoptions = ssop
endfunction
if filereadable(s:halt_file) && argc() == 0 && !exists('g:lingr')
augroup vimrc-halt
autocmd!
autocmd VimEnter * nested source `=s:halt_file` | call delete(s:halt_file)
augroup END
endif
" }}}
" for debug: Call a script local function.
" Usage:
" - S('local_func')
" -> call s:local_func() in current file.
" - S('plugin/hoge.vim:local_func', 'string', 10)
" -> call s:local_func('string', 10) in *plugin/hoge.vim.
" - S('plugin/hoge:local_func("string", 10)')
" -> call s:local_func("string", 10) in *plugin/hoge(.vim)?.
function! S(f, ...)
let [file, func] =a:f =~# ':' ? split(a:f, ':') : [expand('%:p'), a:f]
let fname = matchstr(func, '^\w*')
" Get sourced scripts.
let slist = Redir('scriptnames')
let filepat = '\V' . escape(file, '\') . '\v%(\.vim)?$'
for s in split(slist, "\n")
let p = matchlist(s, '^\s*\(\d\+\):\s*\(.*\)$')
if empty(p)
continue
endif
let [nr, sfile] = p[1 : 2]
let sfile = fnamemodify(sfile, ':p')
if sfile =~# filepat &&
\ exists(printf("*\<SNR>%d_%s", nr, fname))
let cfunc = printf("\<SNR>%d_%s", nr, func)
break
endif
endfor
if !exists('nr')
call s:print_error('Not sourced: ' . file)
return
elseif !exists('cfunc')
let file = fnamemodify(file, ':p')
call s:print_error(printf(
\ 'File found, but function is not defined: %s: %s()', file, fname))
return
endif
return 0 <= match(func, '^\w*\s*(.*)\s*$')
\ ? eval(cfunc) : call(cfunc, a:000)
endfunction
function! s:time(cmd, log)
if !has('reltime')
echo 'Feature +reltime is disabled.' .
\ ' Do you run a command in normally?[y/N]'
if getchar() =~? 'y'
execute a:cmd
endif
return
endif
let mes = Redir('let time = reltime()', a:cmd,
\ 'let s:result = reltime(time)')
let result = a:cmd . ': ' . reltimestr(s:result)
unlet! s:result
echo mes
if a:log
echomsg result
else
echo result
endif
endfunction
command! -nargs=1 -complete=command -bang Time call s:time(<q-args>, <bang>0)
function! URLDecode(url, ...)
let res =
\ substitute(a:url, '%\(\x\x\)', '\=eval("\"\\x".submatch(1)."\"")', 'g')
return a:0 && a:1 !=# '' ? iconv(res, a:1, &encoding) : res
endfunction
" Load a setting for machine local.
call localrc#load('local.vim', expand('<sfile>:h'))
if has('vim_starting')
call localrc#load('.init.after.vimrc', getcwd())
endif
set secure
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment