fc2ブログ

ぼちぼち散歩

MacVimが結構良い感じ

VimについてはVimのインストールふれた通り,MacではPrivatePortfile/Vim - MacPortsWiki-JPにあるPvivatePortfileを使って

sudo port install vim +cocoa +cscope +huge +kaoriya +multibyte +python +ruby

でインストールして使っているのだが,最近はGUIをCocoaで書き直してさらにMacで使いやすくするための機能を追加したMacVimというのがある.MacVimも通常のVimと同じ方がPrivatePortfile/MacVim - MacPortsWiki-JPにてPrivatePortfileを公開してくださっており,

sudo port install macvim +cscope +kaoriya +python +ruby

という感じでインストールできる.以前にインストールしたときはちょっとバギーな感じだったのでスルーしてたのだが,:help macvimをよく読んで設定し直してみたら結構いい感じになったのでメモしておく.

.vimrcはいつも使っているので問題なかったのだが,.gvimrcに修正が必要だった.MacVimはhas('gui_macvim')で判別できるので以下のように追加してみた.

if has('gui_macvim')
    set showtabline=2  // タブを常に表示
    set imdisable      // IMを無効化
    set transparency=5 // 透明度を指定
    map <silent> gw :macaction selectNextWindow:
    map <silent> gW :macaction selectPreviousWindow:
endif

MacVimはタブがSafariっぽくなっててきれいなので常に表示するようにした.imdisableを指定しないとなぜかInsertモード中に勝手にIMがOnになってしまう.あと,通常のGVimのtransparencyは0(透明)?255(不透明)なのだが,MacVimは0(不透明)?100(透明)なので別に指定しなければならない.以前は,このimdisableとtransparencyの設定に気付かずにバギーの感じていたのだが,ここをちゃんと設定すれば一応常用できると思う.

さらに,macactionコマンドで独自のコマンドを追加することができる.詳しくは:help macvimを見てもらうにしても,上記のように設定するとgwとgWで複数開いたMacVimのウィンドウに対して順番にフォーカスを移していくことができる.また,UserDefaults - macvim - Google Codeにあるように,GUIのタブ自体の設定はdefaultsコマンドで指定できる.例えば,

defaults write org.vim.MacVim MMTerminateAfterLastWindowClosed yes

で,最後のウィンドウを閉じたときに自動的にMacVimを終了できて,

defaults write org.vim.MacVim MMOpenFilesInTabs yes

で,MacVimにファイルをドロップしたときにタブで開くようにできる.このタブで開くのは前々からやりたかったことなので大変素晴らしい感じ.

まだ残っている不具合の中では,日本語入力の未確定の部分が2バイト文字表示に対応していないことと,フォントの設定がちゃんとできないあたりがまだ痛いといえば痛いけど,まだまだ開発の途中のようなので今後の期待している.フォントはデフォルトので問題ないし,Vimはそもそもプログラムを書くのには適しているものの日本語の長文を書くのには適していないと思うのでとりあえずプログラム書くのに常用してみようと思う.

2008/01/15 00:36 | Vim | トラックバック(0) | コメント(0)

ページの先頭へ

MacのGVimで文字化けしないようにrefe.vimを使う

なんか手間がかかったのでメモしておく.

ナレッジエース - Vimでカーソル下の単語からRubyのリファレンスを検索を見て,Macでやってみようと思ったけどいろいろひっかかった.環境としては,MacPortsでPrivatePortfile/Vim - MacPortsWiki-JPを使って+cocoa+cscope+huge+kaoriya+multibyte+python+rubyでインストールしたVimと,rubyとrb-rubygems入れてある.

で,sudo gem install refeしてrefe入れて,refe.vim - rails2u.comからrefe.vimを持ってくる.ちなみに,*.vbaファイルは,vim *.vbaして開いてから:so %でインストールできる.とりあえず,これでナレッジエースさんとこで書いてある環境になるけども,refeがEUC-JPで日本語を吐くのでUTF-8で表示したい自分の場合は文字化けして困ってしまう.というわけで,refeのソースを見てたら文字コードを変換するとこがあったので,適当にMac用の処理を追加してみた.以下のような感じ.

