<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pietrangelo Masala</title>
    <description>The latest articles on DEV Community by Pietrangelo Masala (@pietrangelo).</description>
    <link>https://dev.to/pietrangelo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F351708%2Fc4a2c62f-ac47-4a7e-b2b6-20214c3c5fd3.jpeg</url>
      <title>DEV Community: Pietrangelo Masala</title>
      <link>https://dev.to/pietrangelo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pietrangelo"/>
    <language>en</language>
    <item>
      <title>Integrating the Helix editor and Tmux</title>
      <dc:creator>Pietrangelo Masala</dc:creator>
      <pubDate>Tue, 02 Sep 2025 05:59:53 +0000</pubDate>
      <link>https://dev.to/pietrangelo/integrating-the-helix-editor-and-tmux-1dmd</link>
      <guid>https://dev.to/pietrangelo/integrating-the-helix-editor-and-tmux-1dmd</guid>
      <description>&lt;p&gt;In a previous article, I shared my configuration for Helix and Zellij. This time, I’d like to share a similar setup, but focused on integrating the Helix editor with tmux.&lt;/p&gt;

&lt;p&gt;I decided to switch from Zellij to tmux for two main reasons: to resolve keybindings conflicts between applications, and because I found Zellij’s configuration to be too rigid for my workflow, ultimately causing more trouble than it was worth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tmux Configuration
&lt;/h3&gt;

&lt;p&gt;I use a few different terminal emulators on my Linux distribution, partly to experiment with new ones like Ghostty, and partly due to my Wayland setup. I have configured my system to automatically launch a new tmux session whenever I open a new instance of my terminal.&lt;br&gt;
To achieve this, I added the following rule to my ~/.bashrc file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Automatically start tmux&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TMUX&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TERM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"xterm-kitty"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TERM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"xterm-ghostty"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;tmux attach &lt;span class="o"&gt;||&lt;/span&gt; tmux new-session
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script checks if the &lt;code&gt;$TMUX&lt;/code&gt; variable is set. If it is, which indicates a tmux session is already active, the terminal attaches to it. Otherwise, it creates a new session. This rule is applied specifically to Kitty and Ghostty terminals.&lt;/p&gt;

&lt;p&gt;Next, I've modified my &lt;code&gt;~/.tmux.conf&lt;/code&gt; to ensure that new windows and panes open in the same directory as the currently active pane:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Open new windows and panes in the current working directory&lt;/span&gt;
&lt;span class="nb"&gt;bind &lt;/span&gt;c new-window &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"#{pane_current_path}"&lt;/span&gt;
&lt;span class="nb"&gt;bind&lt;/span&gt; &lt;span class="s1"&gt;'"'&lt;/span&gt; split-window &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"#{pane_current_path}"&lt;/span&gt;
&lt;span class="nb"&gt;bind&lt;/span&gt; % split-window &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"#{pane_current_path}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Helix Configuration
&lt;/h3&gt;

&lt;p&gt;First things first, here are the contents of my &lt;strong&gt;config.toml&lt;/strong&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;theme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"catppuccin_mocha"&lt;/span&gt;

&lt;span class="nn"&gt;[editor]&lt;/span&gt;
&lt;span class="c"&gt;# show currently open buffers, only when more than one exists.&lt;/span&gt;
&lt;span class="py"&gt;bufferline&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"multiple"&lt;/span&gt;
&lt;span class="c"&gt;# Highlight all lines with a cursor&lt;/span&gt;
&lt;span class="py"&gt;cursorline&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c"&gt;# Use relative line numbers&lt;/span&gt;
&lt;span class="py"&gt;line-number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"relative"&lt;/span&gt;
&lt;span class="c"&gt;# Show a ruler at column 120&lt;/span&gt;
&lt;span class="py"&gt;rulers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c"&gt;# Forse the theme to show colors&lt;/span&gt;
&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="py"&gt;-color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c"&gt;# Enable mouse usage&lt;/span&gt;
&lt;span class="py"&gt;mouse&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c"&gt;# Change color for modes&lt;/span&gt;
&lt;span class="py"&gt;color-modes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[editor.cursor-shape]&lt;/span&gt;
&lt;span class="py"&gt;insert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"bar"&lt;/span&gt;
&lt;span class="py"&gt;normal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"block"&lt;/span&gt;
&lt;span class="py"&gt;select&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"underline"&lt;/span&gt;

