LoginSignup
276
276

めんどくせーからvimrcそのまま晒す

Last updated at Posted at 2013-09-23
" vim: set ff=unix tabstop=4 shiftwidth=0 softtabstop=-1 noexpandtab fileencoding=utf-8 fileformat=unix filetype=vim foldmethod=marker :
" https://gist.github.com/kotashiratsuka/eac44d7e569f3721be5a12b8c221cab6

" 基本コンセプト
" * scp1ファイルで環境移行済ます
" * mac/win/linux/ios環境依存しない、エラーが出ない
" * 自分以外の人が触っても混乱しないようにする(rootで複数人が使う場合などに配慮)
" * プラグインは極力使わない、プラグインは補助輪と割り切る、どうせ数年立ったら使わなくなる
" * プラグイン強化するくらいならその分vimの標準操作を速くできるように頭と指を鍛える
" * tips混じってるけど気にしない

"{{{ 基本設定

"ファイルタイプに応じて挙動,色を変える
syntax on
filetype plugin on
filetype indent on

"VIM互換にしない
set nocompatible

"複数ファイルの編集を可能にする
set hidden

"タイトルをバッファ名に変更する
set title

"ステータラインの表示を詰める
"set shortmess=atT

"ターミナルを高速にする
set ttyfast

"ターミナルで256色表示を使う
set t_Co=256

"OSのクリップボードを使用する
set clipboard+=unnamed

"変更された行の数の報告をステータスラインに表示する
set report=0

"画面端に到達してスクロールするまでの余白
set scrolloff=5
set sidescrolloff=8
set sidescroll=1

"フォールドを利用する
set foldenable

"set foldmethod=indent
"set foldmethod=marker
set foldmethod=manual

"カーソルがある場所を自動的に展開、格納
"set foldopen=all
"set foldclose=all

"画面の左にfoldの罫線を引く
"set foldcolumn=1

"起動時は全部開いておく
"set foldlevel=99

"内容が変更されたら自動的にreload
set autoread

"Swapを作るまでの時間m秒
"set updatetime=0

"Unicodeで行末が変になる問題を解決
"set ambiwidth=double

"行間をでシームレスに移動する
"set whichwrap+=h,l,<,>,[,],b,s

"カーソルを常に画面の中央に表示させる
"set scrolloff=999

"バックスペースで行頭を削除する
set backspace=indent,eol,start

"改行後に「Backspace」キーを押すと上行末尾の文字を1文字消す
set backspace=2

"移動コマンドを使ったとき、行頭に移動しない
set nostartofline

"C-X,C-Aを強制的に10進数認識させる
set nrformats=
"set nrformats=alpha

"コマンドラインでTABで補完できるようにする
set wildchar=<C-Z>

"C-vの矩形選択で行末より後ろもカーソルを置ける
set virtualedit=block

"コマンド、検索パターンを200まで保存
set history=200

"履歴に保存する各種設定
set viminfo='100,/100,<1000,f50,s100,:300,c,h,!

"バックアップを作成しない
set nobackup

"インクリメンタルサーチを有効にする
set incsearch

"大文字小文字を区別しない
set ignorecase

"大文字で検索されたら対象を大文字限定にする
set smartcase

"行末まで検索したら行頭に戻る
set wrapscan

"自動インデントを使用する
set smartindent
set autoindent

"改行時なるべくインデント構造を保つ
set preserveindent
set copyindent

"ステータスラインにコマンドを表示
set showcmd

"括弧の対応をハイライトする
set showmatch

"行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする。
set smarttab

"検索結果をハイライトする
set hlsearch

"ルーラーを表示
set ruler

"行番号を表示
set number

"コマンドラインの高さ
set cmdheight=1

"マクロなどの途中経過を描写しない
set lazyredraw

"新しいウィンドウは下に開く
"set splitbelow

"新しいウィンドウを右に開く
set splitright

"modelineを有効にする
set modeline

"カーソルラインを表示する
set cursorline

"目立たせるのは行だけ
if v:version >= 802 && !has('nvim')
	set cursorlineopt=screenline
endif

"絵文字を全角幅で扱う
if v:version >= 800
	set emoji
endif

"ファイル保存する際<EOL>を書き込む
if v:version >= 800
	set fixendofline
endif

"ターミナルで GUI カラーを使う
if v:version >= 800
	set termguicolors
endif

"15個までタブを開く
set tabpagemax=15

"タブラインを常に表示する
set showtabline=2

"TAB,EOFなどを可視化する
set list
if has('unix')
	set listchars=tab:⎸\ ,trail:-,extends:»,precedes:«,nbsp:·,eol:<
else
	set listchars=tab:>-,extends:<,trail:-,eol:<
endif

" 分割線をUnicode罫線表示
if has('unix')
	set fillchars+=vert:set fillchars+=fold:endif

"eobの~を非表示にする
"https://github.com/vim/vim/issues/3820
if (v:version > 8.2 && has("patch2508"))
	set fillchars+=eob:\ 
endif

"エンコード設定
if has('unix')
	set fileformat=unix
	set fileformats=unix,dos,mac
	set fileencoding=utf-8
	set fileencodings=utf-8,iso-2022-jp,cp932,euc-jp
	set termencoding=
elseif has('win32')
	set fileformat=dos
	set fileformats=dos,unix,mac
	set fileencoding=utf-8
	set fileencodings=iso-2022-jp,utf-8,euc-jp,cp932
	set termencoding=
endif

"}}}

"{{{ ステータスライン

"自動文字数カウント
augroup WordCount
	autocmd!
	autocmd BufWinEnter,InsertLeave,CursorHold * call WordCount('char')
augroup END
let s:WordCountStr = ''
let s:WordCountDict = {'word': 2, 'char': 3, 'byte': 4}
function! WordCount(...)
	if a:0 == 0
		return s:WordCountStr
	endif
	let cidx = 3
	silent! let cidx = s:WordCountDict[a:1]
	let s:WordCountStr = ''
	let s:saved_status = v:statusmsg
	exec "silent normal! g\<c-g>"
	if v:statusmsg !~ '^--'
		let str = ''
		silent! let str = split(v:statusmsg, ';')[cidx]
		let cur = str2nr(matchstr(str, '\d\+'))
		let end = str2nr(matchstr(str, '\d\+\s*$'))
		if a:1 == 'char'
			" ここで(改行コード数*改行コードサイズ)を'g<C-g>'の文字数から引く
			let cr = &ff == 'dos' ? 2 : 1
			let cur -= cr * (line('.') - 1)
			let end -= cr * line('$')
		endif
		let s:WordCountStr = printf('%d/%d', cur, end)
	endif
	let v:statusmsg = s:saved_status
	return s:WordCountStr
endfunction

