<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;DEcGSH44fCp7ImA9WhRWEk8.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875</id><updated>2011-12-30T14:20:29.034+08:00</updated><category term="flash" /><category term="GOGO7188" /><category term="書" /><category term="軟體" /><category term="無障礙" /><category term="湊活" /><category term="遊戲" /><category term="CodeIgniter" /><category term="userChrome" /><category term="command" /><category term="雜物" /><category term="素材" /><category term="vim-cycle" /><category term="Photoshop" /><category term="現場" /><category term="git" /><category term="bookmarklet" /><category term="即使不想做也" /><category term="XHTML" /><category term="公益" /><category term="關於這裡" /><category term="Dropbox" /><category term="MooTools" /><category term="程式" /><category term="常識" /><category term="jQuery" /><category term="CSS" /><category term="人物" /><category term="Carabao" /><category term="PSPad" /><category term="vim-ref-bingzh" /><category term="ACQUIRE" /><category term="崔健" /><category term="Noise" /><category term="Mp3tag" /><category term="Prototype" /><category term="網頁設計" /><category term="Google" /><category term="客家" /><category term="ie" /><category term="音樂" /><category term="Vim" /><category term="Firefox" /><category term="blogger" /><category term="HTML" /><category term="vimrc_human" /><category term="歌詞" /><category term="JavaScript" /><category term="foobar2000" /><title>沒穿方服</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>111</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/bootleqblogger" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="bootleqblogger" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CkUNRX4yfip7ImA9WhRXF08.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-8594696943073258508</id><published>2011-12-24T17:51:00.000+08:00</published><updated>2011-12-24T17:51:34.096+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-24T17:51:34.096+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>Visual mode * 尋找多行文字</title><content type="html">&lt;p&gt;
  &lt;a href="http://www.ptt.cc/bbs/Editor/index.html" title="看板 - 批踢踢實業坊"&gt;PTT Editor 板&lt;/a&gt;看到的問題：如何搜尋多行文字？ 能不能 Visual 選起來搜尋？
&lt;/p&gt;

&lt;p&gt;
  以前從 &lt;a href="https://github.com/kana/config/blob/master/vim/personal/dot.vimrc" title="vim/personal/dot.vimrc at master from kana/config - GitHub"&gt;kana 的 vimrc&lt;/a&gt; 看到一個自訂函數 &lt;code&gt;search_the_selected_text_literaly('n')&lt;/code&gt;，這個設計是在 Visual mode 打 &lt;kbd&gt;*&lt;/kbd&gt; 便能尋找選取的文字。&lt;br&gt;
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;p&gt;
  剛剛發現，處理一下換行字元就能支援多行 pattern 了，具體為
  &lt;code&gt;substitute(pattern, '\V\n', '\\n', 'g')&lt;/code&gt;。
&lt;/p&gt;

&lt;h3&gt;成品&lt;/h3&gt;

&lt;pre class="vim"&gt;
&lt;span class="Comment"&gt;&amp;quot;&lt;/span&gt; &lt;span class="PreProc"&gt;Ref:&lt;/span&gt;&lt;span class="Comment"&gt; kana - &lt;a href="https://github.com/kana/config"&gt;https://github.com/kana/config&lt;/a&gt;&lt;/span&gt;
&lt;span class="Statement"&gt;vnoremap&lt;/span&gt; * :&lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;C-U&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;set hlsearch&lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;CR&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;:call &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;SID&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;search_selected_text_literaly('n')&lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;CR&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="Statement"&gt;vnoremap&lt;/span&gt; # :&lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;C-U&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;set hlsearch&lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;CR&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;:call &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;SID&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;search_selected_text_literaly('N')&lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;CR&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="Statement"&gt;function&lt;/span&gt;! &lt;span class="Special"&gt;s:&lt;/span&gt;search_selected_text_literaly&lt;span class="Special"&gt;(&lt;/span&gt;search_command&lt;span class="Special"&gt;)&lt;/span&gt;
  &lt;span class="Statement"&gt;call&lt;/span&gt; SaveReg&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="String"&gt;'0'&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;
  &lt;span class="Statement"&gt;call&lt;/span&gt; SaveReg&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="String"&gt;'&amp;quot;'&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;

  &lt;span class="Statement"&gt;normal!&lt;/span&gt; gvy
  &lt;span class="Statement"&gt;let&lt;/span&gt; pattern &lt;span class="Operator"&gt;=&lt;/span&gt; &lt;span class="Function"&gt;escape&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;@&lt;span class="Constant"&gt;0&lt;/span&gt;, &lt;span class="String"&gt;'\'&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;
  &lt;span class="Statement"&gt;let&lt;/span&gt; pattern &lt;span class="Operator"&gt;=&lt;/span&gt; &lt;span class="Function"&gt;substitute&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;pattern, &lt;span class="String"&gt;'\V\n'&lt;/span&gt;, &lt;span class="String"&gt;'\\n'&lt;/span&gt;, &lt;span class="String"&gt;'g'&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;
  &lt;span class="Statement"&gt;let&lt;/span&gt; @/ &lt;span class="Operator"&gt;=&lt;/span&gt; pattern
  &lt;span class="Statement"&gt;call&lt;/span&gt; &lt;span class="Function"&gt;histadd&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="String"&gt;'/'&lt;/span&gt;, &lt;span class="String"&gt;'\V'&lt;/span&gt; &lt;span class="Operator"&gt;.&lt;/span&gt; pattern&lt;span class="Special"&gt;)&lt;/span&gt;
  &lt;span class="Statement"&gt;execute&lt;/span&gt; &lt;span class="String"&gt;'normal!'&lt;/span&gt; &lt;span class="Identifier"&gt;a:search_command&lt;/span&gt;
  &lt;span class="Statement"&gt;let&lt;/span&gt; v:searchforward &lt;span class="Operator"&gt;=&lt;/span&gt; &lt;span class="Identifier"&gt;a:search_command&lt;/span&gt; &lt;span class="Operator"&gt;==#&lt;/span&gt; &lt;span class="String"&gt;'n'&lt;/span&gt;

  &lt;span class="Statement"&gt;call&lt;/span&gt; RestoreReg&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="String"&gt;'0'&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;
  &lt;span class="Statement"&gt;call&lt;/span&gt; RestoreReg&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="String"&gt;'&amp;quot;'&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;
&lt;span class="Statement"&gt;endfunction&lt;/span&gt;
&lt;/pre&gt;

&lt;p class="gray-dd"&gt;
  註：&lt;code&gt;SaveReg&lt;/code&gt; 和 &lt;code&gt;RestoreReg&lt;/code&gt; 是用來備份 register 的自訂函數，此處不重要，就不寫了。
&lt;/p&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-8594696943073258508?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/wti7Y20zFv8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/8594696943073258508/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/12/visual-mode.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8594696943073258508?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8594696943073258508?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/12/visual-mode.html" title="Visual mode * 尋找多行文字" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEQBSH4_fCp7ImA9WhRXE00.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-4436301783588622523</id><published>2011-12-19T22:52:00.000+08:00</published><updated>2011-12-19T22:52:39.044+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T22:52:39.044+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Dropbox" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>利用 Dropbox 同步 git repository</title><content type="html">&lt;p&gt;
  多台電腦 git repository 最簡單的同步方式，應該是把 .git 目錄放在 Dropbox 底下。
&lt;/p&gt;

&lt;p&gt;
  在 repository 直接編輯 .git/config，加進一個叫做 &lt;var&gt;{dropbox}&lt;/var&gt; 的 &lt;strong&gt;remote&lt;/strong&gt;，url 設成 Dropbox 下的目錄；&lt;br&gt;
  再配合該 remote 設定一個叫 &lt;var&gt;{wip}&lt;/var&gt; 的 &lt;strong&gt;branch&lt;/strong&gt;。（後面有範例）
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;p&gt;
  然後 cd 到 &lt;var&gt;{dropbox}&lt;/var&gt; 目錄，把剛設的 remote url 建立起來：
  &lt;code&gt;git init --bare&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
  日後只要在 &lt;var&gt;{wip}&lt;/var&gt; branch 做 &lt;code&gt;git pull&lt;/code&gt;、&lt;code&gt;push&lt;/code&gt; 就都是對 Dropbox 動作了。
&lt;/p&gt;

&lt;hr class="hr"&gt;

&lt;p&gt;
  我在 GitHub fork 別人專案後，通常會建一個 &lt;code&gt;[remote "dropbox"]&lt;/code&gt;，配合 &lt;code&gt;[branch "wip"]&lt;/code&gt; 自己亂改。
  寫到一個段落再整理進 master，另外 upstream branch 則是用來跟原作者的進度。
&lt;/p&gt;

&lt;h3&gt;常用 .git/config 樣板&lt;/h3&gt;

&lt;pre class="vim"&gt;
&lt;span class="Statement"&gt;[core]&lt;/span&gt;
  &lt;span class="Identifier"&gt;repositoryformatversion&lt;/span&gt; = &lt;span class="Constant"&gt;0&lt;/span&gt;
  &lt;span class="Identifier"&gt;filemode&lt;/span&gt; = &lt;span class="Constant"&gt;true&lt;/span&gt;
  &lt;span class="Identifier"&gt;bare&lt;/span&gt; = &lt;span class="Constant"&gt;false&lt;/span&gt;
  &lt;span class="Identifier"&gt;logallrefupdates&lt;/span&gt; = &lt;span class="Constant"&gt;true&lt;/span&gt;

