UTALK(1)
π¬ UTALK(1) β General Commands Manual π¬
okay bestie, pull up a chair, we're doing utalk(1) and it's gonna be a whole journey π«Ά this is the manual page for utalk, and no cap, it's kind of a lot, but it's so worth it.
β¨ NAME β¨
utalk β a UDP-based full screen talk program π
π SYNOPSIS π
utalk [options] user[@host][#tty]
utalk [options] !port@host
utalk [options] -s port
utalk [options] -c host port
π OPTIONS π
-s,--serverβ tellsutalkto NOT go through the talk daemons to announce itself, and instead justβ¦ chill and wait for a connection on the port number you gave it. server era, periodt β¨-c,--clientβ same vibe but opposite: don't use the talk daemons to announce yourself, just connect straight to the given port number on the given host. no daemon middleman, we're going direct π-a,--announce-onlyβ makesutalkpick a local port number for itself and send out an announce carrying that port number instead of your username. super useful when you wanna start autalksession with a host that does have a talk daemon but yours lowkey doesn't π«-7,--seven-bitβ makesutalkconvert every single character to 7-bit US-ASCII before it displays them. iconic move if your terminal isn't iso-8859-1 capable, ngl π-8,--eight-bitβ makesutalkshow iso-8859-1 encoded characters on screen exactly as they arrive. as they were received, no edits, no filter π
π¦ ARGUMENTS π¦
user@host[#tty]β this is who you're ringing π the"user@host"part can be swapped out for an alias name that you defined in your~/.utalkrc. and if you specify the tty,utalkwill ask the talk daemon to ring that user on that particular tty, like, specifically. also: the username can have a'!'prefixed onto it, andutalkwill just strip that bad boy off.!port@hostβ this one tellsutalkthe port number to connect to, plus the host. it's giving "answering autalk -a" energy π«
π DESCRIPTION π
so utalk is a text-based chat program, in the same vein as talk and YTalk, BUT it uses a better protocol built on top of UDP for communication. the way that it does not require network packets to arrive in sequence in order to display them?? game changer. it means utalk can be used over unreliable links, where a TCP/IP connection like a telnet or a talk would be way too slow to actually be usable. no cap π
on top of all that, utalk supports full editing of previously typed text, scrollback, keyboard bindings, and aliases. obsessed.
β οΈ important:utalkis incompatible with every other talk program out there, because it uses a completely different protocol. and unfortunately β the way that this is literally out of our hands β the text"respond with: talk"is hard-coded into the talk daemon and cannot be set by the client. π
to avoid confusion, utalk's talk requests send the username prefixed with a '!', which must be understood as respond with utalk.
π DISPLAY π
same as in talk and YTalk, the utalk screen is split into two separate scrolling areas (a.k.a. windows): the one at the top is for you, and the one at the bottom is for the other connected user π«Ά
at any given time, one of these windows is active. and each scrolling area has a status line at the top of it, showing the name of the client plus these flags:
[m]β this flag is always present on the top window, because it's your own window. from your point of view, it literally means it's "my" window π[o]β this flag means your own window is in overwrite mode.[i]β this flag means your own window is in insert mode.[*]β this flag means the window is active and in read-write mode. this is the normal mode for your own window; in this mode you can type and edit, and when you move your cursor and/or scroll back, the other connected user can see your cursor movement too π[R]β this flag means the window is active and in read-only mode. this is the only way a window other than yours can be active (like, you can't type text into someone else's window, obviously). setting your own window into read-only mode lets you scroll back through what you typed without the other user seeing you doing it π€«[n]β means the window is not yet connected; the user hasn't responded yet. the waiting era π[c]β means the window is connected. slay β[b]β means the window is connected, BUT no data has been received for a while β and that includes even the control data thatutalksends periodically. so the connection might be broken, or the client on the other side might have crashed πutalkwill not interrupt a connection because of this; it's up to you to stop it after a while if it doesn't come back. so like, keep an eye on it bestie π«
β¨ EDITING β¨
okay so utalk's editing keys can be configured to emulate either vi or emacs, in a limited way. By default, utalk is in emacs mode. π
utalk keeps a table of bindings for each of three modes: emacs mode, vi command mode, and vi insert mode. These tables are initialized to suitable defaults, and you can add bindings with the bind command in your ~/.utalkrc file. π
The following is a list of all key commands and their default bindings in emacs mode, vi command mode, and vi insert/replace mode respectively. π
self-insertβ emacs:(printable chars)Β· vi command:(unbound)Β· vi insert/replace:(printable chars)
In overwrite mode (replace in vi mode) the keypress gets inserted at the current cursor position, the character at this position is replaced by the new one, and the cursor moves forward one step.
In insert mode the key gets inserted as well at the current cursor position but the rest of the line (if any) is moved one step to the right.
toggle-overwriteβ emacs:(ESC [2~)Β· vi command:(unbound)Β· vi insert/replace:(unbound)
Change between overwrite and insert modes. In most systems the sequence ESC [2~ is mapped to the insert key. β¨
insert-in-placeβ emacs:(unbound)Β· vi command:(unbound)Β· vi insert/replace:(unbound)
The keypress gets inserted at the current cursor position, and the cursor does not move. π
quote-charβ emacs:(^Q)Β· vi command:(unbound)Β· vi insert/replace:(^V)
Insert the following key literally. π
tabβ emacs:(^I)Β· vi command:(unbound)Β· vi insert/replace:(^I)
Moves the cursor to the next tab stop. β¨
new-lineβ emacs:(^M, ^J)Β· vi command:(^M, ^J)Β· vi insert/replace:(^M, ^J)
Moves the cursor to the first position on the next line, possibly creating the line. In most systems the control codes ^M or ^J are mapped to the enter key. π
deleteβ emacs:(^D, ESC [3~)Β· vi command:(x)Β· vi insert/replace:(unbound)
Deletes the character under the cursor. In most systems the sequence ESC [3~ is mapped to the delete key. π
delete-end-of-lineβ emacs:(^K)Β· vi command:(D, d$)Β· vi insert/replace:(unbound)
Deletes from the cursor to the end of the line. βοΈ
delete-beginning-of-lineβ emacs:(unbound)Β· vi command:(d0, d^)Β· vi insert/replace:(unbound)
Deletes from the beginning of the line to the cursor. π«Ά
delete-lineβ emacs:(^U)Β· vi command:(dd)Β· vi insert/replace:(^U)
Deletes the current line. π
delete-wordβ emacs:(ESC d)Β· vi command:(dw, dW)Β· vi insert/replace:(unbound)
Deletes to the beginning of the next word. πΈ
delete-end-of-wordβ emacs:(unbound)Β· vi command:(de)Β· vi insert/replace:(unbound)
Deletes to the end of the current word. β¨
backspaceβ emacs:(^H, DEL)Β· vi command:(X)Β· vi insert/replace:(^H, DEL)
Moves back the cursor one position, erasing the character in that position, the rest of the line (if any) is moved one step to the left. In most systems the control codes ^H or DEL are mapped to the backspace key. π
backspace-wordβ emacs:(^W)Β· vi command:(unbound)Β· vi insert/replace:(^W)
Backspaces over one word. π
backwardβ emacs:(^B, ESC [D)Β· vi command:(h, [D)Β· vi insert/replace:(unbound)
Moves backward one position. In most systems the sequence ESC [D is mapped to the left arrow key. β¬
οΈ
forwardβ emacs:(^F, ESC [C)Β· vi command:(l, [C)Β· vi insert/replace:(unbound)
Moves forward one position. In most systems the sequence ESC [C is mapped to the right arrow key. β‘οΈ
backward-wordβ emacs:(ESC b)Β· vi command:(b, B)Β· vi insert/replace:(unbound)
Moves backward one word. π¦
forward-wordβ emacs:(ESC f)Β· vi command:(w, W)Β· vi insert/replace:(unbound)
Moves forward one word. π¦
end-of-wordβ emacs:(unbound)Β· vi command:(e)Β· vi insert/replace:(unbound)
Moves to the end of the current word. β¨
beginning-of-lineβ emacs:(^A, ESC [7~)Β· vi command:(0, ^)Β· vi insert/replace:(unbound)
Moves to the beginning of the current line. In most systems the sequence ESC [7~ is mapped to the home key. π
end-of-lineβ emacs:(^E, ESC [8~)Β· vi command:($)Β· vi insert/replace:(unbound)
Moves to the end of the current line. In most systems the sequence ESC [8~ is mapped to the end key. π
nopβ emacs:(unbound)Β· vi command:(ESC)Β· vi insert/replace:(unbound)
Does nothing. Literally nothing. It's giving nop core. π
beepβ emacs:(unbound)Β· vi command:(unbound)Β· vi insert/replace:(unbound)
Beeps the terminal (does not send a beep across to the other clients). π
upβ emacs:(^P, ESC [A)Β· vi command:(k, [A)Β· vi insert/replace:(unbound)
Moves the cursor up one line. In most systems the sequence ESC [A is mapped to the up arrow key. β¬οΈ
downβ emacs:(^N, ESC [B)Β· vi command:(j, [B)Β· vi insert/replace:(unbound)
Moves the cursor down one line. In most systems the sequence ESC [B is mapped to the down arrow key. β¬οΈ
up-pageβ emacs:(ESC v, ESC [5~)Β· vi command:(^B)Β· vi insert/replace:(unbound)
Moves the cursor up one page if the screen is in read/write mode, and scrolls up by one page if it is in read-only mode. In most systems the sequence ESC [5~ is mapped to the page up key. π
down-pageβ emacs:(^V, ESC [6~)Β· vi command:(^F)Β· vi insert/replace:(unbound)
Moves the cursor down one page if the screen is in read/write mode, and scrolls down by one page if it is in read-only mode. In most systems the sequence ESC [6~ is mapped to the page down key. π
up-half-pageβ emacs:(unbound)Β· vi command:(^U)Β· vi insert/replace:(unbound)
Moves the cursor up half a page if the screen is in read/write mode, and scrolls up by half a page if it is in read-only mode. π
down-half-pageβ emacs:(unbound)Β· vi command:(^D)Β· vi insert/replace:(unbound)
Moves the cursor down half a page if the screen is in read/write mode, and scrolls down by half a page if it is in read-only mode. β¨
top-of-screenβ emacs:(unbound)Β· vi command:(H)Β· vi insert/replace:(unbound)
Moves the cursor to the first line of the current visible screen. π
middle-of-screenβ emacs:(unbound)Β· vi command:(M)Β· vi insert/replace:(unbound)
Moves the cursor to the middle of the screen. Main character energy. π
bottom-of-screenβ emacs:(unbound)Β· vi command:(L)Β· vi insert/replace:(unbound)
Moves the cursor to the last line of the current visible screen. πΈ
top-or-up-pageβ emacs:(unbound)Β· vi command:(unbound)Β· vi insert/replace:(unbound)
Moves the cursor to the top of the screen if it's not there, or scrolls up by one page if it is. π«Ά
bottom-or-down-pageβ emacs:(unbound)Β· vi command:(unbound)Β· vi insert/replace:(unbound)
Moves the cursor to the bottom of the screen if it's not there, or scrolls down by one page if it is. π«Ά
vi-goto-lineβ emacs:(unbound)Β· vi command:(G)Β· vi insert/replace:(unbound)
Moves the cursor to the line number entered as a prefix, if any; otherwise moves to the last line of the buffer. β¨
redisplayβ emacs:(^L)Β· vi command:(^L)Β· vi insert/replace:(^L)
Redraws the screen. Refresh, bestie. π
resynchβ emacs:(^R)Β· vi command:(^R)Β· vi insert/replace:(^R)
Requests immediate transmission of all missing packets. Get those packets, queen. π
next-windowβ emacs:(^X b, ^X o, ^G)Β· vi command:(g)Β· vi insert/replace:(unbound)
Cycles the active window between your window in read/write mode, your window in read-only mode, and each of the other windows. πͺ
set-topicβ emacs:(^T)Β· vi command:(^T)Β· vi insert/replace:(unbound)
Prompts the user for a topic, which will be displayed at the top of the screen for all users. π¬
vi-insert-modeβ emacs:(unbound)Β· vi command:(i)Β· vi insert/replace:(unbound)
Sets vi insert mode. β¨
vi-replace-modeβ emacs:(unbound)Β· vi command:(R)Β· vi insert/replace:(unbound)
Sets vi replace (overwrite) mode. π
vi-command-modeβ emacs:(unbound)Β· vi command:(unbound)Β· vi insert/replace:(unbound)
Sets vi command mode. π
emacs-modeβ emacs:(unbound)Β· vi command:(unbound)Β· vi insert/replace:(unbound)
Sets emacs mode. πΈ
quitβ emacs:(^X c, ^C)Β· vi command:(ZZ)Β· vi insert/replace:(unbound)
Quits utalk. π
vi-escapeβ emacs:(unbound)Β· vi command:(unbound)Β· vi insert/replace:(ESC)
Sets vi command mode and moves the cursor one position to the left. π
vi-addβ emacs:(unbound)Β· vi command:(a)Β· vi insert/replace:(unbound)
Moves the cursor one position to the right and sets vi insert mode. β‘οΈβ¨
vi-add-at-end-of-lineβ emacs:(unbound)Β· vi command:(A)Β· vi insert/replace:(unbound)
Moves the cursor to the end of the current line and sets vi insert mode. πβ¨
vi-insert-at-beginning-of-lineβ emacs:(unbound)Β· vi command:(I)Β· vi insert/replace:(unbound)
Moves the cursor to the beginning of the current line and sets vi insert mode. π β¨
vi-openβ emacs:(unbound)Β· vi command:(o)Β· vi insert/replace:(unbound)
Moves the cursor to the beginning of the next line and sets vi insert mode. πβ¨
vi-open-aboveβ emacs:(unbound)Β· vi command:(O)Β· vi insert/replace:(unbound)
Moves the cursor to the beginning of the previous line and sets vi insert mode. πβ¨
vi-replace-charβ emacs:(unbound)Β· vi command:(r)Β· vi insert/replace:(unbound)
Replaces the char under the cursor with the following key. π
vi-find-charβ emacs:(unbound)Β· vi command:(f)Β· vi insert/replace:(unbound)
Moves the cursor to the next occurrence of the following key on the same line. π
vi-reverse-find-charβ emacs:(unbound)Β· vi command:(F)Β· vi insert/replace:(unbound)
Moves the cursor to the previous occurrence of the following key on the same line. π
vi-till-charβ emacs:(unbound)Β· vi command:(t)Β· vi insert/replace:(unbound)
Moves the cursor to one position before the next occurrence of the following key on the same line. π―
vi-reverse-till-charβ emacs:(unbound)Β· vi command:(T)Β· vi insert/replace:(unbound)
Moves the cursor to one position after the previous occurrence of the following key on the same line. π―
vi-repeat-findβ emacs:(unbound)Β· vi command:(;)Β· vi insert/replace:(unbound)
Repeats the previous find or till command. π
vi-reverse-repeat-findβ emacs:(unbound)Β· vi command:(,)Β· vi insert/replace:(unbound)
Repeats the previous find or till command, reversing the direction. π
vi-delete-find-charβ emacs:(unbound)Β· vi command:(df)Β· vi insert/replace:(unbound)
Deletes all characters between the current position and the next occurrence of the following key on the same line, both included. βοΈ
vi-delete-reverse-find-charβ emacs:(unbound)Β· vi command:(dF)Β· vi insert/replace:(unbound)
Deletes all characters between the current position and the previous occurrence of the following key on the same line, both included. βοΈ
vi-delete-till-charβ emacs:(unbound)Β· vi command:(dt)Β· vi insert/replace:(unbound)
Deletes all characters between the current position and the next occurrence of the following key on the same line, not including the latter. βοΈ
vi-delete-reverse-till-charβ emacs:(unbound)Β· vi command:(dF)Β· vi insert/replace:(unbound)
Deletes all characters between the current position and the previous occurrence of the following key on the same line, not including the latter. βοΈ
vi-flip-caseβ emacs:(unbound)Β· vi command:(~)Β· vi insert/replace:(unbound)
Flip the case of the character under the cursor. β¨
π CONFIGURATION π
okay so you can set a whole bunch of stuff for utalk in a config file, and that file lives in your home directory and it's called .utalkrc. bestie, it's giving ~personalized~. π
The valid commands are, and I'm listing them exactly, no crumbs:
emacs-mode
vi-mode
bind key function
bind! key function
alias alias value
set setting on|off
β¨ Settings β¨
These are the settings you can poke at. every single one, we're not skipping any:
beepβ decides whetherutalklets beeps through or silences them. (the beeps. the little guys. you choose.)word-wrap,wordwrap,wwβ turns word-wrap on or off. heads up: it only kicks in at the end of the last line in the buffer.eight-bit,eightbit,ebβ lets eight-bit iso-latin-1 characters through, or maps them to US-ASCII. pick a lane.meta-esc,metaesc,meβ maps keys with the high bit set to ESC followed by key, or just lets them through. ngl this one only affects emacs-mode.overwriteβ sets the initial overwrite mode toon, orofffor insert mode, and you can change it later (usually with the insert key). lowkey this setting only affects emacs-mode, because in vi-mode the mode is set explicitly with the"i"and"R"commands. periodt.
also, quick glossary vibes:
"toggle"and"se"are synonyms for"set"."bindkey"and"bindkey!"are synonyms for"bind"and"bind!", respectively.
and in settings, the "on" and "off" arguments are optional β "on" is assumed by default, unless the setting's name is prefixed with "no". sneaky but iconic.
Bindings apply to the current mode. so if you wanna change bindings in vi mode, put a "vi-mode" first, then your "bind"s and "bind!"s after it. and in emacs mode, "bind" and "bind!" are synonymous. π«Ά
In a binding, the key has to be a character or a sequence of characters, and you do not separate them with any spaces. The following sequences are recognized to specify characters:
^char,C-charβ Control-charM-charβ Meta-char\eβ ESC\tβ Tab\rβ Carriage return (^M)\nβ Newline (^J)\xhex codeβ Ascii code given in hexcharβ That char, taken literally
π¨ okay bestie listen: you shouldn't bind functions toM-keycombinations in emacs mode. useESCkey combinations instead, and turnmeta-escon if you want to use your Meta key like in emacs. iykyk.
πΈ Aliases πΈ
You can make aliases for addresses of people to ring, in either of 3 forms:
alias aliasname@ username@β Replacesaliasname@hostwithusername@hostfor every host. the'@'at the end ofusername@is not required.alias @aliashost @realhostβ Replacesuser@aliashostwithuser@realhostfor every user. the'@'at the beginning of@realhostis not required.alias aliasname user@hostβ Replacesaliasnamewithuser@host.
π COPYING π
utalk is free software. You can redistribute it and/or modify it under the GNU General Public License as published by the Free Software Foundation. See the file LICENSE for details. (slay, and also legally binding, so like, read it fr fr π)
π¦ SEE ALSO π¦
talk(1), ytalk(1), talkd(8), mesg(1)
π FILES π
~/.utalkrcβ configuration file
π BUGS π
not me having to tell you the flaws, but here we are:
- Currently the
wordwarpfunction only works in overwrite mode, not in insert mode. (yes, it's spelledwordwarpup in here, that's just how it is π ) and if the users have a different terminal width, thewordwrapis only done correctly in the local"my"window. - The vi and emacs emulations are relatively primitive.
- There is an embedded help function but is not completed. π
π AUTHOR π
utalk was written by Roger Espel Llima <roger.espel.llima at pobox.com>. Version 1.0.2 was released by E. Bosch <presidev at gmail.com>.
and that's the whole page, bestie!! πβ¨ this manual page is from utalk version 1.0.2 β the page itself is credited to Roger Espel Llima and it's dated Dec 27, 2020, filed under UTALK(1). go forth and talk, you absolute main character ππ«Άπ
π¦ where this page comes from
- debian bookworm: utalk 1.0.2-2+b1
- ubuntu jammy: utalk 1.0.2-2
- ubuntu noble: utalk 1.0.2-2
- ubuntu resolute: utalk 1.0.2-2
- ubuntu stonking: utalk 1.0.2-2
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms