scriptencoding utf8

"-------------------
"--  Recipe Menu  --
"-------------------
" -- Parameter
" -- Local_Function
" -- Initialize
" -- Plugin_Manage
" -- Plugin_Configure
" -- View_Setting
" -- Action_Setting
" -- Inner_Setting
" -- Event_Method
" -- Command_Util
" -- Key_Mapping
" -- File_Type
" -- Environment_Pref
" ---



"----------------------------"
"  Target of this config     "
"    - UNIX Type             "
"    - Cygwin                "
"    - Windows Kaoriya GVim  "
"----------------------------"
"     Eigo - Ingulisshu      "
"----------------------------"
" Ideas {{{

"-- View prev and next fold head text ...on echo or other buffer ? on submode-foldings

"-- Unite outline -> view C-Sharp <summary>~</summary>

" }}}
" Issues {{{

"-- C-o hard use on vimshell

"-- automatic mkdir './C:' when execute NeoBundleInstall in windows kaoriya
"  -- does neobundle thinks that is repository...?

"-- doesn't conceal-javadoc functioned ?

"-- shot-f not functioned in i_<C-o> temporary normal mode

"-- couldn't auto make vimproc at anywhere

"-- conflicted? vim-ruby and rspec.vim when those was set NeoBundleLazy
"  -- does not loaded syntax of rspec.vim

"-- incsearch.vim(?) throw an exception E874 when searched '<leader>~'

"-- Exeption happened when input '.*' to unite textarea

"-- 'cs' sneppet 'pragma' circulated with 'warning' in neosnippet-snippets

"-- OverCommandLine throw (E803: ID not found: 1011) when press % some times.
"  -- but doesn't happned some times.

"}}}
" Todo {{{

"-- Eigo translate to English in this file

"-- read help options.jax

"-- read help windows.txt

"-- read help 'cino'

" }}}



"----------------------------------------
" {- Hints -} "
" @Bugs         => This hoge has the bugs.
" @Incompleted  => This is not completed making.
" @Unchecked    => This was not unchecked that is operate right
" @Unsupported  => Do not supported functions when now.
" @Unknowned    => I don't know why this functioned.
"     /人◕ ‿‿ ◕人\ <  Wakega wakaranaiyo!
" @Unused       => Not used this yet now, needs inquires deleting this.
" @Deprecated   => Deprecated This vimrc Version.
" @Experiment   => This is experimental implementation.
" @Marked       => I have eye on this.
" @See          => Referred URL, Saw Document, and etc...
" @Code         => A sample code using it
"-------------------
" Designating the target platform.
" @Hoge{Win|Ubuntu}  : This Hint for Win and Ubuntu.
" @Hoge!{Mac}        : This Hint for other than Mac.
"----------------------------------------
" {- Booked something -}
" mark     Z => comand[BufMoveNewTab]
" register z => inoremap[<C-k>Y]
"----------------------------------------


"---------------------"
"      Parameter      "
"---------------------"
"{{{

let g:vimrc = get(g:, 'vimrc', {})
let g:vimrc['loaded'] = get(g:vimrc, 'loaded', 0)

let s:is_windows = has('win32')
let s:is_cygwin  = has('win32unix')
let s:is_kaoriya = has('kaoriya')
let s:is_doswin  = s:is_windows && !s:is_cygwin && !has('gui')
let s:is_unix    = has('unix')
let s:is_mac     = has('mac')
let s:is_mac_osx = has('macunix')

let s:has_cygwin = isdirectory('/cygwin')
let s:has_mingw  = 0  "@Incomplete('dummy')

let s:vim_home = expand('~/.vim')

let s:backupdir = expand('~/.backup/vim_backup')
let s:directory = s:backupdir . '/swp'
let s:undodir   = s:backupdir . '/undo'
let s:viewdir   = s:backupdir . '/view'

let s:username  = $USER
let s:groupname = $GROUP !=# '' ? $GROUP : $USER

"}}}


"---------------------"
"    Local_Function   "
"---------------------"
"{{{

function! s:system(cmd)
	if exists('*vimproc#system')
		return vimproc#system(a:cmd)
	else
		return system(a:cmd)
	endif
endfunction

function! s:echo_error(msg)
	echohl Error
	echo a:msg
	echohl None
endfunction

"}}}


"-------------------------"
"       Initialize        "
"-------------------------"
" autocmd Groups {{{

augroup PluginPrefs
	autocmd!
augroup END

augroup FileEvent
	autocmd!
augroup END

augroup ExtensionType
	autocmd!
augroup END

augroup HighlightPref
	autocmd!
augroup END

augroup KeyMapping
	autocmd!
augroup END

augroup KeyEvent
	autocmd!
augroup END

"}}}
" For Support Kaoriya Vim {{{

if s:is_kaoriya
	" Set Environment
	let $HOME        = $VIM
	let s:vim_home   = expand('~/.vim')  " Reset with $HOME
	let &runtimepath = &runtimepath . ',' . s:vim_home
	if s:has_cygwin
		let $PATH = '/cygwin/bin;/cygwin/usr/bin;/cygwin/usr/sbin;' . $PATH
		let $PATH = $HOME . '/bin;' . $PATH
	endif


	" Build Base Directories
	if !isdirectory(s:vim_home)
		call mkdir(s:vim_home)
	endif


	" For Using No Default vimproc
	let s:switch_dir = $VIM . '/switches/enabled'
	let s:suppress   = s:switch_dir . '/disable-vimproc.vim'

	if s:is_windows && !s:has_mingw && filereadable(s:suppress)
		call delete(s:suppress)
	elseif s:is_windows && s:has_mingw && !filereadable(s:suppress)
		call writefile([], s:suppress)
	endif

	for s:disf in map(['/utf-8.vim', '/vimdoc-ja.vim'], 's:switch_dir . v:val')
		if !filereadable(s:disf)
			call writefile([], s:disf)
		endif
	endfor
	unlet s:switch_dir s:suppress s:disf


	" Unset Kaoriya Preference
	set noignorecase nosmartcase

	augroup FileEvent
		autocmd BufRead $MYVIMRC setl enc=utf8 fenc=utf8
	augroup END
endif

"}}}
" Check NeoBundle exists {{{
let s:bundledir    = s:vim_home . '/bundle'
let s:neobundledir = s:bundledir . '/neobundle.vim'

if !isdirectory(s:bundledir)
	call mkdir(s:bundledir)
endif

function! s:remove_empty_bundledir()  "{{{
	let l:dirs = split(s:system('ls ' . s:bundledir), '\n')

	for l:dir in l:dirs
		let l:plugin_dir = s:bundledir . '/' . l:dir
		let l:is_empty   = s:system('ls ' . l:plugin_dir) ==# ''

		if l:is_empty
			call s:system('rmdir ' . l:plugin_dir)
		endif
	endfor
endfunction  "}}}
function! s:fetch_neobundle() " {{{
	if executable('git')
		echo 'NeoBundle was not installed...'
		echo 'Installing NeoBundle.'

		execute '!git clone http://github.com/Shougo/neobundle.vim ' s:neobundledir
		return
	else
		call s:echo_error('Sorry, You do not have git command.')
		call s:echo_error('Cannot introduce NeoBundle.')

		throw 'neobundle.vim clone failed.'
	endif
endfunction " }}}

if has('vim_starting')
	try
		let &runtimepath = &runtimepath . ',' . s:vim_home . '/bundle/neobundle.vim'

		" Throws Error when nothing neobundle in runtime path
		call neobundle#begin()
	catch
		if isdirectory(s:neobundledir) && !exists(':NeoBundle')
			" Plugin Directories may be empty when git cloned new.
			call s:remove_empty_bundledir()
			echo 'bundle directories initialized.'
		endif

		try
			call s:fetch_neobundle()
			call neobundle#begin()

			echo 'NeoBundle installed.'
			echo 'Please closing vim and reopening vim once,'
			echo 'and executing :NeoBundleInstall .'
		catch
			call s:echo_error('neobundle.vim clone failed.')
			call s:echo_error('>> Vim Config Error <<')
		endtry
	endtry
endif

unlet s:neobundledir
unlet s:bundledir
"}}}
" Check Backup, Swap and Undo directory exists {{{

if !isdirectory(s:backupdir)
	call mkdir(s:backupdir, 'p', 0700)
	call s:system(printf('chown -R %s:%s %s', s:username, s:groupname, s:backupdir))
endif

if !isdirectory(s:directory)
	call mkdir(s:directory, 'p', 0700)
	call s:system(printf('chown -R %s:%s %s', s:username, s:groupname, s:directory))
endif

if !isdirectory(s:undodir)
	call mkdir(s:undodir, 'p', 0700)
	call s:system(printf('chown -R %s:%s %s', s:username, s:groupname, s:undodir))
endif

"}}}
" Enable matchit.vim {{{

if !exists('loaded_matchit')
	" Load it
	runtime macros/matchit.vim

	" If I don't have matchit document, I get it
	let s:matchit_doc_from = expand('$VIMRUNTIME/macros/matchit.txt')
	let s:matchit_doc_to   = expand('~/.vim/doc/matchit.txt')

	if !filereadable(s:matchit_doc_to)
		call writefile(readfile(s:matchit_doc_from), s:matchit_doc_to)
	endif

	unlet s:matchit_doc_to
	unlet s:matchit_doc_from