&lt;span class="Statement"&gt;[remote &amp;quot;origin&amp;quot;]&lt;/span&gt;
  &lt;span class="Identifier"&gt;fetch&lt;/span&gt; = +refs/heads/*:refs/remotes/origin/*
  &lt;span class="Identifier"&gt;url&lt;/span&gt; = git@github.com:{ME}/{PROJECT}.git
&lt;span class="Statement"&gt;[remote &amp;quot;upstream&amp;quot;]&lt;/span&gt;
  &lt;span class="Identifier"&gt;fetch&lt;/span&gt; = +refs/heads/*:refs/remotes/upstream/*
  &lt;span class="Identifier"&gt;url&lt;/span&gt; = git://github.com/{AUTHOR}/{PROJECT}.git
&lt;span class="Statement"&gt;[remote &amp;quot;dropbox&amp;quot;]&lt;/span&gt;
  &lt;span class="Identifier"&gt;fetch&lt;/span&gt; = +refs/heads/*:refs/remotes/dropbox/*
  &lt;span class="Identifier"&gt;url&lt;/span&gt; = /home/bootleq/dropbox/repository/bare/{PROJECT}/

&lt;span class="Statement"&gt;[branch &amp;quot;master&amp;quot;]&lt;/span&gt;
  &lt;span class="Identifier"&gt;remote&lt;/span&gt; = origin
  &lt;span class="Identifier"&gt;merge&lt;/span&gt; = refs/heads/master
&lt;span class="Statement"&gt;[branch &amp;quot;upstream&amp;quot;]&lt;/span&gt;
  &lt;span class="Identifier"&gt;remote&lt;/span&gt; = upstream
  &lt;span class="Identifier"&gt;merge&lt;/span&gt; = refs/heads/master
&lt;span class="Statement"&gt;[branch &amp;quot;wip&amp;quot;]&lt;/span&gt;
  &lt;span class="Identifier"&gt;remote&lt;/span&gt; = dropbox
  &lt;span class="Identifier"&gt;merge&lt;/span&gt; = refs/heads/wip


&lt;span class="Comment"&gt;; vim&amp;#0058; filetype=gitconfig&lt;/span&gt;
&lt;/pre&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-4436301783588622523?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/AblD9o06-xo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/4436301783588622523/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/12/dropbox-git-repository.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4436301783588622523?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4436301783588622523?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/12/dropbox-git-repository.html" title="利用 Dropbox 同步 git repository" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUACRH05cSp7ImA9WhRXEUo.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-8910365245831433955</id><published>2011-12-18T11:09:00.000+08:00</published><updated>2011-12-18T11:09:25.329+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-18T11:09:25.329+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="客家" /><title>實用客語：耗漦（ㄏㄠ ㄒㄧㄠ）</title><content type="html">&lt;p&gt;
  在爸爸公司發現一本「客語字典」，查到一個阿婆常用、我一直不會寫的詞。
&lt;/p&gt;

&lt;h3&gt;耗漦（ㄏㄠ ㄒㄧㄠ）&lt;/h3&gt;
&lt;p&gt;
  使用時機跟「屁咧」差不多，
  大概也猜得到，應該是河洛話 de facto 寫法「&lt;strong&gt;豪洨&lt;/strong&gt;」的那個詞。&lt;br&gt;
  但是這本字典只有兩個字「虛假」解釋，沒了。
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;p&gt;
  國語典「漦」ㄌㄧˊ：
  龍或魚的唾液。
  &lt;q title="出自『國語．鄭語』韋昭 注"&gt;龍所吐沫，龍之精氣也&lt;/q&gt;。
&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;還是很好奇語源由來。&lt;/li&gt;
  &lt;li&gt;有不雅的意思嗎？&lt;/li&gt;
  &lt;li&gt;無法理解這兩個國字怎麼來的，所以書寫時，還是不敢用。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;生活用法&lt;/h3&gt;
&lt;p&gt;
  相當實用，也許能取代「屁啦」。
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;「我講正經的，不是耗漦的哦。」——此處耗漦同「虛假」「騙人」。&lt;/li&gt;
  &lt;li&gt;「耗漦」——可表達不以為然，或用於鬥嘴時的串場，同「你耗漦」。&lt;/li&gt;
  &lt;li&gt;「耗耗漦漦」——耗漦的加強版。 以加強版的直覺與便利性來看，這個詞比國語的好用。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;語音樣本&lt;/h3&gt;
&lt;p&gt;
  以下是 2008 年發神經錄的，前三檔是我阿婆、最後一檔是我的聲音。
&lt;/p&gt;
&lt;iframe width="100%" height="166" class="html5player" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F30870743&amp;show_artwork=true"&gt;&lt;/iframe&gt;

&lt;iframe width="100%" height="166" class="html5player" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F30871592&amp;show_artwork=true"&gt;&lt;/iframe&gt;

&lt;iframe width="100%" height="166" class="html5player" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F30871593&amp;show_artwork=true"&gt;&lt;/iframe&gt;

&lt;iframe width="100%" height="166" class="html5player" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F30874220&amp;show_artwork=true"&gt;&lt;/iframe&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-8910365245831433955?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/Y9yQ8wSLabU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/8910365245831433955/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/12/blog-post_18.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8910365245831433955?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8910365245831433955?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/12/blog-post_18.html" title="實用客語：耗漦（ㄏㄠ ㄒㄧㄠ）" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEQDR3w5fSp7ImA9WhRXEU8.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-3957078547841272633</id><published>2011-12-17T19:21:00.000+08:00</published><updated>2011-12-17T19:46:16.225+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-17T19:46:16.225+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><category scheme="http://www.blogger.com/atom/ns#" term="vim-ref-bingzh" /><title>英漢字典查詢</title><content type="html">&lt;p&gt;
  有了
  &lt;a class="underline" href="https://github.com/mattn/wwwrenderer-vim" title="mattn/wwwrenderer-vim - GitHub"&gt;mattn/wwwrenderer-vim&lt;/a&gt;
  應該就能輕鬆「在 Vim 裡查字典」了吧？&lt;br&gt;
  這兩週諸事不順，寫了 3 個解法，只有一個堪用。
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;h3&gt;Google 字典下架&lt;/h3&gt;

&lt;p&gt;
  第一版的 &lt;a href="https://gist.github.com/1455020" title="Vim 陽春 google 字典，反正已經沒用了，google 停了這服務 — Gist"&gt;function&lt;/a&gt;，
  採用&lt;a href="http://www.google.com.tw/m/search?site=dictionary" title="Google"&gt;&lt;strong&gt;行動版&lt;/strong&gt; Google 字典&lt;/a&gt;&lt;small&gt;（桌面版 8 月就關了）&lt;/small&gt;，快又聰明，還能翻譯整句。
&lt;/p&gt;

&lt;p&gt;
  12/7 寫完，12/8 這個字典就&lt;a href="http://grassboy.tw/googleDicPlus/goodbye.php" title="Good Bye~ Google Dictionary :("&gt;停止服務&lt;/a&gt;、沒有中文了。
  恨啊。
&lt;/p&gt;

&lt;p class="float"&gt;
  &lt;a href="http://3.bp.blogspot.com/-JuPvSbBMXhA/TuxgtWhvCbI/AAAAAAAABUY/NayLV-cZH48/s1600/google-dict-closed.png"&gt;&lt;img src="http://3.bp.blogspot.com/-JuPvSbBMXhA/TuxgtWhvCbI/AAAAAAAABUY/NayLV-cZH48/s320/google-dict-closed.png" alt="「字典」已經變「翻譯」了" /&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;h3 class="both"&gt;Dr.eye 回應速度慢（可能是我實作問題）&lt;/h3&gt;
&lt;p&gt;
  第二版的 &lt;a href="https://gist.github.com/1489352" title="Vim 陽春 Dr.eye 字典，沒在用了，太慢 — Gist"&gt;function&lt;/a&gt;，
  改用 &lt;a href="http://www.dreye.com/mws/dict.php" title="權威字網站 | Dr.eye"&gt;Dr.eye（譯典通）字典行動版&lt;/a&gt;。
&lt;/p&gt;

&lt;p class="ta-c"&gt;
  &lt;a href="http://2.bp.blogspot.com/-NZkmL8LCU-0/Tuxg4LJzOmI/AAAAAAAABUk/6f2Kq-gU7kk/s1600/dr-eye-search-default.png"&gt;&lt;img src="http://2.bp.blogspot.com/-NZkmL8LCU-0/Tuxg4LJzOmI/AAAAAAAABUk/6f2Kq-gU7kk/s400/dr-eye-search-default.png" alt="預設查「字義」" /&gt;&lt;/a&gt;
  &lt;br&gt;
  &lt;a href="http://2.bp.blogspot.com/-xatAWXdH8Xk/Tuxg4b2mlzI/AAAAAAAABUw/UFii3UR3dsA/s1600/dr-eye-search-modes.png"&gt;&lt;img src="http://2.bp.blogspot.com/-xatAWXdH8Xk/Tuxg4b2mlzI/AAAAAAAABUw/UFii3UR3dsA/s720/dr-eye-search-modes.png" alt="buffer 第一行的選單，可以切換不同查詢" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  因為不是每次都慢，所以寫完→使用時才正視問題。
  加入計時功能後，發現 query 常常要花上 10、甚至超過 30 秒，完全無法忍受。
&lt;/p&gt;
&lt;p&gt;
  明明 Firefox 開都蠻快的啊……
  總之我很灰心，不想查了。
&lt;/p&gt;

&lt;h3&gt;必应词典&lt;/h3&gt;
&lt;p&gt;
  第三次，不想再直接改舊 function，那個沒結構的東西寫了新的就失去舊的，太心寒了。&lt;br&gt;
  這次投靠微軟的
  &lt;a href="http://dict.bing.com.cn/?view=touch" title="Bing Dictionary(Beta)"&gt;Bing 字典（智能手机版）&lt;/a&gt;
  寫成
  &lt;a class="underline" href="https://github.com/thinca/vim-ref" title="thinca/vim-ref - GitHub"&gt;thinca/vim-ref&lt;/a&gt; 用的 source：&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
  &lt;a class="underline" href="https://github.com/bootleq/vim-ref-bingzh" title="bootleq/vim-ref-bingzh - GitHub"&gt;bootleq/vim-ref-bingzh - GitHub&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  成品還在不穩定階段，最近也無心重構，就是頂著用用。
&lt;/p&gt;

&lt;hr class="hr"&gt;

&lt;h3&gt;擷圖&lt;/h3&gt;
&lt;p&gt;
  目前顯示格式大致如圖，隨著每天使用，還會大改。
&lt;/p&gt;

&lt;p&gt;
  &lt;a class="va-m inline-block" href="http://3.bp.blogspot.com/-OgkV1QEWkQI/TuxnH2eBuhI/AAAAAAAABVA/4X0jbxJUnk4/s1600/ref-bingzh-full.png"&gt;&lt;img src="http://3.bp.blogspot.com/-OgkV1QEWkQI/TuxnH2eBuhI/AAAAAAAABVA/4X0jbxJUnk4/s400/ref-bingzh-full.png" alt="目前顯示格式，持續翻修中" /&gt;&lt;/a&gt;

  &lt;a class="va-m inline-block" href="http://4.bp.blogspot.com/-79AYgbHlHDo/TuxnIB-tK1I/AAAAAAAABVI/5rTi0ZScBRM/s1600/ref-bingzh-ch.png"&gt;&lt;img src="http://4.bp.blogspot.com/-79AYgbHlHDo/TuxnIB-tK1I/AAAAAAAABVI/5rTi0ZScBRM/s400/ref-bingzh-ch.png" alt="也可拿來翻譯" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;簡繁轉換：OpenCC&lt;/h3&gt;
&lt;p&gt;
  「必应词典」這個服務只有簡體字，以致： 1) 繁體的詞查不到翻譯， 2) 簡體的內文，台灣人看得很累。&lt;br&gt;
  解法是嘗試用 &lt;a href="http://code.google.com/p/opencc/" title="opencc - 開放中文轉換 - Google Project Hosting"&gt;OpenCC&lt;/a&gt; 轉換，只要能執行 &lt;code&gt;opencc&lt;/code&gt; 就自動轉。&lt;br&gt;
  目前我自己在 Ubuntu 上使用順利，不過 Windows 上還沒搞定。
&lt;/p&gt;

&lt;h3&gt;輔助設定：normal &lt;kbd&gt;K&lt;/kbd&gt;&lt;/h3&gt;
&lt;pre class="vim"&gt;
&lt;span class="Statement"&gt;nnoremap&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;silent&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt; K :call ref#jump('normal', 'bingzh')&lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;CR&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  按 &lt;kbd&gt;K&lt;/kbd&gt; 就會查游標上的單字。
  目前 ref-bingzh 會自動把 CamelCase 或 under_score 拆開，只查其中一個字。
&lt;/p&gt;

&lt;h3&gt;輔助設定：visual &lt;kbd&gt;K&lt;/kbd&gt;&lt;/h3&gt;
&lt;pre class="vim"&gt;
&lt;span class="Statement"&gt;xnoremap&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;silent&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt; K :call ref#jump('visual', 'bingzh')&lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;CR&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  在 visual mode 按 &lt;kbd&gt;K&lt;/kbd&gt; 就會查選中的字。
&lt;/p&gt;

&lt;h3&gt;輔助設定：&lt;kbd&gt;:k&lt;/kbd&gt;&lt;/h3&gt;
&lt;pre class="vim"&gt;
&lt;span class="Statement"&gt;cnoreabbrev&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;expr&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt; k ((getcmdtype() == ':' &amp;amp;&amp;amp; getcmdpos() &amp;lt;= 2) ? 'Ref bingzh' : 'k')
&lt;/pre&gt;
&lt;p&gt;
  打 &lt;code&gt;:k&amp;lt;space&amp;gt;&lt;/code&gt; 會自動展開成 &lt;code&gt;:Ref bingzh &lt;/code&gt; 方便輸入。&lt;br&gt;
  例如想查 foo 就打 &lt;kbd&gt;:k&amp;lt;space&amp;gt;foo&amp;lt;Enter&amp;gt;&lt;/kbd&gt;。
&lt;/p&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-3957078547841272633?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/5j3f5W7aVz0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/3957078547841272633/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/12/blog-post.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/3957078547841272633?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/3957078547841272633?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/12/blog-post.html" title="英漢字典查詢" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-JuPvSbBMXhA/TuxgtWhvCbI/AAAAAAAABUY/NayLV-cZH48/s72-c/google-dict-closed.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0UDQX09eyp7ImA9WhRSGEU.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-8220932178213394897</id><published>2011-11-21T22:21:00.000+08:00</published><updated>2011-11-21T22:21:10.363+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-21T22:21:10.363+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="遊戲" /><title>『斑鳩』使用前記錄</title><content type="html">&lt;h3&gt;最好的遊戲&lt;/h3&gt;
&lt;p&gt;
  「心目中最好的遊戲」如果想不出答案，那就保留吧，不必降低高度。
&lt;/p&gt;

&lt;div class="fullpost"&gt;
&lt;p&gt;
  十年前買了平時沒需求的雜誌「&lt;a href="http://www.arcadiamagazine.com/cgi-bin/product_view.cgi?id=112" title="月刊アルカディア1月号"&gt;月刊アルカディア 2002 - 1 月号&lt;/a&gt;」，當期有 4 彩頁的『斑鳩 IKARUGA』遊戲介紹 + 開發者訪談，還有最震撼我的在後面——黑白頁的「Old Game Mesuem」專欄，題目是：
&lt;/p&gt;
&lt;blockquote&gt;
  &lt;h4 class="tm-0 bm-0"&gt;輪廻する世界　井内洋と『プロジェクトRS』&lt;/h4&gt;
  &lt;small&gt;『斑鳩』を前にして、我々が知っておくべきこと。&lt;/small&gt;
&lt;/blockquote&gt;
&lt;p&gt;
  內容簡介 Project-RS（&lt;a href="#post-111022-rs"&gt;註 1&lt;/a&gt;）相關事情，在 google jp 還挖得到整篇備份。&lt;br&gt;
  專欄只有 2 頁，我的日文也不好，還是讀得無比激動。
  這個作品講的問題就是我的問題，想表達的東西準確配在遊戲裡，用強烈的演出釋放出來。
&lt;/p&gt;
&lt;p class="gray-d"&gt;
  &lt;small id="post-111022-rs"&gt;
    註 1：&lt;abbr title="Radiant Silvergun"&gt;RS&lt;/abbr&gt; 指的是 Radiant Silvergun（閃亮銀槍），『斑鳩』原本是 RS 三部中的 2。關於銀槍的介紹，推薦一篇 &lt;a href="http://xboxlife.tw/show.php?fid=3&amp;tid=770" title="Xbox Life - Xbox 360遊戲攻略‧情報- 傳說般的射擊遊戲再臨！《閃亮銀槍》遊戲介紹"&gt;Xbox Life - Xbox 360遊戲攻略‧情報- 傳說般的射擊遊戲再臨！《閃亮銀槍》遊戲介紹&lt;/a&gt;。
  &lt;/small&gt;
&lt;/p&gt;
&lt;p&gt;
  以下記錄「到目前為止」對斑鳩的觀感，因為
&lt;/p&gt;

&lt;h3&gt;我連一道都沒玩過！&lt;/h3&gt;

&lt;iframe class="youtube-obj float-r" style="margin-top:-20px; margin-left:30px;" width="420" height="315" src="http://www.youtube.com/embed/GoKraNoMzQA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;
  寫這篇的時候我才剛買 Xbox 360，準備買 &lt;abbr title="Xbox Live Arcade"&gt;XBLA&lt;/abbr&gt; 上的&lt;a href="http://marketplace.xbox.com/ja-JP/Product/斑鳩/66acd000-77fe-1000-9115-d80258410878" title="斑鳩 - Xbox.com"&gt;斑鳩&lt;/a&gt;而已，真的是一 coin 都沒投過。
  這麼難得應該記錄一下使用前後的差別，也體驗看看「遊戲是否一定得用玩的」。
&lt;/p&gt;

&lt;p&gt;
  印象中的 gameplay 都是 Super Play，例如旁邊影片的 &lt;a href="http://www.youtube.com/watch?v=GoKraNoMzQA&amp;feature=related" title="斑鳩 ikaruga Chapter 1 - 理想 idea - YouTube"&gt;Chapter 1&lt;/a&gt; 或者 &lt;a href="http://www.youtube.com/watch?v=5ZEGyrEnXrk" title="Ikaruga - 1 Player - 2 Player game - YouTube"&gt;1 Player - 2 Player game&lt;/a&gt;，手上也有一片『&lt;a href="http://www.amazon.co.jp/M-C-S-ikaruga-Appreciate/dp/B0001ZDMQI" title="Amazon.co.jp： 斑鳩 ikaruga Appreciate DVD: ゲーム"&gt;斑鳩 APPRECIATE DVD&lt;/a&gt;』收錄高手的夢幻表現。
&lt;/p&gt;

&lt;p&gt;
  回到現實自己 &lt;abbr title="ShooTing Game"&gt;STG&lt;/abbr&gt; 技術卻相當爛，也沒空練習，大概會玩得很艱辛……
  不過那就將來再提吧。
&lt;/p&gt;

&lt;h3 class="clear"&gt;砲火方向正確&lt;/h3&gt;
&lt;p&gt;
  「只生產使用者吃過的東西，餵飽 Light User 還剩下什麼？」是我所知 Project-RS 的重要動機。
  （&lt;a href="#post-111022-might-not-true"&gt;註 3&lt;/a&gt;）
&lt;/p&gt;
&lt;p&gt;
  不限於 STG 主流退化為「射擊 + &lt;a href="http://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%A0_(%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B2%E3%83%BC%E3%83%A0)" title="ボム (シューティングゲーム) - Wikipedia"&gt;炸彈&lt;/a&gt;」這件事，也不限於遊戲業，「滿足大眾需求」一直是娛樂界的常規工作。
  雖然接受人各有選擇，但是生活被低俗充斥，還是讓我不堪其擾。
&lt;/p&gt;
&lt;p&gt;
  閃亮銀槍的世界設定，就是創作停滯的遊戲界的縮影。
  一個明顯宣示是 &lt;abbr title="SEGA SATURN"&gt;SS&lt;/abbr&gt; 版最終戰的人聲訊息，可以還原（&lt;a href="#post-111022-restore"&gt;註 2&lt;/a&gt;）為開發者、商人、退出者……等立場的對話；
   而故事描述的輪迴思想，也能套用在 STG 的出生成長、飽和到沒落。
   作者所說的「幅」，專欄解釋是「多樣性」變得狹隘，我的話「生存空間」被壓縮也是同一件事。
&lt;/p&gt;
&lt;p&gt;
  因為「偏偏執著在這個議題」正是我需要的，所以很快被吸引，並準備推崇。
&lt;/p&gt;

&lt;ol class="p gray-d"&gt;
  &lt;li&gt;
    &lt;small id="post-111022-restore"&gt;
      註 2：「還原」乃透過在雜誌揭露每句的發言角度與原意，遊戲中的台詞仍是隱晦、投射的。
    &lt;/small&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;small id="post-111022-might-not-true"&gt;
      註 3：這段很多文字來自原專欄，但不見得是原意（萬一我會錯意），請了解。
    &lt;/small&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;遊戲語言是最得心應手的母語&lt;/h3&gt;
&lt;p&gt;
  語言能力有障礙、說話在試誤，表達就沒有力道，意思錯了也未可知。
&lt;/p&gt;
&lt;p&gt;
  過場動畫很棒，開始操作卻帶來困惑、讓人質疑原始設計——
  這是作者懂動畫語言，卻不熟遊戲語言的例子；
  即使音樂、劇本、○○高明，又注重細節、隱藏要素豐富……
  我還是覺得他沒做對。
&lt;/p&gt;
&lt;p&gt;
  反之對語言愈能掌握，就能用愈精準的句子把話說透。
&lt;/p&gt;
&lt;p&gt;
  斑鳩作為硬派射擊遊戲，這方面的「正確」基本讓人放心，
  常被談及的設計「簡潔」我想延伸下去也是在追求這個正確。
&lt;/p&gt;

&lt;h3&gt;70~90 的 STG 屬於一個時代&lt;/h3&gt;
&lt;p&gt;
  有意地重現了 STG 發展以來的魅力要素，所以有人說閃亮銀槍是 STG 的集大成。
  這件事之所以很酷，因為它是這個世代的創作者，為了講自己的問題而忠實做的反省。
&lt;/p&gt;
&lt;p&gt;
  從 1978 的『&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%A4%E3%83%B3%E3%83%99%E3%83%BC%E3%83%80%E3%83%BC" title="スペースインベーダー - Wikipedia"&gt;Space Invaders&lt;/a&gt;』（太空侵略者，TAITO）開始，除了確立基本的「射擊」「閃避」外，因為無法像現在一樣連發子彈，甚至用光束橫掃敵人，所以還能提取出單發瞄準的獨特「狙擊感」。
  在斑鳩裡按住射擊鈕是自動連發的 double shot（一次射出兩發，範圍較廣），單按則是 single shot，搭配連續擊破同色敵人便會額外加分的 chain combo 系統，就是在重現這個樂趣。
&lt;/p&gt;
&lt;p&gt;
  Invader 框架的後繼者『&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%AE%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%B7%E3%82%A2%E3%83%B3" title="ギャラクシアン - Wikipedia"&gt;Galaxian&lt;/a&gt;』（小蜜蜂，1979 / namco）和『&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%AE%E3%83%A3%E3%83%A9%E3%82%AC" title="ギャラガ - Wikipedia"&gt;GALAGA&lt;/a&gt;』（大蜜蜂，1981 / namco）在敵人行動模式等各方面有不少進步，但火力還是一樣陽春，要等子彈離開畫面才能再開砲。
&lt;/p&gt;

&lt;div class="ta-c"&gt;
  &lt;iframe width="480" height="274" src="http://www.youtube.com/embed/ZDXQdjuuf8E" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p class="tm-40"&gt;
  接下來 Project-RS 相當重視的「地形」與「解謎性」初步出現在『&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%B3%E3%83%96%E3%83%AB_(%E3%82%B2%E3%83%BC%E3%83%A0)" title="スクランブル (ゲーム) - Wikipedia"&gt;Scramble&lt;/a&gt;』（1981 / KONAMI）開始的橫向捲軸遊戲中（&lt;a href="#post-111022-defender"&gt;註 4&lt;/a&gt;），因為視點能辨別高低差，自然發展出起伏的地勢，拓展了攻略想像。
  地形不但造成射擊屏障，移動時也要小心不能撞山，或者畫面捲動時被山撞死。
&lt;/p&gt;

&lt;div class="ta-c"&gt;
  &lt;iframe width="400" height="300" src="http://www.youtube.com/embed/RGNii3Ys2Gw" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p class="gray-d"&gt;
  &lt;small id="post-111022-defender"&gt;
    註 4：其實美國 &lt;a href="http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%83%AA%E3%82%A2%E3%83%A0%E3%82%B9_(%E3%82%B2%E3%83%BC%E3%83%A0)" title="ウィリアムス (ゲーム) - Wikipedia"&gt;Williams&lt;/a&gt; 於 1980 年已有相似的遊戲 &lt;a href="http://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%83%95%E3%82%A7%E3%83%B3%E3%83%80%E3%83%BC_(%E3%82%B2%E3%83%BC%E3%83%A0)" title="ディフェンダー (ゲーム) - Wikipedia"&gt;Defender&lt;/a&gt;，不過這邊就以偏日本的史觀將它略過。
  &lt;/small&gt;
&lt;/p&gt;

&lt;p class="clear"&gt;
  縱向捲軸的 &lt;a href="http://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%93%E3%82%A6%E3%82%B9" title="ゼビウス - Wikipedia"&gt;XEVIOUS&lt;/a&gt;（鐵板陣，1983 / namco）也值得一提，遊戲故事和世界觀、音樂等內容有了講究的製作&lt;small class="gray-dd"&gt;（雖然遊戲本身只有音樂表現比較明顯）&lt;/small&gt;，因此在整個遊戲史上有一定地位。
  閃亮銀槍的細膩製作固然也受推崇，但這裡特別提的是遊戲中偷藏了不少其他作品的料，其中就包括 XEVIOUS 發明的「隱藏角色」（藏在地圖中，找到可以加分），某個出現位置更是仿得非常露骨。
&lt;/p&gt;
&lt;p&gt;
  1985 延續橫向射擊優點的『&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%87%E3%82%A3%E3%82%A6%E3%82%B9_(%E3%82%B2%E3%83%BC%E3%83%A0)" title="グラディウス (ゲーム) - Wikipedia"&gt;Gradius&lt;/a&gt;』（宇宙巡航艦，KONAMI）登場，地形造成的戰略意義和關卡特色變得相當強烈，
  此外還多了重要的「機體強化」設計——
  自機收集道具後，可以自由「Power Up」提升速度、武器、option（子機）、護盾等能力。
  對比閃亮銀槍也有多樣的武器系統和升級要素，斑鳩倒是轉為完全不做，機體始終一致。
&lt;/p&gt;
&lt;p&gt;
  之後 STG 持續鑽研深度，新鮮感降低，難度提升而更挑玩家，各種理由加上 1991 格鬥熱潮爆發，終於衰退去了。
&lt;/p&gt;
&lt;p&gt;
  跳到 1997『&lt;a href="http://ja.wikipedia.org/wiki/%E6%80%92%E9%A6%96%E9%A0%98%E8%9C%82" title="怒首領蜂 - Wikipedia"&gt;怒首領蜂&lt;/a&gt;』（CAVE）開始發展出一系列「&lt;a href="http://ja.wikipedia.org/wiki/%E5%BC%BE%E5%B9%95%E7%B3%BB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0" title="弾幕系シューティング - Wikipedia"&gt;彈幕遊戲&lt;/a&gt;」，超大量敵方子彈溢滿畫面，形成驚人的華麗彈幕，是一股遊戲樂趣由「射擊」往「閃避」方向變態的極端風潮。
&lt;/p&gt;
&lt;p&gt;
  閃亮銀槍（1998）和斑鳩（2001）都不算彈幕遊戲，但最後都是絕望的閃避關卡，於是輪迴的最後階段正是彈幕，不曉得是否巧合。
&lt;/p&gt;

&lt;p&gt;
  ※關於射擊遊戲的歷史，可以參考記錄片 &lt;a href="http://kwl.vcity.biz/blog/?p=379" title="盒子內的時間 » GameOne《射擊遊戲的歷史》中文字幕版"&gt;盒子內的時間 » GameOne《射擊遊戲的歷史》中文字幕版&lt;/a&gt;。
&lt;/p&gt;

&lt;h3&gt;其他疑問&lt;/h3&gt;
&lt;p&gt;
  目前想到的大概就這樣，其他可能要玩著才會發現。再記幾件好奇的事：
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;
    閃亮銀槍是不是比斑鳩更好？
  &lt;/li&gt;
  &lt;li&gt;
    斑鳩似乎有很固定的最佳攻略法，這樣好嗎？
  &lt;/li&gt;
  &lt;li&gt;
    Project-RS 原定第三作主題是「未來」，不過我看一、二所講的「輪迴」其實是差不多、而且暗喻不能突破的，開發者&lt;a href="http://ja.wikipedia.org/wiki/%E4%BA%95%E5%86%85%E3%81%B2%E3%82%8D%E3%81%97" title="井内ひろし - Wikipedia"&gt;井内洋&lt;/a&gt;又已離開 &lt;a href="http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%AC%E3%82%B8%E3%83%A3%E3%83%BC" title="トレジャー - Wikipedia"&gt;TREASURE&lt;/a&gt;，關於未來的想法會不會根本沒出現過。
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;/p&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-8220932178213394897?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/SZ5UjOdlpwY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/8220932178213394897/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/11/blog-post.html#comment-form" title="1 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8220932178213394897?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8220932178213394897?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/11/blog-post.html" title="『斑鳩』使用前記錄" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/GoKraNoMzQA/default.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DEUCSX06fip7ImA9WhdaEE4.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-8542746253655597135</id><published>2011-10-19T22:57:00.000+08:00</published><updated>2011-10-19T22:57:48.316+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-19T22:57:48.316+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>vim-gitdiffall - 爬 git diff 也要用 Vim</title><content type="html">&lt;p&gt;
  把 git-diff 的差異開在 Vim 分頁裡，也可以指定要看的版本，用 Vim 查閱 commit 歷史。&lt;br&gt;
  → &lt;a class="underline" href="https://github.com/bootleq/vim-gitdiffall" title="bootleq/vim-gitdiffall - GitHub"&gt;bootleq/vim-gitdiffall - GitHub&lt;/a&gt;
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;h3&gt;gitdiffall 指令&lt;/h3&gt;
&lt;p&gt;
  在 &lt;a href="http://zsh.sourceforge.net/" title="ZSH - THE Z SHELL"&gt;zsh&lt;/a&gt; 呼叫 &lt;code&gt;gitdiffall&lt;/code&gt; 這個指令（目前是用 &lt;a href="http://www.ruby-lang.org/zh_TW/" title="Ruby Programming Language 中文官方網頁"&gt;ruby&lt;/a&gt; 寫的，需要系統能跑 ruby）
&lt;/p&gt;

&lt;a href="http://3.bp.blogspot.com/-HsqB3psu3S0/Tp7Z5upAglI/AAAAAAAABQ8/lDZV6uX4yKM/s1600/gitdiffall-comp.png"&gt;&lt;img src="http://3.bp.blogspot.com/-HsqB3psu3S0/Tp7Z5upAglI/AAAAAAAABQ8/lDZV6uX4yKM/s1440/gitdiffall-comp.png" alt="gitdiffall --help" /&gt;&lt;/a&gt;

&lt;p&gt;
  參數跟 &lt;code&gt;git diff&lt;/code&gt; 大致一樣。
&lt;/p&gt;

&lt;h3&gt;查看某個 commit 改的東西&lt;/h3&gt;
&lt;p&gt;
  想知道 &lt;var&gt;1836777&lt;/var&gt; 這個 commit 改了些什麼。
&lt;/p&gt;

&lt;a href="http://4.bp.blogspot.com/-PNeNZCgNngM/Tp7a4hc90ZI/AAAAAAAABRY/pMUGBTcKEZI/s1600/git-log-graph.png"&gt;&lt;img src="http://4.bp.blogspot.com/-PNeNZCgNngM/Tp7a4hc90ZI/AAAAAAAABRY/pMUGBTcKEZI/s1440/git-log-graph.png" alt="log graph" /&gt;&lt;/a&gt;

&lt;p&gt;
  使用 &lt;code&gt;gitdiffall @1836777&lt;/code&gt;，會比較 &lt;var&gt;1836777&lt;/var&gt; 和它的前一個 commit。&lt;br&gt;
  註：前一個 commit 不一定是 &lt;var&gt;1836777^&lt;/var&gt;，而是從 git log 取出的前一項，這是為了提供更線性的用法。
&lt;/p&gt;

&lt;a href="http://1.bp.blogspot.com/-bB8oO2bAAg4/Tp7Z5_mpY3I/AAAAAAAABRE/l12jgGyyMi8/s1600/at-revision.png"&gt;&lt;img src="http://1.bp.blogspot.com/-bB8oO2bAAg4/Tp7Z5_mpY3I/AAAAAAAABRE/l12jgGyyMi8/s800/at-revision.png" alt="指定看一個 commit" /&gt;&lt;/a&gt;

&lt;p&gt;
  就會開在 Vim 裡面。
&lt;/p&gt;

&lt;a href="http://4.bp.blogspot.com/-U6_B5PRCvuY/Tp7bM_zArsI/AAAAAAAABRk/0vL7zUMdQLM/s1600/tabs.png"&gt;&lt;img src="http://4.bp.blogspot.com/-U6_B5PRCvuY/Tp7bM_zArsI/AAAAAAAABRk/0vL7zUMdQLM/s1440/tabs.png" alt="開了 7 個分頁" /&gt;&lt;/a&gt;

&lt;p&gt;
  這時可以下 &lt;code&gt;:GitDiffInfo logs&lt;/code&gt;（同 &lt;code&gt;:GitDiffInfo&lt;/code&gt; 不加參數）看 git log。&lt;br&gt;
  但是在 diff 進行中，比較常用的可能是 &lt;code&gt;:GitDiff&lt;/code&gt;（同 &lt;code&gt;:GitDiffInfo log&lt;/code&gt;，注意參數是 log 不是 logs，後面會說明）。
&lt;/p&gt;

&lt;a href="http://4.bp.blogspot.com/-KH9qVwR05zY/Tp7bjNuncPI/AAAAAAAABRw/WprAthTfhXs/s1600/info-log.png"&gt;&lt;img src="http://4.bp.blogspot.com/-KH9qVwR05zY/Tp7bjNuncPI/AAAAAAAABRw/WprAthTfhXs/s1440/info-log.png" alt="GitDiff 只顯示一個 log" /&gt;&lt;/a&gt;

&lt;p&gt;
  看完請用 &lt;code&gt;:GitDiffOff&lt;/code&gt; 來關閉 diff，確保幾件事：&lt;br&gt;
  1. 跳回編輯該檔案的目前版本。&lt;br&gt;
  2. 還原比較前的 diff 相關 option（Vim 內建的 &lt;code&gt;:diffoff&lt;/code&gt; 會設回預設，不一定是原來的值）。
&lt;/p&gt;
&lt;p&gt;
  看完 &lt;var&gt;1836777&lt;/var&gt;，想看下一個 commit，因為剛才有顯示 &lt;strong&gt;Shortcut for this commit is 7&lt;/strong&gt;，所以只要 &lt;code&gt;gitdiffall 6&lt;/code&gt; 就行了。
&lt;/p&gt;

&lt;a href="http://4.bp.blogspot.com/-GEQXgeOngV4/Tp7b3-jAaqI/AAAAAAAABSI/j7QNGC0K7to/s1600/prev.png"&gt;&lt;img src="http://4.bp.blogspot.com/-GEQXgeOngV4/Tp7b3-jAaqI/AAAAAAAABSI/j7QNGC0K7to/s1440/prev.png" alt="看下一個 commit" /&gt;&lt;/a&gt;

&lt;h3&gt;看現在改了什麼&lt;/h3&gt;
&lt;p&gt;
  以下圖來說，&lt;code&gt;gitdiffall&lt;/code&gt; 會打開兩個紅色的檔案；&lt;br&gt;
  &lt;code&gt;gitdiffall --cached&lt;/code&gt; 會打開綠色的。
&lt;/p&gt;

&lt;a href="http://1.bp.blogspot.com/-8qgLdldefkw/Tp7cD_QlKEI/AAAAAAAABSU/yypuIMcCrC8/s1600/cached.png"&gt;&lt;img src="http://1.bp.blogspot.com/-8qgLdldefkw/Tp7cD_QlKEI/AAAAAAAABSU/yypuIMcCrC8/s1440/cached.png" alt="--cached 和不加任何 revision 的情況" /&gt;&lt;/a&gt;

&lt;p&gt;
  以前寫的&lt;a href="http://bootleq.blogspot.com/2010/09/git-diff-vim.html" title="將複數 git diff 以 vim 分頁一次開啟 - 沒穿方服"&gt;將複數 git diff 以 vim 分頁一次開啟&lt;/a&gt;，現在可以用 &lt;code&gt;gitdiffall &lt;/code&gt; 取代了。
&lt;/p&gt;

&lt;h3&gt;在 Vim 裡使用 GitDiff&lt;/h3&gt;
&lt;p&gt;
  在 Vim 裡面也可使用 &lt;code&gt;:GitDiff&lt;/code&gt;，會比較目前檔案和它的某個版本，這時就不需要 ruby 了。&lt;br&gt;
  參數跟 &lt;code&gt;gitdiffall&lt;/code&gt; 類似，也稍微支援自動完成。
&lt;/p&gt;

&lt;a href="http://3.bp.blogspot.com/-yIm5qozEt74/Tp7hJ2NzX_I/AAAAAAAABSw/AtxuQrlM7Cs/s1600/gitdiff-compl.png"&gt;&lt;img src="http://3.bp.blogspot.com/-yIm5qozEt74/Tp7hJ2NzX_I/AAAAAAAABSw/AtxuQrlM7Cs/s1600/gitdiff-compl.png" alt="Vim 裡的指令也能自動完成" /&gt;&lt;/a&gt;

&lt;p&gt;
  Diff 中可以用 &lt;code&gt;:GitDiffInfo&lt;/code&gt; 看比較範圍內「全部 commit」的 log，&lt;br&gt;
  加上參數 &lt;code&gt;:GitDiffInfo log&lt;/code&gt; 可以看「最相關的一個 commit」的 log（跟前述「GitDiff 時再呼叫 &lt;code&gt;:GitDiff&lt;/code&gt;」效果一樣）。
&lt;/p&gt;

&lt;a href="http://3.bp.blogspot.com/-FKgxEAQiiz8/Tp7bjIeCaBI/AAAAAAAABR4/de-3qIbpZwo/s1600/gitdiffinfo.png"&gt;&lt;img src="http://3.bp.blogspot.com/-FKgxEAQiiz8/Tp7bjIeCaBI/AAAAAAAABR4/de-3qIbpZwo/s1440/gitdiffinfo.png" alt="GitDiffInfo 會顯示多個 log" /&gt;&lt;/a&gt;

&lt;p&gt;
  GitDiff 另外支援一個用法，就是 revision 的部分使用 &lt;var&gt;+&amp;lt;n&amp;gt;&lt;/var&gt; 的型式，有別於 &lt;var&gt;&amp;lt;n&amp;gt;&lt;/var&gt; 是找前一個 commit，
  &lt;var&gt;+&amp;lt;n&amp;gt;&lt;/var&gt; 會找「包含目前檔案」的前一個 commit，可以避免 &lt;var&gt;&amp;lt;n&amp;gt;&lt;/var&gt; 找不到變更的情況。
&lt;/p&gt;
&lt;p&gt;
  例如 &lt;code&gt;:GitDiff +1&lt;/code&gt;。
&lt;/p&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-8542746253655597135?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/__SOodkwtAM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/8542746253655597135/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/10/vim-gitdiffall-git-diff-vim.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8542746253655597135?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8542746253655597135?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/10/vim-gitdiffall-git-diff-vim.html" title="vim-gitdiffall - 爬 git diff 也要用 Vim" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-HsqB3psu3S0/Tp7Z5upAglI/AAAAAAAABQ8/lDZV6uX4yKM/s72-c/gitdiffall-comp.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C08DSHs6fyp7ImA9WhdbGEs.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-1782597824750187377</id><published>2011-10-17T22:31:00.000+08:00</published><updated>2011-10-17T22:31:19.517+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-17T22:31:19.517+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="程式" /><title>NOT 運算子（!）後面不加空白的理由</title><content type="html">&lt;p&gt;
  快速答案是「一元運算子」。
&lt;/p&gt;

&lt;hr class="hr-3"&gt;

&lt;div class="fullpost"&gt;

&lt;p&gt;
  NOT matter 要寫成 &lt;code&gt;! matter&lt;/code&gt; 還是 &lt;code&gt;!matter&lt;/code&gt; 這個問題……&lt;br&gt;
  很長一段時間我是用前者，多個空白比較明顯，不會漏看驚歎號。
&lt;/p&gt;

&lt;hr class="hr-3"&gt;

&lt;ol class="mass-no-indent"&gt;
  &lt;li&gt;
    &lt;p&gt;
      ruby 文件 &lt;a href="http://doc.ruby-lang.org/ja/1.9.2/doc/spec=2foperator.html#not" title="演算子式"&gt;not 運算子的範例&lt;/a&gt;，
      &lt;code&gt;! me&lt;/code&gt; 和 &lt;code&gt;p(! false)&lt;/code&gt;
      也有空白，我想就是求明顯、清楚。
    &lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p&gt;
      Kohana framework 的 &lt;a href="http://kohanaframework.org/3.2/guide/kohana/conventions#parentheses" title="Conventions and Style | Kohana User Guide"&gt;Conventions and Style&lt;/a&gt; 也有類似考量：
    &lt;/p&gt;
    &lt;blockquote cite="http://kohanaframework.org/3.2/guide/kohana/conventions#parentheses"&gt;
      The ! (bang) character must have a space on either side to ensure maximum readability.
    &lt;/blockquote&gt;
    &lt;p&gt;
      『&lt;code&gt;!&lt;/code&gt; 的兩邊都必須有一個空白，以確保最大可讀性。』&lt;br&gt;
      註：這一章是講括弧用法，所以是說 &lt;code&gt;if ( ! $foo)&lt;/code&gt; 和 &lt;code&gt;if (!$foo)&lt;/code&gt; 的情況。
    &lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p&gt;
      不過我發現別人的寫法，絕大部分都是不空白的 &lt;code&gt;!matter&lt;/code&gt; 風格。&lt;br&gt;
      我已經沒印象上次看到 &lt;code&gt;! matter&lt;/code&gt; 是何時了。
    &lt;/p&gt;
    &lt;p&gt;
      我也到 PTT ruby 板&lt;a href="http://www.ptt.cc/bbs/Ruby/M.1314716626.A.C02.html" title="[問題] ! (NOT) 後面加不加空白？ - 看板 Ruby - 批踢踢實業坊"&gt;問了一下&lt;/a&gt;。

    &lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p&gt;
      沒有明確出處，但找到一些敘述，一般不空白的理由是「&lt;a href="http://en.wikipedia.org/wiki/Unary_operation" title="Unary operation - Wikipedia, the free encyclopedia"&gt;Unary operation&lt;/a&gt;（一元運算子）後面不加空白」。&lt;br&gt;
      就像 &lt;code&gt;-4&lt;/code&gt; 不會寫成 &lt;code&gt;- 4&lt;/code&gt;。
    &lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p&gt;
      更精確地說是「一元運算子和它的運算元之間」不加空白。&lt;br&gt;
      就像這個 NetBeans 選項 &lt;a href="http://netbeans.org/bugzilla/show_bug.cgi?id=135699" title="Bug 135699 – Use option "space between unary operator and operand""&gt;Bug 135699 – Use option "space between unary operator and operand"&lt;/a&gt;。
    &lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p&gt;
      最後在 Douglas Crockford 的 &lt;a href="http://javascript.crockford.com/code.html#whitespace" title="Code Conventions for the JavaScript Programming Language"&gt;JS Code Conventions&lt;/a&gt; 看到更具體、可以照做的規範：
    &lt;/p&gt;
    &lt;blockquote&gt;
      No space should separate a unary operator and its operand except when the operator is a word such as typeof.
    &lt;/blockquote&gt;
    &lt;p&gt;
      『一元運算子和它的運算元之間，不該有空白，除非該運算子是一個 word，例如 typeof。』
    &lt;/p&gt;
  &lt;/li&gt;

&lt;/ol&gt;

&lt;hr class="hr-3"&gt;

&lt;p&gt;
  其實我已經改用 &lt;code&gt;!matter&lt;/code&gt; 一段時間了。
  仍然懷疑 &lt;code&gt;! matter&lt;/code&gt; 沒有錯，但眼前還是解決風格一致的問題先了。
&lt;/p&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-1782597824750187377?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/1SxFcbrX-g0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/1782597824750187377/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/10/not.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/1782597824750187377?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/1782597824750187377?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/10/not.html" title="NOT 運算子（!）後面不加空白的理由" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUcCQHc4fCp7ImA9WhdbF0o.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-5308201149106726951</id><published>2011-10-16T21:51:00.000+08:00</published><updated>2011-10-16T21:51:01.934+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-16T21:51:01.934+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><category scheme="http://www.blogger.com/atom/ns#" term="vim-cycle" /><title>cycle.vim - group 設定簡介</title><content type="html">&lt;h3&gt;Group 是什麼&lt;/h3&gt;
&lt;p&gt;
  &lt;a href="https://github.com/bootleq/vim-cycle" title="bootleq/vim-cycle - GitHub"&gt;cycle.vim&lt;/a&gt; 搜尋相關候選字時
  （例如目前是 &lt;var&gt;true&lt;/var&gt;，應該要找到 &lt;var&gt;false&lt;/var&gt;），會在一連串的 group 中查詢；
  每個 group 是由 items 和 options 組成，以下便是一個簡單 group：&lt;br&gt;
  &lt;code&gt;{ 'items': ['true', 'false'], 'options': {} }&lt;/code&gt;&lt;br&gt;
  如果想讓 &lt;var&gt;foo&lt;/var&gt; 變成 &lt;var&gt;bar&lt;/var&gt;，增加一個 items 為 &lt;code&gt;['foo', 'bar']&lt;/code&gt; 的 group 就可以了。
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;hr class="hr-3"&gt;
&lt;h3&gt;怎麼設定 group&lt;/h3&gt;
&lt;p&gt;
  使用中的 groups 會存在 &lt;var&gt;cycle_groups&lt;/var&gt; 這個變數，可以用 &lt;code&gt;:echo string(g:cycle_groups)&lt;/code&gt; 查看；
  但是這東西比較繁瑣，所以不建議直接修改它的值。
&lt;/p&gt;
&lt;p&gt;
  比較好的方式是在 .vimrc 定義 &lt;code&gt;g:cycle_default_groups&lt;/code&gt; 這個變數，
  cycle.vim 啟動時會自動解析它，把需要的 group 都建好。&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
  具體例子如下：
&lt;/p&gt;
&lt;pre class="vim"&gt;
&lt;span class="Statement"&gt;let&lt;/span&gt; g:cycle_default_groups &lt;span class="Operator"&gt;=&lt;/span&gt; [
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'true'&lt;/span&gt;, &lt;span class="String"&gt;'false'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'yes'&lt;/span&gt;, &lt;span class="String"&gt;'no'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'on'&lt;/span&gt;, &lt;span class="String"&gt;'off'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'+'&lt;/span&gt;, &lt;span class="String"&gt;'-'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'&amp;gt;'&lt;/span&gt;, &lt;span class="String"&gt;'&amp;lt;'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'&amp;quot;'&lt;/span&gt;, &lt;span class="String"&gt;&amp;quot;'&amp;quot;&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'=='&lt;/span&gt;, &lt;span class="String"&gt;'!='&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'0'&lt;/span&gt;, &lt;span class="String"&gt;'1'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'and'&lt;/span&gt;, &lt;span class="String"&gt;'or'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'in'&lt;/span&gt;, &lt;span class="String"&gt;'out'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'up'&lt;/span&gt;, &lt;span class="String"&gt;'down'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'min'&lt;/span&gt;, &lt;span class="String"&gt;'max'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'get'&lt;/span&gt;, &lt;span class="String"&gt;'set'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'add'&lt;/span&gt;, &lt;span class="String"&gt;'remove'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'to'&lt;/span&gt;, &lt;span class="String"&gt;'from'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'read'&lt;/span&gt;, &lt;span class="String"&gt;'write'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'save'&lt;/span&gt;, &lt;span class="String"&gt;'load'&lt;/span&gt;, &lt;span class="String"&gt;'restore'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'next'&lt;/span&gt;, &lt;span class="String"&gt;'previous'&lt;/span&gt;, &lt;span class="String"&gt;'prev'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'only'&lt;/span&gt;, &lt;span class="String"&gt;'except'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'without'&lt;/span&gt;, &lt;span class="String"&gt;'with'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'exclude'&lt;/span&gt;, &lt;span class="String"&gt;'include'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'width'&lt;/span&gt;, &lt;span class="String"&gt;'height'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'asc'&lt;/span&gt;, &lt;span class="String"&gt;'desc'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'是'&lt;/span&gt;, &lt;span class="String"&gt;'否'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'上'&lt;/span&gt;, &lt;span class="String"&gt;'下'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'男'&lt;/span&gt;, &lt;span class="String"&gt;'女'&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'Sunday'&lt;/span&gt;, &lt;span class="String"&gt;'Monday'&lt;/span&gt;, &lt;span class="String"&gt;'Tuesday'&lt;/span&gt;, &lt;span class="String"&gt;'Wednesday'&lt;/span&gt;, &lt;span class="String"&gt;'Thursday'&lt;/span&gt;,
&lt;span class="Special"&gt;      \&lt;/span&gt;     &lt;span class="String"&gt;'Friday'&lt;/span&gt;, &lt;span class="String"&gt;'Saturday'&lt;/span&gt;], [&lt;span class="String"&gt;'hard_case'&lt;/span&gt;, &lt;span class="Special"&gt;{&lt;/span&gt;&lt;span class="String"&gt;'name'&lt;/span&gt;: &lt;span class="String"&gt;'Days'&lt;/span&gt;&lt;span class="Special"&gt;}&lt;/span&gt;]],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'{:}'&lt;/span&gt;, &lt;span class="String"&gt;'[:]'&lt;/span&gt;, &lt;span class="String"&gt;'(:)'&lt;/span&gt;], &lt;span class="String"&gt;'sub_pairs'&lt;/span&gt;],
&lt;span class="Special"&gt;      \&lt;/span&gt;   [[&lt;span class="String"&gt;'（:）'&lt;/span&gt;, &lt;span class="String"&gt;'「:」'&lt;/span&gt;, &lt;span class="String"&gt;'『:』'&lt;/span&gt;], &lt;span class="String"&gt;'sub_pairs'&lt;/span&gt;],
&lt;span class="Special"&gt;      \&lt;/span&gt; ]
&lt;/pre&gt;

&lt;hr class="hr-3"&gt;

&lt;h3&gt;可以只為特定檔案類型設 group 嗎&lt;/h3&gt;
&lt;p&gt;
  cycle_groups 可以分成 global 和 buffer 兩個 scope（作用範圍）的版本，分別是 &lt;var&gt;g:cycle_groups&lt;/var&gt; 和 &lt;var&gt;b:cycle_groups&lt;/var&gt; 兩個變數。
  搜尋的時候會以 buffer 版為優先，你可以讓 &lt;var&gt;&amp;quot;get&amp;quot;&lt;/var&gt; 在 html 類型的 buffer 中轉為 &lt;var&gt;&amp;quot;post&amp;quot;&lt;/var&gt;，在其他類型 buffer 中則轉為 &lt;var&gt;&amp;quot;set&amp;quot;&lt;/var&gt;。
&lt;/p&gt;
&lt;p&gt;
  設定方式是在 .vimrc 定義 &lt;var&gt;g:cycle_default_groups_for_{filetype}&lt;/var&gt;，其中 &lt;var&gt;{filetype}&lt;/var&gt; 表示想生效的檔案類型。&lt;br&gt;
  例如 html 專用的設定是：&lt;br&gt;
  &lt;code&gt;let g:cycle_default_groups_for_&lt;em&gt;&lt;var&gt;html&lt;/var&gt;&lt;/em&gt; = [ ...（後略）&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
  註：可以用 &lt;code&gt;:echo string(b:cycle_groups)&lt;/code&gt; 檢查設定。
&lt;/p&gt;

&lt;hr class="hr-3"&gt;
&lt;h3&gt;調整 group 行為&lt;/h3&gt;
&lt;p&gt;
  Group 的行為可以用 options 微調。目前（version 0.1.0）支援的選項如下：
&lt;/p&gt;

&lt;ul class="mass-no-indent mass-p-min"&gt;
  &lt;li&gt;
    &lt;h4&gt;name&lt;/h4&gt; 
    &lt;p&gt;
      名稱，目前沒什麼用，只有處理衝突時（在多個 group 都有搜尋到目標字時）會顯示一下。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;match_case&lt;/h4&gt; 
    &lt;p&gt;
      搜尋候選字時，大小寫預設是不計的，所以 &lt;var&gt;True&lt;/var&gt;、&lt;var&gt;true&lt;/var&gt; 和 &lt;var&gt;trUe&lt;/var&gt; 都會被 cycle，只要設定其中一個即可。&lt;br&gt;
      反之若要限制大小寫相符才 cycle，就要設定這個選項。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;hard_case&lt;/h4&gt; 
    &lt;p&gt;
      預設情形會保留關鍵字的大小寫位置，也就是 true/false 互換時，&lt;var&gt;True&lt;/var&gt; 會變成 &lt;var&gt;False&lt;/var&gt;、&lt;var&gt;tRUe&lt;/var&gt; 會變成 &lt;var&gt;fALse&lt;/var&gt;。&lt;br&gt;
      這個選項可以停用此功能，互換時「若設定中是寫 &lt;var&gt;fAlse&lt;/var&gt;，就一律換成 &lt;var&gt;fAlse&lt;/var&gt;」。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;sub_tag&lt;/h4&gt; 
    &lt;p&gt;
      如果開啟這個選項，cycle.vim 會搜尋成對的 xml 開啟／結束標籤，有的話就一起 cycle 掉。&lt;br&gt;
      例如 &lt;code&gt;&amp;lt;&lt;b class="underline"&gt;EM&lt;/b&gt;&amp;gt;example&amp;lt;/EM&amp;gt;&lt;/code&gt; 可以變成 &lt;code&gt;&amp;lt;&lt;b class="underline"&gt;STRONG&lt;/b&gt;&amp;gt;example&amp;lt;/STRONG&amp;gt;&lt;/code&gt;。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;sub_paris&lt;/h4&gt; 
    &lt;p&gt;
      這個比較特別，它是 &lt;var&gt;sub_pair&lt;/var&gt;、&lt;var&gt;end_with&lt;/var&gt; 和 &lt;var&gt;begin_with&lt;/var&gt; 三個選項的簡易寫法，具體請看 doc。（建議用 &lt;var&gt;sub_pairs&lt;/var&gt; 即可）
    &lt;/p&gt;
    &lt;p&gt;
      以 &lt;code&gt;[['&lt;b class="underline"&gt;（:）&lt;/b&gt;', '&lt;b class="underline"&gt;「:」&lt;/b&gt;'], 'sub_pairs']&lt;/code&gt; 為例，
      各個 item 會由 &lt;var&gt;&amp;quot;:&amp;quot;&lt;/var&gt; 拆開，
      &lt;var&gt;（:）&lt;/var&gt; 會拆成 &lt;var&gt;（&lt;/var&gt; 和 &lt;var&gt;）&lt;/var&gt;，
      &lt;var&gt;「:」&lt;/var&gt; 會拆成 &lt;var&gt;「&lt;/var&gt; 和 &lt;var&gt;」&lt;/var&gt;。&lt;br&gt;
      cycle.vim 處理 &lt;var&gt;&amp;quot;（&amp;quot;&lt;/var&gt; 時，會搜尋成對的 &lt;var&gt;&amp;quot;）&amp;quot;&lt;/var&gt;，若有的話就一起 cycle，&lt;br&gt;
      例如 &lt;code&gt;&lt;b class="underline"&gt;（&lt;/b&gt;請保密）&lt;/code&gt; 可以變成 &lt;code&gt;&lt;b class="underline"&gt;「&lt;/b&gt;請保密」&lt;/code&gt;。
    &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr class="hr-3"&gt;
&lt;h3&gt;具體要怎麼設定選項（options）&lt;/h3&gt;
&lt;p&gt;
  設定 group 時，每個 group 的第一個參數是 items，之後就都是 options 了。&lt;br&gt;
  支援以下各種型式：
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;code&gt;[['true', 'false']]&lt;/code&gt;
    - 沒有 options
  &lt;/li&gt;
  &lt;li&gt;
    &lt;code&gt;[['true', 'false'], {'match_case': 1}]&lt;/code&gt;
    - 以 hash 型式指定 options
  &lt;/li&gt;
  &lt;li&gt;
    &lt;code&gt;[['true', 'false'], 'match_case']&lt;/code&gt;
    - options 可以是字串，cycle.vim 會把它轉成 hash，hash 的預設值依各個 option 而不同，此處 'match_case' 的預設值為 1
  &lt;/li&gt;
  &lt;li&gt;
    &lt;code&gt;[['true', 'false'], 'match_case', {'name': 'BOOL', 'sub_tag': 1}, 'hard_case']&lt;/code&gt;
    - 字串和 hash 混著用也沒關係
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr class="hr-3"&gt;
&lt;h3&gt;你說完了沒&lt;/h3&gt;
&lt;p&gt;
  這篇應可滿足一般使用，我自己用到的也差不多這樣了。&lt;br&gt;
  在 doc 裡一些比較深入、低階的操作也有介紹，需要的話可以參考看看。
&lt;/p&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-5308201149106726951?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/B9hzFUT6L54" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/5308201149106726951/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/10/cyclevim-group.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/5308201149106726951?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/5308201149106726951?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/10/cyclevim-group.html" title="cycle.vim - group 設定簡介" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C08MQH4_eyp7ImA9WhdVFU4.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-2516207424967002021</id><published>2011-09-20T23:05:00.000+08:00</published><updated>2011-09-20T23:18:01.043+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-20T23:18:01.043+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="bookmarklet" /><title>清理 blogger 貼圖的冗碼（改版）</title><content type="html">&lt;p&gt;
  Blogger 文章編輯器「上傳圖片」自動插入的 HTML 為：
&lt;/p&gt;
&lt;textarea class="ta-code html" rows="4" cols="78"&gt;
&amp;lt;div class=&amp;quot;separator&amp;quot; style=&amp;quot;clear: both; text-align: center;&amp;quot;&amp;gt;
&amp;lt;a href=&amp;quot;http://1.bp.blogspot.com/-NcfksJtd0V0/Tnilmxq3e-I/AAAAAAAABQs/qUa6u-iZSdU/s1600/ocarina.png&amp;quot; imageanchor=&amp;quot;1&amp;quot; style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img border=&amp;quot;0&amp;quot; height=&amp;quot;50&amp;quot; width=&amp;quot;50&amp;quot; src=&amp;quot;http://1.bp.blogspot.com/-NcfksJtd0V0/Tnilmxq3e-I/AAAAAAAABQs/qUa6u-iZSdU/s320/ocarina.png&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;
&lt;/textarea&gt;

&lt;p&gt;
  做了一支 bookmarklet 把它改成以下格式：
&lt;/p&gt;
&lt;textarea class="ta-code html" rows="2" cols="78"&gt;
&amp;lt;a href=&amp;quot;http://1.bp.blogspot.com/-NcfksJtd0V0/Tnilmxq3e-I/AAAAAAAABQs/qUa6u-iZSdU/s1600/ocarina.png&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;http://1.bp.blogspot.com/-NcfksJtd0V0/Tnilmxq3e-I/AAAAAAAABQs/qUa6u-iZSdU/s320/ocarina.png&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;
&lt;/textarea&gt;

&lt;p&gt;
  將 bookmarklet 加進書籤 →
  &lt;a class="underline" href="javascript:(function()%7Bvar%20$textarea=document.getElementById(%22postingHtmlBox%22),pattern=['%3Cdiv%20class=%22separator%22%20style=%22clear:%20both;%20text-align:%20center;%22%3E%5Cn','%3Ca%20href=%22(.+)%22','%20imageanchor=%221%22%20style=%22.*%22%3E%3Cimg%20border=%220%22%20height=%22.+%22%20width=%22.+%22%20','src=%22(.+)%22%20/%3E%3C/a%3E%3C/div%3E'].join(%22%22),re=new%20RegExp(pattern,%22g%22);if($textarea)$textarea.value=$textarea.value.replace(re,function(str,p1,p2,p3)%7Breturn['%3Ca%20href=%22',p1,'%22%3E','%3Cimg%20src=%22',p2,'%22%20alt=%22%22%20/%3E%3C/a%3E'].join(%22%22)%7D);else%20alert(%22%5Cu932f%5Cu8aa4%5Cuff1a%5Cu627e%5Cu4e0d%5Cu5230%20textarea%23postingHtmlBox%5Cu3002%22);%7D)();"&gt;清理 blogger 插入的圖片標籤&lt;/a&gt;&lt;br&gt;
  在文章編輯器的 HTML 模式執行就立刻取代，不保證原文的安全，請自己保重。
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;hr class="hr"&gt;
&lt;h3&gt;原始碼&lt;/h3&gt;
&lt;pre class="sh-code javascript"&gt;
var
  $textarea = document.getElementById(&amp;apos;postingHtmlBox&amp;apos;),
  pattern = [
    &amp;apos;&amp;lt;div class=&amp;quot;separator&amp;quot; style=&amp;quot;clear: both; text-align: center;&amp;quot;&amp;gt;\n&amp;apos;,
    &amp;apos;&amp;lt;a href=&amp;quot;(.+)&amp;quot;&amp;apos;,
    &amp;apos; imageanchor=&amp;quot;1&amp;quot; style=&amp;quot;.*&amp;quot;&amp;gt;&amp;lt;img border=&amp;quot;0&amp;quot; height=&amp;quot;.+&amp;quot; width=&amp;quot;.+&amp;quot; &amp;apos;,
    &amp;apos;src=&amp;quot;(.+)&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;apos;
  ].join(&amp;apos;&amp;apos;),
  re = new RegExp(pattern, &amp;apos;g&amp;apos;);

if ($textarea) {
  $textarea.value = $textarea.value.replace(re, function (str, p1, p2, p3) {
    return [
      &amp;apos;&amp;lt;a href=&amp;quot;&amp;apos;, p1, &amp;apos;&amp;quot;&amp;gt;&amp;apos;,
      &amp;apos;&amp;lt;img src=&amp;quot;&amp;apos;, p2, &amp;apos;&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;apos;
    ].join(&amp;apos;&amp;apos;);
  });
} else {
  alert(&amp;apos;錯誤：找不到 textarea#postingHtmlBox。&amp;apos;);
}
&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-2516207424967002021?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/g1_8L1fWKpM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/2516207424967002021/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/09/blogger.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/2516207424967002021?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/2516207424967002021?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/09/blogger.html" title="清理 blogger 貼圖的冗碼（改版）" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUABRn06fCp7ImA9WhdVE0w.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-5021094459605644609</id><published>2011-09-18T11:49:00.000+08:00</published><updated>2011-09-18T11:49:17.314+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-18T11:49:17.314+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><category scheme="http://www.blogger.com/atom/ns#" term="vim-cycle" /><title>cycle.vim 簡易使用說明</title><content type="html">&lt;h3&gt;安裝&lt;/h3&gt;
&lt;p&gt;
  建議用 &lt;a href="https://github.com/gmarik/vundle" title="gmarik/vundle - GitHub"&gt;Vundle&lt;/a&gt; 裝 → &lt;code&gt;Bundle 'bootleq/vim-cycle'&lt;/code&gt;。&lt;br&gt;
  不然就用老方法，把所有檔案放到 &lt;a href="http://vimdoc.sourceforge.net/htmldoc/options.html#%27runtimepath%27" title="Vim documentation: options"&gt;runtimepath&lt;/a&gt;（預設在 ~/.vim）即可。&lt;br&gt;
  檔案在 &lt;a class="underline" href="https://github.com/bootleq/vim-cycle" title="bootleq/vim-cycle - GitHub"&gt;https://github.com/bootleq/vim-cycle&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;h3&gt;簡易設定&lt;/h3&gt;
&lt;p&gt;
  要特別做的只有「哪些字能 cycle」設定，否則預設的字很少。&lt;br&gt;
  把 &lt;a href="https://github.com/bootleq/vim-cycle/blob/8edc5d06539ce9322c539494fb209e6dd3ee9e52/doc/cycle.txt#L287-341" title="doc/cycle.txt at 8edc5d06539ce9322c539494fb209e6dd3ee9e52 from bootleq/vim-cycle - GitHub"&gt;doc 287-341 行的範例&lt;/a&gt; 加進 vimrc，再視需要修改就可以了，應該很容易看懂。&lt;br&gt;
  進階選項再看 doc。
&lt;/p&gt;

&lt;h3&gt;用途，例子&lt;/h3&gt;
&lt;p&gt;
  預設會加一個快速鍵 &lt;kbd&gt;&amp;lt;Leader&amp;gt;a&lt;/kbd&gt;，其中 &amp;lt;Leader&amp;gt; 預設是 &lt;kbd&gt;\&lt;/kbd&gt; 所以實際是按 &lt;kbd&gt;\a&lt;/kbd&gt;。&lt;br&gt;
  （註：用 &lt;em&gt;a&lt;/em&gt; 是取 Advance、Add 的 a，類似預設的 &lt;a href="http://vimdoc.sourceforge.net/htmldoc/change.html#CTRL-A" title="Vim documentation: change"&gt;CTRL-A&lt;/a&gt; 功能）&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
  按 &lt;kbd&gt;&amp;lt;Leader&amp;gt;a&lt;/kbd&gt; 會把目前游標上的字換成下一個，以下舉例說明；若有特別&lt;b class="underline"&gt;標示&lt;/b&gt;，表示游標位置。
&lt;/p&gt;

&lt;ul class="mass"&gt;
  &lt;li&gt;
    &lt;code&gt;true&lt;/code&gt; →&lt;code&gt; false&lt;/code&gt;&lt;br&gt;
    true 會變 false，false 會變 true；光這樣就很方便了。
  &lt;/li&gt;
  &lt;li&gt;
    &lt;code&gt;Yes&lt;/code&gt; →&lt;code&gt; No&lt;/code&gt;&lt;br&gt;
    大小寫會自動保持。
  &lt;/li&gt;
  
  &lt;li class="bm-0"&gt;
    &lt;code&gt;+&lt;/code&gt; → &lt;code&gt;-&lt;/code&gt;&lt;br&gt;
  &lt;/li&gt;
  
  &lt;li class="bm-0"&gt;
    &lt;code&gt;==&lt;/code&gt; → &lt;code&gt;!=&lt;/code&gt;&lt;br&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;code&gt;可&lt;b class="underline"&gt;是&lt;/b&gt;&lt;/code&gt; → &lt;code&gt;可&lt;b class="underline"&gt;否&lt;/b&gt;&lt;/code&gt;&lt;br&gt;
    特殊符號和中文都可以 cycle。
  &lt;/li&gt;
  &lt;li&gt;
    &lt;code&gt;Sunday&lt;/code&gt; → &lt;code&gt;Monday&lt;/code&gt; → &lt;code&gt;Tuesday&lt;/code&gt; → &lt;code&gt;Wednesday&lt;/code&gt; →
    &lt;code&gt;Thursday&lt;/code&gt; → &lt;code&gt;Friday&lt;/code&gt; → &lt;code&gt;Saturday&lt;/code&gt; → &lt;code&gt;Sunday&lt;/code&gt;&lt;br&gt;
    typo 的機率降低了。
  &lt;/li&gt;
  &lt;li&gt;
    &lt;code&gt;Rails&lt;b class="underline"&gt; &lt;/b&gt;Metal&lt;/code&gt; → &lt;code&gt;Thras&lt;b class="underline"&gt;h&lt;/b&gt;&lt;/code&gt; → &lt;code&gt;Techn&lt;b class="underline"&gt;i&lt;/b&gt;cal Death&lt;/code&gt;&lt;br&gt;
    即使游標在空白上，也能試著搜尋關鍵字。
  &lt;/li&gt;

  
  &lt;li class="bm-0"&gt;
    &lt;code&gt;$li.a&lt;b class="underline"&gt;d&lt;/b&gt;dClass(&amp;apos;foo&amp;apos;)&lt;/code&gt; → &lt;code&gt;$li.r&lt;b class="underline"&gt;e&lt;/b&gt;moveClass(&amp;apos;foo&amp;apos;)&lt;/code&gt; - &lt;a href="http://api.jquery.com/category/attributes/" title="Attributes – jQuery API"&gt;jQuery element Attributes&lt;/a&gt;&lt;br&gt;
  &lt;/li&gt;
  
  &lt;li class="bm-0"&gt;
    &lt;code&gt;position: &amp;apos;upper&lt;b class="underline"&gt;L&lt;/b&gt;eft&amp;apos;&lt;/code&gt; → &lt;code&gt;position: &amp;apos;upper&lt;b class="underline"&gt;R&lt;/b&gt;ight&amp;apos;&lt;/code&gt; - &lt;a href="http://mootools.net/docs/more/Element/Element.Position#Element:position" title="MooTools Docs - Element/Element.Position"&gt;MooTools Element.Position&lt;/a&gt;&lt;br&gt;
  &lt;/li&gt;
  
  &lt;li&gt;
    &lt;code&gt;:render_w&lt;b class="underline"&gt;i&lt;/b&gt;th_me&lt;/code&gt; → &lt;code&gt;:render_w&lt;b class="underline"&gt;i&lt;/b&gt;thout_me&lt;/code&gt; - &lt;a href="http://api.rubyonrails.org/classes/Module.html#method-i-alias_method_chain" title="Module"&gt;Rails alias_method_chain&lt;/a&gt;&lt;br&gt;
    處理串在一起的字，實用性增加不少。
  &lt;/li&gt;

  &lt;li&gt;
    &lt;code&gt;&amp;lt;em&amp;gt;example&amp;lt;/e&lt;b class="underline"&gt;m&lt;/b&gt;&amp;gt;&lt;/code&gt; → &lt;code&gt;&amp;lt;strong&amp;gt;example&amp;lt;/s&lt;b class="underline"&gt;t&lt;/b&gt;rong&amp;gt;&lt;/code&gt;&lt;br&gt;
    HTML 標籤的開始／關閉標記可以一起 cycle。
  &lt;/li&gt;
  &lt;li&gt;
    &lt;code&gt;「例子&lt;b class="underline"&gt;」&lt;/b&gt;&lt;/code&gt; → &lt;code&gt;『例子&lt;b class="underline"&gt;』&lt;/b&gt;&lt;/code&gt; → &lt;code&gt;（例子&lt;b class="underline"&gt;）&lt;/b&gt;&lt;/code&gt;&lt;br&gt;
    成對的關鍵字可以一起 cycle。&lt;br&gt;
    不過目前未支援頭尾相同的 pair，例如 &lt;code&gt;&amp;quot;例子&amp;quot;&lt;/code&gt;。
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  另外在 &lt;kbd&gt;&amp;lt;Leader&amp;gt;a&lt;/kbd&gt; 前可以加 &lt;var&gt;[count]&lt;/var&gt;，例如 &lt;kbd&gt;2\a&lt;/kbd&gt; 會 cycle 到第二個的候選，
  &lt;code&gt;Monday&lt;/code&gt; 就會變成 &lt;code&gt;Wednesday&lt;/code&gt; 而不是 &lt;code&gt;Tuesday&lt;/code&gt;。
&lt;/p&gt;
&lt;p&gt;
  還有在 visual mode 也可以用 &lt;kbd&gt;&amp;lt;Leader&amp;gt;a&lt;/kbd&gt;，這樣就不會自動搜尋關鍵字，而是直接用選取的字來 cycle，遇到混淆時可以試試。
&lt;/p&gt;

&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-5021094459605644609?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/zSFqh_jqbSE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/5021094459605644609/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/09/cyclevim.html#comment-form" title="4 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/5021094459605644609?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/5021094459605644609?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/09/cyclevim.html" title="cycle.vim 簡易使用說明" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;CUMBR3w5eyp7ImA9WhdUEEk.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-8570388887643620585</id><published>2011-09-17T23:47:00.000+08:00</published><updated>2011-09-26T21:24:16.223+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-26T21:24:16.223+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><category scheme="http://www.blogger.com/atom/ns#" term="vim-cycle" /><title>Vim plugin - cycle 開發背景</title><content type="html">&lt;p&gt;
  要怎麼把 &lt;code&gt;Yes&lt;/code&gt; 換成 &lt;code&gt;No&lt;/code&gt;？
  標準答案是 &lt;kbd&gt;ciw&lt;/kbd&gt; 再輸入 "No"。
&lt;/p&gt;
&lt;p&gt;
  更快的方法是寫 script 處理，很久以前看到一篇
  &lt;a href="http://vim.wikia.com/wiki/Toggling_yes-no" title="Toggling yes-no - Vim Tips Wiki"&gt;Toggling yes-no&lt;/a&gt;，
  把常用組合先定義好，只要一個鍵就能把 &lt;code&gt;Yes&lt;/code&gt; 換成 &lt;code&gt;No&lt;/code&gt;，再按一次就換回來，真是聰明啊～
  這方法我用了很久，當時改出來的設定如&lt;a href="https://gist.github.com/1242220" title="Old way to toggle words, I no longer use it. — Gist"&gt;這個 gist&lt;/a&gt;。
&lt;/p&gt;

&lt;div class="fullpost"&gt;
&lt;p&gt;
  因為覺得方便，又有蠻多地方想改善，所以打算寫成 plugin。&lt;br&gt;
  搜尋 toggle 才發現真多人寫過，不過似乎大同小異，除了
  &lt;a href="https://github.com/mjbrownie/swapit" title="mjbrownie/swapit - GitHub"&gt;SwapIt.vim&lt;/a&gt;：
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;用 visual 選起來，就可以處理含空白的 &lt;code&gt;some words&lt;/code&gt;（原本的實作方式辦不到）。&lt;/li&gt;
  &lt;li&gt;可以把 &lt;code&gt;&amp;lt;H1&amp;gt;example&amp;lt;/H1&amp;gt;&lt;/code&gt; 變成 &lt;code&gt;&amp;lt;H2&amp;gt;example&amp;lt;/H2&amp;gt;&lt;/code&gt;（一次換掉前後 tag）。&lt;/li&gt;
  &lt;li&gt;可以吃 omni-completion 的結果，所以不必額外設定，就知道 CSS display &lt;var&gt;block&lt;/var&gt; 可以換成 &lt;var&gt;inline&lt;/var&gt;、&lt;var&gt;none&lt;/var&gt; 等等。&lt;/li&gt;
  &lt;li&gt;其它。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  我比較同意 SwapIt 的設計，認定 swap 這個功能，用力加強它。&lt;br&gt;
  SwapIt 的問題是實作還未成熟，所以我也 &lt;a href="https://github.com/bootleq/swapit" title="bootleq/swapit - GitHub"&gt;fork&lt;/a&gt; 它準備貢獻。
  但是送第二個 pull request 前，覺得有點走不下去：
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;繼續改下去，細部的實作幾乎都不一樣。&lt;/li&gt;
  &lt;li&gt;重寫比重構簡單。&lt;/li&gt;
  &lt;li&gt;在使用者立場，我想像的 interface 是另一番面貌，向前相容顯得多餘。&lt;/li&gt;
  &lt;li&gt;我想全權處理所有問題。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  另外對 SwapIt 這個名字也有點在意，至少我搜尋的時候就沒想到 swap 這關鍵字。&lt;br&gt;
  想起來最適合的字是 &lt;strong&gt;Cycle&lt;/strong&gt;（因為是在一組字中循環，例如 top right bottom left），但是在 GitHub 一搜就發現已經有同名 plugin 了
  ——&lt;a href="https://github.com/zef/vim-cycle" title="zef/vim-cycle - GitHub"&gt;zef/vim-cycle&lt;/a&gt;——很精簡，程式聰明漂亮，可惜作者太忙比較沒空更新。
&lt;/p&gt;

&lt;hr class="hr"&gt;

&lt;p&gt;
  結果我的 plugin 還是叫 cycle，這樣好嗎？&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
  我把碰到的困難告訴兩位開發者 &lt;a href="https://github.com/mjbrownie" title="mjbrownie's Profile - GitHub"&gt;Michael Brown&lt;/a&gt;
  和 &lt;a href="http://madebykiwi.com/" title="Made by Kiwi"&gt;Zef&lt;/a&gt;，他們都很開放，表示基本上不介意我這麼做（我想還是有點情緒干擾吧）；
  而雖然大家目標類似，但個人考量的點（有趣的是想法從 coding style 與用法設計就看得出來）還是不容易統合，變成一個專案。
&lt;/p&gt;

&lt;p&gt;
  這種情況下，我就先開發再說了，把手上的問題解決。
&lt;/p&gt;
&lt;p&gt;
  目前 0.1.0 版本已經是堪用階段：
  &lt;a class="underline" href="https://github.com/bootleq/vim-cycle" title="bootleq/vim-cycle - GitHub"&gt;bootleq/vim-cycle - GitHub&lt;/a&gt;&lt;br&gt;
  之後會再寫一篇簡易使用說明。
&lt;/p&gt;

&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-8570388887643620585?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/3_Uh6BISqhI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/8570388887643620585/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/09/vim-plugin-cycle.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8570388887643620585?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8570388887643620585?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/09/vim-plugin-cycle.html" title="Vim plugin - cycle 開發背景" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEQMSXo5fip7ImA9WhdWF0U.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-7005128977520922904</id><published>2011-09-11T15:28:00.002+08:00</published><updated>2011-09-12T08:13:08.426+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-12T08:13:08.426+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>提升 Vim script 的可讀性，語法規範建議</title><content type="html">&lt;p&gt;
  最近在寫 plugin，對之前的 coding style（主要用在 vimrc）有些不同意了。&lt;br&gt;
  其中一些比較確定、通用的部分是關於可讀性的，整理如下：
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href="#post-110911-no-abbr"&gt;不要用簡寫&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#post-110911-indent-in-modeline"&gt;在 modeline 寫明縮排規則&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#post-110911-fold-with-marker"&gt;用 marker 手動折疊程式碼，建立 section&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#post-110911-blank-lines-between-sections"&gt;增加空行，分隔程式區塊&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#post-110911-comment-independent"&gt;註解不應影響程式排版&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#post-110911-split-lines"&gt;串接多個項目時，拆成多行&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#post-110911-hash-options"&gt;適當使用 Dictionary (hash) 進行參數操作&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#post-110911-misc"&gt;其他相關但未規範的部分&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="fullpost"&gt;
&lt;hr class="hr" /&gt;

&lt;h3 id="post-110911-no-abbr"&gt;不要用簡寫&lt;/h3&gt;
&lt;p&gt;
  指的是選項、指令名稱的簡寫，例如：
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;function!&lt;/code&gt; → &lt;code&gt;fun!&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;setlocal textwidth=78&lt;/code&gt; → &lt;code&gt;setl tw=78&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;execute "normal! dd"&lt;/code&gt; → &lt;code&gt;exe "norm! dd"&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  例子可能不夠極端（還是看得懂），但是已經失去字面上的意思（最簡單的可讀）了。
&lt;/p&gt;
&lt;p&gt;
  此外還有一致性的問題，完全一樣的意思卻不能預期用哪個敘述。&lt;br&gt;
  例如想找函數定義，直接搜尋 &lt;code&gt;func!&lt;/code&gt; 卻找不到 &lt;code&gt;function!&lt;/code&gt;，問題是什麼？
  其實不必問了，這完全是可以避免的問題。
&lt;/p&gt;
&lt;p&gt;
  總之除非有足夠理由（例如故意用 &lt;code&gt;fun!&lt;/code&gt; 定義比較 funny 的函數），還是一律用完整寫法吧。
&lt;/p&gt;

&lt;hr class="hr" /&gt;

&lt;h3 id="post-110911-indent-in-modeline"&gt;在 modeline 寫明縮排規則&lt;/h3&gt;
&lt;p&gt;
  縮排和可讀性的關係是，縮排亂掉的時候會很難讀。
&lt;/p&gt;
&lt;p&gt;
  首先要訂好自己的縮排規範，用空白還是 Tab、要空幾格，然後確實遵守。&lt;br&gt;
  再來要了解每個人的規則會不一樣：
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;你用 Tab 排好的版，別人打開還是可能亂掉。&lt;/li&gt;
  &lt;li&gt;別人編輯你的 script 後，可能也塞了不一致的縮排字元進去。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  減輕問題的方式是在每個檔案加上 modeline：&lt;br&gt;
  例如一律用空白，確保排版不會被 Tab 弄亂&lt;br&gt;
  &lt;code&gt;" vim: expandtab softtabstop=2 shiftwidth=2 &lt;/code&gt;&lt;br&gt;
  如果還是偏好 Tab（也許為了減少字數）&lt;br&gt;
  &lt;code&gt;" vim: noexpandtab tabstop=8 shiftwidth=8&lt;/code&gt;
&lt;/p&gt;
&lt;h4 class="bm-0"&gt;附上我的基本 modeline 如下（寫在檔案最後一行）&lt;/h4&gt;
&lt;pre class="vim"&gt;
&lt;span class="Comment"&gt;&amp;quot; modeline {{{&lt;/span&gt;
&lt;span class="Comment"&gt;&amp;quot; vim: expandtab softtabstop=2 shiftwidth=2 foldmethod=marker&lt;/span&gt;
&lt;/pre&gt;

&lt;hr class="hr" /&gt;

&lt;h3 id="post-110911-fold-with-marker"&gt;用 marker 手動折疊程式碼，建立 section&lt;/h3&gt;
&lt;p&gt;
  在註解中使用 marker（預設是 &lt;code&gt;{{{&lt;/code&gt; 和 &lt;code&gt;}}}&lt;/code&gt;）整理程式碼是很普遍的作法，
  script 稍大時幾乎都會用上，否則會覺得難爬。
&lt;/p&gt;
&lt;p&gt;
  對以下常見的 folding：
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;
    多個有關的函數，可以歸納為一個 &lt;dfn&gt;section&lt;/dfn&gt;&lt;span class="gray-d"&gt;（&lt;em&gt;註&lt;/em&gt;：和 Vim motion 的 &lt;a href="http://vimdoc.sourceforge.net/htmldoc/motion.html#section" title="Vim documentation: motion"&gt;section &lt;/a&gt; 無關）&lt;/span&gt;，但是沒什麼好方法表示，於是加上註解「以下這段是做 XXX」，然後在結束的地方寫「XXX 做完了」。這整段就適合當作一個 fold&lt;br&gt;
  &lt;/li&gt;
  &lt;li&gt;
    讓多次出現的語法單位（通常就是函數）可以各自折疊
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  規範一個通用的格式。
&lt;/p&gt;
&lt;p&gt;
  以下是我的例子。
  從 Utils: 開始是一個叫做 Utils 的 section，用大寫字和冒號形成一個 vimCommentTitle（來自預設的 syntax 上色），又更顯目一點。
&lt;/p&gt;
&lt;pre class="vim"&gt;
&lt;span class="Comment"&gt;&amp;quot;&lt;/span&gt; &lt;span class="PreProc"&gt;Utils:&lt;/span&gt;&lt;span class="Comment"&gt; {{{&lt;/span&gt;

&lt;span class="Statement"&gt;function&lt;/span&gt;! &lt;span class="Special"&gt;s:&lt;/span&gt;save_reg&lt;span class="Special"&gt;(&lt;/span&gt;name&lt;span class="Special"&gt;)&lt;/span&gt; &lt;span class="Comment"&gt;&amp;quot;{{{&lt;/span&gt;
  &lt;span class="Statement"&gt;let&lt;/span&gt; s:save_reg &lt;span class="Operator"&gt;=&lt;/span&gt; [&lt;span class="Function"&gt;getreg&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;a:name&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;, &lt;span class="Function"&gt;getregtype&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;a:name&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;]
&lt;span class="Statement"&gt;endfunction&lt;/span&gt; &lt;span class="Comment"&gt;&amp;quot;}}}&lt;/span&gt;

&lt;span class="Statement"&gt;function&lt;/span&gt;! &lt;span class="Special"&gt;s:&lt;/span&gt;restore_reg&lt;span class="Special"&gt;(&lt;/span&gt;name&lt;span class="Special"&gt;)&lt;/span&gt; &lt;span class="Comment"&gt;&amp;quot;{{{&lt;/span&gt;
  &lt;span class="Statement"&gt;if&lt;/span&gt; &lt;span class="Function"&gt;exists&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="String"&gt;'s:save_reg'&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;
    &lt;span class="Statement"&gt;call&lt;/span&gt; &lt;span class="Function"&gt;setreg&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;a:name&lt;/span&gt;, s:save_reg[&lt;span class="Constant"&gt;0&lt;/span&gt;], s:save_reg[&lt;span class="Constant"&gt;1&lt;/span&gt;]&lt;span class="Special"&gt;)&lt;/span&gt;
  &lt;span class="Statement"&gt;endif&lt;/span&gt;
&lt;span class="Statement"&gt;endfunction&lt;/span&gt; &lt;span class="Comment"&gt;&amp;quot;}}}&lt;/span&gt;

&lt;span class="Comment"&gt;&amp;quot; }}} Utils&lt;/span&gt;
&lt;/pre&gt;

&lt;h4 class="ta-c bm-0"&gt;折起來（一層）後，擷圖如下&lt;/h4&gt;
&lt;p class="ta-c tm-0"&gt;
  &lt;a href="http://3.bp.blogspot.com/-KyQ8QRsTnwU/TmscDPMJXuI/AAAAAAAABPA/ib_6f75Ebw0/s1600/vim-readable-fold.png"&gt;&lt;img src="http://3.bp.blogspot.com/-KyQ8QRsTnwU/TmscDPMJXuI/AAAAAAAABPA/ib_6f75Ebw0/s540/vim-readable-fold.png" alt="折起一層" /&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;hr class="hr" /&gt;

&lt;h3 id="post-110911-blank-lines-between-sections"&gt;增加空行，分隔程式區塊&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    函數之間，空 2 行。&lt;br&gt;
    因為函數中本來就經常會空 1 行，所以要空超過 1 行才清楚。
  &lt;/li&gt;
  &lt;li&gt;
    section 之間，空 2 行。&lt;br&gt;
    這裡 2 行就夠了，因為 marker（在註解中）和程式之間也有空行，所以不算註解的話，實際上 section 之間會空 6 行。
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 class="bm-0 lm-10"&gt;全部縮起來（&lt;kbd&gt;zM&lt;/kbd&gt;）時，看見所有 section&lt;/h4&gt;
&lt;a href="http://4.bp.blogspot.com/-_nd_5gQm4P0/TmstoWhFB7I/AAAAAAAABQA/g4p5uMzXQjc/s1600/zM.png"&gt;&lt;img src="http://4.bp.blogspot.com/-_nd_5gQm4P0/TmstoWhFB7I/AAAAAAAABQA/g4p5uMzXQjc/s512/zM.png" alt="全部縮起來（zM）時，看見所有 section" /&gt;&lt;/a&gt;

&lt;h4 class="bm-0 lm-10 tm-0"&gt;打開一個 section，看見所有 function&lt;/h4&gt;&lt;small class="gray-d lm-10"&gt;抱歉擷圖是舊程式，函數之間只空 1 行，應該空 2 行……&lt;/small&gt;&lt;br&gt;
&lt;a href="http://2.bp.blogspot.com/-vOhdSTT7DNM/TmsrfofC-ZI/AAAAAAAABPU/m4mma0_ul2M/s1600/zo-section.png"&gt;&lt;img src="http://2.bp.blogspot.com/-vOhdSTT7DNM/TmsrfofC-ZI/AAAAAAAABPU/m4mma0_ul2M/s512/zo-section.png" alt="打開一個 section，看見所有 function（抱歉擷圖是舊程式，函數之間只空 1 行，應該空 2 行）"/&gt;&lt;/a&gt;

&lt;h4 class="bm-0 lm-10 tm-0"&gt;各個 function 之間空兩行&lt;/h4&gt;
&lt;a href="http://3.bp.blogspot.com/-MRGNWxww_g4/TmsrySa84RI/AAAAAAAABPc/Smuxw8lxmNc/s1600/zo-functions.png"&gt;&lt;img src="http://3.bp.blogspot.com/-MRGNWxww_g4/TmsrySa84RI/AAAAAAAABPc/Smuxw8lxmNc/s512/zo-functions.png" alt="各個 function 之間空兩行" /&gt;&lt;/a&gt;

&lt;h4 class="bm-0 lm-10 tm-0"&gt;各個 section 之間空兩行，實際程式空了 6 行&lt;/h4&gt;
&lt;a href="http://4.bp.blogspot.com/-_QUNpYcK6bY/Tmsr2wJXk3I/AAAAAAAABPk/l08omeeHw6U/s1600/zo-sections.png"&gt;&lt;img src="http://4.bp.blogspot.com/-_QUNpYcK6bY/Tmsr2wJXk3I/AAAAAAAABPk/l08omeeHw6U/s512/zo-sections.png" alt="各個 section 之間空兩行，實際程式空了 6 行" /&gt;&lt;/a&gt;

&lt;hr class="hr" /&gt;

&lt;h3 id="post-110911-comment-independent"&gt;註解不應影響程式排版&lt;/h3&gt;
&lt;p&gt;
  手動 fold 有很多層的時候，我曾經把深層的程式加一級縮排：
&lt;/p&gt;
&lt;pre class="vim"&gt;
&lt;span class="Comment"&gt;&amp;quot; MAPPINGS             {{{1 ==================================================&lt;/span&gt;

  &lt;span class="Statement"&gt;let&lt;/span&gt; maplocalleader &lt;span class="Operator"&gt;=&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;
  &lt;span class="Statement"&gt;noremap&lt;/span&gt;  &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;Leader&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;LocalLeader&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;LocalLeader&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="Comment"&gt;  &amp;quot;   各種移動    {{{2&lt;/span&gt;

    &lt;span class="Statement"&gt;noremap&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;expr&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;Space&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;  repeat('&amp;lt;ScrollWheelDown&amp;gt;', 2)
&lt;/pre&gt;
&lt;p&gt;
  看起來似乎更清楚，但這個超過註解該做的事了。&lt;br&gt;
  理想上要專注於程式本身的表達能力才對。
&lt;/p&gt;

&lt;hr class="hr" /&gt;

&lt;h3 id="post-110911-split-lines"&gt;串接多個項目時，拆成多行&lt;/h3&gt;
&lt;p&gt;
  寫下 &lt;code&gt;aaa, bbb, ccc, ...&lt;/code&gt; 這樣的敘述時，除非真的很簡單，否則不要擠在同一行，難讀又難改。
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;參數很多時&lt;/li&gt;
  &lt;li&gt;定義複雜的 List &lt;small class="gray-d"&gt;(Array)&lt;/small&gt; 或 Dictionary &lt;small class="gray-d"&gt;(Hash)&lt;/small&gt; 時&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  請用 backslash (&lt;code&gt;\&lt;/code&gt;) 拆開。
&lt;/p&gt;
&lt;pre class="vim"&gt;
&lt;span class="Statement"&gt;call&lt;/span&gt; &lt;span class="Function"&gt;setline&lt;/span&gt;(
&lt;span class="Special"&gt;      \&lt;/span&gt;   a:before&lt;span class="Operator"&gt;.&lt;/span&gt;line,
&lt;span class="Special"&gt;      \&lt;/span&gt;   &lt;span class="Function"&gt;substitute&lt;/span&gt;(
&lt;span class="Special"&gt;      \&lt;/span&gt;     &lt;span class="Function"&gt;getline&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;a:before&lt;/span&gt;&lt;span class="Operator"&gt;.&lt;/span&gt;line&lt;span class="Special"&gt;)&lt;/span&gt;,
&lt;span class="Special"&gt;      \&lt;/span&gt;     &lt;span class="String"&gt;'\%'&lt;/span&gt; &lt;span class="Operator"&gt;.&lt;/span&gt; a:before&lt;span class="Operator"&gt;.&lt;/span&gt;&lt;span class="Statement"&gt;col&lt;/span&gt; &lt;span class="Operator"&gt;.&lt;/span&gt; &lt;span class="String"&gt;'c'&lt;/span&gt; &lt;span class="Operator"&gt;.&lt;/span&gt; &lt;span class="Normal"&gt;s:escape_pattern&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;a:before&lt;/span&gt;&lt;span class="Operator"&gt;.&lt;/span&gt;text&lt;span class="Special"&gt;)&lt;/span&gt;,
&lt;span class="Special"&gt;      \&lt;/span&gt;     &lt;span class="Normal"&gt;s:escape_sub_expr&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;a:after&lt;/span&gt;&lt;span class="Operator"&gt;.&lt;/span&gt;text&lt;span class="Special"&gt;)&lt;/span&gt;,
&lt;span class="Special"&gt;      \&lt;/span&gt;     &lt;span class="String"&gt;''&lt;/span&gt;
&lt;span class="Special"&gt;      \&lt;/span&gt;   &lt;span class="Error"&gt;)&lt;/span&gt;
&lt;span class="Special"&gt;      \&lt;/span&gt; &lt;span class="Error"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  這裡的縮排比較詭異，不是由 indent 選項而是由一個變數控制，見 &lt;a href="http://vimdoc.sourceforge.net/htmldoc/indent.html#ft-vim-indent" title="Vim documentation: indent"&gt;ft-vim-indent&lt;/a&gt;，預設是 shiftwidth 的三倍。&lt;br&gt;
  &lt;code&gt;let g:vim_indent_cont = &amp;amp;shiftwidth * 3&lt;/code&gt;&lt;br&gt;
  我沒有設這個變數，backslash 之後的縮排也是手動做的，規則是至少空一格，其餘每一層就縮一級。&lt;br&gt;
  單純是「採用預設值」這個考量。
&lt;/p&gt;

&lt;hr class="hr" /&gt;

&lt;h3 id="post-110911-hash-options"&gt;適當使用 Dictionary (hash) 進行參數操作&lt;/h3&gt;
&lt;p&gt;
  可以考慮多用 hash（Vim 裡面叫 Dictionary）作為函數的參數，例如原本是：&lt;br&gt;
  &lt;code&gt;function Img(src, alt, size, class)&lt;/code&gt;
  或接受任意個參數的&lt;br&gt;
  &lt;code&gt;function Img(src, alt, size, ...)&lt;/code&gt;
  都可以改成&lt;br&gt;
  &lt;code&gt;function Img(src, options)&lt;/code&gt;&lt;br&gt;
  就不必記參數的順序，或再解析 &lt;var&gt;a:0&lt;/var&gt;、&lt;var&gt;a:1&lt;/var&gt;（額外的參數會被轉成 &lt;var&gt;a:N&lt;/var&gt;）了。
&lt;/p&gt;
&lt;p&gt;
  存取 options 的時候，盡量用點（&lt;code&gt;.&lt;/code&gt;）取代方括號（&lt;code&gt;[]&lt;/code&gt;），&lt;br&gt;
  例如 &lt;code&gt;options.size&lt;/code&gt; 就比 &lt;code&gt;options['size']&lt;/code&gt; 簡單明瞭。
&lt;/p&gt;
&lt;p&gt;
  不過因為 Vim script 的特性，也有一些像陷阱的東西。&lt;br&gt;
  例如取值的時候要用 &lt;code&gt;get(options, 'size')&lt;/code&gt; 比較安全，沒有 'size' 這個 key 的時候才會回 &lt;code&gt;0&lt;/code&gt;，而不是報錯。&lt;br&gt;
  還有在 value 不是 Number 時，直接 &lt;code&gt;if get(options, 'key')&lt;/code&gt; 會有型別轉換的細節要注意，
  通常會加一道 &lt;code&gt;if type(get(options, 'key')) == type(xxx)&lt;/code&gt; 檢查，比較麻煩。
&lt;/p&gt;

&lt;hr class="hr" /&gt;
&lt;h3 id="post-110911-misc"&gt;其他相關但未規範的部分&lt;/h3&gt;
&lt;ul class="mass-p-min"&gt;
  &lt;li&gt;
    &lt;h4&gt;單行的長度&lt;/h4&gt;
    &lt;p&gt;
      要填滿整行的話，會用 textwidth=78，和 Vim doc 一樣。&lt;br&gt;
      但是程式內文就不必了，因為怕太長其實是硬體問題，我認為不用管它，也解決不了它。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;變數命名&lt;/h4&gt;
    &lt;p&gt;
      Vim 對變數名稱有一些意見，例如 user function 第一個字要大寫，大小寫變數存進 session 時的規則也不同。&lt;br&gt;
      原則上使用 underscore_names 安全又簡單，可惜有時候必須大寫，還是會破例。
    &lt;/p&gt;
    &lt;p&gt;
      具體用字則是愈短、愈直接愈好，scope、autoload 和 Dictionary 可以善加利用，&lt;br&gt;
      例如 &lt;code&gt;s:width&lt;/code&gt;、&lt;code&gt;su#do()&lt;/code&gt;、&lt;code&gt;contribute.till_die&lt;/code&gt;。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;key mapping 的記法&lt;/h4&gt;
    &lt;p&gt;
      原則是和 Vim doc 一致，也就是用 &lt;kbd&gt;&amp;lt;C-X&amp;gt;&lt;/kbd&gt; 而不用 &lt;kbd&gt;&amp;lt;C-x&amp;gt;&lt;/kbd&gt;。&lt;br&gt;
      不過這樣會失去大小寫的區別。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;Magic 的 regexp&lt;/h4&gt;
    &lt;p&gt;
      Vim 的 &lt;abbr title="regular expression"&gt;regexp&lt;/abbr&gt; pattern 對哪些字元有特殊意義（需要跳脫）和別家解釋不太一樣，
      在 pattern 前加上 \v \m \M \V 又有不同解讀，
      在 plugin 或一些內建 function 裡還會一律視為 \m。
    &lt;/p&gt;
    &lt;p&gt;
      這個因應情境有很多變數，所以目前也沒有規範。
    &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-7005128977520922904?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/wrdrS58SC04" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/7005128977520922904/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/09/vim-script.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/7005128977520922904?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/7005128977520922904?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/09/vim-script.html" title="提升 Vim script 的可讀性，語法規範建議" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-KyQ8QRsTnwU/TmscDPMJXuI/AAAAAAAABPA/ib_6f75Ebw0/s72-c/vim-readable-fold.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0IGQ3k9fip7ImA9WhdQGE0.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-4653275099804209712</id><published>2011-08-20T11:05:00.000+08:00</published><updated>2011-08-20T11:05:22.766+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T11:05:22.766+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>文字對齊 plugin - Alignta 使用方式</title><content type="html">&lt;p&gt;
  對齊文字用的 plugin，以前我是用 &lt;a href="http://drchip.0sites.net/astronaut/index.html" title="Dr Chip's Site! (Vim, Simple Sockets, Debugger,...)"&gt;Dr. Chip&lt;/a&gt; 的 &lt;a class="underline" href="http://vim.sourceforge.net/scripts/script.php?script_id=294" title="Align - Help folks to align text, eqns, declarations, tables, etc : vim online"&gt;Align.vim&lt;/a&gt;，現在換成 &lt;a class="underline" href="https://github.com/h1mesuke/vim-alignta" title="h1mesuke/vim-alignta - GitHub"&gt;Alignta&lt;/a&gt; 了；雖然預設功能比較不豐富，但實在好懂多了。
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;p&gt;
  目前 ver. 0.2.1 只有日本語的 doc，如果 help 打不開（&lt;a href="http://vimdoc.sourceforge.net/htmldoc/tagsrch.html#E426" title="Vim documentation: tagsrch"&gt;E426&lt;/a&gt;），可能要先 &lt;code&gt;:set notagbsearch&lt;/code&gt;。&lt;br&gt;
&lt;/p&gt;

&lt;hr class="hr"&gt;

&lt;h3&gt;SYNOPSIS &lt;span class="gray"&gt;of Alignta command (for v. 0.2.1, UNOFFICIAL)&lt;/span&gt;&lt;/h3&gt;
&lt;pre class="vim"&gt;
                              (Shifting
                               Alignment)
                                 &amp;lt;- 
                                 -&amp;gt; 
                                 &amp;lt;--
                                 --&amp;gt;

:[range]Alignta[!] [filter]  [align method][margin]   [-p] pattern[{count}] [pattern2 ...]

                   g/pattern  (Padding                              number
                   v/pattern   Alignment)                            '+'
                                  &amp;lt;           n:n                
                                  |        [0-9][0-9]
                                  &amp;gt;          [0-9]
                                  =          
                              (repeat as     @margin
                                LM[R]...)
&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;h4&gt;!&lt;/h4&gt;
    &lt;p&gt;
      有 ! 的話，pattern 會被解釋為 regexp。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;filter&lt;/h4&gt;
    &lt;p&gt;
      指定忽略哪些特殊的行（通常是註解）不進行對齊。&lt;code&gt;g/pattern&lt;/code&gt; 只處理符合的行；&lt;code&gt;v/pattern&lt;/code&gt; 不處理符合的行。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;align method&lt;/h4&gt;
    &lt;p&gt;
      Alignta 的對齊分為 Shifting Alignment 和 Padding Alignment 兩種。&lt;br&gt;
      align method 參數也分為兩套，區別是哪一套的同時，也用來指定對齊細節。
    &lt;/p&gt;
    &lt;p&gt;
      Shifting Alignment 比較簡單，只是將 pattern 的開頭垂直排在一起。&lt;br&gt;
      &lt;code&gt;&amp;lt;-&lt;/code&gt; 是將每一行符合的部分，對齊到其中最靠左的 column；&lt;code&gt;-&amp;gt;&lt;/code&gt; 則是對齊到最靠右的 column。&lt;br&gt;
      兩個 dash 的版本（例如 &lt;code&gt;--&amp;gt;&lt;/code&gt;）表示使用 tab 字元排版。
    &lt;/p&gt;
    &lt;p&gt;
      另一種 Padding Alignment 是依 patten 將文字拆成多個欄位。&lt;br&gt;
      以 {L}{M}{R} 為一個單位，{M} 就是 pattern 符合的欄，{L}{R} 是它的左右側。
      可以用 &lt;code&gt;&amp;lt;&lt;/code&gt;、&lt;code&gt;|&lt;/code&gt;、&lt;code&gt;&amp;gt;&lt;/code&gt;、&lt;code&gt;=&lt;/code&gt; 指定各欄位靠左、靠中、靠右或保持原本方式對齊。&lt;br&gt;
      註：{R} 可省略，表示跟 {L} 相同，例如 &lt;code&gt;:Alignta &amp;lt;|&amp;gt; =&lt;/code&gt; 讓等號兩邊靠外對齊。&lt;br&gt;
      註：若後面有指定多個 pattern，這裡可以重覆 {L}{M}{R} 來指定多個對齊方式。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;margin&lt;/h4&gt;
    &lt;p&gt;
      指定各欄位的間隔。&lt;br&gt;
      一般是配合 align metohd，有幾個欄位就寫幾個 margin，各個 margin 以冒號分開，例如 &lt;code&gt;:Alignta &amp;lt;&amp;lt;3:1 =&lt;/code&gt;。&lt;br&gt;
      也可簡寫為 {L-margin}{R-margin} 或 {LR-margin}，但 margin 必須是個位數（ 0-9，10 就不行了），
      例如 &lt;code&gt;46&lt;/code&gt; 即 4:6，&lt;code&gt;4&lt;/code&gt; 即 4:4。&lt;br&gt;
      若沒有 align method，只想設 margin 時，在前面加 &lt;code&gt;@&lt;/code&gt; 即可，例如 &lt;code&gt;:Alignta @00 =&lt;/code&gt;。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;-p&lt;/h4&gt;
    &lt;p&gt;
      如果後面的 pattern 是特殊字，加上 &lt;code&gt;-p&lt;/code&gt; 可確保它被視為 pattern。
      例如 &lt;code&gt;:Alignta -p &amp;lt;&amp;lt;&lt;/code&gt; 是以 &lt;var&gt;&amp;lt;&amp;lt;&lt;/var&gt; 作為 pattern。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
  &lt;h4&gt;pattern[{count}]&lt;/h4&gt;
    &lt;p&gt;
      pattern 指定要用什麼來對齊。&lt;br&gt;
      如果有設定 &lt;var&gt;alignta_default_arguments&lt;/var&gt; 變數，那這個也能省略。
    &lt;/p&gt;
    &lt;p&gt;
      pattern 後面可以加 &lt;var&gt;{count}&lt;/var&gt;，指定要符合幾次，超過 count 就不會再對齊了。&lt;br&gt;
      例如 &lt;var&gt;:Alignta ={2}&lt;/var&gt; 只會處理前兩個等號，之後的就保持原狀。&lt;br&gt;
      另 &lt;code&gt;{+}&lt;/code&gt; 表示有 pattern 符合時才對齊，否則不理它。&lt;br&gt;
      &lt;br&gt;
      count 的預設值在 Shifting Alignment 是 &lt;var&gt;{1}&lt;/var&gt;，Padding Alignment 是 &lt;var&gt;{+}&lt;/var&gt;。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;pattern2 ...&lt;/h4&gt;
    &lt;p&gt;
      支援複數的 pattern，直接寫在後面。例如 &lt;code&gt;:Alignta = /* */&lt;/code&gt;。
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4&gt;:Align&lt;/h4&gt;
    &lt;p&gt;
      如果沒裝 Align.vim，那 &lt;code&gt;:Align&lt;/code&gt; 就是 &lt;code&gt;:Alignta&lt;/code&gt; 的別名，直接用 &lt;code&gt;:Align&lt;/code&gt; 也 OK。
    &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-4653275099804209712?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/K3ZMwI3adHw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/4653275099804209712/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/08/plugin-alignta.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4653275099804209712?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4653275099804209712?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/08/plugin-alignta.html" title="文字對齊 plugin - Alignta 使用方式" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkUHQHo_eSp7ImA9WhdQFUw.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-7939658408512064110</id><published>2011-08-16T23:57:00.000+08:00</published><updated>2011-08-16T23:57:11.441+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T23:57:11.441+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>Help 檔案中，將 *keyword* 對齊到右端</title><content type="html">&lt;p&gt;
  Help 檔案中，超連結的寫法是用兩個星號圍起來，例如：
