日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Emacs中使用Forms-mode以表格形式展示/编辑简单的文本数据

發布時間:2025/3/17 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Emacs中使用Forms-mode以表格形式展示/编辑简单的文本数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 Forms-mode
~~~~~~~~~~~~~
?* forms-mode涉及到兩個文件:一個數據文件,存儲了要展示的數據. 一個控制文件,描述了如何展示數據
?* Emacs中使用Forms-mode可以以表格形式展示/編輯簡單的文本數據。例如使用Forms-mode在訪問/etc/passwd時可以以如下形式展示內容。

====== /etc/passwd ======User : root Uid: 0 Gid: 1Name : Super UserHome : /Shell: /bin/sh


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
? ?必設值,定義了數據文件的地址
?

(setq forms-file "my/data-file")


?* forms-format-list
? ?必設值,該變量描述了數據文件中記錄的顯示方式.
?* forms-number-of-fields
? ?必設值,說明了每個記錄有多少個域. 若該值與記錄中的域數不讀,則發出警告. 記錄中多出的域被省略,少的域被賦值為空.
?* forms-field-sep
? ?標示了域的分隔符,默認為\t
?* forms-read-only
? ?可選項,非nil表示數據文件為只讀.
?* forms-multi-line
? ?多行域的換行符以該值代替,默認值為
?* forms-read-file-filter
? ?讀取數據文件時的轉換函數. 例如
?

;; to maintain a gzipped database: (defun gzip-read-file-filter ()(shell-command-on-region (point-min) (point-max)"gzip -d" t t))(setq forms-read-file-filter 'gzip-read-file-filter)* forms-write-file-filter寫入數據文件時的轉換函數. 例如(defun gzip-write-file-filter ()(make-variable-buffer-local 'require-final-newline)(setq require-final-newline nil)(shell-command-on-region (point-min) (point-max)"gzip" t t))(setq forms-write-file-filter 'gzip-write-file-filter)


?* forms-modified-record-filter
? ?該函數在記錄被修改后,在寫入數據文件之前被調用.
? ?該函數接受一個參數:一個包含記錄中域內容的vector. 域的內容從vector的第1個元素開始.該vector的第0個元素無意義.
? ?該函數需要返回傳入的這個vector參數. 例如
?

(defun my-modified-record-filter (record);; Modify second field.(aset record 2 (current-time-string));; Return the field vector.record)(setq forms-modified-record-filter 'my-modified-record-filter)


?* forms-new-record-filter
? ?該函數在調用新紀錄時被調用,一般用于設置新紀錄的初始值.
? ?類似`forms-modified-record-filter`所代表的函數,該函數也接受一個參數vector,但是該vector中各元素的值為空字符串. 該函數也需要返回該vector.
? ?例如:

(defun my-new-record-filter (fields)(aset fields 5 (login-name))(aset fields 1 (current-time-string))fields)(setq forms-new-record-filter 'my-new-record-filter)


?* 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的例子

;; This demo visits `/etc/passwd'.(setq forms-file "/etc/passwd")(setq forms-number-of-fields 7)(setq forms-read-only t) ; to make sure(setq forms-field-sep ":");; Don't allow multi-line fields.(setq forms-multi-line nil)(setq forms-format-list(list"`====' /etc/passwd `===='\n\n""User : " 1" Uid: " 3" Gid: " 4"\n\n""Name : " 5"\n\n""Home : " 6"\n\n""Shell: " 7"\n"))




6 其他
~~~~~~~
?* forms-version變量
? ?forms-mode的版本信息
?* forms-enumerate
? ?設置一系列的變量值為一系列的整數值,從1開始,并返回最大值. 這樣可以在定義`forms-format-list`時用這些變量來代替數字.這些變量的名字可以說明各個域的意義. 例如

;; This sets `field1' to 1, `field2' to 2, and so on. (setq forms-number-of-fields(forms-enumerate'(field1 field2 field3 ...)))


轉載于:https://blog.51cto.com/darksun/1355500

總結

以上是生活随笔為你收集整理的Emacs中使用Forms-mode以表格形式展示/编辑简单的文本数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。