endif

"}}}


"-------------------------"
"     Plugin_Manage       "
"-------------------------"
"*** Plugin List ***"{{{

NeoBundleFetch   'Shougo/neobundle.vim'
NeoBundleLazy    'basyura/twibill.vim'
NeoBundle        'tyru/open-browser.vim'
NeoBundleLazy    'basyura/bitly.vim'
NeoBundle        'Shougo/unite.vim'
NeoBundle        'Shougo/vimproc.vim'
NeoBundleLazy    'basyura/TweetVim'
NeoBundle        'mattn/webapi-vim'
NeoBundle        'Shougo/vimshell.vim'
NeoBundle        'rhysd/wandbox-vim'
NeoBundle        'thinca/vim-quickrun'
NeoBundleLazy    'kashewnuts/gmail.vim'
NeoBundleLazy    'basyura/J6uil.vim'
NeoBundle        'osyo-manga/vim-gyazo'
NeoBundle        'yuratomo/w3m.vim'
NeoBundle        'mattn/learn-vimscript'
NeoBundleLazy    'rbtnn/vimconsole.vim'
NeoBundle        'supermomonga/thingspast.vim'
NeoBundle        'supermomonga/vimshell-kawaii.vim'
NeoBundle        'mattn/excitetranslate-vim'
NeoBundle        'mattn/unite-advent_calendar'
NeoBundleLazy    'thinca/vim-splash'
NeoBundle        'supermomonga/jazzradio.vim'
NeoBundle        'mattn/favstar-vim'
NeoBundle        'ujihisa/unite-colorscheme'
NeoBundle        'Shougo/vinarise.vim'
NeoBundle        'mattn/gist-vim'
NeoBundle        'thinca/vim-ref'
NeoBundle        'ujihisa/ref-hoogle'
NeoBundleLazy    'vim-jp/vital.vim'
NeoBundle        'Shougo/unite-outline'
NeoBundleLazy    'rbtnn/puyo.vim'
NeoBundleLazy    'mattn/benchvimrc-vim'
NeoBundleLazy    'mattn/yamada-vim'
NeoBundleLazy    'jvoorhis/coq.vim'
NeoBundleLazy    'eagletmt/coqtop-vim'
NeoBundle        'rhysd/vim-grammarous'
NeoBundleLazy    'thinca/vim-themis'
NeoBundle        'tomasr/molokai'
NeoBundle        'aiya000/arot13.vim'
NeoBundle        'aiya000/ahoge-put.vim'
NeoBundleLazy    'kannokanno/previm'
NeoBundle        'kamichidu/vim-vdbc'
NeoBundle        'mattn/vdbi-vim'
NeoBundle        'LeafCage/foldCC'
NeoBundleLazy    'katono/rogue.vim'
NeoBundle        'aiya000/asql.vim'
NeoBundleLazy    'kamichidu/vim-benchmark'
NeoBundle        'kana/vim-submode'
NeoBundle        'mfumi/ref-dicts-en'
NeoBundle        'thinca/vim-painter'
NeoBundle        'osyo-manga/vim-anzu'
NeoBundle        'osyo-manga/vim-over'
NeoBundle        'tyru/restart.vim'
NeoBundle        'vim-jp/vimdoc-ja'
NeoBundleLazy    'rbtnn/game_engine.vim'
NeoBundle        'h1mesuke/vim-alignta'
NeoBundle        'haya14busa/incsearch.vim'
NeoBundle        'thinca/vim-scouter'
NeoBundle        'deris/vim-shot-f'
NeoBundle        'oplatek/Conque-Shell'
NeoBundle        'sgelb/TaskList.vim'
NeoBundle        'tyru/vim-altercmd'
NeoBundle        'mbbill/undotree'
NeoBundle        'Shougo/neomru.vim'
NeoBundle        'aiya000/adrone.vim'
NeoBundleFetch   'Shougo/fakecygpty'
NeoBundle        'nathanaelkane/vim-indent-guides'
NeoBundleLazy    'LeafCage/vimhelpgenerator'
NeoBundleLazy    'thinca/vim-threes'
NeoBundle        'vim-ruby/vim-ruby'
NeoBundle        'Keithbsmiley/rspec.vim'
NeoBundle        'tsukkee/unite-help'
NeoBundle        'altercation/vim-colors-solarized'
NeoBundle        'aiya000/aho-bakaup.vim'
NeoBundleLazy    'yaasita/ore_markdown'
NeoBundle        'chrisbra/vim-diff-enhanced'
NeoBundle        'Shougo/neosnippet.vim'
NeoBundle        'Shougo/neosnippet-snippets'


call neobundle#end()

"}}}
"*** Plugin Depends and Auto Config ***" {{{

call neobundle#config('vimproc.vim', {
\	'build' : {
\		'unix'    : 'make -f make_unix.mak',
\		'mac'     : 'make -f make_mac.mak',
\		'cygwin'  : 'make -f make_cygwin.mak',
\		'windows' : 'make -f make_mingw32.mak'
\	}
\})
call neobundle#config('TweetVim', {
\	'depends' : [
\		'basyura/twibill.vim',
\		'tyru/open-browser.vim',
\		'h1mesuke/unite-outline',
\		'basyura/bitly.vim',
\		'Shougo/unite.vim',
\		'Shougo/vimproc.vim',
\		'mattn/favstar-vim'
\	],
\	'autoload' : {'commands' : 'TweetVim'}
\})
call neobundle#config('vimshell.vim', {
\	'depends' : 'Shougo/vimproc.vim'
\})
call neobundle#config('gmail.vim', {
\	'depends'  : 'Shougo/vimproc.vim',
\	'autoload' : {'commands' : 'Gmail'}
\})
call neobundle#config('J6uil.vim', {
\	'depends' : [
\		'mattn/webapi-vim',
\		'Shougo/vimproc.vim',
\		'tyru/open-browser.vim',
\		'Shougo/unite.vim'
\	],
\	'autoload' : {'commands' : 'J6uil'}
\})
call neobundle#config('vim-gyazo', {
\	'depends' : [
\		'tyru/open-browser.vim',
\		'basyura/TweetVim'
\	]
\})
call neobundle#config('vimshell-kawaii.vim', {
\	'depends'  : 'Shougo/vimshell.vim'
\})
call neobundle#config('vimconsole.vim', {
\	'autoload' : {'filetypes' : 'vim'}
\})
call neobundle#config('vim-splash', {
\	'autoload' : {'commands' : 'Splash'}
\})
"@Experimental('config moved to here')
call neobundle#config('jazzradio.vim', {
\	'autoload' : {
\		'unite_sources' : ['jazzradio'],
\		'commands'      : [
\			'JazzradioUpdateChannels',
\			'JazzradioStop', {
\				'name'     : 'JazzradioPlay',
\				'complete' : 'customlist,jazzradio#channel_id_comlete'
\			}
\		],
\		'function_prefix' : 'Jazzradio',
\		'depends'         : 'Shougo/unite.vim'
\	}
\})
call neobundle#config('ref-hoogle', {
\	'depends'  : 'thinca/vim-ref'
\})
call neobundle#config('vital.vim', {
\	'autoload' : {'filetypes' : 'vim'}
\})
call neobundle#config('puyo.vim', {
\	'autoload' : {'commands' : 'Puyo'},
\	'depends'  : 'rbtnn/game_engine.vim'
\})
call neobundle#config('benchvimrc-vim', {
\	'autoload' : {'commands' : 'BenchVimrc'}
\})
call neobundle#config('yamada-vim', {
\	'autoload' : {'commands' : 'Yamada'}
\})
call neobundle#config('coq.vim', {
\	'autoload' : {'filetypes' : 'coq'}
\})
call neobundle#config('coqtop-vim', {
\	'autoload' : {'filetypes' : 'coq'},
\	'depends'  : 'Shougo/vimproc.vim'
\})
call neobundle#config('vim-grammarous', {
\	'disabled' : !executable('java')
\})
call neobundle#config('vim-themis', {
\	'autoload' : {'filetypes' : [
\		'vim',
\		'vimspec'
\	]}
\})
call neobundle#config('previm', {
\	'autoload' : {'filetypes' : 'markdown'}
\})
call neobundle#config('rogue.vim', {
\	'autoload' : {'commands' : [
\		'Rogue',
\		'RogueRestore',
\		'RogueResume',
\		'RogueScores'
\	]}
\})
call neobundle#config('ref-dicts-en', {
\	'depends' : 'thinca/vim-ref'
\})
call neobundle#config('fakecygpty', {
\	'build' : {
\		'windows' : expand('gcc fakecygpty.c -o ~/bin/fakecygpty.exe')
\	}
\})
call neobundle#config('vimhelpgenerator', {
\	'autoload' : {'commands' : [
\		'VimHelpGenerator',
\		'HelpIntoMarkdown'
\	]}
\})
call neobundle#config('vim-threes', {
\	'autoload' : {'commands' : [
\		'ThreesShowRecord',
\		'ThreesStart'
\	]}
\})
"@Bugs('rspec.vim do not highlight syntax before loading vim-ruby')
"call neobundle#config('vim-ruby', {
"\	'autoload' : {'filetype' : 'ruby'}
"\})
"call neobundle#config('rspec.vim', {
"\	'autoload' : {'filetype' : 'ruby'}
"\})
"@Bugs('Do not functioned on windows with this config')
call neobundle#config('ore_markdown', {
\	'buld' : {
\		'unix'    : 'bundle install --gemfile ./bin/Gemfile',
\		'windows' : 'bundle install --gemfile .\bin\Gemfile',
\		'mac'     : 'bundle install --gemfile ./bin/Gemfile'
\	},
\	'autoload' : {'commands' : 'OreMarkdown'}
\})