&lt;/p&gt;

&lt;pre class="vim"&gt;
&lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;starting.txt&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;  For &lt;span class="Identifier"&gt;Vim version 7.3.&lt;/span&gt;  Last change: 2010 Sep 18
&lt;/pre&gt;

&lt;pre class="vim"&gt;
                                        &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;bold&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt; &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;underline&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt; &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;undercurl&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;
                                        &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;inverse&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt; &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;italic&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt; &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;standout&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;
term=&lt;span class="Special"&gt;{attr-list}&lt;/span&gt;                        &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;attr-list&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt; &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;highlight-term&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt; &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;E418&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;
&lt;/pre&gt;

&lt;pre class="vim"&gt;
                                                        &lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;right-justify&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;
&lt;/pre&gt;

&lt;pre class="vim"&gt;
&lt;span class="Statement"&gt;PREVENTING LOADING                                              &lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;netrw-noload&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;
  如果是寫在行尾的，我就每次看了都想把它靠右對齊……
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;p&gt;
目前應該是沒這規範，看過的 help 也沒特別處理；總之我寫了一個 function 來做這件事；&lt;br&gt;
只支援單行、只處理最後一個 &lt;code&gt;*entry*&lt;/code&gt;，超過 &lt;a href="http://vimdoc.sourceforge.net/htmldoc/options.html#%27textwidth%27" title="Vim documentation: options"&gt;'textwidth'&lt;/a&gt; 的也不管：
&lt;/p&gt;

