Shougo / unite.vim

:dragon: Unite and create user interfaces
http://www.vim.org/scripts/script.php?script_id=3396
Other
2.85k stars 223 forks source link

Uniteウィンドウから出て:splitした後、Uniteを終了したときウィンドウサイズが狂う #427

Closed LeafCage closed 10 years ago

LeafCage commented 10 years ago

一番下のウィンドウ(Uniteウィンドウの真上に当たるウィンドウ)のサイズが1行だけになってしまう。そしてUnite終了時戻ってくるのは一番下のウィンドウではなくその上のウィンドウ。

Shougo commented 10 years ago

ウインドウサイズ問題は手順が難しいので、この情報ではわかりません。 必要なのは、

  1. 最小構成 .vimrc
  2. 具体的なキーマッピングが書かれたVimの操作手順

です。それが示されない限り、こちらでは再現不能なので対処しません。

LeafCage commented 10 years ago

手順 :Unite source <C-w><C-w> :split <C-w>W q (unite-exit) ※<Plug>(unite-exit)でウィンドウが狂うが、普通の:bdだと狂わないように見える

使ったvimrc

"minimum vimrc special options
set nocompatible
let pathstr = '%.40(%{empty(bufname("%")) ? "" : expand(''%:p:h'')."/"}%9*%t %0*%)'
let fencstr = '%([%{&fenc}/%{&ff[:0]}]%)'
let &stl = '%{repeat(",", winnr()).","}%4P'. '%9*%3n-%0*'. pathstr. '%m%R%H%W%y '. fencstr. '%=%4l(%4L),%3v(%3{virtcol("$")-1})%<'
"======================================
aug vimrc
  au!
aug END
let s:bind = {'win': 'm', 'markj': '`', 'reg': '[@]', 'mode': '<C-q>', 'esc': '<C-o>', 'snip': 's', 'sticky': '[C-k]'}
"--------------------------------------
set encoding=utf8
scriptencoding utf8
"BufRead時、'fileencodings'の先頭から'encoding'を試してerrが出なければそれを適用
set fileencodings=utf8,cp932,iso-2022-jp,euc-jp,default,latin
"改行コードの自動認識(新規作成されるファイルフォーマットをdosにしたい)
set fileformats=dos,unix,mac

