vim

2009年7月28日 (火)

VIMでマッチしているHTMLタグやrubyの対応するdo endにカーソルを移動させる。

VIMでよく知られている機能にノーマル・モード時に%を入力すると対になった()や{},[]の間をカーソルがjumpできる機能がある。
ただ、この機能はrubyのdo~endやHTMLの<div></div>のようなタグには対応していない。そこで便利なのがmatchit.vimというプラグイン。
実際:help %とヘルプを出すと、下記のように本家本元のヘルプにも記述されているぐらいのお墨つきのプラグインなのだ。
For other items the matchit plugin can be used, see
            |matchit-install|.

matchit.vimのインストール方法

  1. http://www.vim.org/scripts/script.php?script_id=39 から最新のmatchit.zipをダウンロード
  2. 1.でダウンロードしたzipファイルを展開し、展開してできたdocとpluginのディレクトリをVIMをインストールしたディレクトリの配下にあるruntimeというディレクトリ(vim上で:echo %VIMRUNTIMEで表示されるパス)の下にコピー(docとpluginというディレクトリはすでにあるので、そのディレクトリに対して上書きコピー)
    以上

もしヘルプファイルを更新する場合は、vim上で下記のコマンドを実行
:helptags $VIMRUNTIME/doc

HTMLやRubyだけでなく、LaTeX, Lua,Vimスクリプト、VBスクリプト
にも対応しているらしく、初めてmatchitをインストールした人は絶対
「おぉー」て感動するはず。
ただ、欠点もあって、拡張子が.htmlのファイルの中のJavaScriptの{}、()の
%の対応が効かなくなる。拡張子が.jsの場合は問題ないのだが。
おそらく拡張子によって、マッチングさせるキーワードを変更しているのだろう。

2009.08.25 追記
machit.vimはVim6.0以上は最初から添付されているので、わざわざ上記の
URLから取ってきてインストールする必要はない。
.vimrc等に
source $VIMRUNTIME/macros/matchit.vim
の記述をすれば、OK

!注意 
vimrcに記述せず、:source $VIMRUNTIME/macros/matchit.vim
を実行した場合は、今開いているバッファに対しては有効にならないため、
:eなどで再度ファイルを読み込みなおす必要がある。

また、最初から添付されているmatchit.vimの場合は拡張子がhtmlでも
JavaScriptの(),{}等の移動がサポートされている。

| | コメント (0) | トラックバック (0)

2009年6月26日 (金)

vimで特定のファイルの特定行に飛ぶ

vimでノーマル・モードでカーソルの下にあるファイルのパスにジャンプするにはgfを入力するか、もしファイル名 行番号のようにファイル名の後に行番号がある場合はgFでそのファイルのその行に飛ぶことができる。
例えばLinuxで下記のようなエラー表示をファイルに保存すればgFでエラーの箇所に直接飛ぶことができる。
from /usr/lib/ruby/lib/ruby/1.8/optparse.rb:1443:in `catch'

ただ、windowsでは下記のような記述の上でgfもしくはgFを入力すると
from d:/Program Files/ruby-1.8/lib/ruby/1.8/optparse.rb:1443:in `catch'
E447: pathには "d:/Program" というファイルがありません
が表示される。
これは、vimの設定でファイル名として許される文字にwindowsの場合 (スペース)が含まれないためだ。また逆に:が含まれているため、 (スペース)をつけただけでは
E447: pathには "from d:/Program Files/ruby-1.8/lib/ruby/1.8/optparse.rb:1256:in
" というファイルがありません

となってしまう。なので、下記のようにファイル名として許される文字から:を抜きスペースを許す設定をする。
:set isfname=\ ,@,48-57,\\,/,.,-,_,+,,,#,$,%,{,},[,],@-@,!,~,=
これでgFでカーソル下のファイルの行番号に飛ぶことができる。

| | コメント (0) | トラックバック (0)

2009年6月 4日 (木)

windowsでるりまのrefeをrefe.vimで使う

windowsでるりまの最新のrefeを使おうと
するとまず、unknown database scheme: cのエラーがでる。
滝谷日記さんのおかげで-dの後にfile://をつけることで解決する。だが、まだ難所が続く。コマンドプロンプト上でのrefeはおかげで動くようになったのだが、vim上の:Refe実行では、`fork': fork() function is unimplemented on this machine (NotImplementedError)
のエラー。
refe.vimの91行目
let option = '-s'

   ↓

let option = ''