&lt;p&gt;
  &lt;a class="underline" href="https://gist.github.com/1149395" title="Right justify *keyword* in Vim help files. — Gist"&gt;Right justify *keyword* in Vim help files. — Gist&lt;/a&gt;
&lt;/p&gt;

&lt;hr class="hr-4"/&gt;

&lt;h3 class="bm-10"&gt;使用前（'textwidth' 為 78，游標在 CONFIGURATION 那一行）&lt;/h3&gt;
&lt;pre class="vim tm-0"&gt;
&lt;span class="PreProc"&gt;==============================================================================&lt;/span&gt;
&lt;span class="Statement"&gt;CONFIGURATION                         &lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;gsession-configuration&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;
&lt;/pre&gt;

&lt;h3 class="bm-10"&gt;使用後&lt;/h3&gt;
&lt;pre class="vim tm-0"&gt;
&lt;span class="PreProc"&gt;==============================================================================&lt;/span&gt;
&lt;span class="Statement"&gt;CONFIGURATION                                         &lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;&lt;span class="String"&gt;gsession-configuration&lt;/span&gt;&lt;span class="Ignore"&gt;*&lt;/span&gt;
&lt;/pre&gt;

&lt;h3 class="bm-10"&gt;可以在 filetype 為 help 時定義這個 key mapping&lt;/h3&gt;
&lt;pre class="vim tm-0"&gt;
&lt;span class="Statement"&gt;nnoremap&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;silent&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;buffer&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;LocalLeader&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;= :call HelpHyperTextEntryJustify()&amp;lt;Enter&amp;gt;
&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-7939658408512064110?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/nGaFleznpJU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/7939658408512064110/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/08/help-keyword.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/7939658408512064110?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/7939658408512064110?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/08/help-keyword.html" title="Help 檔案中，將 *keyword* 對齊到右端" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0cEQXk5fCp7ImA9WhdQEkU.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-7559733907176743543</id><published>2011-08-14T10:30:00.001+08:00</published><updated>2011-08-14T10:30:00.724+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-14T10:30:00.724+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>修改 ShowMarks.vim 於 Vim7 的不相容</title><content type="html">&lt;p&gt;
  &lt;a href="http://www.vim.org/scripts/script.php?script_id=152" title="ShowMarks - Visually shows the location of marks. : vim online"&gt;原版的 ShowMarks&lt;/a&gt; 在 2004 後就沒更新了，在 Vim7 使用會有一些問題。 我聯絡不上作者，又 script 授權是 public domain，於是直接開個版本來維護：
&lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://github.com/bootleq/ShowMarks" title="bootleq/ShowMarks - GitHub"&gt;bootleq/ShowMarks - GitHub&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  其中幾個修改參考了 &lt;a href="http://easwy.com/blog/archives/advanced-vim-skills-advanced-move-method/" title="vi/vim使用进阶: 指随意动，移动如飞 (二) – 易水博客"&gt;vi/vim使用进阶: 指随意动，移动如飞 (二) – 易水博客&lt;/a&gt; 的 patch。
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;h3&gt;主要問題與修改&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;h4&gt;key mapping&lt;/h4&gt;
    &lt;span class="gray-d"&gt;※如果你有舊版，可以下 &lt;code&gt;:verbose map &amp;lt;Leader&amp;gt;m&lt;/code&gt; 檢視它定義的 5 個 mapping，另有 &lt;kbd&gt;\sm&lt;/kbd&gt; 和 &lt;kbd&gt;m&lt;/kbd&gt; 也是。&lt;/span&gt;&lt;br&gt;

    &lt;a class="block tm-20" href="https://github.com/bootleq/ShowMarks/commit/a7d7d620167577014b0692a9a00acfb0b5d20e13" title="Commit a7d7d620167577014b0692a9a00acfb0b5d20e13 to bootleq/ShowMarks - GitHub"&gt;commit:a7d7d62&lt;/a&gt;
    首先要改的是 &lt;code&gt;map&lt;/code&gt; =&amp;gt; &lt;code&gt;nmap&lt;/code&gt;，以免在 Visual mode 或 Select mode（例如 &lt;a href="http://www.vim.org/scripts/script.php?script_id=2540" title="snipMate - TextMate-style snippets for Vim : vim online"&gt;snipMate&lt;/a&gt; 停著等輸入時就是 Select mode）按 &lt;kbd&gt;m&lt;/kbd&gt; 變成 ShowMarks 操作導致錯誤。&lt;br&gt;
    再來增加了停用預設 mapping 的選項和 &lt;code&gt;&amp;lt;Plug&amp;gt;ShowMarksOn&lt;/code&gt; 這樣的 mapping（讓使用者用 &lt;code&gt;map mo &amp;lt;Plug&amp;gt;ShowMarksOn&lt;/code&gt; 自訂按鍵），應該是 plugin 預設 map 的最佳作法。

    &lt;a class="block tm-20" href="https://github.com/bootleq/ShowMarks/commit/72727be5fac1c3abc07efeed9e92b604ca8c8c6a" title="Commit 72727be5fac1c3abc07efeed9e92b604ca8c8c6a to bootleq/ShowMarks - GitHub"&gt;commit:72727b&lt;/a&gt;
    另外原版用到 &lt;kbd&gt;\sm&lt;/kbd&gt; 來轉接 &lt;kbd&gt;&lt;a href="http://vimdoc.sourceforge.net/htmldoc/motion.html#m" title="Vim documentation: motion"&gt;m&lt;/a&gt;&lt;/kbd&gt; 指令（以便按下 m 時，除了原本 m 要做的事，還要 call 別的函數），這裡利用 &lt;code&gt;&lt;a href="http://vimdoc.sourceforge.net/htmldoc/various.html#:normal" title="Vim documentation: various"&gt;:normal!&lt;/a&gt;&lt;/code&gt; 不會被 remap 的特性取代，也把它拿掉了。
  &lt;/li&gt;
  &lt;li class="tm-20"&gt;
    &lt;h4&gt;「刪除 mark」的實作&lt;/h4&gt;
    &lt;a href="https://github.com/bootleq/ShowMarks/commit/7ad76a93af40f8408aba16d8240cc40d18388504" title="Commit 7ad76a93af40f8408aba16d8240cc40d18388504 to bootleq/ShowMarks - GitHub"&gt;commit:7ad76a&lt;/a&gt;&lt;br&gt;
    單純是 Vim7 的新功能 &lt;code&gt;:delmarks&lt;/code&gt;。&lt;br&gt;
    舊版 &lt;code&gt;:ShowMarksClearMark&lt;/code&gt; 作法是把 mark 都移到第 0 行，幾乎是不堪用的。
  &lt;/li&gt;
  &lt;li class="tm-20"&gt;
    &lt;h4&gt;判斷 mark 所在行數&lt;/h4&gt;
    &lt;a href="https://github.com/bootleq/ShowMarks/commit/6e087f65c3134cd49b4ed397897c5952010f91b6" title="Commit 6e087f65c3134cd49b4ed397897c5952010f91b6 to bootleq/ShowMarks - GitHub"&gt;commit:6e087f4&lt;/a&gt;&lt;br&gt;
    Vim 6/7 處理 &lt;code&gt;line("'g")&lt;/code&gt;（取 g mark 的行數）時，若 mark 在別的 buffer 就會有不一致結果。&lt;br&gt;
    單純改用 &lt;code&gt;getpos("'g")&lt;/code&gt; 來判斷。
  &lt;/li&gt;
  &lt;li class="tm-20"&gt;
    &lt;h4&gt;放棄 Vim 6 以下的支援&lt;/h4&gt;
    掰掰。
  &lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-7559733907176743543?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/SzExzDKRbLs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/7559733907176743543/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/08/showmarksvim-vim7.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/7559733907176743543?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/7559733907176743543?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/08/showmarksvim-vim7.html" title="修改 ShowMarks.vim 於 Vim7 的不相容" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUYGRnczfCp7ImA9WhdQEk8.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-8285522660295231745</id><published>2011-08-13T17:14:00.002+08:00</published><updated>2011-08-13T17:18:47.984+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-13T17:18:47.984+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>用 0 作為 EasyMotion 的 leader key</title><content type="html">&lt;h3&gt;先推薦一下 EasyMotion&lt;/h3&gt;