"======================================
"環境変数
"$HOME がないとき、$VIM/TMPHOME を $HOME にする "{{{
if !exists("$HOME")
  if isdirectory('/hom')
    let $HOME='/hom'
  else
    let $HOME=$VIM. '/TMPHOME'
  endif
endif
"}}}
"$PATHを追加{{{
function! s:PATH_add(path)
  let $PATH .= $PATH =~ a:path ? '' : a:path. ';'
endfunction
if has('vim_starting')
  let $PATH .= ';'
  call s:PATH_add('/bnr/cmd/MinGW/bin')
  call s:PATH_add('/bnr/cmd/path')
  call s:PATH_add('/bnr/cmd/PortableGit-1.7.11-preview20120620/bin')
  call s:PATH_add('C:/Program Files/Java/jdk1.7.0_09/bin')
  let $GOROOT = '/bnr/cmd/go'
  call s:PATH_add($GOROOT.'/bin')
  let $GOPATH = $HOME. '/_go'
  call s:PATH_add($GOPATH.'/bin')
  call s:PATH_add('/bnr/cmd/MercurialCmdPortable/App/Mercurial')
endif
"}}}
let $JVGREP_OUTPUT_ENCODING = 'cp932'
let $TERM = exists('$TERM') ? $TERM : 'msys'
let $DOTFILES = $HOME. '/box/dotfiles'
"--------------------------------------
"vim関係のpath
let $BASEDIR = exists('$BASEDIR') ? $BASEDIR : expand($HOME . '/box')
let $MYVIMRC_SUBSTANCEDIR = $BASEDIR. '/dotfiles/vim'
let $VIMCACHE = $HOME. '/.cache/vim/minimum'
let $VIMUSERDIR = $BASEDIR. '/vimuser'
if has('vim_starting')
  let $VIMFILES = isdirectory(expand('$BASEDIR/vimfiles')) ? $BASEDIR. '/vimfiles' : isdirectory(expand('$HOME/vimfiles')) ? $HOME. '/vimfiles' : $VIM. '/vimfiles'
  set rtp+=$VIMFILES,$VIMFILES/after,$VIMFILES/neobundle/neobundle.vim
endif

call neobundle#rc(expand('$VIMFILES/neobundle'))
NeoBundle 'Shougo/vimproc'
NeoBundle 'Shougo/unite.vim'

"=============================================================================
"KeyMappings
let mapleader = '\'
let maplocalleader = '\\'
noremap [space] <nop>
nmap <Space> [space]
nmap <C-k> [C-k]
map @ [@]
"--------------------------------------
"No operation
"誤爆防止
nnoremap ZZ <Nop>
nnoremap q <Nop>
nnoremap <C-q> <Nop>
noremap m <Nop>
"インサートモードで間違って出してほしくないキー
noremap <F15> <Nop>
noremap! <F15> <Nop>
noremap <F16> <Nop>
noremap! <F16> <Nop>
noremap! <S-F16> <Nop>
inoremap <M-j> <Nop>
"--------------------------------------
"インサートモードでの削除コマンドにundoを有効化させる
inoremap <expr><C-h>  pumvisible() ? "\<C-h>" : "\<C-g>u\<C-h>"
inoremap <C-u> <C-g>u<C-u>
"inoremap <c-w> <c-g>u<c-w>
"--------------------------------------
"参照操作
cnoremap <F1>   <C-u>h function-list<CR>
nnoremap <expr><F1>   v:count==1 ? ":\<C-u>h :command-completion-custom\<CR>" : ":\<C-u>h function-list\<CR>"
nnoremap <C-h>  :<C-u>h<Space>
cnoremap <expr><C-h>    getcmdtype()==':' ? getcmdpos()==1 ? 'h ' : "\<C-h>" : "\<C-h>"
cnoremap <expr><C-e>    getcmdtype()==':' ? getcmdline()=~'^\s*$\\|^h $' ? "<C-u>ec " : "\<C-e>" : "\<C-e>"
"--------------------------------------
"クリップボード
noremap ,y "*y
nnoremap <silent>,yu :<C-u>let @* = @"<CR>
noremap ,Y "*y$
noremap ,p "*p
noremap ,P "*P
noremap <F3> "+
noremap! <F3>   <C-r>+
noremap <C-z> "+
inoremap <C-r><C-y>   <C-r>+
cnoremap <C-r><C-y>   <C-r>=substitute(@+, '\n$', '', 'g')<CR>
cnoremap <C-y>   <C-r>=substitute(@+, '\n$', '', 'g')<CR>
nnoremap <C-c> "+y
vnoremap <C-c> "+y
vnoremap <C-y> "+y
snoremap <C-c> <C-c>a
vnoremap <expr><C-v> mode()=="\<C-v>" ? "\<Esc>\"+p" : "\<C-v>"
"レジスタ
exe 'nnoremap '. s:bind.reg. '    "'
exe 'nnoremap '. s:bind.reg. '+   "+'
exe 'vnoremap '. s:bind.reg. '    "'
exe 'vnoremap '. s:bind.reg. '+   "+'
"--------------------------------------
"Sticky Keys
"nmap <expr> ,;  <SID>sticky_func()
"omap <expr> ;  <SID>sticky_func()
"xmap <expr> ;  <SID>sticky_func()
"nnoremap .. .
"nnoremap z.. z.
exe 'map <expr> '. s:bind.sticky ' <SID>sticky_func()'
exe 'map <expr> g'. s:bind.sticky ' "g". <SID>sticky_func()'
exe 'map <expr> z'. s:bind.sticky ' "z". <SID>sticky_func()'
exe 'map <expr> ,'. s:bind.sticky ' ",". <SID>sticky_func()'
exe 'map <expr> "'. s:bind.sticky ' "\"". <SID>sticky_func()'
exe 'omap <expr> i'. s:bind.sticky ' "i". <SID>sticky_func()'
exe 'omap <expr> a'. s:bind.sticky ' "a". <SID>sticky_func()'
exe 'xmap <expr> i'. s:bind.sticky ' "i". <SID>sticky_func()'
exe 'xmap <expr> a'. s:bind.sticky ' "a". <SID>sticky_func()'
function! s:sticky_func() "{{{
  let l:sticky_table = { ',' : '<', '.' : '>', '/' : '?',
    \'1' : '!', '2' : '"', '3' : '#', '4' : '$', '5' : '%', '6' : '&', '7' : "'", '8' : '(', '9' : ')', '0' : '_',
    \ '-' : '=', '^' : '~', ';' : '+', ':' : '*', '[' : '{', ']' : '}', '@' : '`', '\' : '|'}
  let l:special_table = {"\<ESC>" : "\<ESC>", "\<Space>" : "\<Space>", "\<CR>" : ";\<CR>"}
  let key = nr2char(getchar())
  if key =~ '\l'
    return toupper(key)
  elseif has_key(l:sticky_table, key)
    return l:sticky_table[key]
  elseif has_key(l:special_table, key)
    return l:special_table[key]
  else
    return mode()=='n'? "\<Esc>" : ''
  endif
endfunction
"}}}

"======================================
"Normal mode
map Y y$
nnoremap ; :
vnoremap ; :
nnoremap [space]/ :<C-u>%s/
nnoremap j gj|nnoremap k gk
vnoremap <expr>j mode()==#'V' ? 'j' : 'gj'|vnoremap <expr>k mode()==#'V' ? 'k' : 'gk'
nnoremap <expr>l  foldclosed('.') != -1 ? 'zo' : 'l'
noremap zq q
noremap z@ @
nnoremap : ;
nnoremap <silent>,w :<C-u>up<CR>
nnoremap ,qu :<C-u>qa<CR>
nnoremap ,7   :<C-u>se fenc=euc-jp<CR>
nnoremap ,8   :<C-u>se fenc=utf-8<CR>
nnoremap ,9   :<C-u>se fenc=cp932<CR>
nnoremap <silent>,0   :<C-u>let &ff = &ff=='dos' ? 'unix' : &ff=='unix' ? 'mac' : 'dos'<CR>
"Normal mode 編集
nnoremap guu  gU
"Normal modeで挿入
nnoremap <silent><C-j> :<C-u>call append(foldclosedend('.')==-1 ? '.': foldclosedend('.'), repeat([''], v:count1))<Bar>exe 'norm!' v:count1. 'j'<CR>
nnoremap [C-k]<C-j> :i<CR><CR>.<CR>
"空白を挿入する
nnoremap [space]a a<Space><Esc>
"nnoremap <C-Space> a<Space><Esc>
nnoremap [space]i i<Space><Esc>
nnoremap [space]s i<Space><Esc>la<Space><Esc>h
"--------------------------------------
"Win/Buf Open/Close
exe 'nnoremap '. s:bind.win. 's <C-w>s'
exe 'nnoremap '. s:bind.win. 'v <C-w>v'
exe 'nnoremap '. s:bind.win. 'o <C-w>o'
exe 'nnoremap <silent> '. s:bind.win. 't :tab split<CR>'
nmap dv <SID>bd
nnoremap <SID>bd :bd<CR>
nmap dn <SID>KeepWinBd
nnoremap <silent><SID>KeepWinBd    :KeepWinBd<CR>
"ウィンドウレイアウトを保持したままバッファを閉じる
com! KeepWinBd let save_bufnr= bufnr("%") |bnext |exe "bd ".save_bufnr |unlet save_bufnr
nmap dq <C-w>c
exe 'nnoremap '. s:bind.win. 'dd <C-w>c'
exe 'nnoremap '. s:bind.win. 'q <C-w>c'
"Window Layout
nnoremap ,0 <C-w>=
exe 'nnoremap '. s:bind.win. '0 <C-w>='
nnoremap ,\ <C-w>_
nnoremap <C-w>\ <C-w>_
exe 'nnoremap '. s:bind.win. '\ <C-w>_'
exe 'nnoremap '. s:bind.win. 'J <C-w>J'
exe 'nnoremap '. s:bind.win. 'K <C-w>K'
exe 'nnoremap '. s:bind.win. 'H <C-w>H'
exe 'nnoremap '. s:bind.win. 'L <C-w>L'
"ある窓を大きく開く
"nnoremap <silent>,0 :call <SID>enlarge_win(0)<CR>
nnoremap <silent>,1 :call <SID>enlarge_win(1)<CR>
nnoremap <silent>,2 :call <SID>enlarge_win(2)<CR>
nnoremap <silent>,3 :call <SID>enlarge_win(3)<CR>
nnoremap <silent>,4 :call <SID>enlarge_win(4)<CR>
nnoremap <silent>,5 :call <SID>enlarge_win(5)<CR>
nnoremap <silent>,6 :call <SID>enlarge_win(6)<CR>
function! s:enlarge_win(winnr) "{{{
  let targetWinnr = a:winnr ? a:winnr : winnr()
  let [save_winnr, save_wh, save_wiw] = [winnr(), &winheight, &winwidth]
  set wh=20 wiw=20
  exe targetWinnr. 'wincmd w'
  exe 'wincmd ='
  let [&wh, &wiw] = [save_wh, save_wiw]
  exe save_winnr. 'wincmd w'
endfunction
"}}}
"指定した番号の窓を閉じる
nmap ct <SID>close_remotewin1
nmap cz <SID>close_remotewin$
nmap c1 <SID>close_remotewin1
nmap c2 <SID>close_remotewin2
nmap c3 <SID>close_remotewin3
nmap c4 <SID>close_remotewin4
nmap c5 <SID>close_remotewin5
nmap c6 <SID>close_remotewin6
nmap d,t <SID>close_remotewin1
nmap d,z <SID>close_remotewin$
nmap d,1 <SID>close_remotewin1
nmap d,2 <SID>close_remotewin2
nmap d,3 <SID>close_remotewin3
nmap d,4 <SID>close_remotewin4
nmap d,5 <SID>close_remotewin5
nmap d,6 <SID>close_remotewin6
nmap mdt <SID>close_remotewin1
nmap mdz <SID>close_remotewin$
nmap md1 <SID>close_remotewin1
nmap md2 <SID>close_remotewin2
nmap md3 <SID>close_remotewin3
nmap md4 <SID>close_remotewin4
nmap md5 <SID>close_remotewin5
nmap md6 <SID>close_remotewin6
nnoremap <SID>close_remotewin$ :call <SID>close_remotewin(winnr('$'))<CR>
nnoremap <SID>close_remotewin1 :call <SID>close_remotewin(1)<CR>
nnoremap <SID>close_remotewin2 :call <SID>close_remotewin(2)<CR>
nnoremap <SID>close_remotewin3 :call <SID>close_remotewin(3)<CR>
nnoremap <SID>close_remotewin4 :call <SID>close_remotewin(4)<CR>
nnoremap <SID>close_remotewin5 :call <SID>close_remotewin(5)<CR>
nnoremap <SID>close_remotewin6 :call <SID>close_remotewin(6)<CR>
function! s:close_remotewin(winnr)
  let save_winnr = winnr()
  exe a:winnr. 'wincmd w'
  hide
  if save_winnr == a:winnr
    return
  endif
  let save_winnr = s:_get_ajusted_savewinnr(save_winnr, [a:winnr])
  exe save_winnr. 'wincmd w'
endfunction
"Specialwin Open/Close
nnoremap <silent><SID>close_whole_specialwins :call <SID>close_whole_specialwins(['&previewwindow'], ['quickfix'], ['unite'])<CR>
nmap cq <SID>close_whole_specialwins
nmap d,q <SID>close_whole_specialwins
function! s:close_whole_specialwins(options, buftypes, filetypes) "{{{
  let save_winnr = winnr()
  let killedwinnr_list = []
  windo call add(killedwinnr_list, s:_close_win(s:_should_close(a:options, a:buftypes, a:filetypes)))
  let save_winnr = s:_get_ajusted_savewinnr(save_winnr, killedwinnr_list)
  exe save_winnr.'wincmd w'
endfunction
"}}}
function! s:_close_win(should_close) "{{{
  if !a:should_close
    return 0
  endif
  let winnr = winnr()
  hide
  return winnr
endfunction "}}}
function! s:_should_close(options, buftypes, filetypes) "{{{
  if index(a:options, 1)!=-1
    return 1
  endif
  if index(a:buftypes, &bt)!=-1
    return 1
  endif
  if index(a:filetypes, &ft)!=-1
    return 1
  endif
endfunction
"}}}
function! s:_get_ajusted_savewinnr(save_winnr, killedwinnr_list)  "{{{
  let save_winnr = a:save_winnr
  for killedwinnr in reverse(a:killedwinnr_list)
    if killedwinnr == 0
      continue
    elseif killedwinnr < save_winnr
      let save_winnr -= 1
    endif
  endfor
  return save_winnr
endfunction
"}}}
"Tabpage Open/Close
noremap <SID>tabc :tabc<CR>
nmap <silent>dy <SID>tabc
nmap <silent>du <SID>tabc
nnoremap <silent> myo :tabonly<CR>
nnoremap <silent> myv :tabe $VIM/.vimrc<CR>
nnoremap <silent> my] :execute "tab tag ".expand('<cword>')<CR>|"カーソルドタグを新規タブページで開く
nnoremap <silent> myK :execute "tab help ".expand('<cword>')<CR>|"カーソルドワードを新規タブページで:helpする
"--------------------------------------
"Buf Switching
nnoremap <silent> [space]h :bp<CR>
nnoremap <silent> [space]l :bn<CR>
"Win Switching
nnoremap [space]n gt
nnoremap [space]p gT
"noremap <S-C-i> gt
nnoremap <silent> <S-C-Tab> :tabp<CR>
nnoremap <silent> <C-Tab> :tabn<CR>
nnoremap <silent>[space]j :call <SID>Roop_switchWin("j")<CR>
nnoremap <silent>[space]k :call <SID>Roop_switchWin("k")<CR>
function! s:Roop_switchWin(bind) "{{{
  let save_winnr = winnr()
  exe 'wincmd '. a:bind
  if winnr() == save_winnr
    let antiBind = a:bind=='h'?'l' : a:bind=='j'?'k' : a:bind=='k'?'j' : 'h'
    exe '16wincmd '. antiBind
  endif
endfunction
"}}}
exe 'nnoremap <silent>'. s:bind.win. 'h :call <SID>Roop_switchWin("h")<CR>'
exe 'nnoremap <silent>'. s:bind.win. 'j :call <SID>Roop_switchWin("j")<CR>'
exe 'nnoremap <silent>'. s:bind.win. 'k :call <SID>Roop_switchWin("k")<CR>'
exe 'nnoremap <silent>'. s:bind.win. 'l :call <SID>Roop_switchWin("l")<CR>'
"指定した窓に跳ぶ
nnoremap [space]1 1<C-w><C-w>
nnoremap [space]2 2<C-w><C-w>
nnoremap [space]3 3<C-w><C-w>
nnoremap [space]4 4<C-w><C-w>
nnoremap [space]5 5<C-w><C-w>
nnoremap [space]6 6<C-w><C-w>
exe 'nnoremap '. s:bind.win. '1 1<C-w><C-w>'
exe 'nnoremap '. s:bind.win. '2 2<C-w><C-w>'
exe 'nnoremap '. s:bind.win. '3 3<C-w><C-w>'
exe 'nnoremap '. s:bind.win. '4 4<C-w><C-w>'
exe 'nnoremap '. s:bind.win. '5 5<C-w><C-w>'
exe 'nnoremap '. s:bind.win. '6 6<C-w><C-w>'
"Specialwin Switching
"QuickFixコマンド
nmap cn <SID>c_n
nnoremap <SID>c_n    :cn<CR>zv
nmap cp <SID>c_p
nnoremap <SID>c_p    :cp<CR>zv
nmap cv <SID>c_window
nnoremap <SID>c_window    :cw<CR>
"--------------------------------------
"Open the Particular Buf
nnoremap <SID>o_vimrc :e $MYVIMRC_SUBSTANCEDIR/.vimrc<CR>g`"
nmap cov <SID>o_vimrc
nnoremap <SID>o_gitconfig :e $DOTFILES/.gitconfig<CR>
nmap cog <SID>o_gitconfig
"--------------------------------------
"Info
nnoremap <silent><C-g>  :<C-u>echo <SID>get_fileinfo()<CR>
function! s:get_fileinfo() "{{{
  let ret = ''
  let ret .= printf('"%s" (upd:%s) [%schrs] (%d/%dv) winwidth%d',
    \ bufname("%"),
    \ strftime("%Y_%m%d %H:%M",getftime(bufname("%"))),
    \ (exists('b:charCounterCount') ? b:charCounterCount : ''),
    \ virtcol('.'), virtcol('$'), winwidth(0),
    \ )[:&co-2]
  let ret .= "\n". FoldCCnavi()
  return ret
endfunction
"}}}
nnoremap mS :<C-u>scrip<CR>
"nnoremap ma :marks<CR>
"nnoremap ma :<C-u>Unite mark<CR>
"検索ハイライト
sign define SearchStart text=索 texthl=Search
noremap <silent> z/ :<C-u>RCReset<CR>:nohlsearch<CR>:sign unplace 333<CR>
"noremap <silent>n :<C-u>call <SID>put_searchstart_sign(1)<CR>nzv
function! s:put_searchstart_sign(is_nN_bindsearch) "{{{
  let [lnr, bufnr] = [line('.'), bufnr('%')]
  if a:is_nN_bindsearch && s:_get_crrsigns(bufnr)=~'=333'
    return
  endif
  sign unplace 333
  exe 'sign place 333 line='. lnr. ' name=SearchStart buffer='. bufnr
endfunction
function! s:_get_crrsigns(crrbufnr)
  redir => chksign
  silent exe 'sign place buffer='. a:crrbufnr
  redir END
  return chksign
endfunction
"}}}
nnoremap <silent> g/ :exe 'sign jump 333 buffer='.bufnr('%')<CR>
"--------------------------------------
"Moving
nmap + *
nnoremap g*   g*N
let g:f_pos = [0, 0]
function! s:imoff_f(is_vmode) "{{{
  let save_gcr = &gcr
  set gcr=n:hor20
  let c = nr2char(getchar())
  if a:is_vmode && c!="\<Esc>"
    let g:f_pos = [bufnr('%'), line('.')]
  else
    let g:f_pos = [0, 0]
  end
  let &gcr = save_gcr
  return c
endfunction
"}}}
nnoremap <silent>f    :<C-u>exe 'norm!' v:count1.'f'. <SID>imoff_f(0)<CR>
nnoremap <silent>F    :<C-u>exe 'norm!' v:count1.'F'. <SID>imoff_f(0)<CR>
vnoremap <silent>f    :<C-u>exe 'norm! ' visualmode(). v:count1.'f'. <SID>imoff_f(1)<CR>
vnoremap <silent>F    :<C-u>exe 'norm! ' visualmode(). v:count1.'F'. <SID>imoff_f(1)<CR>
nnoremap t ;
nnoremap T ;
vnoremap <expr>t    bufnr('%')==g:f_pos[0] && line('.')==g:f_pos[1] ? ';' : ":\<C-u>exe 'norm!' visualmode(). v:count1.'t'. <SID>imoff_f(1)\<CR>"
noremap U %
noremap L $
noremap <expr>H   col('.') == match(getline('.'), '^\s*\zs\S')+1 ? '0' : '^'
"noremap <silent>M   :<C-u>call <SID>smart_M('M')<CR>
function! s:smart_M(move) "{{{
  let s:smart_M_count = get(s:, 'smart_M_count', 0)
  let s:origin_view = s:smart_M_count==0 ? winsaveview() : get(s:, 'origin_view', winsaveview())
  let oldview = winsaveview()
  keepj exe ['norm! H', 'norm! M', 'norm! L', 'call winrestview(s:origin_view)'][s:smart_M_count-1]
  if winsaveview() != oldview
    let s:origin_view = winsaveview()
    let s:smart_M_count = 0
  endif
  keepj exe ['norm! H', 'norm! M', 'norm! L', 'call winrestview(s:origin_view)'][s:smart_M_count]
  let s:smart_M_count = s:smart_M_count==3 ? 0 : s:smart_M_count+1
endfunction
"}}}
noremap [space]w W
noremap [space]b B
noremap [space]e E
noremap [space]ge gE
omap <C-w> iW
"mark jump
exe 'noremap '. s:bind.markj. ' `'
exe 'noremap '. s:bind.markj. '` ``'
exe 'noremap '. s:bind.markj. '+ `"'
"次の折り畳みに移動
nnoremap <silent>zj :<C-u>call <SID>smart_foldjump('j')<CR>
nnoremap <silent>zk :<C-u>call <SID>smart_foldjump('k')<CR>
function! s:smart_foldjump(direction) "{{{
  if a:direction == 'j'
    let [cross, trace, compare] = ['zj', ']z', '<']
  else
    let [cross, trace, compare] = ['zk', '[z', '>']
  endif

  let i = v:count1
  while i
    let save_lnum = line('.')
    exe 'keepj norm! '. trace
    let trace_lnum = line('.')
    exe save_lnum

    exe 'keepj norm! '. cross
    let cross_lnum = line('.')
    if cross_lnum != save_lnum && eval('cross_lnum '. compare. ' trace_lnum') || trace_lnum == save_lnum
      let i -= 1
      continue
    endif

    exe trace_lnum
    let i -= 1
  endwhile
  mark `
  norm! zz
endfunction
"}}}
"--------------------------------------
"折り畳み操作
nnoremap <silent><C-_> :call <SID>smart_foldcloser()<CR>
function! s:smart_foldcloser() "{{{
  if !&fen
    return
  endif
  if foldlevel('.') == 0
    norm! zM
    return
  endif
  let foldc_lnum = foldclosed('.')
  norm! zc
  if foldc_lnum == -1
    return
  endif
  if foldclosed('.') != foldc_lnum
    return
  endif
  norm! zM
endfunction
"}}}
"現在地にfoldlevelを合わせる
nnoremap <silent>zu    :set foldlevel=<C-r>=foldlevel('.')-1<CR><CR>
nnoremap <silent>zu    zMzvzc
nnoremap <silent>z<C-_>    zMzvzc
nnoremap <silent>z0    :set foldlevel=<C-r>=foldlevel('.')<CR><CR>
nnoremap zf A <Esc>^zf
nnoremap z[     :<C-u>call <SID>put_foldmarker(0)<CR>
nnoremap z]     :<C-u>call <SID>put_foldmarker(1)<CR>
function! s:put_foldmarker(foldclose_p) "{{{
  let crrstr = getline('.')
  let padding = crrstr=='' ? '' : crrstr=~'\s$' ? '' : ' '
  let [cms_start, cms_end] = ['', '']
  let outside_a_comment_p = synIDattr(synID(line('.'), col('$')-1, 1), 'name') !~? 'comment'
  if outside_a_comment_p
    let cms_start = matchstr(&cms,'\V\s\*\zs\.\+\ze%s')
    let cms_end = matchstr(&cms,'\V%s\zs\.\+')
  endif
  let fmr = split(&fmr, ',')[a:foldclose_p]. (v:count ? v:count : '')
  exe 'norm! A'. padding. cms_start. fmr. cms_end
endfunction
"}}}
"--------------------------------------
"編集バインド(Normal)
nnoremap s "_s
nmap yd "_d
nmap yD "_D
nmap yc "_c
nmap yC "_C
function! s:delete_trailing_whitespaces() "{{{
  let save_view = winsaveview()
  let save_search=@/
  %s/\s\+$//e
  let @/=save_search
  nohl
  call winrestview(save_view)
endfunction
"}}}
nnoremap <silent>,es    :<C-u>call <SID>delete_trailing_whitespaces()<CR>
"直前のコマンドを再度実行する
"nnoremap ,. q:k<CR>
nnoremap [@]: @:
nmap c. @:
"ペーストしたテキストを再選択するBible3-15
onoremap [@]@ `[`]
vnoremap <expr> [@]@ "\<Esc>`[". strpart(getregtype(), 0,1). '`]'
onoremap <silent> gv :normal gv<CR>
"前回保存した状態にまでアンドゥ
nnoremap ,u :earlier 1f<CR>
nnoremap [space]<C-r> :later 1f<CR>
nnoremap =p p`[=`]
nnoremap =P P`[=`]
"テスト変数
nnoremap <silent>[C-k]<C-t>u :call <SID>unlet_testvars()<CR>
function! s:unlet_testvars() "{{{
  for n in range(30)
    let v = 'g:test'. printf('%02d', n)
    if exists(v)
      exe 'unlet '. v
    endif
  endfor
endfunction
"}}}
nnoremap [C-k]<C-t><C-t> :echo <SID>display_testvars()<CR>
function! s:display_testvars() "{{{
  let display = ''
  for n in range(30)
    let v = 'g:test'. printf('%02d', n)
    if exists(v)
      let display .= v. '='. string(eval(v)). "\n"
    endif
  endfor
  return display
endfunction
"}}}
nnoremap [C-k]<C-t>k :call PeekEcho()<CR>
":source
"nnoremap  [C-k]v     source $MYVIMRC<CR>
nnoremap  ,xv    source $MYVIMRC<CR>
nnoremap  <silent>[C-k]<C-s> :<C-u>if &mod<Bar> echoh WarningMsg <Bar>ec '先に保存してください'<Bar>echoh NONE <Bar> else<Bar> source %<Bar>echoh MoreMsg<Bar>echom 'sourced:'expand('%') strftime('%X', localtime())<Bar>echoh NONE<Bar> endif<CR>

"======================================
"Visual mode
vnoremap . :norm .<CR>
xnoremap re y:%s/<C-r>=substitute(@0, '/', '\\/', 'g')<CR>//gI<Left><Left><Left>
vnoremap zf :call <SID>Fixed_zf()<CR>
function! s:Fixed_zf() range "{{{
  let cmsStart = matchstr(&cms,'\V\s\*\zs\.\+\ze%s')
  let cmsEnd = matchstr(&cms,'\V%s\zs\.\+')
  let fmr = split(&fmr,',')
  call setline(a:firstline, getline(a:firstline). ' '. cmsStart.fmr[0].cmsEnd)
  call setline(a:lastline, getline(a:lastline). cmsStart.fmr[1].cmsEnd)
endfunction
"}}}
vnoremap <expr>v mode()=="v" ? "$h" : "v"
"改良版ビジュアルインサート from TIM Labs kana
vnoremap <expr> I  <SID>force_blockwise_visual('I')
vnoremap <expr> A  <SID>force_blockwise_visual('A')
function! s:force_blockwise_visual(next_key) "{{{
  if mode() ==# 'v'
    return "\<C-v>" . a:next_key
  elseif mode() ==# 'V'
    return "\<C-v>0o$" . a:next_key
  else  " mode() ==# "\<C-v>"
    return a:next_key
  endif
endfunction
"}}}
exe 'vnoremap '. s:bind.mode. ' <C-g>'
exe 'vnoremap '. s:bind.esc. ' <Esc>'
"0,0,0などの並んだ数字を選択して連番にするコマンドhttp://d.hatena.ne.jp/fuenor/20090907/1252315621
vnoremap <silent> <F4><C-a> :ContinuousNumber <C-a><CR>
vnoremap <silent> <F4><C-x> :ContinuousNumber <C-x><CR>
command! -count -nargs=1 ContinuousNumber
  \ let c = col('.')|for n in range(1, <count>?<count>-line('.'):1)|exec 'normal! j' . n . <q-args>|call cursor('.', c)|endfor

"======================================
"Insert & CommandLine mode
"Moving
noremap! <C-k> <Left>
noremap! <C-f> <Right>
inoremap <C-g>  <Esc><Plug>(smartword-w)i
inoremap <C-b>  <Esc><Plug>(smartword-b)i
"cnoremap <C-g> <S-Right>
"cnoremap <C-b> <S-Left>
noremap! <C-a> <Home>
inoremap <expr><C-e>  pumvisible() ? "\<C-e>" : "\<End>"
"cnoremap <C-e> <End>
"--------------------------------------
"挿入バインド(Insert CommandLine)
inoremap <C-r><C-e> <C-r>"
cnoremap <C-r><C-e>   <C-r>=substitute(substitute(@", '\n$', '', ''), '\n', '<Bar> ', 'g')<CR>
noremap! <C-r><C-f> <C-r>=expand('%:t')<CR>
inoremap <S-C-Tab> <C-d>
inoremap <C-r><C-t> 0<C-d>
inoremap <C-r><C-d> <C-d>
inoremap <C-x><C-a> <C-a>
inoremap <expr><C-Tab>  &et ? "\<C-v>\<C-i>" : repeat(' ', &sts ? &sts : &ts)
imap <M-Space>    <Tab><Tab>
cnoremap <expr> <C-x> expand('%:p:h') . "/"
cnoremap <expr> <C-z> expand('%:p:r')
"cnoremap <expr><C-s>    getcmdtype()==':' ? getcmdpos()==1 ? 'set ' : "\<C-s>" : "\<C-s>"
cnoremap <expr> / getcmdtype()=='/' ? '\/' : '/'
cnoremap <expr> ? getcmdtype()=='?' ? '\?' : '?'
"--------------------------------------
"編集バインド(Insert CommandLine)
noremap! <C-d>  <Del>
inoremap <C-w>    <C-o>db
"後方単語を大文字・小文字化(from thinca)
"gU v(文字指向にする/これによってカーソル上の文字も範囲にする :h o_v) b gi
inoremap <C-x>U <ESC>gUvbgi
inoremap <C-x>u <ESC>guvbgi
"imap <C-_> <Esc>
"cmap <C-_> <C-c>
imap <C-@> <Esc>
cmap <C-@> <C-c>
vmap <C-@> <C-c>
exe 'inoremap '. s:bind.esc. ' <Esc>'
exe 'cmap '. s:bind.esc. ' <C-c>'
cnoreabb <expr>b getcmdtype()==':' && getcmdline()=='b' ? 'ls<CR>:b' : 'b'
cnoreabb <expr>md getcmdtype()==':' && getcmdline()=~#'^\s*setf\%[iletype]' ? 'markdown' : 'md'
cnoreabb <expr>mkd getcmdtype()==':' && getcmdline()=~#'^\s*setf\%[iletype]' ? 'markdown' : 'mkd'
function! NoCursorMoved_Substitute() "{{{
  let save_view = winsaveview()
  let query = input('%s', '/')
  if query=~'^\s*$'
    return
  end
  let cmd = '%s'. query
  exe cmd
  call histadd(':', cmd)
  call histdel('@', query)
  call winrestview(save_view)
endfunction
"}}}
cnoreabb <expr>s getcmdtype()==':' && getcmdline()=~'^s' ? 'call NoCursorMoved_Substitute()<CR><C-r>=get([],getchar(0),"")<CR>' : 's'

"=============================================================================
let &mouse = has('mouse') ? 'a': ''
se browsedir=buffer " :bro[wse]ダイアログで開かれる初期dir
se autoread confirm
se winaltkeys =no
se timeout timeoutlen=5000 ttimeoutlen=100
se nrformats=hex "<C-a><C-x>に影響
se showmatch matchtime=1
se clipboard=
se history=50  " :コマンド履歴保存数
se modeline
se wrap
se fdm=marker cms=%s foldcolumn=3
se showtabline=2
se completeopt=menu,menuone,preview "補完
"終了時エラー確認
"set verbosefile=/tmp/vim.log

"======================================
"Backup
"backupfile
":h backup-table
se nobk nowb
  "NOTE: 'nobk'で'wb'だと書き込みに失敗したときのみbackupfileが残される
se bex=.bcu
se bdir=/tmp/auBcu/,$TEMP,$TMP,.
"--------------------------------------
"swapfile
se swf
se dir=$VIMCACHE/vimswap,.
for s:dir in split(&dir, ',')[:-2]
  if !isdirectory(s:dir)
    call mkdir(s:dir, "p")
  endif
endfor
unlet s:dir
"--------------------------------------
"undofile
if version >= 703
  se undofile
  let &undodir = &bdir
endif
"--------------------------------------
se viminfo=
se vi+='20  "marks
se vi+=<50  "register limit (line)
se vi+=s10  "register limit (Kbyte)
se vi+=%  "buffers list
se vi+=h  "viminfoを読み込むとき 'hlsearch' を無効にする
se vi+=ra:,rb:  "removable mediaの指定 (mark履歴対象外にする)
"se vi+=n$VIM/.viminfo  "viminfo file name (作成する場所)
se vi+=n$VIMCACHE/.viminfo  "viminfo file name (作成する場所)
"--------------------------------------
"views (カーソル位置などを復元)
set viewdir=$VIMCACHE/viewdir viewoptions=folds,cursor,slash,unix

"======================================
"編集設定
"--------------------------------------
"Indent, 自動整形
se expandtab ts=8 sw=2 sts=2 autoindent
  "'ts'   見かけ
  "'sts'  <Tab>の挿入や<BS>の使用等の編集操作
  "'sw'   'ci'や'ai'や>>で挿入されるindent
let g:vim_indent_cont = &sw "行継続の際、挿入されるindent量 :h ft-vim-indent
se cindent cinoptions& cinoptions+=:0 "'cinoptions' については実際使うときになって考え直す必要性 :h cinoptions-values
se smartindent
"auto-format
se formatoptions=
"se fo +=t  "'textwidth' を使ってテキストを自動折返しする
se fo +=q  ""gq" でコメントを整形する。
se fo +=n  "番号付きリスト等を認識して折り返す
se fo +=M  "マルチバイト文字連結時空白を挿入しない
se fo +=m  "マルチバイト文字でも整形を有効にする

"--------------------------------------
"検索
se wrapscan hlsearch incsearch
se tags=./tags,tags,../tags  "tagsファイルの読み込み先
set grepprg=jvgrep ""-n;:行番表示-H;:ファイル名表示
"set grepformat=%f:%l:%m
"set grepprg=internal  " vimgrep をデフォルトのgrepとする場合internal
"set grepprg=D:/bnr/cmd/cygwingrep/bin/cyggrep.exe\ -nH ""-n;:行番表示-H;:ファイル名表示
"set grepprg=cyggrep.exe\ -nH

"--------------------------------------
"Window
se lines=40 co=130 "時間かかりすぎ
"se scrolloff=2
se helpheight=0 previewheight=0 equalalways cmdheight=2
se winminwidth=0

"--------------------------------------
"カーソルの挙動
se virtualedit =block,onemore "実際に文字がないところにカーソルを置けるようにする
"カーソル左右の動き
se whichwrap=
se ww+=b  "<BS>
se ww+=s  "<Space>
se ww+=h
se ww+=l
se ww+=<  "<Left>  (nv)
se ww+=>  "<Right> (nv)
se ww+=[  "<Left>  (i Replace)
se ww+=]  "<Right> (i Replace)
se backspace=indent,eol,start "<BS>等をindentやeolを越えて有効にする

" ファイルを開いたら前回のカーソル位置へ移動 TODO:mkviewに置き換える
"aug vimrc_editting
"  au BufReadPost *
"    \ if line("'\"") > 1 && line("'\"") <= line('$') |
"    \   exe "normal! g`\"" |
"    \ endif
"aug END

"-----------------------------------------------------------------------------

"=============================================================================
"表示系

"不可視文字表示
se list lcs=
se lcs +=tab:>-
se lcs +=trail:_  "行末空白
se lcs +=extends:>  "画面に表示しきれない (続く)
se lcs +=precedes:<  "画面に表示しきれない (続く)
se lcs +=eol:$

"隙間を埋める文字
se fillchars=
se fcs +=vert:\|
se fcs +=stl:\ 
se fcs +=stlnc:\ 
se fcs +=fold:\ 
se fcs +=diff:-

let &sbr = '> ' "折り返された行の先頭に表示する文字列
se cpoptions +=n  "'showbreak'を行番号の間に表示させる

se guioptions=
"se go +=c  "単純な選択にはポップアップダイアログでなくコンソールダイアログを使う
se go +=r  "l/rスクロールバーを常に表示
se go +=L  "垂直分割されたときL/Rスクロールバーを表示
"se go +=m  "menubar
se go +=g  "無効の menubar 項目を灰色表示

"逐次表示されるメッセージ
se shortmess=
se shm +=a  "ステータス省略表現を使用
se shm +=O  "読み込み、Quickfix関係のメッセージがその前のメッセージを上書きする
se shm +=T  "メッセージが長すぎてコマンドラインに収まらないときは中央を切り詰め
se shm +=W  "書き込み時、メッセージを表示しない
se shm +=o  "書き込み時のメッセージをその後の読み込みメッセージで上書きする
se shm +=I  "Vim開始挨拶メッセージを表示しない
itchyny commented 10 years ago

.vimrc

set nocompatible
filetype off
execute 'set runtimepath+='.expand('~/.vim/bundle/neobundle.vim')
call neobundle#rc(expand('~/.vim/bundle'))
NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'Shougo/unite.vim'
syntax enable
filetype plugin indent on

起動からのコマンド

:Unite line
<C-w>j
:vsp
<C-w>k
q

アニメーションgif out

Shougo commented 10 years ago

仕様です。unite.vimはUniteウインドウを「開いた時の」情報を保存しており、閉じた時に復元します。 当然、ウインドウ構成が変わるとうまく動きません。

Shougo commented 10 years ago

仕様です。が、動作は改善できそうなので対処しておきました。

LeafCage commented 10 years ago

ありがとうございます。

LeafCage commented 10 years ago

分割されたときのexitが改善されたのを確認しました。