feat!: replace zellij with tuios, default to ghostty + kitty (#349)

* feat!: replace zellij with tuios and switch to ghostty + kitty

Terminal environment overhaul:

- add the tuios flake input (upstream 0.8.5; nixpkgs has 0.8.1) and link
  the checked-in config out-of-store; auto-start tuios in nushell instead
  of zellij
- remove zellij entirely: both modules, config, README and nushell
  completions
- remove foot and alacritty, which lack the Kitty graphics protocol;
This commit is contained in:
ryan4yin | 二花 authored and GitHub committed 2026-10-03 02:34:31 +08:00
1 parent a1ec97d3a2
commit 42641e2fdf
33 files changed
+920 -745

No files matched your search

+4 -6
View File
@@ -59,8 +59,8 @@ You don't have to go through the pain I've experienced again! Check out my
| **Display Manager** | [greetd][greetd] + [tuigreet][tuigreet] |
| **Window Manager** | [Niri][Niri] |
| **Desktop Shell** | [Noctalia][noctalia] — bar/notifications/launcher/lock screen/control center/power menu/screenshots, one native shell |
| **Terminal Emulators** | [foot][foot], [Kitty][Kitty], [Alacritty][Alacritty], [Ghostty][Ghostty] |
| **Terminal Multiplexer** | [Zellij][Zellij] |
| **Terminal Emulators** | [Kitty][Kitty], [Ghostty][Ghostty] |
| **Terminal Multiplexer** | [tuios][tuios] |
| **Shell** | [Nushell][Nushell] + [Starship][Starship] |
| **Editors / IDE** | [Zed][Zed] (GUI, primary), VS Code (GUI); [Helix][Helix] (TUI, primary), [Neovim][Neovim] (TUI, backup) |
| **Color Scheme** | [catppuccin-nix][catppuccin-nix] |
@@ -84,7 +84,7 @@ Wallpapers: https://github.com/ryan4yin/wallpapers
![btop monitoring and system information](./_img/2026-10-01_btop-monitoring-system-info.webp)
![Helix, Zellij, and AI agents](./_img/2026-10-02_helix-zellij-ai-agents.webp)
![Helix and AI agents in a terminal workspace](./_img/2026-10-02_helix-ai-agents.webp)
## Editors / IDE
@@ -194,8 +194,6 @@ Other dotfiles that inspired me:
[Niri]: https://github.com/YaLTeR/niri
[greetd]: https://github.com/kennylevinsen/greetd
[Kitty]: https://github.com/kovidgoyal/kitty
[foot]: https://codeberg.org/dnkl/foot
[Alacritty]: https://github.com/alacritty/alacritty
[Ghostty]: https://github.com/ghostty-org/ghostty
[Nushell]: https://github.com/nushell/nushell
[Starship]: https://github.com/starship/starship
@@ -204,7 +202,7 @@ Other dotfiles that inspired me:
[flypy]: https://flypy.cc/
[Btop]: https://github.com/aristocratos/btop
[mpv]: https://github.com/mpv-player/mpv
[Zellij]: https://github.com/zellij-org/zellij
[tuios]: https://github.com/Gaurav-Gosain/tuios
[Helix]: https://github.com/helix-editor/helix
[Neovim]: https://github.com/neovim/neovim
[Zed]: https://zed.dev
File renamed without changes.

Before

Width:  |  Height:  |  Size: 526 KiB

After

Width:  |  Height:  |  Size: 526 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

Generated
+176
View File
@@ -116,6 +116,27 @@
"type": "github"
}
},
"devshell": {
"inputs": {
"nixpkgs": [
"tuios",
"nixpkgs"
]
},
"locked": {
"lastModified": 1768818222,
"narHash": "sha256-460jc0+CZfyaO8+w8JNtlClB2n4ui1RbHfPTLkpwhU8=",
"owner": "numtide",
"repo": "devshell",
"rev": "255a2b1725a20d060f566e4755dbf571bbbb5f76",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "devshell",
"type": "github"
}
},
"disko": {
"inputs": {
"nixpkgs": [
@@ -200,6 +221,22 @@
"type": "github"
}
},
"flake-compat_5": {
"flake": false,
"locked": {
"lastModified": 1761640442,
"narHash": "sha256-AtrEP6Jmdvrqiv4x2xa5mrtaIp3OEe8uBYCDZDS+hu8=",
"owner": "nix-community",
"repo": "flake-compat",
"rev": "4a56054d8ffc173222d09dad23adf4ba946c8884",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
@@ -260,6 +297,42 @@
"type": "github"
}
},
"flake-parts_4": {
"inputs": {
"nixpkgs-lib": [
"tuios",
"nixpkgs"
]
},
"locked": {
"lastModified": 1787559586,
"narHash": "sha256-onL0VLf9vPllmT0H/OlURIU5r5t5WIEl7t4tVNKT0Nw=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "9d0d87172c374f89da73c1cfe6d81ae62feac1f1",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-root": {
"locked": {
"lastModified": 1723604017,
"narHash": "sha256-rBtQ8gg+Dn4Sx/s+pvjdq3CB2wQNzx9XGFq/JVGCB6k=",
"owner": "srid",
"repo": "flake-root",
"rev": "b759a56851e10cb13f6b8e5698af7b59c44be26e",
"type": "github"
},
"original": {
"owner": "srid",
"repo": "flake-root",
"type": "github"
}
},
"git-hooks": {
"inputs": {
"flake-compat": [
@@ -285,6 +358,31 @@
"type": "github"
}
},
"git-hooks-nix": {
"inputs": {
"flake-compat": [
"tuios",
"flake-compat"
],
"nixpkgs": [
"tuios",
"nixpkgs"
]
},
"locked": {
"lastModified": 1787424939,
"narHash": "sha256-O2tBn84NNuHrnqNVxx/XqsXwfYvS1YwBh+7CBnbCYsk=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "809414f0cdadf82cf11b06c2b29ba9b3168b3297",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
@@ -518,6 +616,35 @@
"type": "github"
}
},
"nix-fast-build": {
"inputs": {
"flake-parts": [
"tuios",
"flake-parts"
],
"nixpkgs": [
"tuios",
"nixpkgs"
],
"treefmt-nix": [
"tuios",
"treefmt-nix"
]
},
"locked": {
"lastModified": 1787488599,
"narHash": "sha256-oe3nq8sRFRLtRHQgnNqD26ETFfXtQ4tJPgP7RryApRE=",
"owner": "Mic92",
"repo": "nix-fast-build",
"rev": "d5a820b15111cf70b2eb1fef94a4d65ded1a555f",
"type": "github"
},
"original": {
"owner": "Mic92",
"repo": "nix-fast-build",
"type": "github"
}
},
"nix-gaming": {
"inputs": {
"flake-compat": "flake-compat_2",
@@ -872,6 +999,7 @@
"preservation": "preservation",
"pyclipsync": "pyclipsync",
"rust-overlay": "rust-overlay",
"tuios": "tuios",
"wallpapers": "wallpapers"
}
},
@@ -962,6 +1090,54 @@
"type": "github"
}
},
"treefmt-nix_2": {
"inputs": {
"nixpkgs": [
"tuios",
"nixpkgs"
]
},
"locked": {
"lastModified": 1786901030,
"narHash": "sha256-WSFCsDSE5ffgD2MqzkM2CYjeFiKhRF/dJUN8uedb6YE=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "27b3b12a8e6375f28ebe122f07d230ca5459bbfa",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"tuios": {
"inputs": {
"devshell": "devshell",
"flake-compat": "flake-compat_5",
"flake-parts": "flake-parts_4",
"flake-root": "flake-root",
"git-hooks-nix": "git-hooks-nix",
"nix-fast-build": "nix-fast-build",
"nixpkgs": [
"nixpkgs"
],
"treefmt-nix": "treefmt-nix_2"
},
"locked": {
"lastModified": 1790956816,
"narHash": "sha256-NGYHcUREpbCNfynyid6DMFCxK7cvvbkF2n2UWk0Swyk=",
"owner": "Gaurav-Gosain",
"repo": "tuios",
"rev": "661bd4fb2e451613442d593c09631bb321492e98",
"type": "github"
},
"original": {
"owner": "Gaurav-Gosain",
"repo": "tuios",
"type": "github"
}
},
"wallpapers": {
"flake": false,
"locked": {
+8 -1
View File
@@ -55,7 +55,7 @@
# https://github.com/catppuccin/nix
# main carries the rust-overlay-style deprecation fix for its vscode
# package (nodejs -> nodejs-slim); v26.05 still emits the eval warning.
# package (nodejs -> nodejs-slim).
catppuccin = {
url = "github:catppuccin/nix/main";
inputs.nixpkgs.follows = "nixpkgs";
@@ -165,5 +165,12 @@
url = "github:ryan4yin/pyclipsync/v0.1.3";
inputs.nixpkgs.follows = "nixpkgs";
};
# terminal window manager / multiplexer; nixpkgs lags behind upstream,
# so track the upstream flake.
tuios = {
url = "github:Gaurav-Gosain/tuios";
inputs.nixpkgs.follows = "nixpkgs";
};
};
}
+1 -1
View File
@@ -12,7 +12,7 @@ home/
│ │ ├── shells/ # Shell configurations (bash, Nushell)
│ │ └── ...
│ ├── gui/ # GUI applications and desktop settings
│ │ ├── terminal/ # Terminal emulators (Kitty, Alacritty, etc.)
│ │ ├── terminal/ # Terminal emulators (Ghostty, Kitty, etc.)
│ │ └── ...
│ ├── tui/ # Terminal/TUI applications
│ │ ├── editors/ # Heavy editor/tooling pkgs only (`packages.nix`; core editors live under `core/editors`)
+2 -6
View File
@@ -20,8 +20,6 @@ systems.
- **theme.nix**: Color schemes and theming
- **xdg.nix**: XDG base-directory configuration
- **yazi.nix**: Terminal file manager configuration
- **zellij/**: Terminal multiplexer (enable + `zj` alias; config and layouts live in
`tui/zellij/`)
### Desktop Environment
@@ -30,10 +28,8 @@ systems.
- **media.nix**: Media players and utilities
- **zed-editor.nix**: Zed editor configuration (primary GUI editor)
- **terminal/**: Terminal emulator configurations
- **alacritty/**: Alacritty terminal
- **ghostty.nix**: Ghostty terminal (default)
- **kitty.nix**: Kitty terminal
- **foot.nix**: Foot terminal (Linux)
- **ghostty.nix**: Ghostty terminal
### Terminal Interface
@@ -49,7 +45,7 @@ systems.
- **password-store/**: Password management with pass
- **shell/**: Shell environment configurations
- **ssh.nix**: SSH configuration and management
- **zellij/**: Terminal workspace management
- **tuios/**: Terminal window manager / multiplexer (config + nushell auto-start)
### System Management
+2 -4
View File
@@ -11,10 +11,8 @@
# macOS has no `modules.btop` and takes btop from Home Manager.
package = if pkgs.stdenv.hostPlatform.isDarwin then pkgs.btop else null;
settings = {
# Use the terminal background so btop is transparent. No visible effect
# inside zellij yet: its panes have been opaque since 0.44
# (https://github.com/zellij-org/zellij/issues/5175), so this only shows
# when btop runs directly in a translucent terminal.
# Use the terminal background so btop is transparent (shows when btop
# runs in a translucent terminal).
theme_background = false;
};
};
+1 -1
View File
@@ -9,7 +9,7 @@ Shared editor configuration and **usage notes** for terminal-focused editing.
interactive and privileged (`sudoedit`) edits alike.
- **Neovim** (`neovim/`): Backup editor — classic vim-style workflow and `:help` when needed.
Terminal layout and files: **Zellij** and **Yazi** live under `core/zellij/` and `core/yazi.nix`
Terminal layout and files: **tuios** lives under `tui/tuios/` and **Yazi** under `core/yazi.nix`
(not in this folder).
## Docs
+17 -13
View File
@@ -19,7 +19,7 @@ multi-cursor, surround), and a smaller moving part than a large Neovim plugin st
1. <https://docs.helix-editor.com/commands.html> — typable commands (`:` prompt).
1. <https://docs.helix-editor.com/configuration.html> — `config.toml`, themes, remaps.
1. <https://github.com/helix-editor/helix/wiki> — install tips, language servers, FAQ.
1. Prefer **Zellij** for shells and panes; use **Helix** for buffers and text.
1. Prefer **tuios** for shells and panes; use **Helix** for buffers and text.
1. On large codebases, navigation is often **by picker** (`Space f`, symbols, workspace search) or
**by LSP** (`g` goto mode), complementing motion-based editing.
1. After **git** operations (`checkout`, `merge`, `pull`, `rebase`) or whenever many files changed
@@ -38,20 +38,24 @@ Run `:tutor` inside Helix, or `hx --tutor` from the shell
### Terminal related
Zellij shortcuts used often (same idea as in the Neovim notes):
tuios shortcuts used often (leader is `Ctrl + B`; same idea as in the Neovim notes):
| Action | Zellij shortcut |
| ------------------------- | --------------- |
| Floating terminal | `Ctrl + p + w` |
| Horizontal split terminal | `Ctrl + p + d` |
| Vertical split terminal | `Ctrl + p + n` |
| Action | tuios shortcut |
| ----------------- | -------------------------- |
| New pane | `n` (window mode) |
| Floating terminal | `Ctrl + B`, then `Alt + F` |
| Split horizontal | `Ctrl + B`, then `-` |
| Split vertical | `Ctrl + B`, then `\` |
| Command palette | `Ctrl + P` |
| Launcher | `Alt + Space` |
| Detach | `Ctrl + B`, then `d` |
In Helix, `|` / `!` and variants pipe or insert shell output on selections (see **Changes**).
This flake’s Helix Home Manager module keeps **almost all default keys** but adds several
normal-mode remaps: **`Ctrl+Shift+o`** → jump backward (because Zellij uses **`Ctrl+o`** for
Session), `Space Space` → `:reload-all`, `Space w` / `Space q` → `:w` / `:q`, `Esc` → collapse
selection, and `$` / `0` line jumps (see `home/base/core/editors/helix/default.nix`).
normal-mode remaps: **`Ctrl+Shift+o`** → jump backward (leaving `Ctrl+o` free for the shell),
`Space Space` → `:reload-all`, `Space w` / `Space q` → `:w` / `:q`, `Esc` → collapse selection, and
`$` / `0` line jumps (see `home/base/core/editors/helix/default.nix`).
### Command mode (`:`)
@@ -203,12 +207,12 @@ Some bindings need an **LSP** or **tree-sitter** grammar; see notes on the keyma
1. Helix is newer; a stable plugin system is still evolving:
<https://github.com/helix-editor/helix/pull/8675>
1. Neovim has an integrated terminal (similar in spirit to VS Code’s).
1. Helix does not ship one; use Zellij / tmux / terminal features instead.
1. Helix does not ship one; use tuios / tmux / terminal features instead.
1. <https://github.com/helix-editor/helix/issues/1976#issuecomment-1091074719>
1. <https://github.com/helix-editor/helix/pull/4649>
1. Helix has no built-in tree panel; pair with **Yazi**, ranger, or Broot and open files from there.
1. A tree view may arrive with plugins later; many users rely on the file picker instead.
1. Global substitution is weaker in Helix; run replacements in another pane (Zellij) or an external
1. Global substitution is weaker in Helix; run replacements in another pane (tuios) or an external
tool when needed.
1. <https://github.com/helix-editor/helix/issues/196>
1. Neovim’s `:s` with preview remains strong for interactive refactors; external tools (e.g.
@@ -216,7 +220,7 @@ Some bindings need an **LSP** or **tree-sitter** grammar; see notes on the keyma
1. Complexity vs batteries-included tradeoffs:
<https://github.com/helix-editor/helix/discussions/6356>
Using **Helix** (and Neovim when useful) inside **Yazi** and **Zellij** keeps editing, files, and
Using **Helix** (and Neovim when useful) inside **Yazi** and **tuios** keeps editing, files, and
panes explicit and scriptable — different from a single IDE window, but very composable.
Helix nudges you away from reproducing VS Code/JetBrains inside one process; Neovim remains there
+1 -1
View File
@@ -111,7 +111,7 @@
"$" = "goto_line_end";
"0" = "goto_line_start";
# Ctrl+o opens Zellij Session
# keep Ctrl+o free for the shell; use C-S-o for the jumplist
"C-S-o" = "jump_backward";
};
+12 -9
View File
@@ -10,7 +10,7 @@ pointers for when you reach for Neovim as a backup.
1. For deeper skill, read the official docs:
1. <https://vimhelp.org/> — vim help.
1. <https://neovim.io/doc/user/> — Neovim user manual.
1. Prefer **Zellij** for shells and panes; use **Helix** or **Neovim** for buffers and text.
1. Prefer **tuios** for shells and panes; use **Helix** or **Neovim** for buffers and text.
1. Two powerful navigation modes on large codebases:
1. **By path** — when you know the tree layout.
1. **By content** — when you know what the code says.
@@ -23,18 +23,21 @@ Type `:tutor` (or `:Tutor` in Neovim) for the built-in vim tutorial.
> For a fuller reference: <https://vimhelp.org/quickref.txt.html>
Emacs Evil, Neovim, and vim share the motions below.
Neovim and vim share the motions below.
### Terminal related
Zellij shortcuts used often:
tuios shortcuts used often (leader is `Ctrl + B`):
| Action | Zellij shortcut |
| ------------------------- | --------------- |
| Floating terminal | `Ctrl + p + w` |
| Horizontal split terminal | `Ctrl + p + d` |
| Vertical split terminal | `Ctrl + p + n` |
| Run a shell command | `!xxx` |
| Action | tuios shortcut |
| ------------------- | -------------------------- |
| New pane | `n` (window mode) |
| Floating terminal | `Ctrl + B`, then `Alt + F` |
| Split horizontal | `Ctrl + B`, then `-` |
| Split vertical | `Ctrl + B`, then `\` |
| Command palette | `Ctrl + P` |
| Detach | `Ctrl + B`, then `d` |
| Run a shell command | `!xxx` |
### File management
-13
View File
@@ -1,13 +0,0 @@
let
shellAliases = {
"zj" = "zellij";
};
in
{
programs.zellij = {
enable = true;
};
# only works in bash/zsh, not nushell
home.shellAliases = shellAliases;
programs.nushell.shellAliases = shellAliases;
}
+6 -12
View File
@@ -1,25 +1,19 @@
# Terminal Emulators
I used to spend a lot of time on terminal emulators, to make them match my taste, but now I found
that it's not worth it, **Zellij can provide a user-friendly and unified user experience for all
that it's not worth it, **tuios can provide a user-friendly and unified user experience for all
terminal emulators! without any pain**!
Currently, I only use the most basic features of terminal emulators, such as true color, graphics
protocol, etc. Other features such as tabs, scrollback buffer, select/search/copy, etc, are all
provided by zellij!
provided by tuios!
My current terminal emulators are:
1. kitty: My main terminal emulator.
1. to select/copy a large mount of text, We should do some tricks via kitty's `scrollback_pager`
with neovim, it's really painful: <https://github.com/kovidgoyal/kitty/issues/719>
2. foot: A fast, lightweight and minimalistic Wayland terminal emulator.
1. foot only do the things a terminal emulator should do, no more, no less.
1. It's really suitable for tiling window manager or zellij users!
3. alacritty: A cross-platform, GPU-accelerated terminal emulator.
1. alacritty is really fast, I use it as a backup terminal emulator on all my desktops.
4. ghostty: A cross-platform, GPU-accelerated terminal emulator with native platform UI.
1. ghostty is the newest addition, configured in `ghostty.nix`.
1. ghostty: My default terminal emulator, configured in `ghostty.nix`. Cross-platform,
GPU-accelerated, and supports the Kitty graphics protocol.
2. kitty: My secondary terminal emulator, configured in `kitty.nix`. Also supports the Kitty
graphics protocol.
## 'xterm-kitty': unknown terminal type when `ssh` into a remote host or `sudo xxx`
@@ -1,71 +0,0 @@
{
pkgs,
...
}:
###########################################################
#
# Alacritty Configuration
#
# Useful Hot Keys for macOS:
# 1. Multi-Window: `command + N`
# 2. Increase Font Size: `command + =` | `command + +`
# 3. Decrease Font Size: `command + -` | `command + _`
# 4. Search Text: `command + F`
# 5. And Other common shortcuts such as Copy, Paste, Cursor Move, etc.
#
# Useful Hot Keys for Linux:
# 1. Increase Font Size: `ctrl + shift + =` | `ctrl + shift + +`
# 2. Decrease Font Size: `ctrl + shift + -` | `ctrl + shift + _`
# 3. Search Text: `ctrl + shift + N`
# 4. And Other common shortcuts such as Copy, Paste, Cursor Move, etc.
#
# Note: Alacritty do not have support for Tabs, and any graphic protocol.
#
###########################################################
{
programs.alacritty = {
enable = true;
# https://alacritty.org/config-alacritty.html
settings = {
window = {
opacity = 0.93;
startup_mode = "Maximized"; # Maximized window
dynamic_title = true;
option_as_alt = "Both"; # Option key acts as Alt on macOS
decorations = "None"; # Show neither borders nor title bar
};
scrolling = {
history = 10000;
};
font = {
bold = {
family = "Maple Mono NF CN";
};
italic = {
family = "Maple Mono NF CN";
};
normal = {
family = "Maple Mono NF CN";
};
bold_italic = {
family = "Maple Mono NF CN";
};
size = 13;
};
terminal = {
# Spawn a nushell in login mode via `bash`
shell = {
program = "${pkgs.bash}/bin/bash";
args = [
"--login"
"-c"
"nu --login --interactive"
];
};
# Controls the ability to write to the system clipboard with the OSC 52 escape sequence.
# It's used by zellij to copy text to the system clipboard.
osc52 = "CopyPaste";
};
};
};
}
-42
View File
@@ -1,42 +0,0 @@
{ pkgs, ... }:
{
programs.foot = {
# foot is designed only for Linux
enable = pkgs.stdenv.hostPlatform.isLinux;
# foot can also be run in a server mode. In this mode, one process hosts multiple windows.
# All Wayland communication, VT parsing and rendering is done in the server process.
# New windows are opened by running footclient, which remains running until the terminal window is closed.
#
# Advantages to run foot in server mode including reduced memory footprint and startup time.
# The downside is a performance penalty. If one window is very busy with, for example, producing output,
# then other windows will suffer. Also, should the server process crash, all windows will be gone.
server.enable = true;
# https://man.archlinux.org/man/foot.ini.5
settings = {
main = {
term = "foot"; # or "xterm-256color" for maximum compatibility
font = "Maple Mono NF CN:size=13";
dpi-aware = "no"; # scale via window manager instead
resize-keep-grid = "no"; # do not resize the window on font resizing
# Spawn a nushell in login mode via `bash`
shell = "${pkgs.bash}/bin/bash --login -c 'nu --login --interactive'";
};
colors-dark = {
alpha = 0.93; # background transparency
blur = true; # requires foot >= 1.26 and compositor support (e.g. niri v26.04+)
};
csd = {
preferred = "none"; # no title bar / menu button
};
mouse = {
hide-when-typing = "yes";
};
};
};
}
+7 -5
View File
@@ -6,6 +6,10 @@
#
# Ghostty Configuration
#
# TUIOS provides tabs, panes, scrollback and copy mode, so ghostty
# only needs a font, transparency and the kitty graphics protocol
# (built in).
#
###########################################################
{
programs.ghostty = {
@@ -25,12 +29,10 @@
# hide title bar/header bar (Linux only; on macOS it would remove the traffic lights too)
window-decoration = pkgs.stdenv.hostPlatform.isDarwin;
background-opacity = 0.93;
# only supported on macOS;
background-blur-radius = 10;
scrollback-limit = 20000;
# transparency
background-opacity = 0.85;
background-blur-radius = 10; # macOS only
# https://ghostty.org/docs/config/reference#command
# To resolve issues:
# 1. https://github.com/ryan4yin/nix-config/issues/26
# 2. https://github.com/ryan4yin/nix-config/issues/8
+11 -18
View File
@@ -1,5 +1,4 @@
{
lib,
pkgs,
...
}:
@@ -7,10 +6,9 @@
#
# Kitty Configuration
#
# Useful Hot Keys for Linux(replace `ctrl + shift` with `cmd` on macOS)):
# 1. Increase Font Size: `ctrl + shift + =` | `ctrl + shift + +`
# 2. Decrease Font Size: `ctrl + shift + -` | `ctrl + shift + _`
# 3. And Other common shortcuts such as Copy, Paste, Cursor Move, etc.
# TUIOS provides tabs, panes, scrollback and copy mode, so kitty
# only needs a font, transparency and the kitty graphics protocol
# (built in).
#
###########################################################
{
@@ -18,26 +16,21 @@
enable = true;
font = {
name = "Maple Mono NF CN";
# use different font size on macOS
size = 13;
};
# consistent with other terminal emulators
keybindings = {
"ctrl+shift+m" = "toggle_maximized";
"ctrl+shift+f" = "show_scrollback"; # search in the current window
size = 13; # macOS overrides this in home/darwin/terminal.nix
};
settings = {
# do not show title bar & window title
hide_window_decorations = "titlebar-and-corners";
# no title bar / window title ("titlebar-and-corners" is macOS-only)
hide_window_decorations =
if pkgs.stdenv.hostPlatform.isDarwin then "titlebar-and-corners" else "yes";
macos_show_window_title_in = "none";
background_opacity = "0.93";
background_blur = 1; # requires kitty >= 0.46.2 and compositor support (e.g. niri v26.04+)
# transparency
background_opacity = "0.85";
macos_option_as_alt = true; # Option key acts as Alt on macOS
enable_audio_bell = false;
tab_bar_edge = "top"; # tab bar on top
# To resolve issues:
# 1. https://github.com/ryan4yin/nix-config/issues/26
# 2. https://github.com/ryan4yin/nix-config/issues/8
-1
View File
@@ -29,7 +29,6 @@
use custom-completions/ssh/ssh-completions.nu *
use custom-completions/tar/tar-completions.nu *
use custom-completions/tcpdump/tcpdump-completions.nu *
use custom-completions/zellij/zellij-completions.nu *
use custom-completions/zoxide/zoxide-completions.nu *
# -*- alias -*-
+624
View File
@@ -0,0 +1,624 @@
# TUIOS Configuration File
# This file allows you to customize appearance and keybindings
#
# Configuration location: /home/ryan/.config/tuios/config.toml
# Documentation: https://github.com/Gaurav-Gosain/tuios
# For keybindings documentation, run: tuios keybinds list
#
# tuios watches this file. A save takes effect at once, with no restart.
# tuios does not apply a file that has an error. It keeps the settings that
# are in use and shows the error on screen.
# ============================================================================
# APPEARANCE SETTINGS
# ============================================================================
# Many of these can be changed live from the in-app settings page
# (open it with the leader key followed by ',').
#
# border_style: rounded, normal, thick, double, hidden, block, ascii,
# outer-half-block, inner-half-block
# dockbar_position: bottom, top, hidden
# window_title_position: bottom, top, hidden
# window_button_style: pill, dots (macOS traffic lights)
# window_button_position: right, left. Independent of the style; dots and
# left is the shipped pair, the macOS arrangement
# theme: color theme name (e.g. dracula, nord); empty for terminal colors
# click_to_type: single (a click on a pane starts typing in it), double
# (two clicks do), off (a click only focuses)
# auto_enter_terminal_on_focus: off (Tab keeps cycling windows),
# targeted (numbered select and arrows start typing),
# all (every covered focus command, including Tab)
# [appearance.scrollbar]: style = thin, track; thumb/track = a one-cell glyph
# (track also takes "none"); tint = border, muted, #RRGGBB
# background: off (your terminal shows through), theme (the theme's
# background), or #RRGGBB, for every surface at once
# pane_background, desktop_background, window_chrome_background,
# dock_background, [appearance.sidebar] background: the same
# values for one surface; empty follows background, and a
# colour a program or the chrome chose always wins
# ============================================================================
# ============================================================================
# KEYBINDINGS
# ============================================================================
# Set an action to [] to unbind it and hand the key back to the shell.
# An empty list and a missing line are not the same thing. A line this file
# does not have gets its default back the next time tuios starts; an action
# set to [] stays empty.
#
# You do not have to edit this by hand. In tuios, open the keybind manager
# (leader then k, or the command palette) and press ctrl+d on a binding to
# remove it, or ctrl+x to take its key off every action. From a shell:
#
# tuios keybinds unbind close_window w # one key off one action
# tuios keybinds free alt+left # off every action
#
# `tuios keybinds doctor` says which binding in each scope is live, what
# clashes with what, and which keys never reach the program in the pane.
#
# [keybindings.global] acts in window mode and terminal mode alike. It binds
# ctrl+p to the command palette and alt+space to the launcher, which costs
# you fish's history-back and readline's set-mark. To move or drop either:
#
# [keybindings.global]
# command_palette = ["ctrl+shift+p"]
# launcher = []
#
# [keybindings.terminal_mode] binds alt+arrows to move focus between panes.
# In readline, fish and zsh, alt+left and alt+right move the cursor a word
# at a time. If you want those back:
#
# [keybindings.terminal_mode]
# terminal_focus_left = []
# terminal_focus_right = []
#
# alt+up and alt+down are unclaimed by the common shells, so they are the
# safer pair to keep.
#
# hold_window_mode binds a key that puts tuios in window-management mode for
# as long as it is physically held, and hands the previous mode back when it
# is let go:
#
# [keybindings.mode_control]
# hold_window_mode = ["leftalt"]
#
# It needs a terminal that speaks the Kitty keyboard protocol (Ghostty, kitty,
# WezTerm, foot, Alacritty; not Terminal.app), because nothing else reports
# that a key was released. Naming a modifier key (leftalt, rightalt, leftctrl,
# leftsuper) asks the terminal for one more thing on top: every keystroke in
# the session then arrives as an escape code. Any ordinary key (f13 to f63,
# scrolllock, a spare letter) avoids that. Unbound by default.
# ============================================================================
# ============================================================================
# DOCK COMPONENTS
# ============================================================================
# The dock is three ordered lists of component names. Leave [dock] out
# entirely and the bar draws what it always drew; write the lists to
# reorder it, and omit a name to drop that segment.
#
# [dock]
# left = ["mode", "workspaces", "trail", "tape"]
# center = ["windows"]
# right = ["notifications", "copy-help", "cpu", "ram", "clock", "session-controls"]
#
# A cell of your own is a command whose first line of stdout is the text:
#
# [dock.custom.branch]
# command = "git branch --show-current"
# refresh = "event:after-focus-change" # or once, push, or "30s"
#
# and then "custom/branch" in one of the lists above. A component that
# fails is hidden rather than left showing a stale value;
# `tuios list-dock-components` says which and why.
# ============================================================================
[appearance]
border_style = 'rounded'
zen_mode = 'disabled'
links = 'all'
hide_window_buttons = false
window_button_style = 'dots'
window_button_position = 'left'
hide_scrollbar = false
scrollback_lines = 10000
scroll_lines = 3
kitty_placeholders = 'auto'
auto_enter_terminal_on_focus = 'off'
click_to_type = 'double'
dockbar_position = 'hidden'
preferred_shell = '/run/current-system/sw/bin/nu'
motion = 'full'
modal_dim = 30
whichkey_position = ''
window_title_position = 'hidden'
hide_clock = false
show_clock = false
show_cpu = false
show_ram = false
theme = 'catppuccin_mocha'
border_focused_color = ''
border_unfocused_color = ''
window_title_format = ''
zoom_max_width = 0
niri_reverse_scroll = false
niri_scroll_cells = 8
prefix_repeat_time = 500
max_fps = 0
dock_workspace_tab_format = ''
glyphs = 'default'
gap = 0
master_ratio = 50
scroll_column_width = 55
scroll_column_max = 90
zoom_size = 95
panel_padding = 2
clock_format = '15:04:05'
dim_unfocused = 0
dim_multifocus = false
background = 'off'
pane_background = ''
desktop_background = ''
window_chrome_background = ''
dock_background = ''
[appearance.scrollbar]
style = 'track'
thumb = ''
track = ''
tint = 'quiet'
[appearance.selection]
bg = '#45475A'
fg = ''
search_bg = '#8A6D2F'
search_fg = '#F5E7C8'
match_bg = '#E5A93D'
match_fg = '#1C1B19'
cursor_bg = '#39C5CF'
cursor_fg = '#08222B'
flash = true
flash_ms = 420
flash_style = 'diagonal'
multi_format = 'plain'
copy_entry = 'cursor'
osc52_write = 'focused'
[appearance.sidebar]
enabled = true
position = 'right'
width = 24
workspaces = ''
sections = 'sessions:25,terminals,files:25,agents:34'
folder_click = 'navigate'
file_delete = 'trash'
background = ''
agent_rest_fold = '1h'
[notifications]
duration = 0
warning_duration = 0
error_duration = 0
[notifications.agent]
sound_mode = ''
command = ''
quiet_hours = ''
[notifications.agent.states]
[notifications.agent.sounds]
done = ''
needs_input = ''
[notifications.mail]
[keybindings]
leader_key = 'ctrl+b'
[keybindings.window_management]
close_window = ['w', 'x']
copy_selection = ['c']
focus_sidebar = ['s']
minimize_window = ['m']
new_session = ['N']
new_window = ['n']
next_session = ['alt+shift+n']
next_window = ['tab']
prev_session = ['alt+shift+p']
prev_window = ['shift+tab']
rename_window = ['r']
restore_all = ['M']
select_window_1 = ['1']
select_window_2 = ['2']
select_window_3 = ['3']
select_window_4 = ['4']
select_window_5 = ['5']
select_window_6 = ['6']
select_window_7 = ['7']
select_window_8 = ['8']
select_window_9 = ['9']
start_screensaver = ['S']
toggle_zoom = ['z']
[keybindings.workspaces]
move_and_follow_1 = ['alt+shift+1']
move_and_follow_2 = ['alt+shift+2']
move_and_follow_3 = ['alt+shift+3']
move_and_follow_4 = ['alt+shift+4']
move_and_follow_5 = ['alt+shift+5']
move_and_follow_6 = ['alt+shift+6']
move_and_follow_7 = ['alt+shift+7']
move_and_follow_8 = ['alt+shift+8']
move_and_follow_9 = ['alt+shift+9']
switch_workspace_1 = ['alt+1']
switch_workspace_2 = ['alt+2']
switch_workspace_3 = ['alt+3']
switch_workspace_4 = ['alt+4']
switch_workspace_5 = ['alt+5']
switch_workspace_6 = ['alt+6']
switch_workspace_7 = ['alt+7']
switch_workspace_8 = ['alt+8']
switch_workspace_9 = ['alt+9']
[keybindings.layout]
equalize_splits = ['=']
focus_down = ['j']
focus_up = ['k']
preselect_down = ['alt+j']
preselect_left = ['alt+h']
preselect_right = ['alt+l']
preselect_up = ['alt+k']
resize_height_grow = ['}', 'shift+]']
resize_height_grow_top = [']']
resize_height_shrink = ['{', 'shift+[']
resize_height_shrink_top = ['[']
resize_master_grow = ['>', 'shift+.']
resize_master_grow_left = ['.']
resize_master_shrink = ['<', 'shift+,']
rotate_split = ['R']
snap_fullscreen = ['f']
snap_left = ['h']
snap_right = ['l']
split_horizontal = ['-']
split_vertical = ['|', '\']
swap_down = ['J', 'ctrl+down']
swap_left = ['H', 'ctrl+left']
swap_right = ['L', 'ctrl+right']
swap_up = ['K', 'ctrl+up']
toggle_tiling = ['t']
unsnap = ['u']
[keybindings.mode_control]
enter_terminal_mode = ['i', 'enter']
enter_window_mode = ['esc']
open_settings = [',']
quit = ['q']
toggle_help = ['?']
[keybindings.system]
toggle_spotlight = ['b']
[keybindings.navigation]
[keybindings.restore_minimized]
restore_minimized_1 = ['shift+1', '!']
restore_minimized_2 = ['shift+2', '@']
restore_minimized_3 = ['shift+3', '#']
restore_minimized_4 = ['shift+4', '$']
restore_minimized_5 = ['shift+5', '%']
restore_minimized_6 = ['shift+6', '^']
restore_minimized_7 = ['shift+7', '&']
restore_minimized_8 = ['shift+8', '*']
restore_minimized_9 = ['shift+9', '(']
[keybindings.prefix_mode]
hints = ['F']
launcher = ['a']
next_session = [')']
prefix_close_session = ['X']
prefix_close_window = ['x']
prefix_command_palette = ['P']
prefix_debug = ['D']
prefix_detach = ['d']
prefix_equalize_splits = ['=']
prefix_exit_mode = ['esc']
prefix_explore = ['e']
prefix_fullscreen = ['z']
prefix_help = ['?']
prefix_inbox = ['i']
prefix_jump_notif = ['j']
prefix_keybinds = ['k']
prefix_layout = ['L']
prefix_mail = ['M']
prefix_minimize = ['m']
prefix_new_window = ['c']
prefix_next_attention = ['o']
prefix_next_finished = ['O']
prefix_next_window = ['n', 'tab']
prefix_prev_window = ['p', 'shift+tab']
prefix_quit = ['q']
prefix_rename_window = ['r']
prefix_review = ['v']
prefix_rotate_split = ['R']
prefix_screenshot = ['C']
prefix_scrollback = ['s']
prefix_select_0 = ['0']
prefix_select_1 = ['1']
prefix_select_2 = ['2']
prefix_select_3 = ['3']
prefix_select_4 = ['4']
prefix_select_5 = ['5']
prefix_select_6 = ['6']
prefix_select_7 = ['7']
prefix_select_8 = ['8']
prefix_select_9 = ['9']
prefix_selection = ['[']
prefix_session_switcher = ['S']
prefix_settings = [',']
prefix_split_horizontal = ['-']
prefix_split_vertical = ['|', '\']
prefix_tape = ['T']
prefix_toggle_sidebar = ['b']
prefix_toggle_tiling = ['space']
prefix_window = ['t']
prefix_workspace = ['w']
prefix_workspace_switcher = ['W']
prev_session = ['(']
terminal_focus_down = ['down']
terminal_focus_left = ['left']
terminal_focus_right = ['right']
terminal_focus_up = ['up']
[keybindings.window_prefix]
window_prefix_cancel = ['esc']
window_prefix_close = ['x']
window_prefix_new = ['n']
window_prefix_next = ['tab']
window_prefix_prev = ['shift+tab']
window_prefix_rename = ['r']
window_prefix_tiling = ['t']
[keybindings.minimize_prefix]
minimize_prefix_cancel = ['esc']
minimize_prefix_focused = ['m']
minimize_prefix_restore_1 = ['1']
minimize_prefix_restore_2 = ['2']
minimize_prefix_restore_3 = ['3']
minimize_prefix_restore_4 = ['4']
minimize_prefix_restore_5 = ['5']
minimize_prefix_restore_6 = ['6']
minimize_prefix_restore_7 = ['7']
minimize_prefix_restore_8 = ['8']
minimize_prefix_restore_9 = ['9']
minimize_prefix_restore_all = ['M']
[keybindings.workspace_prefix]
workspace_prefix_cancel = ['esc']
workspace_prefix_move_1 = ['!']
workspace_prefix_move_2 = ['@']
workspace_prefix_move_3 = ['#']
workspace_prefix_move_4 = ['$']
workspace_prefix_move_5 = ['%']
workspace_prefix_move_6 = ['^']
workspace_prefix_move_7 = ['&']
workspace_prefix_move_8 = ['*']
workspace_prefix_move_9 = ['(']
workspace_prefix_rename = ['r']
workspace_prefix_switch_1 = ['1']
workspace_prefix_switch_2 = ['2']
workspace_prefix_switch_3 = ['3']
workspace_prefix_switch_4 = ['4']
workspace_prefix_switch_5 = ['5']
workspace_prefix_switch_6 = ['6']
workspace_prefix_switch_7 = ['7']
workspace_prefix_switch_8 = ['8']
workspace_prefix_switch_9 = ['9']
[keybindings.debug_prefix]
debug_prefix_animations = ['a']
debug_prefix_cache = ['c']
debug_prefix_cancel = ['esc']
debug_prefix_logs = ['l']
debug_prefix_showkeys = ['k']
[keybindings.tape_prefix]
tape_prefix_cancel = ['esc']
tape_prefix_manager = ['m']
tape_prefix_record = ['r']
tape_prefix_review = ['t']
tape_prefix_stop = ['s']
[keybindings.layout_prefix]
layout_prefix_cancel = ['esc']
layout_prefix_load = ['l']
layout_prefix_save = ['s']
resize_height_50 = ['shift+5']
resize_height_60 = ['shift+6']
resize_height_70 = ['shift+7']
resize_height_80 = ['shift+8']
resize_height_90 = ['shift+9']
resize_width_50 = ['5']
resize_width_60 = ['6']
resize_width_70 = ['7']
resize_width_80 = ['8']
resize_width_90 = ['9']
snap_corner_1 = ['1']
snap_corner_2 = ['2']
snap_corner_3 = ['3']
snap_corner_4 = ['4']
[keybindings.terminal_mode]
terminal_exit_mode = ['alt+esc']
terminal_focus_down = ['alt+down']
terminal_focus_left = ['alt+left']
terminal_focus_right = ['alt+right']
terminal_focus_up = ['alt+up']
terminal_next_window = ['alt+n']
terminal_paste_host = ['ctrl+shift+v', 'super+v', 'shift+super+v']
terminal_prev_window = ['alt+p']
terminal_scroll_down = ['shift+down']
terminal_scroll_up = ['shift+up']
[keybindings.global]
command_palette = ['ctrl+p']
launcher = ['alt+space']
[keybindings.script]
script_pause = ['ctrl+p']
[keybindings.sidebar]
accent = ['c']
activate = ['enter']
agents_filter = ['f']
agents_sort = ['o']
collapse = ['h', 'left']
cursor_down = ['j', 'down']
cursor_up = ['k', 'up']
exit = ['esc', 's']
expand = ['l', 'right']
first = ['g', 'home']
help = ['?']
jump_1 = ['1']
jump_2 = ['2']
jump_3 = ['3']
jump_4 = ['4']
jump_5 = ['5']
jump_6 = ['6']
jump_7 = ['7']
jump_8 = ['8']
jump_9 = ['9']
kill = ['x']
last = ['G', 'end']
mail = ['i']
menu = ['m']
narrow = ['<']
new_session = ['n']
new_window = ['t']
palette = ['/']
rename = ['r']
reorder_down = ['J', 'shift+down']
reorder_up = ['K', 'shift+up']
section = ['tab', 'shift+tab']
widen = ['>']
[keybindings.sidebar_files]
file_copy = ['y']
file_create = ['a']
file_cut = ['x']
file_delete = ['d']
file_delete_forever = ['D']
file_open = ['enter']
file_paste = ['p']
file_rename = ['r']
[keybindings.sidebar_agents]
agent_cancel_queued = ['x']
agent_reply = ['r']
agent_review = ['v']
agent_snooze = ['z']
agent_unread = ['u']
[keybindings.inbox]
inbox_close = ['esc', 'q']
inbox_deny_reason = ['n']
inbox_detail_down = ['J', 'ctrl+d']
inbox_detail_up = ['K', 'ctrl+u']
inbox_dismiss = ['d', 'delete']
inbox_down = ['j', 'down', 'ctrl+n']
inbox_filter = ['f']
inbox_first = ['g', 'home']
inbox_go = ['enter']
inbox_last = ['G', 'end']
inbox_mailbox = ['m']
inbox_page_down = ['pgdown']
inbox_page_up = ['pgup']
inbox_pass_on = ['p']
inbox_peek = ['space']
inbox_reply = ['r']
inbox_resume = ['y']
inbox_review = ['v']
inbox_select = ['/']
inbox_show_snoozed = ['S']
inbox_snooze = ['z']
inbox_undo = ['u']
inbox_up = ['k', 'up', 'ctrl+p']
[keybindings.inbox_peek]
peek_approve = ['a']
peek_approve_always = ['A']
peek_back = ['esc', 'q', 'space']
peek_deny = ['d']
peek_go = ['enter']
peek_read_again = ['r']
peek_type = ['tab']
[keybindings.mail]
mail_back = ['esc', 'q']
mail_down = ['j', 'down', 'ctrl+n']
mail_focus_pane = ['o']
mail_new = ['n']
mail_open = ['enter']
mail_page_down = ['pgdown']
mail_page_up = ['pgup']
mail_reply = ['r']
mail_up = ['k', 'up', 'ctrl+p']
[daemon]
log_level = 'off'
agent_detect_seconds = 0
agent_binaries = []
respond_from_shell = false
resume_agents = 'ask'
[startup]
open_default_window = false
tiled = true
start_in_terminal_mode = false
layout = 'bsp'
daemon = true
[tape]
autorun = 'ask'
auto_review = false
[debug]
show_key_events = false
[screenshot]
format = 'png'
directory = '~/Pictures/tuios'
frame = 'window'
background = 'auto'
controls = 'auto'
title_format = '{title}'
font_family = 'JetBrains Mono, monospace'
font_file = ''
cursor = false
[screensaver]
idle_minutes = 10
effect = 'random'
[spotlight]
follow = 'mouse'
radius = 10
dim = 75
edge = 'hard'
shake = false
[hints]
builtins = 'all'
patterns = []
alphabet = 'asdfghjkl'
dim = 60
[dock]
[dock.clock]
# Command keys (tuios >= 0.8.2). See docs/KEYBINDINGS.md#command-keys
# A centered, floating shell that toggles, like Zellij's floating pane.
[[keybindings.command]]
key = 'prefix+alt+f'
type = 'scratch'
command = 'nu'
description = 'Floating shell'
width = '80%'
height = '80%'
+32
View File
@@ -0,0 +1,32 @@
{
config,
pkgs,
tuios,
...
}:
let
# nixpkgs lags behind upstream; use the flake input.
tuiosPkg = tuios.packages.${pkgs.stdenv.hostPlatform.system}.tuios;
# tuios watches config.toml and its settings page writes it back, so link the
# checked-in file out-of-store instead of into the store.
configDir = "${config.home.homeDirectory}/nix-config/home/base/tui/tuios";
in
{
home.packages = [ tuiosPkg ];
xdg.configFile."tuios/config.toml".source =
config.lib.file.mkOutOfStoreSymlink "${configDir}/config.toml";
# auto-start tuios in interactive shells, except when already inside tuios.
# Each terminal attaches to its own session (a bare `tuios` would attach to
# the most recent one). tuios starts its daemon on demand, so no systemd unit
# is needed.
programs.nushell.extraConfig = ''
# auto start tuios
if $nu.is-interactive and (not ("TUIOS_SESSION" in $env)) {
let session = if ("KITTY_WINDOW_ID" in $env) { "kitty" } else { "main" }
^tuios attach $session -c
}
'';
}
-47
View File
@@ -1,47 +0,0 @@
# Zellij - A workspace lives in your terminal
Zellij is a terminal workspace with batteries included. At its core, it is a terminal multiplexer
(similar to tmux and screen), but this is merely its infrastructure layer.
Zellij is very user-friendly and easy to use, with a step-by-step hint system that will help you get
to know the keybindings, which is very like the Neovim or helix.
> By contrast, tmux's key design is counterintuitive, there is no prompt system, and the plug-in
> performance is rubbish. It's really a pain to use. tmux's initial release was in 2007, it's too
> old, I would recommend any users that do not have a experience with multiplexer to use zellij
> instead of tmux.
## Why use zellij as the default terminal environment?
By auto start zellij on shell login, and exit the shell session on zellij exit, we can use zellij as
the default terminal environment.
By this way, We will only use the most basic features of the terminal
emulator(kitty/alacritty/wezterm/...), while most of the functions of terminal are provided by
zellij. Thus we can easily switch to any terminal emulator without losing any key functions, and do
not need to take care of the differences between different terminal emulators.
And Zellij can be used not only locally, but also on any remote server, which is very convenient.
Learn once and use everywhere!
> Yeah, you didn't misread it, zellij is very suitable for not only remotely, but also locally!
Some features such as search/copy/scrollback in different terminal emulators are implemented in
different ways, and has different user experience. For example, Wezterm's default search function is
very basic, and it's not easy to use. Kitty's scrollback search/copy is really tricky to use. As for
some Editor such as Neovim, its integrated terminal is really useful, but zellij is more powerful
and useful than it, and more stable! Zellij overcomes these problems, and provides a unified user
experience for all terminal emulators!
Terminal emulators should only be responsible for displaying characters.
## Passthrough mode(Lock Mode)
`Ctrl + g` lock the outer zellij interface, and all keys will be sent to the focused pane.
It's extremely useful when you want to:
1. Use zellij locally for daily work, and use a remote zellij via ssh to do some work on the remote
server.
1. To avoid the key conflicts between zellij and the program running in the terminal, such as vim,
tmux, etc.
-422
View File
@@ -1,422 +0,0 @@
// Generating a new Example config via:
// zellij setup --dump-config
// If you'd like to override the default keybindings completely, be sure to change "keybinds" to "keybinds clear-defaults=true"
keybinds clear-defaults=true {
normal {
// uncomment this and adjust key if using copy_on_select=false
// bind "Alt c" { Copy; }
}
locked {
bind "Ctrl g" { SwitchToMode "Normal"; }
}
resize {
bind "Ctrl n" { SwitchToMode "Normal"; }
bind "h" "Left" { Resize "Increase Left"; }
bind "j" "Down" { Resize "Increase Down"; }
bind "k" "Up" { Resize "Increase Up"; }
bind "l" "Right" { Resize "Increase Right"; }
bind "H" { Resize "Decrease Left"; }
bind "J" { Resize "Decrease Down"; }
bind "K" { Resize "Decrease Up"; }
bind "L" { Resize "Decrease Right"; }
bind "=" "+" { Resize "Increase"; }
bind "-" { Resize "Decrease"; }
}
pane {
bind "Ctrl p" { SwitchToMode "Normal"; }
bind "h" "Left" { MoveFocus "Left"; }
bind "l" "Right" { MoveFocus "Right"; }
bind "j" "Down" { MoveFocus "Down"; }
bind "k" "Up" { MoveFocus "Up"; }
bind "p" { SwitchFocus; }
bind "n" { NewPane; SwitchToMode "Normal"; }
bind "d" { NewPane "Down"; SwitchToMode "Normal"; }
bind "r" { NewPane "Right"; SwitchToMode "Normal"; }
bind "x" { CloseFocus; SwitchToMode "Normal"; }
bind "f" { ToggleFocusFullscreen; SwitchToMode "Normal"; }
bind "z" { TogglePaneFrames; SwitchToMode "Normal"; }
bind "w" { ToggleFloatingPanes; SwitchToMode "Normal"; }
bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "Normal"; }
bind "c" { SwitchToMode "RenamePane"; PaneNameInput 0;}
bind "i" { TogglePanePinned; SwitchToMode "Normal"; }
}
move {
bind "Ctrl h" { SwitchToMode "Normal"; }
bind "n" "Tab" { MovePane; }
bind "p" { MovePaneBackwards; }
bind "h" "Left" { MovePane "Left"; }
bind "j" "Down" { MovePane "Down"; }
bind "k" "Up" { MovePane "Up"; }
bind "l" "Right" { MovePane "Right"; }
}
tab {
bind "Ctrl t" { SwitchToMode "Normal"; }
bind "r" { SwitchToMode "RenameTab"; TabNameInput 0; }
bind "h" "Left" "Up" "k" { GoToPreviousTab; }
bind "l" "Right" "Down" "j" { GoToNextTab; }
bind "n" { NewTab; SwitchToMode "Normal"; }
bind "x" { CloseTab; SwitchToMode "Normal"; }
bind "s" { ToggleActiveSyncTab; SwitchToMode "Normal"; }
bind "b" { BreakPane; SwitchToMode "Normal"; }
bind "]" { BreakPaneRight; SwitchToMode "Normal"; }
bind "[" { BreakPaneLeft; SwitchToMode "Normal"; }
bind "1" { GoToTab 1; SwitchToMode "Normal"; }
bind "2" { GoToTab 2; SwitchToMode "Normal"; }
bind "3" { GoToTab 3; SwitchToMode "Normal"; }
bind "4" { GoToTab 4; SwitchToMode "Normal"; }
bind "5" { GoToTab 5; SwitchToMode "Normal"; }
bind "6" { GoToTab 6; SwitchToMode "Normal"; }
bind "7" { GoToTab 7; SwitchToMode "Normal"; }
bind "8" { GoToTab 8; SwitchToMode "Normal"; }
bind "9" { GoToTab 9; SwitchToMode "Normal"; }
bind "Tab" { ToggleTab; }
}
scroll {
bind "Ctrl s" { SwitchToMode "Normal"; }
bind "e" { EditScrollback; SwitchToMode "Normal"; }
bind "s" { SwitchToMode "EnterSearch"; SearchInput 0; }
bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; }
bind "j" "Down" { ScrollDown; }
bind "k" "Up" { ScrollUp; }
bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; }
bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; }
bind "d" { HalfPageScrollDown; }
bind "u" { HalfPageScrollUp; }
// uncomment this and adjust key if using copy_on_select=false
// bind "Alt c" { Copy; }
}
search {
bind "Ctrl s" { SwitchToMode "Normal"; }
bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; }
bind "j" "Down" { ScrollDown; }
bind "k" "Up" { ScrollUp; }
bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; }
bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; }
bind "d" { HalfPageScrollDown; }
bind "u" { HalfPageScrollUp; }
bind "n" { Search "down"; }
bind "p" { Search "up"; }
bind "c" { SearchToggleOption "CaseSensitivity"; }
bind "w" { SearchToggleOption "Wrap"; }
bind "o" { SearchToggleOption "WholeWord"; }
}
entersearch {
bind "Ctrl c" "Esc" { SwitchToMode "Scroll"; }
bind "Enter" { SwitchToMode "Search"; }
}
renametab {
bind "Ctrl c" { SwitchToMode "Normal"; }
bind "Esc" { UndoRenameTab; SwitchToMode "Tab"; }
}
renamepane {
bind "Ctrl c" { SwitchToMode "Normal"; }
bind "Esc" { UndoRenamePane; SwitchToMode "Pane"; }
}
session {
bind "Ctrl o" { SwitchToMode "Normal"; }
bind "Ctrl s" { SwitchToMode "Scroll"; }
bind "d" { Detach; }
bind "w" {
LaunchOrFocusPlugin "session-manager" {
floating true
move_to_focused_tab true
};
SwitchToMode "Normal"
}
bind "c" {
LaunchOrFocusPlugin "configuration" {
floating true
move_to_focused_tab true
};
SwitchToMode "Normal"
}
bind "p" {
LaunchOrFocusPlugin "plugin-manager" {
floating true
move_to_focused_tab true
};
SwitchToMode "Normal"
}
bind "a" {
LaunchOrFocusPlugin "zellij:about" {
floating true
move_to_focused_tab true
};
SwitchToMode "Normal"
}
}
// Allow to use tmux inside zellij
//
// tmux {
// bind "[" { SwitchToMode "Scroll"; }
// bind "Ctrl b" { Write 2; SwitchToMode "Normal"; }
// bind "\"" { NewPane "Down"; SwitchToMode "Normal"; }
// bind "%" { NewPane "Right"; SwitchToMode "Normal"; }
// bind "z" { ToggleFocusFullscreen; SwitchToMode "Normal"; }
// bind "c" { NewTab; SwitchToMode "Normal"; }
// bind "," { SwitchToMode "RenameTab"; }
// bind "p" { GoToPreviousTab; SwitchToMode "Normal"; }
// bind "n" { GoToNextTab; SwitchToMode "Normal"; }
// bind "Left" { MoveFocus "Left"; SwitchToMode "Normal"; }
// bind "Right" { MoveFocus "Right"; SwitchToMode "Normal"; }
// bind "Down" { MoveFocus "Down"; SwitchToMode "Normal"; }
// bind "Up" { MoveFocus "Up"; SwitchToMode "Normal"; }
// bind "h" { MoveFocus "Left"; SwitchToMode "Normal"; }
// bind "l" { MoveFocus "Right"; SwitchToMode "Normal"; }
// bind "j" { MoveFocus "Down"; SwitchToMode "Normal"; }
// bind "k" { MoveFocus "Up"; SwitchToMode "Normal"; }
// bind "o" { FocusNextPane; }
// bind "d" { Detach; }
// bind "Space" { NextSwapLayout; }
// bind "x" { CloseFocus; SwitchToMode "Normal"; }
// }
shared_except "locked" {
bind "Ctrl g" { SwitchToMode "Locked"; }
bind "Ctrl q" { Quit; }
bind "Alt f" { ToggleFloatingPanes; }
bind "Alt n" { NewPane; }
bind "Alt i" { MoveTab "Left"; }
bind "Alt o" { MoveTab "Right"; }
bind "Alt h" "Alt Left" { MoveFocusOrTab "Left"; }
bind "Alt l" "Alt Right" { MoveFocusOrTab "Right"; }
bind "Alt j" "Alt Down" { MoveFocus "Down"; }
bind "Alt k" "Alt Up" { MoveFocus "Up"; }
bind "Alt =" "Alt +" { Resize "Increase"; }
bind "Alt -" { Resize "Decrease"; }
bind "Alt [" { PreviousSwapLayout; }
bind "Alt ]" { NextSwapLayout; }
}
shared_except "normal" "locked" {
bind "Enter" "Esc" { SwitchToMode "Normal"; }
}
shared_except "pane" "locked" {
bind "Ctrl p" { SwitchToMode "Pane"; }
}
shared_except "resize" "locked" {
bind "Ctrl n" { SwitchToMode "Resize"; }
}
shared_except "scroll" "locked" {
bind "Ctrl s" { SwitchToMode "Scroll"; }
}
shared_except "session" "locked" {
bind "Ctrl o" { SwitchToMode "Session"; }
}
shared_except "tab" "locked" {
bind "Ctrl t" { SwitchToMode "Tab"; }
}
shared_except "move" "locked" {
bind "Ctrl h" { SwitchToMode "Move"; }
}
// shared_except "tmux" "locked" {
// bind "Ctrl b" { SwitchToMode "Tmux"; }
// }
}
// Plugin aliases - can be used to change the implementation of Zellij
// changing these requires a restart to take effect
plugins {
tab-bar location="zellij:tab-bar"
status-bar location="zellij:status-bar"
strider location="zellij:strider"
compact-bar location="zellij:compact-bar"
session-manager location="zellij:session-manager"
welcome-screen location="zellij:session-manager" {
welcome_screen true
}
filepicker location="zellij:strider" {
cwd "/"
}
configuration location="zellij:configuration"
plugin-manager location="zellij:plugin-manager"
about location="zellij:about"
}
// Plugins to load in the background when a new session starts
load_plugins {
// "file:/path/to/my-plugin.wasm"
// "https://example.com/my-plugin.wasm"
}
// Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP
// eg. when terminal window with an active zellij session is closed
// (Requires restart)
// Options:
// - detach (Default)
// - quit
//
// on_force_close "quit"
// Send a request for a simplified ui (without arrow fonts) to plugins
// Options:
// - true
// - false (Default)
//
// simplified_ui true
// Choose the path to the default shell that zellij will use for opening new panes
// Default: $SHELL
//
default_shell "nu"
// Choose the path to override cwd that zellij will use for opening new panes
//
// default_cwd ""
// Toggle between having pane frames around the panes
// Options:
// - true (default)
// - false
//
// pane_frames true
// Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible
// Options:
// - true (default)
// - false
//
// auto_layout true
// Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected
// (Requires restart)
// Options:
// - true (default)
// - false
//
// session_serialization false
// Whether pane viewports are serialized along with the session, default is false
// (Requires restart)
// Options:
// - true
// - false (default)
//
// serialize_pane_viewport true
// Scrollback lines to serialize along with the pane viewport when serializing sessions, 0
// defaults to the scrollback size. If this number is higher than the scrollback size, it will
// also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true.
// (Requires restart)
//
// scrollback_lines_to_serialize 10000
// Choose the theme that is specified in the themes section.
// Default: default
//
theme "catppuccin-mocha"
// The name of the default layout to load on startup
// Default: "default"
// (Requires restart)
//
// default_layout "compact"
// Choose the mode that zellij uses when starting up.
// Default: normal
//
// default_mode "locked"
// Toggle enabling the mouse mode.
// On certain configurations, or terminals this could
// potentially interfere with copying text.
// (Requires restart)
// Options:
// - true (default)
// - false
//
// mouse_mode false
// Configure the scroll back buffer size
// This is the number of lines zellij stores for each pane in the scroll back
// buffer. Excess number of lines are discarded in a FIFO fashion.
// (Requires restart)
// Valid values: positive integers
// Default value: 10000
//
// scroll_buffer_size 10000
// Provide a command to execute when copying text. The text will be piped to
// the stdin of the program to perform the copy. This can be used with
// terminal emulators which do not support the OSC 52 ANSI control sequence
// that will be used by default if this option is not set.
// Examples:
//
// copy_command "xclip -selection clipboard" // x11
// copy_command "wl-copy" // wayland
// copy_command "pbcopy" // osx
// Choose the destination for copied text
// Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard.
// Does not apply when using copy_command.
// Options:
// - system (default)
// - primary
//
// copy_clipboard "primary"
// Enable or disable automatic copy (and clear) of selection when releasing mouse
// Default: true
//
// copy_on_select false
// Path to the default editor to use to edit pane scrollbuffer
// Default: $EDITOR or $VISUAL
//
// scrollback_editor "/usr/bin/vim"
// When attaching to an existing session with other users,
// should the session be mirrored (true)
// or should each user have their own cursor (false)
// (Requires restart)
// Default: false
//
// mirror_session true
// The folder in which Zellij will look for layouts
// (Requires restart)
//
// layout_dir "/path/to/my/layout_dir"
// The folder in which Zellij will look for themes
// (Requires restart)
//
// theme_dir "/path/to/my/theme_dir"
// Enable or disable the rendering of styled and colored underlines (undercurl).
// May need to be disabled for certain unsupported terminals
// (Requires restart)
// Default: true
//
// styled_underlines false
// Enable or disable writing of session metadata to disk (if disabled, other sessions might not know
// metadata info on this session)
// (Requires restart)
// Default: false
//
// disable_session_metadata true
// Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it)
// (Requires restart)
// Default: true (if the host terminal supports it)
//
// support_kitty_keyboard_protocol false
// Whether to stack panes when resizing beyond a certain size
// Default: true
//
// stacked_resize false
// Whether to show release notes on first version run
// Default: true
//
show_release_notes false
// Whether to show startup tips on session start
// Default: true
//
show_startup_tips false
-38
View File
@@ -1,38 +0,0 @@
{ pkgs, ... }:
let
shellAliases = {
"zj" = "zellij";
};
in
{
programs.zellij = {
enable = true;
package = pkgs.zellij;
};
xdg.configFile."zellij/config.kdl".source = ./config.kdl;
# Disable catppuccin to avoid conflict with my non-nix config.
catppuccin.zellij.enable = false;
# auto start zellij in nushell
programs.nushell.extraConfig = ''
# auto start zellij
# except when in emacs or zellij itself
if (not ("ZELLIJ" in $env)) and (not ("INSIDE_EMACS" in $env)) {
if "ZELLIJ_AUTO_ATTACH" in $env and $env.ZELLIJ_AUTO_ATTACH == "true" {
^zellij attach -c
} else {
^zellij
}
# Auto exit the shell session when zellij exit
$env.ZELLIJ_AUTO_EXIT = "false" # disable auto exit
if "ZELLIJ_AUTO_EXIT" in $env and $env.ZELLIJ_AUTO_EXIT == "true" {
exit
}
}
'';
# only works in bash/zsh, not nushell
home.shellAliases = shellAliases;
programs.nushell.shellAliases = shellAliases;
}
+1 -1
View File
@@ -8,7 +8,7 @@ This directory contains macOS-specific Home Manager configurations for Darwin sy
- **default.nix**: Entry point that imports all Darwin configurations
- **shell.nix**: Shell configurations and environment settings
- **terminal.nix**: Sets a 15px font size across Alacritty, Ghostty, and Kitty
- **terminal.nix**: Sets a 15px font size across Ghostty and Kitty
- **rime-squirrel.nix**: [Rime Squirrel](https://github.com/rime/squirrel) input method
configuration
-1
View File
@@ -3,7 +3,6 @@ let
fontSize = 15;
in
{
programs.alacritty.settings.font.size = lib.mkForce fontSize;
programs.ghostty.settings.font-size = lib.mkForce fontSize;
programs.kitty.font.size = lib.mkForce fontSize;
}
-1
View File
@@ -5,6 +5,5 @@
# misc
libnotify
wireguard-tools # manage wireguard vpn manually, via wg-quick
tuios # terminal window manager / multiplexer (trial)
];
}
+1 -2
View File
@@ -13,9 +13,8 @@
xdg.autostart.enable = true;
# This fixes nixpak sandboxed apps (like firefox) accessing mapped folders correctly
xdg.autostart.entries = [
"${pkgs.foot}/share/applications/foot.desktop"
"${pkgs.alacritty}/share/applications/Alacritty.desktop"
"${pkgs.ghostty}/share/applications/com.mitchellh.ghostty.desktop"
"${pkgs.kitty}/share/applications/kitty.desktop"
"${pkgs-master.clash-verge-rev}/share/applications/clash-verge.desktop"
+2 -2
View File
@@ -14,8 +14,8 @@ binds {
Mod+Shift+Slash { show-hotkey-overlay; }
// Suggested binds for running programs: terminal, app launcher, screen locker.
Mod+Return { spawn "foot"; }
Mod+Shift+Return { spawn "alacritty"; }
Mod+Return { spawn "ghostty"; }
Mod+Shift+Return { spawn "kitty"; }
// Launcher
Mod+D { spawn "noctalia" "msg" "panel-toggle" "launcher"; }
+8 -15
View File
@@ -2,31 +2,24 @@
// Find more information on the wiki:
// https://yalter.github.io/niri/Configuration:-Window-Rules
// Terminal applications - open in workspace 1, with blur
// Draw the focus ring as an outline for every window, never as a solid
// rectangle behind it. Niri's default paints a `#7fc8ff` block behind the
// focused window, which shows through any semitransparent window (e.g. the
// terminals) as a solid cyan fill.
window-rule {
match app-id="foot"
open-on-workspace "1terminal"
open-maximized true
// foot >= 1.26 uses native blur via ext-background-effect,
// no compositor-side blur needed
draw-border-with-background false
}
// Terminal applications - open in workspace 1
window-rule {
match app-id="Alacritty"
match app-id="kitty"
open-on-workspace "1terminal"
open-maximized true
background-effect {
blur true
}
}
window-rule {
match app-id="com.mitchellh.ghostty"
open-on-workspace "1terminal"
open-maximized true
// Ghostty native blur via ext-background-effect coming in v1.4;
// use compositor-side blur until then
background-effect {
blur true
}
}
// Web browsers - open in workspace 2
+1 -7
View File
@@ -18,14 +18,8 @@
openFirewall = true;
};
# Terminfo entries for the terminals we actually use, so `$TERM` resolves on
# hosts we SSH into. This replaces `environment.enableAllTerminfo`, which
# installs every terminal's terminfo — including rxvt-unicode, which currently
# fails to build with GCC 16 (https://github.com/NixOS/nixpkgs/issues/568896).
# https://github.com/NixOS/nixpkgs/blob/nixos-26.05/nixos/modules/config/terminfo.nix
# Terminfo for the terminals we use, so `$TERM` resolves on hosts we SSH into.
environment.systemPackages = [
pkgs.alacritty.terminfo
pkgs.foot.terminfo
pkgs.ghostty.terminfo
pkgs.kitty.terminfo
];
+1 -1
View File
@@ -14,7 +14,7 @@
# set user's default shell system-wide
users.defaultUserShell = pkgs.bashInteractive;
# fix for `sudo xxx` in kitty/wezterm/foot and other modern terminal emulators
# fix for `sudo xxx` in kitty/ghostty and other modern terminal emulators
security.sudo.keepTerminfo = true;
# List packages installed in system profile. To search, run:
+2 -4
View File
@@ -7,10 +7,8 @@
let
my_terminal_desktop = [
# NOTE: We have add these packages at user level
"Alacritty.desktop"
"kitty.desktop"
"foot.desktop"
"com.mitchellh.ghostty.desktop"
"kitty.desktop"
];
in
{
@@ -47,7 +45,7 @@
# This will make xdg-open use the portal to open programs,
# which resolves bugs involving programs opening inside FHS envs or with unexpected env vars set from wrappers.
# xdg-open is used by almost all programs to open a unknown file/uri
# alacritty as an example, it use xdg-open as default, but you can also custom this behavior
# a terminal emulator as an example, it uses xdg-open as default, but you can also customize this behavior
xdgOpenUsePortal = true;
# ls /run/current-system/sw/share/xdg-desktop-portal/portals/