google code-beautifer

顯示具有 programming 標籤的文章。 顯示所有文章
顯示具有 programming 標籤的文章。 顯示所有文章

星期二, 8月 01, 2017

EMACS usb 隨身碟版的配置

有時候想在外寫個無關機密的東西,但是不方便時時帶個筆電出門,湊巧有個安全的windows  機器在那可以讓你用USB碟可是你沒有管理員權限,這時在隨身帶的USB 碟上裝一套可攜版的 emacs 來寫寫文件不錯,不過既然都能跑emacs ,當然會想把自己家裡電腦整套.emacs 配置跟.emacs.d 裡面包山包海的套件也帶過來所以跟自家的環境一樣方便。這要怎麼做?其實不難:

可以在啟動emacs 的batch 檔裡設定環境參數:主要就是下面兩行
set HOME=%~dp0..\emacshome
"%~dp0\winbin\emacs-24.5\bin\runemacs.exe" %*

其中 %~dp0 就是windows 裡現行執行檔的現行目錄, 假如把這兩行寫到USB 碟上根目錄的一個檔案叫runEmacsUSB.bat,不管 USB 碟 是 e: 還是f:.... %~dp0 就是那個碟的根目錄,假定 USB 碟 是 e: 那 runEmacsUSB.bat 的位置在e:\runEmacsUSB.bat 而 %~dp0 就是 e:\
這個可以照自己喜好更動,我在  USB 碟 下開了一個子目錄 winbin ,然後又把整個emacs 隨身版拷貝到 winbin 子目錄下的emacs-24.5 裡,所以執行檔路徑就在e:\winbin\emacs-24.5\bin\runemacs.exe
這就是 runEmacsUSB.bat 第二行的前半段但是用雙引號刮起來 後半段就只是把參數全吃下傳給emacs
這樣這個在根目錄的批次檔就會去子目錄裡找到真正的執行檔
但是這個emacs 配置重點在第一行,他會指定 emacs 的家目錄 ,我是在USB 碟根目錄下開了一個子目錄叫emacshome ,然後把 .emacs 設定檔跟 .emacs.d 目錄全拷貝過去emacshome 之下,這下執行 runEmacsUSB.bat 就可以在USB 碟上跑全套 emacs 服務,在電腦上看大螢幕寫東西的爽度不是用手機可以比擬的

順帶一提,我試過emacs 24 跟25 版,在windows 10上某機器上, 25 版對我特製化的程式碼字型設定顯示不佳,會糊糊的。但是24 版不會,所以為了相容性我就沒有跑25 版

星期四, 6月 08, 2017

emacs 裡要快速跳躍記憶文件位置

編輯超過一千行的程式,要從不管是開頭或結尾跳到中間都會蠻痛苦的。當然emacs 也可以下指令一次跳好幾頁,但是要是不知道正確的數量一次到位,也是很麻煩,這時候需要有個好方法來快速跳躍:比如說在事情沒做完的位置先留個書籤,就可以先跑到其他的地方編輯(比如說回頭去修改定義,或前一次叫用的地方改個幾行),改完再按一個鍵跑回來
理論上要是cedet 可以辨識你的程式語言語法的話,應該是不太需要用記憶程式位置,不過有時候就是得在一些cedet 不是支援很好的文件裡跳來跳去作編輯,這時記憶程式位置就很有用

emacs 裡要記憶位置可以用register 或bookmark來完成:
register有個缺點: 一旦關掉emacs 這些記憶就被清掉,而且位置標籤名只能用單一字母。但是對於臨時要用的再方便不過,但是用 bookmark的話位置標籤名會一直記住,且位置標籤名可以取一個很長的名稱,比較不常用的位置這樣記會比較適合
用bookmark 的話,假如對某個檔是第一次叫用,預設的標籤名就是目前檔名,假如是針對多個檔案這當然是方便,但是對在同一個檔案裡跳來跳去就不便。

