Emacs及擴展配置


Emacs及擴展配置

1 動機之反思

搗鼓了幾天,總算把Emacs配置到基本正常使用的程度了。雖然有點遲,但還是盡量將能想起的細節都記錄下來吧,否則以后要用到時都忘光了。

為什么會想轉到Emacs上呢?多年以前,當我還在讀大學時,就玩過Emacs,但是可能是覺得操作不方便,也可能是身邊有朋友在用Vim了,搗鼓了一小段時間Emacs后,就轉投向學習使用Vim了。 其實Vim作為編輯器而言非常好用,但是作為開發IDE而言,總是感覺欠缺;之前看過別人用Emacs,確實在代碼調試上有其優勢,可能就是因為這一點,一直耿耿於懷吧。 另外,在很早之前我就覺得在Emacs中顯示中文很漂亮,比Vim中顯示要漂亮些。恰好這次新買了MBP,換了OSX系統,就想在上面全新配置自己的環境。加上自己有一些任務管理、使用LaTex等的需求, 上網一搜,全都是將在Emacs上怎么實現的,於是就心癢癢想試試了。

本來想完全拋棄原先Vim的使用習慣,重新學習Emacs的各種操作的,但是每次用到Emacs那些復雜而且別扭的快捷鍵時,總是由心地希望用回Vim。我想,這就是Vim陣營的人鄙視Emacs的一大原因吧。 好在作為獨缺好編輯器的操作系統,Emacs開發者已經為我這種兩面派提供了終極解決方案:各種模仿Vi操作的擴展。最終,我使用了Evil,將ELPA中所有Evil開頭的擴展都裝了個遍,並將Emacs設 置為默認進入Evil模式,重啟生效,頓時世界一片清靜。其實我不太能理解為什么網上會有這么多Vim和Emacs之爭,為什么不能站在相互取長補短的角度來使用它們?我覺得,只有真正去用一個工具, 才能真切體會它的好;同樣,只有真正了解對手,才能發現自身的不足,也才有動力和方向去進一步完善它。當然,我只是一個純粹的實用主義者,誰能解決我的問題,予我方便,我就用哪個,如果中 間遇到什么現在還沒有的功能,而我有恰好有興趣和時間去完善,那我才會去完善,回饋相應社區。

我不知道這次用Emacs會堅持多久,或者用了一段時間后發現不習慣了,還是用回Vim了。不過自從用了Evil,我感覺還是挺順手了,現在環境也配置得七七八八了,應該夠我用一陣的了。后續如果再 遇到問題,如果有時間,我想我還是會在Emacs上折騰的。

2 它山之石