" }}}


"------------------------"
"*** Plugin_Configure ***"
"------------------------"
"--- netrw ---" {{{

let g:netrw_preview = 1

" }}}
"--- matchit.vim ---" {{{

"augroup FileEvent
"	" uooooooooooooo... oh, my triple operator !!!!!!!!!!!
"	" Why if set you, happend an error when doing match it...
"	autocmd FileType * let b:match_words = &matchpairs . ',?::'
"augroup END

" }}}
"--- unite.vim ---"{{{

"@Code(':Unite javasrc')
let g:unite_source_alias_aliases = {
\	'javasrc' : {
\		'source' : 'file_rec',
\		'args'   : '~/Documents/workspace/Java/src'
\	}
\}

"}}}
"--- vim-quickrun ---" {{{
"
let g:quickrun_config = {
\	'_' : {
\		'split'  : '',
\		'runner' : 'vimproc',
\		'runner/vimproc/updatetime' : 10,
\		'hook/time/enable' : 1
\	},
\	'cpp' : {
\		'command' : 'g++',
\		'cmdopt'  : '-std=c++14'
\	},
\	'java' : {
\		'cmdopt' : '-source 1.8',
\		'runner' : 'process_manager'
\	},
\	'vimspec' : {
\		'command' : 'themis',
\		'cmdopt'  : '--runtimepath ".."',
\		'exec'    : '%c %o %s:p | tr -d "\r"'
\	}
\}

if s:is_windows
	let g:quickrun_config['cs'] = {
	\	'command'  : 'csc.exe',
	\	'exec'     : ['%c %o %s:p', '%s:p:r.exe', 'del %s:p:r.exe'],
	\	'hook/output_encode/encoding' : 'cp932:utf8'
	\}
elseif s:is_unix
	let g:quickrun_config['cs'] = {
	\	'command'  : 'gmcs',
	\	'exec'     : ['%c %o %s:p > /dev/null', 'mono %s:p:r.exe', 'rm %s:p:r.exe'],
	\	'tempfile' : '{tempname()}.cs'
	\}
endif

if s:is_cygwin
	let g:quickrun_config['java'] = {
	\	'command' : 'javac',
	\	'exec'    : ['%c %o `echo %s | sed s:\:/:g | cygpath -w -f -`', '%c %s:t:r %a'],
	\	'hook/output_encode/encoding' : 'Shift_JIS'
	\}

	let s:javav = s:system('java -version')

	let g:quickrun_config.java['cmdopt'] =
	\	s:javav =~# '1\.8' ? '-source 1.8 -encoding UTF-8' :
	\	s:javav =~# '1\.7' ? '-source 1.7 -encoding UTF-8'
	\	                   : '-encoding UTF-8'

	unlet s:javav
endif

" }}}
"--- vimproc.vim ---"{{{

if s:is_windows && !s:has_mingw
	"@Incompleted('I couldn't use a NeoBundleDisable on this situation')
	"NeoBundleDisable 'vimproc.vim'
	set runtimepath-=~/.vim/bundle/vimproc.vim/
endif

" }}}
"--- TweetVim ---"{{{

let g:tweetvim_async_post = 1

"}}}
"--- vimshell.vim ---"{{{

"@Experimental('test commented out, this without needs?')
" Add to VimShell Commands Directory of My Home
"execute ':set runtimepath+=' . s:vim_home . '/autoload/vimshell/commands'

let g:vimshell_no_save_history_commands = {
\	'history': 1,
\	'ls'     : 1,
\	'clear'  : 1
\}
let g:vimshell_enable_transient_user_prompt = 1
let g:vimshell_force_overwrite_statusline   = 1
let g:vimshell_max_command_history          = 10000
let g:vimshell_scrollback_limit             = 10000

" This variable defined by my command
" Connect to bash's hereis
let g:vimshell_hereis_file = expand('~/.bashrc_places')

"}}}
"--- vimshell-kawaii.vim ---"{{{

let g:vimshell_kawaii_smiley = 1

"}}}
"--- excitetraslate-vim ---"{{{

" Don't yank result to @" register
let g:excitetranslate_options = ["buffer"]

"}}}
"--- w3m.vim ---"{{{

let g:w3m#external_browser = 'firefox'

"let g:w3m#homepage = 'http://www.bing.com/'
let g:w3m#homepage = 'http://www.google.co.jp/'

"}}}
"--- vimconsole.vim ---"{{{

let g:vimconsole#auto_redraw = 1

"}}}
"--- foldCC ---"{{{

let g:foldCCtext_maxchars = 120

"}}}
"--- rogue.vim ---"{{{

let g:rogue#directory = expand('~/.rogue_vim')

if !isdirectory(g:rogue#directory)
	call mkdir(g:rogue#directory)
endif

"}}}
"--- vim-submode ---"{{{

let g:submode_timeout = 0

augroup FileEvent
	" Window Resizer
	autocmd FileType * call submode#enter_with('window_resize', 'n', '', '<C-s>w')
	autocmd FileType * call submode#map('window_resize', 'n', '', 'j', '<C-w>+')
	autocmd FileType * call submode#map('window_resize', 'n', '', 'k', '<C-w>-')
	autocmd FileType * call submode#map('window_resize', 'n', '', 'h', '<C-w><')
	autocmd FileType * call submode#map('window_resize', 'n', '', 'l', '<C-w>>')
	autocmd FileType * call submode#map('window_resize', 'n', '', '=', '<C-w>=')
	autocmd FileType * call submode#map('window_resize', 'n', '', '_', '<C-w>_')

	" Fold Mover
	autocmd FileType * call submode#enter_with('fold_move', 'n', '', '<C-s>z')
	autocmd FileType * call submode#map('fold_move', 'n', 'e', 'j', "foldlevel('.') > 0 ? 'zczjzozz'   : 'zjzozz'")
	autocmd FileType * call submode#map('fold_move', 'n', 'e', 'k', "foldlevel('.') > 0 ? 'zczkzo[zzz' : 'zkzo[zzz'")
	autocmd FileType * call submode#map('fold_move', 'n', '',  'h', '[z')
	autocmd FileType * call submode#map('fold_move', 'n', '',  'l', ']z')

	" Buffer Changer
	autocmd FileType * call submode#enter_with('buffer_change', 'n', '', '<C-s>b')
	autocmd FileType * call submode#map('buffer_change', 'n', 's', 'n', ':bnext<CR>')
	autocmd FileType * call submode#map('buffer_change', 'n', 's', 'p', ':bprevious<CR>')

	" Tab Mover
" s:loopable_tab_move_prev() "{{{

function! LoopableTabMovePrev()
	if tabpagenr() is 1
		execute ':tabmove' tabpagenr('$')
	else
		execute ':tabmove -1'
	endif
endfunction

"}}}
" s:loopable_tab_move_next() "{{{

function! LoopableTabMoveNext()
	if tabpagenr() is tabpagenr('$')
		execute ':tabmove 0'
	else
		execute ':tabmove +1'
	endif
endfunction

"}}}
	autocmd FileType * call submode#enter_with('tab_move', 'n', '', '<C-s>t')
	autocmd FileType * call submode#map('tab_move', 'n', 's', 'n', ':call LoopableTabMoveNext()<CR>')
	autocmd FileType * call submode#map('tab_move', 'n', 's', 'p', ':call LoopableTabMovePrev()<CR>')

	" WinTab Mover
	" Current buffer move to next tab "{{{
	command! BufTabMovePrev execute 'normal! mZ:hide<CR>gT:vsp<CR>`Z'
	command! BufTabMoveNext execute 'normal! mZ' . (winnr('$') <= 1 ? ':hide<CR>' : ':hide<CR>gt') . ':vsp<CR>`Z'
	"}}}
	autocmd FileType * call submode#enter_with('wintab_move', 'n', '', '<C-s>N', ':BufTabMoveNext<CR>')
	autocmd FileType * call submode#enter_with('wintab_move', 'n', '', '<C-s>P', ':BufTabMovePrev<CR>')
	autocmd FileType * call submode#map('wintab_move', 'n', '', 'N', ':BufTabMoveNext<CR>')
	autocmd FileType * call submode#map('wintab_move', 'n', '', 'P', ':BufTabMovePrev<CR>')
	autocmd FileType * call submode#map('wintab_move', 'n', '', 'H', '<C-w>H')
	autocmd FileType * call submode#map('wintab_move', 'n', '', 'J', '<C-w>J')
	autocmd FileType * call submode#map('wintab_move', 'n', '', 'K', '<C-w>K')
	autocmd FileType * call submode#map('wintab_move', 'n', '', 'L', '<C-w>L')
augroup END

"}}}
"--- vim-ref ---" {{{

let g:ref_use_vimproc = 1

" }}}
"--- ref-dicts-en ---" {{{
"@See('http://d.hatena.ne.jp/akishin999/20131024/1382569289')

let g:ref_source_webdict_sites = {
\	'weblio' : {
\		'url' : 'http://ejje.weblio.jp/content/%s'
\	}
\}

let g:ref_source_webdict_sites['default'] = 'weblio'

function! s:weblio_filter(output) "{{{
	let l:lines  = split(a:output, "\n")
	"@Incompleted('do not filtered')
	let l:lines1 = map(l:lines, 'substitute(v:val, "\v(発音記号|音声を聞く|ダウンロード再生)\n", "", "g")')
	return join(l:lines1[60 : ], "\n")
endfunction "}}}
let g:ref_source_webdict_sites['weblio'].filter = function('s:weblio_filter')

" }}}
"--- restart.vim ---" {{{

let g:restart_sessionoptions = 'blank,curdir,folds,help,localoptions,tabpages'

" }}}
"--- vimdoc-ja ---"{{{

" vimdoc-ja is secondary order
set helplang=en,ja

"}}}
"--- Conque-Shell ---"{{{

let g:ConqueTerm_CloseOnEnd     = 1
let g:ConqueTerm_SessionSupport = 1
let g:ConqueTerm_ReadUnfocused  = 1
let g:ConqueTerm_Color          = 1
let g:ConqueTerm_InsertOnEnter  = 0
let g:ConqueTerm_StartMessages  = 1

"}}}
"--- TaskList.vim ---"{{{

" TaskList search these
let g:tlTokenList = ["FIXME", "TODO", "XXX", "NOTE"]

" Open window at bottom
let g:tlWindowPosition = 1

" Restore opened position when closed TaskList
let g:tlRememberPosition = 1

"}}}
"--- vim-indent-guides ---"{{{

let g:indent_guides_default_mapping = 0
let g:indent_guides_guide_size      = 1
let g:indent_guides_auto_colors     = 0

" Define guide colors
augroup HighlightPref
	autocmd VimEnter,ColorScheme * highlight default link IndentGuidesOdd  PmenuSel
	autocmd VimEnter,ColorScheme * highlight default link IndentGuidesEven Pmenu
augroup END

" If matched file extension pattern, indent-guides is enabled
augroup FileEvent
	autocmd WinEnter,BufWinEnter * IndentGuidesDisable
	autocmd WinEnter,BufWinEnter *.xml,*.html,*css,*scss,*.erb IndentGuidesEnable
augroup END

"}}}
"--- vim-colors-solarized ---"{{{

let g:solarized_contrast = "high"

"}}}
"--- aho-bakaup.vim ---"{{{

" Devolute to Bakaup
set nobackup

" Powered Up Auto File Backup when written
let g:bakaup_backup_dir  = s:backupdir
let g:bakaup_auto_backup = 1

"}}}
"--- For Debug ---"{{{

" Local my plugins
let s:makes = ['arot13.vim',
\              'ahoge-put.vim',
\              'asql.vim',
\              'adrone.vim',
\              'aho-bakaup.vim']

let s:makes_dir = '~/Repository/'


" If valid local plugin, disable bundled same plugin
for s:plug in s:makes
	let s:plug_dir = s:makes_dir . s:plug

	if isdirectory(expand(s:plug_dir))
		let &runtimepath .= ',' . s:plug_dir
		execute ':NeoBundleDisable' s:plug
	end
endfor


unlet s:plug_dir s:plug s:makes_dir s:makes

"}}}
"--- For Private ---"{{{

" Read Privacy Config
if filereadable(expand('~/.vimrc_private'))
	source ~/.vimrc_private
endif

"}}}


"-------------------------"
"      View_Setting       "
"-------------------------"
"{{{

" Set Basic Preferences
set number nowrap hlsearch list scrolloff=8

" Status Bar always displayed
set laststatus=2

"@See('http://sourceforge.jp/magazine/07/11/06/0151231')
" Status Bar format
set statusline=%F%m\%=[FileType=%y][Format=%{&ff}]

" ☆ Fix View 2byte Code (Not support gnome-terminal)
set ambiwidth=double

" Powered Up Syntax Highlight
" {{{

augroup HighlightPref
	autocmd ColorScheme * highlight Visual       cterm=underline ctermfg=White ctermbg=Cyan
	autocmd ColorScheme * highlight IncSearch                    ctermfg=Black ctermbg=Cyan
	autocmd ColorScheme * highlight Pmenu        cterm=standout  ctermfg=Blue
	autocmd ColorScheme * highlight PmenuSel                     ctermfg=Black ctermbg=White
	autocmd ColorScheme * highlight TabLine      cterm=standout  ctermfg=Blue
	autocmd ColorScheme * highlight TabLineSel   cterm=NONE      ctermfg=Cyan
	autocmd ColorScheme * highlight TabLineFill  cterm=standout  ctermfg=Blue
	autocmd ColorScheme * highlight VertSplit    cterm=NONE      ctermfg=Cyan  ctermbg=Blue
	autocmd ColorScheme * highlight StatusLine                   ctermfg=Cyan  ctermbg=Black
	autocmd ColorScheme * highlight StatusLineNC                 ctermfg=Blue
	autocmd ColorScheme * highlight LineNr                       ctermfg=Blue
	autocmd ColorScheme * highlight CursorLine   cterm=underline ctermfg=Cyan
augroup END


augroup HighlightPref
	autocmd ColorScheme       * highlight RcEmSpace cterm=standout ctermfg=LightBlue
	autocmd VimEnter,WinEnter * call matchadd('RcEmSpace', ' ')
augroup END


augroup HighlightPref
	autocmd InsertEnter * highlight StatusLine ctermfg=Black ctermbg=Cyan
	autocmd InsertLeave * highlight StatusLine ctermfg=Cyan  ctermbg=Black
augroup END

" }}}

" Set for Color Scheme
if !g:vimrc['loaded']
	set background=dark
	colorscheme desert
endif

" Indent Wrapped Text
set breakindent linebreak

" View cursor column on <C-g>
set noruler

"@See('http://d.hatena.ne.jp/thinca/20111204/1322932585')
" Sugoi view tabline
function! s:tabpage_label(n) "{{{
	let l:title = gettabvar(a:n, 'title')
	if l:title !=# ''
		return l:title
	endif

	let l:bufnrs = tabpagebuflist(a:n)
	let l:hi = a:n is tabpagenr() ? '%#TabLineSel#' : '%#TabLine#'

	let l:no = len(l:bufnrs)
	if l:no is 1
		let l:no = ''
	endif

	let l:mod = len(filter(copy(l:bufnrs), "getbufvar(v:val, '&modified')")) ? '+' : ''
	let l:sp = (l:no . l:mod) ==# '' ? '' : ' '

	let l:curbufnr = bufnrs[tabpagewinnr(a:n) - 1]
	let l:fname = pathshorten(bufname(l:curbufnr))
	if l:fname ==# ''
		let l:fname .= '[ NoName ]'
	endif

	let l:label = l:no . l:mod . l:sp . l:fname
	return '%' . a:n . 'T' . l:hi . l:label . '%T%#TabLineFill#'
endfunction "}}}
function! WithDelimitterTabLine() "{{{
	let l:titles     = map(range(1, tabpagenr('$')), 's:tabpage_label(v:val)')
	let l:delimitter = ' | '
	let l:tabpages   = l:delimitter . join(l:titles, l:delimitter) . l:delimitter . '%#TabLineFill#%T'
	return l:tabpages
endfunction "}}}
set tabline=%!WithDelimitterTabLine() showtabline=2

" Turn off highlight
nohlsearch

"}}}


"-------------------------"
"     Action_Setting      "
"-------------------------"
"{{{

" Backspace can delete it
set backspace=indent,eol,start

" No auto Carriage Return and Set tab style
set textwidth=0 tabstop=4 shiftwidth=4

" C type auto indent on
set autoindent cindent

" Don't jump bottom to top and top to bottom when searching
set nowrapscan

" Fold Text with foldmarker and fold sets
set foldmethod=marker
set foldtext=FoldCCtext()
set foldcolumn=1
let &fillchars = 'vert:|,fold: '
set foldopen=search,jump,mark,percent,insert,tag,undo
set foldclose=all

" Collection Swap File
let &directory = s:directory

" Save View Position when execute ':mkview'
let &viewdir = s:viewdir

" Hold Undo Archive when file closed
set undofile
let &undodir = s:undodir

" Bell Sound is instead of Screen flash.
set visualbell

" Disable Auto Commentalize New Line
set formatoptions-=ro

" Ignore case on NormalMode searching and InsertMode completion
set ignorecase noinfercase

" No timeout key maps
set notimeout

" Do not set file name order priority on c-mode completion
set suffixes=


" Do foldopen all when visual_mode cursor_move
augroup KeyEvent
	" s:visual_fold_all() "{{{

	let s:visual_fold_toggle = get(s:, 'visual_fold_toggle', 0)

	function! s:visual_fold_all()
		if mode() =~# "^[vV\<C-v>]"
			if !s:visual_fold_toggle && &foldenable
				set nofoldenable
				execute 'normal! zz'
				let s:visual_fold_toggle = 1
			endif
		else
			if s:visual_fold_toggle
				set foldenable
				execute 'normal! zz'
				let s:visual_fold_toggle = 0
			endif
		endif
	endfunction

	"}}}
	autocmd CursorMoved * call s:visual_fold_all()
augroup END

"}}}


"-------------------------"
"     Inner_Setting       "
"-------------------------"
"{{{


" Default File Encoding
set fileencoding=utf-8 encoding=utf-8

" Auto Judge file encode
set fileencodings=utf-8,sjis,euc-jp,cp932,ucs-bom,iso-2022-jp-3,iso-2022-jp,eucjp-ms,euc-jisx0213,ucs-bom,latin1,default

" Leaving a history and it limit is a 500 pieces
set history=500

" Adding Runtime Path
set runtimepath+=~/.vim/vimball

" Set Vimball Install place
let g:vimball_home = s:vim_home . '/vimball'

" Display Command Complement
set wildmenu

" Path Delimiter is Slash
set shellslash

" Add Match Pairs
set matchpairs+=<:>

" Load Target for ctags
set tags=./tags,~/tags

" Explore wake up default dir
set browsedir=buffer

" Set spell lang
set spelllang=en_US

" Set reference path, using by :find, gf and more
set path=.,,./**

"@Experiment('commented out')
" Manually generate my help tags
"if isdirectory(expand('~/.vim/doc'))
"	helptags ~/.vim/doc
"endif

"}}}


"-------------------------"
"      Event_Method       "
"-------------------------"
"{{{

" Save Cursor Position when file closed
augroup FileEvent
	function! s:visit_past_position() "{{{
		let l:past_posit = line("'\"")

		if l:past_posit > 0 && l:past_posit <= line('$')
			execute 'normal! g`"'
		endif
	endfunction "}}}
	autocmd BufReadPost * call <SID>visit_past_position()
augroup END


augroup FileEvent
	" If you using wim command prompt, listchars using safe chars
	autocmd VimEnter,WinEnter,BufWinEnter,BufRead,EncodingChanged *
		\	if &encoding == 'utf-8' && !s:is_doswin
		\|		let &listchars = 'tab:»_,trail:_,extends:»,precedes:«,nbsp:%,eol:↲'
		\|	else
		\|		let &listchars = 'tab:>_,trail:_,extends:>,precedes:<,nbsp:%'
		\|	endif
augroup END

augroup KeyEvent
	"autocmd UserGettingBored * echo 'Fight!!'
augroup END

"}}}


"-------------------------"
"      Command_Util       "
"-------------------------"
" For Override {{{

call altercmd#load()

" buffer open commands with filetype 'none'
command! -bang NewOverridden new<bang> | setf none
AlterCommand new NewOverridden

command! -bang VnewOverridden vnew<bang> | setf none
AlterCommand vnew VnewOverridden

command! -bang EnewOverridden enew<bang> | setf none
AlterCommand enew EnewOverridden

command! -bang TabnewOverridden tabnew<bang> | setf none
AlterCommand tabnew TabnewOverridden

" }}}
" Usefull {{{

" Grep and Open current buffer
command! -nargs=1 GrepNow vimgrep <args> % | cwindow


" Save a Temporary Directory
" {{{

"@Marked('Changed "FileType *" to "BufNew *"')
autocmd FileEvent BufNew * let b:tdir_dir = get(b:, 'tdir_dir', 'Not set tdir')

command! TDirPwd           echo b:tdir_dir

function! s:set_temporary_dir(path) "{{{
	if isdirectory(a:path)
		let b:tdir_dir = a:path ==# '.' ? expand('%:p:h')
		\                               : a:path
		echo b:tdir_dir
	else
		call s:echo_error('No such temporary root dir')
	endif
endfunction "}}}
command! -nargs=1  TDirSet call s:set_temporary_dir(<q-args>)

command! TDirSetCurrentDir call s:set_temporary_dir('.')

function! s:cd_temporary_dir() "{{{
	if b:tdir_dir ==# 'Not set tdir'
		call s:echo_error('Not set temporary root dir')
	else
		execute 'cd' b:tdir_dir
		echo b:tdir_dir
	endif
endfunction "}}}
command! TDirCd            call s:cd_temporary_dir()

" }}}


" Revese Lines
function! s:reverse_line() range " {{{
	if a:firstline is a:lastline
		return
	endif

	let l:lines = []
	let l:posit = getpos('.')

	let l:z = @z
	for l:line in range(a:firstline, a:lastline)
		execute 'normal! "zdd'
		call add(l:lines, @z)
	endfor

	for l:r in l:lines
		let @z = l:r
		execute 'normal! "zP'
	endfor
	let @z = l:z

	call setpos('.', l:posit)
endfunction " }}}
command! -range=% ReverseLine :<line1>, <line2> call s:reverse_line()


" Catenate and echo files
function! s:cat_file(...) "{{{
	let l:catenate = ''

	for l:filePath in a:000
		let l:catenate .= join(readfile(l:filePath), "\n")
	endfor

	echo l:catenate
endfunction "}}}
command! -nargs=* -complete=file Cat call s:cat_file(<f-args>)


" Low accuracy randome integer
function! s:random_int(max) "{{{
	let l:max = a:max isnot# '' ? a:max : 65535

	let l:matchEnd = matchend(reltimestr(reltime()), '\d\+\.') + 1
	return reltimestr(reltime())[l:matchEnd :] % (l:max + 1)
endfunction "}}}
command! -nargs=? PutRandom execute 'normal! a' . s:random_int(<q-args>)


"@See('http://leafcage.hateblo.jp/entry/2013/08/02/001600')
" Time Watcher
command! TimerStart let  s:startTime = reltime()
command! TimerEcho  echo reltimestr( reltime(s:startTime) )
command! TimerPut   execute 'normal! o' . reltimestr(reltime(s:startTime))


" Rename current buffer file
function! s:rename_to(to_file) "{{{
	let l:this_file    = expand('%:t')
	let l:editing_file = &modified

	if l:editing_file
		echoerr 'Please :write this file'
		return
	endif

	let l:failed = rename(l:this_file, a:to_file)
	if l:failed
		echoerr printf('Rename %s to %s is failed', l:this_file, a:to_file)
		return
	endif

	let l:bufnr = bufnr('%')
	execute ':edit' a:to_file
	execute ':' . l:bufnr . 'bdelete'

	echo printf('Renamed %s to %s', l:this_file, a:to_file)
endfunction "}}}
command! -nargs=1 Rename call <SID>rename_to(<q-args>)

"}}}
" Life Helper {{{


" Vim Utils {{{

command! VimConfig e $MYVIMRC

command! VimConfigTab tabnew $MYVIMRC

command! Reload so $MYVIMRC
	\|	if has('gui_running')
	\|		so $MYGVIMRC
	\|	endif

command! ForceSave w !sudo tee > /dev/null %

command! CdBufDir cd %:p:h

command! ColorPreview Unite colorscheme -auto-preview

" }}}
" Twitter {{{

"Note: if ask more, add hooks
"    (let g:vimrc.private['twitter']['curr_ac'] = ~~)
"    on tweetvim's TweetVimSwitchAccount command.

"-- Basic --"
command! Twitter            TweetVimHomeTimeline
command! TwitterTab         tabnew | Twitter
command! Tweet              TweetVimSay


"-- Private Account --"
function! TwitterPrivateFunc() "{{{
	if !exists('g:vimrc.private["twitter"]["priv_ac"]')
		call s:echo_error('Not set env variable => g:vimrc.private["twitter"]["priv_ac"]')
		return
	endif

	execute ':TweetVimSwitchAccount' g:vimrc.private['twitter']['priv_ac']
	let g:vimrc.private['twitter']['curr_ac'] = g:vimrc.private['twitter']['priv_ac']

	execute ':TweetVimHomeTimeline'
endfunction "}}}
command! TwitterPrivate     call TwitterPrivateFunc()
command! TwitterPrivateTab  tabnew | TwitterPrivate
function! TweetPrivateFunc() "{{{
	if !exists('g:vimrc.private["twitter"]["priv_ac"]')
		call s:echo_error('Not set env variable => g:vimrc.private["twitter"]["priv_ac"]')
		return
	endif

	execute ':TweetVimSwitchAccount' g:vimrc.private['twitter']['priv_ac']
	execute ':TweetVimSay'

	"@Incompleted('wait sync here')
	"execute ':TweetVimSwitchAccount' g:vimrc.private['twitter']['curr_ac']
endfunction "}}}
command! TweetPrivate       call TweetPrivateFunc()


"-- Public Account --"
function! TwitterPublicFunc() "{{{
	if !exists("g:vimrc.private['twitter']['publ_ac']")
		call s:echo_error("Not set env variable => g:vimrc.private['twitter']['publ_ac']")
		return
	endif

	execute ':TweetVimSwitchAccount ' g:vimrc.private['twitter']['publ_ac']
	let g:vimrc.private['twitter']['curr_ac'] = g:vimrc.private['twitter']['publ_ac']

	execute ':TweetVimHomeTimeline'
endfunction "}}}
command! TwitterPublic      call TwitterPublicFunc()
command! TwitterPublicTab   tabnew | TwitterPublic
function! TweetPublicFunc() "{{{
	if !exists('g:vimrc.private["twitter"]["publ_ac"]')
		call s:echo_error('Not set env variable => g:vimrc.private["twitter"]["publ_ac"]')
		return
	endif

	execute ':TweetVimSwitchAccount ' g:vimrc.private['twitter']['publ_ac']
	execute ':TweetVimSay'

	"@Incompleted('wait here')
	"execute ':TweetVimSwitchAccount ' g:vimrc.private['twitter']['curr_ac']
endfunction "}}}
command! TweetPublic        call TweetPublicFunc()


command!  Bitly TweetVimBitly
cnoreabbr tvs   TweetVimSwitchAccount

" }}}


" To Service Name
cnoreabbr Lingr J6uil
command!  Lingr <NOP>


" Beautifull Life
command!  JazzUpdate JazzradioUpdateChannels
command!  JazzList   Unite jazzradio
cnoreabbr JazzPlay   JazzradioPlay
command!  JazzPlay   <NOP>
command!  JazzStop   JazzradioStop


" Translates Languages
cnoreabbr Translate ExciteTranslate
cnoreabbr Weblio    Ref webdict weblio

command!  Translate <NOP>
command!  Weblio    <NOP>

" }}}
" Development {{{

" Open Develop Buffer {{{

" vimconsole.vim
cnoreabbr Log      VimConsoleLog
cnoreabbr LogClear VimConsoleClear
cnoreabbr LogOpen  VimConsoleOpen

command!  Log      <NOP>
command!  LogClear <NOP>
command!  LogOpen  <NOP>


" GHCi
cnoreabbr RunGhc   !runghc %
cnoreabbr Ghci     VimShellInteractive ghci
cnoreabbr Sghci    VimShellInteractive --split='sp' ghci
cnoreabbr Vghci    VimShellInteractive --split='vsp' ghci
cnoreabbr GhciTab  VimShellInteractive --split='tabnew' ghci
cnoreabbr Hoogle   Ref hoogle

command!  RunGhc   <NOP>
command!  Ghci     <NOP>
command!  Sghci    <NOP>
command!  Vghci    <NOP>
command!  GhciTab  <NOP>
command!  Hoogle   <NOP>


" js
cnoreabbr Js       VimShellInteractive js
cnoreabbr Sjs      VimShellInteractive --split='sp' js
cnoreabbr Vjs      VimShellInteractive --split='vsp' js
cnoreabbr JsTab    VimShellInteractive --split='tabnew' js

command!  Js       <NOP>
command!  Sjs      <NOP>
command!  Vjs      <NOP>
command!  JsTab    <NOP>


" irb
cnoreabbr Irb      VimShellInteractive irb
cnoreabbr Sirb     VimShellInteractive --split='sp' irb
cnoreabbr Virb     VimShellInteractive --split='vsp' irb
cnoreabbr IrbTab   VimShellInteractive --split='tabnew' irb

command!  Irb      <NOP>
command!  Sirb     <NOP>
command!  Virb     <NOP>
command!  IrbTab   <NOP>

" }}}
" Run Program  {{{

"@Incompleted('does not removed another temporary class')
" If you cannot use QuickRun or want to use IO, you can use this.
function! s:java_run_func() "{{{
	let l:javaname = expand('%:t:r')
	let l:javav = s:system('java -version')

	if l:javav =~# '1.8'
		let l:command = ['javac -source 1.8 -encoding utf8', 'java']
	elseif l:javav =~# '1.7'
		let l:command = ['javac -source 1.7 -encoding utf8', 'java']
	else
		let l:command = ['javac -encoding utf8', 'java']
	endif

	if s:is_cygwin
		if executable('cocot')
			let l:command[0] = 'cocot ' . l:command[0]
			let l:command[1] = 'cocot ' . l:command[1]
		else
			call s:echo_error('You must be get [cocot] command.')
			return
		endif
	endif

	execute ':!' .
	\	printf('%s %s.java',   l:command[0], l:javaname) . ';' .
	\	printf('%s %s',        l:command[1], l:javaname) . ';'

	call delete(l:javaname . '.class')
endfunction "}}}
command! RunJava call s:java_run_func()


" Same as RunJava for Ruby
cnoreabbr RunRuby !ruby %
command!  RunRuby <NOP>

"  }}}

" }}}


"-------------------------"
"       Key_Mapping       "
"-------------------------"
" Disables {{{

augroup KeyMapping
	" I can use some mapping to hoge<C-c>
	autocmd FileType * nnoremap <C-c>      <NOP>
	autocmd FileType * nnoremap <C-c><C-c> <C-c>

	autocmd FileType * nnoremap <Up>    <NOP>
	autocmd FileType * nnoremap <Down>  <NOP>
	autocmd FileType * nnoremap <Left>  <NOP>
	autocmd FileType * nnoremap <Right> <NOP>

	autocmd FileType * inoremap <Up>    <NOP>
	autocmd FileType * inoremap <Down>  <NOP>
	autocmd FileType * inoremap <Left>  <NOP>
	autocmd FileType * inoremap <Right> <NOP>

	autocmd FileType * cnoremap <Left>  <NOP>
	autocmd FileType * cnoremap <Right> <NOP>

	autocmd FileType * cnoremap [Left] <Left>
augroup END

" }}}
" Bashnize Command Mode {{{

augroup KeyMapping
	autocmd FileType * nmap     <C-j> <CR>
	autocmd FileType * imap     <C-j> <CR>

	autocmd FileType * cnoremap <C-b>      <Left>
	autocmd FileType * cnoremap <C-f>      <Right>
	autocmd FileType * cnoremap <C-a>      <Home>
	autocmd FileType * cnoremap <C-h>      <BS>
	autocmd FileType * cnoremap <C-d>      <Del>
	autocmd FileType * cnoremap <C-e>      <End>
	autocmd FileType * cnoremap <C-k><C-k> <C-\>e getcmdpos() < 2 ? '' : getcmdline()[:getcmdpos()-2]<CR>
augroup END

" }}}
" Global KeyMaps {{{

" Prepare temporary functions {{{

" Compress continuous space
function! s:compress_spaces() "{{{
	let l:recent_pattern = @/

	try
		execute ':substitute/\s\s\+/ /g'
		execute 'normal! =='
	catch
	finally
		let @/ = l:recent_pattern
	endtry

	nohlsearch
endfunction "}}}


" Move cursor to topmost of this indent
function! s:cursor_up_to_lid() "{{{
	let l:first_line = 1

	while 1
		let l:p = getcurpos()[2]
		execute 'normal! k'

		let l:indent_changed = l:p isnot getcurpos()[2]

		if l:indent_changed || line('.') is l:first_line
			if l:indent_changed
				execute 'normal! j'
			endif

			break
		endif
	endwhile
endfunction "}}}


" Easily putting short separator for many filetypes
" function! s:put_short_separator(put_upper) {{{

augroup FileEvent
	autocmd FileType,WinEnter,BufWinEnter * let s:long_separator =
	\	&ft =~# '\v(vim|vimspec)'    ? '"#-=- -=- -=- -=- -=- -=- -=- -=- -=-#"'
	\:	&ft =~# '\v(java|cs|cpp|c)'  ? '/* ---===---===---===---===---===---===--- */'
	\:	&ft ==# 'haskell'            ? '-- - - - - - - - - - - - - - - - --'
	\:	&ft ==# 'coq'                ? '(* - - - - - - - - - - - - - - - *)'
	\:	&ft ==# 'mysql'              ? '-- - - - - - - - - - - - - - - - --'
	\:	&ft =~# '\v(markdown|eruby)' ? '<!-- - - - - - - - - - - - - - - - -->'
	\:	&ft =~# '\v(ruby|sh)'        ? '#- - - - - - - - - - - - - - - - -#'
	\:	&ft =~# '\v(text|none)'      ? '- - - - - - - - - - - - - - - - - - - -'
	\                                : 'long_separator_undefined'
augroup END


function! s:put_long_separator(put_upper)
	execute 'normal!' (a:put_upper ? 'O' : 'o')
	execute 'normal! 0D'
	execute 'normal! i' s:long_separator
	execute 'normal! =='
endfunction

"}}}


" Easily putting long separator for many filetypes
" function! s:put_short_separator(put_upper) {{{

augroup FileEvent
	autocmd FileType,WinEnter,BufWinEnter * let s:short_sparator =
	\	&ft =~# '\v(vim|vimspec)'    ? '"#--- --- ---#"'
	\:	&ft =~# '\v(java|cs|cpp|c)'  ? '/* -=-=-=-=-=-=-=-=- */'
	\:	&ft ==# 'haskell'            ? '-- - - - - - --'
	\:	&ft ==# 'coq'                ? '(* - - - - - *)'
	\:	&ft ==# 'mysql'              ? '-- - - - - - --'
	\:	&ft =~# '\v(markdown|eruby)' ? '<!-- - - - - - -->'
	\:	&ft =~# '\v(ruby|sh)'        ? '#- - - - - - -#'
	\:	&ft =~# '\v(text|none)'      ? '- - - - - - - - - -'
	\                                : 'short_separator_undefined'
augroup END


function! s:put_short_separator(put_upper)
	execute 'normal!' (a:put_upper ? 'O' : 'o')
	execute 'normal! 0D'
	execute 'normal! i' s:short_sparator
	execute 'normal! =='
endfunction

" }}}


" Move cursor to bottommost of this indent
function! s:cursor_down_to_ground() "{{{
	let l:last_line = line('$')

	while 1
		let l:p = getcurpos()[2]
		execute 'normal! j'

		let l:indent_changed = l:p isnot getcurpos()[2]

		if l:indent_changed || line('.') is l:last_line
			if l:indent_changed
				execute 'normal! k'
			endif

			break
		endif
	endwhile
endfunction "}}}


" Optimize key operation to one hand
" function! s:toggle_onehand_mode() "{{{

let s:onehand_enabled = get(s:, 'onehand_enabled', 0)

function! s:toggle_onehand_mode()
	if s:onehand_enabled
		nunmap n
		nunmap p
		nunmap f
		nunmap b
		nunmap o
		nunmap i
		nunmap u

		" doautocmd for normally keymappings
		let &filetype = &filetype
	else
		nnoremap n gt
		nnoremap p gT
		nnoremap f <C-f>
		nnoremap b <C-b>
		nnoremap o <C-o>
		nnoremap i <C-i>
		nnoremap u <C-w><C-w>
	endif

	let s:onehand_enabled = !s:onehand_enabled
	echo (s:onehand_enabled ? '' : 'no') . 'onehand'
endfunction

"}}}


" If you has nofile buffer, close it.
"@Marked('maybe this was not does purported function')
function! s:bufclose_filetype(ft) "{{{
	for l:w in range(1, winnr('$'))
		let l:buf_ft = getwinvar(l:w, '&ft')

		if l:buf_ft ==# a:ft
			execute ':' . l:w . 'wincmd w'
			execute ':quit'

			break
		endif
	endfor
endfunction "}}}

" }}}
" Override mapping {{{

augroup KeyMapping
	" † Rebirth Of The Neo Ex
	autocmd FileType * nnoremap Q gQ
	autocmd FileType * nnoremap <C-n> gt
	autocmd FileType * nnoremap <C-p> gT

	autocmd FileType * inoremap <C-l> <Esc>
	autocmd FileType * vnoremap <C-l> <Esc>
	autocmd FileType * cnoremap <C-l> <Esc>
augroup END

" }}}
" Appends " {{{

augroup KeyMapping
	autocmd FileType * nnoremap <C-m> o<Esc>

	autocmd FileType * nnoremap <silent> m: :<C-u>marks<CR>
	autocmd FileType * nnoremap <silent> q: :<C-u>register<CR>
	autocmd FileType * nnoremap <silent> z: :<C-u>tabs<CR>
	autocmd FileType * nnoremap <silent> g: :<C-u>buffers<CR>
	autocmd FileType * nnoremap <silent> g> :<C-u>messages<CR>

	autocmd FileType * nnoremap <silent> <leader>b         :<C-u>NewOverridden<CR>:resize 5<CR>:setl buftype=nofile<CR>
	autocmd FileType * nnoremap <silent> <leader>B         :<C-u>NewOverridden<CR>:resize 5<CR>
	autocmd FileType * nnoremap <silent> <leader>ps        :<C-u>call <SID>put_short_separator(0)<CR>
	autocmd FileType * nnoremap <silent> <leader>Ps        :<C-u>call <SID>put_short_separator(1)<CR>
	autocmd FileType * nnoremap <silent> <leader>pl        :<C-u>call <SID>put_long_separator(0)<CR>
	autocmd FileType * nnoremap <silent> <leader>Pl        :<C-u>call <SID>put_long_separator(1)<CR>
	autocmd FileType * nnoremap <silent> <leader>pd        :<C-u>execute 'normal! a' . strftime('%c')<CR>
	autocmd FileType * nnoremap <silent> <leader><leader>h :<C-u>helpclose<CR>
	autocmd FileType * nnoremap <silent> <Space><Space>    :<C-u>call <SID>compress_spaces()<CR>
	autocmd FileType * nnoremap <silent> <leader>k         :<C-u>call <SID>cursor_up_to_lid()<CR>
	autocmd FileType * nnoremap <silent> <leader>j         :<C-u>call <SID>cursor_down_to_ground()<CR>

	autocmd FileType * nnoremap <silent> <C-k><C-r> :<C-u>Reload<CR>
	autocmd FileType * nnoremap <silent> <C-k><C-l> :<C-u>nohlsearch<CR>
	autocmd FileType * nnoremap <silent> <C-k><C-j> :<C-u>write<CR>
	autocmd FileType * nnoremap <silent> <C-k>J     :<C-u>wall<CR>
	" doautocmd for Events [FileType *]
	autocmd FileType * nnoremap <silent> <C-k>r     :<C-u>let &filetype = &filetype<CR>
	autocmd FileType * nnoremap <silent> <C-k>l     :<C-u>source %<CR>


	autocmd FileType * inoremap <silent> <C-k><C-j> <Esc>:write<CR>
	autocmd FileType * inoremap <silent> <C-k>J     <Esc>:wall<CR>

	autocmd FileType * inoremap <C-k><C-k> <C-o>"_d$
	autocmd FileType * inoremap <C-k><C-y> <Esc>k"zyyjV"zp:let @z = ''<CR>A


	"autocmd FileType * vnoremap <silent> [k :<C-u>call <SID>cursor_up_to_lid()<CR>
	"autocmd FileType * vnoremap <silent> ]k :<C-u>call <SID>cursor_up_to_lid()<CR>
	"autocmd FileType * vnoremap <silent> [j :<C-u>call <SID>cursor_down_to_ground()<CR>
	"autocmd FileType * vnoremap <silent> ]j :<C-u>call <SID>cursor_down_to_ground()<CR>


	autocmd FileType * cnoremap <C-k><C-p> <Up>
	autocmd FileType * cnoremap <C-k><C-n> <Down>
	autocmd FileType * cnoremap <C-]>      '<,'>
augroup END

" }}}
" Foldings {{{

augroup KeyMapping
	autocmd FileType * nnoremap <expr> h foldclosed('.') > -1 ? 'zo' : 'h'
	autocmd FileType * nnoremap <expr> l foldclosed('.') > -1 ? 'zo' : 'l'

	autocmd FileType * nnoremap zj zjzo
	autocmd FileType * nnoremap zk zkzo
	autocmd FileType * nnoremap z< V$%zf
augroup END

" }}}
" Windows and Buffers {{{

augroup KeyMapping
	autocmd FileType * nnoremap <Space>h <C-w>h
	autocmd FileType * nnoremap <Space>j <C-w>j
	autocmd FileType * nnoremap <Space>k <C-w>k
	autocmd FileType * nnoremap <Space>l <C-w>l

	autocmd FileType * nnoremap <silent> <C-w>t :<C-u>TabnewOverridden<CR>
	autocmd FileType * nnoremap <silent> <C-w>T :<C-u>tabclose<CR>
	autocmd FileType * nnoremap <silent> <C-w>c :<C-u>bdelete<CR>
	autocmd FileType * nnoremap <silent> <C-w>C :<C-u>bdelete!<CR>
	autocmd FileType * nnoremap <silent> <C-w>N :<C-u>EnewOverridden!<CR>
	autocmd FileType * nnoremap <silent> <C-w>Q :<C-u>quitall<CR>
	autocmd FileType * nnoremap <silent> <C-w>" :<C-u>resize 5<CR>

	autocmd FileType * nnoremap <silent><expr> <C-w>bt 'mZ:tabnew<CR>`Zzz'       . (foldlevel('.') > 0 ? 'zo' : '')
	autocmd FileType * nnoremap <silent><expr> <C-w>bT 'mZ<C-w>c:tabnew<CR>`Zzz' . (foldlevel('.') > 0 ? 'zo' : '')
augroup END

" }}}
" Toggle options {{{

augroup KeyMapping
	autocmd FileType * nnoremap <silent><expr> <C-h><C-d> (&diff ? ':diffoff' : ':diffthis') . '\|set diff?<CR>'
	autocmd FileType * nnoremap <silent><expr> <C-h><C-v> ':setl virtualedit=' . (&virtualedit ==# '' ? 'all' : '') . ' virtualedit?<CR>'

	autocmd FileType * nnoremap <silent> <C-h><C-w> :<C-u>setl wrap!           wrap?          <CR>
	autocmd FileType * nnoremap <silent> <C-h><C-c> :<C-u>setl cursorline!     cursorline?    <CR>
	autocmd FileType * nnoremap <silent> <C-h><C-e> :<C-u>setl expandtab!      expandtab?     <CR>
	autocmd FileType * nnoremap <silent> <C-h><C-r> :<C-u>setl relativenumber! relativenumber?<CR>
	autocmd FileType * nnoremap <silent> <C-h><C-l> :<C-u>setl list!           list?          <CR>
	autocmd FileType * nnoremap <silent> <C-h><C-n> :<C-u>setl number!         number?        <CR>
	autocmd FileType * nnoremap <silent> <C-h><C-s> :<C-u>setl wrapscan!       wrapscan?      <CR>
	autocmd FileType * nnoremap <silent> <C-h>jk    :<C-u>call <SID>toggle_onehand_mode()<CR>

	autocmd FileType * inoremap <silent> <C-k><C-e> <C-o>:setl expandtab! expandtab?<CR>
augroup END

" }}}
" for Plugins {{{

augroup KeyMapping
	" netrw
	autocmd FileType * nnoremap <silent> <leader>e         :<C-u>Vexplore<CR>
	autocmd FileType * nnoremap <silent> <leader><leader>e :<C-u>Sexplore<CR>
	autocmd FileType * nnoremap <silent> <leader>E         :<C-u>Explore<CR>
	autocmd FileType * nnoremap <silent> <leader><leader>E :<C-u>Texplore<CR>


	" open-browser.vim
	autocmd FileType * nmap <leader>w <Plug>(openbrowser-open)


	" vim-quickrun
	autocmd FileType * nnoremap <silent> <leader><leader>r :<C-u>call <SID>bufclose_filetype('quickrun')<CR>


	" vimshell
	autocmd FileType * nnoremap <silent> <leader>v         :<C-u>VimShell -split-command=vsp -toggle<CR>
	autocmd FileType * nnoremap <silent> <leader><leader>v :<C-u>VimShell -split-command=sp  -toggle<CR>
	autocmd FileType * nnoremap <silent> <leader>V         :<C-u>VimShellBufferDir -create<CR>
	autocmd FileType * nnoremap <silent> <leader><leader>V :<C-u>VimShell -split-command=tabnew -create<CR>


	" Unite
	autocmd FileType * nnoremap <silent> <leader>uf        :<C-u>Unite -ignorecase -start-insert outline:foldings<CR>
	autocmd FileType * nnoremap <silent> <leader>um        :<C-u>Unite -ignorecase neomru/file<CR>
	autocmd FileType * nnoremap <silent> <leader><leader>u :<C-u>call <SID>bufclose_filetype('unite')<CR>


	" excitetranslate-vim
	autocmd FileType * nnoremap <silent> <leader>t :<C-u>ExciteTranslate<CR>


	" vim-over
	autocmd FileType * nnoremap <silent>       :%s/       :<C-u>OverCommandLine<CR>%s/
	autocmd FileType * nnoremap <silent>       :s/        :<C-u>OverCommandLine<CR>s/
	autocmd FileType * nnoremap <silent><expr> <C-k><C-s> ':OverCommandLine<CR>%s/\<' . expand('<cword>') . '\>/'
	autocmd FileType * nnoremap <silent><expr> <C-k>S     ':OverCommandLine<CR>%s/\<' . expand('<cword>') . '\>/' . expand('<cword>')
	autocmd FileType * vnoremap <silent>       :s/        :<C-u>OverCommandLine<CR>'<,'>s/
	autocmd FileType * OverCommandLineNoremap  <C-l>      <Esc>


	" anzu-chan
	autocmd FileType * nmap n      <Plug>(anzu-n-with-echo)zv
	autocmd FileType * nmap N      <Plug>(anzu-N-with-echo)zv
	autocmd FileType * nmap *      <Plug>(anzu-star-with-echo)zv
	autocmd FileType * nmap #      <Plug>(anzu-sharp-with-echo)zv
	autocmd FileType * nmap <C-w>* <C-w>v<Plug>(anzu-star-with-echo)zv
	autocmd FileType * nmap <C-w># <C-w>v<Plug>(anzu-sharp-with-echo)zv


	" incsearch.vim
	autocmd FileType * nmap <expr>      /                 foldclosed('.') > -1 ? 'zv<Plug>(incsearch-forward)'  : '<Plug>(incsearch-forward)'
	autocmd FileType * nmap <silent>    <leader>/         /\m\C
	autocmd FileType * nmap <silent>    <leader><leader>/ /\m\C\<\>[Left][Left]
	autocmd FileType * nmap             g/                /\<<C-r>"\><CR>
	autocmd FileType * nmap <expr>      ?                 foldclosed('.') > -1 ? 'zv<Plug>(incsearch-backward)' : '<Plug>(incsearch-backward)'
	autocmd FileType * nmap <silent>    <leader>?         ?\m\C
	autocmd FileType * nmap <silent>    <leader><leader>? ?\m\C\<\>[Left][Left]
	autocmd FileType * nmap             g?                ?\<<C-r>"\><CR>
	autocmd FileType * IncSearchNoreMap <C-j> <CR>
	autocmd FileType * IncSearchNoreMap <C-b> <Left>
	autocmd FileType * IncSearchNoreMap <C-f> <Right>
	autocmd FileType * IncSearchNoreMap <C-a> <Home>
	autocmd FileType * IncSearchNoreMap <C-h> <BS>
	autocmd FileType * IncSearchNoreMap <C-d> <Del>
	autocmd FileType * IncSearchNoreMap <C-e> <End>
	autocmd FileType * IncSearchNoreMap <C-l> <Esc>


	" TaskList.vim
	autocmd FileType * nmap <leader>T <Plug>TaskListToggle


	" undotree
	autocmd FileType * nnoremap <leader>U :<C-u>UndotreeToggle<CR>


	" neosnippet.vim
	autocmd FileType * imap <expr> <C-s> neosnippet#expandable() ? '<Plug>(neosnippet_expand)' : '<Plug>(neosnippet_jump)'
	autocmd FileType * smap <expr> <C-s> neosnippet#expandable() ? '<Plug>(neosnippet_expand)' : '<Plug>(neosnippet_jump)'
augroup END

" }}}

" }}}
" Buffer Local KeyMaps {{{

augroup PluginPrefs
	autocmd FileType int-* nnoremap <buffer> q          <NOP>
	autocmd FileType int-* nnoremap <buffer> <C-n>      gt
	autocmd FileType int-* nnoremap <buffer> <C-p>      gT
	autocmd FileType int-* nnoremap <buffer> <C-l>      <NOP>

	autocmd FileType int-* nmap     <buffer> <C-]>      <Plug>(vimshell_int_clear)
	autocmd FileType int-* nmap     <buffer> Q          <Plug>(vimshell_int_exit)
	autocmd FileType int-* nmap     <buffer> gj         <Plug>(vimshell_int_next_prompt)
	autocmd FileType int-* nmap     <buffer> gk         <Plug>(vimshell_int_previous_prompt)

	autocmd FileType int-* inoremap <buffer> <C-l>      <Esc>
	autocmd FileType int-* inoremap <buffer> <C-b>      <Left>
	autocmd FileType int-* inoremap <buffer> <C-f>      <Right>
	autocmd FileType int-* inoremap <buffer> <C-e>      <End>
	autocmd FileType int-* inoremap <buffer> <C-d>      <Del>

	autocmd FileType int-* imap     <buffer> <C-n>      <C-o><Plug>(vimshell_int_next_prompt)<End>
	autocmd FileType int-* imap     <buffer> <C-p>      <C-o><Plug>(vimshell_int_previous_prompt)<End>
	autocmd FileType int-* imap     <buffer> <C-]>      <C-o><Plug>(vimshell_int_clear)
	autocmd FileType int-* imap     <buffer> <CR>       <Plug>(vimshell_int_execute_line)
	autocmd FileType int-* imap     <buffer> <C-k><C-p> <Plug>(vimshell_int_history_unite)


	autocmd FileType ref-* nnoremap <silent><buffer> Q :<C-u>quit<CR>
augroup END

" }}}


"-------------------------"
"        File_Type        "
"-------------------------"
"{{{

" Call matchadd when that file is target filetype
function! s:matchadd_with_filetype(ft, tag, regex, priority, id) "{{{
	if &filetype == a:ft
		try
			let l:id = matchadd(a:tag, a:regex, a:priority, a:id)
		catch /\vE(799|801)/
			" Suppress repeate add
			let l:id = a:id
		endtry
	else
		try
			call matchdelete(a:id)
		catch /\vE(802|803)/
			" Suppress repeate delete
		endtry

		let l:id = a:id
	endif

	return l:id
endfunction "}}}


" If buffer does not has filetype, set filetype 'none'
augroup ExtensionType
	autocmd VimEnter,BufNew * if &ft ==# '' | setf none | endif
augroup END


augroup FileEvent
	" -- Vi Improved --
	autocmd VimEnter,ColorScheme * highlight rcMyHint cterm=standout ctermfg=DarkYellow
	autocmd BufWinEnter          * let s:rcMyHint = s:matchadd_with_filetype('vim', 'rcMyHint', '\s*"\zs@\w\+(.*)\ze', 10, get(s:, 'rcMyHint', 10001))

	" Haskell
	autocmd VimEnter,ColorScheme * highlight rcHeadSpace cterm=underline ctermfg=DarkGray
	autocmd BufWinEnter          * let s:rcHeadSpace = s:matchadd_with_filetype('haskell', 'rcHeadSpace', '^\s\+', 10, get(s:, 'rcHeadSpace', 10002))

	" C-Sharp
	autocmd VimEnter,ColorScheme * highlight default link RcTypeInference Identifier
	autocmd VimEnter,WinEnter    *.cs syntax keyword RcTypeInference var dynamic
augroup END


" For Plugin Types
augroup FileEvent
	"@Incomplete('do not functioned')
	"@Incomplete('do not functioned as exchanger')
	" netrw
	autocmd FileType netrw highlight default link CursorLine Visual
augroup END

"}}}


"-------------------------"
"    Environment_Pref     "
"-------------------------"
"{{{

if filereadable(expand('~/.vimrc_env'))
	source ~/.vimrc_env
endif

"}}}


filetype plugin indent on
syntax enable
let g:vimrc['loaded'] = 1