視這個變數對於修改的本質,我自己是這樣工作:假如是臨時要在一個檔案跳來跳去,而且一旦改完這個位置就不須需要記憶的,我用register 來處裡,位置名就取1, 2, 3, 4  ....
但是對於久久用一下的就用bookmark,當然bookmark 也是可以用單一字母來當標籤名
所以我通常都用bookmark 來處理,就像前面說的:短期記憶就用1 2 3 4 命名,需要長期記憶的再取個有意義方便回想的名稱
我有在.emacs設定下綁定兩個熱鍵F9跟 F12 來當設置書籤 跟跳到書籤去
(global-set-key (kbd "") 'bookmark-set)
(global-set-key (kbd "") 'bookmark-jump)

此外我有搭配hide-show mode ,先把目前不會去處理的一些副程式的細節收藏起來,真的要用時再打開。這樣編輯處理大程式就更清爽靈活

星期三, 5月 03, 2017

randr :多螢幕的空間配置變換

多螢幕的空間配置是門學問,因為螢幕通常是寬大於高,比較直覺的作法是把次螢幕放在主螢幕的上方,所以不用時時都頭抬的高高,有需要才抬頭,以gnome desktop 而言,他會把面板顯示鎖定放在主螢幕頂端,但是桌面的捷徑因為跟著桌面的左上角起開始排列,他們會跑到次螢幕去,

這用法一般工作還好但是有個問題,有些程式好像水土不服(比如說pluma 編輯器):除非你要是在次螢幕下進行使用pluma開啟檔案選單,不然的話,會發現pluma在主螢幕下進行的檔案開啟選單行為會很怪異,(基本上要是選單很長的話,他不會往下列而是往上列,但是因為Gnome shell 的面板taskbar 放在主螢幕頂端,他就認為到頂了就切掉而不會去利用主螢幕面板顯示更上方的次螢幕,所以明明螢幕空間很多,選單卻擠在一起)不過不是所有程式都是這樣,我認為是pluma 沒設計的很周全,不過gedit 被改到我很不順手,三不五時除了emacs 外我還是得用pluma寫東西。所以我是這樣設定:

一般需要專心debug 很長的程式之類工作而不需做檔案開啟之時,把雙螢幕切到上下並列的配置,不然才就是左右(而且以左邊的主螢幕為主)
要切換可以用Arandr ,用他的GUI寫兩個設置檔:一個是上下並列的配置,一個是左右並列的配置。這暫時可以解決,但還不夠好:因為每次切換要先開Arandr ,然後開啟設置檔,再點執行....需要很多鍵很慢。理論上Arandr 可以配置綁定某一快捷鍵給某一螢幕設置檔,但是0.17 版只支援metacity ,所以我在改成用mutter 的gnome shell 上按了設置的快捷鍵是沒有用的。
所以後來我寫了兩個執行檔,內容分別是
xrandr --output DVI-I-3 --right-of DVI-I-2
xrandr --output DVI-I-3 --above DVI-I-2
然後寫了兩個gnome 的桌面捷徑去分別執行。想知道螢幕的代碼可以用不加任何參數去執行 xrandr  比如說這是我在某電腦的執行結果,可以看到 4 個介面 DVI-I-XXX 只執行了兩個,如何配置就看個人
$ xrandr
DVI-I-0 disconnected (normal left inverted right x axis y axis)
DVI-I-1 disconnected (normal left inverted right x axis y axis)
DVI-I-2 connected primary 1680x1050+0+0 (normal left inverted right x axis y axis) 473mm x 296mm
   1680x1050     59.95*+
   1440x900      74.98    59.89 
   1360x765      60.00 
   1280x1024     75.02    60.02 
   1280x960      60.00 
   1280x720      60.00 
   1152x864      75.00 
   1024x768      75.03    70.07    60.00 
   800x600       75.00    72.19    60.32    56.25 
   640x480       75.00    72.81    59.94 
DVI-I-3 connected 1440x900+1680+0 (normal left inverted right x axis y axis) 408mm x 255mm
   1440x900      59.89*+  74.98 
   1280x1024     75.02    60.02 
   1152x864      75.00 
   1024x768      75.03    70.07    60.00 
   800x600       75.00    72.19    60.32    56.25 
   640x480       75.00    72.81    59.94 

在從睡眠模式醒來後,或是鎖定螢幕一陣子後,有時候會發生螢幕的桌布花屏,偏移或解析度錯誤的情形,一個方式是用alt -F2 去強迫重畫桌面,重新啟動rAndr 也是可以解決
   
一些設置可以去參考
http://www.thinkwiki.org/wiki/Xorg_RandR_1.2

星期六, 4月 22, 2017

把(emacs下的)程式輸出成 pdf 檔

有時候出門不方便帶筆電,但是得用手機或平板看之前寫的程式,能方便的轉PDF 就很重要,因為現在的機子很多不能跑Linux ,看大程式檔這種的事反而變得很麻煩。  

我因為是在Linux下工作,所是用這個方案。https://genomeek.wordpress.com/2013/03/08/emarch-2-create-a-pdf-with-highlighted-code-source/
他會在你原檔案所在的目錄下產生一個XXX.pdf 的檔案,XXX 就是你的原檔名,比如說hello.c 就會產生hello.c.pdf
假如你有文字有做syntext highlight 這些顏色也會保留。預設值我覺得應付一般狀況還好,不過有時候可能會因個人所好想做一些調整,比如說轉成橫式輸出,或是把每頁的檔頭縮到最小,這就得在postsciprt 輸出時調參數,這以後再談。

要是在windows 下但又沒又裝cygwin 就比較麻煩,這篇的作法是靠GhostView,但安裝也算容易
https://www.emacswiki.org/emacs/PostScriptToPDF

星期日, 11月 20, 2016

在pluma 裏增加markdown語言的語法加強顯示功能

gedit 實在太古老,mate 裏面的 pluma 基本上是要來取代gedit 但是兩者的plugin 系統並不相容,得重新編譯
但是只是要增加一下一些新語言的語法加強顯示功能的話,也許靠 gtksourceview-3.0 就夠了。目前pluma 還依賴/gtksourceview-2.0。所以比如說針對markdown加強語法顯示,只要用root 身份執行

# cd /usr/share/gtksourceview-2.0/language-specs/
# ln -s /usr/share/gtksourceview-3.0/language-specs/markdown.lang

這樣就可以了

(This is the 12/20 of my #開放改變20 initiative in this year. )

星期日, 11月 17, 2013

如何在gnome3下把珍貴的 super 鍵搶回來好在別處使用

PC 鍵盤的windows 鍵(osx 裏對應成command鍵 )在unix 下一般是被對應成 super 鍵,這在作coding 時很有用,可以設定成各式各樣的快捷鍵,特別是毫秒必爭的live coding。
但是windows 鍵被gnome 3 搶走當Switch between overview and desktop (類似osx的
expose),尤其是筆電那種縮減鍵盤只有一個windows 鍵一旦被搶走就沒的用了。但是既然系統還有指定了Alt-F1 來達成同樣的功能,沒有必要放著好用的 super 鍵不用。但是要想去gnome 桌面上的系統設定值去改這鍵,會發現到根本就找不到選項可以改。得到終端機下用指令改。
首先先確定看一下到底是不是真的被 mutter 給劫持走了:
$ gsettings get org.gnome.mutter overlay-key
'Super_L'
的確是,所以我們把他用空白字串把這鍵結拿掉
$ gsettings set org.gnome.mutter overlay-key ''
登出gnome 桌面再回來就可以了

不過對osx 跟linux雙作業系統的使用者而言:既然windows 鍵在osx 裏對應成
command鍵,要注意Cmd-A, Cmd-C, Cmd-G, Cmd-M, Cmd-F, Cmd-P, Cmd-V,
Cmd-X,Cmd-Z, Cmd-1, Cmd-2, Cmd-3, Cmd-4, Cmd-/, Cmd-., Cmd-SAPCE,
Cmd-LEFT, Cmd-RIGHT, Cmd-UP, Cmd-DOWN, 這些已經被OSX系統用掉了

延伸閱讀
Linuxer/Emacser 在OSX 下用PC的鍵盤

星期六, 3月 07, 2009

Linux 的perl開發環境

有個朋友問起開發軟體用Python 跟Perl 的比較,從我的觀點來看:

1.作研究的人沒有什麼挑程式語言的條件,往往是事情複雜到需要整合好幾個領域,不可能一個人用一個程式語言從頭搞到底,那樣東西還沒做出來你就被別人發表的成果淘汰了。所以你需要什麼樣的武器(通常是以某個語言寫出來的程式庫)來處理某個次領域的事情,你就用那個語言去做基本的處理及呼叫程式庫。再用其他或相同的語言把中間過程串起來。像我本身,約莫是平均一年需要學一個新的程式語言。

2. 光比較Python 跟Perl :為了處理web 的資料,其實我一開始是從Perl 學起,那時web mining programming還沒多少人知道該怎麼作才好。 Perl 寫短程式實在很精簡,但是可閱讀性實在是太差,我覺得比Lisp 還要差,我看自己以前寫的 perl碼,當時要是沒有詳細註解的話,要花很大的力氣。但是為了精簡程式選perl,卻要花更多的時間去詳細註解的話,實在是自相矛盾的作法,所以現在有的選的話,我會以python 優先。其實不只是對perl 而言如此,對lisp 也是一樣。

下面就是從這樣觀點來看perl 的開發環境

開發介面平台


不知道是不是大家比較少用perl 開發大一點的程式,相對於python,perl 的開發介面平台在 inux 上比較少。
我現在只知道emacs ,跟Eclipse 。另外有一個在winodws 下用Pascal 寫的Open Perl IDE,也許可以用Lzaurus/free pascal 來在Linux 下編過,不過我還沒時間試。

Eclipse


Eclipse 的壞處就是笨重,用這麼肥的IDE 想來開發輕薄短小的perl實在不太有道理。連在AMD雙核心 4GB Ram 的機器下跑都有點小遲鈍,而且Eclipse 的笨重不只是Eclipse 本身體積肥而已,連寫個小程式都很麻煩:
首先要開一個計劃,然後加上計劃下的程式。假如你之前在外頭寫好了幾個部份片斷程式,恭喜你,片斷程式要匯進去計劃有夠麻煩的,開個不同檔名再剪貼文字過去可能還比較方便。不過在emacs 上的ECB 也有那邊的問題,有時得忍受一下交互使用。要是覺得連去巷口市場買菜都得騎隻恐龍不是什麼大不了的事的話,那Eclipse 這隻大恐龍倒是上天下海無所不包。

Eclipse 的介面,可參考我後續的介紹,

Eclipse 的perl 外掛叫ERIC,目前有兩大版本:0.5 穩定版跟0.6的測試版,我是用0.6版,沒什麼問題。
安裝EPIC這個外掛的步驟在不同版本會有稍許不同,在mandriva 下的eclipse3.4 版是這樣:
啟動Eclipse後在主選單的Help的下拉式選單,選擇Software Updates,然後在Available software的分頁下選擇Add site,在Location 的URL視窗鍵入:
http://e-p-i-c.sf.net/updates/testing
選Find and Updates後,建一個新的名稱(如Eric)給EPIC,然後按下finish後再去勾選這個 Pac外掛做update

把EPIC 外掛裝上後。在主選單file ->new->other
下就會看到Perl型別的選項。先開新一個計劃之後,再依需要慢慢把程式檔加進去。

我試過了Eclipse 的EPIC ,發現所有的變數都要用my 宣告成當地變數,不然eclispe會給你一堆紅色錯誤警告。但要是這樣作的話,在Emacs 下就沒辦法被ECB辨識成變數來顯示,IDE效果就打了折扣。

我最喜歡的一點是在Eclipse 下,只要把游標指到某行的某變數下,在其他行的該變數也會用不同顏色顯示出來,這點在除蟲時很方便。不過這好像是透過全文檢索,所以連不是變數的像標點或字串也行,這讓我懷疑是不是了Eclipse 反應遲鈍的原因之一。

Eamcs/ECB


ECB 來寫C/html 是很棒的IDE 。可是對於那些semantic (ECB 賴以解析程式碼的模組)支援很有限的語言如 perl ,表現就只是差強人意。Emacs 的syntax highlight 是沒有問題的,但是ECB左側變數列表會不完整,得用Meta-x!etags *.pl幫現在的perl程式碼編符號表,直接改emacs 裡的程式碼而不重整符號表是不成的,那些在 my 後面直接宣告而且給定起始值的區域變數都顯示不出來。所以要跟eclipse交互使用環境會有一點問題。

結論


兩個IDE 都各有優缺點,我現在是一頁就能看完的程式用emacs 來處理,超過一頁再來用eclipse發展。

延伸閱讀


用Emacs 開發C 程式

星期二, 2月 24, 2009

用 Graphviz 畫資料庫設計圖

graphviz 的介紹見,用 Graphviz 畫工程科學說明圖

以一般設計資料庫流程,第一階段畫 ER/EER diagram,第二階段畫relation tables 跟 key constraints,要找免費的工具還真不簡單。大多數最多也只是提供免費試用而已,我也用過dia 跟 xfig 來畫過,總覺得少那麼一點。後來還是覺得用graphviz 來畫最方便。

以我實作EER model 的情況,除了weak entity 的total participation 雙線,跟subclass 的關聯線外。幾乎可以直接全部畫出來,其實可以自行加入向量圖形,不過我很懶。在時間有限前提下,用個近似的方法就交差了。要是有人能把這兩個向量圖加入graphviz ,會是功德無量。

下面用 18分大學的體系為例,用graphviz 來畫一個資料庫設計的EER diagram。既然是18分大學,訛誤在所難免。我故意搞了些手腳,好讓那些懶惰的老師或學生會踩到地雷,但懂的人一眼就看穿。好事者請不要公佈答案,不然就不好玩了。


除了EER model ,畫relation table 也沒啥大問題,唯一的地方是標示composite key 的部份。我是用套疊格子的技巧作出來。其實這些小地方不一定要這樣作,我是依據近年美國資料庫教科書首選Elmasri的fundamentals of Database Systems用的記號為依歸,算是遵循標準吧!這樣一般大學生不用我解釋就可以看得懂我的設計。

下面用海角n億洗錢的體系為例,用graphviz 來畫relation table 設計

我想面對犯罪可以為一己之私,可以用泛政治的理由拉一堆人來替自己洗錢掩護,檢警單位應要學學怎樣用自由軟體來彙整日益複雜的犯罪資料。

一般資料庫先畫ER diagram,正規化Schema後再寫SQL。不過有個java 工具sql2dot是可以把簡單 SQL 檔轉成 dot 語言,用法是
java -jar sql2dot.jar 我的sql檔名
我試了一下,語法解析不夠彈性,有些情況沒辦法解析出來。不過後來又看到一些其他的工具sql 轉dot的工具,等以後試了再來紀錄心得。

用 Graphviz 畫工程科學說明圖

一般而言,工程科學說明圖是網路/樹狀結構但沒有很強的流程方向性的圖我用graphivz來畫,圖是網路/樹狀結構而且有很強的資料流程方向性用dia來畫。其他的我才用xfig來畫。

我覺得graphviz 最大的好處是自動編排。只要用文字編輯器把這些節點,聯接,文字相互關係...的.dot 描述檔寫好後。graphivz編譯會自動產生編排好的圖形。不用拿滑鼠在螢幕上移來移去。這在設計複雜的關聯圖形時很重要,而且這些文字大部可以在後面的流程回收。作過一次標準資料庫設計就知道了。剛開始學習要點時間,但是對理工科的人而言長期的回收絕對划算。

Graphviz 編譯命令長的像這樣子
dot -Tpng foo.sql.dot -o foo.png
,除了png 外,也可以選pdf,ps, gif 之類的格式,或是不同風格的圖形編排,輸出成png 或ps 後可以在openoffice 文件裡當插圖用,用中文的話要記得用utf8輸入即可。

graphviz跟emacs 整合的話,工作會更方便,用emacs 編完Graphviz 的.dot
描述檔之後,直接C-c C-c 編譯。(這跟python是一樣的)C-c C-p 直接在 emacs裡預覽輸出圖形。下圖是在emacs裡預覽的結果。

安裝其實很簡單,在winodws 上也有 wingraphviz 可以用。我試過跟某個用winodws平台的人共同用graphviz 溝通開發資料庫,沒有問題。應用實例後面會另文介紹。

參考
用 Graphviz 畫資料庫設計圖

星期日, 11月 11, 2007

用Emacs 開發C 程式 第三部分:cscope整合

用Emacs 開發C 程式 第三部分:xcscope整合

xcscope 可以讓emacs搜尋變數的過程更簡便。

比如說找變數 i ,直接用 ^S 會找死人 (i被太多變數包含了),用正規表達式找 \bi\b 又不太方便,xcscope 會把所有引用到變數 i的block 跟行號在另一個視窗*cscope*全部列出來,在*cscope*視窗中把鼠標移到其中想要跳過去查看的那一行,按滑鼠中鍵,主程式視窗列表就會跳到對應的那一行。

安裝:


rpm沒有包入contrib下的檔,所以去抓 tar ball 來用。而且要在.emacs 裡加入

(load-file "/usr/local/cscope-15.6/contrib/xcscope/xcscope.el")
(require 'xcscope)


使用


emacs在載入 C 程式時就會啟用 csope "模式",
xcscope會在當下工作的目錄裡產生cscope.out存放交互連結資料

xcscope在emacs 主選單下有以下選項
Find symbol (d) 列出所有參考到此符號物件的程式行
Find global definition (g)
Find global definition no prompting (G)
Find functions calling a function: (c) 列出所有呼叫此函式的程式行
Find called functions: (C) 列出所有被此函式呼叫的函式
Find text string:
Find egrep pattern
Find a file:
Find files #including a file:

上面這些命令可以用以 C-c s 開頭的按鍵來執行,如Find symbol是 C-c s s跟emacs 的increamental 搜尋不一樣的地方在於,xcscope會另外開一個緩衝區叫*cscope*把所有符合搜尋條件的結果作索引一次全列出來,

比較好的方式,應該是在C 程式緩衝區可以直接用滑鼠鍵叫出 scopse 選單,然後選搜尋選項。根據http://linux.die.net/man/1/xcscope的說法,可以用pop-up (button 3)menus 叫出 xcscopse 選單。問題是沒有一個叫cscope-mode 的東西,所以在C 程式緩衝區裡無法用Ctl 滑鼠右鍵叫出cscope顯示選單。只能在%cscope%緩衝區下針對有列出來的符號用滑鼠叫出cscope顯示選單。

對於這個問題有一個解決的方式是去 ~/.emacs 下自行定義類似這樣的全域鍵盤定義。要充分發揮Emacs 各個元件的功能,善用控制鍵/滑鼠是不可或缺的一環,參考Emacs / X window 鍵盤滑鼠定義

同樣支援 cscope的有cscope-fu, ecsope, 跟bscope。bscope號稱比xcscope.el好。

參見
CScopeAndEmacs
用Emacs 開發C 程式

星期六, 11月 10, 2007

Emacs / X window 鍵盤滑鼠定義

要充分發揮Emacs 各個元件的功能,善用控制鍵/滑鼠是不可或缺的一環。

當常常用emacs 寫作開發程式做某特定動作,就要按一大串鍵會減低效率。有一個解決的方式是去 ~/.emacs 下自行定義全域鍵盤控制鍵/滑鼠定義。不過要作到自行定義,要先瞭解整個環境是如何定義鍵盤的:

Emacs 控制字首定義


控制字首可以放在"任何"一般字元前,甚至滑鼠動作前,其中可以用下面簡寫

M- (meta)
C- 或 ^(control )
S- (shift)
A-(alt)
H- (hyper)
s- (super)
字首順序是可變換的 (M-C-x 跟 C-M-x 是一樣的意思)
可以用多次如 3*<right>跟<right><right><right>是一樣的意思
function 鍵字首可以寫到角括號裡, C-<down> 跟 <C-down> 是一樣的意思

X 視窗鍵盤定義


在我的鍵盤(PC105鍵盤)上
Alt鍵定義成 meta鍵
左視窗鍵定義成 super 鍵
右視窗鍵定義成兩層定義,第二層定義為Multi 鍵(一般所謂的 compose)
選單鍵定義成 Meta-X

其實還有Scroll Lock跟 Caps Lock 跟 SysRq。除了opera, 跟 virtual console ,...外 Scroll lock 跟 SysRq幾乎是沒用的廢物,雖不便澈底改變定義,不過也許卻適合在emacs挪用成其他定義。

要是要去X 視窗改定義的話是在/etc/X11/xorg.conf 下改動

Section "InputDevice"
Identifier "Keyboard1"
Driver "Kbd"
Option "XkbModel" "pc105"
Option "XkbOptions" "compose:rwin"
EndSection

設定是在選項
Option "XkbOptions" "新動作定義:原鍵盤設定"
如Option "XkbOptions" "ctrl:nocaps"
很多人把capsLock 當成 Ctrl,我覺得很浪費,因為可以拿來當別的鍵用

假如想要看當前鍵盤原始定義檔,執行
xkbcomp $DISPLAY
就會產生以 server-0_ 開頭的檔案如
server-0_0.xkb

Emacs 滑鼠鍵定義


滑鼠左鍵:選擇
滑鼠中鍵:貼
滑鼠右鍵:標示區間
Shift 滑鼠左鍵: 跳出 Font 選單(相當於Emacs 主選單->Options->Set Font/Fontset)
Shift 滑鼠中鍵: 呼叫 dird ,在檔名字串上按Shift 滑鼠中鍵可開啟這個檔
Shift 滑鼠右鍵: 沒有定義(這應該可以拿來自行定義常用的動作)
Ctl 滑鼠左鍵:跳出緩衝區選單供切換
Ctl 滑鼠中鍵:跳出文字顯示選單供更動顯示選項(相當於Emacs 主選單->Edit->Text Properties)
Ctl 滑鼠右鍵:應不同的緩衝區模式會有不同的回應。
在%cscope%緩衝區下執行會跳出cscope顯示選單供更動顯示選項(在HTML 或 C,... mode 就會跳出相對於Emacs 主選單->HTML/SGML/C模式的選單)

Alt 滑鼠鍵: 視窗管理(跟emacs無關)

Alt 滑鼠左鍵:拉動視窗
Alt 滑鼠中鍵:調整視窗長寬度,這在剛用C-x 5 2 啟動某視窗可是預設的長寬太小時很有用。要是嫌ecb 左邊frame 寬度佔去的比例太大,可以在緩衝區回應視窗裡去拉動分隔線調整比例。
Alt 滑鼠右鍵:視窗動作管理目錄(也包含前二者)

自行定義Emacs 全域鍵盤定義


全域鍵盤定義,有幾種不同寫法。在
XEmacs 與 Emacs傳統上 (version 19)用
(define-key global-map [(control f9)] 'cscope-find-global-definition)
(define-key global-map [(ctrl f9)] 'cscope-find-global-definition)
(define-key global-map [(meta f7)] 'cscope-find-global-definition-no-prompting)

XEmacs 與 Emacs兩者較新版(version >20)寫法
(define-key global-map (kbd "C-") 'forward-word)

Emacs 獨有的寫法
(define-key global-map [C-right] 'forward-word)

不過要小心自行定義不要跟別的套件定義打架。比如說
C-F3到C-F6,C-F8,F3到F8跟F11已被Xref定義過了。F1, F2, F10 被Eamcs 定義過了
有幾個X 視窗相關的鍵盤定義也要注意,如
X-windows
Ctl-Alt-F1 到F12
Metacity (無論有 Compiz 與否)
Alt-Tab, Alt-SPACE, Alt-F1,Alt-F2,Alt-F4,Alt-F5,Alt-F7到 Alt-F10,
Ctl-Alt-Tab, Ctl-Alt-d, Ctl-Alt+L, Ctl-Alt-加上左右上下鍵,
Ctl-Alt-SHIFT-加上左右上下鍵, PRINT, Alt-PRINT
Alt-ESC, Ctl-Alt-ESC (但在Emacs 被重新定義了)
Compiz 3D
Ctrl + Alt + 左鼠左鍵在桌面上拖曳, Super + 老鼠右鍵 , super + 老鼠
滾輪向上滑, Super + 老鼠滾輪向下滑, Ctrl+Alt+向下鍵按著不放,Ctrl+Alt按著不放+左右方向鍵

功能鍵剩下
F9,F12
shift-F1, shift-F5, shift-F7,
C-F1,C-F2,C-F7,C-F9到C-F12
M-F3, M-F6, M-F11, M-F12
super F1到F12

延伸閱讀


metacity 桌面管理員預設鍵盤快速鍵用法
Compiz 3D 桌面的使用設定
CapsKey
Emacs key binding help page
An Unreliable Guide to XKB Configuration

星期日, 10月 21, 2007

用Emacs 開發C 程式

Version 1.1

(Oct 21: 1.0版)
(Nov.12 1.1版: xcscope 的深入討論獨立出來自成一節)

最近被學校猛操 C 程式開發,我覺得開發C 除錯的時間要比lisp長很多,非得找方便的開發除錯環境來幫忙不可。理論上我可以用eclispe或anjuta 這種大傢伙來開發,但我一邊開發除錯還要一邊作別的事,那些不是很方便。最好的選擇還是找能跟emacs 搭配的工具。

目前在emacs上裝了
ecb
xcscope
xrefactory (xref-1.6.10)
覺得工作起來順手多了。這三個各司其職:
ecb 比較接近快速的瀏覽 source code 整體本身
靜態的呼叫範圍相關問題用xcscope查
跟編譯比較接近的相關問題用xref
三者都跟emacs 的source buffer 緊密結合

除了這三者外,還有一些其他的工具,其中cbrowser好像很久沒更新。SimpleCallTree 我弄不出來,作者勸我用比較正式的工具代替。

Code Crusader 5.2.1 是商業程式。demo有兩種,一種是限制使用時間,另一種是限制最多開啟5 個檔案跟5 個視窗但還要註冊。我不是很喜歡。

Doxymacs等於是Doxygen + {X}Emacs。我根本沒時間好好弄文件,就先擱著。

還有一些不熟的地方,等日後弄通了再整理出來。參見CategoryProgrammerUtils

ecb


結合gdb, outline-mode...這些說起來話長,先放一張圖片供參考。下面會再提到。可以看到在History 視窗裡某些檔案icon 從綠點變成橘點,表示下面這些檔更動過
hmm.cpp
Point.h
其他沒有綠點/橘點的檔案(如chineseNL.txtP),是其他正在編輯但不相干這個工作目錄的。但在目錄視窗裡可以看到Makefile 被動過,所以在這會從綠點變成橘點,但不是emacs 弄的,所以不出現在History 視窗。


xcscope


跟著cscope 有個 xcscope ,提供cscope 支援,可以讓搜尋變數的過程更簡便。附圖可以看到xcscope 把搜尋viterbi 這個符號的兩個結果同時在%cscope%裡顯示

關於xcsope 的深入討論獨立出來,參見第三部分:xcscope整合。

XreFactory


XreFactory(下面簡稱xref)是 www.xref-tech.com 的產品。其中 c/java 是免費使用。現在是1.6.10版。
C/C++ 版現在是2.0.13版,只有八天合法試用期,過了就該買license。
參見http://www.emacswiki.org/cgi-bin/emacs-en/XreFactory

xrefactory 可以列出沒有用到的變數。當編譯時出現問題時,假如選擇查看 log 檔,*xref-log* 視窗會列出有問題的行。如同 cscope,這時用鼠標移到其中想要跳過去查看的那一行,按滑鼠中鍵或左鍵,主程式視窗列表就會跳到對應的那一行。

XreFactory會在~/下產生 .xrefrc

每次建立一個新project 時會產生一個以
[子目錄]
開頭的區塊,裡面可以設定 編譯的選項。我自己是把 make debug 放進去,在
Makefile 註明 gcc -g 好產生符號表供dgb使用。

三者整合使用


這兩者分別控制獨立相對應的主程式列表視窗。

假如螢幕夠大,建議開兩個frame ,其中一個執行 ecb ,一個不要執行 ecb。因為 xref切frame成左右兩個視窗,建議在沒有執行 ecb的frame執行xref 動作。在有執行 ecb的frame 下切到*cscope* 的 buffer執行cscope 動作

寫好直接在 emacs主選單下選 compile。
編完直接在 emacs主選單下選 tool -> debugger(GDB)

以我手上這個程式為例,跑到最後出現
Program received signal SIGSEGV, Segmentation fault.
0x00002b4736238eab in fclose () from /lib64/libc.so.6
(gdb) where
#0 0x00002b4736238eab in fclose () from /lib64/libc.so.6
#1 0x00000000004016d6 in main (argc=1, argv=0x7fff74d3e1a8) at test.c:488
(gdb)
所以就知道程式死在第488行附近

星期五, 10月 19, 2007

現代中央處理器的C 整數長度

最近要寫一些C程式處理大筆資料,有點擔心會整數溢位。
寫了個C程式試了下,發現很有意思的事

在AMD CPU 32bit Athlon gcc 4.1.2 傳回
bytes: char:1, int:4, long:4, unsign:4, unsign long:4, long long: 8

AMD 64bit Athlon gcc 4.1.2 傳回
bytes: char:1, int:4, long:8, unsign:4, unsign long:8, long long: 8

Sun Ultra sprac III (64 bit CPU) gcc 3.4.4 傳回
bytes: char:1, int:4, long:4, unsign:4, unsign long:4, long long: 8

看起來Sun 這版gcc 還停在 32 bit

其實一般應用 32 bit signed 整數(-2,147,483,648 到 2,147,483,647)已經蠻夠了。要省空間就用 short int 或 char


short int (2)
-32,768 to 32,767
(K& R 說是 -32,767)

unsigned int (4)
0 to 4,294,967,295

int (4)
-2,147,483,648 to 2,147,483,647
(K& R 說是 -2,147,483,647)

char (1)
256 character values

float (4)
1.2e-38 to 3.4e38

double (8)
2.2e-308 to 1.8e308