&lt;span class="nn"&gt;[editor.lsp]&lt;/span&gt;
&lt;span class="c"&gt;# Disable automatically popups of signature parameter help&lt;/span&gt;
&lt;span class="py"&gt;auto-signature-help&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="c"&gt;# Show LSP messages in the status line&lt;/span&gt;
&lt;span class="py"&gt;display-messages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[editor.file-picker]&lt;/span&gt;
&lt;span class="py"&gt;git-global&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="py"&gt;hidden&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="nn"&gt;[editor.statusline]&lt;/span&gt;
&lt;span class="py"&gt;left&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"spinner"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;center&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"file-name"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;right&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"version-control"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"diagnostics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"selections"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"file-encoding"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"file-line-ending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"file-type"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;separator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"│"&lt;/span&gt;
&lt;span class="py"&gt;mode.normal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"NORMAL"&lt;/span&gt;
&lt;span class="py"&gt;mode.insert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"INSERT"&lt;/span&gt;
&lt;span class="py"&gt;mode.select&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SELECT"&lt;/span&gt;

&lt;span class="nn"&gt;[editor.indent-guides]&lt;/span&gt;
&lt;span class="py"&gt;render&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;character&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"╎"&lt;/span&gt; &lt;span class="c"&gt;# Some characters that work well: "▏", "┆", "┊", "⸽"&lt;/span&gt;
&lt;span class="py"&gt;skip-levels&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="nn"&gt;[editor.whitespace]&lt;/span&gt;
&lt;span class="py"&gt;render&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"all"&lt;/span&gt;
&lt;span class="c"&gt;# or control each character&lt;/span&gt;
&lt;span class="c"&gt;#[editor.whitespace.render]&lt;/span&gt;
&lt;span class="py"&gt;space&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"all"&lt;/span&gt;
&lt;span class="py"&gt;tab&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"all"&lt;/span&gt;
&lt;span class="py"&gt;nbsp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"all"&lt;/span&gt;
&lt;span class="py"&gt;nnbsp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"all"&lt;/span&gt;
&lt;span class="py"&gt;newline&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"all"&lt;/span&gt;

&lt;span class="nn"&gt;[editor.whitespace.characters]&lt;/span&gt;
&lt;span class="py"&gt;space&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"·"&lt;/span&gt;
&lt;span class="py"&gt;nbsp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"⍽"&lt;/span&gt;
&lt;span class="py"&gt;nnbsp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"␣"&lt;/span&gt;
&lt;span class="py"&gt;tab&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"→"&lt;/span&gt;
&lt;span class="py"&gt;newline&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"⏎"&lt;/span&gt;
&lt;span class="py"&gt;tabpad&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"·"&lt;/span&gt; &lt;span class="c"&gt;# Tabs will look like "→···" (depending on tab width)&lt;/span&gt;

&lt;span class="nn"&gt;[keys.normal]&lt;/span&gt;
&lt;span class="py"&gt;"A-,"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"goto_previous_buffer"&lt;/span&gt;
&lt;span class="py"&gt;"A-."&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"goto_next_buffer"&lt;/span&gt;
&lt;span class="py"&gt;"A-w"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":buffer-close"&lt;/span&gt;
&lt;span class="py"&gt;"A-|"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"repeat_last_motion"&lt;/span&gt;
&lt;span class="py"&gt;"A-x"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"extend_to_line_bounds"&lt;/span&gt;
&lt;span class="py"&gt;"X"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"extend_line_up"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"extend_to_line_bounds"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;"C-r"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":config-reload"&lt;/span&gt;
&lt;span class="py"&gt;"C-s"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":w"&lt;/span&gt;
&lt;span class="py"&gt;"C-j"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"extend_to_line_bounds"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"delete_selection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"paste_after"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;"C-k"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"extend_to_line_bounds"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"delete_selection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"move_line_up"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"paste_before"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;"C-g"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh tmux popup -d &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;#{pane_current_path}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt; -xC -yC -w80%% -h80%% -E /home/linuxbrew/.linuxbrew/bin/lazygit"&lt;/span&gt;
&lt;span class="py"&gt;"C-t"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh tmux split-window -v -l '35%%'"&lt;/span&gt;

&lt;span class="nn"&gt;[keys.normal."A-r"]&lt;/span&gt;
&lt;span class="c"&gt;# Rust compile and run shortcuts&lt;/span&gt;
&lt;span class="py"&gt;"b"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh cargo build"&lt;/span&gt;
&lt;span class="py"&gt;"r"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh cargo run"&lt;/span&gt;
&lt;span class="py"&gt;"t"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh cargo test"&lt;/span&gt;

&lt;span class="c"&gt;# Golang compile and run shortcuts&lt;/span&gt;
&lt;span class="nn"&gt;[keys.normal."A-g"]&lt;/span&gt;
&lt;span class="py"&gt;"b"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh go build ."&lt;/span&gt;
&lt;span class="py"&gt;"r"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh go run ."&lt;/span&gt;
&lt;span class="py"&gt;"t"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh go test ."&lt;/span&gt;

&lt;span class="c"&gt;# Insert secure complex password of 36 chars&lt;/span&gt;
&lt;span class="nn"&gt;[keys.normal."A-i"]&lt;/span&gt;
&lt;span class="py"&gt;"p"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":append-output pwgen -snycB1 36"&lt;/span&gt;

