2007-11-13
■ [ruby] ドライブレターの大文字/小文字が揃っていないとPathname#relative_path_fromが失敗する件
"c:\home" → "c:\tmp" はOK
"c:\home" → "C:\tmp" は不可
irb(main):002:0> home = Pathname("c:\home")
=> #<Pathname:c:home>
irb(main):003:0> temp = Pathname("C:\temp")
=> #<Pathname:C: emp>
irb(main):004:0> tmp = Pathname("c:\tmp")
=> #<Pathname:c: mp>
irb(main):005:0> home.relative_path_from(tmp)
=> #<Pathname:../home>
irb(main):006:0> home.relative_path_from(temp)
ArgumentError: different prefix: "c:" and "C:\temp"
from c:/prog/ruby/lib/ruby/1.8/pathname.rb:709:in `relative_path_from'
from (irb):6
えー。そりゃないよ。
■ [vim] LustyExplorerをWindowsで使う方法
ファイル一覧やバッファ一覧を表示+タブ補完付きで選択できるプラグイン、LustyExplorerを入れてみましたよ。
手順:
- KaoriYa.netのVim7.1を入れる (7.0ではだめかも)
- http://www.vim.org/scripts/script.php?script_id=1890 からスクリプトをダウンロードして、$HOME\.vim\pluginとか、$HOME\vimfiles\pluginあたりに入れる
- 「\lf」でファイル一覧、「\lb」でバッファ一覧。キー入力でファイル候補選択、タブ補完あり。
別のディレクトリのファイルを開いているときは、「\lr」で「そっちのディレクトリの」ファイル一覧を表示してくれます。 便利。
良く使うコマンドだと思われるので、「,f」など適当なキーバインドで実行できるようにしておくと便利かも。
" Lusty Explorer/Juggler nmap <unique> <silent> ,b :BufferExplorer<CR> nmap <unique> <silent> ,f :FilesystemExplorer<CR> nmap <unique> <silent> ,r :FilesystemExplorerFromHere<CR> " nmap <unique> <silent> ,j :LustyJuggler<CR>
んで、Windows版だと:cdとかでディレクトリを移動したときに例のdifferent prefixなんちゃらが出る場合があるので、 やっつけパッチを書いてみました。
--- c:\tmp\lusty-explorer.vim Tue Nov 13 17:39:19 2007
+++ lusty-explorer.vim Tue Nov 13 17:11:21 2007
@@ -425,13 +425,21 @@
'[LustyExplorer-Buffers]'
end
+ def force_downcase_driveletter(path)
+ if path.to_s =~ /\A[A-Za-z]:/
+ path = Pathname(path.to_s.sub(/\A./){|c| c.downcase})
+ else
+ path
+ end
+ end
+
def buffer_match_string
pwd = Pathname.getwd
name = if @curbuf_path.to_s.starts_with?("scp://")
@curbuf_path.to_s
else
- @curbuf_path.relative_path_from(pwd).to_s
+ force_downcase_driveletter(@curbuf_path).relative_path_from(force_downcase_driveletter(pwd)).to_s
end
Displayer.vim_match_string(name, @prompt.insensitive?)
@@ -461,7 +469,7 @@
name
else
path = Pathname.new VIM::Buffer[i].name_p
- path.relative_path_from(pwd).to_s
+ force_downcase_driveletter(path).relative_path_from(force_downcase_driveletter(pwd)).to_s
end
@buffers[name] = VIM::Buffer[i].number
@@ -1074,6 +1082,7 @@
@sidescroll = eva "&sidescroll"
@sidescrolloff = eva "&sidescrolloff"
+ @reg = vim_single_quote_escape(eva('@"'))
@reg0 = vim_single_quote_escape(eva("@0"))
@reg1 = vim_single_quote_escape(eva("@1"))
@reg2 = vim_single_quote_escape(eva("@2"))
@@ -1117,6 +1126,7 @@
exe "set sidescroll=#{@sidescroll}"
exe "set sidescrolloff=#{@sidescrolloff}"
+ exe "let @\" = '#{@reg}'"
exe "let @0 = '#{@reg0}'"
exe "let @1 = '#{@reg1}'"
exe "let @2 = '#{@reg2}'"
後半はcho45さんのパッチが混ざってます。 ごめんなさい。でもこっちも当てといた方がいいよ多分。
[ツッコミを入れる]