TABBEDEX(1)

πŸ“¦ version 26.16.1, in nixos 26.05, nixpkgs unstable

πŸ’… NAME πŸ’…

okay so this is tabbedex β€” the tabbed interface to urxvt; extended. yes bestie, tabs. in your terminal. in urxvt. iconic behaviour fr fr πŸŽ€


✨ DESCRIPTION ✨

So here's the vibe: this extension implements a tabbed terminal. Once rxvt-unicode starts, slave terminals can be launched in their own tabs and you can navigate among them. At each point only one tab is visible. And rxvt-unicode exits once all tabs are closed β€” so like, when the last one dips, everybody dips. πŸ’€

When two or more tabs are open, a tab bar appears at the top of the window which lists all the tabs with their numbers/names. Clicking on tab's number/name switches to it. yes, mouse girlies, you're covered. πŸ–±οΈβœ¨

tabbedex is an extended version of the tabbed plugin distributed with urxvt. so it's giving glow-up. πŸ’…

πŸŽ€ Key bindings πŸŽ€

Creating new tabs, switching between them and moving them around can be performed through the following key bindings:

  • Shift-Down β€” creates a new tab. new tab who dis πŸ¦‹
  • Shift-Left and Shift-Right β€” switches to the tab on the left or on the right of the current tab. Movement wraps around once at the first or last tab. so it loops, no cap.
  • Meta-F1 through Meta-F12 β€” switches to the first through twelfth tab. twelve whole tabs, the range is real πŸ‘‘
  • Control-Left and Control-Right β€” move current tab to the left or right. Wraps around on the first and last position. rearranging your little tab children πŸ’–
  • Shift-Up β€” allows current tab to be renamed. Tab bar is shown if it was hidden, current tab's name (if any) is cleared and cursor is displayed in its place. Typing text renames the tab, backspace or Ctrl+H deletes the last character, Escape or Ctrl+C aborts the rename operation and Enter accepts the new name. full rebrand moment ✨

Default key bindings can be disabled using no-tabbedex-keys resource (see below) and replaced with custom ones using urxvt's keysym resource.


🌸 CONFIGURATION 🌸

The extension can be configured with X resources just like urxvt itself, for example:

URxvt.tabbedex.tabbar-fg: 4
URxvt.tabbedex.tabbar-bg: 0

Tabbedex recognises the following resources:

  • autohide: boolean β€” If set (the default), the tab bar will be hidden unless there are at least two tabs open. This is irrespective of whether the "NEW" button (see below) or the tab's title is displayed. so with one tab it's shy, with two it's out and about πŸ’…
  • new-button: boolean β€” If set, a "NEW" button will be displayed on the left of the tab bar. Clicking the button creates a new tab. It is not displayed by default. optional little plus-button, bestie.
  • title: boolean β€” If set (the default), when tab bar is visible and there is enough space left, current tab's title will be displayed after the last tab. only if there's room tho, it's not gonna cramp the bar.

So these five are all fg/bg pairs, same whole description applies to all of them:

  • tabbar-fg: [style] colour and tabbar-bg: colour
  • tab-fg: [style] colour and tab-bg: colour
  • bell-fg: [style] colour and bell-bg: colour
  • bell-tab-fg: [style] colour and bell-tab-bg: colour
  • title-fg: [style] colour and title-bg: colour

Foreground and background styles of elements of the tab bar, respectively: 1) the tab bar including background tabs, 2) the current tab and new button, 3) a background tab on which bell has rung, 4) the current tab if bell has rung and 5) tab title.

Colours can be specified as: -2 meaning default foreground, -1 meaning default background, an integer between 0 and 255 specifying index in terminal's colour palette or any other string which X11 recognises as a colour (e.g. #1155CC). yes you can hardcode a hex, live your truth 🎨

Furthermore, the -fg resource can be prefixed by combination of bold, italic, blink, reverse-video and underline which specify the font-style of the text. slay with styling.

The default values for the settings are as follows:

