<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>emre şahin's digital garden 🍃 - productivity</title>
    <link>https://emresahin.net/tags/productivity/</link>
    <description>Posts in the productivity tag</description>
    <language>en</language>
    <managingEditor>contact@emresahin.net (Emre Şahin)</managingEditor>
    <lastBuildDate>Tue, 15 Sep 2026 19:46:32 +0000</lastBuildDate>
    <atom:link href="https://emresahin.net/tags/productivity/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>devlog 31</title>
      <published>2025-06-07T10:29:03+00:00</published>
      <updated>2025-06-07T10:29:03+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Sat, 07 Jun 2025 10:29:03 +0000</pubDate>
      <link>https://emresahin.net/devlog-31/</link>
      <guid isPermaLink="true">https://emresahin.net/devlog-31/</guid>
      <description>🐢 I think sending Alt keys in Ghostty needs some love. Let’s start with it as an easy task for the day. 🐇 While checking macos-option-as-alt as a potential source of the problem, I spent time adjusting the Ghostty icon . I changed the app icon. This is how I spend my time being extremely producti...</description>
      <category>shell</category>
      <category>tmux</category>
      <category>ghostty</category>
      <category>productivity</category>
      <category>macos</category>
      <category>terminal</category>
      <content:encoded><![CDATA[<p>🐢 I think sending Alt keys in Ghostty needs some love. Let’s start with it as an easy task for the day.</p>
<p>🐇 While checking <a href="https://ghostty.org/docs/config/reference#macos-option-as-alt"><code>macos-option-as-alt</code></a> as a potential source of the problem, I spent time <a href="https://ghostty.org/docs/config/reference#macos-icon">adjusting the Ghostty icon</a>. I changed the app icon. This is how I spend my time being extremely productive.</p>
<p>🐢 Weird. The <code>Option as alt</code> key setting is fine.</p>
<p>🐇 Actually, the Alt key works; the reason we cannot make panes larger is that <code>Alt-Right</code> and <code>Alt-Left</code> are not bound to this.</p>
<p>🐢 You may be right, yes. Then, what’s the key to enlarge a pane?</p>
<p>🦊 List all the keys. Check the keys. You should have done this already.</p>
<pre><code class="language-shell">$ tmux list-keys | rg resize

bind-key    -T prefix       &gt;                      display-menu -T "#[align=centre]#{pane_index} (#{pane_id})" -x P -y P "#{?#{m/r:(copy|view)-mode,#{pane_mode}},Go To Top,}" &lt; { send-keys -X history-top } "#{?#{m/r:(copy|view)-mode,#{pane_mode}},Go To Bottom,}" &gt; { send-keys -X history-bottom } '' "#{?mouse_word,Search For #[underscore]#{=/9/...:mouse_word},}" C-r { if-shell -F "#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}" "copy-mode -t=" ; send-keys -X -t = search-backward "#{q:mouse_word}" } "#{?mouse_word,Type #[underscore]#{=/9/...:mouse_word},}" C-y { copy-mode -q ; send-keys -l "#{q:mouse_word}" } "#{?mouse_word,Copy #[underscore]#{=/9/...:mouse_word},}" c { copy-mode -q ; set-buffer "#{q:mouse_word}" } "#{?mouse_line,Copy Line,}" l { copy-mode -q ; set-buffer "#{q:mouse_line}" } '' "#{?mouse_hyperlink,Type #[underscore]#{=/9/...:mouse_hyperlink},}" C-h { copy-mode -q ; send-keys -l "#{q:mouse_hyperlink}" } "#{?mouse_hyperlink,Copy #[underscore]#{=/9/...:mouse_hyperlink},}" h { copy-mode -q ; set-buffer "#{q:mouse_hyperlink}" } '' "Horizontal Split" h { split-window -h } "Vertical Split" v { split-window -v } '' "#{?#{&gt;:#{window_panes},1},,-}Swap Up" u { swap-pane -U } "#{?#{&gt;:#{window_panes},1},,-}Swap Down" d { swap-pane -D } "#{?pane_marked_set,,-}Swap Marked" s { swap-pane } '' Kill X { kill-pane } Respawn R { respawn-pane -k } "#{?pane_marked,Unmark,Mark}" m { select-pane -m } "#{?#{&gt;:#{window_panes},1},,-}#{?window_zoomed_flag,Unzoom,Zoom}" z { resize-pane -Z }
bind-key    -T prefix       z                      resize-pane -Z
bind-key -r -T prefix       M-Up                   resize-pane -U 5
bind-key -r -T prefix       M-Down                 resize-pane -D 5
bind-key -r -T prefix       M-Left                 resize-pane -L 5
bind-key -r -T prefix       C-Up                   resize-pane -U
bind-key -r -T prefix       C-Down                 resize-pane -D
bind-key -r -T prefix       C-Left                 resize-pane -L
bind-key -r -T prefix       C-Right                resize-pane -R
bind-key    -T root         MouseDown3Pane         if-shell -F -t = "#{||:#{mouse_any_flag},#{&amp;&amp;:#{pane_in_mode},#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}}}" { select-pane -t = ; send-keys -M } { display-menu -T "#[align=centre]#{pane_index} (#{pane_id})" -t = -x M -y M "#{?#{m/r:(copy|view)-mode,#{pane_mode}},Go To Top,}" &lt; { send-keys -X history-top } "#{?#{m/r:(copy|view)-mode,#{pane_mode}},Go To Bottom,}" &gt; { send-keys -X history-bottom } '' "#{?mouse_word,Search For #[underscore]#{=/9/...:mouse_word},}" C-r { if-shell -F "#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}" "copy-mode -t=" ; send-keys -X -t = search-backward "#{q:mouse_word}" } "#{?mouse_word,Type #[underscore]#{=/9/...:mouse_word},}" C-y { copy-mode -q ; send-keys -l "#{q:mouse_word}" } "#{?mouse_word,Copy #[underscore]#{=/9/...:mouse_word},}" c { copy-mode -q ; set-buffer "#{q:mouse_word}" } "#{?mouse_line,Copy Line,}" l { copy-mode -q ; set-buffer "#{q:mouse_line}" } '' "#{?mouse_hyperlink,Type #[underscore]#{=/9/...:mouse_hyperlink},}" C-h { copy-mode -q ; send-keys -l "#{q:mouse_hyperlink}" } "#{?mouse_hyperlink,Copy #[underscore]#{=/9/...:mouse_hyperlink},}" h { copy-mode -q ; set-buffer "#{q:mouse_hyperlink}" } '' "Horizontal Split" h { split-window -h } "Vertical Split" v { split-window -v } '' "#{?#{&gt;:#{window_panes},1},,-}Swap Up" u { swap-pane -U } "#{?#{&gt;:#{window_panes},1},,-}Swap Down" d { swap-pane -D } "#{?pane_marked_set,,-}Swap Marked" s { swap-pane } '' Kill X { kill-pane } Respawn R { respawn-pane -k } "#{?pane_marked,Unmark,Mark}" m { select-pane -m } "#{?#{&gt;:#{window_panes},1},,-}#{?window_zoomed_flag,Unzoom,Zoom}" z { resize-pane -Z } }
bind-key    -T root         MouseDrag1Border       resize-pane -M
bind-key    -T root         M-MouseDown3Pane       display-menu -T "#[align=centre]#{pane_index} (#{pane_id})" -t = -x M -y M "#{?#{m/r:(copy|view)-mode,#{pane_mode}},Go To Top,}" &lt; { send-keys -X history-top } "#{?#{m/r:(copy|view)-mode,#{pane_mode}},Go To Bottom,}" &gt; { send-keys -X history-bottom } '' "#{?mouse_word,Search For #[underscore]#{=/9/...:mouse_word},}" C-r { if-shell -F "#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}" "copy-mode -t=" ; send-keys -X -t = search-backward "#{q:mouse_word}" } "#{?mouse_word,Type #[underscore]#{=/9/...:mouse_word},}" C-y { copy-mode -q ; send-keys -l "#{q:mouse_word}" } "#{?mouse_word,Copy #[underscore]#{=/9/...:mouse_word},}" c { copy-mode -q ; set-buffer "#{q:mouse_word}" } "#{?mouse_line,Copy Line,}" l { copy-mode -q ; set-buffer "#{q:mouse_line}" } '' "#{?mouse_hyperlink,Type #[underscore]#{=/9/...:mouse_hyperlink},}" C-h { copy-mode -q ; send-keys -l "#{q:mouse_hyperlink}" } "#{?mouse_hyperlink,Copy #[underscore]#{=/9/...:mouse_hyperlink},}" h { copy-mode -q ; set-buffer "#{q:mouse_hyperlink}" } '' "Horizontal Split" h { split-window -h } "Vertical Split" v { split-window -v } '' "#{?#{&gt;:#{window_panes},1},,-}Swap Up" u { swap-pane -U } "#{?#{&gt;:#{window_panes},1},,-}Swap Down" d { swap-pane -D } "#{?pane_marked_set,,-}Swap Marked" s { swap-pane } '' Kill X { kill-pane } Respawn R { respawn-pane -k } "#{?pane_marked,Unmark,Mark}" m { select-pane -m } "#{?#{&gt;:#{window_panes},1},,-}#{?window_zoomed_flag,Unzoom,Zoom}" z { resize-pane -Z }
</code></pre>
<p>🐇 <code>resize-pane</code> has keys, but they conflict with <code>C-Right</code>, etc., which are macOS display selection keys. I defined <code>M-S-Right</code>, etc., to resize and <code>M-C-Right</code>, etc., to swap the panes. Defining new keys with <code>M-S</code>…</p>
<pre><code class="language-tmux">bind-key -n "M-S-Right" resize-pane -R 10
bind-key -n "M-S-Left" resize-pane -L 10
bind-key -n "M-S-Up" resize-pane -U 10
bind-key -n "M-S-Down" resize-pane -D 10
</code></pre>
<p>🐢 We can set keys to swap windows too, maybe to <code>M-C-PageDown</code>, etc. <code>M-PageDown</code> now moves between windows.</p>
<p>🐇 Let’s take a look at the command options:</p>
<pre><code class="language-text">     swap-window [-d] [-s src-window] [-t dst-window]
                   (alias: swapw)
             This is similar to link-window, except the source and destination windows are swapped.  It is an error if no window exists at src-window.  If -d is given, the new window
             does not become the current window.

             If -s is omitted and a marked pane is present (see select-pane -m), the window containing the marked pane is used rather than the current window.
</code></pre>
<p>🐢 The use case will be limited, though.</p>
<p>🐇 Umm, right. Let’s stop procrastinating here.</p>
<p>🐢 It was productive procrastination, though. Now I can resize my tmux panes.</p>]]></content:encoded>
    </item>
    <item>
      <title>Merging all Tmux windows in a single session</title>
      <published>2024-06-12T21:24:15+00:00</published>
      <updated>2024-06-12T21:24:15+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Wed, 12 Jun 2024 21:24:15 +0000</pubDate>
      <link>https://emresahin.net/merging-all-tmux-windows-in-a-single-session/</link>
      <guid isPermaLink="true">https://emresahin.net/merging-all-tmux-windows-in-a-single-session/</guid>
      <description>I use a new Tmux session for each day. Over time, I noticed that sessions proliferate, and I often need windows from earlier sessions in a central location. This script merges all windows from all Tmux sessions into a single session. You must specify the target session as a parameter. If you save...</description>
      <category>Shell</category>
      <category>Terminal</category>
      <category>Tmux</category>
      <category>Script</category>
      <category>Zsh</category>
      <category>Automation</category>
      <category>Productivity</category>
      <content:encoded><![CDATA[<p>I use a new Tmux session for each day. Over time, I noticed that sessions proliferate, and I often need windows from earlier sessions in a central location.</p>
<p>This script merges all windows from all Tmux sessions into a single session. You must specify the target session as a parameter. If you save the script as <code>merge-tmux-sessions.zsh</code>, you can run it like:</p>
<pre><code class="language-bash">merge-tmux-sessions.zsh my-current-session
</code></pre>
<p>It will then move all windows into the session you specify.</p>
<pre><code class="language-zsh">#!/bin/zsh

# set -vuex
#
#  Specify the target session

target_session=$1

# Get the list of all sessions

sessions=$(tmux list-sessions -F '#S')

# Iterate through each session

for session in ${(@f)sessions}; do
    if [ "$session" != "$target_session" ]; then
        # Get the list of windows in the current session
        windows=$(tmux list-windows -t $session -F '#I')

        # Move each window to the target session
        for window in ${(@f)windows}; do
            tmux move-window -s ${session}:${window} -t ${target_session}
        done
    fi

done
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Bits 9</title>
      <published>2024-05-24T21:02:38+00:00</published>
      <updated>2024-05-24T21:02:38+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Fri, 24 May 2024 21:02:38 +0000</pubDate>
      <link>https://emresahin.net/bits-9/</link>
      <guid isPermaLink="true">https://emresahin.net/bits-9/</guid>
      <description>I have quite a few LazyVim plugins, but this simple keymapping makes my life much easier: vim.keymap.set({ "n", "i" }, "&lt;F2&gt;", '&lt;esc&gt;&lt;esc&gt;yy:r!&lt;c-r&gt;"') I type a command, like ls , on a line and hit &lt;F2&gt; . That line is copied, executed, and the output is read into the buffer just below it. I use i...</description>
      <category>Bits</category>
      <category>Tools</category>
      <category>Neovim</category>
      <category>Shell</category>
      <category>LazyVim</category>
      <category>Productivity</category>
      <category>Workflow</category>
      <content:encoded><![CDATA[<p>I have quite a few LazyVim plugins, but this simple keymapping makes my life much easier:</p>
<pre><code class="language-lua">vim.keymap.set({ "n", "i" }, "&lt;F2&gt;", '&lt;esc&gt;&lt;esc&gt;yy:r!&lt;c-r&gt;"')
</code></pre>
<p>I type a command, like <code>ls</code>, on a line and hit <code>&lt;F2&gt;</code>. That line is copied, executed, and the output is read into the buffer just below it.</p>
<p>I use it for all sorts of tasks, from listing open PRs with <code>gh</code> to fetching website text with <code>w3m</code>. It has significantly improved my workflow, allowing me to use the shell effectively within textual notebooks.</p>]]></content:encoded>
    </item>
    <item>
      <title>bits 6</title>
      <published>2024-05-23T16:33:49+00:00</published>
      <updated>2024-05-23T16:33:49+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Thu, 23 May 2024 16:33:49 +0000</pubDate>
      <link>https://emresahin.net/bits-6/</link>
      <guid isPermaLink="true">https://emresahin.net/bits-6/</guid>
      <description>We’re using Graphite at work. Today, I configured a tmux shortcut to open a new pane and run gt create , which creates a new branch and commits all staged Git files. bind-key -n S-F12 split-window -h -c "#{pane_current_path}" "gt c" I just hit Shift-F12, and it opens a new pane in the current dir...</description>
      <category>bits</category>
      <category>tmux</category>
      <category>graphite</category>
      <category>cli</category>
      <category>git</category>
      <category>workflow</category>
      <category>productivity</category>
      <content:encoded><![CDATA[<p>We’re using <a href="https://graphite.dev">Graphite</a> at work. Today, I configured a tmux
shortcut to open a new pane and run <code>gt create</code>, which creates a new branch and
commits all staged Git files.</p>
<pre><code>bind-key -n S-F12 split-window -h -c "#{pane_current_path}" "gt c"
</code></pre>
<p>I just hit Shift-F12, and it opens a new pane in the current directory and runs the
command.</p>]]></content:encoded>
    </item>
    <item>
      <title>Burnouts</title>
      <published>2022-07-24T16:28:47+00:00</published>
      <updated>2022-07-24T16:28:47+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Sun, 24 Jul 2022 16:28:47 +0000</pubDate>
      <link>https://emresahin.net/Burnouts/</link>
      <guid isPermaLink="true">https://emresahin.net/Burnouts/</guid>
      <description>I read about burnout from time to time. Most comments suggest that it’s not just about working for long hours. My take is similar. Burnout is not necessarily related to hours , but rather to control. If you’re working on a project where you can express yourself , you can probably work longer with...</description>
      <category>work</category>
      <category>psychology</category>
      <category>burnout</category>
      <category>alienation</category>
      <category>Marx</category>
      <category>productivity</category>
      <category>meaning</category>
      <content:encoded><![CDATA[<p>I read about burnout from time to time.
Most comments suggest that it’s not just about <em>working for long hours.</em>
My take is similar.
Burnout is not necessarily related to <em>hours</em>, but rather to <em>control.</em>
If you’re working on a project where you can <em>express yourself</em>, you can probably work longer with little risk of burnout.
Otherwise, even if the work is <em>easy</em> or <em>simple</em>, if you don’t have control over the outcome or the results don’t carry your name, working less won’t prevent burnout.</p>
<p>In March, I realized that I had lost my enthusiasm for my work.
It’s mainly a writing job.
I noticed I was <em>forcing</em> myself to work.
Normally, this shouldn’t happen.
I like writing, I like the team, and I like my colleagues, so what was happening?
I asked for a sabbatical to start in July.
Now, I think it was a case of burning out.
I was becoming alienated from the job, and it was depleting my willpower.
I usually avoid work that requires me to spend my willpower over a long period.</p>
<p>I’ve begun to think that <em>burnout</em> is something similar to what Marx called <em>alienation.</em>
Software development (or technical writing) is mostly a mental job.
Your motivation and your talents should align.
Otherwise, it becomes a chore, and you have to spend more and more willpower.
Willpower, as recent studies show, is a finite resource.
So, spending it on something for a long period probably causes burnout.</p>
<p>So, why does alienation happen in our line of work?
It’s probably the same story as in <em>less mental, more menial</em> jobs.
One has to feel that they are <em>building a cathedral</em> instead of just <em>building a wall.</em>
If you believe that you’re building a cathedral, even if you work much longer, your enthusiasm rarely wanes.
If you believe <em>you’re just doing what your superiors ask</em>, it shadows the vision that leads to enthusiasm.</p>
<p>Burnout is a <em>natural defense mechanism</em> for the second type of work.
People need meaning in their lives more than anything else.
We can suppress our emotions for some time to achieve material benefits.
But if we can’t find meaning in the endeavor and just postpone that <em>meaning</em> to an indefinite future, it leaks.
And eventually, it breaks.</p>
<p>This is probably why lower-level employees experience <em>burnout</em> more than those at higher levels.
At higher levels, you need a vision—albeit sometimes a superficial one—to manage people.
At lower levels, this is often less possible.</p>
<p>To avoid burnout, we need more meaning in our work.
If you can’t find meaning in your work, at least try to find some outside of it.</p>]]></content:encoded>
    </item>
    <item>
      <title>Activate left window when the current one is closed in tmux</title>
      <published>2022-02-16T07:08:25+00:00</published>
      <updated>2022-02-16T07:08:25+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Wed, 16 Feb 2022 07:08:25 +0000</pubDate>
      <link>https://emresahin.net/Activate-left-window-when-the-current-one-is-closed-in-tmux/</link>
      <guid isPermaLink="true">https://emresahin.net/Activate-left-window-when-the-current-one-is-closed-in-tmux/</guid>
      <description>When I close a window in tmux, it typically activates the window to its right. I prefer the previously active window to be activated instead. I couldn’t find a direct setting for this, but tmux provides hooks for various events. By setting the window-unlinked hook to trigger last-window , I can a...</description>
      <category>CLI</category>
      <category>Tools</category>
      <category>tmux</category>
      <category>configuration</category>
      <category>hooks</category>
      <category>productivity</category>
      <content:encoded><![CDATA[<p>When I close a window in tmux, it typically activates the window to its right. I
prefer the previously active window to be activated instead. I couldn’t find a
direct setting for this, but tmux provides <a href="https://man7.org/linux/man-pages/man1/tmux.1.html#HOOKS">hooks</a>
for various events. By setting the <code>window-unlinked</code> hook to trigger <code>last-window</code>,
I can achieve the desired behavior.</p>
<p>Add the following to your <code>.tmux.conf</code>:</p>
<pre><code class="language-conf">set-hook -g window-unlinked 'last-window'
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Risk-Taking Energy</title>
      <published>2022-02-12T06:39:22+00:00</published>
      <updated>2022-02-12T06:39:22+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Sat, 12 Feb 2022 06:39:22 +0000</pubDate>
      <link>https://emresahin.net/risk-taking-energy/</link>
      <guid isPermaLink="true">https://emresahin.net/risk-taking-energy/</guid>
      <description>There is a limited amount of energy within any organization. This energy determines whether people are willing to take risks. If employees don’t believe that taking a risk will improve their standing or provide a meaningful reward, they won’t take it. Instead, an infinite amount of low-impact, “s...</description>
      <category>Management</category>
      <category>Leadership</category>
      <category>Organizational Culture</category>
      <category>energy</category>
      <category>organization</category>
      <category>motivation</category>
      <category>risk</category>
      <category>risk-taking</category>
      <category>employee-engagement</category>
      <category>productivity</category>
      <content:encoded><![CDATA[<p>There is a limited amount of energy within any organization. This energy
determines whether people are willing to take risks. If employees don’t believe
that taking a risk will improve their standing or provide a meaningful reward,
they won’t take it. Instead, an infinite amount of low-impact, “safe” work will
fill their time and consume their energy.</p>
<p>There is a common delusion that if people are busy working, they are
contributing. However, true contribution often stems from taking calculated
risks.</p>
<p>Why should they take the risk? It is often more rational for employees to focus
on small, low-stakes tasks than to take on challenges that push boundaries. Why
should they bother improving software performance, for example, when the most
frequent requests they receive are related to minor UI changes? The former
carries a higher risk of failure and is technically more demanding, while the
latter is easier to achieve and often more visible, making it seem more
rewarding.</p>]]></content:encoded>
    </item>
    <item>
      <title>Configuring Vim Undotree</title>
      <published>2021-01-02T16:16:59+00:00</published>
      <updated>2021-01-02T16:16:59+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Sat, 02 Jan 2021 16:16:59 +0000</pubDate>
      <link>https://emresahin.net/configuring-vim-undotree/</link>
      <guid isPermaLink="true">https://emresahin.net/configuring-vim-undotree/</guid>
      <description>To enable persistent undo and configure the undotree plugin, add the following settings to your vimrc file: " Save undo trees in files set undofile set undodir=~/.vim/undo " Number of undo levels saved set undolevels=10000 For more information on intermediate Vim usage, see this guide .</description>
      <category>Vim</category>
      <category>Tools</category>
      <category>Vim</category>
      <category>Undotree</category>
      <category>Productivity</category>
      <category>Configuration</category>
      <category>Vimrc</category>
      <content:encoded><![CDATA[<p>To enable persistent undo and configure the <a href="https://github.com/mbbill/undotree">undotree</a> plugin, add the following settings to your <code>vimrc</code> file:</p>
<pre><code class="language-vim">" Save undo trees in files
set undofile
set undodir=~/.vim/undo

" Number of undo levels saved
set undolevels=10000
</code></pre>
<p>For more information on intermediate Vim usage, see <a href="https://thevaluable.dev/vim-intermediate/">this guide</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>aerc and goneovim</title>
      <published>2020-05-12T18:47:03+00:00</published>
      <updated>2020-05-12T18:47:03+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Tue, 12 May 2020 18:47:03 +0000</pubDate>
      <link>https://emresahin.net/aerc-and-goneovim--3894/</link>
      <guid isPermaLink="true">https://emresahin.net/aerc-and-goneovim--3894/</guid>
      <description>aerc I’ve started using aerc as my command-line email client. Initially, I used its archived GitHub repository, but I found the software to be buggy. Switching to the active repository provided me with the fastest IMAP client I’ve ever used. Its asynchronous operations make the workflow incredibl...</description>
      <category>development</category>
      <category>tools</category>
      <category>aerc</category>
      <category>neovim</category>
      <category>goneovim</category>
      <category>hugo</category>
      <category>miniflux</category>
      <category>Go</category>
      <category>golang</category>
      <category>productivity</category>
      <content:encoded><![CDATA[<h2 id="aerc">aerc</h2>
<p>I’ve started using <a href="https://aerc-mail.org/">aerc</a> as my command-line email client. Initially, I used its archived GitHub repository, but I found the software to be buggy. Switching to the active repository provided me with the fastest IMAP client I’ve ever used. Its asynchronous operations make the workflow incredibly smooth, as you don’t have to wait for the server after deleting or archiving each email.</p>
<h2 id="goneovim">goneovim</h2>
<p>I’ve also begun using a Neovim GUI called <a href="https://github.com/akiyosi/goneovim">goneovim</a>. I previously used <a href="https://github.com/daa84/neovim-gtk">Neovim-GTK</a>, but encountered issues—possibly due to Fira Code’s ligatures or other incompatibilities—that resulted in poor visuals and noticeable lag. I’m giving this new GUI a try, and so far, Fira Code and its ligatures are working perfectly.</p>
<p>Software written in Go is occupying more mindshare than I previously anticipated. Alongside <a href="https://gohugo.io">Hugo</a>, the <a href="https://miniflux.app/">Miniflux</a> self-hosted RSS client, and the <a href="https://github.com/vkuznecovas/mouthful">Mouthful</a> comment server, these tools demonstrate that Go has truly taken off for system and performance-related tasks.</p>]]></content:encoded>
    </item>
    <item>
      <title>TIL May 1</title>
      <published>2020-05-01T22:19:07+00:00</published>
      <updated>2020-05-01T22:19:07+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Fri, 01 May 2020 22:19:07 +0000</pubDate>
      <link>https://emresahin.net/til-may-1--17222/</link>
      <guid isPermaLink="true">https://emresahin.net/til-may-1--17222/</guid>
      <description>Nota seems like a nice command-line calculator. It converts what you type into ASCII art formulas. In[1]: 10 + 10 Out[1]: 20.0 _____ In[2]: ╲╱ 100 Out[2]: 10.0 ┌ ┐ In[3]: Max │ 10 , 1 , 21 , -3 │ └ ┘ Out[3]: 21.0 In[4]: ⟨Emre's Number⟩ ≡ 79 Out[4]: 79.0 _______________ In[5]: ╲╱ Emre's Number Out...</description>
      <category>TIL</category>
      <category>Nota</category>
      <category>CLI</category>
      <category>Calculator</category>
      <category>Haskell</category>
      <category>Intention</category>
      <category>Productivity</category>
      <category>Git</category>
      <category>Bash</category>
      <category>Zsh</category>
      <content:encoded><![CDATA[<ul>
<li><a href="https://kary.us/nota/">Nota</a> seems like a nice command-line calculator. It converts what you type into ASCII art formulas.</li>
</ul>
<pre><code>  In[1]: 10 + 10

 Out[1]: 20.0


           _____
  In[2]: ╲╱ 100

 Out[2]: 10.0


             ┌                  ┐
  In[3]: Max │ 10 , 1 , 21 , -3 │
             └                  ┘

 Out[3]: 21.0


  In[4]: ⟨Emre's Number⟩ ≡  79

 Out[4]: 79.0


           _______________
  In[5]: ╲╱ Emre's Number

 Out[5]: 8.888194417315589


                      2
  In[6]: Emre's Number

 Out[6]: 6241.0


                      Emre's Number
  In[7]: Emre's Number

 Out[7]: 8.1759873707105095e149

</code></pre>
<pre><code>It looks a bit heavy for a CLI calculator, as it is written in Haskell and downloads 100+ MB of libraries, but when you need ASCII art to display your calculations or want to use spaces in variable names, it may prove useful.
</code></pre>
<ul>
<li>
<p>I began to use <a href="https://www.getintention.com/">Intention</a> to limit my Twitter time. It allows you to set a limited time (1, 5, 10, or 15 minutes) for yourself and tracks the total time you spend on <em>addictive sites.</em> When this total time is lower than your goal for a period, you get a streak. It looks visually and psychologically nicer than LeechBlock.</p>
</li>
<li>
<p>I read the <a href="http://www.git-scm.com/book/en/v2/Git-Tools-Reset-Demystified"><code>git reset</code></a> section in the Git book. It details how <code>git reset</code> behaves with its <code>--soft</code>, <code>--mixed</code>, and <code>--hard</code> parameters. The first resets only the <code>HEAD</code>; the second resets both the index and <code>HEAD</code>; and the third resets the working tree and copies files back from the current <code>HEAD</code> to the working tree.</p>
<p>One important point: Contrasting <code>git checkout master</code> and <code>git reset master</code>: the first moves <code>HEAD</code> to the <code>master</code> branch, while the second moves the current branch to <code>master</code>.</p>
<p><code>git reset</code> can also be used to squash commits. Basically, you <code>git reset --mixed</code> to an earlier commit like <code>HEAD~3</code> and recommit. This creates a new commit, taking <code>HEAD~3</code> as the parent and skipping <code>HEAD~2</code> and <code>HEAD~1</code>, resulting in a new <code>HEAD</code>.</p>
</li>
<li>
<p><a href="https://github.com/dylanaraps/pure-bash-bible">Here</a> are many useful pure Bash functions to be used in scripts. I’m a Zsh person, but writing Bash scripts is more portable, of course.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Regular and Recurring Tasks in todo.txt</title>
      <published>2018-02-06T10:23:22+00:00</published>
      <updated>2018-02-06T10:23:22+00:00</updated>
      <author>Emre Şahin</author>
      <pubDate>Tue, 06 Feb 2018 10:23:22 +0000</pubDate>
      <link>https://emresahin.net/recurrent-todo-txt-14085-74577/</link>
      <guid isPermaLink="true">https://emresahin.net/recurrent-todo-txt-14085-74577/</guid>
      <description>I use the todo.txt format to manage some of my daily tasks. It’s a plain-text format, and both iOS and Android have apps, such as SimpleTasks . Emacs and Vim also support the format. Actually, you don’t need a special editor for it; the format is so simple that even Notepad is sufficient. I have ...</description>
      <category>Productivity</category>
      <category>Automation</category>
      <category>todo.txt</category>
      <category>zsh</category>
      <category>productivity</category>
      <category>cron</category>
      <category>linux</category>
      <content:encoded><![CDATA[<p>I use the <a href="http://todotxt.org/">todo.txt format</a> to manage some of my daily tasks. It’s a
plain-text format, and both iOS and Android have apps, such as
<a href="https://play.google.com/store/apps/details?id=nl.mpcjanssen.todotxtholo">SimpleTasks</a>. <a href="https://github.com/avillafiorita/todotxt-mode">Emacs</a> and <a href="https://github.com/freitass/todo.txt-vim">Vim</a> also support
the format. Actually, you don’t need a special editor for it; the format
is so simple that even Notepad is sufficient.</p>
<p>I have a shell script to add daily recurring tasks, such as “Drink Water” or
“Pray Maghreb,” to this file. SimpleTasks expects the file to be at
<code>$HOME/Dropbox/todo/todo.txt</code>, and I use a template file, such as <code>template.txt</code>,
to populate it. However, as anyone who has used TODO files knows, there are
always unfinished tasks; for instance, I don’t always drink my daily allotted
amount of water.</p>
<p>So, my evening script moves completed tasks (marked as DONE) to their own file,
removes recurring tasks from <code>todo.txt</code>, and repopulates them for a new day.
(Note: The code below is not usable as-is; you must define the <code>TODO</code>, <code>DONE</code>,
and <code>TEMPLATE</code> file paths correctly.)</p>
<pre><code class="language-zsh">
TODO=.../todo.txt
DONE=.../$(date +%F)-done.txt
TEMPLATE=.../template.txt

#Move Done to $DONE
grep -wE '^x ' $TODO &gt;&gt; $DONE
sed -i '/^x /d' $TODO

#Delete lines with @Evening, @Morning or @Regular tags from todo
sed -i "/\b\(@Morning|@Evening|@Regular\)\b/d" $TODO
cat $TODO_TEMPLATE &gt;&gt; $TODO
</code></pre>
<p>I have configured <code>cron</code> to run this every day at 6 PM. (My “evening” starts
earlier than my morning.)</p>]]></content:encoded>
    </item>
  </channel>
</rss>
