<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>org on QL&#39;s blog</title>
    <link>/tags/org/</link>
    <description>Recent content in org on QL&#39;s blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 26 Jun 2022 17:34:00 +0200</lastBuildDate><atom:link href="/tags/org/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Decluttering org headings: Removing extranous IDs</title>
      <link>/posts/remove-extranous-org-ids/</link>
      <pubDate>Sun, 26 Jun 2022 17:34:00 +0200</pubDate>
      
      <guid>/posts/remove-extranous-org-ids/</guid>
      <description>If you&amp;rsquo;ve ever tried to use dengste/org-caldav: Caldav sync for Emacs orgmode to synchronize your org calendar, you may have noticed that it adds an ID to all headings by design. For some, these extra PROPERTIES blocks can be quite distracting. To address this, I proposed a patch to create IDs for only relevant headings here: https://github.com/dengste/org-caldav/issues/227.
However, if it&amp;rsquo;s already too late, here is a script to clean things up.</description>
      <content>&lt;p&gt;If you&amp;rsquo;ve ever tried to use &lt;a href=&#34;https://github.com/dengste/org-caldav&#34;&gt;dengste/org-caldav: Caldav sync for Emacs orgmode&lt;/a&gt; to synchronize your org calendar, you may have noticed that it adds an ID to all headings by design. For some, these extra &lt;code&gt;PROPERTIES&lt;/code&gt; blocks can be quite distracting. To address this, I proposed a patch to create IDs for only relevant headings here: &lt;a href=&#34;https://github.com/dengste/org-caldav/issues/227&#34;&gt;https://github.com/dengste/org-caldav/issues/227&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, if it&amp;rsquo;s already too late, here is a script to clean things up. You can evaluate it to remove all IDs that are neither a target, have attachment(s), nor a timestamp (synced with CalDAV). It assumes everything is in the &lt;code&gt;~/org&lt;/code&gt; directory, including archived files, and requires the use of &lt;code&gt;rg&lt;/code&gt;, &lt;code&gt;jq&lt;/code&gt;, and &lt;code&gt;awk&lt;/code&gt;. Please back up your org files before running it (presumably via &lt;code&gt;git&lt;/code&gt;) and run &lt;code&gt;org-lint&lt;/code&gt; to verify that nothing is broken.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(let* ((default-directory (&lt;span style=&#34;color:#a6e22e&#34;&gt;expand-file-name&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/org&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (ids (-&amp;gt; (shell-command-to-string
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rg -a -g &amp;#39;*.org*&amp;#39; --json &amp;#39;^:ID:\s*([A-Za-z00-9\-])+\s*$&amp;#39;  | jq -r &amp;#39;.data.submatches | select(.) | .[].match.text&amp;#39; | awk &amp;#39;{ print $2 }&amp;#39; | sort&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (string-trim)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (split-string &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (targets (-&amp;gt; (shell-command-to-string
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (&lt;span style=&#34;color:#a6e22e&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rg -a -g &amp;#39;*.org*&amp;#39; --json &amp;#39;\\[id:(%s)]&amp;#39; | jq -r &amp;#39;.data.submatches | select(.) | .[].match.text[4:-1]&amp;#39; | sort&amp;#34;&lt;/span&gt; (string-join ids &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (string-trim)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (split-string &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (not-targets (seq-difference ids targets)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (save-excursion
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (seq-each &lt;span style=&#34;color:#a6e22e&#34;&gt;#&amp;#39;&lt;/span&gt;(lambda (id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  (condition-case &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (progn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (org-id-goto id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (unless (or (org-entry-get &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SCHEDULED&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    (org-entry-get &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DEADLINE&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    (org-entry-get &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TIMESTAMP&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    (&lt;span style=&#34;color:#a6e22e&#34;&gt;member&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ATTACH&amp;#34;&lt;/span&gt; (org-get-tags &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;t&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#75715e&#34;&gt;;; (message &amp;#34;DELETE %s&amp;#34; id)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (org-delete-property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ID&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;FALSE POSITIVE %s&amp;#34;&lt;/span&gt; id))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              not-targets)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content>
    </item>
    
  </channel>
</rss>
