2017-02-12 87 views
1

我試圖使用emacs呈現它們的顏色將幾百個短文件(〜100行ea。)另存爲Post Script(或pdf)文件。所以我寫了一個bash腳本,在emacs中打開它們並將它們保存爲.ps文件。保存shell中的彩色emacs文本

我最好的嘗試,到目前爲止是反覆使用以下命令:

emacs --file $(filename).m --no-desktop --eval '(ps-print-buffer-with-faces)' --eval '(kill-emacs)' 

然而,這直接將其發送到默認打印機。我想將它保存爲$(文件名)_PS.ps。在emacs gui中,我可以做

C-u M-x ps-print-buffer-with-faces 

它會調出文件保存提示。但是手工操作很麻煩。這怎麼可能用一個shell腳本來完成?

回答

2

簡單的答案是隻提供代碼,但後來我是一個學習和 你仍然不得不問,每次你需要Emacs的幫助! 對我來說更有趣,我會試着指引你朝着正確的方向前進 - 可能對你最初的 不那麼有趣,但是如果我做對了,你不需要在未來會問很多問題,然後必須等待對於另一個像這樣一個自以爲是的答案:)

與Emacs學習最重要的技能是如何使用內置的幫助 設施。第二個最重要的是通過閱讀 Emacs Lisp Reference(與Emacs捆綁)學習一些基本的Emacs lisp。第三是學習從零開始 你自己的癢。

你有基本的功能,所以我們可以從那裏開始。 C-H˚F PS-打印緩衝器與 - 面告訴我們....

PS-打印緩衝器與 - 面是一個交互式自動加載Lisp函數 在「PS-print.el」。

這是必然的。

(PS-打印緩衝器與 - 面向&可選FILENAME)

生成並打印緩衝器的的PostScript圖像。像 'ps-print-buffer',但在生成的圖像中包含字體,顏色和下劃線信息 。此命令僅適用於使用窗口系統的 ,因此它可以確定顏色值。

好的,但乍一看,那裏似乎沒有太多有用的信息 。但是,有一個ps-print-buffer可以點擊的鏈接。點擊 就可以了,我們得到...

PS打印緩衝區是 「PS-print.el」的交互式自動加載Lisp函數。

這是必然的。

(PS-打印緩衝器&可選FILENAME)

生成並打印緩衝器的的PostScript圖像。

交互,當你使用一個前綴參數(C-U),命令 提示輸入文件名的用戶,並在該 它的文件發送到打印機,而不是保存的PostScript圖像。

非交互式,參數FILENAME被視爲如下:如果它 爲零,則將圖像發送到打印機。如果FILENAME是一個字符串,請將PostScript圖像保存爲 具有該名稱的文件。

這給了我們更多的,包括重要的細節如何調用它 非交互的參數是該文件的寫輸出 的名字。這看起來很有希望,因爲我們不希望被強制使用C-u交互地調用這個 來打印我們想要打印的所有文件。

如果我們可以定義一個新的命令這將照顧這,我們可以只使用 M-X - 甚至更好,我們可以把它綁定到一個鍵,然後我們只需要使用 該快捷方式。

查看Emacs Lisp Reference(也與Emacs捆綁在一起),我們看到菜單 選項Command Loop。查看該節點,我們看到一個用於定義 命令的菜單選項。這看起來有希望。讀取節點和下面的一些鏈接 在該節點有關定義功能等之後,我們得到的基本出發點...

(defun buffer-to-ps() 
    (interactive) 
    ;; do something 
) 

我們提出,在劃傷緩衝和評估。不是非常令人興奮。讓我們 添加一些文檔,所以我們可以記得這是...

(defun buffer-to-ps() 
    "Write the current buffer to a PS file" 
    (interactive) 
    ;; do something 
) 

現在我們可以做C-H˚F緩衝區到PS,我們將看到我們的文檔。不過,不是 做了很多。我們需要調用我們的函數並提供一個文件名 參數。我們嘗試......