にすることで一応解決
ちなみにlookupfileも無効にしたほうがいいため、
refe.vimの45行目

let g:RefeUseLookupFile = 1

   ↓

let g:RefeUseLookupFile = 0

にするほうが断然おすすめ。
-sがないせいか、ちょっと遅く感じるが、仕方ないか。

| | コメント (0) | トラックバック (0)

vimの矩形選択を便利にする

vimでカーソルを現在表示しているバッファの一番下にするにはどうするんだっけと:help motion.txt
で調べたところLであることを発見。それとは別にめっちゃ便利な設定を発見。
set virtualedit=block
これでCtrl+vによる矩形選択時に文末までではなく、無限にカーソルを進めることができる。
よくrspecで期待した結果と実際の結果を比較する際に矩形選択で横に並べたりするのだが、
その際一番下の行より長い行がある際はわざわざ一番下の行にスペースを付加することで
矩形選択できるようにしていたが、その必要がなくなった。

| | コメント (0) | トラックバック (0)

2009年5月18日 (月)

rails.vim pathには "app/models/blog.rb" というファイルがありません

rails.vimを使っていますが、RAILS_ROOTのパスにスペースが含まれていると、Rmodelコマンドがpathには "app/models/blog.rb" というファイルがありません のエラーになってしまう。英語の場合はCan't find file "app/models/blog.rb" in path

理由はrailsのソースをvimで開くとオプションのpathにRAILS_ROOTのパスがセットされるのだが、  その際スペースが\(back-slash)でエスケープされていない。

修正には
C:/Program Files/vim71-kaoriya-w32j/runtime/autoload/rails.vim
174行目を下記に修正

 let path .= "," . a:000[i]
            ↓
let path .= "," . substitute(a:000[i],'\\\@<! ','\\ ','g')

| | コメント (0) | トラックバック (0)

2008年12月23日 (火)

vim grepした結果を編集して使う。

vimでよく使う機能としてgrepがある。
最近はwindowsでもそのまま使えて拡張子も指定できるvimgrepをよく使っている。

例えば 現在のディレクトリ配下(サブディレクトリも含む)の拡張子.pyに対して"Spend"を検索