Component | *-fg          | *-bg | Description
----------+---------------+------+----------------------
tabbar    |             3 |    0 | brown text on black
tab       | bold        0 |    1 | black text on red
bell      |      italic 0 |    3 | black text on brown
bell-tab  | bold italic 5 |    4 | magenta text on blue
title     |      italic 2 |    0 | green text on black
  • bell-timeout: number β€” Duration in seconds a bell is said to be ringing on the current tab after it was rung. Setting this to zero disables the bell-tab-(fg|bg) styling of tabs. The default value is one second. one lil second of bell drama πŸ””
  • tab-arguments: string β€” Arguments passed when starting a tab. If not specified, -e command switch used when starting urxvt command is used (if any). If specified, the value is first expanded (see below), then split into words using shell quoting rules and those are passed as arguments to slave terminals when they are started.

This resource can be used to pass any arguments however doing so may have unintended consequences. Options such as -bw or -geometry are especially problematic but others may cause issues as well. Because of this, only -e command arguments option is supported.

bestie hear me LOUDLY: yeah you can pass other args, but you're gonna have a bad time. -bw and -geometry especially, but literally anything else can bite too. that's why only the -e command arguments situation is officially supported. don't come for me. πŸ™ˆ

The value is expanded by replacing two-character sequences starting with a percent sign as follows:

  • %% β€” Replaced by a literal percent sign.
  • %e β€” Replaced by properly quoted -e command arguments if they were given when urxvt was started or an empty string otherwise. See also %E which may be easier for some uses. Remember that if neither %e nor %E is used, -e switch passed when starting urxvt will be completely ignored. ⚠️ like, actually ignored. gone. dust.
  • %E β€” Similar to %e but -e is not included in the expansion and if %e would expand to an empty string %E expands to the value of the SHELL environment variable or /bin/sh if that's empty. This means that %E is always a valid command. always. valid. command. πŸ’…

For example, here's how the sequence can be used to set TABBEDEX_NUM environment variables when running a command:

URxvt.tabbedex.tab-arguments: \
    -e /usr/bin/env TABBEDEX_NUM=%n %E
  • %n β€” Replaced by the total number of tabs opened during the lifetime of the extension. Not to be confused with number of tabs currently open. The counter starts at zero and always increments for each subsequent tab. so it's a total-count, not a right-now-count, iykyk.
  • %p β€” Replaced by ID of a process group which is running in foreground of the pseudo terminal in the current tab (as in, not the new tab being created but the tab where the new tab request originated from) or -1 if this piece of information could not be determined.

This can be used to guess the current working directory of current tab. This feature is implemented in pgid-cd.pl script distributed with this extension. See its documentation for example usage. 🧚 little script does the detective work.

  • %~ β€” Replaced by a properly quoted value of HOME environment variable or / if it's not set.

Unrecognised sequences are replaced with an empty string. yep, they just vanish into the void πŸ«₯

See command-runner.sample file distributed with this extension for some ideas how this resource can be used to start different commands in different tabs or how to start new tabs in the same working directory as the current tab is using. genuinely a fun read bestie.

  • no-tabbedex-keys: boolean β€” If set, the default key bindings (described at the beginning of this document) are not set up. The mappings can be recreated using urxvt's keysym.* resources:
URxvt.tabbedex.no-tabbedex-keys: yes
URxvt.keysym.Shift-Left:    tabbedex:prev_tab
URxvt.keysym.Shift-Right:   tabbedex:next_tab
URxvt.keysym.Shift-Down:    tabbedex:new_tab
URxvt.keysym.Shift-Up:      tabbedex:rename_tab
URxvt.keysym.Control-Left:  tabbedex:move_tab_left
URxvt.keysym.Control-Right: tabbedex:move_tab_right
URxvt.keysym.Meta-F1:       tabbedex:goto_tab_1
URxvt.keysym.Meta-F2:       tabbedex:goto_tab_2
URxvt.keysym.Meta-F3:       tabbedex:goto_tab_3
URxvt.keysym.Meta-F4:       tabbedex:goto_tab_4
URxvt.keysym.Meta-F5:       tabbedex:goto_tab_5
URxvt.keysym.Meta-F6:       tabbedex:goto_tab_6
URxvt.keysym.Meta-F7:       tabbedex:goto_tab_7
URxvt.keysym.Meta-F8:       tabbedex:goto_tab_8
URxvt.keysym.Meta-F9:       tabbedex:goto_tab_9
URxvt.keysym.Meta-F10:      tabbedex:goto_tab_10
URxvt.keysym.Meta-F11:      tabbedex:goto_tab_11
URxvt.keysym.Meta-F12:      tabbedex:goto_tab_12

