Emacs中使用Forms-mode以表格形式展示/编辑简单的文本数据
2015-05-26 07:33
549 查看
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`时用这些变量来代替数字.这些变量的名字可以说明各个域的意义. 例如
~~~~~~~~~~~~~
* forms-mode涉及到两个文件:一个数据文件,存储了要展示的数据. 一个控制文件,描述了如何展示数据
* Emacs中使用Forms-mode可以以表格形式展示/编辑简单的文本数据。例如使用Forms-mode在访问/etc/passwd时可以以如下形式展示内容。
====== /etc/passwd ====== User : root Uid: 0 Gid: 1 Name : Super User Home : / 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 ...)))
相关文章推荐
- Emacs中使用Forms-mode以表格形式展示/编辑简单的文本数据
- 树结构数据的展示和编辑-zTree树插件的简单使用
- 基于Bootstrap使用jQuery实现简单可编辑表格
- 使用函数计算对表格存储中数据做简单清洗
- python3+PyQt5 使用自定义模型保存数据并通过不同视图形式展示数据
- 教你一天玩转JavaScript(六)——使用JavaScript完成后台数据展示表格的隔行换色
- EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:使用BootstrapPagination以分页形式展示数据信息
- EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:使用BootstrapPagination以分页形式展示数据信息
- EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:使用BootstrapPagination以分页形式展示数据信息
- WPS将网上下载的文本文档数据转换为WPS表格文档形式
- python3+PyQt5 使用自定义模型保存数据并通过不同视图形式展示数据
- 使用easyui实现数据表格行内编辑以及将表中数据传到后台的一系列操作
- Web基础入门(表格)-使用表格嵌套的形式制作一个简单的网页布局
- 使用Shell进行Mysql间数据以文本形式传输及注意事项
- 使用该JavaBean可以将数据在JSP页面中以表格的形式显示出来,并具有动态排序、动态生成查询、自动分页功能
- 使用 Emacs PO mode 编辑 django PO 文件
- JS操作DOM 使用表格动态展示数据
- emacs orgmode 简单文章编辑示例
- JSP基础语法之一:Scriptlet使用、简单的JSP获取表单数据再输出表格
- 使用Jquery实现可编辑的表格 并使用AJAX提交到服务器修改数据