:vimgrep "Spend" **/*.py

 lifeaccountnote.py|38 col 13| datas = Spending.all().filter('user',user).filter('date >=',fromdate).filter('date < ',todate)
lifeaccountnote.py|52 col 7| class Spending(db.Model):
lifeaccountnote.py|72 col 3| spending = Spending(user=user,
lifeaccountnote.py|76 col 3| spending.category=db.Key(category)
lifeaccountnote.py|77 col 3| spending.put()
lifeaccountnote.py|85 col 6| if spending.category.name in accountData:
lifeaccountnote.py|86 col 19| accountData[spending.category.name] += price
lifeaccountnote.py|88 col 19| accountData[spending.category.name] = price

上記のようなフォーマットで編集不可の形式で下windowに出力され、enterでカーソルのある行の結果にjumpできる。 これはこれですごく便利なのだが、別に興味のない結果行を削除したかったり、後で vimgrepを再び使用せずに、出力結果を再利用したい時はどうしたらいいのだろう? そういう場合の実行手順。

  • 1. grep結果を適当なファイル名で保存。
  • 2. 保存した結果を編集。(必要のない結果を削除したり等)
  • 3. :set errorformat=%f\|%l\ col\ %c\|%m
  • 4. :cf 1で保存したファイル名
  • 5. :cope

編集したvimgrepの結果ファイルに基づいたwindowが表示され、enterでjumpできるようになる。 ktkr

| | コメント (0) | トラックバック (0)

2008年3月 5日 (水)

vim copy & pasteでフォーマットが崩れる

vimを使っていて困ることが、他からCopyしてきたプログラムをPasteした時にコメントアウトした後の文章がずっとコメントアウトのままになっていたり、勝手に変なindentをされたりすることだ。
今日やっとその解決方法が用意されていることを知った。

:set paste

これだけで、他からのコピーが元通りコピーされる。

| | コメント (0) | トラックバック (0)

2008年2月17日 (日)

windowsのgvimの設定

 function MakeNewWindow()
  let s:cmdstr = '!start gvim.exe -R "' . expand("%:p") . '" +'. line(".") 
  execute s:cmdstr
  return
endfunction
function ExplorerStart()
  let s:dir = expand("%:p:h")
  let s:directory=substitute(s:dir,"/","\\","g")
  execute "!start explorer /e,".s:directory
endfunction
function Iestart()
  let url=expand("%:p")
  execute "!start \"C:\\Program\ Files\\Internet\ Explorer\\IEXPLORE.EXE\"\ " . url
endfunction
function ZeroCount(strNum)
  let s:slen = strlen(a:strNum)
  let s:i = 0
  let s:zeroCount = 0
  while s:i < s:slen
    if a:strNum[s:i] !~ "0"
      break
    endif
    let s:zeroCount = s:zeroCount+1
    let s:i = s:i + 1
  endwhile
  return s:zeroCount
endfunction
function GetNextNum(moto,inc)
  let s:digits = a:moto
  let s:strNum = ZeroCount(s:digits)
  let s:i = 0
  let s:digits = strpart(s:digits,s:strNum)
  let s:chrCnt = strlen(s:digits)
  let s:digits =s:digits+a:inc
"桁上がりした
  if s:strNum != 0
    if strlen(s:digits) > s:chrCnt
      let s:strNum = s:strNum - 1
    elseif s:chrCnt > strlen(s:digits)
      let s:strNum = s:strNum + 1
    endif
  endif

  while s:i < s:strNum
    let s:digits = "0" . s:digits
    let s:i = s:i + 1
  endwhile
  return s:digits
endfunction
function EditNext(inc)
  let s:nowFN =expand("%:r")
  let s:fnStr=substitute(s:nowFN,'\(\D*\)\d\+$',"\\1","g")
  let s:fnNum =substitute(s:nowFN,'\D*\(\d\d*\)$',"\\1","g")

  let s:nowNum = GetNextNum(s:fnNum,a:inc)

  let s:newFN = "e ".s:fnStr.s:nowNum.".".expand("%:e")
  execute s:newFN
  return
endfunction
function Autoftp()
  let s:nowDir = substitute(expand("%:p:h"),"c:\\(.*\\)$","\\1","")
  let s:nowFile = expand("%:p")

  let s:fn  = "c:\\ftpcmd.txt"
  if filereadable(s:fn)
    let s:ret = delete(s:fn)
  endif
 
  execute "sp ".s:fn
  call LineAdd("open サーバのIP")
  call LineAdd("user")
  call LineAdd("ユーザ名")
  call LineAdd("パスワード")
  call LineAdd("ascii")
  call LineAdd("cd ".s:nowDir)
  call LineAdd("put \"".s:nowFile."\"")
  call LineAdd("quit")
  execute "w"
  execute "q"
  execute "!ftp -n -s:".s:fn
endfunction
function Ftpget()
  let s:nowDir = substitute(expand("%:p:h"),"c:\\(.*\\)$","\\1","")
  let s:nowFile = expand("%:t")

  let s:fn  = "c:\\ftpcmd.txt"
  if filereadable(s:fn)
    let s:ret = delete(s:fn)
  endif
 
  execute "sp ".s:fn
  call LineAdd("open サーバのIP")
  call LineAdd("user")
  call LineAdd("ユーザ名")
  call LineAdd("パスワード")
  call LineAdd("ascii")
  call LineAdd("cd ".s:nowDir)
  call LineAdd("get \"".s:nowFile."\"")
  call LineAdd("quit")
  execute "w"
  execute "q"
  execute "!ftp -n -s:".s:fn
endfunction
function LineAdd(linestr)
  let s:lineCount = line("$") - 1
  let s:ret = append(s:lineCount,a:linestr)
endfunction
function Diffs(fname)
  let s:cfilename = a:fname . '\' . expand("%:t") . "~"
  let s:cmdstr = "diffsplit " . s:cfilename
  execute s:cmdstr
  return
endfunction
set vb t_vb=
set guioptions+=a
set guioptions-=T
set guioptions-=m
set guicursor=a:blinkon0
set shellslash
set backup
set backupdir =c:/tmp
ab diffs call Diffs("c:/tmp")<CR>
au BufEnter * execute ":lcd " . expand("%:p:h")
autocmd BufRead *.txt nm <C-n> :call EditNext("1")<CR>
autocmd BufRead *.txt nm <C-p> :call EditNext("-1")<CR>
colorscheme torte
ab vimed sp ~/_gvimrc
nm <C-j> :call MakeNewWindow()<CR>
cm <C-o> call ExplorerStart()<CR>
let $PATH=$PATH.";c:/cygwin/bin"

解説
MakeWindow
現在開いているファイルに対して、新しくgvimを立ち上げて、読み取り専用で開く。先に立ち上げたvimで内容を更新しても、新しく立ち上げたウィンドウのほうは変更されないため、更新内容を確認しつつ編集するのに便利。

ExplorerStart
今開いているファイルのディレクトリをエクスプローラで開く。
ファイル名を変更したり、コピーをしたりするのに便利。

Iestart
今開いているファイルをInternetExplolerで開く。HTMLやXMLを編集している時に便利

ZeroCount(Number)
先頭をゼロパディングされた数字の先頭の0の数を返す。

GetNextNum(moto,inc)
motoにinc分の数字を増減させた数字を返す。ゼロサプレスされた数字はゼロサプレスを考慮して返す。incに負の数が与えられた場合は減少。

EditNext(inc)
現在のファイル名の末尾の数字をinc分増減したファイル名を返す。電信八号(メールの読み書きに好きなエディタが使えるメーラ)のファイル形式が数字.txtのため、次に受信したファイルを読みたい場合に、call EditNext(1)のように呼び出すことで次のファイルを読める。call EditNext(-1)で前のファイルを読める。

Autoftp ※サーバ名 ユーザ名 パスワードを実際に合わせる必要あり。
現在編集しているファイルをサーバにアップロードする。
その規則はwindows側のc:\直下をサーバの/(ルート)に変換してファイルをアップロードする。
例えば、c:\www\public\html\index.htmlを編集している状態で:call Autoftpを実行すると、サーバの/www/public/html/index.htmlにアップロードする。

Ftpget()
Autoftpとは逆にサーバから現在編集しているファイルをダウンロードする。
現在編集しているファイルが強制的にサーバのファイルに置き換えられるため要注意

LineAdd(string)
stringを現在開いているバッファの最後に追記する。

Diffs(バックアップディレクトリ名)
現在編集しているファイルとバックアップディレクトリにあるファイル名~とのdiffsplitを行う。

ビジュアルベルをOFF
set vb t_vb=
ビジュアルモードで選択している箇所をクリップボードにコピー
set guioptions+=a
ツールバーを表示しない。
set guioptions-=T
メニューバーを表示しない。
set guioptions-=m
カーソルの点滅を行わない。
set guicursor=a:blinkon0
パスの区切り文字を"\"ではなく"/"にする。
set shellslash
ファイルを変更した際にバックアップを行う。
set backup
バックアップファイルを置くディレクトリ名
set backupdir =c:/tmp
:diffsのみで現在のファイルと変更前のファイルとのdiffをとる。
ab diffs call Diffs("c:/tmp")<CR>
編集しているファイルの場所をカレントディレクトリとする
au BufEnter * execute ":lcd " . expand("%:p:h")
拡張子が.txtのファイルの場合Ctrol+nで現在のファイル名+1を開く(電信八号用)
autocmd BufRead *.txt nm <C-n> :call EditNext("1")<CR>
拡張子が.txtのファイルの場合Ctrol+pで現在のファイル名-1を開く(電信八号用)
autocmd BufRead *.txt nm <C-p> :call EditNext("-1")<CR>
テーマカラーをtorteに設定
colorscheme torte
:vimedで新しいバッファにgvimの設定ファイルを開く
ab vimed sp ~/_gvimrc
:Ctrol+jでもうひとつ新しいgvimのウィンドウを開いて現在編集しているファイルを開く
nm <C-j> :call MakeNewWindow()<CR>
::(コロン)+Ctrol+oで現在開いているファイルのディレクトリをエクスプローラで開く
cm <C-o> call ExplorerStart()<CR>
環境変数のPATHにcygwinのパスを追加
(はじめからcygwinのパスを通しているとwincvsがエラーになるため。)
let $PATH=$PATH.";c:/cygwin/bin"

| | コメント (0) | トラックバック (0)

2008年2月13日 (水)

linuxの.vimの設定

.vimrc
set sw=2
set ts=2
set softtabstop=0
au  BufEnter *   execute ":lcd " . expand("%:p:h")
ab vimed sp ~/.gvimrc
set ignorecase
set fileencodings=utf-8,iso-2022-jp,cp932,euc-jp
set termencoding=utf-8
set fileencoding=utf-8
set encoding=utf-8
set formatoptions-=or

.gvimrc

set lines=80       " ウインドウの高さ
set columns=180    " ウインドウの幅
set guifont=IPAゴシック\ 16
set linespace=3
set antialias
set guioptions-=m
set guioptions-=T
let g:rubycomplete_buffer_loading = 1
let g:rubycomplete_classes_in_global = 1

| | コメント (0) | トラックバック (0)