TABBEDEX(1)
π 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-LeftandShift-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-F1throughMeta-F12β switches to the first through twelfth tab. twelve whole tabs, the range is real πControl-LeftandControl-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 andtabbar-bg: colourtab-fg: [style] colour andtab-bg: colourbell-fg: [style] colour andbell-bg: colourbell-tab-fg: [style] colour andbell-tab-bg: colourtitle-fg: [style] colour andtitle-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 thebell-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,-ecommand 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.-bwand-geometryespecially, but literally anything else can bite too. that's why only the-ecommand 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-ecommand arguments if they were given when urxvt was started or an empty string otherwise. See also%Ewhich may be easier for some uses. Remember that if neither%enor%Eis used,-eswitch passed when starting urxvt will be completely ignored. β οΈ like, actually ignored. gone. dust.%Eβ Similar to%ebut-eis not included in the expansion and if%ewould expand to an empty string%Eexpands to the value of theSHELLenvironment variable or/bin/shif that's empty. This means that%Eis 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-1if 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 ofHOMEenvironment 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'skeysym.*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).tabbedexplugin 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_tabandtabbedex: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,argumentstemporarily overrides the value of thetab-argumentsresource. 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_thisandtabbedex:new_tab_side_this:argumentsβ liketabbedex:new_tabbut it puts the new tab before (if side isbefore) or after (if side isafter) 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_tabandtabbedex: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:nowrapandtabbedex:prev_tab:nowrapβ same switching vibe astabbedex:next_tabandtabbedex: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_leftandtabbedex: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:nowrapandtabbedex:move_tab_right:nowrapβ moves the current tab left or right liketabbedex:move_tab_leftandtabbedex: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β ifNis a positive integer, it switches to theNth tab. and ifNis negative, it switches to the-Nthtab 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 toname. 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 thetabbar-timeoutsresource for that). positive values specify thenth row from the top, negative values specify the-nthrow 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:
- at <https://codeberg.org/mina86/urxvt-tabbedex/issues>,
- at <https://github.com/mina86/urxvt-tabbedex/issues> or
- over email to mina86@mina86.com.
π COPYRIGHT π
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
- nixos 26.05: urxvt-tabbedex 26.16.1
- nixpkgs unstable: urxvt-tabbedex 26.16.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms