Merge branch 'master' of gitea.esy.fun:yogsototh/her.esy.fun

This commit is contained in:
Yann Esposito (Yogsototh) 2020-10-29 18:59:25 +01:00
commit 2140b5fe0d
Signed by untrusted user who does not match committer: yogsototh
GPG key ID: 7B19A4C650D59646
18 changed files with 858 additions and 299 deletions

View file

@ -61,7 +61,7 @@ This will certainly be the best way for me to notice you among notifications.
:CUSTOM_ID: who-am-i
:END:
I am mostly known for some of my older blog post.
My Internet presence is mostly known from older blog post.
In particular:
- [[http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/][Learn Vim Progressively]]
@ -91,13 +91,172 @@ Right now there is no plan to make it opensource.
In our programmer community, tooling is essential.
- emacs (former vim user)
- spacemacs
- org-mode / org-journal / org-roam
- magit / forge / github-review
- weechat
- weeslack
- macOS
- [[https://nixos.org][nix]] with [[https://github.com/nix-community/home-manager][home-manager]]
- [[https://yadm.io][yadm]] for things home-manager had difficult to handle
- [[https://www.gnu.org/software/emacs/][emacs]] (former vim user)
- [[https://github.com/hlissner/doom-emacs][doom-emacs]] (used [[https://www.spacemacs.org][spacemacs]] before)
- [[https://orgmode.org][org-mode]] / [[https://github.com/bastibe/org-journal][org-journal]] / [[https://www.orgroam.com][org-roam]]
- [[https://magit.vc][magit]] / [[https://magit.vc/manual/forge/][forge]] / [[https://github.com/charignon/github-review][github-review]]
- [[https://weechat.org][weechat]]
- [[https://github.com/wee-slack/wee-slack][wee-slack]]
** Internet consumption
:PROPERTIES:
:CUSTOM_ID: internet-consumption
:END:
*** News
:PROPERTIES:
:CUSTOM_ID: news
:END:
- [[https://lobste.rs/][lobsters]]
- [[https://news.ycombinator.com/][HN]]
- [[https://laarc.io][laarc]]
- [[https://www.discoverdev.io][discoverdev]]
- [[https://reddit.com/r/haskell][/r/haskell]]
- [[https://reddit.com/r/clojure][/r/clojure]]
*** RSS
:PROPERTIES:
:CUSTOM_ID: rss
:END:
I mostly consume them via [[https://github.com/skeeto/elfeed][elfeed]] in emacs:
**** Imported Feeds :elfeed:
:PROPERTIES:
:CUSTOM_ID: imported-feeds
:END:
***** news :news:
:PROPERTIES:
:CUSTOM_ID: news-0675
:END:
****** [[https://hnrss.org/newest?points=1200][HN]]
:PROPERTIES:
:CUSTOM_ID: --https---hnrss-org-newest-points-1200--hn--
:END:
****** [[https://beepb00p.xyz/atom.xml][beepb00p.xyz ]] :tech:
:PROPERTIES:
:CUSTOM_ID: --https---beepb00p-xyz-atom-xml--beepb00p-xyz---
:END:
****** [[https://esoteric.codes/rss][esoteric.codes]] :tech:
:PROPERTIES:
:CUSTOM_ID: --https---esoteric-codes-rss--esoteric-codes--
:END:
***** haskell :haskell:fp:
:PROPERTIES:
:CUSTOM_ID: haskell
:END:
****** [[http://feeds.feedburner.com/ezyang][Inside 206-105]]
:PROPERTIES:
:CUSTOM_ID: --http---feeds-feedburner-com-ezyang--inside-206-105--
:END:
****** [[http://blog.jle.im/rss][in Code — Entries]]
:PROPERTIES:
:CUSTOM_ID: --http---blog-jle-im-rss--in-code---entries--
:END:
****** [[http://5outh.blogspot.com/feeds/posts/default][Abstract Nonsense]]
:PROPERTIES:
:CUSTOM_ID: --http---5outh-blogspot-com-feeds-posts-default--abstract-nonsense--
:END:
****** [[http://byorgey.wordpress.com/feed/][blog :: Brent -> String]]
:PROPERTIES:
:CUSTOM_ID: --http---byorgey-wordpress-com-feed---blog----brent----string--
:END:
****** [[http://www.haskellforall.com/feeds/posts/default][Haskell for all]]
:PROPERTIES:
:CUSTOM_ID: --http---www-haskellforall-com-feeds-posts-default--haskell-for-all--
:END:
****** [[http://themonadreader.wordpress.com/feed/][The Monad.Reader]]
:PROPERTIES:
:CUSTOM_ID: --http---themonadreader-wordpress-com-feed---the-monad-reader--
:END:
****** [[http://blog.poisson.chat/./rss.xml][Lysxia's blog]]
:PROPERTIES:
:CUSTOM_ID: --http---blog-poisson-chat---rss-xml--lysxia's-blog--
:END:
****** [[http://blog.docmunch.com/blog?format=rss][The Docmunch blog]]
:PROPERTIES:
:CUSTOM_ID: --http---blog-docmunch-com-blog-format-rss--the-docmunch-blog--
:END:
****** [[http://bitemyapp.com/rss.xml][bitemyapp]]
:PROPERTIES:
:CUSTOM_ID: --http---bitemyapp-com-rss-xml--bitemyapp--
:END:
****** [[http://www.serpentine.com/blog/feed/][teideal glic deisbhéalach]]
:PROPERTIES:
:CUSTOM_ID: --http---www-serpentine-com-blog-feed---teideal-glic-deisbhéalach--
:END:
****** [[http://sigfpe.blogspot.com/feeds/posts/default][A Neighborhood of Infinity]]
:PROPERTIES:
:CUSTOM_ID: --http---sigfpe-blogspot-com-feeds-posts-default--a-neighborhood-of-infinity--
:END:
****** [[http://neilmitchell.blogspot.com/feeds/posts/default][Neil Mitchell's Haskell Blog]]
:PROPERTIES:
:CUSTOM_ID: --http---neilmitchell-blogspot-com-feeds-posts-default--neil-mitchell's-haskell-blog--
:END:
****** [[http://blog.jakubarnold.cz/feed.xml][Jakub Arnold Blog]]
:PROPERTIES:
:CUSTOM_ID: --http---blog-jakubarnold-cz-feed-xml--jakub-arnold-blog--
:END:
***** Functional :fp:
:PROPERTIES:
:CUSTOM_ID: functional
:END:
****** [[https://christine.website/blog.rss][Christine Dodrill]]
:PROPERTIES:
:CUSTOM_ID: --https---christine-website-blog-rss--christine-dodrill--
:END:
****** [[http://martintrojer.github.io/atom.xml][Martin's Blog]]
:PROPERTIES:
:CUSTOM_ID: --http---martintrojer-github-io-atom-xml--martin's-blog--
:END:
****** [[http://lambda-the-ultimate.org/rss.xml][Lambda the Ultimate]]
:PROPERTIES:
:CUSTOM_ID: --http---lambda-the-ultimate-org-rss-xml--lambda-the-ultimate--
:END:
****** [[http://feeds.feedburner.com/7sharp9][7Sharp9]]
:PROPERTIES:
:CUSTOM_ID: --http---feeds-feedburner-com-7sharp9--7sharp9--
:END:
****** [[http://okmij.org/ftp/rss.xml][oleg]]
:PROPERTIES:
:CUSTOM_ID: --http---okmij-org-ftp-rss-xml--oleg--
:END:
***** clojure :clojure:fp:
:PROPERTIES:
:CUSTOM_ID: clojure
:END:
****** [[http://blog.juxt.pro/rss.xml][JUXT Blog]]
:PROPERTIES:
:CUSTOM_ID: --http---blog-juxt-pro-rss-xml--juxt-blog--
:END:
****** [[http://feeds.cognitect.com/blog/feed.rss][Cognitect Blog]]
:PROPERTIES:
:CUSTOM_ID: --http---feeds-cognitect-com-blog-feed-rss--cognitect-blog--
:END:
***** misc :misc:
:PROPERTIES:
:CUSTOM_ID: misc
:END:
****** [[https://nesslabs.com/feed][nesslabs ]] :life:
:PROPERTIES:
:CUSTOM_ID: --https---nesslabs-com-feed--nesslabs---
:END:
****** [[https://solar.lowtechmagazine.com/feeds/all.rss.xml][lowtechmag]]
:PROPERTIES:
:CUSTOM_ID: --https---solar-lowtechmagazine-com-feeds-all-rss-xml--lowtechmag--
:END:
***** Philo :philo:
:PROPERTIES:
:CUSTOM_ID: philo
:END:
****** [[https://bluelabyrinths.com/category/philosophy/feed/][bluelabyrinths]]
:PROPERTIES:
:CUSTOM_ID: --https---bluelabyrinths-com-category-philosophy-feed---bluelabyrinths--
:END:
* former websites
:PROPERTIES:
:CUSTOM_ID: old-websites

View file

@ -1,6 +1,6 @@
html {
font-family: Courier,monospace;
font-size: 14px;
font-family: Menlo, Monaco, monospace;
font-size: 1rem;
line-height: calc(1ex/0.37); }
#TOC {text-align: left;}
html,body { margin: 0; padding: 0; border: 0; }
@ -12,11 +12,12 @@ h1,h2,h3,h4,h5,h6 {
p { text-align: justify; hyphens: auto; }
pre { overflow-x: scroll; border: solid 1px; padding: 1ex; }
pre > code { font-size: 0.875em; background: none; }
code,pre { font-family: Courier, monospace; }
code,pre { font-family: Menlo, Monaco, monospace; }
figure { margin: 1rem 0; padding: 0; }
.meta { font-size: small;}
.abstract { margin: 1rem; font-size: 0.875em; font-style: italic; }
#logo { display: inline-block; }
.abstract { margin: 2rem 4rem; font-size: 0.875em; font-style: italic; }
#logo { display: inline-block;
vertical-align: middle;}
#logo svg { width: 3em; }
#preamble, #postamble { text-align: center; }
#content,.content,#preamble,#postamble {
@ -26,6 +27,12 @@ figure { margin: 1rem 0; padding: 0; }
margin: 0 auto;
}
figure img { width: 100%; }
sup, sub {
vertical-align: baseline;
position: relative;
top: -0.4em;
}
sub { top: 0.4em; }
.footdef > sup { vertical-align: top; font-size: medium; }
.footdef > sup > a { padding: 0.5em; }
.footpara { display: inline; }
@ -48,6 +55,7 @@ body>input { display: none; }
label { font-weight: 700; }
label:hover { cursor: pointer; }
label ~ pre { margin-top: 0; }
figcaption { text-align: right; font-family: italic; }
:root {
--b03: #2E3440;
@ -67,18 +75,19 @@ label ~ pre { margin-top: 0; }
--b0: #989ea8;
--b1: #b0bac7;
--b2: #ECEFF4;
--b3: #fff;
--b3: rgb(248,249,251);
/* default light */
--bg: var(--b3);
--rbg: var(--b2);
--fg0: var(--b0);
--fg: var(--b02);
--rfg: #000;
--fg: #4c566a; /* var(--b02); */
--rfg: var(--b03);
--hl: var(--o);
}
/* dark preferred */
/*
@media (prefers-color-scheme: dark)
{
:root {
@ -102,7 +111,7 @@ label ~ pre { margin-top: 0; }
background: hsl(218,20%,18%);
border-color: hsl(218,15%,23%);
}
}
} */
/* light checked */
input#l:checked ~ div {
@ -167,7 +176,7 @@ body, body > div {
background: var(--bg);
color: var(--fg);
}
a,a:visited { color: var(--hl); }
label:hover, a,a:visited { color: var(--hl); }
code { background: var(--rbg); }
/* ---- SYNTAX HIGHLIGHTING ---- */

View file

@ -1,242 +0,0 @@
:PROPERTIES:
:ID: 21c48431-c0db-4a34-95fe-7228fea6233f
:END:
#+TITLE: How I use org-mode
#+AUTHOR: Yann Esposito
#+EMAIL: yann@esposito.host
#+DATE: [2019-09-30 Mon]
#+KEYWORDS: org-mode
#+DESCRIPTION: How I use org-mode
#+OPTIONS: auto-id:t toc:t
In this article I'll try to give an overview of my current use of [[https://orgmode.org][org mode]].
I use org mode for:
- tasks management & tracking
- writing documents (articles, book, etc...)
- note taking ; which I consider slightly different from just writing documents
It took me a few month to discover a few great org-mode features that
really changed the way I looked at it.
After discovering those it is a real life changer.
I hope that I could help you discover why org mode is so praised and be
able to take advantage of its awesomeness faster than I did.
* Workflows
:PROPERTIES:
:CUSTOM_ID: workflows
:END:
** Worfklow 1: See Things to do: org-agenda + clock
:PROPERTIES:
:CUSTOM_ID: worfklow-1--org-agenda---clock
:END:
1. look at the current tasks planned for today
2. select a task, clock it
3. work on the task
4. back to the task and clock it out.
I work most of my using emacs[fn:emacs-digression].
Generally the first thing I do in the morning is opening `org-calendar`.
It looks like this:
#+ATTR_ORG: :width 400
#+CAPTION: Org super calendar view
#+NAME: fig:org-super-agenda
[[./img/org-super-agenda.png]]
Pretty brutalist interface which is a great thing to me.
Distraction free interface going to the essential.
With this view, I see what I planned to do today.
I also see a few "Due Soon" tasks in case I have the time to handle those.
When I start working on a task I start a clock on it (I simply type =I=
when my cursor is on the TODO line).
When I finished some task I change its status from TODO to something else.
Mainly I'm prompted when doing so:
#+BEGIN_SRC
{ [t] TODO [p] IN-PROGRESS [h] HOLD [w] WAITING
[d] DONE [c] CANCELLED [l] HANDLED }
#+END_SRC
And that's it.
The time spent on the task as been clocked I can work on another task.
Looking at the agenda view you could notice habits.
They start to become green when you are doing them correctly.
But generally, I don't use much direct clocking from the agenda.
Most of the time I prefer the capture mechanism.
Which bring us to "Worfklow 2".
** Workflow 2: Tracking; org-capture
:PROPERTIES:
:CUSTOM_ID: workflow-2--org-capture-org-refile
:END:
Most of the tasks I perform on the day are not planned.
I have a generic routine + some prepared events and tasks to performs.
But during the day you have multiple interruptions, and part of my job is
to write code reviews too.
I cannot plan those.
In that case I use =org-capture= along =org-refile=.
Mainly =org-capture= helps you create a new TODO entry.
And =org-refile= will help you move that TODO entry to the correct place.
So let say I get a direct message in the chat asking me to do something.
I generally start org capture (for me it's =SPC X=).
I am presented with the following choice:
#+BEGIN_SRC
Select a capture template
=========================
[t] todo
[c] chat
[e] email
[m] meeting
[p] pause
[r] review
[w] work
[i] interruption
[f] chore
---------------------------------------------------------------------------
[q] Abort
#+END_SRC
In my example it was a chat interruption.
So I type =i= that presents me with this
#+BEGIN_SRC
**** IN-PROGRESS | :interruption:
:LOGBOOK:
[2020-09-23 Wed 08:01]
ref :: [link-to-where-I-was-in-emacs-when-captured]
#+END_SRC
My cursor placed where the =|= is displayed.
Here I add the tag =chat= and a small description, "dm from John about X" for example.
Then I type =C-c C-c= and the TODO is placed in a =tracker.org= file under
a date tree that looks like this:
#+BEGIN_SRC org-mode
* 2020
** 2020-W39
*** 2020-09-21 Monday
*** 2020-09-22 Tuesday
*** 2020-09-23 Wednesday
**** IN-PROGRESS Chat with John about X :interruption:chat:
:LOGBOOK:
CLOCK: [2020-09-23 Wed 17:58]
:END:
[2020-09-23 Wed 17:58]
ref ::
...
#+END_SRC
So the clock for this task started at the moment at made the capture.
In my workflow, I prefer to finish the capture and stop clock later.
So after I finished the capture, the clock is still running while the task
is put in my tracker file.
Once I finished with that task.
I can:
1. Jump to the tasks with =SPC n o= (=org-clock-goto=), and stop the
clock =SPC m c o= (=clock-out=).
2. Jump to the task and change its status to =DONE= which will stop the clock.
3. Capture another tasks which will stop the clock on the current task and
will start on the new one.
By the end of the day, my tracker file will contain a date tree with all
the tasks I done in the day.
All tasks nicely clocked.
I generally create a clock report that look like this:
#+BEGIN_SRC
#+BEGIN: clocktable :scope subtree :maxlevel 4 :timestamp t
#+CAPTION: Clock summary at [2020-09-23 Wed 08:20]
| Timestamp | Headline | Time | | | |
|------------------------+------------------------------------------------+--------+---+------+------|
| | *Total time* | *6:40* | | | |
|------------------------+------------------------------------------------+--------+---+------+------|
| | \_ 2020-09-21 Monday | | | 7:40 | |
| [2020-09-21 Mon 08:54] | \_ check chat | | | | 0:36 |
| [2020-09-21 Mon 09:30] | \_ check reviews | | | | 0:41 |
| [2020-09-21 Mon 10:11] | \_ check emails | | | | 0:07 |
| [2020-09-21 Mon 10:37] | \_ review PR about xxx | | | | 0:44 |
| [2020-09-21 Mon 11:21] | \_ update my PR from feedbacks | | | | 0:36 |
| [2020-09-21 Mon 12:08] | \_ review John's PR about Foo | | | | 0:12 |
| [2020-09-21 Mon 13:41] | \_ review M's PR about Bar | | | | 0:11 |
| [2020-09-21 Mon 13:53] | \_ another thing | | | | 0:16 |
| [2020-09-21 Mon 14:09] | \_ review PR | | | | 0:51 |
| [2020-09-21 Mon 15:00] | \_ work on PR | | | | 1:30 |
| [2020-09-21 Mon 16:49] | \_ check another PR | | | | 0:33 |
| [2020-09-21 Mon 17:03] | \_ answer email | | | | 0:55 |
| [2020-09-21 Mon 17:58] | \_ Chat John about X | | | | 0:28 |
#+END_SRC
And that's mostly it for TODOs and tasks handling.
** Workflow 3: Add new tasks; org-capture / org-refile
:PROPERTIES:
:CUSTOM_ID: workflow-3--org-capture---org-refile
:END:
Another thing I do quite often.
I need to add new task to be done.
Be it for today or another day.
In that case, I generally use org-capture again.
This time I choose =t= for TODO and I generally detail the task to be done.
I add either a SCHEDULE (when I plan to start) or a DEADLINE (when this
must be finished) and I refile it.
So refile will start a fuzzy search to put this task under some subtree.
So instead of going to my =tracker.org= file, this goes to my =inbox.org=
file.
And it will appear in my agenda.
* Footnotes
:PROPERTIES:
:CUSTOM_ID: footnotes
:END:
[fn:emacs-digression]
/Short digression/:
Historically, I coded using different IDEs.
Then I worked for a company that forced me to use terrible keyboards and
after just a few weeks I started to have serious wrist issues.
So to minimize that pain I switched to vim.
And it was /awesome/.
Once you're use to the power of vim keybinding forever your soul will bound
to them.
So learning vim is a bit like learning a new music instrument.
You need to construct some muscle memory and integrate one after one new
tricks.
Once learned your personal editing power start to become overwhelming.
After a few years of vim, I wanted to try to explore new editor tooling.
So I switched to emacs using the spacemacs distribution.
So mainly it's vim but with even better keybindgs, helpers and within
emacs.
The main reason for the switch was that vimscript is a really bad language
to configure your editor.
Emacs use emacs-LISP.
For editor customization a LISP looked perfect to me.
LISP is still one of the most powerful and easy to use programming language
to date.
And recently, as my personal configuration started to grow so much I
switched to [[https://github.com/hlissner/doom-emacs][doom-emacs]].
I was quite hesitant to do the switch but so far its been a pleasure.
IMHO using [[https://github.com/hlissner/doom-emacs][doom-emacs]] is a lot better than using my own personal
configuration from scratch because I wouldn't be able to end up with so
much configuration quality.

View file

@ -9,6 +9,19 @@
#+MACRO: br @@html:<br/>@@
#+MACRO: pemail @@html: <a href="&#109;&#97;&#105;&#x6C;&#116;&#111;&#x3A;&#x79;&#x61;&#x6E;&#x6E;&#64;&#x65;&#x73;&#112;&#x6F;&#x73;&#105;&#x74;&#x6F;&#x2E;&#x68;&#x6F;&#x73;&#x74;">&#x59;&#x61;&#x6E;&#x6E;&#x20;&#x45;&#x73;&#x70;&#x6F;&#115;&#x69;&#116;&#x6F; &lt;&#x79;&#x61;&#x6E;&#x6E;&#64;&#x65;&#x73;&#112;&#x6F;&#x73;&#105;&#x74;&#x6F;&#x2E;&#x68;&#x6F;&#x73;&#x74;&gt;</a>@@
@@html:<nav>
<a href="/index.html">Home</a> |
<a href="/archive.html">Posts</a> |
<a href="/slides.html">Slides</a> |
<a href="/about-me.html">About</a>
<span class="details">
(<a href="https://gitea.esy.fun/yogsototh">code</a>
<a href="https://espial.esy.fun/u:yogsototh">bookmarks</a>
<a href="https://espial.esy.fun/u:yogsototh/notes">notes</a>)
</span>
</nav>@@
I'm a functional programmer, working remotely for Cisco.{{{br}}}
I work in Clojure and use Haskell/Purescript during the weekends.

View file

@ -44,6 +44,7 @@ goblins.
Those costume looks very bad and cheap.
So much you can only find them not terrorizing but funny and ridiculous.
#+ATTR_ORG: :width 560
#+ATTR_HTML: A goblin
#+CAPTION: One goblin during the introduction scene of Troll 2
#+NAME: fig:troll-2-intro
@ -55,6 +56,7 @@ To give you an idea, the only equal bad acting I ever witnessed was while
looking at amateurs first Youtube movies trying to follow a scenario.
Apparently most actors were amateurs, it was their first and last movie.
#+ATTR_ORG: :width 560
#+ATTR_HTML: A bad acting demonstration
#+CAPTION: One particularly terrible acting scene
#+NAME: fig:bad-acting
@ -83,6 +85,7 @@ They win against the monsters with, what I believe was a failed attempt at
humor.
It misses the point so bad, that the irony still make it funny.
#+ATTR_ORG: :width 560
#+ATTR_HTML: Eliott prevents his family to eat the food by urinating on the table
#+CAPTION: Our hero save the day by urinating on the table. His family is frozen for 30s said grandpa, they were for 70s.
#+NAME: fig:prevent-eating

View file

@ -27,15 +27,15 @@ browser or mobile phone app.
How geeks should chat in 2019?
To answer this question here is my opinion after having tried many
This post is about my opinion on the subject after having tried many
different chat solutions[fn:tries].
Here are the feature I think a modern solution should have:
Here is a list of the features I think a modern solution should have:
1. *terminal client* or *terminal-like UI* (in emacs for example).
All modern UI looks cool for screenshots, but if you are going to use it
a lot, you will prefer density over good looking.
Most app, web app are terrible related to information by number of pixel
ratio.
Most web apps are terrible when looking at delivered information by
number of pixels ratio.
2. *multi-platform*: If you do not have a terminal at hand (or emacs) then,
you should be able to get your message on your phone or via a web
interface for portability.
@ -49,9 +49,10 @@ Here are the feature I think a modern solution should have:
Chat should be about TEXT, not images, not videos, not presentations and
PDF.
7. *No anti-features*: show when someone is typing, show when someone
as read your message, etc... Those functionality are in fact increasing
social insecurity and forces you to answer sooner instead of really
taking the time to answer correctly.
as read your messages, etc... Those functionalities increase your
social insecurities feeling. They forces you to answer sooner instead of
really take the time to answer correctly. You can read Digitial
minimalism to know more about that subject[fn:dm].
8. *Free software*
I am quite disappointed by /modern/ chat applications.
@ -60,7 +61,7 @@ Their major problems are:
- *resource-heavy*; most those client applications (slack, gitter, riot,
mattermost, etc...) easily consume more than 300MB of RAM.
Most of the time those clients are all electron app.
Most of the time those clients are electron applications.
- *not private*; most solution do not encrypt your conversations.
Even if using encryption mechanism and you trust your client, and you
will still reveal your social network topology.
@ -207,7 +208,7 @@ server {
gzip off;
proxy_redirect off;
## Some requests take more than 30 seconds.
## Some requests take more than 30 seconds.
proxy_read_timeout 30s;
proxy_connect_timeout 30s;
@ -218,10 +219,10 @@ server {
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

View file

@ -1,3 +1,6 @@
:PROPERTIES:
:ID: c2e61938-8493-434a-9ffa-9fd4698d9863
:END:
#+Title: How to choose your tools
#+Author: Yann Esposito
#+Email: yann@esposito.host
@ -7,7 +10,7 @@
#+LANGUAGE: en
#+LANG: en
#+OPTIONS: H:5 auto-id:t
#+STARTUP: showeverything
+STARTUP: showeverything
This week I didn't take a look at HN to grab some news.
And this week-end, in the morning I read those:
@ -16,13 +19,11 @@ And this week-end, in the morning I read those:
- [[https://news.ycombinator.com/item?id=23107123][Making Emacs popular again]]
- [[https://news.ycombinator.com/item?id=23092904][Github Codespace]]
#+ATTR_ORG: :width 560
#+ATTR_HTML: :alt Midsommar Welcome
#+DOWNLOADED: https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse1.mm.bing.net%2Fth%3Fid%3DOIP.g7OSuCGH0u7OIUA9vdxlTAEsCo%26pid%3DApi&f=1 @ 2020-05-09 12:49:34
#+NAME: Welcome
#+CAPTION: Midsommar Welcome
[[file:2020-05-09_12-49-34_.jpeg]]
#+NAME: Welcome to Halsingland
#+CAPTION: Welcome to Halsingland
[[file:Welcome-to-Halsingland.jpg]]
Similar articles have existed for years on different products.
What is their common point?
@ -92,10 +93,10 @@ For the single developers and open source developers this offer:
But the price to pay is hidden.
#+ATTR_ORG: :width 560
#+ATTR_HTML: :alt Midsommar Sorrow
#+DOWNLOADED: https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse1.mm.bing.net%2Fth%3Fid%3DOIP.FrCRrhENMjdfD4pUcAwKEgHaEK%26pid%3DApi&f=1 @ 2020-05-09 12:48:31
#+CAPTION: Midsommar Sorrow
[[file:2020-05-09_12-48-31_.jpeg]]
[[file:midsommar-cry.jpg]]
@ -178,9 +179,10 @@ future.
:CUSTOM_ID: post-conclusion
:END:
#+ATTR_ORG: :width 560
#+ATTR_HTML: :alt Midsommar Joy
#+CAPTION: Midsommar Joy
[[./midsommar-joy.jpeg]]
[[./midsommar-joy.jpg]]
To go beyond my opinion, I'd like to share my experience with editors and
emacs.

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

View file

@ -43,9 +43,9 @@ So here is my piece of code I added to my doom-emacs =config.el=:
(t 'doom-laserwave))))
(when (not (equal doom-theme theme))
(setq doom-theme theme)
(load-theme doom-theme t)
;; run that function again next hour
(run-at-time (format "%02d:%02d" (+ hour 1) 0) nil 'y/auto-update-theme))))
(load-theme doom-theme t))
;; run that function again next hour
(run-at-time (format "%02d:%02d" (+ hour 1) 0) nil 'y/auto-update-theme)))
(y/auto-update-theme)
#+END_SRC

View file

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 179 KiB

View file

@ -0,0 +1,612 @@
:PROPERTIES:
:ID: 21c48431-c0db-4a34-95fe-7228fea6233f
:END:
#+TITLE: How I use org-mode
#+AUTHOR: Yann Esposito
#+EMAIL: yann@esposito.host
#+DATE: [2020-10-29 Thu]
#+KEYWORDS: org-mode
#+DESCRIPTION: How I use org-mode
#+OPTIONS: auto-id:t toc:t
#+begin_abstract
In this article I'll try to give an overview of my current use of [[https://orgmode.org][org mode]].
I use org mode for:
- tasks management & time tracking
- writing documents (articles, book, etc...)
- note taking ; which I consider slightly different from just writing documents
TL;DR:
- =SPC y a= ⇒ Show agenda view for today
- =SPC X= ⇒ Capture a new task, write a description, then =C-c C-c=, save
that in =tracker.org= (or =inbox.org= depending of the capture template)
- =SPC n o= ⇒ jump to the current time tracked tasks
- =SPC m c o= ⇒ stop the clock on that task; if you capture a new time
tracking tasks you don't need to clock-out
- =SPC y o r==org-refile=, meaning move that task somewhere else
- =SPC q= ⇒ add/remove tags to that task
#+end_abstract
In this article I would like to share a tool that was a real life changer
to me: [[http://orgmode.org][org mode]].
In my opinion emacs is worth learning just for org-mode.
This is by far the best solution I ever used to manage my tasks.
I tried a lot of differents tools before it, and this is the only one I
really stick with.
It is so versatile that it can adapt to your very specific needs.
The major difficulty faced by tasks management application is the wrong
level of complexity facing the user.
This is a very hard problem to tackle.
If your system is too simple, the users will not be able to manage the
tasks how they would like.
If your system is too complex, the user will be faced with too much
details.
So most successful systems have a way to adapt their apparent complexity to
the need of their users.
And org mode is exactly like that.
Not only starting with org mode can be extremely simple but also there are
mostly no complexity limit.
Either org mode already handle one of your need, or most of the time you
will find a package to fulfill your need.
And if not, it is easy to write your own.
Here is the result of a few years of improving my use of org mode.
Today I can say that org mode is part of my day to day life.
I still invest a bit of time to improve minor details of my workflow time
to time.
But now my daily workflow is mostly stable.
So I think I can share it.
** Overview
:PROPERTIES:
:CUSTOM_ID: overview
:END:
*** daily routine
:PROPERTIES:
:CUSTOM_ID: daily-routine
:END:
The first thing I do in the morning is to open =org-agenda= view for today.
It shows me the tasks planned for today.
What are urgent tasks, deadlines, tasks that have deadlines in a few days, etc...
I also have a glimpse of my habits, tasks that I should start at some hour
in the day, etc...
#+ATTR_ORG: :width 560
#+CAPTION: Org super calendar view
#+NAME: fig:org-super-agenda
[[./img/org-super-agenda.png]]
I then start to track (/clock/) the tasks I'm currently working on.
Often during the day, I need to create new tasks.
Most of the time I create a task and I add either a deadline or a schedule
date.
Sometime I also need to deal with interruptions.
In that case, I /capture/ the interruption that will also create a new task
being clocked.
At the end of the day, every tasks I worked on are saved in a =tracker.org=
file.
That file look like a date tree.
And I generally generate a /report/ that tell me how much hours I worked
today.
Some tasks are tagged =work=.
The report filter only on the =work= tagged tasks.
Also I have some repeating tasks like review memory cards using a spaced
repetition plugin.
I start it, and it shows me a few =cards= with questions that I review.
So mainly those cards contain info I want to keep in my mind and not only
in my notes.
*** document writing
:PROPERTIES:
:CUSTOM_ID: document-writing
:END:
Writing documents with org mode and in particular technical document is
just incredible.
Org mode feels a lot like markdown.
But org mode shine with its use of *org-babel*.
*org-babel* is used to execute code inside your document.
So you can execute block of code and get their result in block of code.
For technical writing this is extremely useful.
For example, I wrote most part of an OAuth2 provider in Clojure.
And to generate a documentation to some of our advanced users it is very
nice to provide the full HTTP request along the response.
But I also often need to play a few tricks in the doc and directly use our
Clojure code to generate JWT for example.
The great part is the ability to use those JWT generated from Clojure code
in the following code block making HTTP call.
That plus the natural ability to fold/unfold the tree structure of the org
mode file is great.
*** note taking
:PROPERTIES:
:CUSTOM_ID: note-taking
:END:
Time to time, I need to really take the time write note on a technical
subject or sometime about articles I read about anything.
For that I use [[https://github.com/org-roam/org-roam][org roam]].
I only started to use it a few months ago.
But this is a great addition to my previous workflow that used =deft= (that
I still use).
But I must say, this is pretty perfect as a note taking app.
Mainly you capture notes quite easily and put links about the subject, but
also tags.
In the end that generate a graph of notes that you could use later to dig
into your own notes.
*** journal
:PROPERTIES:
:CUSTOM_ID: journaling
:END:
Along with note taking.
I also try to write a journal note everyday.
For that I use org-journal (another org mode related package).
I have a default template which take care of a few metrics I want to focus on.
And I guess it is different for anyone of us.
** Task Management
:PROPERTIES:
:CUSTOM_ID: task-management
:END:
So here is a more detailed description about my org mode usage.
*** Workflow 1; planned tasks : org-agenda + clock
:PROPERTIES:
:CUSTOM_ID: worfklow-1--planned-tasks---org-agenda---clock
:END:
1. look at the current tasks planned for today
2. select a task, clock it
3. work on the task
4. back to the task and clock it out.
I work most of my using emacs[fn:emacs-digression].
Generally the first thing I do in the morning is opening `org-calendar`.
It looks like this:
#+ATTR_ORG: :width 560
#+CAPTION: Org super calendar view
#+NAME: fig:org-super-agenda
[[./img/org-super-agenda.png]]
Pretty brutalist interface which is a great thing to me.
Distraction free interface going to the essential.
With this view, I see what I planned to do today.
I also see a few "Due Soon" tasks in case I have the time to handle those.
When I start working on a task I start a clock on it (I simply type =I=
when my cursor is on the TODO line).
When I finished some task I change its status from TODO to something else.
Mainly I'm prompted when doing so:
#+BEGIN_SRC
{ [t] TODO [p] IN-PROGRESS [h] HOLD [w] WAITING
[d] DONE [c] CANCELLED [l] HANDLED }
#+END_SRC
And that's it.
The time spent on the task as been clocked I can work on another task.
Looking at the agenda view you could notice habits.
They start to become green when you are doing them correctly.
But generally, I don't use much direct clocking from the agenda.
Most of the time I prefer the capture mechanism.
Which bring us to "Workflow 2".
*** Workflow 2: Tracking; org-capture
:PROPERTIES:
:CUSTOM_ID: workflow-2--org-capture-org-refile
:END:
Most of the tasks I perform on the day are not planned.
I have a generic routine + some prepared events and tasks to performs.
But during the day you have multiple interruptions, and part of my job is
to write code reviews too.
I cannot plan those.
In that case I use =org-capture= along =org-refile=.
Mainly =org-capture= helps you create a new TODO entry.
And =org-refile= will help you move that TODO entry to the correct place.
So let say I get a direct message in the chat asking me to do something.
I generally start org capture (for me it's =SPC X=).
I am presented with the following choice:
#+BEGIN_SRC
Select a capture template
=========================
[t] todo
[c] chat
[e] email
[m] meeting
[p] pause
[r] review
[w] work
[i] interruption
[f] chore
---------------------------------------------------------------------------
[q] Abort
#+END_SRC
In my example it was a chat interruption.
So I type =i= that presents me with this
#+BEGIN_SRC
**** IN-PROGRESS | :interruption:
:LOGBOOK:
[2020-09-23 Wed 08:01]
ref :: [link-to-where-I-was-in-emacs-when-captured]
#+END_SRC
My cursor placed where the =|= is displayed.
Here I add the tag =chat= and a small description, "dm from John about X" for example.
Then I type =C-c C-c= and the TODO is placed in a =tracker.org= file under
a date tree that looks like this:
#+BEGIN_SRC org-mode
* 2020
** 2020-W39
*** 2020-09-21 Monday
*** 2020-09-22 Tuesday
*** 2020-09-23 Wednesday
**** IN-PROGRESS Chat with John about X :interruption:chat:
:LOGBOOK:
:END:
[2020-09-23 Wed 17:58]
ref ::
...
#+END_SRC
So the clock for this task started at the moment at made the capture.
In my workflow, I prefer to finish the capture and stop clock later.
So after I finished the capture, the clock is still running while the task
is put in my tracker file.
Once I finished with that task.
I can:
1. Jump to the tasks with =SPC n o= (=org-clock-goto=), and stop the
clock =SPC m c o= (=clock-out=).
2. Jump to the task and change its status to =DONE= which will stop the clock.
3. Capture another tasks which will stop the clock on the current task and
will start on the new one.
By the end of the day, my tracker file will contain a date tree with all
the tasks I done in the day.
All tasks nicely clocked.
I generally create a clock report that look like this:
#+BEGIN_SRC
#+BEGIN: clocktable :scope subtree :maxlevel 4 :timestamp t :narrow 36! :match "work"
#+CAPTION: Clock summary at [2020-09-23 Wed 08:20]
| Timestamp | Headline | Time | | | |
|------------------------+--------------------------------------+--------+---+------+------|
| | *Total time* | *6:40* | | | |
|------------------------+--------------------------------------+--------+---+------+------|
| | \_ 2020-09-21 Monday | | | 7:40 | |
| [2020-09-21 Mon 08:54] | \_ check chat | | | | 0:36 |
| [2020-09-21 Mon 09:30] | \_ check reviews | | | | 0:41 |
| [2020-09-21 Mon 10:11] | \_ check emails | | | | 0:07 |
| [2020-09-21 Mon 10:37] | \_ review PR about xxx | | | | 0:44 |
| [2020-09-21 Mon 11:21] | \_ update my PR from feedbacks | | | | 0:36 |
| [2020-09-21 Mon 12:08] | \_ review John's PR about Foo | | | | 0:12 |
| [2020-09-21 Mon 13:41] | \_ review M's PR about Bar | | | | 0:11 |
| [2020-09-21 Mon 13:53] | \_ another thing | | | | 0:16 |
| [2020-09-21 Mon 14:09] | \_ review PR | | | | 0:51 |
| [2020-09-21 Mon 15:00] | \_ work on PR | | | | 1:30 |
| [2020-09-21 Mon 16:49] | \_ check another PR | | | | 0:33 |
| [2020-09-21 Mon 17:03] | \_ answer email | | | | 0:55 |
| [2020-09-21 Mon 17:58] | \_ Chat John about X | | | | 0:28 |
#+END_SRC
And that's mostly it for TODOs and tasks handling.
*** Workflow 3: Add new tasks; org-capture / org-refile
:PROPERTIES:
:CUSTOM_ID: workflow-3--org-capture---org-refile
:END:
Another thing I do quite often.
I need to add new task to be done.
Be it for today or another day.
In that case, I generally use org-capture again.
This time I choose =t= for TODO and I generally detail the task to be done.
I add either a SCHEDULE (when I plan to start) or a DEADLINE (when this
must be finished) and I refile it.
So refile will start a fuzzy search to put this task under some subtree.
So instead of going to my =tracker.org= file, this goes to my =inbox.org=
file.
And it will appear in my agenda.
*** Configuration
:PROPERTIES:
:CUSTOM_ID: configuration
:END:
So to have all of that, I added a lot of configuration over time.
But here is the most important part.
Most of that config is what I personally think are better defaults.
And a minor part of it only is about how I organize myself.
#+BEGIN_SRC emacs-lisp
(defun org-mode-config ()
"Org-mode."
(setq org-extend-today-until 4
org-use-effective-time t)
(setq org-todo-keywords
'((sequence "TODO(t)"
"IN-PROGRESS(p)"
"|"
"DONE(d)"
"HOLD(h@/!)"
"CANCELED(c@/!)"
"HANDLED(l@/!)")
(sequence "|" "PAUSE(p)" "CHAT(c)" "EMAIL(e)" "MEETING(m)" "REVIEW(r)" "GEEK(g)")))
;;; Look & Feel
;; I like to have something different than ellipsis because I often use them
;; myself.
(setq org-ellipsis " [+]")
(custom-set-faces '(org-ellipsis ((t (:foreground "gray40" :underline nil)))))
(defun my-org-settings ()
(org-display-inline-images)
(setq fill-column 75)
(abbrev-mode)
(org-indent-mode)
nil)
(add-hook 'org-mode-hook #'my-org-settings)
(setq org-tags-column 69)
;; src block indentation / editing / syntax highlighting
(setq org-src-fontify-natively t
org-src-window-setup 'current-window ;; edit in current window
org-src-preserve-indentation t ;; do not put two spaces on the left
org-src-tab-acts-natively t)
;; *** Templates
;; the %a refer to the place you are in emacs when you make the capture
;; that's very neat when you do that in an email for example.
(setq org-capture-templates
'(("t" "todo" entry (file "~/.org/inbox.org")
"* TODO %?\n%U\n- ref :: %a\n")
;; time tracker (clocked tasks)
("g" "geek" entry (file+olp+datetree "~/.org/tracker.org")
"* GEEK %? :perso:\n%U\n- ref :: %a\n"
:prepend t :tree-type week :clock-in t :clock-keep t)
("c" "chat" entry (file+olp+datetree "~/.org/tracker.org")
"* CHAT %? :work:chat:\n%U\n- ref :: %a\n"
:prepend t :tree-type week :clock-in t :clock-keep t)
("e" "email" entry (file+olp+datetree "~/.org/tracker.org")
"* EMAIL %? :work:email:\n%U\n- ref :: %a\n"
:prepend t :tree-type week :clock-in t :clock-keep t)
("m" "meeting" entry (file+olp+datetree "~/.org/tracker.org")
"* MEETING %? :work:meeting:\n%U\n- ref :: %a\n"
:prepend t :tree-type week :clock-in t :clock-keep t)
("r" "review" entry (file+olp+datetree "~/.org/tracker.org")
"* REVIEW %? :work:review:\n%U\n- ref :: %a\n"
:prepend t :tree-type week :clock-in t :clock-keep t)
("w" "work" entry (file+olp+datetree "~/.org/tracker.org")
"* IN-PROGRESS %? :work:\n%U\n- ref :: %a\n"
:prepend t :tree-type week :clock-in t :clock-keep t)
("p" "pause" entry (file+olp+datetree "~/.org/tracker.org")
"* PAUSE %? :pause:\n%U\n- ref :: %a\n"
:prepend t :tree-type week :clock-in t :clock-keep t)
("i" "interruption" entry (file+olp+datetree "~/.org/tracker.org")
"* IN-PROGRESS %? :interruption:work:\n%U\n- ref :: %a\n"
:prepend t :tree-type week :clock-in t :clock-keep t)
("f" "chore" entry (file "~/.org/inbox.org")
"* IN-PROGRESS %? :chore:\n%U\n"
:clock-in t :clock-keep t)))
;; How to create default clocktable
(setq org-clock-clocktable-default-properties
'(:scope subtree :maxlevel 4 :timestamp t :link t :tags t :narrow 36! :match "work"))
;; How to display default clock report in agenda view
(setq org-agenda-clockreport-parameter-plist
'(:lang "en" :maxlevel 4 :fileskip0 t :link t :indent t :narrow 80!))
;; *** Projectile; default TODO file to create in your projects
(setq org-projectile-file "inbox.org")
;; *** Refile mapped to SPC y o r
(map! :leader :desc "org-refile" "y o r" #'org-refile)
;; Refile to either the =refile.org= file or to =agenda.org= org =standup.org=
(setq org-refile-target-files
'("~/.org/tracker.org"
"~/.org/inbox.org"))
(setq org-refile-targets
'((nil :maxlevel . 5)
(org-refile-target-files :maxlevel . 5)))
;; *** Agenda
(setq org-log-into-drawer t) ;; hide the log state change history a bit better
(setq org-agenda-files org-refile-target-files)
(setq org-deadline-warning-days 7)
(setq org-agenda-skip-scheduled-if-deadline-is-shown t)
(setq org-habit-show-habits-only-for-today nil)
(setq org-habit-graph-column 65)
(setq org-duration-format 'h:mm) ;; show hours at max, not days
(setq org-agenda-compact-blocks t)
;; default show today
(setq org-agenda-span 'day)
(setq org-agenda-start-day "-0d")
(setq org-agenda-start-on-weekday nil)
(setq org-agenda-custom-commands
'(("d" "Done tasks" tags "/DONE|CANCELED")
("g" "Plan Today"
((agenda "" ((org-agenda-span 'day)))
(org-agenda-skip-function '(org-agenda-skip-deadline-if-not-today))
(org-agenda-entry-types '(:deadline))
(org-agenda-overriding-header "Today's Deadlines ")))))
(setq org-agenda-window-setup 'only-window)
(defun y/go-to-today-agenda ()
(interactive)
(org-agenda nil "a"))
;; Faster jump to agenda today keybinding shortcut (SPC y a)
(map! :leader
:desc "Today's agenda"
"y a" #'y/go-to-today-agenda)
;; ** Org Annotate
;; Ability to take annotate some files, can of double usage with org-capture.
;; Still, I keep that keyboard shortcut here.
;; (evil-leader/set-key "oa" 'org-annotate-file)
(setq org-annotate-file-storage-file "~/.org/annotations.org")
;; ** Org colums
;; Can be nice sometime to have that column view
;; give a felling of Excel view
(setq org-columns-default-format
"%TODO %3PRIORITY %40ITEM(Task) %17Effort(Estimated Effort){:} %CLOCKSUM %8TAGS(TAG)")
(map! :leader "y o c" #'org-columns)
;; ** Deft
;; useful to find files and jump to them
(setq deft-extensions '("org" "gpg" "md" "txt"))
(setq deft-recursive t)
(setq deft-use-filter-string-for-filename t)
(setq deft-default-extension "org")
(setq deft-directory "~/.org")
;; Org Babel
(org-babel-do-load-languages
'org-babel-load-languages
'(;; other Babel languages
(shell . t)
(http . t)
(clojure . t)
(haskell . t)
(plantuml . t) ;; UML graphs
(gnuplot . t)))
(setq org-plantuml-jar-path "~/bin/plantuml.jar"))
(use-package! org
:config (org-mode-config))
#+END_SRC
And also
#+BEGIN_SRC emacs-lisp
(use-package! org-super-agenda
:after org-agenda
:custom (org-super-agenda-groups
'( ;; Each group has an implicit boolean OR operator between its selectors.
(:name "Overdue" :deadline past :order 0)
(:name "Evening Habits" :and (:habit t :tag "evening") :order 8)
(:name "Habits" :habit t :order 6)
(:name "Today" ;; Optionally specify section name
:time-grid t ;; Items that appear on the time grid (scheduled/deadline with time)
:order 3) ;; capture the today first but show it in order 3
(:name "Low Priority" :priority "C" :tag "maybe" :order 7)
(:name "Due Today" :deadline today :order 1)
(:name "Important"
:and (:priority "A" :not (:todo ("DONE" "CANCELED")))
:order 2)
(:name "Due Soon" :deadline future :order 4)
(:name "Todo" :not (:habit t) :order 5)
(:name "Waiting" :todo ("WAITING" "HOLD") :order 9)))
:config
(setq org-super-agenda-header-map nil)
(org-super-agenda-mode t))
#+END_SRC
** Conclusions
:PROPERTIES:
:CUSTOM_ID: conclusions
:END:
That article is already quite long.
But if you intend to dig into org mode, this can be a nice default starting point.
I haven't really dig into some details but only given you the ability to
start not completely from scratch and with decent default values for an
already advanced usage.
To resume:
- =SPC y a= ⇒ Show agenda view for today
- =SPC X= ⇒ Capture a new task, write a description, then =C-c C-c=, save
that in =tracker.org= (or =inbox.org= depending of the capture template)
- =SPC n o= ⇒ jump to the current time tracked tasks
- =SPC m c o= ⇒ stop the clock on that task; if you capture a new time
tracking tasks you don't need to clock-out
- =SPC y o r==org-refile=, meaning move that task somewhere else
- =SPC q= ⇒ add/remove tags to that task
** Footnotes
:PROPERTIES:
:CUSTOM_ID: footnotes
:END:
:PROPERTIES:
:CUSTOM_ID: footnotes
:END:
[fn:emacs-digression]
/Short digression/:
Historically, I coded using different IDEs.
Then I worked for a company that forced me to use terrible keyboards and
after just a few weeks I started to have serious wrist issues.
So to minimize that pain I switched to vim.
And it was /awesome/.
Once you're use to the power of vim keybinding forever your soul will bound
to them.
So learning vim is a bit like learning a new music instrument.
You need to construct some muscle memory and integrate one after one new
tricks.
Once learned your personal editing power start to become overwhelming.
After a few years of vim, I wanted to try to explore new editor tooling.
So I switched to emacs using the spacemacs distribution.
So mainly it's vim but with even better keybindgs, helpers and within
emacs.
The main reason for the switch was that vimscript is a really bad language
to configure your editor.
Emacs use emacs-LISP.
For editor customization a LISP looked perfect to me.
LISP is still one of the most powerful and easy to use programming language
to date.
And recently, as my personal configuration started to grow so much I
switched to [[https://github.com/hlissner/doom-emacs][doom-emacs]].
I was quite hesitant to do the switch but so far its been a pleasure.
IMHO using [[https://github.com/hlissner/doom-emacs][doom-emacs]] is a lot better than using my own personal
configuration from scratch because I wouldn't be able to end up with so
much configuration quality.

View file

@ -16,12 +16,8 @@
<input name="t" type="radio" id="d">
<div id="labels">
<div class="content">
<label for="l">light</label> | <label for="d">dark</label>
</div>
</div>
<div class="main">
<div id="preamble" class="status">
<div id="logo">
<label for="l">light</label>
<span id="logo">
<a href="/">
<svg width="5em" viewBox="0 0 64 64">
<circle cx="32" cy="32" r="30" stroke="var(--b2)" stroke-width="2" fill="var(--b03)"/>
@ -30,7 +26,12 @@
<ellipse cx="32" cy="14" rx="14" ry="8" stroke-width="0" fill="var(--b3)"/>
</svg>
</a>
</div>
</span>
<label for="d">dark</label>
</div>
</div>
<div class="main">
<div id="preamble" class="status">
<div class="content"><h1>{{title}}</h1></div>
</div>
<div id="content">

View file

@ -13,12 +13,8 @@
<input name="t" type="radio" id="d">
<div id="labels">
<div class="content">
<label for="l">light</label> | <label for="d">dark</label>
</div>
</div>
<div class="main">
<div id="preamble" class="status">
<div id="logo">
<label for="l">light</label>
<span id="logo">
<a href="/">
<svg viewBox="0 0 64 64">
<circle cx="32" cy="32" r="30" stroke="var(--b2)" stroke-width="2" fill="var(--b03)"/>
@ -27,7 +23,12 @@
<ellipse cx="32" cy="14" rx="14" ry="8" stroke-width="0" fill="var(--b3)"/>
</svg>
</a>
</div>
</span>
<label for="d">dark</label>
</div>
</div>
<div class="main">
<div id="preamble" class="status">
<div class="content">
<h1>{{title}}</h1>
<div class="meta">