*** searcher.rb.bak	2007-12-17 00:21:43.000000000 +0900
--- searcher.rb	2007-12-17 00:22:36.000000000 +0900
***************
*** 18,23 ****
--- 18,25 ----
      def adjust_encoding( str )
        if shift_jis_platform?
          NKF.nkf('-Es', str)
+       elsif utf8_platform?
+         NKF.nkf('-Ew', str)
        else
          str
        end
***************
*** 26,31 ****
--- 28,37 ----
      def shift_jis_platform?
        /mswin|mingw|cygwin|djgpp|vms/ === RUBY_PLATFORM
      end
+ 
+     def utf8_platform?
+       /darwin/ === RUBY_PLATFORM
+     end
    
    end
  

この段階で,CUIのVimでは問題なく使えるようになる.しかし,GVimではrefeっていうコマンドなんかないよ,って怒られてしまう.これは,CUIとGUIではパスの通し方が違うのが原因.GUIアプリ用にパスを通すときは,~/.MacOSX/environment.plistを作って,Property List Editorで開いて,Rootの下にPATHを作って,ClassはString,Valueに/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbinを指定すれば良い.で,再起動(再ログインでもよいかも)すると設定が有効になる.GVimで,:!echo $PATHすると確かめることができる.

ついでに,.vimrcもちょっと変えて,

autocmd FileType ruby,eruby nnoremap <silent> K :Refe <cword><CR>

としてみた.これで,Ruby書いてるときにShift + kするとrefeを引くことができるようになる.

ちなみに,VimでRuby書くときは,sudo gem install vim-rubyしたあと,指示に従ってvim-ruby-install.rbして,ruby用の設定ファイル群をインストールしておくと便利になる.

2007/12/17 00:52 | Vim | トラックバック(0) | コメント(4)

ページの先頭へ

Vimのプラグイン

がんばってキーバインド体に染み付かして,「vimrc」をググって設定を充実させていけば,なんとなくVimは使えるようになっていくけど,さらに便利に使うにはプラグインをインストールする.

プラグインはMacとかLinuxとかなら~/.vim/以下に,Windowsは$HOME\vimfiles\以下に置くことになっている.プラグインはscripts : vim onlineなどから探すことができる.たいていどこにファイルを置いたらいいかも書いてあるのでインストールに関してはほとんど問題ないと思う.まずは,vim でのオススメ plugin - 川o・-・)<2nd lifeとかvim の text-object をより便利に使えるプラグイン - surround.vim - 川o・-・)<2nd lifeとかプラグインを紹介している記事なんかを参考に適当に入れてみるのが良いと思う.

最近ではVimpi - VimpiというVimプラグインの更新状況をチェックしつつも人気のあるプラグインをチェックできるページもあるので,参考になると思う.ちなみに,自分のページはこちら

さらに,Vimを使いこなすにはVim使いの人のブログを読んでおくのが良いと思う.いつも参考にさせて頂いているブログとかサイトとかを貼っておきます.

2007/12/08 17:18 | Vim | トラックバック(0) | コメント(0)

ページの先頭へ

おれの.vimrc

.vimrcの解説のようなものを書こうと思ったけどめんどくさいので実際のものを見た方が早い気がしたので,現段階での.vimrcと.gvimrcを晒してみる..gvimrcはGUI版のVim(GVim)のみ読み込まれる設定ファイルなので,GUI固有の設定はそっちに書いとくとよさげ.

.vimrc

" ==================== 基本の設定 ==================== "
" 全般設定
set nocompatible            " 必ず最初に書く
set viminfo='20,<50,s10,h,! " YankRing用に!を追加
set shellslash              " Windowsでディレクトリパスの区切り文字に / を使えるようにする
set lazyredraw              " マクロなどを実行中は描画を中断
colorscheme desert          " カラースキーム

