Emacs中使用Forms-mode以表格形式展示/编辑简单的文本数据
1 Forms-mode
~~~~~~~~~~~~~
?* forms-mode涉及到兩個文件:一個數據文件,存儲了要展示的數據. 一個控制文件,描述了如何展示數據
?* Emacs中使用Forms-mode可以以表格形式展示/編輯簡單的文本數據。例如使用Forms-mode在訪問/etc/passwd時可以以如下形式展示內容。
2 進入/退出Forms-Mode
~~~~~~~~~~~~~~~~~~~~~~
?* forms-find-file
? ?使用Forms-mode打開控制文件.(注意是控制文件而不是數據文件)
? ?打開控制文件后,不會顯示控制文件的內容,相反它顯示的是相關數據文件中的一條記錄.
? ?嚴格來說,form-mode會打開兩個buffer:"forms buffer"用來打開控制文件并顯示記錄內容;"data buffer"保存數據文件但通常來說是不可見的.
?* forms-find-file-other-window
? ?類似`forms-find-file-other-window`,但顯示在另一個窗口中
?* C-x C-s(forms-save-buffer)
? ?更新數據文件
?* 退出Forms-mode的方法是,直接將forms buffer和data buffer殺掉就好
3 Forms Commands
~~~~~~~~~~~~~~~~~
?Forms-mode中,除了<TAB>,所有的命令都以C-c開頭. Forms-mode對普通模式和只讀模式下有不同的key-map,一般在可讀模式下不的按鍵要簡單許多,它不用C-c前綴,也不用加ctrl字符,例如用`n`代替`C-c C-n`
?* C-c C-n
? ?顯示下一條記錄,若加了數字參數N,則表示顯示下面第N條記錄
?* C-c C-p
? ?顯示上一條記錄,若加了數字參數N,則表示顯示上面第N條記錄
?* C-c C-l
? ?跳到指定的記錄
?* C-c <
? ?跳到第一條記錄
?* C-c >
? ?跳到最后一條記錄,該命令同時會重新計算數據文件中的記錄數量
?* <TAB>
? ?跳到當前記錄下一個域,若有數字參數N表示跳到下N個域,如果到達最后一個域,則跳轉回第一個域.
?* C-c C-q
? ?切換read-only模式
?* C-c C-o
? ?在當前記錄前插入一條新記錄. 若加了數字參數,表示新紀錄插在當前記錄后面.
?* C-c C-k
? ?刪除當前記錄
?* C-c C-s
? ?根據輸入的正則表達式向前查找記錄
?* Cc C-r
? ?根據輸入的正則表達式向后查找記錄
?* S-<TAB> forms-prev-field
? ?跳到當前記錄的前一個域
?* C-x C-s
? ?更新數據文件
?* forms-print
? ?打印格式化后的數據顯示
4 數據文件格式
~~~~~~~~~~~~~~~
?一般情況下,forms認為數據文件中的一行對應一條記錄,記錄由多個域組成,域之間由特定的分隔符分隔.
?* forms-field-sep變量
? ?數據文件中域之間的分隔符號
?* forms-read-file-filter變量 和 forms-write-file-filter變量
? ?若數據文件不是很符合規范格式,可以通過定義forms-read-file-filter將數據文件的內容轉換成符合規范的格式,并在寫回數據時,通過forms-write-file-filter轉換回之前的格式.
?* forms-multi-line變量
? ?有時候一個域的內容可能包含了換行符,若存在這種多行域,則使用該變量定義的字符來替代多行域中的換行符.
5 控制文件格式
~~~~~~~~~~~~~~~
?控制文件的格式為一段Lisp程序,在這段Lisp程序中定義了使用的數據文件和數據文件的格式與屬性.
?在控制文件中需要設置以下幾個Lisp變量
?* forms-file
? ?必設值,定義了數據文件的地址
?
?* forms-format-list
? ?必設值,該變量描述了數據文件中記錄的顯示方式.
?* forms-number-of-fields
? ?必設值,說明了每個記錄有多少個域. 若該值與記錄中的域數不讀,則發出警告. 記錄中多出的域被省略,少的域被賦值為空.
?* forms-field-sep
? ?標示了域的分隔符,默認為\t
?* forms-read-only
? ?可選項,非nil表示數據文件為只讀.
?* forms-multi-line
? ?多行域的換行符以該值代替,默認值為
?* forms-read-file-filter
? ?讀取數據文件時的轉換函數. 例如
?
?* forms-modified-record-filter
? ?該函數在記錄被修改后,在寫入數據文件之前被調用.
? ?該函數接受一個參數:一個包含記錄中域內容的vector. 域的內容從vector的第1個元素開始.該vector的第0個元素無意義.
? ?該函數需要返回傳入的這個vector參數. 例如
?
?* forms-new-record-filter
? ?該函數在調用新紀錄時被調用,一般用于設置新紀錄的初始值.
? ?類似`forms-modified-record-filter`所代表的函數,該函數也接受一個參數vector,但是該vector中各元素的值為空字符串. 該函數也需要返回該vector.
? ?例如:
?* forms-insert-after
? ?若該值為非nil則新紀錄創建時默認在當前記錄之后. 同時在打開文件時,初始位置為最后一條記錄而不是第一條記錄
?* forms-check-number-of-fields
? ?默認情況下,數據文件中的每條記錄都會被檢查是否有正確個數的域,若該值為nil,則不進行該檢查.
5.1 forms-format-list的格式說明
================================
? forms-format-list中的各元素可以是字符串,數字,list或symbol.
? * 字符串
? ? 一般作為域的說明部分,原樣顯示該字符串
? * 數字
? ? 表示記錄中的第幾個域的內容. 從1開始算起.
? * list
? ? 表示一段函數,該函數必須返回一個字符串. 在該函數中若要用到記錄中的域值,使用變量`forms-fields`代替
? * symbol
? ? 該符號執行的值必須是一個字符串,數字或者list,然后按照上面的說明進行解析.
? 下面是一個forms-format-list的例子
6 其他
~~~~~~~
?* forms-version變量
? ?forms-mode的版本信息
?* forms-enumerate
? ?設置一系列的變量值為一系列的整數值,從1開始,并返回最大值. 這樣可以在定義`forms-format-list`時用這些變量來代替數字.這些變量的名字可以說明各個域的意義. 例如
轉載于:https://blog.51cto.com/darksun/1355500
總結
以上是生活随笔為你收集整理的Emacs中使用Forms-mode以表格形式展示/编辑简单的文本数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .Net字符暂存池(String Int
- 下一篇: 通过反射--操作运行时类中的指定的属性/