気分がいいのでvimの設定ファイルをさらしてみる

Mac

うまいことObjective-cでのMacとかiPhoneアプリ開発の設定ができて気分がよくなってきたので、どんな設定をしているのかとさらしてみることにします。設定ファイルの書き方がめちゃくちゃなのは仕様です。きれいに書くなんて機能は実装されてないのであしからず。

neoui.vimとcocoa.vimはプラグインの中身をいじって書き換えたものを使ってます。でわ。



" vim: set foldmethod=marker:
" 概要をみるためにどこかにファイルを保存じて  vimgrep /^"\s*[^}"]/ %  するといいかも
"

if has ('gui_macvim')

" コマンドキーを使う
set macmeta

"
endif

" ============================================================
" vimの設定
"
" ============================================================
" 基本設定 "{{{
"
syntax on
filetype plugin on
filetype indent on

" カラースキーマをロードする
colorscheme stakatomo

" viとの互換機能をオフにする
set nocompatible

" 起動時の画面を表示しない
set shortmess=aTI

" menuは英語で表示させる
set langmenu=none

" ヘルプを日本語で表示する
set helplang=ja

" Set keyword help.
set keywordprg=:help

" 他のアプリケーションで編集されたファイルは自動で読み直す
set autoread

" 編集中に他のファイルを開けるようにする
set hidden

" カーソルが行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]

" 毎行の前に行番号を表示する。(有効:number/無効:nonumber)
set number

" 移動キーを押しても括弧の強調を有効にする
set cpoptions-=m
set matchtime=3

" <>にもマッチするようにする
set matchpairs+=<:>

" バックアップファイルを作らない
set nobackup

" swapファイルを作らない
set noswapfile

" viminfoファイルの置き場所を指定する
set viminfo+=n~/.vim/tmp/viminfo

" ファイルを自動で保存する
set autowriteall

" 何も操作をしていないと判定される時間
set updatetime=1000
set updatecount=1000

" <Leader>を押してから キャンセルされるまでの時間.
set timeout timeoutlen=2500 ttimeoutlen=50

" クリップボードを使う
set clipboard& clipboard+=unnamed

" Visual選択で選択されたテキストが、自動的にクリップボードレジスタ "*" にコピーされる。
set guioptions+=a

" オンのときは、ウィンドウの幅より長い行は折り返され、次の行に続けて表示される。(有効:wrap/無効:nowrap)
set wrap

" 新しい行を開始したとき (Insertモードで <CR> を打ち込むか、コマンド "o"や "O" を使ったとき)、新しい行のインデントを現在行と同じくする。(有効:autoindent/無効:noautoindent)
set autoindent smartindent

" Anywhere SID.
function! s:SID_PREFIX()
    return matchstr(expand('<sfile>'), '<SNR>\d\+_')
endfunction

" plugin用にキーマップを解放する
nnoremap ; <Nop>
xnoremap ; <Nop>
nnoremap m <Nop>
xnoremap m  <Nop>
nnoremap ,  <Nop>
xnoremap ,  <Nop>

" \の代わりに'm'を使えるようにする
"     ','より押しやすい。
"     プラグイン用設定の前に設定しないとうまくマッピングされない。
let mapleader = 'm'
" グローバルプラグインでは <Leader> を使用
let g:mapleader = 'm'
" ファイルタイププラグインでは <LocalLeader> を使用
"     'm'の隣だから','を使用する。
let g:maplocalleader = ','

" autocmd の定義
augroup MyAutoCmd "{{{

	autocmd!

	"     何も操作をしていないときに保存する
	autocmd CursorHold * call g:my_auto_update()
	autocmd CursorHoldI * call g:my_auto_update()

	"     Easily load VimScript.
	autocmd FileType vim nnoremap <silent><buffer> [Space]rr  :source $MYVIMRC \|  echo "source " . bufname('%')<CR>
	"" autocmd FileType vim nnoremap <silent><buffer> [Space]rr  :source $MYVIMRC \| source $MYGVIMRC \| echo "source " . bufname('%')<CR>

	"     ヘルプをqだけで閉じる
	autocmd FileType help,git-status,git-log,qf nnoremap <buffer> q <C-w>c
	autocmd FileType qf nnoremap <buffer> <TAB> :<C-u>call g:MovePreviousWindow()<CR>

	""     バッファを開いたらそこをカレントディレクトリにする
	""autocmd BufEnter * call g:my_lcd()

	"     カーソルの位置を保存する。
	autocmd BufReadPost *
		\ if line("'\"") > 0 && line("'\"") <= line("$") |
		\   exe "normal g`\"" |
		\ endif

	"     改行したときに自動でコメントアウトするのをやめる。
	autocmd FileType * setlocal formatoptions-=ro

	"     入力されているテキストの最大幅。行がそれより長くなると、この幅を超えないように空白の後で改行される。値を 0 に設定すると無効になる。
	autocmd FileType * setlocal textwidth=0

	"     vimshellでフォルダ間のタブ文字を表示させない
	autocmd FileType vimshell,vimshell-term setlocal nolist

augroup END

" 自動保存をするための関数 "{{{
function! g:my_auto_update()
	let update_fname=expand("%")
	if filereadable(update_fname) == 1
		if &filetype != 'gitcommit'
			update
		endif
	endif
	return
endfunction
"}}}

" カレントディレクトリを編集しているファイルの位置にするための関数 "{{{
function! g:my_lcd()
	if &filetype != 'gitcommit'
		execute ":lcd " . escape(expand("%:p:h:"), " #\\")
	endif
endfunction

"}}}

"}}}

"}}}

"
" ============================================================
" ステータスバーの表示 "{{{
" 

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

" コマンドをコマンドラインに表示する
set showcmd

" カーソルが何行目の何列目にあるのか表示する
set ruler

" ステータスバーを表示するタイミング 0:表示しない 1:ウィンドウの数が2つ以上で表示 2:常に表示
set laststatus=2

" ステータスバーに表示する内容
set statusline=[%{winnr('$')>1?''.winnr().'/'.winnr('$'):''}]\ %<\ %f\ %m%r%h%w%y%{'['.(&fenc!=''?&fenc:&enc).'\|'.&ff.']'}%=%l/%L\ (%P)

"}}}

"
" ============================================================
" 検索の設定"{{{
" 

" 検索がファイル末尾まで進んだら、ファイル先頭から再び検索する。(有効:wrapscan/無効:nowrapscan)
set wrapscan

" 検索パターンにおいて大文字と小文字を区別しない。(有効:ignorecase/無効:noignorecase)
set ignorecase

" 検索パターンが大文字を含んでいたらオプション 'ignorecase' を上書きする。(有効:smartcase/無効:nosmartcase)
set smartcase

" インクリメンタルサーチ
set incsearch

set magic

" 前回の検索パターンが存在するとき、それにマッチするテキストを全て強調表示する。(有効:hlsearch/無効:nohlsearch)
set nohlsearch

" GrepをVim標準のGrepにする
set grepprg=grep

"}}}

"
" ============================================================
" コマンドラインをコマンドウィンドウで処理する設定 "{{{

nnoremap <SID>(command-line-enter) q:
xnoremap <SID>(command-line-enter) q:
nnoremap <SID>(command-line-norange) q:<C-u>

nmap :  <SID>(command-line-enter)
xmap :  <SID>(command-line-enter)

autocmd MyAutoCmd CmdwinEnter * call s:init_cmdwin()
function! s:init_cmdwin()
	nnoremap <buffer> q :<C-u>quit<CR>
	nnoremap <buffer> <TAB> :<C-u>quit<CR>

	" Completion.
	inoremap <buffer><expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"

	startinsert!
endfunction
"}}}

"
" ============================================================
" TABなどの表示"{{{
" 

" ファイル内の <TAB> が対応する空白の数。
set tabstop=4

" <TAB> の挿入や <BS> の使用等の編集操作をするときに、<TAB> が対応する空白の数。
set softtabstop=4
" インデントの各段階に使われる空白の数。
set shiftwidth=4
" Insertモードで <TAB> を挿入するとき、代わりに適切な数の空白を使う。(有効:expandtab/無効:noexpandtab)
set noexpandtab

" タブ文字を CTRL-I で表示し、行末に $ で表示する。(有効:list/無効:nolist)
set list

" Listモード (訳注: オプション 'list' がオンのとき) に使われる文字を設定する。
set listchars=tab:>-,extends:<,trail:-

" 全角スペースを視覚化
highlight ZenkakuSpace guifg=#333
match ZenkakuSpace / /

" 横分割したウィンドウは左につくる
set splitbelow

" 縦分割したウィンドウは下につくる
set splitright

" Increase history amount.
set history=200

" Display all the information of the tag by the supplement of the Insert mode.
set showfulltag

" Can supplement a tag in a command-line.
set wildoptions=tagfile

" Adjust window size of preview and help.
set previewheight=15
set helpheight=15

"}}}

"
" ============================================================
" プラグインの設定"{{{
" 

" プラグインをフォルダで管理する "{{{
" ~/.vim/{pluginName}をruntimepathに追加
"     runtimepathの初期化
set runtimepath&

function! s:SetOtherPluginsPath()
"     addon 直下のディレクトリを取得
	let dir = '$HOME/.vim/addon/'
	let dirs = map(split(glob(fnamemodify(dir, ':p').'*/'), '\n'),
		\	'fnamemodify(v:val, ":h")')

"     addon 直下のディレクトリのafterも生成
	let dirsAfter = map(copy(dirs), 'v:val."/after"')

	execute "set runtimepath&"
	let &runtimepath = join(dirs + [&runtimepath] + dirsAfter, ',')
endfunction

call s:SetOtherPluginsPath()
"}}}

"
" neocomplcacheの設定 ===================="{{{

"
" neocomplcache の基本設定 "{{{
let g:neocomplcache_enable_at_startup              = 1
let g:neocomplcache_manual_completion_start_length = 1
let g:neocomplcache_auto_completion_start_length = 2
let g:neocomplcache_enable_smart_case = 0
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_enable_underbar_completion = 1
let g:NeoComplCache_EnableCursorHoldI = 1
let g:neocomplcache_min_syntax_length = 2
let g:neocomplcache_min_keyword_length = 2
let g:neocomplcache_enable_auto_select = 0
let g:neocomplcache_caching_limit_file_size = 100000000
let g:neocomplcache_enable_quick_match = 1
" quickmatchは<C-Space> で表示する
let g:neocomplcache_quick_match_patterns = {'default' : ' '}
let g:neocomplcache_temporary_dir = $HOME . '/.vim/tmp/neocon'
let g:neocomplcache_snippets_dir = $HOME . '/.vim/share/snippets'
"}}}

" neocomplcacheのキーバインド "{{{
imap <expr><C-k> neocomplcache#sources#snippets_complete#expandable() ? "\<Plug>(neocomplcache_snippets_expand)" : "\<C-k>"
smap <C-k> <Plug>(neocomplcache_snippets_expand)

imap <C-l> <Plug>(neocomplcache_snippets_jump)
smap <C-l> <Plug>(neocomplcache_snippets_jump)

"     C-nでneocomplcache補完
inoremap <expr><C-n>  pumvisible() ? "\<C-n>" : "\<C-x>\<C-u>\<C-p>"
"     C-pでkeyword補完
inoremap <expr><C-p> pumvisible() ? "\<C-p>" : "\<C-p>\<C-n>"

inoremap <expr><Up> pumvisible() ? neocomplcache#cancel_popup()."\<Up>" : "\<Up>"
inoremap <expr><Down> pumvisible() ? neocomplcache#cancel_popup()."\<Down>" : "\<Down>"

"     <Space>: close popup and insert space.
inoremap <expr><C-j>  pumvisible() ? neocomplcache#close_popup() : "\<C-g>"
inoremap <expr><C-e> pumvisible() ? neocomplcache#cancel_popup() : "\<C-o>\$"
"     AutoComplPop like behavior.
inoremap <expr><C-h> pumvisible() ? neocomplcache#cancel_popup()."\<C-h>" : "\<C-h>"
inoremap <expr><BS> pumvisible() ? neocomplcache#cancel_popup()."\<BS>" : "\<BS>"
inoremap <expr><CR> pumvisible() ? neocomplcache#cancel_popup()."\<CR>" : "\<C-R>=delimitMate#ExpandReturn()\<CR>"
"}}}

" neocomplcacheの補完を開始する文字の長さ "{{{
let g:neocomplcache_plugin_completion_length_list = {
			\ 'omni_complete' : 2,
			\ 'snippets_complete' : 1,
			\ 'tags_complete' : 4,
			\ 'buffer_complete' : 2,
			\ 'include_complete' : 2,
			\ 'syntax_complete' : 2,
			\ 'filename_complete' : 2,
			\ 'keyword_complete' : 2
			\ }
"}}}

" neocomplcacheのオムニ補完を開始するパターン "{{{
let g:neocomplcache_omni_patterns = {
			\ 'php'  :  '[^. \t]->\h\w*\|\$\h\w*\|\%(=\s*new\|extends\)\s\+\|\h\w*::',
			\ 'perl' :  '\%(\h\w*\|)\)->\h\w*\|\h\w*::',
			\ 'c'    :  '\h\w\+\|\%(\h\w*\|)\)\%(\.\|->\)\h\w*',
			\ 'cpp'  :  '\%(\h\w*\|)\)\%(\.\|->\)\h\w*\|\h\w*::',
			\ }
"}}}

" neocomplcacheの補完辞書の位置 "{{{
let g:neocomplcache_dictionary_filetype_lists = {
			\ 'default' : '',
			\ 'objc'    : $HOME . '/.vim/dict/objc.dict'
			\ }
"}}}

" neocomplcacheがキーワードとして取得するパターン "{{{
if !exists('g:neocomplcache_keyword_patterns')
	let g:neocomplcache_keyword_patterns = {}
endif
let g:neocomplcache_keyword_patterns['default'] = '\h\w*'
let g:neocomplcache_keyword_patterns['perl'] = '\h\w*'
let g:neocomplcache_keyword_patterns['objc'] = '\h\w*'
"}}}

"}}}

"
" neouiの設定 ==================== "{{{

"
" neouiの基本設定
let g:neoui_temporary_dir=$HOME . '/.vim/tmp/neoui'

let g:neoui_temporary_dir = expand(g:neoui_temporary_dir)
if !isdirectory(g:neoui_temporary_dir)
  call mkdir(g:neoui_temporary_dir, 'p')
endif

let g:neoui_source_file_mru_file=$HOME . '/.vim/tmp/neoui/vimru'
call neoui#custom_prefix('common', '~', substitute($HOME, '\\', '/', 'g'))

" neouiのキーバインド

nnoremap [NeoUI] <Nop>
nmap ; [NeoUI]
nnoremap C    ;
"     bufferとかファイルを開く
nnoremap <silent> [NeoUI]f :<C-u>NeoUI file file/mru<CR>
"     commandの履歴を開く
nnoremap <silent> [NeoUI]c :<C-u>NeoUI cmd/mru<CR>
"     検索の履歴を開く
nnoremap <silent> [NeoUI]s :<C-u>NeoUI search/mru<CR>
"     QuickFixの検索結果からファイルを開く
nnoremap <silent> [NeoUI]g :<C-u>NeoUI quickfix/buffer<CR>

"}}}

"
" QFixGrepの設定 ===================="{{{
"     注意;タブでwindowを移動するためにmyqfix.vimの<C-i>へのキーマップを削除してある。

"
" QFixGrepの基本設定
let mygrepprg = 'grep'
let MyGrep_ShellEncoding = 'utf-8'
let MyGrep_Resultfile = $HOME.'/.vim/tmp/qfixgrep.txt'

" QFixGrep のキーバインド
"     The prefix key.
nnoremap [Quickfix]   <Nop>
nmap    q  [Quickfix]
"     Disable Ex-mode.
nnoremap Q  q

nnoremap  [Quickfix]g  :<C-u>Grep<Space>
nnoremap  [Quickfix]b  :<C-u>BGrep<Space>
nnoremap <silent> [Quickfix]n  :<C-u>cnext<CR>
nnoremap <silent> [Quickfix]p  :<C-u>cprevious<CR>

"     Quickfix window.
nnoremap <silent> [Quickfix]<Space>       :<C-u>ToggleQFixWin<CR>
nnoremap <silent> [Quickfix]ff             :<C-u>MoveToQFixWin<CR>

" QuickFixウィンドウを左に縦分割
let QFix_CopenCmd = 'vertical topleft'

" QuickFixウィンドウの高さ
let QFix_Height = 15
let QFix_Width = 86

" QFixPreviewのファイルタイプのハイライトをしない。
let QFix_PreviewFtypeHighlight=0

" ハイスピードプレビューを有効にする
let QFix_HighSpeedPreview = 1

" QFixGrepの検索時にカーソル位置の単語を拾う/拾わない
let MyGrep_DefaultSearchWord = 1

" Exclude pattern.
let MyGrep_ExcludeReg =
	\'[~#]$\|\.bak$\|\.swp$\.o$\|\.obj$\|\.exe$\|\.dll$\|\.pdf$\|\.doc$\|\.xls$\|[/\\]tags$\|.cvs[/\\]\|.git[/\\]\|.svn[/\\]'

"}}}

"
" vimShellの設定 ===================="{{{
"     ftpluginにも設定あり
"
" vimshellの基本設定
let g:vimshell_prompt = $USER."% "
let g:vimshell_smart_case = 1
let g:vimshell_temporary_directory=$HOME . '/.vim/tmp/vimshell'
let g:vimshell_external_history_path=$HOME . '/.zsh/zsh_history'
let g:vimshell_split_height=50
let g:vimshell_split_command='NicelyWindowSplit'

" vimshellのキーバインド
"     <C-\>でvimshellをポップアップする
nnoremap <silent><C-\> :<C-u>VimShellPop<CR>
inoremap <silent><C-\> <Esc>:<C-u>VimShellPop<CR>

"}}}

"
" Nerd_commenterの設定 ===================="{{{

"
" Nerd_Commenter の基本設定
let g:NERDCreateDefaultMappings = 0
let NERDSpaceDelims = 1
let NERDShutUp = 1

" Nerd_commenterのキーバインド
"     [Space]cc でコメントをトグル
nmap [Space]cc <Plug>NERDCommenterToggle
vmap [Space]cc <Plug>NERDCommenterToggle

"     [Space]csでセクシーなコメント
nmap [Space]cs <Plug>NERDCommenterSexy
vmap [Space]cs <Plug>NERDCommenterSexy

"     [Space]cdでコメントをはずす
nmap [Space]cd <Plug>NERDCommenterUnComment
vmap [Space]cd <Plug>NERDCommenterUnComment

"     [Space]caでコメントを追加して文字列入力
nmap [Space]ca <Plug>NERDCommenterAppend

"}}}

"
" quickrunの設定 ===================="{{{
"
" backgroundで実行する
let g:quickrun_config = {
\   '*': {'runmode': 'async:remote:vimproc'},
\ }

"}}}

"
" project.vimの設定 ===================="{{{

"
" projectウィンドウの幅
let g:proj_window_width=30
" projectウィンドウに設定するflag
let g:proj_flags="imst"

" project.vimのキーバインド
"     [Space]prでprojectウィンドウをトグル
nmap <silent> [Space]pp <Plug>ToggleProject

"}}}

"
" git-vimの設定 ==================== "{{{

"
" git-vimの基本設定
"     デフォルトのキーマップを使用しない。
let g:git_no_map_default = 1

" git-vimのキーバインド
nnoremap [Space]gd :<C-u>GitDiff --cached<Enter>
nnoremap [Space]gD :<C-u>GitDiff<Enter>
nnoremap [Space]gg :<C-u>GitStatus<Enter>
nnoremap [Space]gl :<C-u>GitLog<Enter>
nnoremap [Space]gL :<C-u>GitLog -u \| head -10000<Enter>
nnoremap [Space]ga :<C-u>GitAdd<Enter>
nnoremap [Space]gA :<C-u>GitAdd <cfile><Enter>
nnoremap [Space]gc :<C-u>GitCommit<Enter>
nnoremap [Space]gC :<C-u>GitCommit --amend<Enter>
nnoremap [Space]gp :<C-u>Git pull
nnoremap [Space]gP :<C-u>Git push

"}}}

"
" taglistの設定 ==================== "{{{
set tags=tags

let g:Tlist_Auto_Update = 1
let g:Tlist_Show_One_File = 0
let g:Tlist_Exit_OnlyWindow = 1
let g:Tlist_Use_Right_Window = 0
let g:Tlist_WinWidth = 40
let g:tlist_objc_settings='objc;P:protocols;i:interfaces;I:implementations;M:instance methods;C:implementation methods;Z:protocol methods;v:property'
let g:tlist_javascript_settings = 'javascript;v:var;c:class;p:prototype;m:method;f:function;o:object'

nnoremap <silent> [Space]tt :<C-u>Tlist<CR>1<C-w>l

"}}}

"
" bufferexplore の設定 "{{{
nnoremap [NeoUI]; :BufExplorer<CR>

"}}}

"
" easytagsの設定
let g:easytags_cmd = $HOME . '/local/bin/ctags'
let g:easytags_file = '~/.vim/share/tags'
let g:easytags_always_enabled = 1
let g:easytags_resolve_links = 1

"
" delimitMateの設定
"inoremap <Space> <C-R>=delimitMate#ExpandSpace()<CR>
"}}}

"
" ============================================================
" キーマップ "{{{

map  <C-Space> <C-@>
cmap <C-Space> <C-@>

map <F1> <Nop>

map  <C-c> <Esc>
cmap <C-c> <Esc>
"
" 移動 表示行単位で移動 "{{{
noremap j gj
noremap k gk
vnoremap j gj
vnoremap k gk

"}}}

"
" オプションを切り替えるキーマップ "{{{

nnoremap <silent> <Esc><Esc> :<C-u>call ToggleOption('hlsearch')<CR><Esc>

" Toggle options. "{{{
function! ToggleOption(option_name)
    execute 'setlocal' a:option_name.'!'
    execute 'setlocal' a:option_name.'?'
endfunction  "}}}

"}}}

"
" インサートモードのキーマップ"{{{
"     <C-d>: delete char.
inoremap <C-d> <Del>

"     <C-a>:move move to head.
inoremap <silent><C-a>  <C-o>^

"     <C-f>, <C-b>: page move.
inoremap <expr><C-f>  pumvisible() ? neocomplcache#cancel_popup()."\<Right>" : "\<Right>"
inoremap <expr><C-b>  pumvisible() ? neocomplcache#cancel_popup()."\<Left>"   : "\<Left>"

"     <A-b>: previous word.
inoremap <A-b>  <S-Left>
"     <A-f>: next word.
inoremap <A-f>  <S-Right>

"     Enable undo <C-u>.
inoremap <C-u>  <C-g>u<C-u>

"     <C-_>: toggle preview window.
inoremap <silent><C-_>  <C-o>:<C-u>call<SID>preview_window_toggle()<CR>

"     <A-d>: delete to end.
inoremap <A-d>  <C-o>D
inoremap <C-k>  <C-o>D

"     <A-j>: <Down> <A-k>: <Up>
inoremap <expr><A-j>  pumvisible() ? neocomplcache#cancel_popup()."\<Down>" : "\<Down>"
inoremap <expr><A-k>  pumvisible() ? neocomplcache#cancel_popup()."\<Up>" : "\<Up>"
inoremap <expr><A-h>  pumvisible() ? neocomplcache#cancel_popup()."\<Left>" : "\<Left>"
inoremap <expr><A-l>  pumvisible() ? neocomplcache#cancel_popup()."\<Right>" : "\<Right>"

"}}}

"
" コマンドラインモードのキーマップ"{{{

"     <C-a>, A: move to head.
cnoremap <C-a>          <Home>

"     <C-b>: previous char.
cnoremap <C-b>          <Left>

"     <C-d>: delete char.
cnoremap <C-d>          <Del>

"     <C-e>, E: move to end.
cnoremap <C-e>          <End>

"     <C-f>: next char.
cnoremap <C-f>          <Right>

"     <C-n>: next history.
cnoremap <C-n>          <Down>

"     <C-p>: previous history.
cnoremap <C-p>          <Up>

"     <C-k>, K: delete to end.
cnoremap <C-k>          <C-f>d$<C-c><End>

"     <C-y>: paste.
cnoremap <C-y>          <C-r>"

"     <C-s>: view history.
cnoremap <C-s>          <C-f>

"     <C-l>: view completion list.
cnoremap <C-l>          <C-d>

"     <A-b>, W: move to previous word.
cnoremap <A-b>          <S-Left>

"     <A-f>, B: move to next word.
cnoremap <A-f>          <S-Right>

"     <C-j>, <C-o>: move to next/previous candidate.
"     High-speed than ring TAB repeatedly.
cnoremap <C-j>          <C-n>
cnoremap <C-o>          <C-p>
cnoremap <S-TAB>        <C-p>

"     <C-g>: decide candidate.
cnoremap <C-g>          <Space><C-h>

"     <C-t>: insert space.
cnoremap <C-t>          <Space>

"     <C-c>: Esc
cnoremap <C-c>          <C-c>

"}}}

"
" Window buffer 操作のキーマップ "{{{
"     ほかのwindowを閉じる
nnoremap <silent> <D-1> :<C-u>only<CR>
"     windowの自動分割
nnoremap <silent> <D-2> :<C-u>NicelyWindowSplit<CR>
"     windowの大きさを均一にする
nnoremap <silent> <D-3> <C-w>=
"     window の入れ替え
nnoremap <silent> <D-4> <C-w>H
nnoremap <silent> <D-5> <C-w>K
nnoremap <silent> <D-6> <C-w>J
nnoremap <silent> <D-7> <C-w>L
"     windowを閉じる
nnoremap <silent> <D-0> :<C-u>close<CR>
"     バッファを削除する
nnoremap <silent> <D-9> :<C-u>call <SID>CustomBufferDelete(0)<CR>:if winnr() != 1 <Bar> close<CR>:endif<CR>
nnoremap <silent> <D-8> :Kwbd<CR>
"     windowの移動
nnoremap <silent> <TAB> <C-w>w

"     ウィンドウの大きさで縦分割/横分割を判断して分割する関数 "{{{
command! NicelyWindowSplit call g:nicely_window_split()
function! g:nicely_window_split()
	if winwidth(0) > 3.5 * &winwidth
		vsplit
	else
		split
	endif
endfunction "}}}

"     Delete current buffer する関数"{{{
function! s:CustomBufferDelete(is_force)
    let current = bufnr('%')

    call s:CustomAlternateBuffer()

    if a:is_force
        silent! execute 'bdelete! ' . current
    else
        silent! execute 'bdelete ' . current
    endif
endfunction
"}}}

"     Fast buffer switch する関数 "{{{
function! s:CustomAlternateBuffer()
    if bufnr('%') != bufnr('#') && buflisted(bufnr('#'))
        buffer #
    else
        let l:cnt = 0
        let l:pos = 1
        let l:current = 0
        while l:pos <= bufnr('$')
            if buflisted(l:pos)
                if l:pos == bufnr('%')
                    let l:current = l:cnt
                endif

                let l:cnt += 1
            endif

            let l:pos += 1
        endwhile

        if l:current > l:cnt / 2
            bprevious
        else
            bnext
        endif
    endif
endfunction
"}}}

"     一つ前の分割ウィンドウに戻るための関数
function! g:MovePreviousWindow() "{{{
    let l:prev_name = winnr()
    silent! wincmd p
    if l:prev_name == winnr()
        silent! wincmd w
    endif
endfunction
"}}}

"     ウィンドウを閉じないでバッファを閉じる。
command! Kwbd let kwbd_bn= bufnr("%")|enew|exe "bdel ".kwbd_bn|unlet kwbd_bn 

"}}}

"
" [Space]: Other useful commands "{{{
"     スペースキーのマッピングを見やすくする
"         noremapに<Space>で始まるものを使うと[Space]が表示されなくなるので注意!
nmap  <Space>   [Space]
xmap  <Space>   [Space]
nnoremap  [Space]   <Nop>
xnoremap  [Space]   <Nop>

"     Easily edit .vimrc and .gvimrc "{{{
nnoremap <silent> [Space]ev  :<C-u>edit $MYVIMRC<CR>

"}}}

"     Easily ctags command."{{{
nnoremap <silent> [Space]tr :<C-u>silent !ctags -R<CR>
"     Easily helptags command.
nnoremap <silent> [Space]td :<C-u>helptags ~/.vim/doc<CR>
"     Easily edit Snippets
nnoremap <silent> [Space]se :<C-u>NeoComplCacheEditSnippets<CR>
"}}}

"}}}

"
" Move search word to middle screen."{{{
nnoremap n  nzz
nnoremap N  Nzz
nnoremap *  *zz
nnoremap #  #zz
nnoremap g*  g*zz
nnoremap g#  g#zz
"}}}

"
" 0: Preview window "{{{
"     The prefix key.
nnoremap [Preview]   <Nop>
nmap    -  [Preview]

"     Toggle preview window."{{{
nnoremap <silent> [Preview]-  :<C-u>call<SID>preview_window_toggle()<CR>
function! s:preview_window_toggle()
    silent! wincmd P
    if &previewwindow
        pclose
    elseif expand('%') != ''
        mkview
        silent! pedit
        silent loadview
        if foldclosed(line('.')) != -1
            "" Open folding.
          normal! zOgv0
        endif
    else
        normal! ma
        silent! pedit
        normal! `a
        if foldclosed(line('.')) != -1
            "" Open folding.
            normal! zOgv0
        endif
    endif
endfunction"}}}

"     Open preview window.
nnoremap [Preview]o  :<C-u>pedit<CR>
"     Close preview window.
nnoremap [Preview]c  :<C-u>pclose<CR>

"     Move to preview window."{{{
nnoremap <silent> [Preview]p :<C-u>call<SID>move_to_preview_window()<CR>

function! s:move_to_preview_window()
    if &previewwindow
        wincmd p
    else
        silent! wincmd P
    endif
endfunction"}}}
"}}}

"}}}

"
" ============================================================
" objective-c の設定 "{{{

augroup ObjectiveC
	autocmd!
	" ビルドして実行
	autocmd FileType objc nnoremap <buffer><silent> <d-r> :w<bar>call XcodeCommand('36')<CR>
	autocmd FileType objc inoremap <buffer><silent> <d-r> <Esc>:w<bar>call XcodeCommand('36')<CR>

	" ビルドするだけ
	autocmd FileType objc nnoremap <buffer><silent> <d-b> :w<bar>call XcodeCommand('11')<CR>
	autocmd FileType objc inoremap <buffer><silent> <d-b> <Esc>:w<bar>call XcodeCommand('11')<CR>

	" クリーニング
	autocmd FileType objc nnoremap <buffer><silent> <d-k> :w<bar>call XcodeCommand('40')<CR>
	autocmd FileType objc inoremap <buffer><silent> <d-k> <Esc>:w<bar>call XcodeCommand('40')<CR>

	" makeでxcodebuild をつかうようにする。
	autocmd FileType objc setlocal makeprg=xcodebuild\ -activetarget\ -activeconfiguration\ \\\|\ grep\ -e\ \"^/.*\"\ \\\|\ sort\ -u

	" メソッドを一覧表示
	autocmd FileType objc nnoremap <buffer> <silent> <A-2> :<c-u>ListMethods<cr>

	" プロジェクトをXcodeで開く
	autocmd FileType objc nnoremap <buffer> <silent> <A-0> :call system('open -a Xcode '.b:cocoa_proj)<cr>

	" syntaxで自動折りたたみ
	autocmd FileType objc setlocal foldmethod=syntax

	function! XcodeCommand(keycode) "{{{
	call system("open -a Xcode ".b:cocoa_proj." && osascript -e '"
		\ ."tell application \"Xcode\" to activate \r"
		\ ."tell application \"System Events\" \r"
		\ ."tell process \"Xcode\" \r"
		\ ."key code ".a:keycode." using {command down} \r"
		\ ."end tell \r"
		\ ."end tell \r'")
	endfunction
	"}}}

	" b:cocoa_proj の取得 "{{{
	if exists('b:cocoa_proj')
		finish
	endif
	let b:cocoa_proj = fnameescape(globpath(expand('<afile>:p:h'), '*.xcodeproj'))
	" Search a few levels up to see if we can find the project file
	if empty(b:cocoa_proj)
		let b:cocoa_proj  = fnameescape(globpath(expand('<afile>:p:h:h'), '*.xcodeproj'))

		if empty(b:cocoa_proj)
			let b:cocoa_proj = fnameescape(globpath(expand('<afile>:p:h:h:h'), '*.xcodeproj'))
			if empty(b:cocoa_proj)
				let b:cocoa_proj = fnameescape(globpath(expand('<afile>:p:h:h:h:h'), '*.xcodeproj'))
			endif
		endif
	endif
	let g:x = b:cocoa_proj
"}}}

	autocmd FileType objc nnoremap <buffer> <A-9> :call XcodeBuildCheck()<CR>
	autocmd FileType objc inoremap <buffer> <A-9> <C-o>:call XcodeBuildCheck()<CR>

	function! XcodeBuildCheck() "{{{
		let proj_dir = substitute(b:cocoa_proj, '\(.*\)\/.*' , '\1', '')
		let current_dir = getcwd()
		execute ":lcd " . escape(expand(proj_dir), " #\\")
		make
		execute ":lcd " . escape(expand(current_dir), " #\\")
	endfunction
	"}}}"

augroup END

"}}}

"
" ============================================================
" vimshellの設定 "{{{

augroup myVimShell
	autocmd!

	" tab文字の表示
	autocmd FileType vimshell setlocal nolist

	" vimshell のキーマップ"{{{

	"     neocomplcacheの補完をキャンセルしつつ、<C-h>をつかう設定。
	autocmd FileType vimshell imap <buffer><expr><C-h>   pumvisible() ? "\<C-e>\<Plug>(vimshell_another_delete_backword_char)" : "\<C-h>"
	autocmd FileType vimshell imap <buffer><expr><BS>    pumvisible() ? "\<C-e>\<Plug>(vimshell_another_delete_backword_char)" : "\<BS>"

	"     <TAB>でウィンドウを移動できるようにする
	autocmd FileType vimshell imap <buffer> <TAB>        <Esc><TAB>

	"     <A-\>で分割したウィンドウでvimshellを新しく起動する
	autocmd FileType vimshell nmap <buffer><silent><A-\> :NicelyWindowSplit<CR> <Plug>(vimshell_create)
	autocmd FileType vimshell imap <buffer><silent><A-\> <Esc>:NicelyWindowSplit<CR> <Plug>(vimshell_create)

"}}}

	" cdしたら自動でls -aコマンド "{{{
	autocmd FileType vimshell call vimshell#hook#set('chpwd', ['g:my_chpwd'])

	function! g:my_chpwd(args, context)
		call vimshell#execute('ls -a')
	endfunction
"}}}

augroup END
"}}}

"
" ============================================================
" Gvim用の設定
"
if has ('gui_macvim')
" ============================================================
" 色の設定 "{{{
" 

" カラースキーマをロードする
colorscheme stakatomo

" 透明度の設定
set transparency=17

" アンチエイリアスの設定
set antialias

" カーソル行の色
set cursorline

" 挿入モード時、ステータスラインの色を変更
let g:hi_insert = 'highlight StatusLine guifg=white guibg=#533166 gui=none ctermfg=blue ctermbg=yellow cterm=none'

if has('syntax')
  augroup InsertHook
    autocmd!
    autocmd InsertEnter * call s:StatusLine('Enter')
    autocmd InsertLeave * call s:StatusLine('Leave')
  augroup END
endif

let s:slhlcmd = ''
function! s:StatusLine(mode)
  if a:mode == 'Enter'
    silent! let s:slhlcmd = 'highlight ' . s:GetHighlight('StatusLine')
    silent exec g:hi_insert
  else
    highlight clear StatusLine
    silent exec s:slhlcmd
  endif
endfunction

function! s:GetHighlight(hi)
  redir => hl
  exec 'highlight '.a:hi
  redir END
  let hl = substitute(hl, '[\r\n]', '', 'g')
  let hl = substitute(hl, 'xxx', '', '')
  return hl
endfunction

"}}}

"
" ============================================================
" 画面の設定 "{{{
" 

" 画面の列幅の設定
set columns=239

" 画面の行数
set lines=76

" フルスクリーンモード
"" set fuoptions=maxvert,maxhorz
"" autocmd GUIEnter * set fullscreen 

" ツールバーの表示 非表示
set guioptions-=T

" 右スクロールバーの表示 非表示
set guioptions-=r
set guioptions-=R

" 左スクロールバーの表示 非表示
set guioptions-=l
set guioptions-=L

" フォントの設定
set guifont=Menlo\ Regular:h13
set guifontwide=あずきフォント:h14

"}}}

endif

"
" Objc 用の正規表現
"Delete-Comment s/\/\*\([^\/]\|[^*]\/\|\n\)*\*\//g
"Instance to @synthesize s/^\s\+.\+\*\(.\+;\)/@synthesize \1/g
"Instance to @synthesize - dealloc s/^@synthesize\s\+\(.\+\);/[\1 release];/g
"Instance to @property s/^\s\+/@property(nonatomic, retain) IBOutlet /g

入れているプラグインは

  • neocomplcache.vim
  • vimshell.vim、vimproc
  • cocoa.vim
  • project.vim
  • quickrun.vim
  • neoui.vim
  • surround.vim
  • NERDCommenter
  • Align
  • QFixGrep
  • matchit.vim
  • git-vim
  • bufexplorer.vim
  • lingr-vim
  • taglist.vim
  • jsbeautify.vim
  • delimitMate.vim
  • easytags.vim

しかし、長い。。。

毎日、少しずついじっているのですが、まだまだ設定しなきゃいけないことも多かったりします。とくにtagファイルだったり、includeファイルの設定だったり。。。。しかもコメントに書いてあることと違うキーバインドになっているところがあるという罠まで用意してあるという困った設定ファイルになっています。

半分ぐらいはneocomplcache.vimの作者さんが公開している設定ファイルからの移植が半分ぐらいはの割合だったりもするわけで、プラグインともどもありがたく使わせていただいています。

参考になりそうなところがあれば、使ってみてくださいね。

でわでわ、たかともでした。

Tags:

コメントはありません

完全版 VimからXcodeプロジェクトをビルド & 文法チェック♪

Mac

昨日、記事書いたばっかりですが QuickFixとの連携もできるような設定ができたので、紹介です。



augroup MyObjcAutoCmd

autocmd!
autocmd FileType objc setlocal makeprg=xcodebuild -activetarget -activeconfiguration \| grep -e "^/.*" \| sort -u

autocmd FileType objc nnoremap <buffer> <C-9> :call XcodeBuildCheck()<CR>
autocmd FileType objc inoremap <buffer> <C-9> <C-o>:call XcodeBuildCheck()<CR>

function! XcodeBuildCheck() "{{{
	let proj_dir = substitute(b:cocoa_proj, '(.*)/.*' , '1', '')
	let current_dir = getcwd()
	execute ":lcd " . escape(expand(proj_dir), " #\")
	make
	execute ":lcd " . escape(expand(current_dir), " #\")
endfunction

augroup END

b:cocoa_projを取得するために前回の記事の下の方の設定をもってくるか、cocoa.vimをいれるかのどちらかが必要です。

Xcodeでつくったクラスファイルを編集中にcontrol+9をすると自動でxcodeprojファイルのあるディレクトリにカレントディレクトリを移して、makeしてくれます。またmakeが終わった時点でカレントディレクトリをもとの場所に戻してくれる処理もいれてあります。

スクリーンショット(2010-07-18 18.26.38).png

またエラー箇所をQuickfixで見られるようになっています。grepでエラー箇所を探したあとに sort -u でエラー箇所の重複の削除をしています。もしかしたら副作用があるかもしれないです。

スクリーンショット(2010-07-18 18.27.10).png

前回の記事が嘘のような使い心地ですよ〜>< 最初からこうすればよかったと。

みなさん、ぜひぜひ設定してくださいっ!!

ちなみにVimでMacアプリケーション開発してる人、iPhoneアプリ開発してる人ってどれぐらいいるんでしょうか?

VimからXcodeを使わずにビルドしてみた。cocoa.vim必須?

Mac

Vimにcocoa.vimを導入してからすっかりXcodeはビルド用になってます。

Vim + cocoa.vimで少し不満だったのが、エラーをみたいときにいちいちXcodeとVimとをいったりきたりしないといけないというところ。わがままなのかもしれないですが、どうせならVimだけでさくっと確認したいなぁ〜と。

そんなわけでからXcodeを使わずに文法チェック(というかビルドしてるという。。。)するための設定をしてみました。



autocmd FileType objc nnoremap <buffer> <C-9> :call XcodeBuildCheck()<CR>
autocmd FileType objc inoremap <buffer> <C-9> <C-o>:call XcodeBuildCheck()<CR>

function! XcodeBuildCheck() "{{{
	let proj_dir = substitute(b:cocoa_proj, '\(.*\)\/.*' , '\1', '')
	let proj_file = substitute(b:cocoa_proj, '\(.*\)\/\(.*\)', '\2', '')
	let current_dir = getcwd()
	execute ":lcd " . escape(expand(proj_dir), " #\\")
	let error_message = system( 'xcodebuild -project ' . escape(expand(proj_file), " #\\") .' -activetarget -activeconfiguration')
	echo error_message
	execute ":lcd " . escape(expand(current_dir), " #\\")
endfunction

上のコードを.vimrcに追加するとXcodeプロジェクトに含まれているファイルを編集しているときにControl+9を押すとシステムのxcodebuildというコマンドを呼び出してビルドをしてくれて、ビルド結果が表示されるようになります。Xcodeをいちいち立ち上げしなくてもビルドできるので楽ちんです♪

やりたかったけど、できなかったこと

  • error_messageを整形するなりして表示されるメッセージを綺麗にしたかった。
  • QuickFixのウィンドウに表示して、エラー行にすぐに飛べるようにしたかった。

1つ目の「メッセージの整形」は、substitute()をつかって抽出できるかな?と試してみたのですが、うまくいかず。2つ目の「QuickFixウィンドウを使う」はできるのかどうかもわからない。そんな状態になってます。VimScriptってよくわからないんですよね。。。。そんなわけでだれか作ってくれないかなぁ〜なんて思ってしまいます。

Objective-CでVimを動かせないかな。。。。

ともあれ、Xcodeを使わずにVimだけでビルドができる & 文法エラーもチェックできるので、ぜひぜひ試してみてください。

というわけで、たかともでした。

ちなみにb:cocoa_projが取得できればcocoa.vimはいらないです。こんな感じ。



if exists('b:cocoa_proj')
	finish
endif
let b:cocoa_proj = fnameescape(globpath(expand('<afile>:p:h'), '*.xcodeproj'))
" Search a few levels up to see if we can find the project file
if empty(b:cocoa_proj)
	let b:cocoa_proj  = fnameescape(globpath(expand('<afile>:p:h:h'), '*.xcodeproj'))
		if empty(b:cocoa_proj)
		let b:cocoa_proj = fnameescape(globpath(expand('<afile>:p:h:h:h'), '*.xcodeproj'))
		if empty(b:cocoa_proj)
			let b:cocoa_proj = fnameescape(globpath(expand('<afile>:p:h:h:h:h'), '*.xcodeproj'))
		endif
	endif
endif

autocmd FileType objc setlocal makeprg=xcodebuild\ -activetarget\ -activeconfiguration
をしておいて、ビルドするときに:lcdでxcodeprojがあるディレクトリにいって:makeする方法を見つけて、泣きそうです。

まぁ、いちいち:lcdしなくてもいい利点はあるものの、やってしまった感が。。。。

ファイルを開いてもいいですか?なんて聞かれたくないんです。

Mac

Leopardになったころからだか、出てくるようになった「ファイルを開いてもいいですか?」のアラート

201007091458.jpg

ファイルを開くたびに聞かれると、作業のリズムがくずれてしまいます。

このアラートを表示させないようにするための設定が見つかったのでメモ。

~/Library/Preferencesにcom.apple.DownloadAssessment.plistという名前のファイルをつくる。内容は以下。



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>LSRiskCategorySafe</key>
	<dict>
		<key>LSRiskCategoryContentTypes</key>
		<array>
			<string>public.html</string>
			<string>public.xml</string>
			<string>public.php-script</string>
		</array>
		<key>LSRiskCategoryExtensions</key>
		<array>
			<string>xhtml</string>
		</array>
	</dict>
</dict>
</plist>

このとき別のファイル形式も追加したい場合は<array></array>の間に、<string>ファイルの拡張子</stinrg>の形式で追加していくことができます。またファイルの拡張子以外にもUTI(Uniform Type Identifiers)という指定方法もできます。上記のpublic.htmlとかはその1種類。詳しくはmac Uniform Type Identifiersでも検索してみてください。

さようなら、アラート。

こんにちは、快適な生活♪

みなさんも設定してみてくださいね。

でわでわ、たかともでした。

Tags:

コメントはありません

追記:Vimでファイルの自動保存 改良版

Mac

Vimでファイルを自動補完する際のス設定を変更しました

今回の設定だとファイルが存在すればファイルを自動で保存、ファイルが存在しなければ自動で保存しないようになります。そのため新規にファイルを作った場合だと初回だけ自分でファイルの保存をしないといけないわけですが、テストのためにちょっとしたファイルを作る→勝手に保存される→あとでファイルを消す。そんなこと状況を回避するために設定を変更しています。

と、書いたもののものすごい短い設定になってます。



" 何も操作をしていないと判定される時間
set updatetime=500
set updatecount=500

" 操作がとまったら自動で保存する
autocmd! CursorHold * if filereadable(expand("%"))!=0 | update
autocmd! CursorHoldI * if filereadable(expand("%"))!=0 | update

自動保存、さいこうです〜〜〜♪

でわでわ、たかともでした。

追記

上の設定だとQFixGrepのプレビューウィンドウが開かなくなるという自体になりました。いや、さっきまではちゃんとプレビューウィンドウも開いていたんですけど、急にQFixGrepが見つからないよ〜とエラーが出たと思ったら、プレビューウィンドウが開かなくなったという不思議ちゃん。

if以降を関数として定義→CursorHoldイベントで呼び出すと直りました。

以下、コード。autocmd!の部分を変更してください



" 操作がとまったら自動で保存する
autocmd! CursorHold * call g:my_auto_save()
autocmd! CursorHoldI * call g:my_auto_save()

function! g:my_auto_save()
    if filereadable("%")!=0
        update
    endif
    return
endfunction

でもなんで関数を定義して呼び出したら、プレビューウィンドウが開くようになったんだろう。。。

Tags:

コメントはありません

Get Adobe Flash playerPlugin by wpburn.com wordpress themes