" タブ周り
" tabstopはTab文字を画面上で何文字分に展開するか
" shiftwidthはcindentやautoindent時に挿入されるインデントの幅
" softtabstopはTabキー押し下げ時の挿入される空白の量,0の場合はtabstopと同じ,BSにも影響する
set tabstop=4 shiftwidth=4 softtabstop=0
set expandtab              " タブを空白文字に展開
set autoindent smartindent " 自動インデント,スマートインデント

" 入力補助
set backspace=indent,eol,start " バックスペースでなんでも消せるように
set formatoptions+=m           " 整形オプション,マルチバイト系を追加

" コマンド補完
set wildmenu           " コマンド補完を強化
set wildmode=list:full " リスト表示,最長マッチ

" 検索関連
set wrapscan   " 最後まで検索したら先頭へ戻る
set ignorecase " 大文字小文字無視
set smartcase  " 大文字ではじめたら大文字小文字無視しない
set incsearch  " インクリメンタルサーチ
set hlsearch   " 検索文字をハイライト

" ファイル関連
set nobackup   " バックアップ取らない
set autoread   " 他で書き換えられたら自動で読み直す
set noswapfile " スワップファイル作らない
set hidden     " 編集中でも他のファイルを開けるようにする

" ヘルプファイル
if has('mac')
    helptags ~/.vim/doc/
endif
if has('win32')
    helptags ~/vimfiles/doc/
endif

"表示関連
set showmatch         " 括弧の対応をハイライト
set showcmd           " 入力中のコマンドを表示
set number            " 行番号表示
set wrap              " 画面幅で折り返す
set list              " 不可視文字表示
set listchars=tab:>  " 不可視文字の表示方法
set notitle           " タイトル書き換えない
set scrolloff=5       " 行送り

" ステータスライン関連
set laststatus=2
set statusline=%<%F %r%h%w%y%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%4v(ASCII=%03.3b,HEX=%02.2B) %l/%L(%P)%m

" エンコーディング関連
set ffs=unix,dos,mac " 改行文字

" 文字コードの自動認識
" 適当な文字コード判別
set termencoding=utf-8
set encoding=utf-8
set fileencodings=iso-2022-jp,utf-8,cp932,euc-jp

" 厳密な文字コード判別
" http://www.kawaz.jp/pukiwiki/?vim#content_1_7
" http://d.hatena.ne.jp/hazy-moon/20061229/1167407073
" if &encoding !=# 'utf-8'
    " set encoding=japan
    " set fileencoding=japan
" endif
" if has('iconv')
    " let s:enc_euc = 'euc-jp'
    " let s:enc_jis = 'iso-2022-jp'
    " iconvがeucJP-msに対応しているかをチェック
    " if iconv("?x87?x64?x87?x6a", 'cp932', 'eucjp-ms') ==# "?xad?xc5?xad?xcb"
        " let s:enc_euc = 'eucjp-ms'
        " let s:enc_jis = 'iso-2022-jp-3'
    " iconvがJISX0213に対応しているかをチェック
    " elseif iconv("?x87?x64?x87?x6a", 'cp932', 'euc-jisx0213') ==# "?xad?xc5?xad?xcb"
        " let s:enc_euc = 'euc-jisx0213'
        " let s:enc_jis = 'iso-2022-jp-3'
    " endif
    " fileencodingsを構築
    " if &encoding ==# 'utf-8'
        " let s:fileencodings_default = &fileencodings
        " let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932'
        " let &fileencodings = &fileencodings .','. s:fileencodings_default
        " unlet s:fileencodings_default
    " else
        " let &fileencodings = &fileencodings .','. s:enc_jis
        " set fileencodings+=utf-8,ucs-2le,ucs-2
        " if &encoding =~# '^?(euc-jp?|euc-jisx0213?|eucjp-ms?)$'
            " set fileencodings+=cp932
            " set fileencodings-=euc-jp
            " set fileencodings-=euc-jisx0213
            " set fileencodings-=eucjp-ms
            " let &encoding = s:enc_euc
            " let &fileencoding = s:enc_euc
        " else
            " let &fileencodings = &fileencodings .','. s:enc_euc
        " endif
    " endif
    " 定数を処分
    " unlet s:enc_euc
    " unlet s:enc_jis
" endif

