如何在emacs中将哈希表导入组织模式?

时间:2014-11-17 08:21:22

标签: emacs hash elisp org-mode emacs24

我有一个哈希表,并希望将哈希表导出到组织缓冲区中。 哈希表应该打印到组织缓冲区: 拿钥匙,如果钥匙的价值不是哈希那么它就是" ::"否则,如果键的值是哈希表,则键是标题,依此类推。 Q. 我无法找到是否有进口货物。进入已经实现的组织缓冲区。如果有的话,有人可以指点我吗? 2.有人写过类似的东西吗?我可以做到(看起来很简单),但不想重新发明轮子。如果已经有一个库可以采用一个结构(哈希表)并将其导入一个组织缓冲区,那将是非常棒的。

感谢。

我提供了一个示例,表示该hash-table应该表示在org-buffer和raw hash-table中。

* key "project-example" :id: "12345" ** affected-versions :id: "12332" :name: "SlimShady" :archived: nil :release-date: "2014-10-01T04:00:00.000Z" :released: nil :sequence: 81 :assigned-to: "m&m" :attach-name: nil ** components :id: "3214" :name: "Dr.Dre" :created: "2014-11-13T15:49:15.000Z" ** customer-fld-vals: :custom-fld-id: "cust-id-112233" :key: nil :values: "Fill me" :description: nil :duedate: nil :environment: nil :fixVersions: nil :key: "project-example" :priority: "high" :project: "EX" :reporter: "YourName" :resolution: "xx" :status: "xx" :summary: "Write something here" :type: "xx" :updated: "2014-11-15T22:52:13.000Z" :votes: 0

Raw-hash(我有一个只有一个哈希的列表):

((hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data (id "12345" affected-versions #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data (id "12332" name "SlimShady" archived nil release-date "2014-10-01T04:00:00.000Z" released nil sequence 81)) assigned-to "m&m" attach-name nil components #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data (id "3214" name "Dr.Dre")) created "2014-11-13T15:49:15.000Z" customer-fld-vals #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data (customfieldId "cust-id-112233" key nil values ("Fill me"))) description nil duedate nil environment nil fixVersions nil key "project-example" priority "high" project "EX" reporter "YourName" resolution "xx" status "xx" summary "Write something here" type "xx" updated "2014-11-15T22:52:13.000Z" votes 0)))

2 个答案:

答案 0 :(得分:0)

我偷了你所有的乐趣;-)。输出与您的建议略有不同。我没有缩进叶子的标题,以便org识别结构。

(defun org-import-hash (title hash &optional level noindent)
  "Import HASH table into an org buffer.
Put TITLE into the first heading.
The hash table starts with LEVEL where LEVEL defaults to 1.
Indent inserted region by org-mode unless NOINDENT is non-nil."
  (interactive "sTitle:\nXHash-table:")
  (unless level (setq level 1))
  (let ((b (point)))
    (insert (if (or (looking-back "\n") (= (point) 1)) "" "\n") (make-string level ?*) (format " %s\n" title))
    (maphash (lambda (key val)
           (cond
        ((hash-table-p val)
         (org-import-hash key val (1+ level) t))
        ;; other special cases here
        (t
         (insert (format " :%s: %s\n" key val)))
        ))
         hash)
    (unless noindent
      (indent-region b (point)))
    ))

答案 1 :(得分:0)

评论部分不允许我使用额外字符,因此我无法在此处发布此代码。

感谢您的解决方案,它很整洁!

我是elisp的新手,并不熟悉所有功能。真的很喜欢' make-string',我的另一个选择就是我会在每个项目中保留一份星星列表,然后在必要时将它们连接起来。 在我提出这个问题之后不久,我提出了解决方案。我喜欢你的方法。

关于我的哈希的一些注意事项是所有的键都是符号因此:'(符号名称k)'

(defun ->string (whatever)
  (cond
   ((equal 'integer (type-of whatever)) (number-to-string whatever))
   ((equal 'cons (type-of whatever)) (mapconcat 'identity (mapcar '->string whatever) " " ))
   ((equal 'string (type-of whatever)) whatever)))

(defun out->print (dstring)
  (print dstring))

(defun out->buffer (dstring)
  (insert dstring))

(defun print-issues (dhash stars)
  (maphash (lambda (k v)
             (progn (if (equal 'hash-table (type-of v))
                        (progn
                          (let ((nstars (cons "*" stars)))
                            (out->buffer  (concat (apply 'concat nstars) " " (symbol-name k) "\n"))
                            (print-issues v nstars)))
                      (out->buffer (concat (replace-regexp-in-string "\*" "\s"
                                                                     (apply 'concat stars))
                                           ":"
                                           (symbol-name k)
                                           ":"
                                           " -- "
                                           (->string v) "\n")))))
           dhash))