&lt;span class="c"&gt;# tmux pane settings&lt;/span&gt;
&lt;span class="nn"&gt;[keys.normal."A-t"]&lt;/span&gt;
&lt;span class="py"&gt;"v"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh tmux split-window -h"&lt;/span&gt;
&lt;span class="py"&gt;"h"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":sh tmux split-window -v"&lt;/span&gt;

&lt;span class="nn"&gt;[keys.select]&lt;/span&gt;
&lt;span class="py"&gt;"A-x"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"extend_to_line_bounds"&lt;/span&gt;
&lt;span class="py"&gt;"X"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"extend_line_up"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"extend_to_line_bounds"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the Helix configuration file, you can see several keybindings designed to integrate with tmux.&lt;br&gt;
For example, in the &lt;code&gt;[keys.normal."A-t"]&lt;/code&gt; section, I have set up bindings that use tmux to manage panes. Pressing &lt;strong&gt;Alt+t&lt;/strong&gt; in normal mode provides two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v&lt;/code&gt;: Opens a new vertical tmux pane.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h&lt;/code&gt;: Opens a new horizontal tmux pane.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, the &lt;strong&gt;Ctrl+t&lt;/strong&gt; binding is configured to create a new horizontal pane that occupies 35% of the window's height.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; that movement between these tmux panes must be handled by your standard tmux keybindings, not by Helix.&lt;/p&gt;

</description>
      <category>helix</category>
      <category>editor</category>
      <category>terminal</category>
      <category>programming</category>
    </item>
    <item>
      <title>Helix and Zellij</title>
      <dc:creator>Pietrangelo Masala</dc:creator>
      <pubDate>Sun, 08 Oct 2023 09:10:31 +0000</pubDate>
      <link>https://dev.to/pietrangelo/helix-and-zellij-34km</link>
      <guid>https://dev.to/pietrangelo/helix-and-zellij-34km</guid>
      <description>&lt;p&gt;I really like the &lt;a href="https://helix-editor.com/" rel="noopener noreferrer"&gt;Helix&lt;/a&gt; text editor among all the common ones, for its simplicity and its support out of the box for every language I use.&lt;/p&gt;

&lt;p&gt;The only thing I'm missing is a valid way to call the terminal from it, and make the terminal open in the same path I'm working on. &lt;/p&gt;

&lt;p&gt;To accomplish this I'm using &lt;a href="https://zellij.dev/" rel="noopener noreferrer"&gt;Zellij&lt;/a&gt; which is a terminal multiplexer with batteries included, indeed it is presented as a terminal workspace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zellij Configuration
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zellij.dev/" rel="noopener noreferrer"&gt;Zellij&lt;/a&gt; allows you to create some custom layouts, that can be invoked at startup, to better adapt it to the work you are going to do. &lt;/p&gt;

&lt;p&gt;The following is mine configuration to work with the Helix text editor. I have saved this configuration under this path &lt;code&gt;~/.config/zellij/layouts/helix.kdl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;layout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;pane&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;size=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;borderless=&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;plugin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;location=&lt;/span&gt;&lt;span class="s2"&gt;"zellij:tab-bar"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;pane&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hx"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;args&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;pane&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;split_direction=&lt;/span&gt;&lt;span class="s2"&gt;"vertical"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;size=&lt;/span&gt;&lt;span class="s2"&gt;"20%"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="err"&gt;pane&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;size=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;borderless=&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;plugin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;location=&lt;/span&gt;&lt;span class="s2"&gt;"zellij:status-bar"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which results in the following layout:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6574te1lc0180j0x9ni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6574te1lc0180j0x9ni.png" alt="Zellij with Helix editor" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Helix running in the top pane with a terminal console in another pane at the bottom, in the same path of the project I'm working with!! and this is exactly the goal I wanted to achieve.&lt;/p&gt;

&lt;h2&gt;
  
  
  System Configuration
&lt;/h2&gt;

&lt;p&gt;Now to launch zellij with the custom layout and an instance of Helix I need to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zellij &lt;span class="nt"&gt;--layout&lt;/span&gt; ~/.config/zellij/layouts/helix.kdl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the path I want to run Helix from.&lt;/p&gt;

&lt;p&gt;Now to simplify that command i created an alias &lt;code&gt;zhx&lt;/code&gt; and saved it inside my &lt;code&gt;~/.bashrc&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;zhx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'zellij --layout $HOME/.config/zellij/layouts/helix.kdl'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this configuration, every time I need to spawn a new instance of Helix, I just need to type &lt;em&gt;zhx&lt;/em&gt; inside the directory I want to work with and &lt;a href="https://zellij.dev/" rel="noopener noreferrer"&gt;Zellij&lt;/a&gt; will call &lt;a href="https://helix-editor.com/" rel="noopener noreferrer"&gt;Helix&lt;/a&gt; for me and make it open the project automatically.&lt;/p&gt;

</description>
      <category>editor</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