" UTF-8の□や○でカーソル位置がずれないようにする
" Terminal.appはどっちにしてもダメ,PrivatePortsのiTermでやる
set ambiwidth=double

" ファイルタイプ関連
" 使用できる色は
" :edit $VIMRUNTIME/syntax/colortest.vim
" :source %
" で、設定名と現在の色は
" :highlight

syntax on " シンタックスカラーリングオン

" なぜか動かない
" highlight ZenkakuSpace ctermbg=6 guibg=white
" match ZenkakuSpace /s+$| /

set complete+=k    " 補完に辞書ファイル追加
filetype indent on " ファイルタイプによるインデントを行う
filetype plugin on " ファイルタイプごとのプラグインを使う

" Omni補完関連
" $VIMRUNTIME/autoload/htmlcomplete.vimの645行目をコメントアウントしておくとhtmlの補完が小文字になる

set completeopt=menu,preview,menuone " 補完表示設定

" TabでOmni補完及びポップアップメニューの選択
function InsertTabWrapper(is_shift)
    if pumvisible()
        return a:is_shift ? "<C-p>" : "<C-n>"
    endif
    let col = col('.') - 1
    if !col || getline('.')[col - 1] !~ 'k|<|/' " htmlで補完できるように<,/でもOmni補完
        return "<tab>"
    elseif exists('&omnifunc') && &omnifunc == ''
        return a:is_shift ? "<C-p>" : "<C-n>"
    else
        return "<C-x><C-o>"
    endif
endfunction
inoremap <tab> <C-r>=InsertTabWrapper(0)<CR>
" Shift-Tabはうまくいかないようだ
" inoremap <S-tab> <C-r>=InsertTabWrapper(1)<CR>

" CRでOmni確定&改行
function InsertCrWrapper()
    return pumvisible() ? "<C-y><CR>" : "<CR>"
endfunction
inoremap <CR> <C-r>=InsertCrWrapper()<CR>

" ポップアップメニューの色変える
highlight Pmenu ctermbg=lightcyan ctermfg=black 
highlight PmenuSel ctermbg=blue ctermfg=black 
highlight PmenuSbar ctermbg=darkgray 
highlight PmenuThumb ctermbg=lightgray

" バイナリモード
" bviとかHexEditor.appの方が楽
" vim -b : edit binary using xxd-format!
" augroup BinaryXXD
  " autocmd!
  " autocmd BufReadPre *.bin,*.swf let &binary =1
  " autocmd BufReadPost * if &binary | silent %!xxd -g 1
  " autocmd BufReadPost * set ft=xxd | endif
  " autocmd BufWritePre * if &binary | %!xxd -r | endif
  " autocmd BufWritePost * if &binary | silent %!xxd -g 1
  " autocmd BufWritePost * set nomod | endif
" augroup END

" Migemo
if has('migemo')
    set migemo
    set migemodict=/opt/local/share/migemo/utf-8/migemo-dict
endif

" Kaoriya
if has('kaoriya')
    " imを無効にする
    set iminsert=0
    set imsearch=0
endif

" ==================== キーマップ ==================== "
" 表示行単位で移動
noremap j gj
noremap k gk
vnoremap j gj
vnoremap k gk

" ハイライト消す
nmap <silent> gh :nohlsearch<CR>

" コピペ
" Macの場合は普通にComamnd-C,Command-Vも使えたりする
if has('mac')
    map <silent> gy :call YankPB()<CR>
    function! YankPB()
        let tmp = tempname()
        call writefile(getline(a:firstline, a:lastline), tmp, 'b')
        silent exec ":!cat " . tmp . " | iconv -f utf-8 -t shift-jis | pbcopy"
    endfunction
endif
if has('win32')
    noremap gy "+y
    " ペーストがうまく動いてない
    noremap gp "+p
endif

" マウス操作を有効にする
" iTermのみ,Terminal.appでは無効
if has('mac')
    set mouse=a
    set ttymouse=xterm2
endif

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

