当前位置: 首页 > news >正文

table 内 下拉列表 被遮挡_Emacs Hack - 通过列表数据创建表格

ccead3d060258303d305655db59a29a7.png

问题描述

OrgMode内置的创建表格的函数是 org-table-create , 传入"列数x行数"参数即可生成特定行数、列数的表格。这种交互函数在编写org文档时很实用,但在代码中却显得鸡肋。因为在代码中,我们通常希望表格和数据可以一起生成,而不是手动添加数据。

我在折腾 gk-habit.el 时,就产生了这样的需求:生成习惯的月度打卡视图。就像下面这个样子:

9b67a11f63276b3b5db05fa3a9fe9116.png

思路分析

解决这个问题的关键是把握几个操作org表格的函数 org-create-table, org-table-next-field, org-table-insert-hline, org-table-kill-row… 然后就是在表格创建的过程中依次插入数据。用于创建表格的每一行的数据用列表表示,分隔线用 hl 对象表示。

  • 首先创建一个一行n列的表格,因为 org table 的函数只有在表格内才能使用。其中n为每行元素的个数。
  • 在数据列表中循环,如果元素是一个list,表示是数据。继续在该list中循环,插入数据后跳到下一个单元格(注意数字要转为字符串)。
  • 如果元素是 hl 对象,表示是分隔线,直接插入一行分割线 (org-table-insert-hline 1)
  • 每一行插入最后一个数据后会执行“跳到下一个单元格”的操作,当右边没有单元格时会自动插入新的一行。
  • 因此,最后会多出一行,用 org-table-kill-row 函数删掉。

代码实现

(defun gk-org-table-create (LIST)
  "Create org table from a LIST form at point."
  (let ((column (catch 'break
          (dolist (row-data LIST)
            (when (listp row-data)
              (throw 'break (length row-data))))))
    (beg (point)))
    (org-table-create (concat (number-to-string column) "x1"))
    (goto-char beg)
    (when (org-at-table-p)
      (org-table-next-field)
      (dotimes (i (length LIST))
    (let ((row-data (nth i LIST)))
      (if (listp row-data)
          (dolist (data row-data)
        (cond
         ((numberp data)
          (insert (number-to-string data)))
         ((null data)
          (insert ""))
         (t (insert data)))
        (org-table-next-field))
        (when (equal 'hl row-data)
          (org-table-insert-hline 1)))
      (when (= i (1- (length LIST)))
        (org-table-kill-row))))))
  (forward-line))

使用案例

(gk-org-table-create
 '(("n1" "n2" "n3" "n4" "n5")
   hl
   (1 2 3 4 5)
   (6 7 8 9 10)
   hl
   ("c1" "c2" "c3" "c4" "c5")
   hl
   ("a" "b" "c" "d" "e")
   ("f" "g" "h" "i" "j")))

524e7cd7928ba9a3bc47975610a7ad6b.png

实现开篇提出的习惯打卡的视图是个更复杂的问题,这里涉及到了不同月份的天数不同,起始星期不同,以及每天对应的打卡状态不同等问题。解决了这些问题后,将得到的数据整合成 gk-org-table-create 合法的数据列表形式即可生成相应的表格。相关代码在这里。

如果你有更简单、漂亮的实现,欢迎留言探讨~

原文地址:
Emacs Hack - 通过列表数据创建表格​geekinney.com

相关文章:

  • 取出url中的字符_python爬虫,解决大众点评字符库反爬机制的经验
  • 单调有界定理适用于函数吗_实数系的连续性定理
  • java map获取第一个值_深入理解 Java 函数式编程(4): 使用 Vavr 进行函数式编程...
  • 层次聚类算法_聚类分析算法
  • centos如何复制粘贴_教你Vim编辑器,如何删除一行或者多行内容
  • java更改模块状态_2020年4月Github上最热门的Java开源项目
  • 佳能g3800故障灯说明书_啄木鸟家庭维修|天花机故障灯闪什么问题
  • 曲面积分的投影法_第二型曲面积分的投影法与对称性
  • python常用包及主要功能_python常用包及功能介绍
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • amd关闭超线程_直接提高40帧?超线程开启/关闭游戏对比测试
  • easyui 控制某列显示不显示_称重显示控制器工作原理
  • python编写脚本教程_Python编写生成验证码的脚本的教程
  • python中图例legend标签内容_关于python 的legend图例,参数使用说明
  • 45个python入门案例_Python入门教程:15道不容错过的Python基础入门小案例
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Android单元测试 - 几个重要问题
  • Android开源项目规范总结
  • C++类中的特殊成员函数
  • css系列之关于字体的事
  • exports和module.exports
  • github指令
  • JavaWeb(学习笔记二)
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • python 装饰器(一)
  • Swift 中的尾递归和蹦床
  • vagrant 添加本地 box 安装 laravel homestead
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 爱情 北京女病人
  • 从setTimeout-setInterval看JS线程
  • 基于webpack 的 vue 多页架构
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 通信类
  • 再次简单明了总结flex布局,一看就懂...
  • 正则表达式小结
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (3)(3.5) 遥测无线电区域条例
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (Note)C++中的继承方式
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (一)基于IDEA的JAVA基础10
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)平衡树
  • .NET 反射的使用
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .netcore 获取appsettings
  • .NET企业级应用架构设计系列之开场白
  • :not(:first-child)和:not(:last-child)的用法
  • @private @protected @public
  • @RequestBody与@ModelAttribute
  • [Android] 240204批量生成联系人,短信,通话记录的APK