Perl planet
February 27, 2010
因為原本的 CPAN Shell 啟動時間慢,累贅的資訊太多,太多 Prompt,且對新手來說,太多預設設定要做,但新手只是需要儘快準備一個完整的開發環境來寫 Perl 程式碼而已!然而 CPAN Shell 由於太古老,該程式碼已經相當難維護、整理,所以一直沒有良好的修正。更別說是 CPANPLUS ,CPANPLUS 本身又相依於一堆模組,簡直是疊床架屋,對新手來說,安裝好 CPANPLUS 甚至要花上 10 分鐘!<br /><br />所以 Miyagawa 寫了 cpanminus ,這個模組 CPAN Shell 啟動時間相當的快,而且不相依於其他累贅的模組如 Moose... :-P<br /><br />cpanminus 只需要你有一個 C Compiler, Module::Build , ExtUtils::MakeMaker (Perl 都內建了), 甚至直接內嵌了 HTTP::LIte 模組。<br /><br />所以安裝 cpanminus 根本不需要花上超過 3 秒的時間!想想看你在升級 CPAN 或是 CPANPLUS 的時候多麼痛苦!!<br /><br />再來,常有使用者提出若無 root 權限,該如何安裝 CPAN 模組,這個問題一直是長期以來困擾大家的!而且又無完善解法。<br /><br />只要以非 Root 使用者執行 cpanm 安裝模組,該模組自動會裝到 home 目錄底下 ~/perl5 ,也不需另外自行設定!<br /><br />安裝方式相當簡單:<br /><br /><code>cd ~/bin<br />wget http://xrl.us/cpanm<br />chmod +x cpanm</code><br /><br />這樣就可以了,因為 cpanm 只是一個單一的執行檔!<br /><br />使用方式:<br /><br /><code>cpanm Module<br />cpanm MIYAGAWA/Plack-1.0000.tar.gz<br />cpanm ~/mydists/MyCompany-Framework-1.0.tar.gz<br />cpanm http://example.com/MyModule-0.1.tar.gz<br />cpanm http://github.com/miyagawa/Tatsumaki/tarball/master<br />cpanm --interactive Task::Kensho</code><br /><br />你也可以到 github 上取得最新的版本! @miyagawa ROCKS!!<br /><br /><a href="http://github.com/miyagawa/cpanminus">http://github.com/miyagawa/cpanminus</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-9135984168769970652?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at February 27, 2010 03:00 PM
January 31, 2010
最近的作品 - <a href="http://github.com/c9s/hypergit.vim">hypergit.vim</a>。先前的 fastgit.vim 經過一些思考後,打掉重寫了,新增的 GitMenu 讓原本越來越的 Command 得以有組織性的以樹狀選單呈現,更 Powerful。<div><br /><div>正為了要有一個樹狀選單,所以晚上以 VimL 實做了 Helper Message Class 以及 TreeMenu Class ,以方便其他各種 Plugin 需要用時重用。</div><div><br /></div><div>該 Git Menu 可自動 Parse Remote 名稱 、Branch 名稱以產生 TreeMenu ,以及各 Menu Node 都可像 Nerd Tree Plugin 一般延展、收和,或執行。</div><div><br /></div><div>以下是 Screenshot:</div><div><br /></div><div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_i3PNCkrh-3k/S2Xa-Od8j4I/AAAAAAAAJLE/EK7WbuvNgIQ/s1600-h/Screen+shot+2010-02-01+at+2.51.53+AM.png"><img style="cursor:pointer; cursor:hand;width: 320px; height: 199px;" src="http://4.bp.blogspot.com/_i3PNCkrh-3k/S2Xa-Od8j4I/AAAAAAAAJLE/EK7WbuvNgIQ/s320/Screen+shot+2010-02-01+at+2.51.53+AM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5432989288062816130" /></a></div><div><br /></div><div>Well, It's still under development.</div></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-3714030554910667469?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at January 31, 2010 08:00 PM
January 24, 2010
Once you write a plugin , you will need it to be auto-installable. <a href="http://github.com/c9s/vimana">Vimana</a> is a script manager , which parses script files, and looks for a "script type:" tag to install the script.<div><br /></div><div>For example , if you have script , which is a ftplugin , then you should write:</div><div><br /></div><script src="http://gist.github.com/291385.js?file=ann.vim"></script><div><br /></div><div>in your script file. cases is ignored.</div><div><br /></div><div>then the plugin could be installed via Vimana script manager.</div><div><br /></div><div><br /></div><div>Or if you have multiple file to install , you can put your script files in this kind of directory structure:</div><div><br /></div><div>plugin/script.vim</div><div>ftplugin/script.vim</div><div>doc/script.txt</div><div><br /></div><div>then tar it and upload to vim.org site , the plugin could be installed via Vimana too.</div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-1372556132410632844?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at January 24, 2010 03:00 PM
Vimana 的移除功能總算是找時間弄好了,兩個新的 Feature:<div><br /></div><div>1. Customizable Runtime Path:</div><div><br /></div><div>$ vimana install [plugin] --runtime-path [path]</div><div><br /></div><div>可以指定要安裝的 Runtime Path , 可在 .vimrc 內加上 set runtimepath+=[your/path] 。</div><div><br /></div><div>2. To uninstall Plugin:</div><div><br /></div><div>$ vimana remove [plugin] </div><div><br /></div><div>即可移除安裝</div><div><br /></div><div>或者強迫移除安裝:</div><div><br /></div><div>$ vimana remove [plugin] --force</div><div><br /></div><div>基本上 Installation 的 Record 都是以 JSON 格式置放在 ~/.vim/record 內,所以若有其他的 implementation 也可以很輕易的讀取,VimL 則可以直接 eval 該 record 來取得資料。</div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-2952210460665390079?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at January 24, 2010 02:00 PM
January 14, 2010
一般來說 [[ , ]] 預設可在 c , java 裡頭跳躍函式,不過沒有 support Perl code , 所以為了方便在 Perl 裡頭的函式跳躍,我寫了這樣的 search mapping:<div><br /><div><script src="http://gist.github.com/276972.js?file=perlsub.vim"></script></div><div><br /></div><div>如此就可以在 sub 函式間跳躍,如果使用 Moose 的 method ,可自己將 'method' 加上。</div></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-9151588543776896975?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at January 14, 2010 08:00 AM
December 29, 2009
Pango 裡頭的 text_extents 意義與 Cairo 的 text_extents 不太一樣。在 Pango 裡頭取得的 text extents 會有 ink 以及 logical 兩種, ink 是指包含文字的最小範圍,logical 則是整個文字 (由 baseline 往上到該 font 的 ascent 以及往下到該 font 的 descent 的範圍)<div><br /></div><div>因此可以先取得 baseline ,接著由 logical 或 ink 換算出不一樣的 ascent 與 descent 。</div><div><br /></div><div>範例如下:</div><br /><script src="http://gist.github.com/265197.js?file=pango-extents.pl"></script><br /><div>繪製成圖就很容易理解了:</div><div><br /></div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_i3PNCkrh-3k/SznkvUZ_KcI/AAAAAAAAJHM/vNHkiFscjWs/s1600-h/pango.png"><img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_i3PNCkrh-3k/SznkvUZ_KcI/AAAAAAAAJHM/vNHkiFscjWs/s400/pango.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5420615128099793346" /></a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-8876290418687080864?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at December 29, 2009 12:00 PM
December 28, 2009
I have some pod helper mappings:<div><br /></div><div><script src="http://gist.github.com/264660.js?file=pod-helper.vim"></script></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-4785178481483755499?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at December 28, 2009 02:00 PM
December 14, 2009
<a href="http://github.com/c9s/Vimana">Vimana</a> 現在支援了 Makefile 以及 Rakefile 的安裝,您只需要在 Makefile 或 Rakefile 內提供 install 的規則 (Rule) 即可。 大部分在 github 上的 vim script 專案都提供了 Rakefile 或是 Makefile 所以都可以輕易的安裝好。<div><br /></div><div>如果未提供 Makefile 或是 Rakefile ,那麼也可以使用 Vim Meta file 來做安裝。再不然可幫你偵測目錄結構,若是符合 Vim Runtime Path 的結構,那麼安裝就可成功。</div><div><br /></div><div>另外花了一些時間將相依的模組減少,讓相依性模組的安裝不會如此痛苦。<br /><div><br /></div><div>我也新增了針對 vim.org 提供的類型資訊的 leak 可以剖析 script 內容來了解 script 類型,目前支援 colorscheme , compiler, indent , syntax 等等的類型偵測。</div><div><br /></div><div>測試過的套件如下:</div><div><br />$ vimana install the-nerd-tree<br />$ vimana install autocomplpop<br />$ vimaan install gsession.vim<br />$ vimana install snipmate<br />$ vimana i svg.vim<br />$ vimana i railscasts-theme<br />$ vimana i dark-ruby<br />$ vimana i bufexplorer.zip<br />$ vimana i xml.vim<br /><br />well, i still need more test cases. ;-)</div></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-8120894983645125218?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at December 14, 2009 10:00 AM
<a href="http://github.com/c9s/Vimana">Vimana</a> supports for Makefile and Rakefile now. most vim script projects on github have its own rakefile or makefile, so that if a archive file (tar, tar.gz, zip) contains a makefile, rakefile or vim meta file. Vimana would use makefile/rakefile or meta file as its installer strategy.<br /><br />and I tried to reduce some dependencies, so that installation won't be such pain.<br /><br />I also added script inspecting feature, which inspects the script code to decide where to installer. colorscheme, compiler ,indent types are supported.<br /><br />current tested cases:<br /><br />$ vimana install the-nerd-tree<br />$ vimana install autocomplpop<br />$ vimaan install gsession.vim<br />$ vimana install snipmate<br />$ vimana i svg.vim<br />$ vimana i railscasts-theme<br />$ vimana i dark-ruby<br />$ vimana i bufexplorer.zip<br />$ vimana i xml.vim<br /><br />well, i still need more test cases. ;-)<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-7616249022412005172?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at December 14, 2009 10:00 AM
November 28, 2009
最近幾個月 Perl 社群最流行的就是 AnyEvent 的相關應用,Twitter 也不例外,利用這個 <a href="http://search.cpan.org/~reds/Net-Twitter-Stream-0.21/">Net::Twitter::Stream</a> 模組,可以即時取得最新的 Tweets,你可以設定你想要過濾的關鍵字,以下是範例:<br /><script src="http://gist.github.com/244574.js?file=net-twitter-stream.pl"></script><br /><br />想玩的人可以直接 copy 下來把 $user 以及 $pass 改掉就可以用了。 :P Perl 真的相當適合懶人呀,由此可知我就是個懶人。<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-5134821395936527023?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at November 28, 2009 06:00 PM
November 26, 2009
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_i3PNCkrh-3k/Sw5RmXb9VbI/AAAAAAAAJFs/BDWfBac1u_E/s1600/Screen+shot+2009-11-26+at+4.00.13+PM.png"><img style="cursor:pointer; cursor:hand; float:left; width: 378px; height: 244px;" src="http://3.bp.blogspot.com/_i3PNCkrh-3k/Sw5RmXb9VbI/AAAAAAAAJFs/BDWfBac1u_E/s400/Screen+shot+2009-11-26+at+4.00.13+PM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5408349922086704562" /></a> Perl completion vim plugin now supports simple context completion. you can now declare a object variable that simply returned from a 'new' constructor of class.<div><br /></div><div>It can't work out for variables that have the same name. it's not very smart but enough for scripting.</div><div><br /></div><div>I think "Padre" has some good stuff i could borrow from.</div><div><br /></div><div><a href="http://www.vim.org/scripts/script.php?script_id=2852">perl-completion.vim on vim.org</a></div><div><a href="http://github.com/c9s/perl-completion.vim">perl-completion.vim on github.com</a></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-1776260622836999169?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at November 26, 2009 11:00 AM
November 24, 2009
<a href="http://search.cpan.org/dist/Shipwright/">Shipwright</a> is a good utility for solving CPAN dependency problem (not hell anymore) . all dependencies could be bundled together.<div><br /></div><div>this is how i build <a href="http://search.cpan.org/dist/VIM-Packager/">VIM::Packager</a> bundle package with shipwright:</div><div><br /></div><script src="http://gist.github.com/242054.js?file=build_shipwright.sh"></script><div><br /></div><div>so the installation of VIM::Packager bundle binary could be:</div><div><br /></div><div>$ perl vim-packager-bundle.bin </div><div><br /></div><div>Basically , Shipwright module creates a repository to import other cpan modules into the same space. the repository could be SVN , GIT ... etc.</div><div><br /></div><div>At the end, we checkout the repository , and execute shipwright utility to build module installer. (vim-pacakger-bundle.bin)</div><div><span class="Apple-style-span" style=" white-space: pre; font-family:helvetica, arial, freesans, sans-serif;font-size:14px;"></span></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-2790246398606745451?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at November 24, 2009 06:00 PM
November 19, 2009
Vim script 有時候是非常煩人的東西,因為你每次都需要把他們一一複製到你的 VIM Runtime Path 裡頭 (通常為 `~/.vim`):<br /><br />所以假設現在要安裝 cpan.vim 這個套件,那麼就得這樣做:<br /><br /># go to libperl.vim page , download the libperl.vim file<br /># copy libperl.vim to ~/.vim/autoload/<br /><br /># go to search-window.vim page , download the search-window.vim file<br /># copy search-window.vim to ~/.vim/autoload/<br /><br /># download cpan.vim<br /># copy cpan.vim to ~/.vim/plugin/<br /><br /># config .vimrc to usage cpan.vim<br /><br />以上這些都還不是小問題,問題是 vim script 裡頭並不是每個檔案都標記了版本資訊,所以有時候換上了新版的 plugin ,可能導致其他東西爛掉。<br /><br />另外一種方式是 Vimball , Vimball 的方式相當好,但是並不是每個寫 plugin 的人都懂得如何使用 vimball , 再者 vim.org 並不規定你一定要用 vimball 才可以上傳,而且 Vimball 還是有他侷限的地方。<br /><br /><a href="http://github.com/c9s/vim-packager">VIM::Packager</a> 就是幫你做這樣的事情,安裝 cpan.vim 可以相當容易:<br /><br />$ cd cpan.vim<br />$ vim-packager build # 讀取 META 檔案 (包含 相依性資訊、套件名稱、版本、Vim 相容版本 ... etc ) 接著產生 Makefile<br />$ make install # 為你安裝所需要的相依套件,並建立紀錄<br /><br />若要移除:<br /><br />$ make uninstall<br /><br /><h3>使用 VIM::Packager 建立 Plugin</h3><br />步驟相當簡單,先建立作者資訊<br /><br />$ cat &gt; ~/.vim-author<br />author: Cornelius<br />email: cornelius.howl@DELETE.ME.gmail.com<br />^D<br /><br />$ mkdir your-plugin.vim<br />$ cd your-plugin.vim<br />$ vim-packager init # 這樣會為你產生 META 檔案、以及建立所需要的資料夾,並且利用範本為你建立文件<br /><br />$ vim META # 編輯套件資訊 (你還可以在 META 裡面加上 =script_id ,script id 對應此套件在 vim.org 的 id ,每當要釋出新版,便可以直接上傳 )<br /><br />META file 的格式相當簡單,請看:<br /><script src="http://gist.github.com/238829.js?file=gistfile1.txt"></script><br /><br />接著只需要再加上 plugin 的版本資訊即可:<br /><br />$ vim vimlib/plugin/your-plugin.vim # 加上 『 " Version: 0.1 』 版本資訊<br />$ vim-packager build # 便會產生 Makefile<br /><br />$ make dist # 幫你用 tar 打包起來<br /><br />$ make bump # 提昇版本<br /><br />$ make upload # 自動上傳到 vim.org<br /><br />以上三個動作現在可以直接用 $ make release 串起來,也就是:<br /><br />$ make release # tar 打包、提昇版本、自動上傳一次做到好。<br /><br /><br />當你在開發的時候,你也可以不需要安裝,可以利用 ln 來幫你直接連結到正在開發的檔案:<br /><br />$ make link<br /><br />或是<br /><br />$ make link-force # 強制連結<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-8163960979835457306?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at November 19, 2009 04:00 PM
November 18, 2009
<a href="http://github.com/c9s/vim-packager">VIM::Packager</a> , 最近在寫的東西。 主要是為了彌補 Vim 本身對 script 安裝以及相依性問題的不足,另外再加上一些輔助開發的 makefile script.<div><br /></div><div>可利用 $ vim-packager init 來產生 vim plugin 所需要的 skeleton ,以及 $ vim-packager build 來產生 Makefile 等等。<br /><div><br /></div><div><a href="http://github.com/c9s/vim-packager">http://github.com/c9s/vim-packager</a><br /><div><br /></div><div><br /></div></div></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-8826888602326263770?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at November 18, 2009 11:00 PM
November 14, 2009
<img src="http://cloud.github.com/downloads/c9s/perl-completion.vim/Screen_shot_2009-11-14_at_2.22.56_PM-small.png" /><br /><br /><div><a href="http://github.com/c9s/perl-completion.vim"></a></div><span><span><a href="http://github.com/c9s/perl-completion.vim">http://github.com/c9s/perl-completion.vim</a><br /><br /></span></span><div><span><span>which is defined with omni-completion. when filetype is perl , the completion function will be binded. this plugin completes function names for you and also base class function names. </span></span></div><div><br /></div><div><div><span><span>you need to install VIM::Packager first, it solve dependencies for you. the depended scripts will be retrived from an url , which is on github.com.</span></span></div><div><br /></div><div>remember to add path ~/.vim/bin to your $PATH env variable to make sure vimscript can find the scripts. the parsing utils will be installed in ~/.vim/bin/.</div><div><span><span><br />$ sudo cpan VIM::Packager</span></span></div><div><span><span><br /># run vim-packager to convert VIM meta file (VIMMETA)</span></span></div><div><span><span>$ vim-packager build<br />$ make install<br /><br /></span></span></div><div><span><span>just press C-x C-o after a $self-&gt; or Package::Something-&gt; to pop the completion menu up when you are in perl files.</span></span></div><div><span><span>and you can also integrate this to your autocomplpop plugin.</span></span><div></div></div><div><br /></div><div><span><span>will support Moose TypeConstrant , Accessor completetion in future.</span></span></div></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-9163156404283177943?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at November 14, 2009 09:00 AM
October 31, 2009
於此網址:<a href="http://oulixe.us/talks/yapc-tiny-2.xul"><br />http://oulixe.us/talks/yapc-tiny-2.xul</a><br /><br />請用 Firefox 開啟。謝謝。:)<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-7206994254296896046?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at October 31, 2009 10:00 PM
October 26, 2009
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_i3PNCkrh-3k/SuWaSyn848I/AAAAAAAAJDg/_6tDhf1j7ww/s1600-h/Screen+shot+2009-10-26+at+8.46.18+PM.png"><img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 163px;" src="http://3.bp.blogspot.com/_i3PNCkrh-3k/SuWaSyn848I/AAAAAAAAJDg/_6tDhf1j7ww/s320/Screen+shot+2009-10-26+at+8.46.18+PM.png" alt="" id="BLOGGER_PHOTO_ID_5396889376091071426" border="0" /></a>I just fixed the Autocomplop vim plugin conflicts of <a href="http://github.com/c9s/cpan.vim">cpan.vim</a><br /><br />so if you open the cpan search window , it will detect the autocomplpop plugin , if you are using autocomplpop , then cpan.vim will disable it for temporary. after window closed, it will be enabled again.<br /><br />also, thanks dann for tracing the autocomplpop problem.<br /><br />and I added some highlight stuff.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-7947820039755911137?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at October 26, 2009 01:00 PM
October 24, 2009
這次特別請到 Perl 社群中最愛橘色的 Leon Brocard 來分享,他目前也是 Perl 5.11.3 版(將於十二月釋出)的負責人。<br /><br />於 10/29 星期四晚上七點,於台中中港路上的 match cafe (默契咖啡)<br /><br />名額有限,報名從速喔!報名網頁: <a href="http://registrano.com/events/yapc-tiny-second%20">http://registrano.com/events/yapc-tiny-second </a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-7909790231659686420?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at October 24, 2009 10:00 AM
October 18, 2009
<object height="340" width="560"><param name="movie" value="http://www.youtube.com/v/Y4yz0H8W-Ts&amp;hl=en&amp;fs=1&amp;"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/Y4yz0H8W-Ts&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="340" width="560"></embed></object><br /><br />昨天在往台南的客運上 hack 了一個這樣的東西,可以針對 $self, $class, Class::Name 這幾種狀況做 completion,目前的 perl-completion 使用 PPI (pure perl parser) 來找出目前 package 繼承的 class 的函式以及能夠依據設定找出第 n 層的 class function (預設是兩層)。<br /><br />輸入字串至 Class-&gt; 按下 Ctrl-x Ctrl-x 便能開啟 perl-completion window ,在 insert mode 輸入 pattern 時,直接按下 Enter 能夠自動 complete 第一個 item. Ctrl-n , Ctrl-p 可以上下選擇 completion item, Ctrl-j , Ctrl-k 能夠跳至上一個/下一個 package,ESC 可直接關閉 completion window。<br /><br />有空在將這個 completion window generalize ,那麼便可以很容易的支援其他 Language。<br /><br />下一步想做的是 function preview ,由於在 Perl 的 Subroutine 內,我們可以用各種方式取用 Arguments ,所以若要自動 parse function argument 作為 completion 的提示,並不容易。初步的想法是,可以將一個 function 的最初幾行做預覽。那麼哪怕忘記 function 該怎麼 call ,只需要叫出預覽視窗即可。<br /><br />目前 perl-completion.vim 還在 github.com/c9s/cpan.vim 內。昨天晚上把所有 perl 相關函式整理至 autoload/libperl.vim ,以及將各 plugin 切割出來,如 ctags-search.vim , cpan.vim , perl-completion.vim , perl-function-search.vim 等。<br /><br />試想在這樣的 plugin 開發,未來可以在 Vimana 實做 : 自動建立 vim plugin 框架,自動產生 makefile,dependency check, plugin version check 之類的功能。<br /><br />目前的 perl-completion.vim 放在 <a href="http://github.com/c9s/cpan.vim/">http://github.com/c9s/cpan.vim/</a> 內。<br /><br /><br />安裝方式如下:<br /><br />使用 git 將 repository checkout 出來<br /><br />$ git clone git://github.com/c9s/cpan.vim.git<br />$ cd cpan.vim<br />$ make install<br /><br />安裝 cpan.vim 同時有下列幾種功能: perl function search , ctags search , cpan module search , perl-completion<br /><br />相關文章:<br /><a href="http://c9s.blogspot.com/2009/10/cpanvim-now-supports-ctags-search.html">http://c9s.blogspot.com/2009/10/cpanvim-now-supports-ctags-search.html</a><br /><a href="http://c9s.blogspot.com/2009/09/cpanvim.html">http://c9s.blogspot.com/2009/09/cpanvim.html</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-1761721664042473332?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at October 18, 2009 07:00 AM
October 04, 2009
前陣子參加 YAPC::Asia,看了 <a href="http://github.com/imakado">imakado</a> demo 的 emacs plugin - <a href="http://github.com/imakado/cpan.el">cpan.el</a> 以及 <a href="http://github.com/imakado/perl-completion">perl-completion.el</a> ,所以我於會後也寫了一個類似的 vim plugin。screencast 可參考此處 (<a href="http://c9s.blogspot.com/2009/09/cpanvim.html">http://c9s.blogspot.com/2009/09/cpanvim.html</a>)<br /><br />寫著寫著覺得可以開發的功能實在很多,於是除了讓 cpan.vim 可以迅速的搜尋 CPAN 模組之外,也支援其他種搜尋模式,如只搜尋 ./lib/ 或是 @INC 或是從 cpan source list 上搜尋。<br /><br />除此之外另外對其他非 Perl 使用者會比較實用的是 ctags search 的功能,要使用此功能必須先安裝 <a href="http://ctags.sourceforge.net/">Exuberant ctags</a> ,來利用 Exuberant Ctags 對各種語言的程式碼來產生 ctags file,目前 <a href="http://ctags.sourceforge.net/languages.html">Exuberant Ctags 支援 41 多種語言</a>。<br /><br />手動產生的方法如下:<br /><br />$ ctags -R foo.c bar.c /path/to/source/<br /><br />這樣便會產生檔案名稱為 tags 的 taglist 檔案於目前目錄下。<br /><br />這是原始的作法。<br /><br />利用 cpan.vim 則只需要使用快捷鍵 Ctrl-C,Ctrl-T 即可開啟 Ctags Search Window,如果找不到 tags 檔案,便會詢問你要產生 ctags 的來源路徑 (支援自動補完路徑 path completion ),然後自動為你產生。<br /><br />鍵入 Pattern 後會自動替你搜尋相關對應的標籤 (tag) ,可用 Ctrl-N , Ctrl-P 來選擇結果,Ctrl-A, Ctrl-E 來跳至行頭、行尾。<br /><br />Enter 則會直接進入該標籤 (tag) , 按下 t 則會將標籤開於新分頁。若該標籤 (tag) 對應到多個檔案,則會跳出選擇清單,只需鍵入編號進入即可。<br /><br />目前唯一的缺點就是當 ctags 檔案非常非常大的時候會有點慢。<br /><br />詳細的使用說明於 README 檔案內。不過我目前還沒有上傳新的版本至 vim.org,我太懶了。(其實是 vim.org 做的實在很簡陋 , sucks)<br /><br />各位使用從 github checkout 最新版本出來即可。<br /><br />Github: <a href="http://github.com/c9s/cpan.vim">http://github.com/c9s/cpan.vim</a><br /><br />或是直接下 git 命令:<br /><br />$ git clone git://github.com/c9s/cpan.vim.git<br /><br />安裝則相當簡易,在 Plugin 目錄下輸入一行命令即可:<br /><br />$ make install<br /><br />其他相關問題歡迎在此篇 Blog 下發問。謝謝。<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-1317896321878513051?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at October 04, 2009 09:00 AM
September 21, 2009
my recent vim hack. inspired from imakado's perl-completion.el and cpan.el<br /><br /><object height="340" width="560"><param name="movie" value="http://www.youtube.com/v/erF0NWUIbr4&amp;hl=en&amp;fs=1&amp;"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/erF0NWUIbr4&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="340" width="560"></embed></object><br /><br />it's on <a href="http://github.com/c9s/cpan.vim">http://github.com/c9s/cpan.vim</a><br /><br />installation and feature intro are in README.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-3342473288378046720?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at September 21, 2009 08:00 PM
July 29, 2009
本人於八月一號會在台南 SA 有個 Jifty Web Framework 的主題分享。 :-)<br /><br />詳細資料於此:<br /><a href="http://phorum.study-area.org/index.php/topic,57468.0.html">http://phorum.study-area.org/index.php/topic,57468.0.html</a><br /><br />歡迎參加。對 Perl 程式語言有興趣的朋友們更不能錯過喔!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-8301057353885269282?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at July 29, 2009 01:00 PM
June 16, 2009
日前寫了一篇 Jifty OpenID Plugin 的教學。已經於 CPAN 更新。<br /><br /><a href="http://search.cpan.org/%7Eyvesago/Jifty-Plugin-OpenID-1.00/doc/OpenID_zhtw.pod">http://search.cpan.org/~yvesago/Jifty-Plugin-OpenID-1.00/doc/OpenID_zhtw.pod</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-8268225961021247591?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at June 16, 2009 04:00 AM
May 29, 2009
當你撰寫任何 Perl 應用程式或是模組,你可能會使用單元測試 (unit test) 來測試你的應用程式是否正確運作。但是測試總是會有遺漏的地方。<br /><br /><a href="http://search.cpan.org/dist/Devel-Cover/">Devel::Cover</a> 模組就是可以幫助你分析測試到的程式碼涵蓋哪些部份,哪些部份總共被執行了幾次,哪些地方沒有被測試到。<br /><br />安裝 Devel::Cover 模組:<br /><code>sudo cpanp i Devel::Cover</code><br /><br />當你 test 都寫好於 t/ 目錄底下,Makefile.PL 也設定好哪些測試目錄底下的測試要被執行。便可先將 Makefile.PL 執行,產生 Makefile.<br /><code>perl Makefile.PL &amp;&amp; make</code><br /><br />接著直接執行 Devel::Cover 所提供的 "cover" script.<br /><code>cover -test</code><br /><br />如此一來就會開始執行測試 (make test) 並且產生報表:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_i3PNCkrh-3k/Sh9WwVYGTgI/AAAAAAAAG4E/NYdNtxX-j8c/s1600-h/Picture+5.png"><img style="cursor: pointer; width: 320px; height: 184px;" src="http://1.bp.blogspot.com/_i3PNCkrh-3k/Sh9WwVYGTgI/AAAAAAAAG4E/NYdNtxX-j8c/s320/Picture+5.png" alt="" id="BLOGGER_PHOTO_ID_5341083071456628226" border="0" /></a><br /><br />另外也會產生 HTML 報表:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_i3PNCkrh-3k/Sh9Wwi0wgoI/AAAAAAAAG4U/gJ0V6XJonCE/s1600-h/Picture+7.png"><img style="cursor: pointer; width: 320px; height: 270px;" src="http://4.bp.blogspot.com/_i3PNCkrh-3k/Sh9Wwi0wgoI/AAAAAAAAG4U/gJ0V6XJonCE/s320/Picture+7.png" alt="" id="BLOGGER_PHOTO_ID_5341083075066495618" border="0" /></a><br />更詳盡的測試分析:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_i3PNCkrh-3k/Sh9Ww86zmiI/AAAAAAAAG4c/9PgRR2HOrbw/s1600-h/Picture+8.png"><img style="cursor: pointer; width: 320px; height: 135px;" src="http://4.bp.blogspot.com/_i3PNCkrh-3k/Sh9Ww86zmiI/AAAAAAAAG4c/9PgRR2HOrbw/s320/Picture+8.png" alt="" id="BLOGGER_PHOTO_ID_5341083082071185954" border="0" /></a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-3229134075518075658?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at May 29, 2009 04:00 AM
May 28, 2009
I just wrote a script to install cpan modules inside vim. so that we can move cursor to the module name , and press C-x C-i to install module. :p<br /><br />是一小段可以方便安裝 CPAN 模組的 vim script. 只要把 cursor 移動到 use YAML::Syck; 之類的 YAML 字樣上方,然後按下 C-x C-i 就會安裝 YAML::Syck 模組。<br /><br />對於 python 或是 ruby 的朋友可以把對 CWORD 的 regular expression 和 command 換一下,應該就可以用了。<br /><script src="http://gist.github.com/119172.js"></script><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3147036244016021082-2149779716247023722?l=c9s.blogspot.com' alt='' /></div></content>
by c9s at May 28, 2009 08:00 AM