" Rails
autocmd FileType ruby,eruby,yaml set softtabstop=2 shiftwidth=2 tabstop=2
autocmd FileType ruby,eruby let g:rubycomplete_buffer_loading = 1
autocmd FileType ruby,eruby let g:rubycomplete_rails = 1
autocmd FileType ruby,eruby let g:rubycomplete_classes_in_global = 1
let g:rails_level = 4

" CakePHP
au BufNewFile,BufRead *.thtml setfiletype php
au BufNewFile,BufRead *.ctp setfiletype php

" .vimperatorrc
au BufNewFile,BufRead .vimperatorrc,_vimperatorrc setfiletype vimperator

" Lusty Explorer
" nmap <unique> <silent> <C-b> :BufferExplorer<CR>
" nmap <unique> <silent> <C-e> :FilesystemExplorer<CR>

" NERD_comments
let NERDSpaceDelims = 1
let NERDShutUp = 1

" NERD_tree
nmap <unique> <silent> <C-e> :NERDTreeToggle<CR>

" Fuzzy
nmap <unique> <silent> <C-b> :FuzzyFinderBuffer<CR>
nmap <unique> <silent> <C-f> :FuzzyFinderFile<CR>
nmap <unique> <silent> <Leader>m :FuzzyFinderMruFile<CR>
nmap <unique> <silent> <Leader>c :FuzzyFinderMruCmd<CR>
nmap <unique> <silent> <Leader>d :FuzzyFinderDir<CR>

" AutoComplete
" 330行目らへんを修正してある
let g:AutoComplPop_IgnoreCaseOption = 0
let g:AutoComplPop_CompleteoptPreview = 1

" Project
" let g:proj_flags = "imstg"
" let g:proj_window_width = 30
" nmap <silent> <Leader>p <Plug>ToggleProject

" surround
autocmd FileType php let b:surround_45 = "<?php 
 ?>"

" php-doc
autocmd FileType php inoremap <C-p> <ESC>:call PhpDocSingle()<CR>i
autocmd FileType php nnoremap <C-p> :call PhpDocSingle()<CR>
autocmd FileType php vnoremap <C-p> :call PhpDocRange()<CR>
let g:pdv_cfg_Type = "string"
let g:pdv_cfg_Package = ""
let g:pdv_cfg_Version = ""
let g:pdv_cfg_Author = "tsukkee <takayuki0510@gmail.com>"
let g:pdv_cfg_Copyright = ""
let g:pdv_cfg_License = ""

" Firefoxリロード
" 要MozRepl
function ReloadFirefox()
    if has('ruby')
        :ruby <<EOF
            require "net/telnet"

            telnet = Net::Telnet.new({
                "Host" => "localhost",
                "Port" => 4242
            })

            telnet.puts("content.location.reload(true)")
            telnet.close
EOF
    endif
endfunction
nmap <silent> <Leader>r :call ReloadFirefox()<CR>

" vimsh
nmap <silent> <Leader>s :so ~/.vim/vimsh/vimsh.vim<CR>

" visual studio
if has('win32')
    let g:visual_studio_python_exe = "C:/Python25/python.exe"
endif

.gvimrc

" ==================== フォント設定 ==================== "
" 普通のMac版GVim
if has('gui_mac')
    set guifont=Osaka-Mono:h14
"   set guifontwide=Osaka-Mono:h14
"   set guifont=Yutapon_coding_Regular:h14:cUTF-8
endif

" 実験版MacVim
if has('gui_macvim')
    set showtabline=2
endif

" Windows版GVim
if has('win32')
    set guifont=M+2VM+IPAG_circle:h10:cSHIFTJIS
"   set guifont=ゆたぽん(コーディング)Heavy:h11:cSHIFTJIS
endif

" ==================== 画面表示設定 ==================== "
set title       " タイトル表示
set linespace=4 " 行間
set columns=110 " 幅
set lines=30    " 高さ

if has('mac')
    set guioptions+=aeT
endif
set transparency=240

" ポップアップメニューの色変える
highlight Pmenu  guibg=#3333ff guifg=#000000
highlight PmenuSel guibg=#0000dd guifg=#000000
highlight PmenuSbar guibg=#333333
highlight PmenuThumb guibg=#aaaaaa