&lt;p&gt;
  這幾天試用的 &lt;a href="https://github.com/Lokaltog/vim-easymotion" title="Lokaltog/vim-easymotion - GitHub"&gt;EasyMotion&lt;/a&gt; 某些場合下確實能增加編輯速度。
  雖然使用頻率不高，但暫時也不會移除。&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
  打從開始學 Vim 我就一向不相信「鍵盤比較快，請把滑鼠忘了」這種說法（現在也是）。&lt;br&gt;
  有時為了移動到某個位置，會進行很多無謂 motion，當按了大概 6 個鍵還到不了目標時，就會懊惱哦、我好慢！&lt;br&gt;
  目前感覺 EasyMotion 有打到這個問題，所以會繼續裝著、繼續驗證。
&lt;/p&gt;

&lt;h3&gt;很難決定要設什麼 key&lt;/h3&gt;
&lt;p&gt;
  預設是用 &amp;lt;Leader&amp;gt;（&lt;kbd&gt;\&lt;/kbd&gt;）開頭，配上 motion 指令就會發動，例如 &lt;kbd&gt;\w&lt;/kbd&gt;、&lt;kbd&gt;\f&lt;/kbd&gt;、&lt;kbd&gt;\j&lt;/kbd&gt;。&lt;br&gt;
  顯然 &amp;lt;Leader&amp;gt; 太容易跟別人相衝，plugin 也提供了方便把 leader 鍵換掉的選項，&lt;br&gt;
  但是要換哪個 key 還是很難決定。
&lt;/p&gt;

&lt;h3&gt;ZeroMotion&lt;/h3&gt;
&lt;p&gt;
  最後想法是用 &lt;kbd&gt;0&lt;/kbd&gt; 當 leader 鍵，語義上是把 motion 前的 {count} 變成 &lt;code&gt;0&lt;/code&gt;，&lt;br&gt;
  沒人知道 count 時，終極狀況就是沒有 count，不過 count 預設是 1，所以我只好下 &lt;code&gt;0&lt;/code&gt;。&lt;br&gt;
  多少也呼應&lt;a href="https://github.com/Lokaltog/vim-easymotion#readme" title="Lokaltog/vim-easymotion - GitHub"&gt;原設計&lt;/a&gt;：
&lt;/p&gt;
&lt;blockquote cite="https://github.com/Lokaltog/vim-easymotion#readme"&gt;
  It takes the &amp;lt;number&amp;gt; out of &amp;lt;number&amp;gt;w or &amp;lt;number&amp;gt;f{char} by highlighting all possible choices and allowing you to press one key to jump directly to the target.
&lt;/blockquote&gt;
&lt;p&gt;
  &lt;code&gt;0&lt;/code&gt; 不會太難按，平常也不會使用 &lt;kbd&gt;0w&lt;/kbd&gt;、&lt;kbd&gt;0j&lt;/kbd&gt;（沒有這樣的 count），所以不易衝突。&lt;br&gt;
  缺點是把原本的 &lt;code&gt;&lt;a href="http://vimdoc.sourceforge.net/htmldoc/motion.html#0" title="Vim documentation: motion"&gt;0&lt;/a&gt;&lt;/code&gt;（跳到第一個字）指令蓋掉了；&lt;br&gt;
  我是認為 &lt;kbd&gt;0&lt;/kbd&gt; 幾乎用不到，通常 &lt;kbd&gt;&amp;lt;Home&amp;gt;&lt;/kbd&gt; 或 &lt;kbd&gt;^&lt;/kbd&gt; 就夠了，所以直接放棄。
&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-8285522660295231745?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/o8WBeVtSzQ8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/8285522660295231745/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/08/0-easymotion-leader-key.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8285522660295231745?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/8285522660295231745?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/08/0-easymotion-leader-key.html" title="用 0 作為 EasyMotion 的 leader key" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUUESXw5eyp7ImA9WhdQEEo.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-2631629214410751661</id><published>2011-08-11T21:55:00.006+08:00</published><updated>2011-08-11T23:40:08.223+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-11T23:40:08.223+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>map 的左手邊不一定是按鍵</title><content type="html">&lt;p&gt;
  &lt;a href="http://vimdoc.sourceforge.net/htmldoc/map.html#:map-commands" title="Vim documentation: map"&gt;map&lt;/a&gt; 指令的 {&lt;abbr title="left hand side"&gt;lhs&lt;/abbr&gt;} 可以不是用來 key 的。&lt;br&gt;
  這個用法至少在 2007 就被分享過（&lt;a href="http://whileimautomaton.net/2007/03/03205900" title="Vim: &amp;lt;Space&amp;gt;で始まるkey mappingの可視化 - while (&amp;quot;im automaton&amp;quot;);"&gt;Vim: &amp;lt;Space&amp;gt;で始まるkey mappingの可視化 - while (&amp;quot;im automaton&amp;quot;);&lt;/a&gt;）不過我是前陣子才知道的，sorry。
&lt;/p&gt;

&lt;p&gt;
  原本以為 map 就是 map 一個鍵，例如 &lt;code&gt;map &amp;lt;C-S&amp;gt; :update&amp;lt;CR&amp;gt;&lt;/code&gt;；&lt;br&gt;
  或 map 一串 key sequence 如 &lt;code&gt;map jk zz&lt;/code&gt;。
&lt;/p&gt;

&lt;div class="fullpost"&gt;

&lt;p&gt;
  其實可以在 {lhs} 放抽象的 key sequence，例如以下 &lt;a href="https://github.com/Shougo/unite.vim/blob/d0e74bd9805252711d50c28c845ab0635ef9b6b9/doc/unite.txt#L1630" title="doc/unite.txt at from Shougo/unite.vim - GitHub"&gt;unite.vim 設定例&lt;/a&gt;片段：
&lt;/p&gt;

&lt;pre class="vim tm-0"&gt;
nnoremap [unite] &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;Nop&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
nmap f [unite]

