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 β€” tells utalk to 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 β€” makes utalk pick 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 a utalk session with a host that does have a talk daemon but yours lowkey doesn't 🫠
  • -7, --seven-bit β€” makes utalk convert 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 β€” makes utalk show 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, utalk will ask the talk daemon to ring that user on that particular tty, like, specifically. also: the username can have a '!' prefixed onto it, and utalk will just strip that bad boy off.
  • !port@host β€” this one tells utalk the port number to connect to, plus the host. it's giving "answering a utalk -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: utalk is 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 that utalk sends periodically. so the connection might be broken, or the client on the other side might have crashed πŸ’€ utalk will 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 whether utalk lets 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 to on, or off for 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-char
  • M-char β€” Meta-char
  • \e β€” ESC
  • \t β€” Tab
  • \r β€” Carriage return (^M)
  • \n β€” Newline (^J)
  • \xhex code β€” Ascii code given in hex
  • char β€” That char, taken literally
🚨 okay bestie listen: you shouldn't bind functions to M-key combinations in emacs mode. use ESC key combinations instead, and turn meta-esc on 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@ β€” Replaces aliasname@host with username@host for every host. the '@' at the end of username@ is not required.
  • alias @aliashost @realhost β€” Replaces user@aliashost with user@realhost for every user. the '@' at the beginning of @realhost is not required.
  • alias aliasname user@host β€” Replaces aliasname with user@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 wordwarp function only works in overwrite mode, not in insert mode. (yes, it's spelled wordwarp up in here, that's just how it is πŸ’…) and if the users have a different terminal width, the wordwrap is 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