您好, 訪客   登錄/注冊

Emacs配置與擴展技術

來源:用戶上傳      作者:

  摘  要:Emacs是高擴展性的編輯器,可通過配置支持多種復雜編輯模式。不同于其它編輯器的簡單配置腳本,Emacs的配置和擴展是通過 Emacs-lisp語言完成的,Emacs配置普遍被認為是較為復雜的和難以掌握的。文章著重探討并分析了Emacs配置與擴展的相關技術。
  關鍵詞:Emacs;Lisp;配置;擴展
  中圖分類號:TP391 文獻標志碼:A 文章編號:2095-2945(2019)16-0134-03
  Abstract: Emacs is a highly extensible editor that can be configured to support a variety of complex editing modes. Unlike the simple configuration scripts of other editors, the configuration and extension of Emacs is done through the Emacs-lisp language. Emacs configuration is generally considered to be more complex and difficult to master. This paper mainly discusses and analyzes the related technologies of Emacs configuration and extension.
  Keywords: Emacs; Lisp; configuration; extension
  1 Emacs簡介
  Emacs是著名的文本編輯器,最初是在上世紀70年代完成。Emacs是“Editing MACros”的縮寫,意為宏編輯器。不同于一般的編輯器,Emacs具有極強的可擴展性。在文本編輯之外,Emacs通過與其他工具結合起來能夠支持各種語言程序開發,上網和新聞組,文件和系統管理,撰寫文章等一系列功能,成為一個具有強大功能且高度集成的生產力工具。
  2 Emacs與常見文本編輯器配置方式比較
  2.1 Emacs和Vi比較
  Emacs和Vi是深受程序員喜愛的兩大編輯器,各有特點。Vi是著名的輕量級文本編輯器,在完成輕量級任務時有很大優勢,比如簡單調整系統配置,遠程終端的簡單訪問和操作。Vi的強大之處在于其編輯快捷鍵易用,和終端無縫結合。相比之下,Emacs復雜度要高很多,但在處理復雜任務,大量不同類型的文件時,Emacs將更有優勢。值得注意的是,Vi也需要通過一定配置才能發揮較強的功能,比如大部分程序員為了方便開發,還是結合多個較復雜插件將Vi配置為集成開發環境。在這個角度上,Vi擴展的編寫不如Emacs用Lisp語言開發那么方便,雖然理論上Vi也是可以用通用語言Python去擴展的,但畢竟不是原生的擴展語言。事實上通過合理配置,Emacs其實是可以模擬大部分Vi的特性的,這也是目前比較流行的模式,不使用原生的Vi,而是把Vi的特性結合進入Emacs中,兩者兼用。這個思路是目前大多數流行的Emacs配置采用的。
  2.2 Emacs和Sublime Text,VS Code比較
  近些年也有一些新的可擴展文本編輯器,比較有名的有Sublime Text,微軟寫的VS Code,這些工具也都意在提供高可擴展性的編輯工具,尤其是多種語言程序的開發工具。這些編輯器優勢在于易于上手,其擴展性更多的是通過官方豐富的插件來完成的,對于新手更加友好。用戶也可以通過簡單腳本文件定制編輯器特性,不過其所支持的定制語言不夠強大,定制復雜配置是不容易的。相比而言,Emacs的可擴展性更強,定制方式更加靈活,所以很多人依然選擇使用Emacs而不是轉入新的文本編輯工具。對于經驗豐富的編程人員來講,Emacs更容易按照自己的工作習慣加以配置和擴展,在眾多工具中依然是最佳的選擇。Emacs的另一個優勢之處是可以和系統結合,不僅僅限制在集成開發環境這樣一個功能,而是可以擴展為可以替代Office,圖片瀏覽器,網頁瀏覽器等軟件的多功能集成工具。這是目前任何一款可擴展文本工具都是無法做到的,這也是Emacs作為一個古老軟件至今依然保持開發活躍的原因。當然,Emacs開源和社區高度開放的特性也是其優勢之處和更容易擴展的原因之一。
  3 Emacs配置與擴展技術
  3.1 Emacs-lisp擴展編程
  Emacs配置與擴展可以通過Emacs-lisp語言開發。Emacs-lisp語言是Lisp語言的一種方言。Lisp是早期的程序設計語言之一,其語言設計源于lambda計算理論,語言簡潔并能夠優雅的支持目前主流的程序設計范式。Emacs-lisp包含完整的Lisp語言特性,這是由于Emacs底層用C語言實現了Lisp的解釋器和基本的內置編輯函數。因此Emacs的大部分功能是由Emacs-lisp實現的,同樣也可以用Emacs-lisp語言方便的進行擴展,進一步Emacs-lisp語言也可直接訪問Emacs的內置功能函數接口。這樣的特性使得使用Emacs-lisp進行程序設計和Emacs配置開發非常方便。
  3.2 Emacs配置加載
  Emacs的入口文件可以是~/.emacs或者~/.emacs.d/init.el。常見的方式是使用后者,因為后者有利于模塊化配置程序。Emacs配置一般是有一定規模的復雜程序,模塊化設計可以使配置程序易讀易改。Emacs-lisp語言的每一個模塊對應一個文件,在文件尾部使用provide使模塊可被其它程序引用,引用方式是通過require指定,從而加載模塊中的所有變量和函數,使其對當前程序可見。為了模塊能被Emacs發現并正確加載,通常需要在init.el文件開始部分使用load-path指定所需所有模塊的路徑,作為加載配置的起始點。Emacs加載模塊并非只有這一種方式,事實上,為了加快Emacs的啟動速度,不是所有模塊都在init.el初始化時加載。最好的加載實踐是在Emacs啟動時僅加載基本模塊,其它功能模塊時在被使用時動態加載,比如啟動時不加載Python開發相關模塊,而且在打開Python文件進行編輯時才加載。有兩種方式可以實現動態模塊加載,不使用第三方工具的情況下,可以用autoload設置動態加載的函數,結合宏with-eval-after-load指定動態加載配置代碼,實現模塊函數當調用時才加載,相關函數在模塊加載后才執行。目前比較流行的方式是使用第三方工具use-package,該工具包定義了use-package宏,能夠以簡潔的方式指定模塊中需要動態加載的函數和變量,以及指定配置代碼與模塊加載的相對順序。   3.3 Emacs功能配置
  使用Emacs-lisp語言可以擴展Emacs功能,但是功能實現的方法與一般的程序設計并不完全相同。Emacs作為一個軟件項目,功能實現是遵循一定結構的,這個結構的基礎就是Major-mode和Minor-mode。Major-mode是Emacs支持多種類型文件編輯的基礎,每一種文件類型就對應一個Major-mode的設計。不同的文件類型可以是各種程序設計語言,如python-mode,c-mode等,也可以是各種標記語言,如用于文檔寫作的auctex-mode和用于繪制圖結構的dot-mode等,也可是其它多種工具緩沖區,比如終端,圖片瀏覽器等。Minor-mode是對Major-mode功能的補充,通常是多個類型文件共有的某種功能,比如linum-mode設置文件的行號顯示,company-mode用于文件編輯的自動補全,這個補全既可以是編程變量名和函數名的補全,也可以是文檔寫作的英文單詞和漢字短語的補全。因此,對Emacs功能的擴展就是建立在對Major-mode和Minor-mode的個性化定制基礎上的。對于Major-mode可以通過add-hook來添加配置,配置代碼寫在其參數函數的內部。對于沒有可用的Major-mode,也可以自己定義一個Major-mode,定義時的代碼要遵循Emacs-lisp Major-mode 結構規范來完成。Minor-mode的定制可以通過直接設置參數變量來完成,有時也需要在特定的Major-mode的配置中分別對Minor-mode進行設置。
  3.4 使用Python擴展Emacs
  在大多數情況下,使用Emacs-lisp語言擴展Emacs是比較容易和方便的。但對于有些個性化定制比較獨特的情況,Emacs-lisp會缺乏相應的功能包,使得定制編程比較復雜,這就需要有一種通用語言來支持。通用語言往往具備更豐富的生態環境,比如要使Emacs成為一個論文管理器,需要對bibtex進行解析,這個在Emacs-lisp中并沒有相關的工具,但在通用語言中一般都有相應的支持,比如Python。Pymacs是一個可以使Python與Emacs-lisp混合編程的工具,使用Pymacs可以用Python語言擴展Emacs-lisp的程序。Pymacs包含兩個部分:pymacs.el是一個Emacs的模塊,需要放置在可加載的路徑下,并在配置文件中顯示加載;pymacs.py是Python模塊,需要安裝到系統Python的第三方庫中。在配置好Pymacs后,就可以用python-load來加載自定義Python模塊中的函數了,函數名在Emacs-lisp中被加上參數指定的前綴。另外pymacs還提供更多功能函數如python-call,python-exec等,使混合開發更為靈活。
  3.5 使用系統功能擴展Emacs
  Emacs本身是一個編輯前端,在多種支持復雜編輯模式的時候大量用到了操作系統提供的工具,比如用于文本檢索的grep,用于版本控制管理的git,用于文檔寫作的latex等等。為了使Emacs基于后端操作系統工具提供界面,實際上需要Emacs能夠方便訪問到操作系統可執行命令。最直接的一種方式是通過內置功能函數shell-command直接調用shell命令,比如為打開網頁文件或者打開pdf文件指定可執行程序就可以直接用這種方式在配置文件中設置,通過鍵映射可以把定制的命令映射為編輯快捷鍵,實現一鍵調用。另一種方式是第三方模塊中用到某些內置功能函數,比如拼寫檢查用到ispell,文檔寫作用到xelatex,這需要Emacs與操作系統共享其環境變量,有許多這方面的插件提供了把系統環境變量導出到Emacs的功能。Emacs作為一個文本編輯器,其文本編輯和導航的功能因為操作系統的支持而變得強大。借助系統拼寫工具可以用拼寫工具自動檢查拼寫,借助系統文本檢索工具,可以支持遞歸目錄下多文件內、多緩沖區內、項目多文件內正則文本檢索。結合多文件檢索和helm可以生成多條目錄形式的切換選項,形成方便的導航功能。結合多文件檢索和iedit,可以實現遞歸目錄下多文件編輯替換,其原理是把檢索到的文件以條目形式整合到一個緩沖區內,在該緩沖區內可以使用各種編輯工具同時替換多個文件的內容,甚至可以用vi命令做基于正則表達式的復雜替換。有了操作系統工具的強力支持,Emacs就擁有了多文件編輯和檢索,latex文檔書寫,圖片循環查看,pdf文件閱讀,甚至上網瀏覽網頁,網絡即時通信等功能,如果配置足夠豐富,可以在日常計算機使用中幾乎不必打開任何其它圖形用戶界面軟件。Emacs還以多種方式支持終端,也就是說終端也不必單獨打開,而是在Emacs中開一個緩沖區使用即可。eshell是用Emacs自帶的終端模擬,能夠模擬終端的大部分功能,除了可以執行shell命令外還可以執行Emacs-lisp命令,用起來十分方便。eshell另一個非常有用的功能就是對于遠程機器和虛擬容器的遠程目錄訪問提供了強大支持,cd命令可以直接進入到遠程目錄里,只需要指定遠程機器或者虛擬容器的用戶和訪問路徑。
  參考文獻:
  [1]Debra Cameron, James Elliott, Marc Loy. Learning GNU Emacs, 3rd Edition. O'Reilly, 2004.
  [2]Eric S. Raymond. Unix 編程藝術[M].電子工業出版社,2006.
轉載注明來源:http://www.hailuomaifang.com/1/view-14871994.htm

?
99久久国产综合精麻豆