トップ «前の日記(2007-11-12) 最新 次の日記(2007-11-15)» 編集

Route 477



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を入れてみましたよ。

手順:

  1. KaoriYa.netのVim7.1を入れる (7.0ではだめかも)
  2. http://www.vim.org/scripts/script.php?script_id=1890 からスクリプトをダウンロードして、$HOME\.vim\pluginとか、$HOME\vimfiles\pluginあたりに入れる
  3. 「\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さんのパッチが混ざってます。 ごめんなさい。でもこっちも当てといた方がいいよ多分。