From c222b82131953ea2edc07fcac1ab474d1d6f502c Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Wed, 5 Apr 2023 10:51:34 +0300 Subject: [PATCH] New post about "self-healing code" --- publish.el | 20 +- src/favicon.ico | Bin 0 -> 4286 bytes src/home.svg | 25 ++ src/index.org | 136 +++++++++++ src/mail.svg | 1 + src/mastodon.svg | 1 + src/posts/2023-04-01-take-on-recursion.org | 111 +++++++++ ...23-04-05-the-self-healing-code-fallacy.org | 79 ++++++ src/posts/index.org | 6 + src/pub.org | 9 + src/rss.svg | 1 + src/style.css | 230 ++++++++++++++++++ src/sweep.org | 1 + 13 files changed, 608 insertions(+), 12 deletions(-) create mode 100644 src/favicon.ico create mode 100644 src/home.svg create mode 100644 src/index.org create mode 100644 src/mail.svg create mode 100644 src/mastodon.svg create mode 100644 src/posts/2023-04-01-take-on-recursion.org create mode 100644 src/posts/2023-04-05-the-self-healing-code-fallacy.org create mode 100644 src/posts/index.org create mode 100644 src/pub.org create mode 100644 src/rss.svg create mode 100644 src/style.css create mode 120000 src/sweep.org diff --git a/publish.el b/publish.el index 4bb5362..e24b06e 100644 --- a/publish.el +++ b/publish.el @@ -37,15 +37,15 @@ (defvar esy/publish-root-directory (file-name-directory load-file-name)) -(defvar esy/publish-org-directory +(defvar esy/publish-src-directory (file-name-as-directory (expand-file-name - "org" + "src" esy/publish-root-directory))) (defvar esy/publish-org-posts-directory (file-name-as-directory (expand-file-name "posts" - esy/publish-org-directory))) + esy/publish-src-directory))) (defvar esy/publish-out-directory (file-name-as-directory (expand-file-name @@ -57,11 +57,6 @@ "posts" esy/publish-out-directory))) -(defvar esy/publish-assets-directory - (file-name-as-directory (expand-file-name - "assets" - esy/publish-root-directory))) - (defun esy/publish-post-to-dom (file) (with-current-buffer (find-file-noselect (expand-file-name @@ -132,7 +127,7 @@ (delete-blank-lines))) (defun esy/publish-posts-prepare-index (&rest _) - (dolist (dir (list esy/publish-org-posts-directory esy/publish-org-directory)) + (dolist (dir (list esy/publish-org-posts-directory esy/publish-src-directory)) (with-current-buffer (find-file-noselect (expand-file-name "index.org" dir)) (org-update-all-dblocks)))) @@ -157,6 +152,7 @@ (rx (or ".html" ".ico" ".svg" + ".png" ".xml" ".css") eos)))) @@ -177,13 +173,13 @@ (org-publish-project-alist (list '("all" :components ("assets" "org")) (list "assets" - :base-directory esy/publish-assets-directory + :base-directory esy/publish-src-directory :publishing-directory publishing-directory - :base-extension "svg\\|ico\\|css" + :base-extension "svg\\|ico\\|css\\|png" :publishing-function #'org-publish-attachment) (list "org" :completion-function #'esy/publish-completion-function - :base-directory esy/publish-org-directory + :base-directory esy/publish-src-directory :publishing-directory publishing-directory :preparation-function #'esy/publish-posts-prepare-index :completion-function #'ignore diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f744115af0cf3749452017dbd6ffa5063034499a GIT binary patch literal 4286 zcmc&&`A<|=6n_5RS-=4Xt7Q}hv1!@F1=L}2qbk}OY6;k;b|YvoS{qVpgNcTyHN}AY z($dCMY_Nn1ZXgy!WF2-HaM${Oe7)bDzL6PbkQpCw$eH)vefOU4?B_6wGEMwhEDFDs zi$+BWRTL#gkXTaE1aVz{#Jk8?Cpi}sB`7Ee{*u99fL^bc#CxOB=r<34F^OT&8(=n@ zG4I_NELfC;#VHFBmk7kcB$ViJXlu^S9u)%Cl&^dmZilx6v`sf|l-E z`1{5s96C~hwd+4Xc(@td@2`Ho_8SdGq^8?&vF1GPJ?X{B^8q-X^*y%$Ldw$QDYpURAb;Ce7L}=c_7&ADlgqKDgW4jJ+j4Vt!KMl;JZD-;aF{m+C5Axk&8# zmMh3yyISS|_h_Z7Cm)l^goC9eE^OMpYp4|)HfBwE{8O)_1@qnNF!R6sRH<8EWsImj znDdgS4uL+C=O=j|yUhTc2l774fnMkAe@0^vX1qNEA7-yd!S;OVE3I;p_?&IV)E%O}W|7{cnHbQ%?3I=0&flQ>!vpxXI_Kmp{+!gRC)( zJI*0${IUPg_Vl&xEgg0iZI|z)eS|->>W{=&VoSlTwi}W^?a(vQfnDG4K+L?kh!8W* zaxst8iFudvcWpy8qM{--@xN*(>bNE=(>V`{9zYu~4{nOySbMV?9fNlyw%yStX68Ii zu~ivp2hN1W`}asWXlKem>J;^;>hc8{tE^Y*8Lh9Bfjq6zR{1|!)<^5)EXw}#PQ)y~ a=j=e`V~t~c>2x|tybrYIsJ{cesq24+SfiQ% literal 0 HcmV?d00001 diff --git a/src/home.svg b/src/home.svg new file mode 100644 index 0000000..222fdec --- /dev/null +++ b/src/home.svg @@ -0,0 +1,25 @@ + + + Layer 1 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/index.org b/src/index.org new file mode 100644 index 0000000..d50d148 --- /dev/null +++ b/src/index.org @@ -0,0 +1,136 @@ +#+TITLE: Eshel Yaron +#+AUTHOR: Eshel Yaron +#+DESCRIPTION: Personal home page of Eshel Yaron +#+KEYWORDS: eshel language emacs programming prolog +#+OPTIONS: toc:nil ^:{} + +Welcome to [[./index.org][my website]], the one true source of reliable curated information about me and my activities. + +#+begin_src prolog + ?- likes('Eshel', Stuff). + Stuff = 'logic programming'; + Stuff = 'linguistics'; + Stuff = 'cognition'; + Stuff = 'functional programming'; + Stuff = 'The cyber'; + Stuff = 'type systems'; + Stuff = 'coffee ☕️'; + Stuff = 'free software'. +#+end_src + +* Recent Posts +:PROPERTIES: +:CUSTOM_ID: recent-posts +:END: +#+BEGIN: posts :dir "/Users/eshelyaron/checkouts/eshelyaron.com/src/posts" :limit 5 +#+END: + + +* Projects +:PROPERTIES: +:CUSTOM_ID: projects +:END: + +** =sweep=: SWI-Prolog Embedded in Emacs +:PROPERTIES: +:CUSTOM_ID: sweep +:END: + +[[https://git.sr.ht/~eshel/sweep][Sweep]] is an Emacs module which uses the C interfaces of both +SWI-Prolog and Emacs to bring the two together into one address space. + +For more details, see [[file:sweep.org][the Sweep manual]]. + +** Sourcehut GraphQL client for SWI-Prolog +:PROPERTIES: +:CUSTOM_ID: sourcehut-pl +:END: + +[[https://git.sr.ht/~eshel/sourcehut.pl][sourcehut.pl]] - a SWI-Prolog package for interacting with the GraphQL +API of sourcehut instances. + +=sourcehut.pl= can be used to automate maintenance tasks for project +hosted on sourcehut, for example to attach a build artifact to a given +tag of a git repository from within SWI-Prolog: + +#+begin_src prolog + ?- sourcehut_git_repository("eshel", "sourcehut.pl", Repo, []), + get_dict(id, Repo, RepoId), + sourcehut_git_upload_artifact(RepoId, "v0.1.2", "/tmp/foo/baz.txt", Artifact, []). +#+end_src + +** [[https://git.sr.ht/~eshel/eshellisp][eshellisp]] +:PROPERTIES: +:CUSTOM_ID: eshellisp +:END: + +A [[https://git.sr.ht/~eshel/eshellisp][Scheme Lisp interpreter implemented in SWI-Prolog]]. + +#+begin_src sh + $ cat scheme/repl.scm + (define repl () (write (eval (read))) (repl)) + (repl) + + $ ./eshellisp scheme/repl.scm + % (cons (+ 1 2) 4) + % (3 . 4) +#+end_src + +** [[https://git.sr.ht/~eshel/flymake-swi-prolog][flymake-swi-prolog.el]] and [[https://git.sr.ht/~eshel/diagnostics.pl][diagnostics.pl]] +:PROPERTIES: +:CUSTOM_ID: flymake-swi-prolog +:END: + +=diagnostics.pl= is a SWI-Prolog package implementing a simple and +extensible inteface for diagnosing issues with SWI-Prolog source code, +exposing by default the powerful analysis used by the built-in +SWI-Prolog IDE. + +=flymake-swi-prolog= is an Emacs Lisp package implementing a Flymake +backend that leverages =diagnostics.pl= to provide diagnostics for +SWI-Prolog source code in =prolog-mode= Emacs buffers. + +** [[https://git.sr.ht/~eshel/ropes.pl][ropes.pl]] +:PROPERTIES: +:CUSTOM_ID: ropes-pl +:END: + +A (SWI-)Prolog implemantation of the [[https://en.wikipedia.org/wiki/Rope_(data_structure)][rope data structure]] for efficient +massive string editing. + +Based on [[https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.9450&rep=rep1&type=pdf][Ropes: An alternative to strings]]. + +#+begin_src prolog +test(edit) :- + string_rope("Hello, World!" , HW), + string_rope("Here be dragons", HD), + rope_split(HD, 8, _, D), % "Here be " + "dragons" + rope_split(HW, 7, H, W), % "Hello, " + "World!" + rope_split(W , 5, _, E), % "World" + "!" + rope_concat(H , D, HS), + rope_concat(HS, E, HE), + rope_string(HE, HF), + assertion(HF == "Hello, dragons!"). +#+end_src + +** [[https://github.com/oskardrums/ebpf][Erlang eBPF library]] +:PROPERTIES: +:CUSTOM_ID: erlang-ebpf +:END: + +A low level interface to the [[https://ebpf.io/][Linux eBPF system]] for [[https://www.erlang.org/][Erlang]]. + + +** [[https://git.sr.ht/~eshel/eshelyaron.com][This website]] +:PROPERTIES: +:CUSTOM_ID: this-website +:END: + +My first taste of web development, a practice that I have always +refrained from conducting. Created with pure [[https://orgmode.org/][org-mode]] to ease the +landing. + +Inspired by: +- https://taingram.org/ +- https://sachachua.com/blog/ +- https://occasionallycogent.com/ diff --git a/src/mail.svg b/src/mail.svg new file mode 100644 index 0000000..5752d47 --- /dev/null +++ b/src/mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/mastodon.svg b/src/mastodon.svg new file mode 100644 index 0000000..350c222 --- /dev/null +++ b/src/mastodon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/posts/2023-04-01-take-on-recursion.org b/src/posts/2023-04-01-take-on-recursion.org new file mode 100644 index 0000000..bd463d5 --- /dev/null +++ b/src/posts/2023-04-01-take-on-recursion.org @@ -0,0 +1,111 @@ +#+TITLE: Take on Recursion +#+SUBTITLE: My take on a recursive Elisp function for accumulating a list while walking up an AST +#+DESCRIPTION: A post by Eshel Yaron describing his take on a recursive Elisp function for accumulating a list while walking up an AST +#+KEYWORDS: emacs +#+DATE: 2023-04-01 + +Over at [[https://takeonrules.com]], Jeremy Friesen has [[https://takeonrules.com/2023/03/25/using-built-in-emacs-29-tree-sitter-package-to-get-qualified-ruby-function-name/][a couple of]] [[https://takeonrules.com/2023/03/25/using-built-in-emacs-29-tree-sitter-package-to-get-qualified-ruby-function-name/][recent posts]] +about an Emacs command he wrote for grabbing the qualified name of the function +at point in Ruby files. + +I don't know much about Ruby, but the way he implemented this command caught my +attention because he's relying on the new =treesit= package from Emacs 29 to +examine the syntax tree of his Ruby code, and I've been playing around with this +nice parsing framework myself recently. + +Apparently, Ruby /functions/ can reside within nested /modules/. Jeremy's +command thus leverages the function ~treesit-defun-at-point~ to obtain the +syntax tree node corresponding to the Ruby function at point, and calls a +recursive helper function called ~jf/treesit/module_space~ that walks up the +syntax tree and accumulates the names of the enclosing modules it finds along +the way to the root of the syntax tree. There's just a tiny problem which is +that this helper function accumulates the module names in a rather awkward +manner... As Jeremy notes: + +#+begin_quote +The list returned by ~jf/treesit/module_space~ is ~'(nil ("Hello" ("World")))~; +which is a ugly but workable. Perhaps someone will write to me with a refactor +of this code. +#+end_quote + +Let's have a look at this function's implementation: + +#+begin_src emacs-lisp + (defun jf/treesit/module_space (node) + (when-let* ((parent (treesit-parent-until + node + (lambda (n) (member (treesit-node-type n) + '("class" "module" "assignment"))))) + (parent_name (treesit-node-text + (car + (treesit-filter-child + parent + (lambda (n) + (member (treesit-node-type n) + '("constant" "scope_resolution")))))))) + (list (jf/treesit/module_space parent) parent_name))) +#+end_src + +Basically what this does is climbing up the syntax tree with +~treesit-parent-until~ to find the next module boundary (if there is one) and +then grabbing its name with ~treesit-node-text~. Now all that's left is to +perform a recursive call and return its result along with the found module name, +but the way it bundles them together as two elements of a ~list~ causes the +result to be a nested tree structure, instead of a simple list. Then, to obtain +the desired list of module names, the calling command needs to apply the +~-flatten~ function to the tree that ~jf/treesit/module_space~ returns. + +Here's my take on this function: + +#+begin_src emacs-lisp + (defun esy/treesit/module_space (node &optional acc) + (if-let ((parent (treesit-parent-until + node + (lambda (n) (member (treesit-node-type n) + '("class" "module" "assignment"))))) + (parent_name (treesit-node-text + (car + (treesit-filter-child + parent + (lambda (n) + (member (treesit-node-type n) + '("constant" "scope_resolution")))))))) + (esy/treesit/module_space parent (cons parent_name acc)) + acc)) +#+end_src + +It's extremely similar to the original version, but the crucial difference is +that we use an accumulator argument ~ACC~ to hold the result of our syntax tree +traversal as we climb up to the root. At each step in the way, ~ACC~ holds a +list of module names which is the ~cdr~ of the list that we'll eventually +return. We extend this list with the name of the next parent module during the +recursive call, and when we reach the root of the syntax tree we simply return +the accumulated list. + +For example, if we have Ruby code that looks something like this: + +#+begin_src ruby +module Foo + module Bar + module Baz + def spam + :true + end + end + end +end +#+end_src + +With point inside the function definition we get a simple list: + +#+begin_src emacs-lisp + (esy/treesit/module_space (treesit-defun-at-point)) + ⇒ ("Foo" "Bar" "Baz") +#+end_src + +Which is a little cleaner than what we get with ~jf/treesit/module_space~: + +#+begin_src emacs-lisp + (jf/treesit/module_space (treesit-defun-at-point)) + ⇒ (((nil "Foo") "Bar") "Baz") +#+end_src diff --git a/src/posts/2023-04-05-the-self-healing-code-fallacy.org b/src/posts/2023-04-05-the-self-healing-code-fallacy.org new file mode 100644 index 0000000..8979805 --- /dev/null +++ b/src/posts/2023-04-05-the-self-healing-code-fallacy.org @@ -0,0 +1,79 @@ +#+TITLE: The Self-Healing Code Fallacy +#+SUBTITLE: Remarks about a new CI step that makes your code fix itself before its merged +#+DESCRIPTION: A post by Eshel Yaron about Self-Healing Code, a new GitLab CI step that supposedly makes your code fix itself before its merged +#+KEYWORDS: ai +#+DATE: 2023-04-05 + +Yesterday, a colleague of mine shared a tweet in our =#random= Slack +channel about [[https://gitlab.com/min.choi/selfhealing-gitlab-ci/][a new AI-powered plugin for GitLab CI]] that supposedly +makes your code /self-healing/. + +Here's the tweet from Min Choi: +#+begin_quote +Say goodbye to manual code fixes! With self-healing code @GitLab CI +pipeline, powered by @LangChainAI and @OpenAI , you can automatically +detect and fix issues in your code. This is the future of DevOps! + +Building on the GitHub action pipeline created by @xpluscal +#+end_quote + +He goes on to explain all the nitty-gritty details of how it works: + +#+begin_quote +First, a code push triggers the GitLab CI pipeline where Build job +fails due to code error, which trigger the SelfHeal job. + +Using combination of LLMChain prompt and GPT API query, SelfHeal job +fixes the code, commits, then push + +Second, the code push from SelfHeal job triggers a new pipeline with +the fixed code. + +This time Build job passes. SelfHeal job is skipped since Build job +passed. + +Entire processes was fully automated after the initial code +push. Possibilities are endless in this age of AI. I will keep you +guys posted as updates are made. +#+end_quote + +* AI Naivety + +This hits me as classic case of /AI naivety/. People see LLMs do +things that they didn't think were possible, and do it fast. That +makes them think that LLMs can possibly do /anything at all/. They +forget--that some things remain impossible. It's as if they were +introduced to some deeper truth that suddenly invalidates the +constraints of the old world. In the new world, AI can decide the +halting problem. Just give it a program and it'll tell you! It seems +to work well for these 10 lines Python snippets that we tested it on, +doesn't it? And fuck it, who's to say if it gets it wrong. + +* A Bad Metaphor + +Back to the self-healing code from Min Choi's tweet, the biggest +problem I have with this idea is the premise that fixing code is +somewhat similar to how living organisms heal. Healing is when your +body restores a "previous" good state after enduring some trauma. If +your code would self-heal whenever you broke it, that'd just mean it's +reverting your changes time after time. You'd be stuck with a +self-preserving, "Hello, World!"-printing, CI-passing piece of +nothing. To fix code you must start from a rigorous specification of +what it means for the code to be fixed. Min Choi's self-healing code +needs to first read the developer's mind in order to figure out what +it should heal /into/, because the code ultimately conveys the +developer's intent. No problem for the almighty AI, right? + +Contrast this wishful-thinking, eye-shutting, based approach with +something like [[https://pumpkin.uwplse.org/][PUMPKIN PATCH]] from Talia Ringer et al., where +/automatic proof repair/ (a much more suitable term then "self-healing +code") is done in the setting of a formal specification of what the +program must do (or rather, what it must /be/--what type it needs to +populate). + +* Conclusion + +LLMs are cool, they really are, but they can't read your mind, and +they can't make your code self-heal, whatever that means. Do +understand their function and utility so you can leverage them where +appropriate, but don't expect them to do the impossible. diff --git a/src/posts/index.org b/src/posts/index.org new file mode 100644 index 0000000..7e139c3 --- /dev/null +++ b/src/posts/index.org @@ -0,0 +1,6 @@ +#+TITLE: All Posts +#+DESCRIPTION: Eshel Yaron's blog posts +#+KEYWORDS: eshel language emacs programming prolog + +#+BEGIN: posts :dir "/Users/eshelyaron/checkouts/eshelyaron.com/src/posts" :limit nil +#+END: diff --git a/src/pub.org b/src/pub.org new file mode 100644 index 0000000..c761cb3 --- /dev/null +++ b/src/pub.org @@ -0,0 +1,9 @@ +#+TITLE: Public PGP Key +#+AUTHOR: Eshel Yaron +#+OPTIONS: toc:nil ^:{} + +* My PGP public key + +#+begin_src shell :results code :exports both + gpg --armor --export me@eshelyaron.com +#+end_src diff --git a/src/rss.svg b/src/rss.svg new file mode 100644 index 0000000..3ea2cd9 --- /dev/null +++ b/src/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..ab2cabd --- /dev/null +++ b/src/style.css @@ -0,0 +1,230 @@ +body { + color: #cfdfd5; + background-color: #111111; + margin-left: auto; + margin-right: auto; + width: 90%; + max-width: 90ch; + /* font-size: 1.1em; */ + font-family: "Helvetica Neue", sans-serif; +} + +a:link { + color: #00c089; +} + +a:visited { + color: #5dc0aa; +} + +time { + color: #9ac8e0; +} + +.home-link { + float: left; +} + +.other-links { + float: right; +} + +footer { + font-size: smaller; + text-align: center; +} + +.icon-links { + height: 40px; + text-decoration: none; +} + +blockquote { + border-left-style: solid; + padding-left: 1em; +} + +dt { + font-weight: bold; +} + +pre { + overflow: auto; + border-top-style: solid; + border-top-width: 2px; + border-left-style: solid; + border-left-width: 2px; + border-right-style: solid; + border-right-width: 1px; + border-bottom-style: solid; + border-bottom-width: 1px; + padding: 0.8em; + background-color: #222522; +} + +.footpara { + display: inline; +} + +code { + color: #78afff; + font-family: Hack,monospace; +} + +h2 { + color: #7fc500; +} +h3 { + color: #5dc0aa; +} +h4 { + color: #af9fff; +} +h5 { + color: #7fcfdf; +} +h6 { + color: #cfc04f; +} + +/* +Generated with `M-x org-html-htmlize-generate-css` after loading the +`ef-bio` theme by Protesilaos Stavrou. +*/ +.org-builtin { + /* font-lock-builtin-face */ + color: #3fb83f; + font-weight: bold; +} +.org-comment { + /* font-lock-comment-face */ + color: #b7a07f; + font-style: italic; +} +.org-comment-delimiter { + /* font-lock-comment-delimiter-face */ + color: #b7a07f; + font-style: italic; +} +.org-constant { + /* font-lock-constant-face */ + color: #37aff6; +} +.org-doc { + /* font-lock-doc-face */ + color: #7fc07f; + font-style: italic; +} +.org-doc-markup { + /* font-lock-doc-markup-face */ + color: #37aff6; +} +.org-escape { + /* font-lock-escape-face */ + color: #cfc04f; +} +.org-function-call { + /* font-lock-function-call-face */ + color: #7fc500; +} +.org-function-name { + /* font-lock-function-name-face */ + color: #7fc500; +} +.org-preprocessor { + /* font-lock-preprocessor-face */ + color: #3fb83f; +} +.org-property-name { + /* font-lock-property-name-face */ + color: #78afff; +} +.org-property-use { + /* font-lock-property-use-face */ + color: #78afff; +} +.org-rainbow-delimiters-depth-1 { + /* rainbow-delimiters-depth-1-face */ + color: #00c089; +} +.org-rainbow-delimiters-depth-2 { + /* rainbow-delimiters-depth-2-face */ + color: #7fc500; +} +.org-rainbow-delimiters-depth-3 { + /* rainbow-delimiters-depth-3-face */ + color: #5dc0aa; +} +.org-rainbow-delimiters-depth-4 { + /* rainbow-delimiters-depth-4-face */ + color: #af9fff; +} +.org-rainbow-delimiters-depth-5 { + /* rainbow-delimiters-depth-5-face */ + color: #7fcfdf; +} +.org-rainbow-delimiters-depth-6 { + /* rainbow-delimiters-depth-6-face */ + color: #cfc04f; +} +.org-rainbow-delimiters-depth-7 { + /* rainbow-delimiters-depth-7-face */ + color: #37aff6; +} +.org-rainbow-delimiters-depth-8 { + /* rainbow-delimiters-depth-8-face */ + color: #6fc5ef; +} +.org-rainbow-delimiters-depth-9 { + /* rainbow-delimiters-depth-9-face */ + color: #d38faf; +} +.org-rainbow-delimiters-mismatched { + /* rainbow-delimiters-mismatched-face */ + color: #ffffff; + background-color: #bd1f30; +} +.org-string { + /* font-lock-string-face */ + color: #af9fff; +} +.org-type { + /* font-lock-type-face */ + color: #7fcfdf; +} +.org-variable-name { + /* font-lock-variable-name-face */ + color: #78afff; +} +.org-variable-use { + /* font-lock-variable-use-face */ + color: #78afff; +} +.org-warning-1 { + /* font-lock-warning-face */ + color: #cfc04f; +} +.org-negation-char { + /* font-lock-negation-char-face */ + font-weight: bold; +} +.org-regexp { + /* font-lock-regexp-face */ + color: #af9fff; +} +.org-regexp-grouping-backslash { + /* font-lock-regexp-grouping-backslash */ + color: #cfc04f; +} +.org-regexp-grouping-construct { + /* font-lock-regexp-grouping-construct */ + color: #3fb83f; +} + +.timestamp { + color: #5dc0aa; +} + +.subtitle { + font-style: italic; +} diff --git a/src/sweep.org b/src/sweep.org new file mode 120000 index 0000000..b077d19 --- /dev/null +++ b/src/sweep.org @@ -0,0 +1 @@ +../sweep/README.org \ No newline at end of file -- 2.39.2