nnoremap &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;silent&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; [unite]c :&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;C-&lt;span class="Statement"&gt;u&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;UniteWithCurrentDir -buffer-name=files buffer file_mru bookmark file&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
nnoremap &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;silent&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; [unite]b :&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;C-&lt;span class="Statement"&gt;u&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;UniteWithBufferDir -buffer-name=files -prompt=%\ buffer file_mru bookmark file&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
nnoremap &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;silent&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; [unite]r :&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;C-&lt;span class="Statement"&gt;u&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;Unite -buffer-name=register register&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
nnoremap &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;silent&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; [unite]o :&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;C-&lt;span class="Statement"&gt;u&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;Unite outline&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;
  定義了 &lt;kbd&gt;[unite]&lt;/kbd&gt; 來取代 &lt;kbd&gt;f&lt;/kbd&gt;，這樣就可以寫 &lt;code&gt;[unite]c&lt;/code&gt;，使用時卻是按 &lt;kbd&gt;fc&lt;/kbd&gt;。
有幾個好處：&lt;br&gt;
  1) 更好讀。&lt;br&gt;
  2) 不想用 &lt;kbd&gt;f&lt;/kbd&gt; 要換掉時，只要改一個地方即可。&lt;br&gt;
  3) 按下 &lt;kbd&gt;f&lt;/kbd&gt; 時，畫面下方會顯示 &lt;code&gt;[fuf]&lt;/code&gt;（如果沒把 &lt;a href="http://vimdoc.sourceforge.net/htmldoc/options.html#%27showcmd%27" title="Vim documentation: options"&gt;'showcmd'&lt;/a&gt; 關掉的話），相當有意義。
&lt;/p&gt;

&lt;hr class="hr"/&gt;

&lt;p&gt;
  再舉這幾天試用的 &lt;a href="https://github.com/Lokaltog/vim-easymotion" title="Lokaltog/vim-easymotion - GitHub"&gt;EasyMotion&lt;/a&gt; 設定為例：
&lt;/p&gt;

&lt;pre class="vim"&gt;
noremap [emotion] &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;Nop&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
noremap [emotion]&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;Space&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; f
map f [emotion]
let g:EasyMotion_leader_key = '[emotion]'
&lt;/pre&gt;

&lt;p&gt;
  把 &lt;kbd&gt;[emotion]&lt;/kbd&gt; 拿來當 EasyMotion 的啟動鍵，實際上是 &lt;kbd&gt;f&lt;/kbd&gt;。&lt;br&gt;
  想用原本的 &lt;a href="http://vimdoc.sourceforge.net/htmldoc/motion.html#f" title="Vim documentation: motion"&gt;f&lt;/a&gt; 時，就按 &lt;kbd&gt;f&amp;lt;Space&amp;gt;&lt;/kbd&gt;。
&lt;/p&gt;

&lt;hr class="hr"/&gt;

&lt;p&gt;
  此外在 plugin 中常看到這樣的寫法（取自 &lt;a href="https://github.com/tpope/vim-rails" title="tpope/vim-rails - GitHub"&gt;rails.vim&lt;/a&gt;）：
&lt;/p&gt;

&lt;pre class="vim"&gt;
nnoremap &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;buffer&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;silent&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;RailsAlternate  :&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;C-&lt;span class="Statement"&gt;U&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;A&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
nnoremap &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;buffer&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;silent&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;RailsRelated    :&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;C-&lt;span class="Statement"&gt;U&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;R&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
nnoremap &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;buffer&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;silent&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;RailsFind       :&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;C-&lt;span class="Statement"&gt;U&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;REfind&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;
  其中 &lt;code&gt;nnoremap &amp;lt;Plug&amp;gt;RailsFind&lt;/code&gt; 看起來跟這篇道理很像，可以方便用 &lt;code&gt;map &amp;lt;Plug&amp;gt;RailsFind&lt;/code&gt; 來定義 plugin 的 map。
  不過 &lt;code&gt;&amp;lt;Plug&amp;gt;&lt;/code&gt; 其實是 map 的一個保留字 &lt;a href="http://vimdoc.sourceforge.net/htmldoc/map.html#%3CPlug%3E" title="Vim documentation: map"&gt;&amp;lt;Plug&amp;gt;&lt;/a&gt;，把 &lt;kbd&gt;&amp;lt;Plug&amp;gt;foo&lt;/kbd&gt; 放 {&lt;abbr title="right hand side"&gt;rhs&lt;/abbr&gt;} 時 'showcmd' 顯示也怪怪的；所以雖然可以用，還是先在 plugin 裡用就好了。
&lt;/p&gt;

&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-2631629214410751661?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/9eNWUr-Gkrg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/2631629214410751661/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/08/map.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/2631629214410751661?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/2631629214410751661?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/08/map.html" title="map 的左手邊不一定是按鍵" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08CSXc8fCp7ImA9WhZaGUs.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-3522893227723592647</id><published>2011-07-06T23:24:00.000+08:00</published><updated>2011-07-06T23:24:28.974+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-06T23:24:28.974+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>試試新的萬能尋找器 unite.vim</title><content type="html">&lt;h3&gt;UNITE ALL SOURCES&lt;/H3&gt;
&lt;p&gt;
   為了寫這篇，還特地試了一下 &lt;a href="https://wincent.com/products/command-t" title="wincent.com: Command-T: About"&gt;Command-T&lt;/a&gt; 這個搜尋工具，它找的 source 是「檔案」。
&lt;/p&gt;

&lt;div class="fullpost"&gt;
  &lt;h4 class="ta-c bm-0"&gt;Command-T 快速找到檔案，輸入框在圖片下方&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh5.ggpht.com/-U66k40G7DoM/ThRpaU-HTFI/AAAAAAAABLA/Et72arqbly0/command-t.png"&gt;&lt;img alt="Command-T" title="Command-T" src="http://lh5.ggpht.com/-U66k40G7DoM/ThRpaU-HTFI/AAAAAAAABLA/Et72arqbly0/s720/command-t.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;p&gt;
     而我慣用的 &lt;a href="http://www.vim.org/scripts/script.php?script_id=1984" title="FuzzyFinder - buffer/file/command/tag/etc explorer with fuzzy matching : vim online"&gt;FuzzyFinder&lt;/a&gt; 則是能找更多東西，例如之前寫過&lt;a href="http://bootleq.blogspot.com/2010/07/fuzzyfinder-register.html" title="用 FuzzyFinder 尋找 register - 沒穿方服"&gt;找 register&lt;/a&gt; 和&lt;a href="http://bootleq.blogspot.com/2010/08/fuzzyfinder.html" title="FuzzyFinder 找分頁 - 沒穿方服"&gt;分頁&lt;/a&gt;；執行的動作也不一定是「開啟」，可以是貼上、跳過去或其他。&lt;br&gt;
     加這些 script 時難免會想「不管什麼東西，只要 &lt;b&gt;能找&lt;/b&gt; 的都交給 FuzzyFinder 吧」。
  &lt;/p&gt;
  &lt;p&gt;
    在另一個 plugin: &lt;a href="http://www.vim.org/scripts/script.php?script_id=2337" title="ku - An interface for anything : vim online"&gt;ku&lt;/a&gt; 裡這些「能找的東西」被進一步定義為 &lt;b&gt;source&lt;/b&gt;。&lt;br&gt;
    ku 在自訂 source 和相應的動作上有更完整的設計，而不是有「本來是用來找 file」的味道。
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;ku 找檔案的樣子&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh6.ggpht.com/-R-rBNX2feNU/ThRpa8n68xI/AAAAAAAABLQ/HmoZQ4xol_s/ku-select.png"&gt;&lt;img alt="ku 找 file" title="ku 找 file" src="http://lh6.ggpht.com/-R-rBNX2feNU/ThRpa8n68xI/AAAAAAAABLQ/HmoZQ4xol_s/s720/ku-select.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;按了 &lt;kbd&gt;&amp;lt;Tab&amp;gt;&lt;/kbd&gt; 可以選 action，預設 mapping 跟 unite.vim 大致一樣&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh3.ggpht.com/-sj1WQoAorjc/ThRpajpsrgI/AAAAAAAABLI/-8FryNbpNnk/ku-actions.png"&gt;&lt;img alt="ku 選 action" title="ku 選 action" src="http://lh3.ggpht.com/-sj1WQoAorjc/ThRpajpsrgI/AAAAAAAABLI/-8FryNbpNnk/s720/ku-actions.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;p&gt;
     最近才發現一個新的，&lt;a href="http://vinarian.blogspot.com/" title="あるVimmerのブログ"&gt;Shougo&lt;/a&gt; 寫的 &lt;a href="https://github.com/Shougo/unite.vim" title="Shougo/unite.vim - GitHub"&gt;unite.vim&lt;/a&gt;，因為看到高手的設定檔換上了，就來試試。&lt;br&gt;
  &lt;/p&gt;

  &lt;h3&gt;不依靠 completion 介面&lt;/h3&gt;
  &lt;p&gt;
  Unite.vim 第一個明顯特色是打開尋找 window 後，彈出選項的介面不是 Vim 的 completion 功能（按 &lt;kbd&gt;&amp;lt;C-X&amp;gt;&amp;lt;C-P&amp;gt;&lt;/kbd&gt; 彈出來的那種），而是自己在 buffer 裡畫出來的。&lt;br&gt;
    這表示可以進入 normal mode 改你的關鍵字，plugin 也更有機會對選項動手腳，畢竟 completion 原本用在 insert mode，確實限制較多。
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;
    左邊 split 的視窗就是 unite，大得嚇人（預設是水平 split 在上方，但還是很高）&lt;br&gt;
    這裡可以「多選」，以前是做不到的。
  &lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh6.ggpht.com/-G1r8T8yy1Fw/ThRpsBaJKsI/AAAAAAAABMI/fjFyG5rhmNQ/unite-select-action-file.png"&gt;&lt;img alt="unite 多選" title="unite 多選" src="http://lh6.ggpht.com/-G1r8T8yy1Fw/ThRpsBaJKsI/AAAAAAAABMI/fjFyG5rhmNQ/s720/unite-select-action-file.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;當然也有模糊搜尋，例如輸入 **/*re 7 !2 縮小搜尋結果&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh6.ggpht.com/-_OzjjIEVLgQ/ThRpbv5Lr9I/AAAAAAAABLg/3nnsMYUtdoU/unite-filter.png"&gt;&lt;img alt="filter search" title="filter search" src="http://lh6.ggpht.com/-_OzjjIEVLgQ/ThRpbv5Lr9I/AAAAAAAABLg/3nnsMYUtdoU/s720/unite-filter.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;Buffer 裡面可以亂搞，例如可以進 visual mode 多選&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh6.ggpht.com/-m360pjTemW0/ThRprPzV_0I/AAAAAAAABLo/qlL250RN3CM/unite-modes.png"&gt;&lt;img alt="visual mode" title="visual mode" src="http://lh6.ggpht.com/-m360pjTemW0/ThRprPzV_0I/AAAAAAAABLo/qlL250RN3CM/s720/unite-modes.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;依照 source 的 kind 選擇能用的動作，概念跟 ku 差不多&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh6.ggpht.com/-VwkmuwdXYHk/ThRpsGYdVDI/AAAAAAAABMA/zyCL3V6Wl6g/unite-select-action.png"&gt;&lt;img alt="選 action" title="選 action" src="http://lh6.ggpht.com/-VwkmuwdXYHk/ThRpsGYdVDI/AAAAAAAABMA/zyCL3V6Wl6g/s720/unite-select-action.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;h3&gt;好多好用的 source&lt;/h3&gt;
  &lt;p&gt;
    Register、分頁都是預設就有了，doc 裡還有一堆，讀完還可以看 github wiki 上的 &lt;a href="https://github.com/Shougo/unite.vim/wiki/unite-plugins" title="unite plugins - GitHub"&gt;unite plugins&lt;/a&gt;，經常有新的 source 真是強大到令人生氣。&lt;br&gt;
    而且沒有限制一次只能找一種 source，例如 &lt;code&gt;:Unite file buffer file_mru&lt;/code&gt; 會把檔案、buffer 和最近開的檔案放一起給你選。
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;找 register&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh3.ggpht.com/-Njb8ouubnCY/ThRprZkNqCI/AAAAAAAABLw/HLw93US6eKc/unite-registers.png"&gt;&lt;img alt="找 register" title="找 register" src="http://lh3.ggpht.com/-Njb8ouubnCY/ThRprZkNqCI/AAAAAAAABLw/HLw93US6eKc/s720/unite-registers.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;把 &lt;kbd&gt;/&lt;/kbd&gt; 搜尋的結果當成 source，也是預設功能&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh6.ggpht.com/-jPy8q7ih1is/ThRpr_KGghI/AAAAAAAABL4/HRi-jgNPMCY/unite-search.png"&gt;&lt;img alt="find" title="find" src="http://lh6.ggpht.com/-jPy8q7ih1is/ThRpr_KGghI/AAAAAAAABL4/HRi-jgNPMCY/s720/unite-search.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;把任意命令的輸出當成 source，例加下面是 &lt;code&gt;:Unite output:version&lt;/code&gt;，這也是預設功能&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh4.ggpht.com/-m99jljeKQEM/ThR2YnyZQKI/AAAAAAAABMc/e7V0oxS5Ipk/unite-output.png"&gt;&lt;img alt="unite output" title="unite output" src="http://lh4.ggpht.com/-m99jljeKQEM/ThR2YnyZQKI/AAAAAAAABMc/e7V0oxS5Ipk/s720/unite-output.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;h3&gt;結論&lt;/h3&gt;
  &lt;p&gt;
    兩個問題 1) 開出來的 window 太大，好醜 2) 目前還是太常遇到 error&lt;br&gt;
    主要是問題 1 好像無解，所以我要繼續用 FuzzyFinder…… 不然其實解這些 error 也很有啟發性。&lt;br&gt;
    至於 ku 試了一下好像速度比較慢（可能 cache 沒設好？）文件也不是很全，有點疑惑為什麼不沿續開發 FuzzyFinder 就好。
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;按方向鍵的左，變成這樣，應該是鍵盤送出 &lt;code&gt;^[OD&lt;/code&gt; 的關係吧&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh3.ggpht.com/-FvD84OZkyjQ/ThRpwsoAr6I/AAAAAAAABMQ/IfAVhsR4QxY/unite-term-code.png"&gt;&lt;img alt="error" title="error" src="http://lh3.ggpht.com/-FvD84OZkyjQ/ThRpwsoAr6I/AAAAAAAABMQ/IfAVhsR4QxY/s720/unite-term-code.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;

  &lt;h4 class="ta-c bm-0"&gt;輸入關鍵字時也可以按 &lt;kbd&gt;&amp;lt;C-J&amp;gt;&lt;/kbd&gt; 切換選項，可是這時還在 insert mode，不小心會按到插字&lt;/h4&gt;
  &lt;p class="ta-c tm-0"&gt;
    &lt;a href="http://lh5.ggpht.com/-RwdFziIO3ik/ThRpayHdK-I/AAAAAAAABLY/e0hTg0I4nbA/unite-e21.png"&gt;&lt;img alt="E21" title="E21" src="http://lh5.ggpht.com/-RwdFziIO3ik/ThRpayHdK-I/AAAAAAAABLY/e0hTg0I4nbA/s720/unite-e21.png" /&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-3522893227723592647?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/9qFLkIWZ-dU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/3522893227723592647/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/07/unitevim.html#comment-form" title="4 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/3522893227723592647?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/3522893227723592647?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/07/unitevim.html" title="試試新的萬能尋找器 unite.vim" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-U66k40G7DoM/ThRpaU-HTFI/AAAAAAAABLA/Et72arqbly0/s72-c/command-t.png" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;A0UCSHo_eSp7ImA9WhZbFEU.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-4791394343453732468</id><published>2011-06-19T21:11:00.004+08:00</published><updated>2011-06-19T21:14:29.441+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-19T21:14:29.441+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><category scheme="http://www.blogger.com/atom/ns#" term="vimrc_human" /><title>分享我的 Vim 設定 - vimrc_human</title><content type="html">&lt;p&gt;
  一邊喝飲料一邊讀別人的 vimrc 真是很棒的休閒活動。&lt;br&gt;
  我也想分享 vimrc 提供社群讀物。
&lt;/p&gt;
&lt;p&gt;
  於是建了一個 &lt;a href="https://github.com/bootleq/vimrc_human" title="bootleq/vimrc_human - GitHub"&gt;vimrc_human&lt;/a&gt;，
  內容就是我的 vimrc 加上詳細註解（現在第一個 commit，都還沒加……），但也因為如此，它很難是我的最新設定。
&lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://github.com/bootleq/vimrc_human" title="bootleq/vimrc_human - GitHub"&gt;bootleq/vimrc_human - GitHub&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  另一特徵是用 &lt;a href="https://github.com/gmarik/vundle" title="gmarik/vundle - GitHub"&gt;Vundle&lt;/a&gt; 管理 plugin、colorscheme 等擴充功能（沒聽過，可參考 &lt;a href="http://blog.othree.net/log/2011/06/05/vundle/" title="Vundle, Bundler for Vim : O3noBLOG"&gt;Vundle, Bundler for Vim : O3noBLOG&lt;/a&gt; 簡介），Vundle 加上一些對 &lt;code&gt;runtimepath&lt;/code&gt; 的處理，可以把整個環境裝到 /tmp/ 目錄下，避免跟原本的 ~/.vim 相衝（利用 &lt;code&gt;rtp-=~/.vim&lt;/code&gt;，但 plugin 仍可能用到 ~/.vim 就是），讓「裝來玩玩」這件事變簡單了。&lt;br&gt;
  具體請參考 github 上的 &lt;a href="https://github.com/bootleq/vimrc_human#readme" title="bootleq/vimrc_human - GitHub"&gt;README&lt;/a&gt;。&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
  註：
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;目前不支援 Windows 上的 gVim。 我自己用 Cygwin + gVim 是還可以。&lt;/li&gt;
  &lt;li&gt;「裝來玩」這件事是有安全性疑慮的，畢竟 vim script 神通廣大，請自己小心。&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-4791394343453732468?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/b7OJK6SGpwM" height="1" width="1"/&gt;</content><link rel="related" href="https://github.com/bootleq/vimrc_human" title="分享我的 Vim 設定 - vimrc_human" /><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/4791394343453732468/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/06/vim-vimrchuman.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4791394343453732468?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4791394343453732468?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/06/vim-vimrchuman.html" title="分享我的 Vim 設定 - vimrc_human" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkcBSXg9eyp7ImA9WhZSEk0.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-4108752266756630186</id><published>2011-03-27T13:30:00.000+08:00</published><updated>2011-03-27T13:34:18.663+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-27T13:34:18.663+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Noise" /><category scheme="http://www.blogger.com/atom/ns#" term="Firefox" /><title>用 Noise 偵測網頁內出現了關鍵字</title><content type="html">&lt;h4&gt;收到使用者對 &lt;a title="Noise :: Firefox 附加元件" href="https://addons.mozilla.org/firefox/addon/noise/"&gt;Noise&lt;/a&gt; 的問題&lt;/h4&gt;  &lt;blockquote&gt;   &lt;p class="no-indent"&gt;為了等待某個詞的出現，我讓一個討論區，請一個外掛，不停地、不停地重讀。      &lt;br /&gt;假如能夠 find 到那個詞時，發出聲音通知我，       &lt;br /&gt;      &lt;br /&gt;我就可以同時做別的事了。&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;解決辦法，在 Noise 設定這個聲音&lt;/h4&gt;  &lt;p&gt;&lt;code&gt;DOMContentLoaded&amp;amp;gBrowser.contentWindow.find(&lt;var&gt;'WORD_I_CARE'&lt;/var&gt;)&lt;/code&gt;&lt;/p&gt;  &lt;div class="fullpost"&gt;   &lt;p class="gray-d"&gt;&lt;small&gt;（事件類型是 window event）&lt;/small&gt;&lt;/p&gt;    &lt;p&gt;每次 DOM 讀完後，便自動進行尋找（&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;F&lt;/kbd&gt;），若有找到就發出聲音。&lt;/p&gt;    &lt;p&gt;實際上要加入網址限制，免得每個網站都自動尋找：&lt;/p&gt;    &lt;p&gt;&lt;code&gt;DOMContentLoaded&lt;strong&gt;&amp;amp;(event.target.location.host===&lt;var&gt;'www.forum.com'&lt;/var&gt;&amp;amp;&amp;amp;&lt;/strong&gt;gBrowser.contentWindow.find('WORD_I_CARE')&lt;strong&gt;)&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;除了 host，也有其他屬性可用來設限制，參考 &lt;a title="window.location - MDC Doc Center" href="https://developer.mozilla.org/en/DOM/window.location#Properties"&gt;window.location (#properties) - MDC Doc Center&lt;/a&gt;。&lt;/p&gt;    &lt;p class="no-indent"&gt;&lt;a href="http://lh6.ggpht.com/-ppLHz0Unnnw/TY7J7J0XUwI/AAAAAAAABIU/q5R9utwiHXA/noise-reloads-and-find.png"&gt;&lt;img title="設定畫面" alt="設定畫面" src="http://lh6.ggpht.com/-ppLHz0Unnnw/TY7J7J0XUwI/AAAAAAAABIU/q5R9utwiHXA/s800/noise-reloads-and-find.png" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-4108752266756630186?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/rz7lSk5RcAU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/4108752266756630186/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2011/03/noise.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4108752266756630186?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4108752266756630186?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2011/03/noise.html" title="用 Noise 偵測網頁內出現了關鍵字" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-ppLHz0Unnnw/TY7J7J0XUwI/AAAAAAAABIU/q5R9utwiHXA/s72-c/noise-reloads-and-find.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkEDQXg4eyp7ImA9Wx9VE0g.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-1988496870072331506</id><published>2010-12-25T16:09:00.002+08:00</published><updated>2011-01-30T10:31:10.633+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-30T10:31:10.633+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>這幾個月使用中的 JSLint + Vim 搭配方案</title><content type="html">&lt;p&gt;寫個 script 在 shell 透過 rhino.jar 跑 fulljslint.js，在 Vim 也寫個 function 呼叫它，於是可以用 &lt;a title="Vim documentation: quickfix" href="http://vimdoc.sourceforge.net/htmldoc/quickfix.html"&gt;quickfix window&lt;/a&gt; 除錯。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_z34accOoRZI/TRWiyvNP1dI/AAAAAAAABHw/jLu7rifBwkM/jslint_vim.png"&gt;&lt;img title="就像有個超級不吝指教的真人陪你寫程式" alt="就像有個超級不吝指教的真人陪你寫程式" src="http://lh3.ggpht.com/_z34accOoRZI/TRWiyvNP1dI/AAAAAAAABHw/jLu7rifBwkM/s640/jslint_vim.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;div class="fullpost"&gt;   &lt;ul&gt;     &lt;li&gt;在 Windows 上沒用。 &lt;/li&gt;      &lt;li&gt;不使用 &lt;a title="hallettj/jslint.vim - GitHub" href="https://github.com/hallettj/jslint.vim"&gt;jslint.vim&lt;/a&gt;。 雖然跨系統、放 jslintrc 設定檔等作法很棒，但是 1) 即時檢查和 highlight 標錯的顯示方式都不是我要的，甚至有點惱人。 2) 想試試直接用大師寫的 fulljslint.js，在 Vim 以外的地方可能也較好整合。 &lt;/li&gt;      &lt;li&gt;不使用 &lt;a title="javaScriptLint.vim - Displays JavaScript Lint warnings in the quickfix error window : vim online" href="http://www.vim.org/scripts/script.php?script_id=2578"&gt;javaScriptLint.vim&lt;/a&gt;，因為 &lt;a title="JavaScript Lint" href="http://www.javascriptlint.com/"&gt;JavaScript Lint&lt;/a&gt; 不是 &lt;a title="JSLint: The JavaScript Code Quality Tool" href="http://www.jslint.com/lint.html"&gt;JSLint&lt;/a&gt; 啊，跟這主題無關。 &lt;/li&gt;      &lt;li&gt;使用 &lt;a title="Rhino - MDC Doc Center" href="https://developer.mozilla.org/en/Rhino"&gt;Rhino&lt;/a&gt; 當 JavaScript engine，因為最好裝。         &lt;br /&gt;不過它的 JavaScript 版本只實作到 &lt;a title="Rhino overview - MDC Doc Center" href="https://developer.mozilla.org/en/Rhino/Overview#JavaScript_Language_Versions"&gt;&lt;/a&gt;1.7（Firefox 2 的程度）所以像 JSON 就不能直接吃，要多 include 個 &lt;a title="douglascrockford/JSON-js - GitHub" href="https://github.com/douglascrockford/JSON-js"&gt;JSON2.js&lt;/a&gt;。 &lt;/li&gt;      &lt;li&gt;具體用到的檔案：        &lt;ul&gt;         &lt;li&gt;~/bin/jslint （唯一實際被叫的指令，內容主要是 java -cp rhino.jar …） &lt;/li&gt;          &lt;li&gt;~/scripts/fulljslint.js （即 &lt;a href="http://www.crockford.com/"&gt;Douglas Crockford&lt;/a&gt; 的 fulljslint.js） &lt;/li&gt;          &lt;li&gt;~/scripts/jslint.js （由官網的 rhino.js（現已移除）修改而來，連接 fulljslint 和 rhino） &lt;/li&gt;          &lt;li&gt;~/scripts/json2.js &lt;/li&gt;          &lt;li&gt;~/scripts/rhino.jar &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;修改錯誤訊息的格式，改成跟 closure compiler 相似，就不必再調 Vim 的 errorformat。 &lt;/li&gt;      &lt;li&gt;目前 JSLint 用的預設 option 直接寫在呼叫 fulljslint.js 用的 script（jslint.js）裡。 &lt;/li&gt;      &lt;li&gt;在 shell 中呼叫的指令是 &lt;code&gt;jslint file.js '{&amp;quot;extraOptionKey&amp;quot;:value}'&lt;/code&gt;。 extraOption 可以用來蓋掉預設選項。 &lt;/li&gt;      &lt;li&gt;在 Vim 中呼叫的指令是 &lt;code&gt;:JSLint&lt;/code&gt;。 &lt;/li&gt;   &lt;/ul&gt; &lt;/div&gt;  &lt;h3&gt;取得檔案&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;fulljslint.js - &lt;a title="douglascrockford/JSLint - GitHub" href="https://github.com/douglascrockford/JSLint"&gt;douglascrockford/JSLint - GitHub&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;json2.js - &lt;a title="douglascrockford/JSON-js - GitHub" href="https://github.com/douglascrockford/JSON-js"&gt;douglascrockford/JSON-js - GitHub&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;rhino.jar - &lt;a title="Download Rhino - MDC Doc Center" href="https://developer.mozilla.org/en/RhinoDownload"&gt;Download Rhino - MDC Doc Center&lt;/a&gt; （即 rhino1_7R2.zip 裡的 js.jar） &lt;/li&gt;    &lt;li&gt;bin/jslint、scripts/jslint.js 和 vimrc 設定例 - &lt;a title="gist: 754754 - Using JSLint command within Vim.- GitHub" href="https://gist.github.com/754754"&gt;gist: 754754 - Using JSLint command within Vim.- GitHub&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;以上 js 檔案皆沒壓縮，實際使用前我會先讓 closure-complier 壓一下。 &lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-1988496870072331506?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/D18vyc-zvgQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/1988496870072331506/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2010/12/jslint-vim.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/1988496870072331506?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/1988496870072331506?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2010/12/jslint-vim.html" title="這幾個月使用中的 JSLint + Vim 搭配方案" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_z34accOoRZI/TRWiyvNP1dI/AAAAAAAABHw/jLu7rifBwkM/s72-c/jslint_vim.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08FQnczfip7ImA9Wx9QEk0.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-7272953103318317888</id><published>2010-12-24T23:49:00.001+08:00</published><updated>2010-12-24T23:50:13.986+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-24T23:50:13.986+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="湊活" /><title>工作滿一年</title><content type="html">&lt;ul&gt;   &lt;li&gt;還經常冒出剛找到工作的爽爽心情     &lt;ul&gt;       &lt;li&gt;回家在公車上會忍不住偷笑。（不過可以搭公車的這間倒了……） &lt;/li&gt;        &lt;li&gt;從洗手間走回辦公室也莫名地樂。 &lt;/li&gt;        &lt;li&gt;應該是同事都很夢幻的緣故。&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;剛開始還覺得上班跟自己在家做的事差不多，就是有錢拿 &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;久了技術有進步，不過作品都不能表達自己，這麼說也就沒什麼了不起的事。&lt;/li&gt;      &lt;li&gt;所以不上班也可能更好。&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;某些場合還是會發現自己的缺點&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;以前發現的、不能改的就當作人格特質，所以年紀到了就不該有新的缺點才是。&lt;/li&gt;      &lt;li&gt;這時發現技術不能解決的問題就毀了。&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;此外未滿七個月就拿不到失業救濟金這回事，也是難得的爛經驗。&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-7272953103318317888?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/aoDF6j3UZ78" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/7272953103318317888/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2010/12/blog-post.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/7272953103318317888?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/7272953103318317888?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2010/12/blog-post.html" title="工作滿一年" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQGSH89eSp7ImA9Wx9REUg.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-4231763598596576681</id><published>2010-12-12T20:35:00.000+08:00</published><updated>2010-12-12T20:35:29.161+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-12T20:35:29.161+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><title>Vim 類似其他編輯器「書籤」的功能（使用 ShowMarks + wokmarks）</title><content type="html">&lt;a class="float-r lm-20" href="http://lh6.ggpht.com/_z34accOoRZI/TQS5wB-9x-I/AAAAAAAABHg/N0eAFFFZA0k/show_marks.png"&gt;&lt;img title="左邊會顯示 mark 位置" alt="左邊會顯示 mark 位置" src="http://lh6.ggpht.com/_z34accOoRZI/TQS5wB-9x-I/AAAAAAAABHg/N0eAFFFZA0k/s576/show_marks.png" /&gt;&lt;/a&gt;   &lt;h3&gt;在沒有規則的位置間移動&lt;/h3&gt;  &lt;p&gt;雖然 &lt;kbd&gt;``&lt;/kbd&gt;、&lt;kbd&gt;ga&lt;/kbd&gt; 等跳轉指令有不少，但是要跳到沒特殊意義的位置——例如「剛剛有看到，不過具體看到什麼完全沒印象」——這種情形除了 mark 應該也沒有更好的解了。&lt;/p&gt;  &lt;p&gt;於是用 &lt;kbd&gt;ma&lt;/kbd&gt;、&lt;kbd&gt;mb&lt;/kbd&gt;、……放了幾個 mark，結果更難用：&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;視覺上看不見哪兒有 mark，所以不知道某 mark 的位置，比方 &lt;kbd&gt;`b&lt;/kbd&gt; 會跳到哪裡去。       &lt;br /&gt;事實上按了 &lt;kbd&gt;`&lt;/kbd&gt; 之後，就會卡在不知道要按哪個字母。 &lt;/li&gt;    &lt;li&gt;不知道哪些 mark 已經用過，例如下 &lt;kbd&gt;md&lt;/kbd&gt; 的時候要擔心會不會蓋掉舊的。       &lt;br /&gt;事實上按了 &lt;kbd&gt;m&lt;/kbd&gt; 之後，就會卡在不知道要按哪個字母。 &lt;/li&gt; &lt;/ol&gt;  &lt;div class="fullpost"&gt;   &lt;h3&gt;ShowMarks plugin&lt;/h3&gt;    &lt;p&gt;&lt;a title="ShowMarks - Visually shows the location of marks. : vim online" href="http://www.vim.org/scripts/script.php?script_id=152"&gt;ShowMarks&lt;/a&gt; 會利用 sign column（在行號左邊的一欄，預設不會有）顯示 mark 的位置。雖然是很老的 plugin，不過先進替代品從缺，功能也冇問題，就用吧。&lt;/p&gt;    &lt;p&gt;唯一不滿是用了 CursorHold autocmd 在閒置時自動開啟（如果開啟檔案後，突然畫面左邊冒出一條 bar，就是這功能），所以 fork 一份 &lt;a title="bootleq/ShowMarks - GitHub" href="https://github.com/bootleq/ShowMarks"&gt;bootleq/ShowMarks&lt;/a&gt;，加上 &lt;code&gt;let g:showmarks_auto_toggle=0&lt;/code&gt; 即關閉它。&lt;/p&gt;    &lt;h3&gt;wokmarks.vim plugin&lt;/h3&gt;    &lt;p&gt;&lt;a title="wokmarks.vim - local marks usage more similar to other editors : vim online" href="http://www.vim.org/scripts/script.php?script_id=2522"&gt;wokmarks.vim&lt;/a&gt; 提供不必記憶 mark 名稱（例：a-z）的操作。指令會變成 Prev、Next、Set、Toggle、Kill 這樣的感覺；另外設置 mark、在 mark 間移動時也會在狀態列顯示訊息。&lt;/p&gt;    &lt;h3&gt;具體設定&lt;/h3&gt;    &lt;p&gt;gist: 738007 - &lt;a title="gist: 738007 - [vimrc] ShowMarks and wokmarks.vim- GitHub" href="https://gist.github.com/738007"&gt;[vimrc] ShowMarks and wokmarks.vim&lt;/a&gt;- GitHub&lt;/p&gt;    &lt;p&gt;完成後，看到有感覺的行就按 &lt;kbd&gt;mm&lt;/kbd&gt; 放標記（sign column 會自動開啟），覺得這行沒用就按 &lt;kbd&gt;mm&lt;/kbd&gt; 取消標記，想瀏覽標過的地方就按 &lt;kbd&gt;mj&lt;/kbd&gt;、&lt;kbd&gt;mk&lt;/kbd&gt; 前後移動。若新開的檔案沒有顯示任何標記，就按 &lt;kbd&gt;mo&lt;/kbd&gt; 或 &lt;kbd&gt;mt&lt;/kbd&gt; 顯示。&lt;/p&gt;    &lt;h3&gt;限制&lt;/h3&gt;    &lt;p&gt;因為使用 Vim 本身的 mark，所以 &lt;strong&gt;mark 總數有限&lt;/strong&gt;（a-zA-Z，其中大寫的又不適合單一檔案使用）。&lt;/p&gt;    &lt;p&gt;如果真的需要 26 個以上，也有一些 plugin 會另行記錄標記資訊，不過「不用 Vim 的 mark」是否比較好，就要考慮一下了。&lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-4231763598596576681?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/WsBKh_7r1xw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/4231763598596576681/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2010/12/vim-showmarks-wokmarks.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4231763598596576681?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/4231763598596576681?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2010/12/vim-showmarks-wokmarks.html" title="Vim 類似其他編輯器「書籤」的功能（使用 ShowMarks + wokmarks）" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_z34accOoRZI/TQS5wB-9x-I/AAAAAAAABHg/N0eAFFFZA0k/s72-c/show_marks.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEUFQ3o9eSp7ImA9Wx5XEk0.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-1731373415448250621</id><published>2010-09-11T19:54:00.001+08:00</published><updated>2010-09-11T19:56:52.461+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-11T19:56:52.461+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>將複數 git diff 以 vim 分頁一次開啟</title><content type="html">&lt;p&gt;煩惱許久的需求—— &lt;a title="git difftool, open all diff files immediately, not in serial - Stack Overflow" href="http://stackoverflow.com/questions/1220309"&gt;git difftool, open all diff files immediately, not in serial - Stack Overflow&lt;/a&gt;。具體狀況是：用 git-difftool 呼叫 vimdiff 看變更，會重複「2 files to edit ～ 自動進入 Vim 比較一個檔案 ～ 手動離開 Vim」這個流程，有 10 個（變更的）檔案就會重複 10 次，而且中間不知道怎麼停下來……&lt;/p&gt;  &lt;p&gt;原文的解法我沒試成功，而是靠&lt;a title="直接在 Vim 內與 git 舊版檔案 diff - 沒穿方服" href="http://bootleq.blogspot.com/2010/08/vim-git-diff.html"&gt;之前寫的 function&lt;/a&gt;，加上在 .zshrc 裡設定：&lt;/p&gt;  &lt;p&gt;&lt;code&gt;alias gitdiffall='vim -p `git diff --name-only` -c &amp;quot;tabdo GitDiff&amp;quot; -c &amp;quot;tabfirst&amp;quot;'&lt;/code&gt; &lt;/p&gt;  &lt;p&gt;之後只要輸入指令 &lt;code&gt;gitdiffall&lt;/code&gt; 即可。&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-1731373415448250621?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/dNKTb1Cd6Dc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/1731373415448250621/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2010/09/git-diff-vim.html#comment-form" title="2 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/1731373415448250621?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/1731373415448250621?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2010/09/git-diff-vim.html" title="將複數 git diff 以 vim 分頁一次開啟" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DUYCRnw4fyp7ImA9Wx5QEk4.&quot;"><id>tag:blogger.com,1999:blog-1470457395436625875.post-3192258574438334810</id><published>2010-08-31T14:42:00.000+08:00</published><updated>2010-08-31T14:46:07.237+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-31T14:46:07.237+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>直接在 Vim 內與 git 舊版檔案 diff</title><content type="html">&lt;p&gt;檔案改到一半發現自己失憶，忘記改了哪些東西，只好跟上次 git push 的狀態比較看看了。&lt;/p&gt;  &lt;p&gt;正統作法是在 shell 下指令 &lt;code&gt;git diff&lt;/code&gt;，或下 &lt;code&gt;git difftool&lt;/code&gt; 用 vimdiff 分割視窗顯示，如下圖，前者在檔案多時容易快速概觀，但單一檔案時還是 vimdiff 方便。&lt;/p&gt;  &lt;div class="fullpost"&gt;&lt;a href="http://lh4.ggpht.com/_z34accOoRZI/THvJ_UcTSnI/AAAAAAAABGE/SbJs47u3W1I/vim-gitdiff-gitdiff.png"&gt;&lt;img title="狀況單純的話也很好用" alt="狀況單純的話也很好用" src="http://lh4.ggpht.com/_z34accOoRZI/THvJ_UcTSnI/AAAAAAAABGE/SbJs47u3W1I/s400/vim-gitdiff-gitdiff.png" /&gt;&lt;/a&gt; &lt;a href="http://lh5.ggpht.com/_z34accOoRZI/THvJ_vh3EnI/AAAAAAAABGM/My0TK2VAz4M/vim-gitdiff-vimdiff.png"&gt;&lt;img title="缺點是一次只 diff 一個檔案" alt="缺點是一次只 diff 一個檔案" src="http://lh5.ggpht.com/_z34accOoRZI/THvJ_vh3EnI/AAAAAAAABGM/My0TK2VAz4M/s400/vim-gitdiff-vimdiff.png" /&gt;&lt;/a&gt;     &lt;p&gt;目前看到兩個插件 &lt;a title="c9s&amp;#39;s hypergit.vim at master - GitHub" href="http://github.com/c9s/hypergit.vim"&gt;hypergit&lt;/a&gt;、&lt;a title="vcscommand.vim - CVS/SVN/SVK/git/hg/bzr integration plugin : vim online" href="http://www.vim.org/scripts/script.php?script_id=90"&gt;vcscommand&lt;/a&gt; 都可以在 Vim 裡直接顯示 diff 結果，前者是 git-diff 型式，後者是 vimdiff 型式（取出舊版內容，再切割視窗作 vimdiff）。我的需求比較接近後者，但又不想裝整支 vcscommand，於是擅自取出原始碼，改寫進 vimrc。&lt;/p&gt;    &lt;h3&gt;用到的 git 指令&lt;/h3&gt;    &lt;ul&gt;     &lt;li&gt;&lt;code&gt;git rev-parse --show-prefix&lt;/code&gt;         &lt;br /&gt;若指令來自 git 的子目錄，輸出該目錄對 .git 的相對路徑。 &lt;/li&gt;      &lt;li&gt;&lt;code&gt;git log -1 --format=format:%s\ %n%h' -- '%an' -- '%ai\ '('%ar') HEAD&lt;/code&gt;         &lt;br /&gt;顯示 HEAD 所在的一條 log，輸出格式為 [主題] \n[hash 縮寫] -- [作者] -- [日期] ([相對日期])，         &lt;br /&gt;例如 fefe3c8 -- bootleq -- 2010-08-30 18:14:37 +0800 (13 hours ago) &lt;/li&gt;      &lt;li&gt;&lt;code&gt;git show HEAD:some_path/some_file&lt;/code&gt;         &lt;br /&gt;顯示 HEAD 中 some_file 的檔案內容。 &lt;/li&gt;   &lt;/ul&gt;    &lt;h3&gt;原始碼&lt;/h3&gt;    &lt;p&gt;&lt;a title="gist: 558647 - [.vimrc] git diff- GitHub" href="http://gist.github.com/558647"&gt;gist: 558647 - [.vimrc] git diff.&lt;/a&gt;&lt;/p&gt;    &lt;h3&gt;功能說明&lt;/h3&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;h4&gt;GitDiff 指令&lt;/h4&gt; 輸入 &lt;code&gt;:GitDiff&lt;/code&gt; 即可切割視窗顯示目前檔案的 HEAD 版本，可加一個參數指定更早的 HEAD，例如 &lt;code&gt;:GitDiff 99&lt;/code&gt; 取得 HEAD~99 版本。顯示後會進入 diff 模式。另外可用 &lt;code&gt;echo t:git_diff_info&lt;/code&gt; 顯示該 commit 的簡易資訊。         &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_z34accOoRZI/THxd4q5SCKI/AAAAAAAABGY/l9aMBxYsG88/vim-gitdiff-snap.png"&gt;&lt;img title="GitDiff" alt="GitDiff" src="http://lh5.ggpht.com/_z34accOoRZI/THxd4q5SCKI/AAAAAAAABGY/l9aMBxYsG88/s800/vim-gitdiff-snap.png" /&gt;&lt;/a&gt; &lt;a href="http://lh4.ggpht.com/_z34accOoRZI/THxd5GIXWAI/AAAAAAAABGg/34Yc4STcM-c/vim-gitdiff-info.png"&gt;&lt;img title="t:git_diff_info 顯示" alt="t:git_diff_info 顯示" src="http://lh4.ggpht.com/_z34accOoRZI/THxd5GIXWAI/AAAAAAAABGg/34Yc4STcM-c/s800/vim-gitdiff-info.png" /&gt;&lt;/a&gt;         &lt;br /&gt;註：指令取的 HEAD~ 並無限制「有變更當前檔案」所以可能往前跳好幾個 HEAD 也看不出變化。 &lt;/li&gt;      &lt;li&gt;       &lt;h4&gt;MyDiffOff 指令&lt;/h4&gt; 因為預設的 &lt;code&gt;:diffoff&lt;/code&gt; 指令可能會把本來的 foldmethod 等 diff 相關選項蓋掉，所以改用 &lt;code&gt;:MyDiffOff&lt;/code&gt; 來關閉 diff。         &lt;br /&gt;不過也只是設回我的預設值，沒有真的建立暫存／重設機制。 &lt;/li&gt;      &lt;li&gt;       &lt;h4&gt;GitDiffOff 指令&lt;/h4&gt; 進入 &lt;code&gt;:GitDiff&lt;/code&gt; 後，用 &lt;code&gt;:GitDiffOff&lt;/code&gt; 快速恢復到原始狀態。（目前只支援從兩視窗的狀態復原） &lt;/li&gt;   &lt;/ul&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1470457395436625875-3192258574438334810?l=bootleq.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bootleqblogger/~4/ricZqflcLCE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://bootleq.blogspot.com/feeds/3192258574438334810/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://bootleq.blogspot.com/2010/08/vim-git-diff.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/3192258574438334810?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1470457395436625875/posts/default/3192258574438334810?v=2" /><link rel="alternate" type="text/html" href="http://bootleq.blogspot.com/2010/08/vim-git-diff.html" title="直接在 Vim 內與 git 舊版檔案 diff" /><author><name>bootleq</name><uri>http://www.blogger.com/profile/17132628710304821239</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://www.bootleq.com/image/finger.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_z34accOoRZI/THvJ_UcTSnI/AAAAAAAABGE/SbJs47u3W1I/s72-c/vim-gitdiff-gitdiff.png" height="72" width="72" /><thr:total>0</thr:total></entry></feed>

