星期四, 六月 18, 2009

xmonad 初體驗

最近awesome 這個window manager 很紅,學長很多都跳槽去玩。聽了學長大力推薦我也想說來試看看,可是Hardy 上的版本只有2.0 ,玩不到最新的就不好玩了!!所以只好自己來compile,但awesome 牽涉XCB,XCB 在系統上又很多應用,compile 以後發現不得了,影響太大,只好暫時放棄awesome,反正我的fluxbox 其實也很好用。

不過又聽到另一位玩haskell 的大大說 xmonad 也不錯,大致看了一下official site 發現同樣是tiling WM 可是config & extension 是用 haskell,想說那不如來試看看順便學一學haskell,於是就裝了 !
-------------

xmonad 本身就是用 haskell 寫的,根據我的瞭解,xmonad 在開始執行前還會先把你的config file (also haskell) compile 起來,也就是說你的config 會變成xmonad 程式碼的一部份,還蠻有趣的,其他C/C++ 的WM 大概很難做到這樣吧。

一些default 的 key binding 其實很夠用了,而且還有預設 dmenu 的快捷鍵 (Mod-p) 也就能應付所有程式了。 不過 panel 的設定讓我這個初學者實在弄了有點久,相對於awesome 一裝好就有的 panel 跟 trayer 比起來有點不太親切,但是因為 config 是直接compile 嵌進去的,所以還算靈活,在內部把panel info pipe 出來也不是什麼難事,這點讓我很喜歡。有時間再分享一下我的設定檔。

星期四, 六月 11, 2009

vim: diff between buffer and original file

上次看到學長用Emacs 可以把修改過的buffer 跟原檔案在編輯器裡面做diff,我就想vim 應該也可以。試了一下後來就成功了:
轉自: Vim Wiki
這個是我修改過的版本,做了toggle 的功能, map 到 \d (我的mapleader = \)
function! s:DiffWithSaved()
if exists("b:diffbuf")
unlet b:diffbuf
bdelete diffbuf
diffoff
else
let filetype=&ft
diffthis
vnew diffbuf| r # | normal! | ggdd
diffthis
exe "setlocal bt=nofile bh=wipe ro noswf ft=" . filetype
let b:diffbuf = 1
endif
endfunction
com! TDiffSaved call s:DiffWithSaved()
nmap <leader>d :TDiffSaved<CR>

-----------------------
另外我也在 vim online 找到一個 gitdiff.vim 用git 的時候也可以做出跟上面這樣一樣的效果,不過比對的對象是git repo 裡面的。而上面這個方法比對的對象是上一次存檔後的檔案跟現在的buffer

星期三, 六月 03, 2009

vim tip: when compiler gives you errors ....

vim 跟 gcc 還算蠻能合作的,對於gcc 的error/warning 都能直接找到對應的檔案行數,但有時候發生錯誤的檔案並不在現在的working buffer/tab/window,vim 跳過去的結果就是目前工作中的buffer 被換成該有錯誤的 buffer,造成原本tab/window 的配置都亂掉了。

老實說這個問題困擾我很久了,一直到今天在寫作業受不了,上網找了一下解法,結果在vim wiki 看到了解決的方案:
When I open an existing buffer from the buffer list... 這個section 寫到,可以把switchbuf 設成 useopen, 在做buffer switching 的時候會先看有沒有已經打開了。

之後去看了一下vim help,switching 還有其他模式可以選,最後我是選 opentab ,這個設定讓他不止看當前tab 的windows,而是看所有tabs 裡面的buffer,我想在vim7 以後應該都會用這個選項了吧。

設定方法很簡單.. 在 ~/.vimrc 加入以下這一行
set swb=opentab

就行了

星期一, 五月 25, 2009

recover deleted file while descriptor's still alive

偶而會有發生程式開啟某個檔案正在寫,結果我手滑刪掉了那個檔案的經驗。最近由於在維護一個mud 發生如此悲劇,log 檔就這樣被我刪了.. 於是上網找尋相關資料…

其實 Linux 上看到的的檔案是以inode 為根據表現出來的檔案,只要 inode 存在,檔案就還存在。(應該是這樣吧..) 。程式執行中開啟的檔案對程式本身來說是一個descriptor,也會在/proc/[pid]/fd/[fd number] 表現出來。而這個檔案也是對於inode 的一個連結。

若不小心把檔案刪掉的話,只要程式還開著,就可以到/proc/[pid]/fd/[fd number] 找到對 inode 的連結,然後把檔案copy 回來。

但是copy 回來的檔案內容只是copy 時當下的檔案,並不會對程式後來對檔案的操作有反應。若要真正復原成原本的狀態,需要把inode link 回來..這部分相關的資訊可以看這個網頁下半部的解法(我還沒試過..):
http://dag.wieers.com/blog/undeleting-an-open-file-by-inode

參考網頁:
http://dag.wieers.com/blog/undeleting-an-open-file-by-inode
http://prefetch.net/blog/index.php/2009/02/25/how-to-undelete-any-open-deleted-file-on-linux-solaris/
http://www.linux.com/archive/articles/58142

星期四, 五月 07, 2009

pulseaudio & x11 beep sound

以前都直接xset b off 把預設由主機發出的beep sound 直接停掉。今天看到使用pulseaudio 設定 beep sound 的方法:
在 ~/.pulse/default.pa:
加入指定音效
load-sample-lazy x11-bell [path-to-sound]
然後讀取 x11-bell module (也在default.pa):
load-module module-x11-bell sample=x11-bell
這兩行設定在預設的default.pa 的sample 中都可以找到,只要uncomment 來改就行了,當然自己寫上去也是可以的。

然後 beep 的音量由xset 設定(50%):
xset b 50
最後重開pulseaudio server 即可:
pulseaudio -k && pulseaudio -D


參考網頁:
http://jean-christophe.dubacq.fr/post/Parametrer-son-bip-systeme-avec-pulseaudio-comme-autrefois