Emacs, Vi, Lisp, Logo, 小众语言集中营
http://antkillerfarm.github.io/
emacs學習心得
emacs是大名鼎鼎的Richard Stallman的作品,我聞名已久。但作為早期一直在Windows操作系統下打拼的程序員,很少有機會用到emacs。用的最多的還是Notepad和UltraEdit。
后來,在STE工作期間,由于代碼需要上傳Linux服務器,那個服務器上的Vi又是個命令行程序,用起來很別扭。還好那上面有個GUI式的emacs,總算幫了大忙。但是emacs更深入的功能卻沒有研究,只是知道里面有了LISP語言的解釋器而已。
現將我最近用的比較多的功能羅列如下:
M-x使用技巧:M-x下輸入的命令過長的時候,可以輸入開頭的字符串,然后按TAB,emacs會顯示所有滿足輸入前綴的命令。
復制、剪切——M-w、C-w,或者用M-x cua-mode切換到CUA模式,就可以用C-c和C-v來復制粘貼了
粘貼——C-y
搜索——C-s,如果要利用剪切板的內容來進行搜索的話,使用Esc-y
搜索下一個——繼續按C-s
向前搜索——C-r
正則式搜索和普通搜索的快捷鍵類似——C-M-s和C-M-r //在ubuntu里由于C-M-s和系統快捷鍵沖突,因此可以用Esc C-s的方式啟動向前的正則式搜索。
替換——M-%
保存緩沖區——C-x C-s
十六進制模式——M-x hexl-mode
十六進制模式下跳轉到某個十六進制地址——M-g
十六進制模式退出——C-c C-c
多窗口的時候切換窗口——C-x o //”o”,not zero
關閉當前的窗口——C-x 0
只保留當前的窗口——C-x 1
新建一個上下式的窗口——C-x 2
新建一個左右式的窗口——C-x 3
打開shell——M-x shell //shell模式下,如果需要按C-c,終止程序的話,可以按兩下C-c
關閉緩沖區——C-x k
比較兩個已經打開的緩沖區——M-x ediff-buffers
比較兩個文件夾——M-x edirs
緩沖區被外部程序改變之后,重新刷新緩沖區——M-x revert-buffer
Undo——C-x u
Redo——用C-f中斷Undo執行序列,然后再Undo,就可以Undo之前做的“Undo”操作,也就是Redo操作了。
打開文件——C-x C-f//這個命令不僅可用于打開文件,還可用于確定emacs默認的操作目錄,.emacs配置文件就放在這個目錄下,這一點對Windows用戶來說十分重要。
空格變TAB——M-x tabify
在emacs中去除^M——M-x replace-string C-q C-m RET
選擇整個緩沖區——C-x h
在windows下使用ediff——windows版的emacs沒有自帶diff工具,可以用cygwin中的diff代替之,具體的辦法是將cygwin的bin文件夾加到PATH環境變量中。
高亮顯示——C-x w h//后面需要跟正則表達式,如果是要全字匹配才高亮顯示的話,可以用\的方式給出相應的正則表達式。
取消高亮顯示——C-x w r
M-x list-matching-lines 或 M-x occur——另開一個buffer列出當前buffer中所有匹配正則表達式的那些行。這個功能我找了好半天才查到,之前還以為只有UltraEdit里才有呢。。。
M-x find-grep-dired——列出文件夾下所有匹配字符串的文件的名字。這個命令只能列出文件名,而不能列出在該文件中出現的匹配字符串的位置,有的時候仍然不太好用。
M-x rgrep——這個命令可以解決上面的問題,列出匹配字符串在文件夾中所有出現的位置。
C代碼相關的內容:
選擇縮進的版式——C-c . //然后會提問使用什么風格,默認的gnu風格是縮進兩個空格,我比較喜歡bsd風格的——縮進一個TAB
代碼排版——TAB//可支持塊操作
輸入TAB——C-q TAB
塊小寫——C-x C-l
塊大寫——C-x C-u
顯示行號——(global-linum-mode t)
跳到第N行——M-g g
使用cscope+emacs在Ubuntu 12.04下的注意事項
1)除了安裝cscope還需要安裝cscope-el,不然找不到xcscope.el
sudo apt-get install cscope-el cscope
2)xcscope.el的默認路徑:/usr/share/emacs/site-lisp。安裝好之后,還需要在配置文件~/.emacs(如果當前沒有這個配置文件的話,直接創建一個即可)里面加上(require 'xcscope)。或者,如果希望在打開c或者c++文件的時候才加載xcsope,可以這樣寫:
(add-hook 'c-mode-common-hook '(lambda () (require 'xcscope)))注:Windows下創建配置文件的步驟:
1.HKEY_CURRENT_USER\Software\GNU\Emacs,注意GNU\Emacs是需要新建的。接下來在Emacs里新建一個HOME項,值是你的emacs路徑,比如我的:D:\emacs-23.1\bin。
2.把.emacs文件在這個bin目錄下。.emacs文件不能用Windows Explorer創建,但可以用Emacs保存功能來創建。
3)進入源代碼的根目錄,然后
cscope-indexer -r
即可建立索引文件。
4)添加cscope查詢的歷史功能
http://sourceforge.net/p/cscope/patches/65/
5)csope中的initial directory表示全局的搜索目錄。如果在同一個emacs實例中,打開多個工程的代碼時,不要設置這個initial directory,否則所有工程代碼都將在這個路徑下搜索,而不是在各自的路徑下搜索了。
scratch緩沖區
這是每次啟動Emacs時,默認打開的幾個緩沖區之一。正如緩沖區最上面的說明所說的,它的目的有兩個:
1.提供一個草稿緩沖區。
2.提供一個執行Emacs Lisp的緩沖區。需要執行命令的時候,將光標落在相應的Lisp命令右括號的后面,執行C-x C-e即可。
例如,計算器功能:
(+ (* 33 4) 2)
計算33*4+2,可以看出這是一個典型的逆波蘭表達式。
快速打開最近打開過的文件
在配置文件~/.emacs中添加:
(require 'recentf)
(setq recentf-max-saved-items 100)
(recentf-mode 1)
Vi
dd 刪除整行
Lisp & GUI
客觀的說,目前開源領域并沒有很好用的和Lisp配套的GUI工具集,幾個開源實現要么完工度不高,要么過于古老,好幾個的樣式都是90年代中期的風格。
更有人指出,GUI基本上是OO語言的天下了,Lisp根本不適合干這個事。
不過事實的真相是:
1.最早的交互式GUI生成工具是用Lisp寫的。沒錯,就是蘋果喬教主旗下的Interface Builder,時間是1986年。
2.PTC公司的CAD系統是用Lisp和C++寫的。
3.蘋果公司早期使用MCL作為GUI開發語言(from 1984),因此那個時代有大量的程序是用Lisp寫的。包括Mac上最早的MS Word。Objective-C是喬教主到NextStep之后的事,最初和蘋果并無交集。
4.由于Mac在藝術家群體的流行。很多音樂軟件是用Lisp寫的,包括Open Music, PWGL, ScoreCleaner, Igor Engraver和Symbolic Composer等。
5.有家叫做LispWorks(From 1989)的公司提供對Lisp GUI的商業支持,而且提供的界面并不遜色于GTK、Qt等當代GUI工具集。上面提到的音樂軟件基本上都是基于LispWorks的。
綜上可見,Lisp開發GUI不是可能性的問題,而是一個有待重新發掘的問題。
Logo語言的安裝
Logo語言是我學習計算機時的啟蒙語言。那是初一、初二的時候,當時的電腦還是運行Dos的386系統,我們在原始的命令行下,津津有味的編著代碼。那時候電腦可是稀罕物,為了節約上機時間,程序都是事先寫到小本本上的,我至今還保留著當時的作業本。
話歸正傳,說說Linux下Logo語言的安裝。
1)到Berkeley的官網下載Logo語言的源代碼
http://www.cs.berkeley.edu/~bh/logo.html
2)按照源代碼包里面readme的提示,編譯之。提示缺少libbsd和libtermcap。
3)sudo apt-get install libbsd-dev libncurses5-dev
重新編譯即可。
再一次看到熟悉的命令行界面和海龜了:)
小眾語言集中營
前言
自從John Warner Backus創立計算機語義學以來,人們發明的計算機語言已不下千種。基本上沒有人能夠對所有的語言都精通,實際上也沒有這個必要。
但我同樣不贊成只會一種語言的工程師。因為每種語言之所以存在,必然有其合理之處,只會一種語言會嚴重局限程序員的眼界。
比如說這篇文章中提到的:
http://imgtec.eetrend.com/blog/5317
“他的單位有一位寫Ruby的老員工,一個龐大的工程,代碼里面居然只有一個上帝類,就搞定了所有的問題。”
上面這句話,在文中被作者引用來作為不會設計的典范。但是看看作者的知識背景就會發現,這個作者的眼界實際上局限在了面向對象的籠子里,他以為所有的東西都要組成對象才是合理的,反而忽視了設計的目的。
我對這件事的解讀是:如果那個老員工的代碼能夠只用一個類搞定所有的問題,且代碼運行、功能擴展都沒有大問題的話,那這個老員工就是一個優秀的設計者。即使他的設計思想不是面向對象的。
Linus Torvalds在批評C++的時候,曾說過“好的設計才是第一位的,糟糕的設計用什么語言寫出來都是垃圾。”
反過來理解這句話,那就是:語言和設計思想都只是設計的外皮,而不是靈魂。
面向過程的語言
1.編譯型
首推C語言,沒有之一。其次可以學學Pascal。其他的諸如Basic、Fortran、COBOL,基本上已經成為了歷史,如果沒有工作上的需要,就不要理會了。
2.解釋型
一般用的比較多的是bash、Tcl、perl。隨便學一個即可,這三個的使用都挺廣泛的。
面向對象的語言
1.編譯型
首推C++。C++支持的編程泛型非常多,從某種意義上說,不是個純粹的面向對象的語言。如果需要開發Mac和iPhone程序的,可以學學Objective-C。
2.虛擬機型
C#和Java,隨便學一個。VB.NET、Groovy、Scala都屬備選,各有各的好處,尤其后兩者屬于現在的熱點,學學沒準就用上了。
3.解釋性
Python、Ruby,隨便學一個。
科學計算
首推Matlab。這是一種面向矩陣的語言,它的所有數據類型都被理解為矩陣,而不是對象。
函數式語言
1.Haskell
這種語言認為所有的數據類型都是函數。
2.Lisp
這種語言認為所有的數據和函數都是列表,也就是“數據結構”課程上所說的廣義表。
標記語言
1.Tex
這是《The Art of Computer Programming》一書的作者Donald Knuth的杰作。從中可以看到后來的HTML、JavaScript、CSS等的影子。MS Office中的格式刷也是參考了Tex的設計。
Tex最為稱道的是數學公式的排版。MS Office直到2007才有了類似的效果。
Tex廣泛應用于歐美國家科學論文的排版領域,成為頂級科學期刊事實上的格式標準,可說是科研狗的必備技能。
2.數據描述類
INI和Json。這兩個比較簡單,也非常好用,不多說了。備選有BSON、YAML、
3.網頁類
XML、HTML、JavaScript必修。PHP、ASP、JSP,選修其中之一。Nodejs近來比較流行,值得投資。
嵌入式語言
首推Lua。它首先在游戲領域得到廣泛使用,現在在其他領域用的也比較多了。我一直在想,如果Lua早發明30年,Emacs會不會使用Lua,而不是Lisp做為內置語言呢?
形式語言
并非所有的編程語言都具有實用性,有些語言的創制,另有其目的。
比如Brainfuck語言。這個語言以出名難用著稱,在網上,一般被歸為奇技淫巧類語言。然而從語義學的角度,這個語言證明了在馮·諾依曼模型上,最多使用8個符號,就可以構建一個圖靈完備語言。
更多這類語言的知識參見:
http://www.15yan.com/story/5Y8BZqIGwjg/
總結
以上是生活随笔為你收集整理的Emacs, Vi, Lisp, Logo, 小众语言集中营的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】主题模型
- 下一篇: linux学习心得(一)