剛開始我是從零開始配置Emacs的,所有的配置都寫在~/.emacs中,基本也能工作,就是感覺自己要配置的東西太多,太繁瑣。google了一番后,找到這篇文章:一年成為Emacs高手(像神一樣使用編輯器), 里面的介紹蠻好的,作者力薦學Emacs要從使用研究大牛的配置開始,我剛剛開始學,不知道這樣是否是最佳的學習方式,因此持謹慎的保留態度,但不可否認的是,大牛們的配置確實讓我們省去了很多繁瑣, 並且,給我們的后續配置提供了一個不同於原始Emacs配置方式的擴展框架(缺點是我們必須先搞清楚大牛的框架,否則出現問題時就不知道怎么辦了)。老實說,相比Vim大牛們的配置,在網上能找到的 Emacs配置還是有點弱的,很多功能都沒有,特別是編程方面的,基本就沒有(purcell和prelude配置中對於C系的自動補全和自動縮進等都沒有配置)。 從我google的結果來看,比較普遍使用的Emacs配置集基本有幾個:purcell、prelude以及emacs-starter-kit。(注意,如果使用這些配置集,就不能添加自己的.emacs文件了,否則會導致這些配置集 失效;這些配置集內部都有機制可以讓你定制自己的功能的)

  • starter-kit:由於starter-kit的名字表明我太初級了,而我又自命不凡地覺得自己用了那么多年的Vim,不應該屬於初級那類,因此我始終沒有用starter-kit,也就無從知道它好不好用了。
  • purcell:purcell是《一年成為Emacs高手》中推薦的,作者Purcell本身是從事Web開發的,從評論上看更新有點快,所以自己配置的話,可能經常會出現配置沖突。這個配置中有個比較好的功能, 就是可以保存桌面,保存的桌面可以在下一次打開時自動載入。purcell的版本默認裝不了el-get,因為跟裝在里面的scratch擴展有沖突,我的解決方案是在git clone el-get的過程中在終端通過 sed命令將el-get中沖突的部分替換掉,或者啟動Emacs后,先將scratch卸載(在ELPA中卸載),然后執行el-get的下載腳本,安裝成功后再重啟Emacs;由於啟動時purcell配置會自動檢測更新配 置環境,因此在啟動過程中會檢測到scratch被刪除,然后重新下載安裝scratch。在purcell中,如果要加入自己的定制,則可以通過在Emacs中執行“M-x customize-variable”或者在 ~/.emacs.d/lisp/中增加init-local.el文件,這個文件相當於.emacs文件,只是記得文件最后要有一句:
    (provide 'init-local)
    
  • prelude:在網上亂搜的時候無意看到這個的,后來發現其實很多人都有推薦這個,比推薦purcell的多。它設置了一個較好的功能,就是保存“el”文件時自動編譯。如果要添加自己的東西,則可以同樣 通過“M-x customize-variable”,或者:在~/.emacs.d/personal/中添加后綴為“el”的文件,這樣prelude便會自動載入這些配置了,這點感覺比purcell的實現要靈活一些。我大概花了一天左右的 時間在prelude上安裝擴展和配置,弄得七七八八,基本能正常寫代碼了。不過后來頭腦一熱,又改成使用purcell了。現在回過頭來看,purcell和prelude相比,並沒有太多的孰優孰劣,要改成自己習 慣的環境也都得折騰一番,所以選擇哪個完全是自己喜好了。

3 擴展的管理

目前Emacs主要有兩種擴展管理器,一個是ELPA(package.el),另一個是el-get。其中ELPA是從Emacs24版本開始內置到Emacs中的,是官方的擴展管理器,但其倉庫中的擴展比較少,需要配置其他倉庫; 我加上網上搜到的幾個倉庫后,還是有些擴展找不到。el-get應該是比較老牌的擴展管理器了,安裝(參見安裝el-get )不算復雜,但是跟某些配置可能會有沖突(如在purcell的配置中,會跟其中的 scratch擴展有沖突,會提示void-variable el-get-sources);其倉庫中的擴展比較完整,而且據稱可以使用ELPA的倉庫,但我沒試過。從個人感覺而言,用el-get還是挺爽的,無奈大牛們的配置都是使用ELPA的,所以現在我也基本都是使用 ELPA了。比較討厭的是el-get和ELPA相互不知道對方裝了哪些東西,可能會造成重復安裝;如果想在el-get中安裝某個有依賴的包(如auto-complete-clang),則無論ELPA中是否已經安裝了依賴,el-get都 會將依賴安裝一遍,即浪費了空間,又可能導致不必要的沖突。

ELPA和el-get都有顯示所有擴展的命令(pacakge-list-packages和el-get-list-packages),在列表界面中,“i”標記安裝光標所在包,“d”表示刪除,“U”表示更新,完成所有想要的動作后,輸入“x”來 一次執行所有的操作。

如果要給ELPA添加其他倉庫,則在配置文件中添加諸如以下語句(可以添加多句來實現添加多個倉庫的目的):

(package-initialize)
(add-to-list 'package-archives
                '("marmalade" . "http://marmalade-repo.org/packages/") t)

4 我額外安裝的通用擴展(在purcell基礎上)

  • unicad:當打開文件時,自動猜測文件編碼,啟用后“媽媽再也不用擔心我打開文件亂碼了^_”。傳說Emacs內置也有一個猜測編碼的擴展,但我打開GBK編碼的文件時始終會亂碼,不知道是不是需要配置, 網上沒有看到相關介紹。unicad不在ELPA的倉庫中,需要通過el-get安裝或者從網上搜索手動下載安裝。配置相當簡單:
    ;; allow unicad to guess file's encoding when open a file
    (require 'unicad)
    
  • evil:我將ELPA倉庫中所有evil開頭的擴展都裝了,基本啥都不用配置,用起來跟Vim差不了多少,相當給力!
    (require 'evil)
    ;; enter evil-mode automatically
    (evil-mode 1)
    
  • yasnippet:據說如果要跟auto-complete共同使用的話,需要在auto-complete前配置:
    ;; not yasnippet-bundle, and yasnippet is conflict with yasnippet-bundle now
    (require 'yasnippet)
    (yas-global-mode 1)
    (yas-minor-mode-on)
    
  • auto-complete:蠻好用的自動補全工具。我的配置如下:
    (require 'auto-complete-config)
    ;; change the path to where your dict fold locates,
    ;; and note that the trailing '/' must present.
    (add-to-list 'ac-dictionary-directories "~/.emacs.d/elpa/auto-complete-20131128.233/dict/")
    (ac-config-default)
    
    (setq ac-auto-start t)
    (setq ac-quick-help-delay 0.5)
    (define-key ac-mode-map  [(control tab)] 'auto-complete)
    
  • auto-complete-clang-async:使用clang來掃描生成文件的符號信息,以便用於自動補全等,非常爽的功能。修改自auto-complete-clang,不同的是采用了C/S方式,即使用一個二進制程序 clang-complete來進行源碼分析,另外使用auto-complete-clang-aysnc.el來做前端,目的是提高自動補全的響應速度,避免卡頓。編譯clang-complete時,需要系統安裝有llvm(llvm-config) 和clang的頭文件,在MacOX中,可以用以下命令安裝:
    # first install llvm
    brew install llvm --with-clang --with-asan
    

    以上只是下載並編譯了llvm,生成的二進制文件存放在/usr/local/Cellar/llvm/[版本號]中(/usr/local/opt/llvm會鏈接到/usr/local/Cellar/llvm/中最新版本的llvm)。在OSX中,由於系統自帶有llvm,為了避免第三方的llvm替代系統默認的llvm而造成無法預測的問題,一般不建議在系統層面上替換llvm。如果為了省事,也可以強制安裝替換:

    # to link the binary to /usr/local/bin and /usr/local/lib/
    # if we don't link, programs that use llvm's dylib will not run because
    # they can't find the libs.
    brew link llvm --force # we have to add '--force', or we can't link llvm
    

    如果不願冒險替換,則比較繁瑣:

    (1) 在編譯clang-complete時,不能直接make,而是需要指定llvm-config的位置:

    make LLVM_CONFIG=/usr/local/opt/llvm/bin/llvm-config
    

    (2) 編譯出來的二進制是無法運行的,會出現如下錯誤:

    $ ./clang-complete
    dyld: Library not loaded: @rpath/libLLVM-3.4.dylib
      Referenced from: /usr/local/opt/llvm/lib/libclang.dylib
      Reason: image not found
    Trace/BPT trap: 5
    

    (3) 采用如下方法修改:

    sudo install_name_tool -add_rpath /usr/local/opt/llvm/lib/ /usr/local/opt/llvm/lib/libclang.dylib
    

    (4) 在每次升級llvm后,clang-complete都會出現(2)的現象而無法運行,都需要使用(3)的方法進行修改。

    ELPA中的auto-complete-clang-async.el與github倉庫中完全一致,只是從ELPA下載的擴展包中不包含C代碼,因此可以直接使用ELPA中的auto-complete-clang-async。 要讓clang-complete能正常工作,還需要將編譯好的clang-complete拷貝到~/.emacs.d/(或其他自定義的位置)中,並在.emacs或init-local.el(使用purcell的話)中進行以下設置:

    (require 'auto-complete-clang-async)
    
    (defun ac-cc-mode-setup ()
      ;; you should change the server program's path here
      (setq ac-clang-complete-executable "~/.emacs.d/clang-complete")
      (setq ac-sources (append '(ac-source-clang-async) ac-sources))
      (ac-clang-launch-completion-process)
      )
    
    (defun my-ac-config ()
      (add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
      (global-auto-complete-mode t))
    
    (my-ac-config)
    
  • google-c-style:我不喜歡它的兩字節縮進,但是既然要用,就習慣它吧,畢竟存在即合理。在其代碼中,它將回車綁定為“newline-and-indent”,這樣有個缺陷,就是無法實現回車后自動更正縮進 (比如回車后的大括號的位置),我修改它擴展中的源碼,將其改為綁定到“reindent-then-newline-and-indent”,便能滿足我的需求了。
  • auto-indent-mode:在輸入時實現自動縮進,有時很爽,有時很煩人,個人覺得有比沒有好。有了這個,google-c-style中的修改應該可以不做了(但我沒實測過)。配置如下:
    ;; note that auto-indent-mode might be conflict with yasnippet and autopair,
    ;; so we must load it first.
    ;; don't enable auto-indent-on-visit-file, or there will be error(conflict with yasnippet, maybe).
    ;(setq auto-indent-on-visit-file t) ;; If you want auto-indent on for files
    (require 'auto-indent-mode)
    ;; make auto-indent work globally
    (auto-indent-global-mode)
    
  • slime:運行lisp用的,我在系統中裝的是clisp,默認它無法識別這個,因此需要在配置文件中指定:
    (setq inferior-lisp-program "/usr/local/bin/clisp")
    

    其他就沒有什么需要配置的了。注意使用的lisp解析器是可以換其他的,之前我還試過另一個lisp解析器,忘了叫啥了,發現在使用slime時會無法使用方向鍵來調整輸入,所以就換成clisp了。

  • ecb:直接通過ELPA安裝即可。我安裝並啟用了,但還沒仔細用。
  • cal-china-x:在calendar中顯示農歷的擴展。ELPA和el-get中的版本都是0.6的,在我的Emacs24中都是無法執行的,會有錯誤。從網上找到了2.1版本cal-china-xv2.1 。我先通過ELPA安裝0.6版本, 然后將網上下載的新版本直接替換~/.emacs.d/elpa/cal-china-x-0.6目錄中的cal-china-x.el就可以了。配置很簡單:
    (require 'cal-china-x)
    ;; mark holidays in calendar
    (setq calendar-mark-holidays-flag t)
    
  • nav:比較簡便的、類似於Vim的Nerdtree的文件樹導航。輸入“.”來轉換是否顯示隱藏文件。
  • smartparens:自動輸入匹配的括號等。網上查了一下,這個似乎是自動匹配的擴展中目標最宏偉的(實現其他幾個擴展的功能),至於是不是最好用的就不知道了。purcell的配置也有自動輸入匹配括號的功能, 對emacs-lisp有效,但是對C代碼不生效,不知道為什么。smartparens簡單配置一下就基本滿足我的需求了,因此沒有進一步研究其配置項:
    ;; use smartparens
    (require 'smartparens-config)
    ;; global enabled, and use strict mode
    (smartparens-global-strict-mode +1)
    
  • evernote-mode:可以通過Emacs登錄查看evernote上的筆記,並可以進行管理(新增、修改等),我一直沒有讓它跑起來(跟其他擴展有沖突),而且看了下,這個擴展已經有幾年沒更新了。網上也說由於evernote新修改了登陸驗證方法, 導致這個擴展無法正常使用了。搞了半天沒搞定,最后把它卸載掉了。
  • epic:在Mac OSX中,可以與Evernote.app通信,從而管理evernote中的筆記的擴展。簡單地在配置文件中加入:
    (require 'epic)
    

    就可以正常使用了(如M-x epic-read-notebook),能獲取到筆記本列表,但是進一步想查看里面的筆記時,就出錯了,貌似又是與某些插件沖突了,在網上找了挺久也沒解決方案,最后還是放棄了。

5 LaTex相關的問題和配置

  • auctex:非常有名的LaTex編輯套件,直接通過ELPA安裝即可。注意Emacs默認有latex支持的,默認的latex模式名為“latex-mode”,而AUCTeX也帶了一個latex模式,名稱為“LaTeX-mode”,其他 含有“TeX”字樣的配置,應該都屬於AUCTeX的。AUCTeX提供了很多的快捷輸入方式,比如輸入“C-c C-e”可以選擇插入LaTeX環境等。以下是我目前的配置:
    (setq TeX-auto-save t)
    (setq TeX-parse-self t)
    (setq-default TeX-master nil)
    ;; set default tex engine to xetex, which has better support for chinese
    (setq TeX-engine 'xetex)
    ;; generate pdf rather then dvi
    (setq TeX-PDF-mode t)
    (setq latex-run-command 'xetex)
    (add-hook 'LaTeX-mode-hook 'auto-fill-mode)
    (add-hook 'LaTeX-mode-hook 'flyspell-mode)
    (add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
    (add-hook 'LaTeX-mode-hook 'turn-on-reftex)
    (add-hook 'LaTeX-mode-hook 'turn-on-cdlatex) ; auto enable cdlatex-mode when use auctex
    (setq reftex-plug-into-AUCTeX t)
    ;; add "-shell-escape" option to LaTeX command, which is needed by packages like minted
    (eval-after-load "tex"
      '(setcdr (assoc "LaTeX" TeX-command-list)
               '("%`%l%(mode) -shell-escape%' %t"
                 TeX-run-TeX nil (latex-mode doctex-mode) :help "Run LaTeX")
               )
      )
    
  • cdlatex:方便輸入latex標記的擴展(如輸入“it TAB”就輸入\itemize組),確實省了很多輸入的麻煩。
  • auto-complete-auctex:利用auto-complete和yasnippet完成自動補全功能。剛裝,還不知道好不好用。
    (load "~/.emacs.d/3rd-party/auto-complete-auctex/auto-complete-auctex.el")
    (require 'auto-complete-auctex)
    
  • 使用xetex作為引擎:xetex使得能夠使用系統已安裝的字體,並且默認處理Unicode,使得中文處理變得簡單。

6 org模式相關的問題、擴展及配置

org模式提供了一種簡易(純文本)、方便以及美觀的方式來記錄,根據官方文檔,主要適用於記錄TODO、寫項目計划等。網上看很多人用了后都覺得很爽,於是出現了基於org的各種應用,如導出成其他 格式(PDF、HTML等)、利用org模式來寫博客等。當然,目前這篇文章也是使用org模式編寫的(之前直接在Evernote中寫,結果發現有很多排版問題,很煩),嘿嘿。之前也一直在想要使用LaTeX 來寫文章,但是對於我這個初學者來說,要記憶LaTeX中的諸多格式和宏,實在太有難度了。org模式提供了比較簡單的格式,又能導出為各種格式,還能在里面嵌入LaTeX片段,各種好用的功能,確實是 一個不錯的選擇。從我配置的結果來看,導出為HTML要比導出為PDF好看多了,可能是導出成LaTeX還需要更多、更細致的配置吧。

  • org2blog:可以通過Emacs得org模式寫博客,並提交到配置的博客上的擴展。依賴於metaweblog擴展,一個博客API協議。要能夠正常使用這個擴展,需要目標博客(如wordpress)支持比較全的 metaweblog的API,而目前國內的博客(如博客園、CSDN以及新浪博客等)似乎都支持不是很全面,所以始終無法正常使用。配置如下:
    (require 'org2blog-autoloads)
    ;; the blog account detail
    (setq org2blog/wp-blog-alist
          '(("cnblogs"
             :url "http://www.cnblogs.com/[user]/services/metaWeblog.aspx"
             :username "name"
             :default-title "Hello World"
             :default-categories ("org2blog" "emacs")
             :tags-as-categories nil)
            ("another-blog"
             :url "http://username.server.com/xmlrpc.php"
             :username "admin")))
    
  • org導出為pdf:
    (require 'org-latex)
    
    ;; when export to latex, use minted, rather then listings
    (setq org-latex-listings 'minted)
    (add-to-list 'org-latex-packages-alist '("" "minted"))
    ;; add frame and line number for source code(using minted)
    (setq org-latex-minted-options
          '(("frame" "single")
            ("linenos" "true")))
    
    ;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
    ;; but adapted to use latexmk 4.20 or higher.
    (defun my-auto-tex-cmd (backend)
      "When exporting from .org with latex, automatically run latex,
         pdflatex, or xelatex as appropriate, using latexmk."
      (let ((texcmd)))
      ;; default command: oldstyle latex via dvi
      (setq texcmd "latexmk -dvi -pdfps -quiet %f")
      ;; pdflatex -> .pdf
      (if (string-match "LATEX_CMD: pdflatex" (buffer-string))
          (setq texcmd "latexmk -pdf -quiet %f"))
      ;; xelatex -> .pdf
      (if (string-match "LATEX_CMD: xelatex" (buffer-string))
          (setq texcmd "latexmk -pdflatex=xelatex -shell-escape -pdf -quiet %f"))
      ;; LaTeX compilation command
      ;; note that 'org-latex-to-pdf-process' now is renamed to 'org-latex-pdf-process'
      (setq org-latex-pdf-process (list texcmd)))
    
    ;; org-export-latex-after-initial-vars-hook has been removed from org-v0.8
                                            ;(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-cmd)
    (add-hook 'org-export-before-parsing-hook 'my-auto-tex-cmd)
    
    
    ;; Specify default packages to be included in every tex file, whether pdflatex or xelatex
    (setq org-latex-default-packages-alist
          '(("" "graphicx" t)
            ("" "longtable" nil)
            ("" "float" nil)))
    
    (defun my-auto-tex-parameters (backend)
      "Automatically select the tex packages to include."
      ;; default packages for ordinary latex or pdflatex export
      (setq org-latex-default-packages-alist
            '(("AUTO" "inputenc" t)
              ("T1"   "fontenc"   t)
              (""     "fixltx2e"  nil)
              (""     "wrapfig"   nil)
              (""     "soul"      t)
              (""     "textcomp"  t)
              (""     "marvosym"  t)
              (""     "wasysym"   t)
              (""     "latexsym"  t)
              (""     "amssymb"   t)
              (""     "hyperref"  nil)))
    
      ;; Packages to include when xelatex is used
      (if (string-match "LATEX_CMD: xelatex" (buffer-string))
          (setq org-latex-default-packages-alist
                '(("" "fontspec" t)
                  ("" "xunicode" t)
                  ("" "url" t)
                  ("" "rotating" t)
                  ("american" "babel" t)
                  ("babel" "csquotes" t)
                  ("" "soul" t)
                  ("xetex" "hyperref" t))))
    
      (if (string-match "LATEX_CMD: xelatex" (buffer-string))
          (setq org-export-latex-classes
                (cons '("article"
                        "\\documentclass[11pt,article,oneside]{memoir}"
                        ("\\section{%s}" . "\\section*{%s}")
                        ("\\subsection{%s}" . "\\subsection*{%s}")
                        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
                        ("\\paragraph{%s}" . "\\paragraph*{%s}")
                        ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
                      org-export-latex-classes))))
    
    ;(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-parameters)
    (add-hook 'org-export-before-parsing-hook 'my-auto-tex-parameters)
    

    上述配置解決的問題主要有:

    • 當org文檔中含有“#+LATEXCMD: xelatex”的文件頭時,使用xelatex作為編譯程序,並使用額外的宏包,避免默認使用的inputenc包等導致xelatex無法編譯通過。
    • 從org導出成tex時,使用minted來替代listings。minted和listings都能提供代碼美化功能,但是minted的格式更簡單些。
    • 由於minted需要用pygmentize程序來生成代碼高亮的轉化代碼,因此在調用latex時要加入“-shell-escape”參數。
    • 設置minted的顯示格式為帶邊框,且顯示行號。

7 其他遇到的問題及解決

  • 找不到/usr/local/bin/中的二進制:
    ;; default path doesn't contain "/usr/local/bin", cause some "command not found"
    ;; issues, so I add the path here
    (setq exec-path (append exec-path '("/usr/local/bin")))
    
  • 默認顯示行號:
    (global-linum-mode t)
    
  • 保存session等時總是提示文件編碼問題。原因是默認情況下,Emacs保存文件都使用ASCII編碼,這樣在保存的文件中含有中文等多字節字符時,就會出現編碼問題。解決方法:
    ;; set default encoding to utf-8
    (setq-default buffer-file-coding-system 'utf-8)
    ;; set writing buffer default to utf-8, or emacs always show encoding
    ;; problem when saving files.
    (setq save-buffer-coding-system 'utf-8)
    (setq coding-system-for-write 'utf-8)
    
  • 在Emacs中顯示斜體中文時,無法正常顯示,只顯示方塊的問題。原因是因為Emacs沒有為斜體設置中文字體,解決方法(Mac OSX中):
    ;; set Chinese font, or the when showing Italic Chinese characters, only rectangle block shown
    (set-fontset-font
     (frame-parameter nil 'font)
     'han
     (font-spec :family "Hiragino Sans GB" ))
    

8 總結

  • 缺點/抱怨
    • 在網上能找到的基礎配置功能不齊全,僅提供了基礎框架,且后續自定義配置中又諸多的坑,卻在其配置說明中很少提及
    • 很多問題能夠在網上找到相近解決方案,但該解決方案往往是過時的(如:新版本中已采用新的變量名;解決方法中使用的hook已經失效等)。如果仔細查看問題擴展的源碼的注釋,會發現很多問題在注釋中是有說明解決方法的。
    • 啟動速度着實不敢恭維,使用我目前的配置,在我I7的本子上要十來秒才完全載入。沒
    • 我比較習慣在Shell中查找並打開想打開的文件的(習慣了在終端中使用Vim),對於沒有了GUI就少了很多功能的Emacs,感覺就少了些流暢。
  • 與Vim相比的優勢
    • 字體渲染十分漂亮
    • 與Vim不同,Emacs窗口可以顯示的內容更豐富些,比如不同內容字體大小、格式不同,甚至還可以顯示圖片
    • 更加方便的代碼調試環境。相比VS、Eclipse等IDE還是要差一些,但是比Vim要好一些了。
    • 更強大的auto-complete功能,相比Vim的代碼自動補全也更容易配置一些,並且除了補全,還有補全內容的幫助信息同步提示。
    • 可配置性更強。理論上是無所不能的(Emacs是一個操作系統,只是缺少好的編輯器~~)

Author: Rex Shen

Created: 2013-12-20 Fri 00:46

Emacs 24.3.1 (Org mode 8.2.4)

Validate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM