2012年3月26日

JSON for Vim

剛剛在 Terminal 下開了個新檔要來寫 JSON, 發現 Vim 竟然沒有支援 JSON 的 FileType 與 syntax highlight。想說這問題應該很多人遇過,因此上網找了一下,找到這個 script: JSON.vim

不過看了下安裝說明,感覺麻煩了點。於是又找到了這篇文章,只要到 ~/.vimrc 加入下面這行,就可以讓 JSON 檔案套用 JavaScript 的 syntax highlight, 簡單明瞭。

autocmd BufNewFile,BufRead *.json set ft=javascript
2012年3月11日

關於 Mac 快速檢視 (Quick Look) 的幾個小秘訣

我用了 Mac 好一段時間了才知道,原來對檔案直接按空白鍵可以開啟快速檢視 (Quick Look);又隔了好一段時間,才又知道原來快速檢視除了內建的之外,還可以加上些外掛以增加支援檔案類型。下面是一些我所用到的 QuickLook 相關技巧整理。

BetterZip Plugin

在 Terminal 下開啟快速檢視

除了在 Finder 中按空白鍵外,有時候在 Terminal 底下工作時,也可以利用指令來開啟快速檢視,這樣可以減少鍵盤滑鼠的切換以提升效率。開啟的指令如下:

$ qlmanage -p [FILE]

把 [FILE] 替換成要開啟的檔名即可。不過這指令也不算短,要更方便的話,可以在 ~/.bashrc 中加入以下指令別名 (alias),這樣只要輸入 ql [FILE] 就可以立刻檢視了:

alias ql='qlmanage -p'

對了,設定檔 .bashrc 預設在 Mac OS X 中是不起作用的,可以參考這篇文章來讓 .bashrc work。

增加支援檔案類型的 Plugin

快速檢視本身支援文字、圖片、音樂、影片等基本檔案格式,至於其他不支援的格式則只會顯示一個大大的檔案 icon。透過以下 Plugin 可以增加快速檢視支援的檔案格式,安裝很簡單,只要將下載下來的 *.qlgenerator 檔案放到下面路徑之一:

  • (Macintosh HD)/Library/QuickLook/ 安裝給本機的所有使用者
  • ~/Library/QuickLook/ 只安裝給自己使用

壓縮檔 (Archives)

BetterZip 2 - The Next Generation of Archiving

上面這個外掛預設是暗色背景的,如果喜歡白色背景的(如同文章開頭那張圖),可以考慮下面這個修改版本:

farfanoide/BetterZ-QuickLook-plugin-theme-for-Lion

程式碼 (Code)

qlcolorcode - A Quick Look plugin for source code with syntax highlighting - Google Project Hosting

CSV 檔案

quicklook-csv - A QuickLook plugin to quick look CSV files for Mac OS X 10.5+ - Google Project Hosting

快速檢視文字檔案時,可以複製文字

按空白鍵檢視文字檔案內容很方便,可是有時候如果想要複製文字,就得另外再開啟文字編輯,相當麻煩。在 Terminal 下輸入以下指令,可以讓你在快速檢視文字檔時,也能選取想要的片段,然後按 Cmd+C 複製出來。

$ defaults write com.apple.finder QLEnableTextSelection -bool TRUE; killall Finder

用不同的應用程式開啟

在快速檢視時,右上方會有個按鈕讓你以預設關連的應用程式開啟。如果你想要用其他的應用程式開啟,例如用 Photoshop 開啟圖檔,那麼只要按著右上方按鈕不放,就會出現選單供你選擇想要開啟的應用程式。

以全螢幕開啟快速檢視

選取檔案,然後按下 Cmd+Opt+Y,就可以直接以全螢幕方式進入快速檢視,這對影像或是影片格式相當有用。

其實也可以在按著 Opt 的狀態下按空白鍵進入全螢幕的快速檢視,不過像我有安裝 Alfred, Opt+空白鍵 預設會啟動 Alfred 的輸入視窗,因此就沒辦法用來開啟快速檢視了。

設定 Mac Terminal 下的 .bashrc

今天想要替 Terminal 下一些常用的指令建立 alias, 我按照以前在 FreeBSD/Linux 的習慣,直接進 Terminal,在家目錄 (~/) 下寫了個 .bashrc, 重開 Terminal, 剛剛寫的 alias 卻沒有任何反應。

後來在家目錄下先建了個檔案 .bash_profile, 檔案內容如下:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

這樣原本寫在 .bashrc 裡的指令稿就會被讀取並且發揮作用了。補充說明,我的作業系統版本為 Mac OS X Lion (10.7)

關於 .bash_profile.bashrc 的差別,簡述如下:

.bash_profile

輸入帳號密碼登入時,不論遠端或本地,都會執行此設定檔。

.bashrc

在已經登入的情況下,開啟終端機視窗(如 Gnome 的 xterm),在命令提示符號出現前,就會先執行 .bashrc 內的指令。

不過 Mac OS X 的行為是上述流程的例外,詳細可參考本文最後面的連結。


參考資訊:

Customizing Terminal in Mac OS X 10.5 | macfidelity

上面這篇文章中的步驟比較多,甚至還要進 Terminal 的「偏好設定」畫面去修改打開 Shell 的指令。不過我自己的操作結果是就算沒有設定那些指令也沒關係,只要有包含文章中那段代碼的 .bash_profile, 就可以讀取 .bashrc 了。

關於 .bash_profile.bashrc 的差別,請見下面這篇文章。

.bash_profile vs .bashrc

用 Solarized 幫 google-code-prettify 上色