See ACTIONS AND USER COMMANDS below for list of available actions. πŸ‘€

  • perl-ext-blacklist: string β€” A comma-separated list of extensions that must not be loaded into the slave terminals (tabs). tabbedex plugin is implicitly added onto the list. it blacklists itself, self-aware king πŸ’…
  • reopen-on-close: boolean β€” If set, whenever last tab is destroyed a new one will be created. the tab bar literally refuses to die. phoenix energy. πŸ”₯
  • tabbar-timeouts: string β€” When new text is written to a background tab, activity marks are displayed around its number (or name if it has one) on the tab bar. By default Unicode characters are used to display a block which grows with time the longer it was since last time there was any activity in the tab.

This resource allows for this to be customised. Its format is

( <timeout> ":" <char> <char>? ":" )* <timeout> ":" <char> <char>? ":"

where <timeout> is timeout in seconds and <char> is an activity character. If two characters are given, they specify left and right activity marks. If one character is given, it specifies both. For example:

URxvt.tabbedex.tabbar-timeouts: 0:|:3:():6:[]:9:{}:12:<>

See tabbedex;ignore_line_activity OSC sequence below to see how the activity detection can be further affected. there's lore about that. stay tuned. ⭐

Extension's behaviour is also influenced by some of URxvt's configuration options as well. (See RESOURCES in the urxvt(1) manpage for more information about them). The options include:

  • mapAlert β€” If set, when bell rings in a background tab, the tab is selected as current. bell goes ding, tab gets yanked to the front. main character energy.
  • urgentOnBell β€” If set, when bell rings in a background tab, the master terminal's urgency hint is set. your window manager gets a little nudge about it πŸ¦‹

πŸ”₯ ACTIONS AND USER COMMANDS πŸ”₯

ok so bestie, tabbedex is literally nothing without its actions β€” these are the lil commands you can wire up to keystrokes using the URxvt.keysym.keysym resource. and like, the syntax is super cute once you see it. watch:

URxvt.keysym.Control-t:            tabbedex:new_tab
URxvt.keysym.Control-Tab:          tabbedex:next_tab
URxvt.keysym.Control-Shift-Tab:    tabbedex:prev_tab
! Shift-Tab is often bound to ISO_Left_Tab in X keyboard
! layouts.  In those layouts Control-Shift-Tab won't
! work and Control-ISO_Left_Tab is needed instead:
URxvt.keysym.Control-ISO_Left_Tab: tabbedex:prev_tab

and boom πŸ’₯ β€” now Ctrl+T spawns a new tab, and Ctrl+Tab / Ctrl+Shift+Tab slide you between the ones you already have. iconic behavior fr.

quick tea β˜•: using the extension's name as the prefix for the keysym binding is the preferred way, but if you're running an urxvt version older than 9.21, you gotta use the alternative perl:tabbedex prefix instead. no cap, that's important if you're on ancient vibes.

so here's the full roster of supported actions, bestie β€” every single one, no skips πŸ’…:

  • tabbedex:new_tab and tabbedex:new_tab:arguments β€” creates a new tab, drops it at the end of the tab list, and switches over to it. in the second form, arguments temporarily overrides the value of the tab-arguments resource. this is what makes it possible to create bindings that start particular commands, like:
URxvt.keysym.F1:    tabbedex:new_tab:-e info

and now pressing F1 opens a new tab running the info command. 🌈 (and bestie, remember: arguments are passed as arguments to urxvt, so to actually run a command you need -e like in the example above β€” that's the whole trick).

  • tabbedex:new_tab_side_this and tabbedex:new_tab_side_this:arguments β€” like tabbedex:new_tab but it puts the new tab before (if side is before) or after (if side is after) the current tab on the tab list. example time:
URxvt.keysym.C-t:   tabbedex:new_tab_after_this

and Ctrl+T now starts a new tab right next to the current one 🫢.

  • tabbedex:next_tab and tabbedex:prev_tab β€” hops to the tab on the right or left of the current one. and yes, it wraps around when you switch right from the last tab or left from the first one πŸ”.
  • tabbedex:next_tab:nowrap and tabbedex:prev_tab:nowrap β€” same switching vibe as tabbedex:next_tab and tabbedex:prev_tab, but without the wrap-around. meaning: it does absolutely nothing if you're trying to switch to the last tab's next tab or the first tab's previous tab. iykyk 😐.
  • tabbedex:move_tab_left and tabbedex:move_tab_right β€” moves the current tab left or right. wraps around when moving the last tab right or the first tab left πŸ”„.
  • tabbedex:move_tab_left:nowrap and tabbedex:move_tab_right:nowrap β€” moves the current tab left or right like tabbedex:move_tab_left and tabbedex:move_tab_right, but no wrap-around. i.e. moving the first tab left or the last tab right does nothing. the more you know ⭐.
  • tabbedex:goto_tab_N β€” if N is a positive integer, it switches to the Nth tab. and if N is negative, it switches to the -Nth tab counting from the last one πŸ‘‘.
  • tabbedex:kill_tab β€” kills/destroys the current tab πŸ’€.
  • tabbedex:rename_tab β€” starts renaming the tab ✨.

πŸ¦‹ OSC SEQUENCES πŸ¦‹

okay so tabbedex also supports two OSC sequences, and this is the part where programs running inside the terminal can talk to it. they do it by writing an OSC sequence ESC ] 777 ; string ST where string is the command to execute. example:

printf '\033]777;tabbedex;set_tab_name;%s\007' "foo"

here's the duo you can use:

  • tabbedex;set_tab_name;name β€” sets the name of the current tab to name. cute, simple, slays πŸ’–.
  • tabbedex;ignore_line_activity;n β€” prevents new text on the given line from affecting the activity marks displayed in the tab bar (peep the tabbar-timeouts resource for that). positive values specify the nth row from the top, negative values specify the -nth row from the bottom, and zero disables the filtering entirely (which makes all updates affect activity marks again) πŸ”.

this is genuinely so useful if an app has a periodically-updating status line whose refresh does not actually indicate activity in the tab. like, screen(1) can display the current time in its hardstatus. to stop updates to that clock from registering as activity in the screen window, you can tell tabbedex to ignore the bottom row of the display:

printf '\033]777;tabbedex;ignore_line_activity;%d\007' -1

and if you want it to be automatic, bestie, you can use a custom script for starting screen(1):

#!/bin/sh
ignore_line_activity() {
    printf '\033]777;tabbedex;ignore_line_activity;%d\007' "$1"
}
ignore_line_activity -1
screen "$@"
ignore_line_activity 0
heads up πŸ™ˆ: if text wraps across multiple lines, only the topmost row counts as changed. so don't come for tabbedex when a wrapped line sneaks past you.

🌸 SEE ALSO 🌸

go read these too, bestie, they're the whole friend group: urxvt(1), urxvt-tabbed(1), tabbedex-command-runner(1) and tabbedex-pgid-cd(1) πŸ“šπŸ’œ


πŸŽ€ BUG REPORTS πŸŽ€

you found a bug? iconic of you, honestly. file those bug reports:


Copyright 2006-2022 tabbed and tabbedex authors

Copyright 2013-2026 Michal Nazarewicz <mina86@mina86.com>

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.


πŸ’« AUTHOR πŸ’«

tabbedex has been created (as a fork of urxvt-tabbed(1)) and is maintained by Michal Nazarewicz. for the list of authors, see the AUTHORS file distributed with the extension πŸ«‘πŸ’–


and that's the whole page, bestie!! πŸŽ‰ this one shipped with perl v5.42.3, dated 1980-01-01, and it's the TABBEDEX(1) manual β€” go forth and tab responsibly πŸ’…βœ¨πŸ“

πŸ“¦ where this page comes from