http://emacs-doctor.com/learn-emacs-lisp-in-15-minutes.html
15分鐘…話是這麼說啦,但是總覺得…不太實際啊XD
不過順便自賣自誇一下 3 年前寫的 emacs 24中的lisp程式碼導航(code navigation)--Slime-style ... 這篇所介紹的 elisp-slime-nav ,搭配上 Xah 寫的 How to Edit Lisp Code with Emacs ,我覺得是很有幫助的,尤其是前者,它連你要找的 elisp 原碼是用C寫的都知道,而如果你真的給它原碼的位置,它也真的會幫你找到。真是太神啦~~
常用資訊速查
▼
2016年1月31日 星期日
2016年1月30日 星期六
The Roots of Lisp 讀後心得
兩年前我曾經想讀這篇 The Roots of Lisp (ref. 使用perl及mozrepl操控firefox,以及repl的引入 ), 今天再細讀了一次,總算大概明白了作者想要講的東西。
資料(data)可以變成程序(procedure)
因為資料是演算的對象、結果(=>客體),如果我們可以將它變成 procedure ,那麼 procedure 就變成是有因時制宜能力的、有智慧的程式,那不就是人工智慧(AI)了嗎?以結果論的話,那就是程式產生程式。至於中間是一定要經過演算的,那麼演算的對象、結果是以資料的形式存在,如何將結果用來產生程式?那就是 The Roots of Lisp 當中的 "eval." 求值函數的作用(之一)了。
你可能會問說那 procedure 可不可以變成 data 呢?當然可以,不過那是沒有意義的,因為 procedure 是演算的主體,它本身不承載演算的對象、結果,因此演算前後它不會變動,那麼把它變成 data 是無謂的。
當然以 John McCarthy 的所處年代,他看到的東西未必和 Paul Graham 或今日的我們看到的東西是一樣的。他做的是試圖把演算"公理化",而結果就是一套演算法/公理,只要基本的 7+2 個基本算子,就可以建構出任意複雜度的演算/程式。求值函數除了求得函數值以外,還可以把資料(函數的定義)變成程序,而在執行期賦予程式高度的可變性。
所以其實到 programming 這端其實有沒有用 eval. 其實已經不重要,在整個 Lisp 的環境中, eval. 已經默默的工作了許久了…
資料(data)可以變成程序(procedure)
因為資料是演算的對象、結果(=>客體),如果我們可以將它變成 procedure ,那麼 procedure 就變成是有因時制宜能力的、有智慧的程式,那不就是人工智慧(AI)了嗎?以結果論的話,那就是程式產生程式。至於中間是一定要經過演算的,那麼演算的對象、結果是以資料的形式存在,如何將結果用來產生程式?那就是 The Roots of Lisp 當中的 "eval." 求值函數的作用(之一)了。
你可能會問說那 procedure 可不可以變成 data 呢?當然可以,不過那是沒有意義的,因為 procedure 是演算的主體,它本身不承載演算的對象、結果,因此演算前後它不會變動,那麼把它變成 data 是無謂的。
當然以 John McCarthy 的所處年代,他看到的東西未必和 Paul Graham 或今日的我們看到的東西是一樣的。他做的是試圖把演算"公理化",而結果就是一套演算法/公理,只要基本的 7+2 個基本算子,就可以建構出任意複雜度的演算/程式。求值函數除了求得函數值以外,還可以把資料(函數的定義)變成程序,而在執行期賦予程式高度的可變性。
所以其實到 programming 這端其實有沒有用 eval. 其實已經不重要,在整個 Lisp 的環境中, eval. 已經默默的工作了許久了…
2016年1月29日 星期五
Crash Course in Spacemacs
- Button 'SPC' = M-m in vanilla Emacs mode (why oh why should I spend 10 minutes googling it...)
- check it out: https://github.com/syl20bnr/spacemacs/blob/master/doc/QUICK_START.org
- ditto : http://thume.ca/howto/2015/03/07/configuring-spacemacs-a-tutorial/
2016年1月28日 星期四
純 C 語言專案的 call graph 產生方式
參考 分析函數調用關系圖(call graph)的幾種方法 可以有個概念,目前傾向於使用 gnu cflow ,因為得到的是文字檔,既可直接進行文字註解,也可以產生圖檔,較富有彈性。安裝及使用可參考 Call Graph for C - cflow 。更詳細的說明可參考 好用的 Trace 工具 cflow 。當然,如果只有做到這樣,那 emacs 就沒有什麼好拿來說嘴的了;請安裝 cflow-mode ,直接在 call graph 中進行原始碼跳轉。直接在 emacs 中產生 cflow 的 call graph ,也只要寫個腳本就好了。
emacs的cflow-mode的快速鍵有這些:
key binding
--- -------
TAB cflow-hide-or-show-subtree
SPC cflow-scroll-other-window
1 delete-other-windows
? cflow-get-stack
E cflow-edit-out-full
R cflow-recursion-next
b cflow-backward-same-level
d cflow-display-function-other-window
f cflow-forward-same-level
n cflow-next-line
o cflow-find-function-other-window
p cflow-previous-line
r cflow-recursion-root
s cflow-find-function
u cflow-up-level
x cflow-goto-expand
DEL cflow-scroll-other-window-down
以 emacs 24.5 的原始碼來說, call graph 是非常巨大的,建議一定要加上 -b 參數; reverse graph 的話,一樣很巨大,除了加上 -b 參數這條路之外,-d 2 也是一個選項,不過減少的檔案大小大概只有25%左右,但少了一堆資訊,看各人的需求囉~~
P.S.為了在源碼間跳轉的話,可以使用 cscope ,參考2013年的拙作: ubuntu上為emacs安裝cscope以進行code navigation
emacs的cflow-mode的快速鍵有這些:
key binding
--- -------
TAB cflow-hide-or-show-subtree
SPC cflow-scroll-other-window
1 delete-other-windows
? cflow-get-stack
E cflow-edit-out-full
R cflow-recursion-next
b cflow-backward-same-level
d cflow-display-function-other-window
f cflow-forward-same-level
n cflow-next-line
o cflow-find-function-other-window
p cflow-previous-line
r cflow-recursion-root
s cflow-find-function
u cflow-up-level
x cflow-goto-expand
DEL cflow-scroll-other-window-down
以 emacs 24.5 的原始碼來說, call graph 是非常巨大的,建議一定要加上 -b 參數; reverse graph 的話,一樣很巨大,除了加上 -b 參數這條路之外,-d 2 也是一個選項,不過減少的檔案大小大概只有25%左右,但少了一堆資訊,看各人的需求囉~~
2016年1月27日 星期三
git "daily workflow"
一早起來,手上的程式還沒 push , repo 的版本已經往前狂跳了(驚),怎麼辦?
兩年前我寫過這篇:
不過時間隔太久了,我竟然要 google 才抓得到這篇文。顯然對於每日開工的流程有必要好好重新整理啊(抓頭)~~
正常來說,工作到一個預定的 milestone ,一定會主動進行 git push ,這你知、我知、獨眼龍也知,所以應該不會出現在一天開工的時候。開工時發現 repo 上的變動,大概可以分成三種:不需要 merge 、 不想 merge (喂) 、 有 conflict 需要 merge 。
- Scenario I: Nothing serious done...(那就沒什麼好擔心的啦~~)
- git pull origin master
- Scenario II: Something done, wanna undo, no conflict => rollback changes (這什麼情況?就是人家做得好,直接接收啦~~)
- git reset --hard HEAD^
- 恢復到本地端最後一次 commit 前的狀態, 但修改過的檔案仍會還原
- git pull origin master
- Scenario III: Something done, conflicts BIG TIME !!
- IIIa. just merge it (這什麼情況?就是人家做得好,merge的部分好解決,直接接收啦~~)
- git pull origin master
- merge XXXX...YYYY
- IIIb. stash->rebase->reset (merge 會很麻煩,剛開工先不要處理這麼硬的工作,晚點再說啦~~)
- git add .
- git commit -m "push to stash"
- 這個動作很重要,任何pull之前,要確保本地變動有存下來!!
- git pull --rebase origin master
- merge XXXX...YYYY (保留 repo 的版本,捨棄 local 的變動)
- git reset --soft HEAD~1
- 恢復到本地端 commit 前的狀態, 但修改過的檔案仍不變
參考資料:
emacs magit workflow
http://ergoemacs.org/emacs/emacs_magit-mode_tutorial.html
(Install magit from elpa/melpa first)
(Install magit from elpa/melpa first)
Run once under terminal/command prompt:
- git clone https://github.com/AAA/BBB.git & cd BBB(if required)
- if start from scratch, run "git init" instead
Run as you change code / debug under emacs :
- M-x magit-status (to bring up magit)
- S (= git add .)
- c c MMM C-c C-c (= git commit -m "MMM")
- P p (= git push origin master)
2016年1月26日 星期二
windows 下 emacs magit 無法 push 的問題
https://github.com/magit/magit/wiki/Pushing-with-Magit-from-Windows
真的是大杯無鹽…
真的是大杯無鹽…
emacs中bookmark plus (bookmark+)的使用 v.20160125
http://www.emacswiki.org/emacs/BookmarkPlus
用elpa裝好了以後,原則上按鍵組合與原先bookmark是相同的
(20170117特急通知:請勿更新 org 到 9.0以上版本,否則以下部分功能無法正常使用)
‘C-x p L’ (or just ‘L’ in the bookmark-list)(‘bmkp-switch-bookmark-file-create’)
這不就最基本款的嗎?是的,不過它幕後記載了不少東西,使得某些功能更為強大了,例如它會記得這個buffer上次bookmark的名字;嚴格來說它有辦法撈出最近一次的bookmark,所以當它問你這次要給bookmark什麼名字時,按下 `C-M-u' 就直接幫你打出這個名字來,文件上說真的就像實體的書籤一樣,我們通常洗手間都會擺一本連著看很容易睡著的小說,這裏面是一定要夾一個書籤的不是嗎?它就是用來記得上次看到那兒的…
預設在問你要給什麼名字的時候,提示的是這個buffer中曾經設置過的所有bookmark名字;我通常會在文章中copy一段有代表性的文字,在它提示要輸入名字時按下 C-y ,省去打字的功夫。
‘C-x j j’ (‘bookmark-jump’)
‘C-x 4 j j’ (‘bookmark-jump-other-window’)
文件寫一寫要對照原始碼時,總要回去看一下原碼,如果結合org mode在裏面加link,就可以跳轉到原始碼,這不是太好了嗎?就是有這麼好的事, bookmark 可以成為link的目的地以進行跳轉。有兩個步驟:
dired就有點像文字版本的檔案管理員,把emacs當ide時可以把它放在左上角。在這個major mode中,bookmark+會把整個dired的配置都記得,把它拿來當成專案檔的話是滿不錯的…dired的說明:
http://ithelp.ithome.com.tw/question/10138296
http://ithelp.ithome.com.tw/question/10138547
https://yfwu.gitbooks.io/emacs-manual/content/chapter3-dired.html
http://kuanyui.github.io/2014/06/21/dired-tutorial-and-essential-configs/
https://twitter.com/emacstw/status/479866473226055680
當桌面割得亂七八糟時,你會需要它的…
http://www.emacswiki.org/emacs/BookmarkPlus#toc26
預設書籤檔位置 bmkp-last-as-first-bookmark-file
用elpa裝好了以後,原則上按鍵組合與原先bookmark是相同的
(20170117特急通知:請勿更新 org 到 9.0以上版本,否則以下部分功能無法正常使用)
多個書籤檔的建立/切換
新增bookmark: bookmark-set `C-x r m', `C-x p c m'
這不就最基本款的嗎?是的,不過它幕後記載了不少東西,使得某些功能更為強大了,例如它會記得這個buffer上次bookmark的名字;嚴格來說它有辦法撈出最近一次的bookmark,所以當它問你這次要給bookmark什麼名字時,按下 `C-M-u' 就直接幫你打出這個名字來,文件上說真的就像實體的書籤一樣,我們通常洗手間都會擺一本連著看很容易睡著的小說,這裏面是一定要夾一個書籤的不是嗎?它就是用來記得上次看到那兒的…
預設在問你要給什麼名字的時候,提示的是這個buffer中曾經設置過的所有bookmark名字;我通常會在文章中copy一段有代表性的文字,在它提示要輸入名字時按下 C-y ,省去打字的功夫。
檢視bookmark list
‘C-x p e’
or ‘C-x r l’
(command ‘bookmark-bmenu-list’
)跳到指定的 bookmark
‘C-x j j’ (‘bookmark-jump’)
‘C-x 4 j j’ (‘bookmark-jump-other-window’)
與 org mode 整合,在開發程式時做文件以跳轉到原始碼,或是為你不能check out只能clone/rebase的原始碼做注解
文件寫一寫要對照原始碼時,總要回去看一下原碼,如果結合org mode在裏面加link,就可以跳轉到原始碼,這不是太好了嗎?就是有這麼好的事, bookmark 可以成為link的目的地以進行跳轉。有兩個步驟:
- 複製連結。有兩種作法,一是先按個 C-x r l 把bookmark list先帶出來,然後 C-c l (‘org-store-link’) 複製連結;嫌麻煩的話直接在 org 檔中使用 M-x
bmkp-store-org-link
在跳出的對話盒選取之前存下來的 bookmark 也行。 - 最後在要插入 bookmark link 的 org 檔中按 C-C C-l 插入連結。
結合dired記得整個buffer內容
dired就有點像文字版本的檔案管理員,把emacs當ide時可以把它放在左上角。在這個major mode中,bookmark+會把整個dired的配置都記得,把它拿來當成專案檔的話是滿不錯的…dired的說明:
http://ithelp.ithome.com.tw/question/10138296
http://ithelp.ithome.com.tw/question/10138547
https://yfwu.gitbooks.io/emacs-manual/content/chapter3-dired.html
http://kuanyui.github.io/2014/06/21/dired-tutorial-and-essential-configs/
https://twitter.com/emacstw/status/479866473226055680
bmkp-make-desktop-record 記得桌面配置 C-x p K
當桌面割得亂七八糟時,你會需要它的…
編輯bookmark list
http://www.emacswiki.org/emacs/BookmarkPlus#toc26
重要預設值
2016年1月21日 星期四
emacs lisp 學習計劃
Emacs 令人著迷卻又難以客製的原因,我想都是出自於所使用的 emacs lisp 語言。
lisp 現在的主要兩本教科書,分別是使用(號稱)精簡版的 scheme 語言的 sicp ,及使用 common lisp 的 paip。
根據此文所言,emacs lisp 應該是比較接近 common lisp ,因此似乎以學習 common lisp 是比較好的選擇。李殺則認為 common lisp 甚至不應作為學習的起點,而應該直接學習 emacs lisp;李殺網有不少學習的資料,值得好好看看,他也認為適當的結合其它腳本語言可以事半功倍,但是複雜的情況仍然需要直接使用 emacs lisp 當中的 buffer 概念來處理。
lisp 現在的主要兩本教科書,分別是使用(號稱)精簡版的 scheme 語言的 sicp ,及使用 common lisp 的 paip。
根據此文所言,emacs lisp 應該是比較接近 common lisp ,因此似乎以學習 common lisp 是比較好的選擇。李殺則認為 common lisp 甚至不應作為學習的起點,而應該直接學習 emacs lisp;李殺網有不少學習的資料,值得好好看看,他也認為適當的結合其它腳本語言可以事半功倍,但是複雜的情況仍然需要直接使用 emacs lisp 當中的 buffer 概念來處理。
2016年1月20日 星期三
這次安裝 ubuntu 15.10 遇到的問題彙整
網卡驅動程式安裝
http://www.howopensource.com/2012/05/install-broadcom-sta-b43-wireless-driver-in-ubuntu-12-04-11-10-11-04/
安裝英文版,使得中文字體全變標楷體
移除2個設定檔http://brianhu.logdown.com/posts/222914-ubuntu-14-04
變更系統字型
使用 Ubuntu tweakhttp://blog.csdn.net/tao_627/article/details/24180781
Dropbox 的安裝/執行
https://www.dropbox.com/install?os=lnxUbuntu 14.10與嘸蝦米 - 使用fcitx
http://jyc-blog.blogspot.tw/2015/02/ubuntu-1410-fcitx.htmlhttp://yuanfarn.blogspot.tw/2015/04/ubuntu-1504.html
http://www.pinyinjoe.com/linux/ubuntu-12-chinese-setup.htm
20171011更新:
下面這個連結比較精確
http://gitqwerty777.github.io/install-boshiamy-in-linux-by-fcitx/