我用 google-code-prettify 來做 blog 文章中的代碼上色,google-code-prettify 本身有附上幾個 Color Scheme, 然而除了預設的之外,都是以暗色背景為主。

昨天心血來潮將 Solarized 這個 Color Scheme 移植到 google-code-prettify 下,同樣也是 dark/light 雙版本。關於 Solarized 的介紹可以參考這篇文章

下載 / Download

代碼 / Code

Solarized Light

正常排版版本 (download):

.pln{color:#657b83}
@media screen{
    .str{color:#2aa198}
    .kwd{color:#859900}
    .com{color:#93a1a1}
    .typ{color:#b58900}
    .lit{color:#2aa198}
    .pun,.opn,.clo{color:#657b83}
    .tag{color:#268bd2}
    .atn{color:#93a1a1}
    .atv{color:#2aa198}
    .dec,.var{color:#268bd2}
    .fun{color:red}
}
@media print,projection{
    .str{color:#060}
    .kwd{color:#006;font-weight:bold}
    .com{color:#600;font-style:italic}
    .typ{color:#404;font-weight:bold}
    .lit{color:#044}
    .pun{color:#440}
    .tag{color:#006;font-weight:bold}
    .atn{color:#404}
    .atv{color:#060}
}
pre.prettyprint{padding:5px;border:1px solid #888;background:#fdf6e3}
ol.linenums{margin-top:0;margin-bottom:0}
li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}
li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}

最小化版本 (download):

.pln{color:#657b83}@media screen{.str{color:#2aa198}.kwd{color:#859900}.com{color:#93a1a1}.typ{color:#b58900}.lit{color:#2aa198}.pun,.opn,.clo{color:#657b83}.tag{color:#268bd2}.atn{color:#93a1a1}.atv{color:#2aa198}.dec,.var{color:#268bd2}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:5px;border:1px solid #888;background:#fdf6e3}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}

Solarized Dark

正常排版版本 (download):

.pln{color:#839496}
@media screen{
    .str{color:#2aa198}
    .kwd{color:#859900}
    .com{color:#586175}
    .typ{color:#b58900}
    .lit{color:#2aa198}
    .pun,.opn,.clo{color:#839496}
    .tag{color:#268bd2}
    .atn{color:#586175}
    .atv{color:#2aa198}
    .dec,.var{color:#268bd2}
    .fun{color:red}
}
@media print,projection{
    .str{color:#060}
    .kwd{color:#006;font-weight:bold}
    .com{color:#600;font-style:italic}
    .typ{color:#404;font-weight:bold}
    .lit{color:#044}
    .pun{color:#440}
    .tag{color:#006;font-weight:bold}
    .atn{color:#404}
    .atv{color:#060}
}
pre.prettyprint{padding:5px;border:1px solid #888;background:#002b36}
ol.linenums{margin-top:0;margin-bottom:0}
li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}
li.L1,li.L3,li.L5,li.L7,li.L9{background:#111}

最小化版本 (download):

.pln{color:#839496}@media screen{.str{color:#2aa198}.kwd{color:#859900}.com{color:#586175}.typ{color:#b58900}.lit{color:#2aa198}.pun,.opn,.clo{color:#839496}.tag{color:#268bd2}.atn{color:#586175}.atv{color:#2aa198}.dec,.var{color:#268bd2}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:5px;border:1px solid #888;background:#002b36}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#111}

範例 / Example (in dark version)

import java.util.Map;
import java.util.TreeSet;

public class GetEnv {
  /**
   * let's test generics
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    // get a map of environment variables
    Map<String, String> env = System.getenv();
    // build a sorted set out of the keys and iterate
    for(String k: new TreeSet<String>(env.keySet())) {
      System.out.printf("%s = %s\n", k, env.get(k));
    }
  }    
}

網路上有找到這篇也有 solarized color for google-pretty-code, 不過只有暗色背景的版本。

2012年3月9日

BOM (Byte Order Mark) 與 UTF-8

一些個人筆記,省得以後每次遇到還得重新上網搜尋做功課。


Byte Order Mark 在 UTF-16 Big Endian 是 "FE FF",Little Endian 是 "FF FE"。其中 Mac 系統主要是 Big Endian, PC 系統則是使用 Little Endian。

UTF-8 由於本身特性,不管 Big Endian 或 Little Endian,其 BOM 一律為 "EF BB BF"。

不過個人建議,文字文件要儲存的話,盡量以 UTF-8 格式存。而以 UTF-8 儲存的文件,盡量不要放 BOM 進去。為什麼呢?因為 UTF-8 的一個特色就是能與 ASCII 系統相容,如果文件中沒有包含非拉丁字元的話;要是放了 BOM 進去,就破壞了這相容性。

在 VIM 中的 BOM 相關操作

加入 BOM

:set bomb

移除 BOM

:set nobomb

查詢 BOM 狀態

:set bomb?

在 Terminal / Console 下的 BOM 相關操作

查詢包含 UTF-8 BOM 的檔案

$ grep -rIl $'^\xEF\xBB\xBF' [FILE]

找出並移除 UTF-8 的 BOM

$ grep -rIl $'^\xEF\xBB\xBF' [FILE] | xargs sed -i 's/^\xEF\xBB\xBF//;g'

編碼的轉換

$ iconv -f [FROM_ENCODING] -t [TO_ENCODING] [FILE]

其中 ENCODING 的部份可以是以下數值:

  • UTF-8 UTF8
  • UTF-16BE
  • UTF-16LE
  • UCS-2BE UNICODEBIG
  • UCS-2LE UNICODELITTLE

更多 ENCODING 代碼可以透過 iconv --list 查詢。

Related Posts Plugin for WordPress, Blogger...