自从我转换为Emacs教堂以来,我一直在尝试从内部做所有事情,而且我想知道如何使用它快速有效地进行一些文本处理。

例如,让我们以我几分钟前在org-mode上编辑的此列表为例。

**迭戈:b QI
**布鲁诺·吉尔:b QI
** Koma:乔
** um:rsrs pr0n
** FelipeAugusto:特别是
**古斯塔沃·普波(GustavoPupo):平托tr等
** GP:点亮的gtk
**艾伦:乔米尔PC
**乔斯特:b hq jo 1997
**赫伯特:b rsrs pr0n
**安德烈(Andre):迈亚·米尔(Maia mil)伪
**罗德里戈(Rodrigo):c
**原因:b rsrs 7arte伪
**肯尼:克里斯gif
** Daniel:gtk mu pr0n rsrs b
**托尼:1997年特别版
** Vitor:b jo mimimi
**拉斐尔:b rpg 7arte
**卢卡(Luca):B点亮GNU PC Prog MMU 7arte 1997
** LZZ:qt
**威廉(William):1997年下半年
**史诗:gtk
** Aldo:b假pol mil皮草
**古斯塔沃·凯永(GustavoKyon)
**卡洛斯·伊萨克森(CarlosIsaksen):1997年7月艺术节
**彼得:伪pol mil est 1997 gtk点燃了朗
** leandro:b jo cb
**弗雷德里科(Frederico):7arte点燃gtk
**角色:b伪mimimi 7arte
** Mathias:乔·里特
**亨利克(Henrique):1997 h gtk qt
**eumané:qt
**海象:cri de
** FilipePinheiro:点燃的伪装
**伊戈尔(Igor):伪b
**埃里克(Erick):b jo rpg q 1997 gtk
**加百利(Gabriel):PR0N rsrs qt
**乔治:克洛米米米
**anão:hq jo 1997 rsrsclôb
**杰夫:7arte gtk
** davidatenas:一部7arte 1997 esp qt
**哈哈哈:b
**爱德华多:b

这是与标签关联的名称的列表,我想获取与名称关联的标签的列表。

在bash中,我将首先用单引号将整个粘贴的内容回显,然后将其通过管道传输到awk,遍历每一行,并将其各部分添加到正确的临时变量中,然后对其进行弄乱,直到达到我想要的样子为止。

echo'** Diego:b QI
**布鲁诺·吉尔:b QI
** Koma:乔
** um:rsrs pr0n
** FelipeAugusto:特别是
** GustavoPupo:pinto,tr等
** GP:点亮的gtk
**艾伦(Alan):乔·米尔(Jo mil PC)
**乔斯特:b hq jo 1997
**赫伯特:b rsrs pr0n
**安德烈(Andre):迈亚·米尔(Maia mil)伪
**罗德里戈(Rodrigo):c
**原因:b rsrs 7arte伪
**肯尼:克里斯gif
** Daniel:gtk mu pr0n rsrs b
**托尼:1997年特别版
** Vitor:b jo mimimi
**拉斐尔:b rpg 7arte
**卢卡(Luca):B点亮GNU PC Prog MMU 7arte 1997
** LZZ:qt
**威廉(William):1997年下半年
**史诗:gtk
** Aldo:b假pol mil皮草
**古斯塔沃·凯永(GustavoKyon)
**卡洛斯·伊萨克森(CarlosIsaksen):1997年7月艺术节
**彼得:伪pol mil est 1997 gtk点亮了朗
** leandro:b jo cb
**弗雷德里科(Frederico):7arte点燃gtk
**角色:b伪mimimi 7arte
** Mathias:乔·里特
**亨利克(Henrique):1997 h gtk qt
**eumané:qt
**海象:cri de
** FilipePinheiro:点燃的伪
**伊戈尔(Igor):伪b
**埃里克(Erick):b jo rpg q 1997 gtk
**加百利(Gabriel):PR0N rsrs qt
**乔治:克洛米米米
**anão:hq jo 1997 rsrsclôb
**杰夫:7arte gtk
** davidatenas:一部7arte 1997 esp qt
**哈哈哈:b
**爱德华多:b
'| awk'{sub(“:”,“”);对于(i = 3; i
...还有TA-DA!以直观和增量的方式在不到2分钟的时间内完成预期的输出。您能告诉我如何在elisp中(最好在emacs缓冲区中)做这样的事情,既优雅又简单?

谢谢!

最佳答案

我要做的第一件事是利用org-mode的标签支持。代替

** Diego: b QI

你将会拥有
** Diego                          :b:QI:

哪个org-mode识别为标签“b”和“QI”。

要将当前格式转换为标准org-mode格式,可以使用
以下内容(假设您的源缓冲区被称为“asdf”)
(with-current-buffer "asdf"
  (beginning-of-buffer)
  (replace-string " " ":")
  (beginning-of-buffer)
  (replace-string "**:" "** ")
  (beginning-of-buffer)
  (replace-string "::" " :")
  (beginning-of-buffer)
  (replace-string "\n" ":\n")
  (org-set-tags-command t t))

它既不美观也不高效,但是可以完成工作。

之后,您可以使用以下命令生成具有以下格式的缓冲区:
您想从shell脚本中获得:
(let ((results (get-buffer-create "results"))
      tags)
  (with-current-buffer "asdf"
    (beginning-of-buffer)
    (while (org-on-heading-p)
      (mapc '(lambda (item) (when item (add-to-list 'tags item))) (org-get-local-tags))
      (outline-next-visible-heading 1)))
  (setq tags (sort tags 'string<))
  (with-current-buffer results
    (erase-buffer)
    (mapc '(lambda (item)
             (insert (format "%s: %s\n"
                             item
                             (with-current-buffer "asdf"
                               (org-map-entries '(substring-no-properties (org-get-heading t)) item)))))
          tags)
    (beginning-of-buffer)
    (replace-regexp "[()]" "")))

这会将结果放入称为“结果”的缓冲区中,如果没有,则将其创建
已经存在。基本上,它收集缓冲区“asdf”中的所有标签,
对它们进行排序,然后遍历每个标签并使用
该标签在“asdf”中并将其插入“结果”中。

稍作清理,就可以将其转换为功能。基本上只是
用参数替换“asdf”和“results”。如果您需要做的话,我可以做
那。

关于emacs - 用elisp处理文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1994075/

10-13 07:26