ait.1 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. .TH AIT "1" "October 2023" "ait 1.5" "General Commands Manual\fR
  2. .SH NAME
  3. .B ait
  4. \- microEMACS-like editor inspired by GNU Emacs and acme
  5. .SH SYNOPSIS
  6. .B ait
  7. .B [-vh]
  8. [\fI\,file\/\fR [+/-\fI\,number\/\fR] ...]
  9. .br
  10. .SH DESCRIPTION
  11. .B ait
  12. is intended to be small, portable, and powerful Emacs-like text editor. While
  13. those are the top 3 main goals,
  14. .B ait
  15. also is intended to be simple in both implemetation and use, support the most
  16. important GNU Emacs keybindings, support UTF8 and unicode, to not reinvent
  17. the wheel, and to not suck. You will find many differences between GNU Emacs
  18. and
  19. .B ait
  20. as
  21. .B ait
  22. is
  23. .I not
  24. intended to be an Emacs clone. Some of the most prominent differences are:
  25. the lacks of a config, of lisp, of 100% custom window layouts, of major syntax
  26. highlighting, and of modes in general.
  27. .B ait
  28. instead is simple enough that you can change the source to change the
  29. keybindings, uses the existing system as the extension language (see
  30. \fBSHELL COMMANDS\fR), uses a simple static-window system that works for 99% of all editing
  31. purposes, and supports the bare-minimum syntax highlighting (see
  32. \fBSYNTAX HIGHLIGHTING\fR). Think of
  33. .B ait
  34. as a microEMACS implementation of GNU Emacs with concepts from Plan 9's acme
  35. editor.
  36. .TP
  37. The options are as follows:
  38. .TP
  39. \fB+/- number\fR
  40. Go to the line specified by number (do not insert a space between the '+' or '-'
  41. sign and the number). If a negative number is specified, the line number counts
  42. backwards from the end of the file i.e. -1 will be the last line of the file,
  43. -2 will be second last, and so on.
  44. .TP
  45. \fB-v\fR
  46. Print version and exit
  47. .TP
  48. \fB-h\fR
  49. Print help and exit
  50. .TP
  51. .SH POINT & MARK
  52. .B ait
  53. is written using a gap buffer and therefore some of the lingo used to describe
  54. various behaviors come from this. The
  55. .I point
  56. is the location of the cursor in the buffer. The
  57. .I mark
  58. is a point that is set by the user to define either the beginning or end of the
  59. \fIregion\fR.
  60. The region is used for a variety of functions such as cut, copy, and
  61. shell-command. The point and mark are both buffer specific.
  62. There are some note-worthy special cases that may confuse users at first.
  63. Firstly, column-memory. If you haven't explicitly changed the current
  64. column using something fwd-word, back-char, etc.
  65. .B ait
  66. will remember which column you're on. This makes editing things that are
  67. in the same column but seperated by short lines a lot easier. Secondly,
  68. brack-matching is supported for all heterogeneous bracket types (), {}, <>,
  69. and []. It is not supported for homogeneous ones ("", '', ``). You can, however,
  70. still use forward-bracket and backward-bracket to jump to them. Thirdly,
  71. regarding the forward/backward-bracket functions, if there is a mark they will
  72. overshoot to allow you to select the entire enclosed text and its brackets.
  73. For example, if you have the code (+ 1 2) and the point is on ( and you place
  74. a mark there and run forward-bracket, the point will actually go one character
  75. to the right of the), effectively allow you to kill that entire block of code.
  76. If the point were on the ) and you place a mark there and run backward-bracket,
  77. the mark will be moved one character to the right of the ) and then the point
  78. moved to the (. The two previous cases only work when the point is on the
  79. bracket and not next to it like in GNU Emacs.
  80. .SH WINDOWS AND BUFFERS
  81. When a file is loaded into
  82. \fBait\fR, it is stored in a \fIbuffer\fR. This buffer may be displayed on the
  83. screen in more than one \fIwindow\fR. Each window is delineated by a
  84. .I modeline
  85. at the bottom. The modeline contains important information about the buffer
  86. inside the window. The second position in the modeline will contain an "O" if
  87. that buffer is in overwrite mode. If changes are made to a buffer, you will see
  88. an asterisk in the third position of that buffer's window's modeline. If a file
  89. is changed outside
  90. .B ait
  91. and its buffer is about to be changed,
  92. .B ait
  93. prompts if the change should go ahead (y), not go ahead (n) or if the buffer
  94. should be reverted (r) to the latest file on disk. The default buffer is called
  95. .I *scratch*
  96. and is not saved when you close the program. In the modeline you will also find
  97. the buffer name. This name is usually the same as the file's name unless there
  98. is another buffer loaded with the same file name. In that case, the buffer name
  99. will contain the directory name in the name i.e. dir/foo.txt. The file name
  100. usually contains the entire path to that file and is seen when you save the
  101. buffer. Next in the modeline is the row and column inside of parenthesis.
  102. Lastly, there is the percentage of the buffer you're viewing. If you're at the
  103. top and you can't page up anymore, you'll see TOP. If you can't page down
  104. anymore you'll see BOT. Otherwise, you'll see the percent.
  105. Unlike GNU Emacs,
  106. .B ait
  107. doesn't allow the user to make endless window configurations. There are only 8
  108. supported window modes: one, horizontal, vertical, triple horizontal, triple
  109. vertical, Fibonacci right, Fibonacci left, and quad. Horizontal and vertical
  110. mode are 2 window splits in the respective direction. The triple modes are
  111. the same as the previous just with 3 windows. Fibonacci modes are modes that
  112. have 2 small windows that make up the height of the third large window. It is
  113. called this because it resembles the first 3 squares in the Fibonacci sequence.
  114. Lastly, quad mode is a 4 window mode with 4 windows, one in each quadrant. Also
  115. unlike GNU Emacs, close-window doesn't exist. You can only change window modes
  116. and so the keybinding C-x 0 will take you back to one window mode. When you
  117. change modes
  118. .B ait
  119. will attempt to fill the windows by following the buffer trail (explained in the
  120. next parapgraph). This isn't always right but is extremely handy.
  121. The order of buffers and windows is not handled by any array or list. They are
  122. handled by pointers that point to other pointers, thus creating a "trail" of
  123. sorts. The buffer trail is the path to the order of the open buffers i.e.
  124. current-buffer(foo.txt->b_next(bar.txt)->b_next(README)->b_next(NULL). The
  125. list must always end with NULL.
  126. .SH MSGLINE
  127. Under all windows and modlines is the prompt area, namely, the \fImsgline\fR.
  128. This is where all non-editing input is handled. Unlike GNU Emacs, the msgline
  129. is not a buffer but a special place for messages and prompts. In most prompts,
  130. most of the basic movement keybindings are usable: backward-char, forward-char,
  131. back-word, fwd-word, delete, backspace, kill-line, beginning-of-line,
  132. end-of-line, back-word-delete, and fwd-word-delete.
  133. .SH KEYBINDINGS
  134. Keybindings in
  135. .B ait
  136. are written similarly to other Emacs clones. "C" means control and "M" means
  137. meta. Therefore, "C-x" means control plus the x key and "M-x" means meta/alt plus
  138. the x key. Since
  139. .B ait
  140. is usable on pretty much any terminal, it was selected to use esc instead of "M" to
  141. describe meta. Therefore, "esc x" means the same as "M-x". The below list has
  142. the keybinding in bold, followed by the common name for the function that the
  143. keybinding runs, followed by a description on how that function works.
  144. .TP
  145. \fBC-a\fR
  146. beginning-of-line, move the point to the beginning of the line.
  147. .TP
  148. \fBC-b / left\fR
  149. backward-char, move the point to the left by 1 character.
  150. .TP
  151. \fBC-d / delete\fR
  152. delete, delete the character that the point is currently pointing to.
  153. .TP
  154. \fBC-e\fR
  155. end-of-line, move the point to the end of the line.
  156. .TP
  157. \fBC-f / right\fR
  158. foward-char, move the point to the right by 1 character.
  159. .TP
  160. \fBC-h / backspace\fR
  161. backspace, delete the character directly to the left of the point.
  162. .TP
  163. \fBC-i\fR
  164. indent, insert 2 spaces.
  165. .TP
  166. \fBC-k\fR
  167. kill-to-eol, cut from the point to the end of the line.
  168. .TP
  169. \fBC-l\fR
  170. recenter, jump the page from top, middle, and end of the window following this
  171. cycle: middle, top, end, repeat.
  172. .TP
  173. \fBC-x u / C-/\fR
  174. undo, unlimited linear undo. See
  175. .B UNDO & REDO
  176. for more information.
  177. .TP
  178. \fBC-n / down\fR
  179. next-line, move the point down by 1 line.
  180. .TP
  181. \fBC-m / enter\fR
  182. newline, insert a newline character at the point.
  183. .TP
  184. \fBC-p / up\fR
  185. previous-line, moved the point up by 1 line.
  186. .TP
  187. \fBC-r\fR
  188. reverse-isearch, prompt the user for a search query and search start at the
  189. point going up. See the section
  190. .B ISEARCH
  191. for more information.
  192. .TP
  193. \fBC-o\fR
  194. newline-below, insert a newline character at the end of the current line.
  195. .TP
  196. \fBC-s\fR
  197. reverse-isearch, prompt the user for a search query and search start at the
  198. point going down. See the section
  199. .B ISEARCH
  200. for more information.
  201. .TP
  202. \fBC-t\fR
  203. transpose, flip the position of the character at the point with the character
  204. directly to the left of it.
  205. .TP
  206. \fBC-u\fR
  207. universal-argument, at the moment all this does is run certain commands
  208. 4^(number of C-u presses) times. In Emacs, universal-argument does much more
  209. and
  210. .B ait
  211. does have a framework to do more with it but isn't fully implemented due to lack
  212. of necessity.
  213. .TP
  214. \fBC-v / pagedown\fR
  215. forward-page, move the page by one full page down.
  216. .TP
  217. \fBC-w / esc k\fR
  218. kill-region, cut the region. See
  219. .B POINT AND MARK
  220. for more information.
  221. .TP
  222. \fBC-y\fR
  223. yank, insert the scrap at the point. See
  224. .B POINT AND MARK
  225. for more information.
  226. .TP
  227. \fBC-z\fR
  228. suspend, suspend
  229. .B ait
  230. .
  231. .TP
  232. \fBC-space / esc @\fR
  233. set-mark, set the point as the current mark.
  234. .TP
  235. \fBC-g / C-x C-g\fR
  236. remove-mark, remove the current mark. C-g is also used to quit any command
  237. in
  238. .B ait
  239. .
  240. .TP
  241. \fBC-x 0 / C-x 1\fR
  242. delete-other-window, return to one window mode.
  243. .TP
  244. \fBC-x 2\fR
  245. split-window, split into horizontal window mode.
  246. .TP
  247. \fBC-x 3\fR
  248. chop-window, split into vertical window mode.
  249. .TP
  250. \fBC-x 4\fR
  251. tri-split, split into triple horizontal window mode.
  252. .TP
  253. \fBC-x 5\fR
  254. tri-chop, split into triple vertical window mode.
  255. .TP
  256. \fBC-x 6\fR
  257. fib-right, split into Fibonacci right mode.
  258. .TP
  259. \fBC-x 7\fR
  260. fib-left, split into Fibonacci left mode.
  261. .TP
  262. \fBC-x 8\fR
  263. quad-window, split into quad window mode.
  264. .TP
  265. \fBC-x o\fR
  266. other-window, jump cursor to the next window in the window trail. See
  267. .B WINDOWS AND BUFFERS
  268. for more information.
  269. .TP
  270. \fBC-x =\fR
  271. cursor-position, print information on current cusor location to the msgline.
  272. .TP
  273. \fBC-x i\fR
  274. insert-file, insert a file into the current buffer.
  275. .TP
  276. \fBC-x k\fR
  277. kill-buffer, kill the current buffer. If unsaved, prompt to save.
  278. .TP
  279. \fBC-x C-n / C-x n\fR
  280. next-buffer, switch to the next buffer in the buffer trail. See
  281. .B WINDOWS AND BUFFERS
  282. for more information.
  283. .TP
  284. \fBC-x l\fR
  285. last-buffer, switch to the last buffer you previous had as the current.
  286. .TP
  287. \fBC-x b\fR
  288. switch-to-buffer, prompt the user to select which buffer they'd like to switch to.
  289. .TP
  290. \fBC-x (\fR
  291. start-kbd-macro, begin a keyboard macro.
  292. .TP
  293. \fBC-x )\fR
  294. end-kbd-macro, end a keyboard macro.
  295. .TP
  296. \fBC-x e\fR
  297. run-kbd-macro, execute a keyboard macro.
  298. .TP
  299. \fBC-x C-f\fR
  300. find-file, prompt the user to select a file to open.
  301. .TP
  302. \fBC-x C-s\fR
  303. save-buffer, save the current buffer to disk.
  304. .TP
  305. \fBC-x C-w\fR
  306. write-file, save the current buffer to a new file.
  307. .TP
  308. \fBC-x C-c\fR
  309. exit, quit
  310. .B ait
  311. .
  312. .TP
  313. \fBC-x C-x\fR
  314. pop-to-mark, jump point to the previous mark point.
  315. .TP
  316. \fBesc 0\fR
  317. numeric-arg-0, see
  318. .B NUMERIC ARGUMENT
  319. for more information.
  320. .TP
  321. \fBesc 1\fR
  322. numeric-arg-1, see
  323. .B NUMERIC ARGUMENT
  324. for more information.
  325. .TP
  326. \fBesc 2\fR
  327. numeric-arg-2, see
  328. .B NUMERIC ARGUMENT
  329. for more information.
  330. .TP
  331. \fBesc 3\fR
  332. numeric-arg-3, see
  333. .B NUMERIC ARGUMENT
  334. for more information.
  335. .TP
  336. \fBesc 4\fR
  337. numeric-arg-4, see
  338. .B NUMERIC ARGUMENT
  339. for more information.
  340. .TP
  341. \fBesc 5\fR
  342. numeric-arg-5, see
  343. .B NUMERIC ARGUMENT
  344. for more information.
  345. .TP
  346. \fBesc 6\fR
  347. numeric-arg-6, see
  348. .B NUMERIC ARGUMENT
  349. for more information.
  350. .TP
  351. \fBesc 7\fR
  352. numeric-arg-7, see
  353. .B NUMERIC ARGUMENT
  354. for more information.
  355. .TP
  356. \fBesc 8\fR
  357. numeric-arg-8, see
  358. .B NUMERIC ARGUMENT
  359. for more information.
  360. .TP
  361. \fBesc 9\fR
  362. numeric-arg-9, see
  363. .B NUMERIC ARGUMENT
  364. for more information.
  365. .TP
  366. \fBesc b\fR
  367. back-word, move point to the left by one word.
  368. .TP
  369. \fBesc bksp\fR
  370. back-word-delete, delete one word to the left.
  371. .TP
  372. \fBesc f\fR
  373. fwd-word, move point to the right by one word.
  374. .TP
  375. \fBesc d\fR
  376. fwd-word-delete, delete one word to the right.
  377. .TP
  378. \fBesc x\fR
  379. execute-shell-cmd, execute a shell command. See
  380. .B SHELL COMMANDS
  381. for more information.
  382. .TP
  383. \fBesc g\fR
  384. gotoline, prompt the user to select which line to jump to.
  385. .TP
  386. \fBesc i\fR
  387. indent, insert a tab character at the point.
  388. .TP
  389. \fBesc m\fR
  390. back-to-indentation, jump point to the next non-whitespace character.
  391. .TP
  392. \fBesc n\fR
  393. negate, set the negate flag. This isn't used much and almost no commands use it.
  394. I've found it more valuable to have custom keybindings to run commands in
  395. reverse.
  396. .TP
  397. \fBesc o\fR
  398. open-shell-cmd, execute a shell command to open a new buffer. See
  399. .B SHELL COMMANDS
  400. for more information.
  401. .TP
  402. \fBesc %\fR
  403. query-replace, prompt the user to replace something in the buffer. See
  404. .B QUERY REPLACE
  405. for more information.
  406. .TP
  407. \fBesc v / pageup\fR
  408. backward-page, move the page by one full page up.
  409. .TP
  410. \fBesc w\fR
  411. copy-region, copy the region. See
  412. .B POINT AND MARK
  413. for more information.
  414. .TP
  415. \fBesc < / home\fR
  416. beg-of-buf, set point to the beginning of the buffer.
  417. .TP
  418. \fBesc > / end\fR
  419. end-of-buf, set point to the end of the buffer.
  420. .TP
  421. \fBesc \\\fR
  422. delete-whitespace, delete all whitespace to the rigth and left of the point.
  423. .TP
  424. \fBesc /\fR
  425. redo, redo an undo. You an redo as many undos as there are. See
  426. .B UNDO & REDO
  427. for more information.
  428. .TP
  429. \fBesc t\fR
  430. transpose word, flip the word the point is currently in the the word to the left.
  431. .TP
  432. \fBesc l\fR
  433. lowercase-word, make the next word (starting at the point) lowercase.
  434. .TP
  435. \fBesc c\fR
  436. capitalize-word, capitalize the next word (starting at the point).
  437. .TP
  438. \fBesc u\fR
  439. uppercase-word, make the next word (starting at the point) uppercase.
  440. .TP
  441. \fBesc ;\fR
  442. jump-to-char, prompt the user to select a character to the right of the point
  443. to jump the point to.
  444. .TP
  445. \fBesc :\fR
  446. negated-jump-to-char, prompt the user to select a character to the left of the
  447. point to jump the point to.
  448. .TP
  449. \fBesc z\fR
  450. zap-to-char, delete all characters to the right until the point reaches the
  451. insert character.
  452. .TP
  453. \fBesc Z\fR
  454. negated-zap-to-char, delete all characters to the left until the point reaches the
  455. insert character.
  456. .TP
  457. \fBinsert\fR
  458. toggle-overwrite-mode, toggle between insert and overwrite mode.
  459. .TP
  460. \fBC-M-f\fR
  461. foward-bracket, jump the point to the match of the bracket at the
  462. point going to the right.
  463. .TP
  464. \fBC-M-b\fR
  465. backward-bracket, jump the point to the match of the bracket at the
  466. point going to the left.
  467. .TP
  468. .SH ISEARCH
  469. isearch stands for incremental search and is the normal way to search for
  470. something in a buffer. isearch has two modes: isearch and isearch-reverse.
  471. isearch goes down the buffer and reverse goes up. It is paramount that you
  472. understand how the prompt for isearch works to use it to it's best ability.
  473. While in the isearch function is running, you have a few keybindings at your
  474. disposal other than the normal msgline keybinds:
  475. .TP
  476. \fBesc / C-g\fR
  477. Quit. This will take you back to the original start point.
  478. .TP
  479. \fBC-s\fR
  480. Jump to next match. If in isearch-reverse, switch to isearch.
  481. .TP
  482. \fBC-r\fR
  483. Jump to next match. If in isearch, switch to isearch-reverse.
  484. .TP
  485. \fBenter\fR
  486. Accept match, quit isearch, and stay at that point.
  487. .TP
  488. .PP
  489. Once you've reached a point where there are no more matches, pressing the
  490. respective keybind (C-s in isearch, C-r in isearch-reverse) will continue the
  491. search from the beginning or end of the buffer respectively. Lastly, if you type
  492. an all lowercase query it will search for matches
  493. \fIregardless of case;\fP meaning that it searches with case insensitivity.
  494. If you put any uppercase letter into the query, the search now becomes case
  495. sensitive.
  496. .SH UNDO & REDO
  497. It's not overtly obvious when a undo set happens, the explanation is quick. An
  498. undo set happens whenever you break a chain of similar commands - if you are
  499. typing a big paragraph but don't manually move the cursor, delete
  500. anything, or run any other commands you'll find the undo will remove that entire
  501. paragraph. This is because you haven't broken the chain of commands. A redo
  502. only becomes available once you've undone something.
  503. .SH NUMERICAL ARGUMENT
  504. Numerical argument is a way to run a keybinding many times. It is most useful
  505. when used in combination with keyboard macros but can also be nice when doing
  506. normal editting as well. When you begin entering a numeric argument you'll see
  507. "C-u x", where x is the number you've added, in the msgline. Upon entering the
  508. next number you will find that it doesn't add to the original number but rather
  509. shifts the original number into the next most significant digit. This makes it
  510. very easy to do massive recurring edits.
  511. .SH QUERY REPLACE
  512. The query-replace function is useful to replace multiple occurances of something
  513. with another something. This function is very straightforward on how to use so
  514. an explanation isn't needed. Once in the search, 'y' will accept the replace,
  515. replace the query with the replacement, and move to the next match; 'n' will
  516. skip the current match, '!' will accept all occurances without asking, and 'q'
  517. will quit. You may also use C-g to quit before you get to searching part or
  518. C-g and enter in the searching part.
  519. .SH SHELL COMMANDS
  520. One of the most powerful features in
  521. .B ait
  522. is the support to open files using custom commands and running shell commands.
  523. When running a shell command (esc x) there are 2 types: input and replace. Input
  524. happens when you have no region and you want to input the output of a command.
  525. One of the best uses of this is with xclip(1) or pbpaste(1) (on macOS) allowing
  526. you to paste in the editor. Replace happens when there is a region. In a region
  527. command the region is passed into the shell command and the output of that command,
  528. unless empty (just contains a null terminator or newline), is then placed where
  529. the region was. One of the best uses of this is a spell checker.
  530. .B ait
  531. ships with an example script called "spell" that uses this technique, however,
  532. it requires pick(1) and aspell(1) to be installed.
  533. Open command is very straightforward, use anything you want to find the file you
  534. want to open and make a script that returns just the file and path.
  535. .B ait
  536. ships with a few examples of this "ff" (find file) and "gg" (git grep) which
  537. both require pick(1) and git(1) to be installed.
  538. There may, in the future, be a way to have commands that don't effect the buffer
  539. or commands that effect the entire buffer added in later version.
  540. .SH SYNTAX HIGHLIGHTING
  541. .B ait
  542. lacks good syntax highlighting because it's not really needed. However, it is
  543. helpful to have something to help differentiate when something is in a string
  544. or a comment - which is the only syntax highlighting that
  545. .B ait
  546. supports. This feature is file extension dependent and must be added directly
  547. into the source (buffer.c). The structure allows you to specify the file
  548. extension, a single line comment, multi-line comment start (NULL if there
  549. isn't any), multi-line comment end (NULL if there isn't any), if a single
  550. quote is a string, and if a backquote is a string.
  551. .SH BACKUP FILES
  552. Backup files usually end in ~ and are, by default, sent to $HOME/.backups. These
  553. backups contain the entire path with the slashes replaced with exclamation
  554. points i.e. /home/foobar/foo.txt -> !home!foobar!foo.txt. You can optionally
  555. have backup files be put in the directory where that file is located by setting
  556. the BACKUP_DIR definition to NULL.
  557. Backups are created right before the buffer is written to disk. They contain the
  558. file's contents before it is overwritten.
  559. .SH AUTHOR
  560. .B ait
  561. is a fork of an editor called atto. Atto was a fork of an editor called AE.
  562. From Atto's README: "Atto is based on the public domain code of Anthony Howe's
  563. editor (commonly known as Anthony's Editor or AE, [2])..."
  564. That being said, parts of
  565. .B ait
  566. are written by all three of us: Anthony Howe,
  567. Hugh Barney, and Kevin Bloom.
  568. Kevin Bloom is the current maintainer.
  569. .SH KNOWN ISSUES
  570. You may view and track issues here: https://notabug.org/nuclearkev/ait/issues.
  571. UTF-8 and unicode works for the most part but they are seen as "second-class
  572. citizens" due to the fact that most programming and general text editting is
  573. done with ACSII or ISO646-US or whatever. If you view open `docs/UTF-8.txt`
  574. with
  575. .B ait
  576. you'll see that most of it is fine but lines 123-130 are messed up a little.
  577. .SH "REPORTING BUGS"
  578. Report bugs to https://notabug.org/nuclearkev/ait/issues
  579. .SH COPYRIGHT
  580. Public Domain 1991, 1993 by Anthony Howe. No warranty.
  581. Public Domain 2014-2022 by Hugh Barney. No warranty
  582. Copyright \(co 2023 Kevin "The Nuclear" Bloom.
  583. .B ait
  584. comes with ABSOLUTELY NO WARRANTY.
  585. You may redistribute copies of
  586. .B ait
  587. under the terms of the BSD 3-Clause License.
  588. For more information about these matters, see the file named LICENSE.
  589. .SH "SEE ALSO"
  590. .BR mg (1),
  591. .BR emacs (1).