Archive for the ‘Software’ Category

在 Big5 環境編輯 UTF-8 編碼的檔案

Wednesday, August 22nd, 2007

裝起 emacs 快一年了,這期間斷斷續續使用,一直只會基本操作。為了習慣操作方式,我甚至連 Visual Studio 的編輯器都改成 emacs-like key-binding,但在 linux console 時大部份時間還是回到熟悉的 vim 環境,其中一個原因就是找不到自動轉換編碼的設定… (more…)

cgdb - curses gdb

Friday, April 13th, 2007

gdb 很強大,但是 list source 的部份感覺上並不是那麼好用;Insight 或 ddd 之類的程式雖然有提供 source list window,可惜我得了不用 CLI 就會死的病 (大誤),所以一邊拿自己的生命開玩笑,一邊還是繼續找尋 console 下的解決方案。之前有提到要找找 vim + gdb 的整合方式,找到幾個都很麻煩,我希望盡量不要動到系統本來的程式 (畢竟有些機器不是我的…)。後來從 jserv 的投影片看到 cgdb 這個好東西,馬上下載試試。

編譯後的程式非常小,執行後會將畫面切一半:上面是 source window,下面是 gdb concole。雖然不是直接跟 vim 整合,不過操作上已經是 vi-like 的 key binding,所以使用上還算是順利,只要先搞清楚 CGDB mode、GDB mode、TTY mode、與 file dialog mode 的切換方式就可以開始玩了。另外,在操作 source window 時也可以設定 shortcut 模式,直接下指令給 gdb,省卻在不同模式間切換的時間,相當貼心的設計。

cgdb 的設定檔放在 ~/.cgdb/cgdbrc,可以將設定放在這邊,我目前的設定如下:

set arrowstyle=highlight
set autosourcereload
set shortcut
set tabstop=4
set winsplit=top_big
hi Statement cterm=bold ctermfg=6
hi PreProc cterm=bold ctermfg=4
hi IncSearch ctermfg=2
hi LineHighlight cterm=bold ctermfg=3 ctermbg=4

不過設完 highlight 才發現一件事,cgdb 的 lexer 不是很完整,所以對於 “#” 後面有空格的 preprocessor directives 判斷會怪怪的。可以修改一下 clexer.l (放在 cgdb/tokenizer/src)

- #{L}+ { return(TOKENIZER_DIRECTIVE); }
+ #[ \t]*{L}+ { return(TOKENIZER_DIRECTIVE); }

這樣看起來會正常一點。

目前這個程式感覺上還很陽春,不曉得能不能整合 watch, register, call stack 等等資訊,應該會更方便一些。

shell buffer in vim

Friday, March 16th, 2007

之前一直在想,如果可以在寫 python script 時同時開個視窗測試執行結果,應該會方便很多吧。在 emacs 中可以開個 shell buffer 直接使用,不過 vim 中好像沒有這樣的功能。雖然有 “:sh” 指令可以用,可是會把整個環境直接切換到 shell prompt 底下,沒辦法只出現在某一個 window。到官網找了一下,發現有兩個類似的 script:

vimsh 需要在編譯時加入 python support,雖然功能比較完整,不過在一些環境不太方便,所以後來選了 Bexec。安裝方式相當簡單,因為是 VimBall 的格式,只要用 vim 打開下載的 vba 檔,輸入 “:so %” 就可以了。

使用上相當簡單,因為它主要是根據 shebang 來動作,所以第一行一定要加上執行的程式名。接著在 normal mode 輸入 “\bx” 就會自動建立新的 window,並顯示執行後的輸出,內容修改後只要再輸入一次就可以直接更新。不過在有檔案的情形下,它會執行檔案內容,而不是 buffer 內容,記得存檔後再執行。在 visual mode 的話,會執行 buffer 中被選取的部份,測試部份程式碼時相當方便。

要關掉 output window 的話可以用 “\bc” 或 vim 的 window command 來關。不過我在測試的時候發現只要一關掉 output window,以後再開啟的 output window 都關不掉了。查了一下原始碼看不出個所以然,所以修改了一下,讓它只關掉 window,而不刪除 buffer。另外我也加了一個切換用的函式,所有修改如下:

@@ -404,13 +404,18 @@
” Close/Delete the output window/buffer.

function! BexecCloseOut()
- silent! exec “bdelete! “.s:bexec_outbufname
+” silent! exec “bdelete! “.s:bexec_outbufname
+ let l:outBuf = bufwinnr(s:bexec_outbufname)
+ exec l:outBuf . “wincmd w”
+ exec “wincmd c”
endfunction

+let s:isRunBufOpen = 0

” Wrapper function for visually selected text execution.

function! BexecVisual(…) range
+ let s:isRunBufOpen = 1
call <SID>BexecDo([a:firstline, a:lastline])
if g:bexec_rehighlight == 1
” Rehighlight selection
@@ -422,5 +427,22 @@
” Wrapper function for normal buffer execution.

function! Bexec(…)
+ let s:isRunBufOpen = 1
call <SID>BexecDo()
endfunction
+
+
+”
+” Toggle output buffer
+”
+
+function! ToggleRunBuf()
+ if s:isRunBufOpen == 0
+ call Bexec()
+ else
+ call BexecCloseOut()
+ let s:isRunBufOpen = 0
+ endif
+endfunction

最後只要在 .vimrc 中加上 key binding 就可以方便使用了:

nmap <silent> <unique> <F7> :call ToggleRunBuf() <CR>
nmap <silent> <unique> <F8> :call Bexec() <CR>
vmap <silent> <unique> <F8> :call BexecVisual() <CR>

除了 shebang 外,也可以根據 file type 來執行對應的 filter,只要修改 bexec.vim 中的 custom filter 定義就可以了。例如針對 html,我就設定了 “w3m -dump” 這個指令,以後就可以直接在 vim 中預覽最後的結果了。當然 txt2tags 文稿也可以,只要把 output 設為 stdout 就好了。比較可惜的是 filter 只能接檔名,不能接受 stdin 的資料,不然就可以串接很多個 filter 了。(是可以改,但很多程式不接受 stdin…想來想去沒找到好一點的改法)

有空再來試試 vim 和 debugger 的整合,在 vim 官網上有找到幾個 script,試用後再來報告。

Running Rainlendar2 on Linux

Wednesday, February 7th, 2007

Rainlendar 是一個小巧的桌面行事曆程式,在 Rainlendar2 推出後,也出現了 Linux 版本;另外還分成免費的 lite 版與收費的 pro 版,同時也取消原始碼下載了 (但舊版原始碼還是可以在這裡找到)。

(more…)

歌詞加上 LaTeX 的斷行記號

Monday, January 1st, 2007

自從幾年前改用 LaTeX 撰寫筆記後,我將大部份的文書編輯需求都慢慢移植過去,連歌詞的記錄也是用 LaTeX 產出精美的 PDF 文件。不過比較麻煩的是歌詞通常都是一段一段的,我不習慣通通串成一行,所以從網路上找到的歌詞都要手動加上斷行,不然產生出來的 PDF 內容會全部擠在一起。

其實也不是沒想過寫個程式來處理,不過我有時候會在 Windows 上作業,還要弄個跨平台的程式頗麻煩 (就算是 script 還是得裝 interpreter 阿…)。剛剛有點受不了了,就研究一下能不能直接在 vim 裡處理掉。

vim 雖然也有很強的文字處理功能,不過因為它的 regex 跟我不太熟 (我比較熟 perl 的…),所以一直不太想用它來處理文字。剛剛翻了一下 help 終於找到我要的東西了,我的需求很簡單:在每個段落中的最後一行除外,每一行的行尾都加上 \\,例如

line1
line2
line3

變成

line1\\
line2\\
line3

要用 vim 在行尾加個東西是不難,不過一直不知道怎麼在 vim 中做判斷,不過知道語法後就很容易了,我可以直接把 perl 的語法轉成 vim 的語法使用:

:%s/\(^[^\\]\+\)\n\([^\r]\)\@=/\1\\\\\r/

這個命令有略過開頭是 \ 的 LaTex 指令,如果不需要的話修改一下就可以了。

其實簡單一點的話也可以把歌詞丟進 verbatim 環境,不過有時候我需要在日文歌詞加上 ruby annotation,一丟進 verbatim 就破功了….(最主要還是為了日文歌詞,因為我幾乎只聽古典樂和 ACG 歌曲)

圖片上傳工具 - jUploadr

Monday, September 18th, 2006

jUploadr [Link]

目前這個工具支援 flickr 和 zooomr
剛好我都有使用,就抓下來玩玩看

它的跨平台是用 java 達成的,不過啟動速度還蠻快的
操作上好像也還好,功能就是簡單的上傳,頂多加上resize而已
因此原本不用 java app 的我也覺得可以接受

首先要先建立帳號才能上傳。它採用網頁認證的方式
會自動連到 flickr/zooomr 的網頁,同時出現允許程式認證的設定頁
認證通過後就可以透過這個程式上傳圖片了

操作方式是把圖片拉到程式的空白區,畫面上會顯示縮圖
對著縮圖點兩下會出現設定界面,可以填入 tag 或設為 private
另外輸入 tag 時只要按 enter 就可以自動查詢並補齊,蠻方便的
完成後按下 Upload 按鈕就可以了

另外針對 flickr 也可以設定新增 set 或上傳到某個 set
zooomr 的話就沒辦法了

還有一個沒測試的是敘述的欄位能不能填入 HTML tag
像 flickr 允許部份 HTML tag,但 zooomr 好像不允許
這部份不曉得能不能正確處理

使用起來還算方便,但畢竟只是單純的上傳工具
上傳前如果想更動照片順序的話好像沒辦法做到….
只能在丟照片前多注意了