2007/11/21 03:15 | Vim | トラックバック(0) | コメント(1)

ページの先頭へ

Vimの設定をいじる

Vimはデフォルトのままだけじゃなくて,いろいろ設定いじることによってより高度な機能が使えたり,自分好みにできる.設定項目はやたら多いので全然把握しきれないというか,なんか調べるたびに新たな発見があって面白い.で,設定の方法は普通のGUIアプリケーションとは違って(普通のCUIアプリケーションと一緒で),自分のホームフォルダにテキストで設定を書くことによって設定を行う.Macの場合は自分のホームフォルダ(/Users/<ユーザ名>/)に.vimrcという名前の,Windowsの場合はGVim.exeがあるフォルダか自分のホームフォルダ(Documents and Settings<ユーザ名> だっけ?)に_vimrcという名前のテキストファイルを作る.どうせならVimでやるのがいいので,コマンドラインで

vim ~/.vimrc

とするか,Vimを起動した状態で,

:e ~/.vimrc

と入力してリターンで.vimrcを編集できる.保存とかどうすんだっけ?というときはvimtutorからやり直しで(^-^;).で,まずは一行目に

set nocompatible

と入力する.Vim(Vi Improved)はViというエディタのクローンというかパワーアップ版という感じで,デフォルトでは互換性を持つ状態なので,まずは互換性とか捨ててVimのパワフルな機能を使えるようにする.で,あとは好きな設定を書いていく.基本的にオンかオフかの2値の設定は,hogeに対してnohogeといった感じで「no」が付いたバージョンがある.ちなみに,「"」より後ろはコメント.例えば,

set expandtab   " タブをスペースで置き換える
set noexpandtab " タブはタブのまま

set showmatch   " ()や{}の対応関係をハイライトする
set noshowmatch " ()や{}の対応関係をハイライトしない

set number   " 行数表示
set nonumber " 行数非表示

ほとんど(全部?)のコマンドに略称があって,例えば

set nu   " set numberと一緒
set nonu " set nonumberと一緒

といった感じ.数値や文字列を指定するタイプの設定は,set fuga=xxxとかいった感じで設定する.例えば,

set laststatus=2 " ステータスラインを表示するかどうか 0は表示しない,1は2つ以上ウィンドウがあったら,2は常に表示
set scrolloff=5  " スクロール時に余分に表示する行数,画面の行数より大きくするとカーソルが常に画面中央にくるようになる

とかいったような感じ.どういうオプションがあるかは,Vimの全オプションあたりを参照したり,「vimrc」でググったりするといっぱい出てくる(例:オレの .vimrcvim7 用に少し .vimrc を書き直した - cooldaemonの備忘録.vimrc弄ってたらこんな時間に……。 - Initialized Completely)のでいろいろ調べて自分好みにしていくのが良いと思う.

設定はVimの再起動か,

:source ~/.vimrc

で反映される..vimrcは実はVimScriptという独自のスクリプト言語になっていて,そこに関数定義なんかを書いてると:sourceの場合は関数の再定義エラーが出たりするので工夫が必要だけど,それについてはまた今度書くかも知れない.また,.vimrcをググったりしてると知らない設定が出てくるので,調べたい場合は

:help コマンド名
または
:h コマンド名

で,意味を調べることができる(英語のみ,ただし適当にググるとヘルプの日本語訳があったりするので参考になる).ちなみにTabキーで補完が効くので適当に先頭何文字か入力してからTabでおっけー(設定によるかも知れない).その他,コマンドなんかもほとんど:helpコマンドで調べることができる.Vimはやたらと機能があるけど,こんな感じでちゃんとヘルプが用意されているのである程度慣れてこれば,新しく知ったコマンドや設定でもすぐにどういう動作のものなのか把握できるようになると思う.

気が向いたら,さらに詳しい設定やプラグインとかの話もしたいなぁ.あと,ブログのテンプレートも作り直したい.

2007/11/18 00:19 | Vim | トラックバック(0) | コメント(0)

ページの先頭へ

前のページへ << トップページへ >> 次のページへ