(defun buffer-to-ps() 
    "Write the current buffer to a PS file" 
    (interactive) 
    (ps-print-buffer-with-faces "test.ps")) 

隨着光標在定義的末尾,而在臨時緩衝區,我們做 C-X C-E評估我們的定義。我們嘗試在 暫存緩衝區中運行我們的新命令,我們執行M-x buffer-to-ps,並在echo區域 中看到一條消息,其中說明文件調用test.ps已寫入。使用查看器 打開該文件,我們看到該文件已創建,並具有顏色等。但是,我們 不希望所有文件被稱爲test.ps,所以現在我們需要找到一種方法來 生成一個唯一的名稱作爲文件名參數。我們有幾種方法可以做到這一點,但第一個明顯的方法是嘗試使用緩衝區的名稱 。我們使用C-h a並輸入「緩衝區名稱」,這會給出一些命中。通過列表中的 ,我們看到緩衝區名稱。做C-h f緩衝區名稱給我們

緩衝區名稱是'C源代碼'中的內置函數。

(緩衝名&可選BUFFER)

返回緩衝器的名稱,作爲字符串。緩衝區默認爲當前的 緩衝區。如果BUFFER已被殺死,則返回零。

看起來很有希望,所以讓我們試試吧。 ...

(defun buffer-to-ps() 
    "Write the current buffer to a PS file" 
    (interactive) 
    (ps-print-buffer-with-faces (buffer-name))) 

評估的定義,並在一個新的文件M-X結果運行它被 創建名爲劃傷。用ps查看器,我們看到它是我們的 緩衝區內容與顏色等所以我們已經做到了!

但是等等,我們有一個問題Huston!如果我們使用包含文件中的 內容的緩衝區運行此緩衝區,緩衝區名稱將與文件名稱相同,當我們運行我們的命令時,它將覆蓋我們的文件 - 可能不是我們想要的。

我們可能希望輸出文件與相應的腳本類似,但我們也可能想要它反映它是 腳本的postscript呈現。有幾件事我們可以嘗試,但是很懶,我們會首先嚐試最簡單的。如果我們只是生成一個附加有「.ps」 的文件名呢?這也意味着我們有一個擴展名爲 的文件名更符合文件名慣例。我們如何將「.ps」連接到緩衝區名稱返回的 文件名字符串? C-h a concat,我們得到

concat是'C源代碼'中的內置函數。

(CONCAT &其餘序列)

串連所有的參數,使結果的字符串。結果 是一個字符串,其元素是所有參數的元素。每個參數 可能是一個字符串或一個列表或向量的字符(整數)。

所以我們更新功能是...

(defun buffer-to-ps() 
    "Write the current buffer to a PS file" 
    (interactive) 
    (ps-print-buffer-with-faces (concat (buffer-name) ".ps"))) 

我們用M-X嘗試一下,並用文件最終劃傷 .PS。

所以我們現在有基本的功能。我們可以將此命令綁定到一個鍵 序列,以便當我們在緩衝區中時,我們只需點擊按鍵序列,emacs 將根據當前緩衝區名稱生成擴展名爲.ps的文件,其中包含postscript呈現緩存內容與 對應的臉部顏色。

下一步是什麼?那麼,使用這個函數需要我們首先打開 緩衝區中的文件,然後調用該函數(可能只需按一個鍵)。我們可以在早期版本中顯示的命令行上執行 它,但是啓動emacs每個時間只需要執行此操作就會效率低下。什麼是更好的方法?

要做的一件事就是定義一個函數,該函數將 目錄中的所有文件用特定文件名稱模式列出,即所有腳本文件以及它們的每個腳本文件,將它們加載到緩衝區中,然後調用您剛纔定義的函數 。這是讀者的練習!發佈更新到這個 的問題或創建一個新的,也許有人會提供一些更多的幫助:)

+0

偉大的學習經驗! – Caleb