Rethink Vim
gVimは使わない。
Vimmerになりまだ半年たっていないがWindowsのgVimにイライラ来ていたので自分のVim環境について考え直してみる。
WindowsからはCygwinで、MacからはiTremで使うことによりどこでも大体同じ環境でコーディングできるようにする。(MacVimは卒業する。)
.vimrcはHg管理下に置く。
ついでに.vimperatorrcも管理したいのでWindowsではシンボリックリンクを作成しておくことにする。(Macでは同じ場所にあるので大丈夫)
>> mklink /d "作成場所パス" "参照先パス"
でおk。(ただし、管理者権限でcmdを起動しないとダメだった)
Win7:シンボリックリンクについての詳細は
Windows7(vista)の便利機能シンボリックリンクでデータをDドライブへ逃がす - consbiol のエコ日記
Mac OS X 10.6.8 : シンボリックリンク
UNIX や Linux でシンボリックリンクを作成・削除するコマンド。 | btmup Blog
UNIXの部屋 コマンド検索:ln (*BSD/Linux)
zshは必須。
CygwinではByobu、iTermではtmuxを使うことにする。
フォントはゆたぽんです。見やすいしなごみます。
font ゆたぽん(コーディング) フォント
基本的な設定
マウスのドラッグで選択すると行番号が入ってしまうので
クリップボードへコピーがうまくいかない。
行番号の表示をマッピングしてさくっと切り替えてコピーすることに。
"viとの互換を取らない set nocompatible "行番号の表示 set number "タイトルをウィンドウ枠に表示 set title "ルーラーを表示(ステータスバーにカーソル位置を表示) set ruler "入力中のコマンドをステータスに表示する set showcmd "括弧対応表示 set showmatch "ステータスラインを常に表示 set laststatus=2 "バックスペースに関する設定 "indent : 行頭の空白削除 "eol : 改行の削除 "start : 挿入モードでの削除 set backspace=indent,eol,start "タブの幅 set ts=4 sw=4 sts=0 "新しい行を直前の行と同じインデントにする set autoindent "tabを空白に置き換えない set noexpandtab "オートインデントを有効にする set cindent "バックアップファイルを作成しない set nobackup "スワップファイルを作成しない set noswapfile "Syntax HighLight syntax on "見づらい色を変更する(背景が黒の場合見づらいので) hi Comment ctermfg=cyan hi Directory ctermfg=cyan hi SpecialKey ctermfg=cyan hi Constant ctermfg=red hi WarningMsg ctermfg=red "色の確認用コマンド command! HighLightList so $VIMRUNTIME/syntax/hitest.vim command! ColorList so $VIMRUNTIME/syntax/colortest.vim "ビープ音を鳴らさない set vb t_vb= "ClipBoardの利用 set clipboard& set clipboard+=unnamed set clipboard+=autoselect set clipboard=unnamed " 検索のハイライト set hlsearch " <ESC>×2で検索の解除 nmap <ESC><ESC> :nohlsearch<CR><ESC> "最後までサーチすると先頭に戻る set wrapscan "大文字小文字の区別をしない set ignorecase "検索文字列に大文字があった場合に反映 set incsearch "分割画面切り替えキーバインド nnoremap <C-j> <C-w>j nnoremap <C-k> <C-w>k nnoremap <C-h> <C-w>h nnoremap <C-l> <C-w>l "長い文章を折り返さない set nowrap "他で書き換えられたら自動で読み直す set autoread "保存しなくてもバッファを切り替えることができる set hidden "vimrcをいつでも簡単に(rce/rcs) nmap rc [vimrc] nnoremap <silent> [vimrc] :<C-u>e $MYVIMRC<CR> nnoremap <silent> [vimrc]v :<C-u>vs $MYVIMRC<CR> nnoremap <silent> [vimrc]s :<C-u>sp $MYVIMRC<CR> nnoremap <silent> [vimrc]r :<C-u>source $MYVIMRC<CR> "vimrcを自動更新 augroup vimrc autocmd! autocmd BufWritePost $MYVIMRC source $MYVIMRC augroup END " tabnewをいつでも簡単に nnoremap <silent> tn :<C-u>tabnew<CR> " KaoriyaのCdCurrent的なものを<Space> + cdで command! -nargs=? -complete=dir -bang CD call s:ChangeCurrentDir('<args>', '<bang>') function! s:ChangeCurrentDir(directory, bang) if a:directory == '' lcd %:p:h else execute 'lcd' . a:directory endif if a:bang == '' pwd endif endfunction "Change current directory. nnoremap <silent> <Space> cd :<C-u>CD<CR> "行番号の表示/非表示をマッピング "(クリップボードが使えないときのコピー用) nnoremap <silent> non :<C-u>set nonumber<CR> nnoremap <silent> setn :<C-u>set number<CR> "helpで:help nnoremap <silent> help :<C-u>help<CR> "vimdiffにコマンド(Diff)を割り振る "2ファイルをまとめて指定するときはデフォルトのvimdiff command! -nargs=1 -complete=file Diff vertical diffsplit <args>
Python
Pythonを快適に編集できるようvimを設定する - 玉虫色に染まれ!
Hashnote - Vimを最強のPython IDEにする
を参考に。
augroup Python_Coding au FileType python call s:python_setting() augroup END function! s:python_setting() "インデント setl autoindent setl smartindent cinwords=if,elif,else,for,while,try,except,finally,def,cl setl expandtab tabstop=4 shiftwidth=4 softtabstop=4 "PEP 8 長い行をハイライトする set textwidth=0 if exists('&colorcolumn') set colorcolumn& set colorcolumn=+1 setl textwidth=80 endif setl textwidth=80 setl colorcolumn=80 "インデントでたためるようになる setl foldmethod=indent setl foldlevel=99 endfunction
Pythonのファイルの時だけ設定を変更したいのでsetl(setlocal)を使う。
PEP 8は80文字以上の行をハイライトする設定。以下を参考に作成。
Vim-users.jp - Hack #217: 横幅が長いコードをハイライトする
使ってないけど便利そうなもの
- pysmell
- pythonの補間をサポート。
- easy-install or pipでpysmellを入れておかないと使えない。
- pyflakes
- gVimでないと使えない。
プラグイン
neobundle
プラグイン管理にはneobundleを使う。
filetype plugin indent off if has('vim_starting') set runtimepath+=~/.vim/neobundle call neobundle#rc(expand('~/.vim/bundle')) endif NeoBundle 'https://github.com/Shougo/neocomplcache.git' NeoBundle 'https://github.com/Shougo/vimshell.git' NeoBundle 'https://github.com/Shougo/vimproc.git' NeoBundle 'https://github.com/Shougo/vimfiler.git' NeoBundle 'https://github.com/Shougo/unite.vim.git' NeoBundle 'https://github.com/thinca/vim-quickrun.git' NeoBundle 'https://github.com/scrooloose/nerdtree.git' NeoBundle 'https://github.com/mattn/multi-vim.git' NeoBundle 'https://github.com/mattn/zencoding-vim.git' NeoBundle 'https://github.com/mattn/zencoding-vim.git' NeoBundle 'https://github.com/scrooloose/nerdcommenter.git' NeoBundle 'https://github.com/vim-scripts/YankRing.vim.git' NeoBundle 'https://github.com/vim-scripts/Pydiction.git' filetype plugin indent on
neocomplecache/neosnippet
あるVimmerのブログ: neocomplcache Ver.7の新機能とその設計思想について
neocom ver7から併用になった。
NeoBundle 'https://github.com/Shougo/neocomplcache.git' NeoBundle 'https://github.com/Shougo/neosnippet.git'
入れてみたが、"//"と入力すると長いことフリーズし"ユーザ定義補完 (^U^N^P) パターンは見つかりませんでした"とのメッセージが出て再びそこにカーソルを動かすと(ry
という現象が起こり、解決するにもneocomの中身はよくわからないのでペンディング。きっといつか解決されるだろう。
ver6.1に戻すことに。neocomローカルリポジトリにて。
git revert [ver 6.1のコミットハッシュコード]
READMEにあるものを大体そのまま使ってる。
" Disable AutoComplPop. let g:acp_enableAtStartup = 0 " Use neocomplcache. let g:neocomplcache_enable_at_startup = 1 " Use smartcase. let g:neocomplcache_enable_smart_case = 1 " Use camel case completion. let g:neocomplcache_enable_camel_case_completion = 1 " Use underbar completion. let g:neocomplcache_enable_underbar_completion = 1 " Set minimum syntax keyword length. let g:neocomplcache_min_syntax_length = 3 let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*' " Define dictionary. let g:neocomplcache_dictionary_filetype_lists = { \ 'default' : '', \ 'vimshell' : $HOME.'/.vimshell/command_history', \ } " Define keyword. if !exists('g:neocomplcache_keyword_patterns') let g:neocomplcache_keyword_patterns = {} endif let g:neocomplcache_keyword_patterns['default'] = '\h\w*' " Plugin key-mappings. imap <C-k> <Plug>(neocomplcache_snippets_expand) smap <C-k> <Plug>(neocomplcache_snippets_expand) inoremap <expr><C-g> neocomplcache#undo_completion() inoremap <expr><C-l> neocomplcache#complete_common_string() " SuperTab like snippets behavior. "imap <expr><TAB> neocomplcache#sources#snippets_complete#expandable() ? "\<Plug>(neocomplcache_snippets_expand)" : pumvisible() ? "\<C-n>" : "\<TAB>" " Recommended key-mappings. " <CR>: close popup and save indent. inoremap <expr><CR> neocomplcache#smart_close_popup() . "\<CR>" " <TAB>: completion. inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>" " <C-h>, <BS>: close popup and delete backword char. inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>" inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>" inoremap <expr><C-y> neocomplcache#close_popup() inoremap <expr><C-e> neocomplcache#cancel_popup() " AutoComplPop like behavior. "let g:neocomplcache_enable_auto_select = 1 " Shell like behavior(not recommended). "set completeopt+=longest "let g:neocomplcache_enable_auto_select = 1 "let g:neocomplcache_disable_auto_complete = 1 "inoremap <expr><TAB> pumvisible() ? "\<Down>" : "\<TAB>" "inoremap <expr><CR> neocomplcache#smart_close_popup() . "\<CR>"
vimproc
vimfilerの項にあるリンクにコンパイル方法があるのでそこを参考に。
OSごとにmakefileが用意されているので、合っているものを選んでコンパイルして使う。
以下のプラグインはこれがないと動かないもの多数。
vimshell
シームレスな。
nnoremap <silent> vs :<C-u>VimShell<CR> nnoremap <silent> vp :<C-u>VimShellPop<CR>
quickrun
\r。
これがないとVim使う意味がないくらい活躍している。
unite
"インサートモードで開始しない let g:unite_enable_start_insert=0 "file_mruの高速化 let g:unite_source_file_mru_filename_format = '' "キーマッピング nmap f [unite] nnoremap <silent> [unite]b :<C-u>Unite buffer<CR> nnoremap <silent> [unite]f :<C-u>Unite file<CR> nnoremap <silent> [unite]m :<C-u>Unite file_mru<CR> nnoremap <silent> [unite]c :<C-u>Unite bookmark<CR> nnoremap <silent> [unite]a :<C-u>UniteBookmarkAdd<CR> nnoremap <silent> [unite]r :<C-u>Unite -buffer-name=register register<CR> augroup MyUnite autocmd FileType unite call s:unite_setting() augroup END function! s:unite_setting() "<ESC>でuniteを終了(消えるのに1秒くらいかかる) nmap <buffer> <ESC> <Plug>(unite_exit) "分割して開く nnoremap <silent> <buffer> <expr> <C-s> unite#do_action('split') inoremap <silent> <buffer> <expr> <C-s> unite#do_action('split') nnoremap <silent> <buffer> <expr> <C-v> unite#do_action('vsplit') inoremap <silent> <buffer> <expr> <C-v> unite#do_action('vsplit') endfunction
vimfiler
vimfilerとUniteでVimをファイラとして使用する方法 | karakaram-blog
uniteと連携することにより更なるパワーを引き出せるようなので。"fi"でIDE風に開く。q(QUIT) or Q(HIDE)で消える。
操作方法も上記のリンクに。
"vimデフォルトのエクスプローラをvimfilerで置き換える let g:vimfiler_as_default_explorer = 1 "セーフモードを無効にした状態で起動する let g:vimfiler_safe_mode_by_default = 0 "現在開いているバッファのディレクトリを開く nnoremap <silent> fe :<C-u>VimFilerBufferDir -quit<CR> "現在開いているバッファをIDE風に開く nnoremap <silent> fi :<C-u>VimFilerBufferDir -split -simple -winwidth=35 -no-quit "デフォルトのキーマッピングを変更 augroup vimrc autocmd FileType vimfiler call s:vimfiler_my_settings() augroup END function! s:vimfiler_my_settings() nmap <buffer> q <Plug>(vimfiler_exit) nmap <buffer> Q <Plug>(vimfiler_hide) endfunction
nerdtree
Ctrl-eで開いたり、隠したりできるように。下のリンクを参考に。
Hunting Field: [vim] NERDTreeをもっと使いやすくするための設定
" vim実行時に引数なしなら、NERDTreeを実行する let file_name = expand("%:p") if has('vim_starting') && file_name == "" autocmd VimEnter * call ExecuteNERDTree() endif " カーソルが外れているときは自動的にnerdtreeを隠す function! ExecuteNERDTree() "b:nerdstatus = 1 : NERDTree 表示中 "b:nerdstatus = 2 : NERDTree 非表示中 if !exists('g:nerdstatus') execute 'NERDTree ./' let g:windowWidth = winwidth(winnr()) let g:nerdtreebuf = bufnr('') let g:nerdstatus = 1 elseif g:nerdstatus == 1 execute 'wincmd t' execute 'vertical resize' 0 execute 'wincmd p' let g:nerdstatus = 2 elseif g:nerdstatus == 2 execute 'wincmd t' execute 'vertical resize' g:windowWidth let g:nerdstatus = 1 endif endfunction noremap <c-e> :<c-u>:call ExecuteNERDTree()<cr>
使い方はNERDTree起動中に'?'を見れば全部書いてある。下のリンクにも書いてあるっぽい。
英語&英会話学習SNS開発記録 : vimプラグインのNERDTreeを自分好みにカスタマイズ。
multi-vim
Sublime Text2みたいなことができるネタ機能。
何かデモを見るとすごいことになっているように見える。
"Sublime Text2風な動きができるプラグイン ":Multi ^ で全テキストの前に文字を追加 ":Multi $ で全テキストの後に文字を追加 ":Multi hoge で指定文字hogeをまとめて編集 "2012/11現在非常にバグった動きをする "・まとめて指定時削除の挙動がおかしい "・neocomが割り込むと動作がバグる "・実用性があるのか不明なので一応入れたがスル― "・範囲指定ができない。。。
zencoding-vim
ZenCoding for Vim 導入方法(初心者さん向け) - sakurako_sの日記
タブインデントの設定だけする。
"タブインデントを使う let g:user_zen_settings = { 'indentation':' ' }
作成したmattnさんのページを参考に使い方を。全機能使えるわけではないので。
http://mattn.kaoriya.net/software/vim/20100306021632.htm
チートシートもあるので。
http://code.google.com/p/zen-coding/wiki/CheatSheets;title
実際に使ってみて参考にしたページ
Big Sky :: zen-coding for vim を pure vimscript だけで書いてみた。
Big Sky :: zen-codingの殆どの機能をzencoding.vimに取り込んだ。
NERD_commenter.vim
コメント処理をサポートしてくれる。
scrooloose/nerdcommenter · GitHub <- リポジトリ
使い方↓
VimのヤバすぎコメントプラグインNERD_comments.vim - ボクノス
独自のキーマッピングを使いたい。
http://nishikawasasaki.hatenablog.com/entry/20101226/1293374432
"デフォルトのキーバインドを無効に let g:NERDCreateDefaultMappings = 0 "コメントアウトはCtrl+Cで nmap <C-c> <Plug>NERDCommenterToggle vmap <C-c> <Plug>NERDCommenterToggle
他にもいろいろできそうなのでDocumentを読んでみよう。
yankring.vim
https://github.com/vim-scripts/YankRing.vim <- リポジトリを発見
YankRing.vim - Maintains a history of previous yanks, changes and deletes : vim online <- vim.orgにもある
簡単な使い方は
YankRing.vim ヤンクの履歴を管理し、効率的にペーストする
http://nanasi.jp/articles/vim/yankring_vim.html <- こっちの方が詳細
"履歴は30件まで let g:yankring_max_history = 30
smooth_scroll.vim(リポジトリがないので拾ってくる)
これでプレゼンもバッチリ。
"<C-d>:半画面下にスクロール "<C-u>:半画面上にスクロール "<C-f>:全画面下にスクロール "<C-b>:全画面上にスクロール
pydiction
vim-scripts/Pydiction · GitHub <- github
http://www.vim.org/scripts/script.php?script_id=850 <- vim.org
とりあえず、デフォルトの辞書をneocomに登録。
" Define dictionary. let g:neocomplcache_dictionary_filetype_lists = { \ 'default' : '', \ 'python' : $HOME.'/.vim/Pydiction/complete_dict', \ 'vimshell' : $HOME.'/.vimshell/command_history', \ }
Pydiction.pyというモジュールが入っていて、これからほしいライブラリの辞書を増やしていける。
Djangoには読み込めないモジュールがあるらしいので注意。詳細は下記のリンク。
gvim
使わないはずだが、gvimもvimperatorのエディタとして使ったりしたいので。簡単に。
" encording set enc=utf-8 set fenc=utf-8 set fencs=iso-2022,utf-8,euc-jp,cp932 " Font set guifont=ゆたぽん(コーディング):h16 " カラースキーマ colorscheme desert " ツールバーとかいらんな set guioptions-=T " About guioptions " T : ツールバー表示 " m : メニュー表示 " ウィンドウの幅(フルスクリーンで) set columns=9999 set lines=9999 winpos 0 0 " フルスクリーンショートカットキー nnoremap <silent> <C-f> :set fu<CR> nnoremap <silent> <C-c> :set nofu<CR>
Tips
はてな記法はvimscriptまでハイライトできるとは
nnnoremap hoge hoge
.vimrcリロードには注意
Vim-users.jp - Hack #74: 簡単にvimrcを編集する
autocmd, += はリロード時に何度も追加されてしまうので以下のように記述する。
augroup MyAutoCmd autocmd! augroup END ・・・・ autocmd MyAutoCmd FileType * set textwidth=0 autocmd MyAutoCmd FileType * set formatoptions-=ro
- =は以下のように。
set hoge_option& set hoge_option+=piyo
function
function! s:hoge() "中身 endfunction
!はリロード可能な関数を表し、s:はローカル関数ということを表す。
Vim エディターのスクリプトの作成: 第 2 回 ユーザー定義関数
command
command! or mapを考えたところ':'を押さなくもいいmapをたくさん採用しているがcommandがイマイチわかってなかったのもある。
vimdiffが優秀なのでコマンドを割り当てる。
command! -nargs=1 -complete=file Diff vertical diffsplit <args>
commandの設定については以下を参考に。
Vim-users.jp - Hack #158: ユーザコマンドを定義する
Vimスクリプトの初心者がコマンドを定義してみた - 零客痩地
Color
Cygwinのデフォルトの背景では青文字は非常に見づらいので色を変更する。
(被害はコメント、NERDTree、SpecialKey)
Vimの色の設定は
:highlight
で見ることが可能。もっと見やすいのが良ければ
:source $VIMRUNTIME/syntax/hitest.vim
青になっているすべての設定を変更する。(darkredも変えた)
hi Comment ctermfg=cyan hi Directory ctermfg=cyan hi SpecialKey ctermfg=cyan hi Constant ctermfg=red hi WarningMsg ctermfg=red
vim/gvimの色設定について - fudist
vimカラーの微調整時のまとめ。 - connvoi_tyouの日記
すべての色が使えるわけではない
VimLで色指定する数値の一覧 | Inhale n' Exhale
上を参考にperlスクリプトを動かしてみて使える色をチェックしたが、一部しか使えない。
Vim上で使える色は
:so $VIMRUNTIME/syntax/colortest.vim
で確認することが可能。
とりあえずかぶってないcyanを使った(Identifierにdarkcyanが使われているが)
色が気になってきたのでvimrcに以下を追加する。
"色の確認用コマンド command! HighLightList so $VIMRUNTIME/syntax/hitest.vim command! ColorList so $VIMRUNTIME/syntax/colortest.vim
KeyMapping
:mapで確認できる。
Vim-users.jp - Hack #148: Key mappingの設定を確認する
autoread
ファイルを切り替えたらautoloadが走るようにする。
Vim-users.jp - Hack #206: 外部で変更のあったファイルを自動的に読み直す
Encoding
viで日本語の文字コードを自動判別 - 玉虫色に染まれ!
setlにすれば大丈夫?
setl encoding=utf-8 setl fileencodings=ucs-bom,iso-2022-jp-3,iso-2022-jp,eucjp-ms,euc-jisx0213,euc-jp,sjis,cp932,utf-8
zsh
リポジトリにはzshellの設定ファイルもあるので。
あまり深くzshの設定については知らないのでどこかにあった設定をそのまま使っている。
PATHはちゃんと設定しましょう($PATHがなかったorz)
http://d.hatena.ne.jp/tsaka/20060819/1162739565;title
Macはchshでログインシェルの変更ができる。
chsh -s /usr/bin/zsh
みたいな。
UNIXコマンド [chsh]
bash から zsh に乗り換えた【その仕事、蠍は留守です】