"ステータスラインを常に表示
set laststatus=2
"ファイルナンバー表示
set statusline=[%n]
"ホスト名表示
set statusline+=%{matchstr(hostname(),'\\w\\+')}@
"ファイル名表示
set statusline+=%<%F
"変更のチェック表示
set statusline+=%m
"読み込み専用かどうか表示
set statusline+=%r
"ヘルプページなら[HELP]と表示
set statusline+=%h
"プレビューウインドウなら[Prevew]と表示
set statusline+=%w
"ファイルフォーマット表示
set statusline+=[%{&fileformat}]
"文字コード表示
set statusline+=[%{has('multi_byte')&&\&fileencoding!=''?&fileencoding:&encoding}]
"ファイルタイプ表示
set statusline+=%y
"ここからツールバー右側
set statusline+=%=
"skk/eskkの状態
set statusline+=%{exists('*SkkGetModeStr')?SkkGetModeStr():''}
set statusline+=%{exists('*eskk#statusline')?eskk#statusline():''}
"文字バイト数/カラム番号
set statusline+=[%{col('.')-1}=ASCII=%B,HEX=%c]
"現在文字列/全体列表示
set statusline+=[C=%c/%{col('$')-1}]
"現在文字行/全体行表示
set statusline+=[L=%l/%L]
"現在のファイルの文字数をカウント
set statusline+=[WC=%{exists('*WordCount')?WordCount():[]}]
"現在行が全体行の何%か表示
set statusline+=[%p%%]
"レジスタの中身を表示
"set statusline+=[RG=\"%{getreg()}\"]

"}}}

"{{{ キー設定

"インサートモードで<C-C>でESCと同義
inoremap <C-C> <ESC>

"矢印キーでは表示行単位で行移動する
nmap <UP> gk
nmap <DOWN> gj
vmap <UP> gk
vmap <DOWN> gj

"ZZは強制的に書き込む
map ZZ :wq!<CR>

"C-p,C-nでバッファ移動,C-dでバッファを閉じる
nmap <C-P> :bp<CR>
nmap <C-N> :bn<CR>
nmap <C-D> :bd<CR>

"ウインドウ移動はM-hjkl
noremap <M-h> <C-w>h
noremap <M-j> <C-w>j
noremap <M-k> <C-w>k
noremap <M-l> <C-w>l

"<M-t>で新規タブ
nmap <M-t> :tabnew<CR>
"M-p,M-nでタブ移動,M-dでタブを閉じる、M-oで開いてるタブ以外全部閉じる
nmap <M-p> :tabp<CR>
nmap <M-n> :tabn<CR>
nmap <M-d> :tabc<CR>
nmap <M-o> :tabo<CR>

"C-l,C-lでバッファリスト
nmap <C-L><C-L> :ls<CR>
"C-l,C-rでレジスタリスト
nmap <C-L><C-R> :dis<CR>
"C-l,C-kでキーマップリスト
nmap <C-L><C-K> :map<CR>
"C-l,C-mでマークリスト
nmap <C-L><C-M> :marks<CR>
"C-l,C-jでジャンプリスト
nmap <C-L><C-J> :jumps<CR>
"C-l,C-hでコマンドヒストリ
nmap <C-L><C-H> :his<CR>
"C-l,C-aで引数リスト
nmap <C-L><C-A> :args<CR>
"C-l,C-uでアンドゥヒストリ
nmap <C-L><C-U> :undolist<CR>

"C-w,eでファイルブラウザを横分割起動、もう一度で閉じる
nmap <C-W><C-E> :Lexplore! %:h<CR>

"C-c,C-rでカーソル語の置き換え
nmap <C-c><C-r> yw:%s:<C-R>0::g<LEFT><LEFT>
"C-c,rでyankした文字列との置き換え
nmap <C-c>r :%s:<C-R>0::g<LEFT><LEFT>
"C-c,gでカーソル語が存在する行の削除
nmap <C-c>g yw:g:<C-R>0:d
"C-c,Gでカーソル語が存在する行以外の削除
nmap <C-c>G yw:v:<C-R>0:d

"<Leader>celで空白行の削除
nmap <Leader>cel :%s:^$\n:<CR>
"<Leader>cdで現在編集中のファイルのあるディレクトリに変更
nmap <Leader>cd :cd %:h<CR>
"<Leader>cclで全てのコメント行の削除
nmap <Leader>ccl :%s:^\("\\|#\\\|\*\).*$\n:<CR>

"カーソル下の単語検索をgを使用する
nnoremap * g*
nnoremap # g#

"最後に貼り付けた範囲をVモードで選択
nnoremap <leader>v `[v`]

"<Leader>j/kで現在行の下に空行を挿入してカーソルを現在行へ戻す
nnoremap <leader>j O<ESC>j
nnoremap <leader>k o<ESC>k

"<Leader>/はverymagicを使う
nnoremap <Leader>/ /\v
nnoremap <Leader>?  ?\v

"コマンドモードはemacsキーバインドにする
cnoremap <C-A> <Home>
cnoremap <C-B> <Left>
cnoremap <C-D> <Delete>
cnoremap <C-E> <End>
cnoremap <C-F> <Right>
cnoremap <C-P> <UP>
cnoremap <C-N> <Down>
cnoremap <C-K> <c-\>egetcmdline()[:getcmdpos()-2]<CR>
"
"スクロールを高速化する
nnoremap <C-e> 3<C-e>
nnoremap <C-y> 3<C-y>

"<ESC> or <C-C>2回ででハイライトをOFFにする
nmap <ESC><ESC> :noh<CR>
nmap <C-C><C-C> :noh<CR>

"<S+TAB>でexpandtabをトグル
function Tab_switch()
	if &expandtab =='1'
		set noexpandtab
	else
		set expandtab
	endif
endfunction
nmap <S-TAB> :call Tab_switch()<CR>

"<M-w>でnowrapをトグルする
function Wrap_switch()
	if &wrap =='1'
		set nowrap
	else
		set wrap
	endif
endfunction
nmap <M-w> :call Wrap_switch()<CR>

"dbでブラックホール送る
nmap db "_d

"Vモードで選択状態のまま連続インデント
xnoremap < <gv
xnoremap > >gv

"u-u/rはUndotreeを辿る
nmap <M-u> g-
nmap <M-r> g+

"<Leader>uで最後の保存状態まで戻る
nmap <Leader>u :earlier 1f<CR>
"<Leader>rで上とは逆に進む、戻りすぎた時に使用
nmap <Leader>r :later 1f<CR>

"他のvimにviminfoを送る
"http://nanasi.jp/articles/howto/editing/rviminfo.html
"nmap <Leader>vw :wviminfo<CR>
"nmap <Leader>vr :rviminfo<CR>

"開いているバッファのディレクトリに移動
"if v:version >= 700
"	set autochdir
"endif

"Vimを終了しても undo 履歴を復元する
"https://vim-jp.org/vim-users-jp/2010/07/19/Hack-162.html
if has('persistent_undo')
	"set undofile
	"set undodir=~/.vimundo
	function Enablepersistentundo()
		if ! isdirectory( $HOME . "/.vimundo" )
			call mkdir( $HOME . "/.vimundo" )
		endif
		set undodir=~/.vimundo
		set undofile
	endfunction
	"<Leader>unで有効化する、同時にUndo履歴を書き込む、こうすれば編集後履歴を残したい時に使える
	nmap <Leader>un :call Enablepersistentundo()<CR>
	function Clearundohistory()
		let old_undolevels = &undolevels
		set undolevels=-1
		exe "normal a \<BS>\<Esc>"
		let &undolevels = old_undolevels
		unlet old_undolevels
	endfunction
	"<Leader>clでUndo履歴をぶっ飛ばす、persistent_undoを常時有効化してる時にリセットできる
	nmap <Leader>cl :call Clearundohistory()<CR>
endif

"<M-g>でGrepする
nmap <M-g> :vimgrep  %<LEFT><LEFT>

"Makeやgrepでcwindowを自動でひらくようにする
autocmd QuickfixCmdPost make,grep,grepadd,vimgrep copen
autocmd QuickfixCmdPost l* lopen

"M-f,M-bでquickfix移動、M-qで閉じる
nmap <M-f> :cnext<CR>
nmap <M-b> :cprev<CR>
nmap <M-q> :cclose<CR>

"S-Up/Downで行の入れ替え
nnoremap <S-Up>   :<c-u>execute 'move -1-'. v:count1<cr>
nnoremap <S-Down> :<c-u>execute 'move +'. v:count1<cr>

"現在のウインドウでのみcursorlineを有効にする
autocmd WinLeave,InsertEnter * set nocursorline
autocmd WinEnter,InsertLeave * set cursorline

"}}}

"{{{ GUIやOS固有の設定

"Metaキーを全て<ESC>+にリマップする
"https://vim.fandom.com/wiki/Fix_meta-keys_that_break_out_of_Insert_mode
" fix meta-keys which generate <Esc>a .. <Esc>z
if !has('nvim')
	if has('unix')
		let c = 'a'
		while c <= 'z'
			execute "set <M-" . c . ">=\e" . c
			execute "imap \e" . c . " <M-" . c . ">"
			execute "set <M-S-" . c . ">=\e" . toupper(c)
			execute "imap \e" . toupper(c) . " <M-" . c . ">"
			let c = nr2char(1+char2nr(c))
		endw
	endif
endif

"ターミナルでマウスを使用できるようにする
if !has('nvim')
	if has ("mouse")
		set mouse=a
		set guioptions+=a
		set ttymouse=urxvt
	endif
endif

"GVim
if has('gui')
	"ツールバーを消す
	set guioptions=egLta
	"既に開いているGVIMがあるときはそのVIMを前面にもってくる
	runtime macros/editexisting.vim
endif

"iOS
if has('gui_ios')
	ifont set -q -s 12 "MesloLGS NF"
endif

"Macのみ
if has('gui_macvim')
	"ウインドウポジション、サイズの設定
	winpos 988 44
	set isfname+=32
	set lines=99
	set columns=179
	"set linespace=2
	"set guifont=Menlo\ Regular:h9
	"set guifontwide=Menlo\ Regular:h9
	set guifont=MesloLGMDZNerdFontCompleteM-Bold:h8
	set guifontwide=MesloLGMDZNerdFontCompleteM-Bold:h8
	"set guifont=Ricty\ Regular\ for\ Powerline:h11
	"set guifontwide=Ricty\ Regular\ for\ Powerline:h11
	"set imdisable
	"set iminsert=2
	"set imsearch=0
	set macmeta
endif

"APFS/HFS拡張属性を自動付与
if has('mac')
	autocmd BufWritePost *.txt
	\ if &fenc=='utf-8' |
		\ exec "silent !xattr -w com.apple.TextEncoding 'UTF-8;134217984' \"%\"" |
	\ elseif &fenc=='euc-jp' |
		\ exec "silent !xattr -w com.apple.TextEncoding 'EUC-JP;2361' \"%\"" |
	\ elseif &fenc=='iso-2022-jp' |
		\ exec "silent !xattr -w com.apple.TextEncoding 'ISO-2022-JP;2080' \"%\"" |
	\ elseif &fenc=='cp932' |
		\ exec "silent !xattr -w com.apple.TextEncoding 'SHIFT_JIS;2561' \"%\"" |
	\ endif
endif

if has('win32')
	"フォント設定
	set guifont=MS_Gothic:h9:cSHIFTJIS
	"パスのセパレータを変更(\->/)
	set shellslash
	"ウインドウポジション、サイズの設定
	winpos 9 6
	set lines=73
	set columns=110
	"スペースの入ったファイル名も扱えるようにする
	set isfname+=32
	"ファイル保存ダイアログの初期ディレクトリをバッファのあるディレクトリにする
	set browsedir=buffer
	"IME入力状態を規定にする(skkを使っているとき用)
	set iminsert=2
	set imsearch=0
	"起動時デスクトップに移動
	if isdirectory( $HOME . "/Desktop" )
		cd $HOME/Desktop
	elseif isdirectory( $HOME . "/デスクトップ" )
		cd $HOME/デスクトップ
	endif
endif

"}}}

"{{{ MENU

"SSHを通してファイルオープン、GUIじゃない時でもMeta-m -> <TAB>でメニューを呼び出せる
"どうやるか覚えられない操作を置いとけば呼び出せる
menu User.Open.SCP.NonSprit :e! scp:///<LEFT>
menu User.Open.SCP.VSprit :vsp<CR>:wincmd w<CR>:e! scp:///<LEFT>
menu User.Open.SCP.Sprit :sp<CR>:wincmd w<CR>:e! scp:///<LEFT>
"分割してファイルブラウザを起動
menu User.Open.Explolr.NonSprit :vsp<CR>:wincmd w<CR>:e! ./<CR>
menu User.Open.Explolr.VSprit :vsp<CR>:wincmd w<CR>:e! ./<CR>
menu User.Open.Explolr.Sprit :sp<CR>:wincmd w<CR>:e! ./<CR>
"各種VIMの記録情報を表示する
menu User.Buffur.RegisterList :dis<CR>
menu User.Buffur.BuffurList :ls<CR>
menu User.Buffur.HistoryList :his<CR>
menu User.Buffur.MarkList :marks<CR>
menu User.Buffur.JumpList :jumps<CR>
menu User.Buffur.ArgList :args<CR>
"エンコードを指定して再読み込み
menu User.Encode.reload.UTF :e ++enc=utf-8<CR>
menu User.Encode.reload.SJIS :e ++enc=cp932<CR>
menu User.Encode.reload.EUC :e ++enc=euc-jp<CR>
menu User.Encode.reload.ISO :e ++enc=iso-2022-jp<CR>
"保存エンコードを指定
menu User.Encode.convert.UTF :set fenc=utf-8<CR>
menu User.Encode.convert.SJIS :set fenc=cp932<CR>
menu User.Encode.convert.EUC :set fenc=euc-jp<CR>
menu User.Encode.convert.ISO :set fenc=iso-2022-jp<CR>
"フォーマットを指定して再読み込み
menu User.Format.Unix :e ++ff=unix<CR>
menu User.Format.Dos :e ++ff=dos<CR>
menu User.Format.Mac :e ++ff=mac<CR>
"行番号をファイルに挿入
menu User.Global.No :%!awk '{print NR, $0}'<CR>
"TABをSPACEに置き換える
menu User.Global.Space :set expandtab<CR>:retab<CR>
"空白行を削除する
menu User.Global.Delete :g/^$/d<CR>
"カーソル上の単語を全体から検索し、別ウインドウで表示
menu User.Cursor.Serch.Show [I
menu User.Cursor.Serch.Top [i
menu User.Cursor.Serch.Junp [<tab>
"カーソル上のファイルのオープン
menu User.Cursor.FileOpen gf
"コピー、ペーストモード
menu User.Cursor.Paste :call Indent()<CR>
"全体置き換えモード
menu User.Cursor.Replace :%s/
"C-C,C-Rと同様
menu User.Cursor.Delete yw:%v:<C-R>0

"CUI時にメニューを<M-m>で表示する
set wildcharm=<TAB>
nmap <M-m> :emenu <TAB>

"ワイルドメニューを使う
set wildmenu
set wildmode=longest,list,full

"}}}

"{{{その他

"ノーマルと挿入モードでカーソルの形を変化させる
if exists('$TMUX')
	let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
	let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
else
	let &t_SI = "\<Esc>]50;CursorShape=1\x7"
	let &t_EI = "\<Esc>]50;CursorShape=0\x7"
endif

"vimrcを保存時に即時reload
autocmd BufWritePost $MYVIMRC source $MYVIMRC

"vimを開いたときカーソル位置を復元
silent! source $VIMRUNTIME/defaults.vim

"RedHat系デフォルトの/etc/vimrcのカーソル復元は無効化
augroup redhat
  autocmd!
augroup end

"HEXエディタとしてvimを使う
if has('unix')
	augroup Binary
		au!
		au BufReadPre  *.bin let &bin=1
		au BufReadPost *.bin if &bin | silent %!xxd -g 1
		au BufReadPost *.bin set ft=xxd | endif
		au BufWritePre *.bin if &bin | %!xxd -r
		au BufWritePre *.bin endif
		au BufWritePost *.bin if &bin | silent %!xxd -g 1
		au BufWritePost *.bin set nomod | endif
	augroup END
endif

"<C-c>,<C-v>でターミナルからコピーできる表示形式にし、さらにペーストも受け付ける
if has('unix')
	function Indent_switch()
		if &nu =='1'
			set clipboard-=unnamed
			set noai
			set nolist
			set nonu
			set paste
			set nocursorline
		else
			set clipboard+=unnamed
			set ai
			set list
			set nu
			set nopaste
			set cursorline
		endif
	endfunction
	nmap <C-C><C-V> :call Indent_switch()<CR>
endif

"<Leader>nnトグルで絶対行に表示切り替え
if has('unix')
	function Relnum_switch()
		if &relativenumber =='1'
			set norelativenumber
		else
			set relativenumber
		endif
	endfunction
	nmap <Leader>nn :call Relnum_switch()<CR>
endif

"挿入モードで",date",',time'で日付、時刻挿入
inoremap <Leader>date <C-R>=strftime('%Y/%m/%d (%a)')<CR>
inoremap <Leader>time <C-R>=strftime('%H:%M')<CR>

"sudoを忘れて権限のないファイルを編集した時<Leader>sudoで保存
nmap <Leader>sudo :w !sudo tee %<CR>

"<C-c><C-d>で現在のバッファと保存前のファイルをdiffする
nmap <C-C><C-D> :w !diff -u % -<CR>

"<C-c><C-g>で現在のファイルをgit diffする、Pluginが何も入ってない環境で使用
nmap <C-C><C-G> :!git diff --  %<CR>

"<C-c><C-d>でvimdiffを使用して現在のバッファと元ファイルを比較する
command DiffOrigcmp rightb vnew | set bt=nofile | r # | -1d_ | diffthis | wincmd p | diffthis
nmap <C-C>d :DiffOrig<CR>

"無名buffer同士の差分を取る
command Clone rightb vnew | put =getbufline('#',1,'$') | 1d_
command CloneDiff rightb vnew | put =getbufline('#',1,'$') | 1d_ | windo diffthis | wincmd w
nmap <C-C><C-B> :CloneDiff<CR>

"diffmodeでS-Up/Downで差分ジャンプ
if &diff
	nmap <s-UP> [c
	nmap <s-DOWN> ]c
endif

" selfupdate
command Selfupdate :!curl -o ~/.vimrc -L https://gist.github.com/kotashiratsuka/eac44d7e569f3721be5a12b8c221cab6/raw/.vimrc

"この.vimrcのTipsを表示する
command Tips :vsp! +set\ nofoldenable|1000 $MYVIMRC

"if has('unix')
"	"CVSのコミットはSJISで行う
"	autocmd BufRead /tmp/cvs* :set fileencoding=cp932
"	"Muttから開いた編集はiso-2022-jpで行う
"	autocmd BufRead ~/.mutt/tmp/* :set fileencoding=utf-8
"	"w3mのフォームは改行コードdosで編集
"	autocmd BufRead ~/.w3m/w3mtmp* :set fileformat=dos
"	"どのような言語でもペースト時自動インデントしない
"	"autocmd BufRead * :set paste
"endif

"}}}

"{{{ Plugin

"Plug デフォルトでは動かさない
"install は
"!curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
"source % | :PlugInstall
if filereadable($HOME . '/.vim/autoload/plug.vim')
	call plug#begin('~/.vim/plugged')
	Plug 'sheerun/vim-polyglot'
	"Plug 'tpope/vim-fugitive'
	"Visual block mode時に$で問題有り
	"Plug 'gregsexton/gitv'
	Plug 'mhinz/vim-signify'
	"Plug 'alpaca-tc/alpaca_powertabline'
	"Plug 'Lokaltog/powerline'
	"Plug 'vim-scripts/L9' | Plug 'vim-scripts/FuzzyFinder'
	Plug 'vim-airline/vim-airline' | Plug 'vim-airline/vim-airline-themes' | Plug 'edkolev/promptline.vim'
	"Plug 'itchyny/lightline.vim'
	if exists('$TMUX')
		Plug 'edkolev/tmuxline.vim'
	endif
	Plug 'tpope/vim-rails' , { 'for': 'ruby' }
	Plug 'pangloss/vim-javascript' , { 'for': 'javascript' }
	Plug 'vim-jp/vimdoc-ja'
	"Plug 'tsaleh/vim-align'
	"Plug 'h1mesuke/vim-alignta'
	Plug 'junegunn/vim-easy-align'
	Plug 'tyru/skk.vim', { 'do': 'curl --create-dirs -o ~/.vim/skk/SKK-JISYO.L http://openlab.jp/skk/skk/dic/SKK-JISYO.L' }
	"Plug 'tyru/eskk.vim', { 'do': 'curl --create-dirs -o ~/.vim/skk/SKK-JISYO.L http://openlab.jp/skk/skk/dic/SKK-JISYO.L' }
	"Plug 'vim-scripts/DrawIt'
	Plug 'flazz/vim-colorschemes'
	"Plug 'rafi/awesome-vim-colorschemes'
	"Plug 'vim-scripts/guicolorscheme.vim'
	Plug 'godlygeek/csapprox'
	"Plug 'othree/eregex.vim'
	"Plug 'nathanaelkane/vim-indent-guides'
	"Plug 'vim-scripts/diffchar.vim'
	Plug 'editorconfig/editorconfig-vim'
	Plug 'mattn/emmet-vim', { 'for': 'html' }
	Plug 'vim-scripts/closetag.vim', { 'for': [ 'html' , 'xml' ] }
	Plug 'tpope/vim-repeat' | Plug 'tpope/vim-surround'
	"Plug 'vim-scripts/YankRing.vim'
	Plug 'junegunn/fzf.vim' | Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --bin' }
	"Plug 'yuki-yano/fzf-preview.vim', { 'branch': 'release/rpc' }
	"Plug 'easymotion/vim-easymotion'
	Plug 'mg979/vim-visual-multi'
	"Plug 'terryma/vim-multiple-cursors'
	Plug 'tpope/vim-abolish'
	"Plug 'timakro/vim-searchant'
	"Plug 'airblade/vim-gitgutter'
	Plug 'Yggdroot/indentLine'
	Plug 'shinchu/hz_ja.vim'
	Plug 'ryanoasis/vim-devicons'
	Plug 'kana/vim-operator-user' | Plug 'kana/vim-operator-replace'
	Plug 'rhysd/clever-f.vim'
	Plug 'RRethy/vim-illuminate'
	"Plug 'vim-scripts/CmdlineComplete'
	Plug 'mattn/vim-gist', { 'on': 'Gist' } | Plug 'mattn/webapi-vim'
	call plug#end()
endif

"eskk.vim
if &runtimepath =~ 'eskk.vim' && has('unix')
	let g:eskk#egg_like_newline=1
	let g:eskk#directory = "~/vim/skk"
	let g:eskk#dictionary = { 'path': "~/.vim/skk/.skk-jisyo" }
	let g:eskk#large_dictionary = { 'path': "~/.vim/skk/SKK-JISYO.L" }
	let g:eskk#auto_save_dictionary_at_exit = 1
endif

"skk.vim
if &runtimepath =~ 'skk.vim' && has('unix')
	let g:skk_egg_like_newline=1
	let g:skk_jisyo = "~/.vim/skk/.skk-jisyo"
	let g:skk_large_jisyo = "~/.vim/skk/SKK-JISYO.L"
	let g:skk_auto_save_jisyo = 1
endif

"Fuf系
"http://vim.g.hatena.ne.jp/keyword/fuzzyfinder.vim
if &runtimepath =~ 'FuzzyFinder'
	let g:fuf_modesDisable = ['mrucmd']
	nmap fb :FufBuffer<CR>
	nmap fF :FufFile<CR>
	nmap ff :FufMruFile<CR>
	nmap fl :FufChangeList<CR>
endif

"indentLine
if &runtimepath =~ 'indentLine'
	let g:indentLine_char = '⎸'
endif

"operator-replace
if &runtimepath =~ 'operator-replace'
	nmap _ <Plug>(operator-replace)
endif

"http://haya14busa.com/mastering-vim-easymotion/
"if &runtimepath =~ 'vim-easymotion'
"	" =======================================
"	" Boost your productivity with EasyMotion
"	" =======================================
"	" Disable default mappings
"	" If you are true vimmer, you should explicitly map keys by yourself.
"	" Do not rely on default bidings.
"	let g:EasyMotion_do_mapping = 0
"	" Or map prefix key at least(Default: <Leader><Leader>)
"	" map <Leader> <Plug>(easymotion-prefix)
"	" =======================================
"	" Find Motions
"	" =======================================
"	" Jump to anywhere you want by just `4` or `3` key strokes without thinking!
"	" `s{char}{char}{target}`
"	nmap s <Plug>(easymotion-s2)
"	xmap s <Plug>(easymotion-s2)
"	omap z <Plug>(easymotion-s2)
"	" Of course, you can map to any key you want such as `<Space>`
"	" map <Space>(easymotion-s2)
"	" Turn on case sensitive feature
"	let g:EasyMotion_smartcase = 1
"	" =====================================
"	" Line Motions
"	" =======================================
"	" `JK` Motions: Extend line motions
"	map <Leader>j <Plug>(easymotion-j)
"	map <Leader>k <Plug>(easymotion-k)
"	" keep cursor column with `JK` motions
"	let g:EasyMotion_startofline = 0
"	" =======================================
"	" General Configuration
"	" =======================================
"	let g:EasyMotion_keys = 'hjklasdfgyuiopqwertnmzxcvbHJKLASDFGYUIOPQWERTNMZXCVB'
"	" Jump to first match with enter & space
"	let g:EasyMotion_enter_jump_first = 1
"	let g:EasyMotion_space_jump_first = 1
"	" =======================================
"	" Search Motions
"	" =======================================
"	" Extend search motions with vital-over command line interface
"	" Incremental highlight of all the matches
"	" Now, you don't need to repetitively press `n` or `N` with EasyMotion feature
"	" `<Tab>` & `<S-Tab>` to scroll up/down a page with next match
"	" :h easymotion-command-line
"	nmap g/ <Plug>(easymotion-sn)
"	xmap g/ <Plug>(easymotion-sn)
"	omap g/ <Plug>(easymotion-tn)
"endif

"fzf
"https://github.com/junegunn/fzf.vim
if &runtimepath =~ 'fzf.vim'
	let g:fzf_buffers_jump = 1
	let g:fzf_commits_log_options = '--no-show-signature --oneline --graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr"'
	nmap <Leader>fz :FZF<CR>
	nmap <Leader>ff :Files<CR>
	nmap <Leader>fb :Buffers<CR>
	nmap <Leader>fl :Lines<CR>
	nmap <Leader>fL :BLines<CR>
	nmap <Leader>ff :History<CR>
	nmap <Leader>fs :History/<CR>
	nmap <Leader>gc :BCommits<CR>
	nmap <Leader>gC :Commits<CR>
	nmap <Leader>gf :GFiles<CR>
	nmap <Leader>gF :GFiles?<CR>
	nmap <Leader>fc :Commands<CR>
	nmap <Leader>fm :Marks<CR>
	nmap <Leader>fj :Jumps<CR>
	nmap <Leader>fM :Map<CR>
	nmap <Leader>fw :Windows<CR>
	nmap <Leader>fr :Rg<SPACE>
	nmap <Leader>fL :Locate<SPACE>
endif

"https://github.com/junegunn/vim-easy-align
if &runtimepath =~ 'vim-easy-align'
	xmap ga <Plug>(EasyAlign)
	nmap ga <Plug>(EasyAlign)
endif

"YankRing
"http://stackoverflow.com/questions/15010271/change-location-of-vim-yankring-history-file#15010272
"if &runtimepath =~ 'YankRing.vim'
"	let g:yankring_history_dir = $HOME.'/.vim'
"endif

"eregex
"http://blog.ruedap.com/2011/02/02/vim-ruby-regexp-plugin-eregex
if &runtimepath =~ 'eregex.vim'
	let g:eregex_default_enable = 0
	nnoremap <Leader>/ :call eregex#toggle()<CR>
endif

"Gitv
"http://cohama.hateblo.jp/entry/20130517/1368806202
"if &runtimepath =~ 'gitv'
"nmap ,g :Gitv --all<CR>
"	autocmd FileType git :setlocal foldlevel=99
"	autocmd FileType gitv call s:my_gitv_settings()
"
"	function! s:my_gitv_settings()
"		setlocal iskeyword+=/,-,.
"		nnoremap <silent><buffer> C :<C-u>Git checkout <C-r><C-w>
"		nnoremap <buffer> <Space>di :<C-u>Git diff <C-r><C-w><CR>
"		nnoremap <buffer> <Space>rb :<C-u>Git rebase <C-r><C-w>
"		nnoremap <buffer> <Space>R :<C-u>Git revert <C-r><C-w>
"		nnoremap <buffer> <Space>h :<C-u>Git cherry-pick <C-r><C-w>
"		nnoremap <buffer> <Space>rh :<C-u>Git reset --hard <C-r><C-w>
"	endfunction
"
"endif

" vim-airline
if &runtimepath =~ 'airline'
	let g:airline#extensions#tabline#enabled = 1
	let g:airline#extensions#tabline#buffer_idx_mode = 1
	let g:airline_powerline_fonts = 1
	let g:airline#extensions#whitespace#trailing_regexp = '[^\\]\s$'
	"airline使うならstatusline不要
	set statusline&
	"skkの状態を表示
	if &runtimepath =~ 'skk.vim' && has('unix')
		let g:airline_section_x=airline#section#create_right(['%{exists(''*SkkGetModeStr'')?SkkGetModeStr():''''} ','filetype'])
	endif
	if &runtimepath =~ 'eskk.vim' && has('unix')
		let g:airline_section_x=airline#section#create_right(['%{exists(''*eskk#statusline'')?eskk#statusline():''''} ','filetype'])
	endif
endif

"colorschme
if &runtimepath =~ 'awesome-vim-colorschemes'
	"colorscheme abstract
	"colorscheme ayu
	"colorscheme deep-space
	"colorscheme gotham256
	"colorscheme hybrid
	"colorscheme lucius
	"colorscheme molokai_dark
	"colorscheme molokayo
	"colorscheme onedark
	"colorscheme wombat256
elseif &runtimepath =~ 'vim-colorschemes'
	colorscheme badwolf
	"()[]などのハイライトが見難いので赤
	highlight MatchParen guifg=Cyan gui=bold
else
	colorscheme pablo
endif


"vim-visual-multi
if &runtimepath =~ 'vim-visual-multi'
	let g:VM_theme = 'iceblue'
	let g:VM_mouse_mappings = 1
	let g:VM_maps = {}
	let g:VM_maps["Exit"] = '<C-c>'
	let g:VM_maps['Find Under'] = '<C-m>'
	let g:VM_maps['Find Subword Under'] = '<C-m>'
endif

"vim-signify
if &runtimepath =~ 'vim-signify'
	let g:signify_sign_add    = '•'
	let g:signify_sign_change = '•'
	let g:signify_sign_delete = '•'
	highlight SignifySignAdd    ctermfg=green
	highlight SignifySignDelete ctermfg=red
	highlight SignifySignChange ctermfg=yellow
	highlight SignColumn ctermbg=NONE cterm=NONE guibg=NONE gui=NONE
	nmap <C-C><C-V> :call Indent_switch() \| call sy#toggle()<CR>
endif

"vim-indent-guides
if &runtimepath =~ 'vim-indent-guides'
	let g:indent_guides_enable_on_vim_startup = 1
	hi IndentGuidesOdd  ctermbg=black
	hi IndentGuidesEven ctermbg=darkgrey
endif

"clever-f
if &runtimepath =~ 'clever-f'
	let g:clever_f_across_no_line = 1
	let g:clever_f_use_migemo = 1
	let g:clever_f_smart_case = 1
endif

"promptline
if &runtimepath =~ 'promptline.vim'
	let g:promptline_theme = 'airline'
	let g:promptline_preset = {
				\'a' : [ promptline#slices#host() ],
				\'b' : [ promptline#slices#user() ],
				\'c' : [ promptline#slices#cwd() ],
				\'x' : [ promptline#slices#git_status() ],
				\'y' : [ '$(git rev-parse --short HEAD 2>/dev/null)'],
				\'z' : [ promptline#slices#vcs_branch(), promptline#slices#jobs() ],
				\'warn' : [ promptline#slices#last_exit_code() ]}
endif

"tmuxline
if &runtimepath =~ 'tmuxline.vim'
	let g:airline#extensions#tmuxline#enabled = 0
	let g:tmuxline_preset = {
				\ 'b': '#S',
				\ 'a': '#(tmux list-sessions|wc -l|bc)',
				\ 'win': ['#I', '#W'],
				\ 'cwin': ['#I', '#W'],
				\ 'x': '#{?client_prefix,,}#{?window_zoomed_flag,,}',
				\ 'y': ['%H:%M','%Y-%m-%d'],
				\ 'z': '#h',
				\ 'options': {
					\'status-justify': 'left'
					\},
				\ 'win_options': {
					\'window-status-activity-style': 'none',
					\}
				\}
endif

"}}}

"{{{ Tipsメモ

"新しい機能やどうしても覚えられないmapは基本的にmapするけど、ある程度使い込んだ場合やまるで使わなかったもの、
"たまにしか使わなくて覚えられないもの、逆に覚え込んで身についたものはこのtipsに送られる

"無名バッファの復元、無名で編集していて間違って閉じた場合に使用
":recover

"バッファ切り替え
"C-^
"開いてるバッファー全てにコマンド実行
"bufferdo %s/bbb/bbb/g|wa
"バッファ全体に置き替えを適用
":bufdo %s/bbb/bbb/g
"バッファ全部保存
"wa
"保存して全て(バッファー引数)終了
"xa!
"保存せずに全て(バッファー引数)終了
"qa!
"引数リスト全体に置き替えを適用して保存して終了
":argdo %s/bbb/bbb/g|xa

"http://www.ac.cyberhome.ne.jp/~yakahaira/vimdoc/windows.html
"水平、縦分割
"<C-W>s <C-W>v
"分割ウインドウ移動
"C-W,C-W
"分割ウインドウカーソル移動
"C-W,hjkl
"分割ウインドウ自体移動
"C-W,HJKL
"いま開いている分割ウインドウを閉じる
"C-W,C-c
"いま開いている分割ウインドウ以外を閉じる
"C-W,C-o
"ウインドウを入れ替える"
"C-W,x
"ウインドウサイズ調整
"C-W,+ -= C-W,- C-W,=
"ウインドウサイズ幅高さ最大
"C-W_ C-W|

"タブ移動
"gt gT 2gt

"カーソルを一個前、先のジャンプリストに移動
"<C-o> <C-i>
"カーソル下のファイル名を開く
"gf
"カーソル下のファイル名を開く、:Lが指定されていればそこにジャンプ
"gF
"カーソル下のファイル名をタブで開く
"C-w,gf

"現在検索している単語をペースト
"<C-R>/

"インデントやら何やら無視してそのままペースト
":a! <Paste>

"カレントバッファの内容をshなどで実行
"w !sh

"検索履歴を参照
":<C-F>
"or
"逆から
":?
"履歴を送る
"C-C
"コマンド履歴を参照
"q:
"逆から
"q?

"レジスタの中身をコマンドラインへペースト
":<C-R>"
":<C-R>0
":<C-R><C-W>

"レジスタリスト
"0 最後に yank したテキスト
"- 最後の細かい削除
". 最後に挿入したテキスト
"% 現在のファイル名
"# 代替ファイル名
"/ 最後に検索した文字列
": 最後に実行した:
"_ ブラックホール
"= 計算式
"* マウスで選択されたテキスト

"指定エンコードで開きなおす
":e ++enc=euc-jp
":e ++ff=unix

"インサートモードでインデントする
"<C-T> or <C-D>
"インサートモードで上下の行を現在行へコピーして入力
"<C-E> or <C-Y>

"uniqやgrepでフィルタ
":%!uniq
":%!grep

":eで開くパスの追加
"let &path += "/etc,/var/log,/var/log/httpd"

"Bookmark
"https://nanasi.jp/articles/vim/bookmarks_vim.html
"b
"B
"q

"DrawItPlugin.vim
"\di to start DrawIt and
"\ds to stop  DrawIt.

"EnhCommentify.vim
"\xでコメントアウト/解除
"
"VisualMode再選択
"gv

"カーソル上の単語を全体からリストアップ
"[I

"大文字<->小文字変換
"~
"gu<select>
"gU<select>
"
"カーソルを画面の上、中、下に移動
"H,M,L

"1ラインスクロール
"CTRL-Y CTRL-T

"ウィンドウの先頭から数えて[count]行目から再描画
"z
"現在行をウィンドウの最上位置にして再描画(位置変化無)
"zt
"ウィンドウの高さを{height}にして再描画
"z{height}<CR>
"現在位置を最上にしてウィンドウを再描画(カーソル現在位置)
"z<CR>
"現在位置を中心にしてウィンドウを再描画(カーソル最左非空白へ)
"z.
"現在位置を中心にしてウィンドウを再描画(カーソル現在位置)
"zz
"現在位置を最下にしてウィンドウを再描画(カーソル最左非空白へ)
"z-
"現在位置を最下にしてウィンドウを再描画(カーソル現在位置)
"zb

"wrap off時: [count]文字左にスクロール
"z<right>
"z<right>" と同じ
"zl
"wrap off時: [count]文字右にスクロール
"z<Left>
"z<Left>" と同じ
"zh

"現在行の検索
"f<word>
"現在行の検索(後方)
"F<word>
"現在行のワード検索
"f<word>
"現在行の検索(後方)
"F<word>
"現在行の次検索
",

"検索、置き換え簡単方法
"置き換えたいワードの上にカーソル移動->'*'->cw->入力->n->.->n->.->繰り返し

"コントロールコードの入力
"C-V<TAB>

"計算結果の入力
"Insterモード->C-R=->2*2*2->Return

"EXモードの基本形
":q
"で選んで編集してEnter
"キャンセルは<ESC<
"
"直前操作繰り返しをコマンドラインから範囲指定で行う
":.,10 normal .

"コマンド内容をinsertする
":normal iecho test
"逆にレジスタに入れてコマンドに貼り付ける
"y$:"*

"コマンドラインでバッファ番号を指定する
"#バッファ番号

"コマンドライン操作
"http://www.kaoriya.net/vimdoc_j/cmdline.txt
"C-R....
"
"名前のない登録、最後の削除やヤンクを含む。
"'"'
"カレントファイル名
"'%'
"代替ファイル名
"'#'
"最後の検索パターン
"'/'
"クリップボードの内容
"'*'
"最後のコマンドライン
"':'
"最後の小さな削除(行単位未満)
"'-'
"最後に挿入されたテキスト
"'.'
"式の登録: 式を入力するよう要求される
"'='

"ファイル名補完
"CTRL-X CTRL-F
"行全補完
"CTRL-X CTRL-L
"マクロ定義 (インクルードファイルの中も探す)
"CTRL-X CTRL-D
"カレントファイルとインクルードファイ補完
"CTRL-X CTRL-I
"辞書補完
"CTRL-X CTRL-K
"同義語辞書 (シソーラス)
"CTRL-X CTRL-T
"タ補完
"CTRL-X CTRL-]
"Vim のコマンドライ補完
"CTRL-X CTRL-V

""検索文字列補完
"https://vim.blue/search-complete/
"CTRL-R CTRL-F カーソル下のファイル名
"CTRL-R CTRL-P gf と同様に 'path' を使って展開された、カーソル下のファイル名
"CTRL-R CTRL-W カーソル下の word
"CTRL-R CTRL-A カーソル下の WORD; WORD を参照
"CTRL-R CTRL-L カーソル下の行

"Window縦分割/横分割切替
"C-W,H
"C-W,J

"暗号化する解除する
":X

"空白を挿入しないでjoinする
"gJ

"最初の検索パターンが現れたところからもう一段検索する
"http://www.kaoriya.net/vimdoc_j/pattern.txt
":/patarn1/;/patarn2

"カーソル位置の単語をManpageで検索
"K

"カーソル位置の情報を詳細にステータスバーへ表示
"g,C-G

"Fold関係
"foldenable をトグルで on off する
"zi
"fold を閉じる、開く
"zo zc
"fold を再帰的に開く、閉じる
"zO zC
"折りたたみ間の移動
"z] z[
"1つ上下の折りたたみに移動
"zj zk
"foldlevel をインクリメント、 すなわちすべてのfoldを1level開く
"zr
"foldlevel を最大値にする、すなわちすべてのfoldを開く
"zR
"foldlevel をデクリメント、すなわちすべてのfoldを1level閉じる
"zm
"foldlevel を0にする、すなわちすべてのfoldを閉じる
"zM
"fold をカーソルから4行分設定する
"zf4j
"fold をカーソルからaのマーク位置まで設定する
"zf`a
"設定された fold を削除
"zd
"設定された fold を再帰的に削除
"zD
"全てのfoldを削除
"zE

"全文をソート
":%!sort [u]

"改行位置で整形
"gq

"sudoを忘れて権限のないファイルを編集した時
":w !sudo tee %

"置換
"Massachusetts の上で # を押して、 :%s//New York/g とかやると New York に置換
":%s//New York/g とかやると New York に置換
":%g//dすれば Massachusetts を含む行を削除
"%v//dすれば Massachusetts を含む行だけ残すことができる。

"sで置換してその後他の行に適用
":%s//New York/g したあと、&で繰り返し
"&
":%s//New York/g したあと、g&で全体に適用
"g&

"cssの{}の内側をsort
":g/{\n/+1,/}/-1 sort

"http://などをエスケープしないで検索
"/\vhttp://.*
"/\Vhttp://

"グループを使用せず正規表現のマッチする範囲を指定
"http://tanihiro.hatenablog.com/entry/2016/06/01/211806
"%s/<div.*>\zs.\+\ze<\/div>/REPLACE/

"検索した後終端にカーソルを配置
"http://tanihiro.hatenablog.com/entry/2016/06/01/211806
"/WORD/e

"改行も含めたメタ文字置換
"s/\_s

"Undo関連
"undolist Undo履歴を参照
"g-             古いテキストの状態戻る
"g+             新しいテキストの状態に戻る
":earlier {N}s  {N}秒前の状態に戻ります
":earlier {N}m  {N}分前の状態に戻ります
":earlier {N}h  {N}時間前の状態に戻ります
":later {N}s    {N}秒後の状態に戻ります
":later {N}m    {N}分後の状態に戻ります
":later {N}h    {N}時間後の状態に戻ります
"persistent_undoが設定されていない時にUndoをファイルに落とす
":wundo <undofile>
"それを読み込む
";rundo <undofile>

"surround系
"http://blog.scimpr.com/2012/09/08/surround-vimチュートリアルをためす/
"Change Surroucol("$")nd
"cs"'
"Change Surround x to Tag
"cs'<q>
"Change Surround Tag to x
"cst"
"Delete Surround
"ds"
"You Surround x
"ysiw]
"空白つきのカッコで囲む
"cs]{
"行全体を囲む
"yss)
"削除する
"ds{ds)
"You Surround x with Tag
"ysiw<pre>

"vim-easy-align
"https://github.com/junegunn/vim-easy-align
"texile table
"gaip*|
"Live
"gaip<C-P>*|<CR><CR>......|
"Mergin
"gaip<C-P>*|<C-R> or <C-L>|

"vim-gist
"https://github.com/mattn/vim-gist
"Token https://github.com/settings/tokens -> allow gist
"echo token <token > .gist-vim
"git config --global github.user 'kotashiratsuka'
"Create a private gist.
":Gist -P
"Create a public gist.
":Gist -P
"list user gist
":Gist -l kotashiratsuka
"Update Gist
":Gist -l kotashiratsuka > choise -> edit -> ZZ
"or
":Gist -e eac44d7e569f3721be5a12b8c221cab6 -> ZZ

"Vimでヤンクした内容を複数行にペーストする
"Ctrl+v -> } -> I Ctrl+r -> " -> ESC

"https://nanasi.jp/articles/howto/file/expand.html
"拡張子を変更して保存
":w %<.bak
"一つ上のディレクトリに.bakで保存
":w ../%:t.bak
"今開いてファイルパスにcd
":cd %:h
"mkdirし忘れてファイル作りたい時
":mkdir -p %:h

"カレントディレクトリ以下でファイル名を検索して開く
":find <filename>

"http://nanasi.jp/articles/vim/hz_ja_vim.html
"vmode 入力 実行される変換
"gHL                  可能な文字を全て半角に変換する
"gZL                  可能な文字を全て全角に変換する
"gHA                  ASCII文字を全て半角に変換する
"gHH                  ASCII文字を全て半角に変換する
"gZA                  ASCII文字を全て全角に変換する
"gHM                  記号を全て半角に変換する
"gZM                  記号を全て全角に変換する
"gHW                  英数字を全て半角に変換する
"gZW                  英数字を全て全角に変換する
"gHJ                  カタカナを全て半角に変換する
"gZJ                  カタカナを全て全角に変換する
"gZZ                  カタカナを全て全角に変換する
"comman               "{target}実行される変換
"han_all              全ての全角文字→半角
"han_ascii            全角アスキー→半角
"han_kana             全角カタカナ→半角
"han_eisu             全角英数→半角
"han_kigou            全角記号→半角
"zen_all              全ての半角文字→全角
"zen_ascii            半角アスキー→全角
"zen_kana             半角カタカナ→全角
"zen_eisu             半角英数→全角
"zena paragraph_kigou 半角記号→全角

"変更した箇所にジャンプ
"g; g,

"モーション系でよく使うの
"https://vim-jp.org/vimdoc-ja/motion.html
"delete a paragraph
"dap
"visual select inner paragraph
"vip
"ynk inner sentence
"yis
"c/text/<Enter>

"vim-visual-multi
"https://github.com/mg979/vim-visual-multi/wiki
"Ctrl-Clickでカーソル作成してあとは好きに
"\\\ -> 矢印キー -> \\\ -> 矢印 -> でもok
"実はかなり高度な機能もあるが覚えきれない
"モードが拡張モードとカーソルモードの2つあり、モードに入った状態ではそれをTABでトグルできる
"S-UP/Downでカーソル作るもしくはV選択状態で\\cでカーソル作れる、もしくは<C-d<で拡張Vモード移行、もしくは\\aで拡張Vモード選択状態に移行できる
"SHIFT-矢印でもモード移行する
"カーソルの=とか"で揃える方法
""の場合、f" -> \\a で整列
""と=の2つで整列したい場合、2\\<"=で整列 2を3にすると3キャラ考慮で整列
"選択された部分を検索して置き換えset inccommand=split
"_を-にする場合は R -> _ -> -
"もしくは、Vモードで選択 -> TABで拡張モード -> \\cカーソル作成 -> -> sEとか -> Rで置き換え -> _ -> Enter -> - Enter
"\\Rで行おき、もう1回\\Rで3行おきもう1回...
"拡張モードで\\fでフィルタ、\\sで正規表現でフィルタ、\\`でメニュー

"非ASCII文字を検索
"https://qastack.jp/programming/16987362/how-to-get-vim-to-highlight-non-ascii-characters
"/[^\d0-\d127]
"[^\x00-\x7F]

"複数のサーバーの設定ファイルを見比べて編集する
"vi -d -O scp://www{1..3}///etc/apache24/httpd.conf -c ':diffthis'

"コマンドモードの内部コマンドの出力をaレジスタへリダイレクトする
":redir @a
":silent map
":redir END"

""vim-abolish.vim
":%s/facilities/buildings/g
":%s/Facilities/Buildings/g
":%s/FACILITIES/BUILDINGS/g
"としなければいけないのを
":%S/facilit{y,ies}/building{,s}/g
"で一発
"
"snake_case     (crs)
"MixedCase      (crm)
"camelCase      (crc)
"snake_case     (crs)
"UPPER_CASE     (cru)
"dash-case      (cr-)
"dot.case       (cr.)
"space case     (cr<space>)
"and Title Case (crt)

"forced-motionを使ったコメントインアウト
"c c-V}#<ESC>p
"でカーソル行、位置から一段落コメントアウト、}はapやipでも好きなやつ
"d<c-v>ipでコメントイン
"c-v apやipのほうがいいかも
"c c-v ap #<ESC>p
"コメントアウトは素直にビジュアル使ったほうがundoが一段だからいいかも
"vip <c-v>I#<ESC>
"が、コメントインはforced-motionのほうが速い
"d<c-v>ip<

"}}}
276
276
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
276
276