xyproto/orbiton
Snappy and configuration-free little text editor/IDE for the terminal. Suitable for writing git commit messages, editing Markdown, config files, sourc...
Orbiton is a text editor and a simple IDE with the following leading principles:
VT100)Please submit a PR if anything can be improved to help adhere to these.
Orbiton might be a good fit for:
EDITOR=o git commit).README.md and TODO.md files.visudo replacement and has built-in support for neatly formatting /etc/fstab files.ctrl-g to see the word count).This has been my main editor for around 3 years now (since early 2022), and it is mostly written in itself, apart from some NeoViM in the early beginning.
Screenshot of the VTE GUI application (that can be found in the gtk3 directory), running the o editor:
Stepping through the assembly instructions of a Rust program by entering debug mode with the ctrl-o menu and then stepping with ctrl-n:
Editing a C source file in og using the "synthwave" theme:
There are also light themes available:
Writing commit messages:
| orbiton |
|---|
With Go 1.21 or later, the development version of o can be installed like this:
go install github.com/xyproto/orbiton/v2@latest && mv -i ~/go/bin/orbiton ~/go/bin/o
Adjust the mv flags and the ~/go/bin path as needed. Perhaps go install will have an -o flag in the future.
Alternatively, download and install a release version. For example, for Raspberry Pi 2, 3 or 4 running Linux:
curl -sL 'https://github.com/xyproto/orbiton/releases/download/v2.70.4/orbiton-2.70.4-linux_armv7_static.tar.xz' | tar JxC /tmp && sudo install -Dm755 /tmp/orbiton-2.70.4-linux_armv7_static/o /usr/bin/o && sudo install -Dm644 /tmp/orbiton-2.70.4-linux_armv7_static/o.1.gz /usr/share/man/man1/o.1.gz
o as the default editor executable for gitTo set:
git config --global core.editor o
To unset:
git config --global --unset core.editor
By setting the MANPAGER environment variable, it's possible to use o for viewing man pages:
export MANPAGER=o
An alternative to viewing man pages in o is to use less:
export MANPAGER='less -s -M +Gg'
o on OpenSUSEInstall o manually, until an OpenSUSE package exists:
git clone https://github.com/xyproto/orbiton
cd orbiton
make && sudo make install
The following is not strictly needed, but it sets everything up to make full use of o:
Add this to ~/.alias:
alias o=/usr/bin/o
Add this to ~/.profile:
export MANPAGER=/usr/bin/o
export EDITOR=/usr/bin/o
Log out and in again to activate the changes.
These features are unique to o, as far as I am aware:
ctrl-v once to paste one line, press ctrl-v again to paste the rest.ctrl-c once to copy one line, press ctrl-c again to copy a block of lines (until a blank line), press ctrl-c again to copy the current function.ctrl-r. When a portal is open, copy lines across files (or within the same file) with ctrl-v.ctrl-space and format code with ctrl-w, for a wide range of programming languages.ctrl-w or ctrl-r, when an interactive git rebase session is in progress.ctrl-l. Either enter a number to jump to a line or just press return (or t) to jump to the top. Press ctrl-l and return again (or b) to jump to the bottom. Press c to jump to the center.ctrl-l, jumping to a percentage (like 50%) or a fraction (like 0.5 or .5) is also possible. It is also possible to jump to one of the highlighted letters.main. file that does not exist, but main.cpp and main.o does exists, then main.cpp will be opened.ctrl-f, entering text and pressing return. Replace by pressing tab instead of return, then enter the replacement text and press return. Searching for unicode runes on the form u+0000 is also supported.iferr on a single line in a Go or Odin program and press return to insert a suitable if err != nil { return ... } block, based on koron/iferr.ctrl-t when the cursor is on a table. This works best for tables that are not too wide.ctrl-w.if, for and while when return is pressed.ctrl-f twice searches for the word under the cursor."Hello, World" in many popular programming languages simply by pressing ctrl-space.o main.c, pressing ctrl-w and then a double ctrl-space..png, .jpg, .jpeg, .gif, .ico, .bmp and .webp images directly in the terminal (using a scaled down version and up to 16 colors).-p flag followed by a filename can be used for just pasting the clipboard to a new file, instead of editing a file.ctrl-t can jump between a C++ header and source file, when editing C++ code.ctrl-t shows the Markdown table editor, when editing Markdown and the cursor is on a Markdown table.vim and emacs, for small files.pandoc.alacritty, konsole, st, urxvt, xfce4-terminal, xterm and zutty.NO_COLOR environment variable can be set to disable all colors.ctrl-a and ctrl-e may need to be used instead of Home and End. And for browsing up and down, ctrl-n and ctrl-p may be used.go or gccgo./dev/tty is available.xclip for X, wl-clipboard for Wayland or pbcopy for macOS needs to be installed to access the system clipboard.+ or : prefix.COMMIT_EDITMSG, the look and feel will be adjusted for git commit messages.UTF-8, but some runes may be displayed incorrectly.\n).\r\n) to UNIX line endings (just \n), whenever possible.0xc2 0xa0) with a regular space (0x20) whenever possible.0xcc 0x88) with a regular tilde (~) whenever possible.0xcd 0xbe) with a regular semicolon (;) whenever possible.git rebase -i, then either ctrl-w or ctrl-r will cycle the keywords for the current line (fixup, drop, edit etc).r (or have a symlink with that name), the default theme will be red/black.l (or have a symlink with that name), the default theme will be suitable for light backgrounds.s (or have a symlink with that name), the default theme will be the "synthwave" theme.o filename.md, press ctrl-space twice and quit with ctrl-q.ctrl-space or ctrl-t to toggle the check mark in
TODO item boxes in Markdown..gz extension.ctrl-w.ctrl-f and then t to search for a typo, ctrl-n for next match and then ctrl-a to add it and ctrl-i to ignore it).ctrl-l is pressed.tmux or screen and resizing the terminal emulator window may trigger text rendering issues. Try pressing esc to redraw the text, or ctrl-f to search for text. Setting TERM correctly might help (but probably not). Using zellij instead of tmux should work.o is busy performing an operation, pressing ctrl-s may lock the terminal. Some terminal emulators, like konsole, can be configured to turn off this behavior. Press ctrl-q to unlock the terminal again (together with the unfortunate risk of quitting o). To sidestep this issue, the ctrl-o menu can be used instead, for saving and quitting.mosh may cause text rendering issues (in both nvim and o).cmd-v, cmd-x and cmd-c on macOS only works when using the og GUI/VTE frontend. For o, ctrl-v, ctrl-x and ctrl-c can be used instead.There are pretty few hotkeys to remember:
ctrl-s - Save.ctrl-q - Quit.ctrl-r - Open or close a portal. Text can be pasted from the portal into another (or the same) file with ctrl-v.
For "git interactive rebase" mode (git rebase -i), this will cycle the rebase keywords instead.ctrl-a - Go to start of text, then start of line and then to the previous line.ctrl-e - Go to end of line and then to the next linectrl-n - Scroll down 10 lines, or go to the next match if a search is active.
Insert a column when in the Markdown table editor.
Jump to a matching parenthesis or bracket if the arrow keys were just used.ctrl-p - Scroll up 10 lines, or go to the previous match if a search is active.
Remove an empty column when in the Markdown table editor.
Jump to a matching parenthesis or bracket if the arrow keys were just used.ctrl-k - Delete characters to the end of the line, then delete the line.ctrl-_ - Insert a symbol by typing in a 2-letter digraph. Try the --digraphs or -s flag to list all possible digraphs.ctrl-d - Delete a single character.ctrl-t - For C and C++: jump between the current header and source file. For Agda and Ivy, insert a symbol.
For Markdown: toggle checkboxes, or launch the table editor if the cursor is over a table.
For the rest: record and play back keypresses/"macros". Press Esc to clear the current macro.ctrl-o - Open a command menu with actions that can be performed.ctrl-x - Cut the current line. Press twice to cut a block of text (to the next blank line).ctrl-c - Copy one line. Press twice to copy a block of text. Press thrice to copy the current function.ctrl-v - Paste one trimmed line. Press twice to paste multiple untrimmed lines.ctrl-space - Build program, render to PDF or export to man page (see table below).
For Markdown: toggle checkboxes, or double press to export to HTML.ctrl-j - Join the current line with the next one.ctrl-u - Undo (ctrl-z is also possible, but may background the application).ctrl-l - Jump to a specific line number or percentage. Press return to jump to the top. If at the top, press return to jump to the bottom.
Press one of the highlighted on-screen letters to jump to that location.ctrl-f - Search for a string. The search wraps around and is case sensitive. Press tab instead of return to search and replace.
To find typos, search for the letter t, then press ctrl-n for the next word, ctrl-a to add it or ctrl-i to ignore it.ctrl-b - Jump back after jumping to a definition or include with ctrl-g.
Toggle a bookmark for the current line, or if set: jump to a bookmark on a different line.ctrl-w - Format the current file (see the table below), or cycle git rebase keywords. For Markdown, format the table under the cursor.ctrl-g - Jump to definition, for some programming languages (experimental feature), jump to an include, jump back or toggle the status bar.ctrl-\ - Comment in or out a block of code.ctrl-~ - Insert the current date and time.esc - Redraw everything and clear the last search.ctrl-space to build or export the current file.ctrl-w to format the current file, in an opinionated way. If the current file is empty, a "Hello, World!" template will be inserted, for some file extensions.$(o -l), to get more details. o -l can be used to preview the command.| Programming language | File extensions | Jump to error | Build command | Format command |
|---|---|---|---|---|
| Ada | .adb, .gpr, .ads, .ada |
WIP | WIP | WIP |
| Agda | .agda |
Yes | agda -c $filename |
N/A |
| ALGOL 68 | .a68 |
WIP | a68g --compile $filename |
WIP |
| Assembly | .asm, .s, .S, .inc |
Yes | yasm -f elf64 -o $output.o $filename |
N/A |
| C | .c, .h |
Yes | gcc $filename -o $output |
clang-format -i --style=WebKit $filename |
| C++ | .cpp, .cc, .cxx, .h, .hpp, .h++, .c++ |
Yes | g++ $filename -o $output |
clang-format -i --style=WebKit $filename |
| C# | .cs |
Yes | dotnet build $filename |
astyle --mode=cs $filename |
| C3 | .c3 |
Yes | c3c compile -o $output $filename |
c3fmt --rewrite $filename |
| Clojure | .clj, .cljs, .clojure |
WIP | lein compile $filename |
WIP |
| Crystal | .cr |
Yes | crystal build $filename --release |
crystal tool format $filename |
| CSS | .css |
WIP | No | prettier --tab-width 2 -w $filename |
| D | .d |
Yes | dmd $filename -of$output |
WIP |
| Dart | .dart |
Yes | dart compile exe --output $output $filename |
dart format $filename |
| Erlang | .erl |
Yes | erlc $filename |
WIP |
| Fortran77, Fortran90 | .f, .f90 |
Yes | gfortran -o $output $filename |
WIP |
| Garnet | .gt |
WIP | garnetc -o $output $filename |
WIP |
| GLSL | .glsl, .vert, .frag |
WIP | glslangValidator -V -o $output $filename |
WIP |
| Go | .go |
Yes | go build $filename |
goimports -w $filename |
| Hare | .ha |
Yes | hare build $filename |
N/A |
| Haskell | .hs |
Yes | ghc -dynamic $filename |
brittany --write-mode=inplace $filename |
| HTML | .html |
WIP | No | tidy -m $filename |
| Ivy | .ivy |
WIP | WIP | N/A |
| Java | .java |
Yes | javac + jar, see details below |
google-java-format -a -i $filename |
| JavaScript | .js |
WIP | No | prettier --tab-width 4 -w $filename |
| Jakt | .jakt |
WIP | jakt $filename |
WIP |
| Just | justfile, .justfile |
No | No | just --unstable --fmt -f $filename |
| Kotlin | .kt, .kts |
Yes | kotlinc $filename -include-runtime -d $output.jar |
ktlint -F $filename |
| Kotlin Native | .kt, .kts |
Yes | kotlinc-native -nowarn -opt -Xallocator=mimalloc -produce program -linker-option --as-needed $filename -o $output |
ktlint -F $filename |
| Lua | .lua |
Yes | luac -o $output.luac $filename |
lua-format -i --no-keep-simple-function-one-line --column-limit=120 --indent-width=2 --no-use-tab $filename |
| Markdown | .md |
WIP | No | prettier --write $filename |
| Nim | .nim |
WIP | nim c -o:$output $filename |
WIP |
| Objective-C | .m |
Yes | clang $filename -o $output |
clang-format -i --style=WebKit $filename |
| Odin | .odin |
Yes | odin build $filename |
N/A |
| Objective Pascal | .pas, .pp, .lpr |
Yes | fpc $filename |
WIP |
| OCaml | .ml |
WIP | No | ocamlformat $filename |
| Perl | .pl |
Yes | perl $filename |
/usr/bin/vendor_perl/perltidy -se -b -i=2 -ole=unix -bt=2 -pt=2 -sbt=2 -ce $filename |
| Python | .py |
Yes | python -m py_compile $filename |
black $filename |
| Ruby | .rb |
No | No | rubocop -A $filename |
| Rust (with Cargo.toml) | .rs |
Yes | cargo build |
rustfmt $filename |
| Rust | .rs |
Yes | rustc $filename |
rustfmt $filename |
| Scala | .scala |
Yes | scalac $filename && jar cfe $output MainClass *.class |
scalafmt $filename |
| Shell | .sh, PKGBUILD, APKBUILD |
WIP | makepkg |
shfmt -s -w -i 2 -bn -ci -sr -kp $filename |
| Standard ML | .sml, .fun, .mlb, .cm |
Yes | mlton $filename |
WIP |
| Swift | .swift |
WIP | WIP | WIP |
| TypeScript | .ts |
WIP | No | prettier --tab-width 4 -w $filename |
| V | .v |
Yes | v build $filename |
v fmt $filename |
| XML | .xml |
WIP | No | tidy -w 80 -q -i -utf8 --show-errors 0 --show-warnings no --tidy-mark no -xml -m $filename |
| Zig | .zig |
Yes | zig build-exe $filename |
zig fmt $filename |
/etc/fstab, JSON and HTML files are also supported, and can be formatted with ctrl-w.
o will try to jump to the location where the error is and otherwise display Success.ctrl-w will word wrap the lines to a length of 99.kotlinc-native is not available, this build command will be used instead: kotlinc $filename -include-runtime -d $name.jarCXX can be downloaded here: GitHub project page for CXX.
| File type | File extensions | Build or export command |
|---|---|---|
| AsciiDoc | .adoc |
asciidoctor -b manpage (writes to out.1) |
| scdoc | .scd, .scdoc |
scdoc (writes to out.1) |
| Markdown | .md |
pandoc -N --toc -V geometry:a4paper (writes to $filename.pdf) |
This is a brand new feature and needs more testing.
gdb is installed, it's possible to select "Debug mode" from the ctrl-o menu and then build and step through a program with ctrl-space, or set a breakpoint with ctrl-b and continue with ctrl-space.While in the Markdown table editor:
tab can be used to go to the next cell, or insert new cells if the last cell is reached.return can be used to either jump to the blank cell below or to insert a new row below.backspace can be used to delete letters, but also for deleting the current row if it is empty.ctrl-n can be used to insert a new column to the right.ctrl-d can be used to delete the current column (if all cells in the column are empty).esc or ctrl-t can be used to close the Markdown table editor.ctrl-s can be used to save.Themes can be selected with the ctrl-o menu. The theme menu also lists the theme names, which can be specified in the O_THEME environment variable.
The O_THEME environment variable is an exception to the claim that o is configuration-free, but it is completely optional.
For using ie. the Synthwave theme, the /usr/bin/sw symlink to /usr/bin/o can be used, or this can be added to ~/.profile:
export O_THEME=synthwave
æ, just press ctrl-_ and type in ae. To insert µ, type in My.git clone https://github.com/xyproto/orbiton
cd orbiton
make && sudo make install
And optionally:
make gui && sudo make gui-install
It is also possible to install the symlinks that are suggested further down in this document.
Install dependencies (use doas if needed):
add_pkg git gmake go vte3
Build both the editor o and the GUI frontend og:
gmake CXX="clang++ -w" o og
Install both executables, a man page, an icon and a desktop shortcut file (use doas if needed`):
PREFIX=/usr/local gmake install og-install
Just building and installing o also works:
gmake
doas gmake install
It is also possible to install the symlinks that are suggested further down in this document.
C++
ctrl-space, cxx must be installed.ctrl-w, clang-format must be installed.Go
ctrl-space, The go compiler must be installed.ctrl-w, goimports must be installed.Zig
zig command is needed.V
v command is needed.Rust
ctrl-space, Cargo.toml must exist and cargo must be installed.ctrl-w, rustfmt must be installed.Haskell
ctrl-space, the ghc compiler must be installed.ctrl-w, brittany must be installed.Python
ctrl-space only checks the syntax, without executing. This only requires python to be available.ctrl-w, black must be installed.Crystal
crystal command is needed.Kotlin
ctrl-space, kotlinc must be installed. A .jar file is created if the compilation succeeded.ctrl-w, ktlint must be installed.Java
ctrl-space, javac and jar must be installed. A .jar file is created if the compilation succeeded.ctrl-w, google-java-format must be installed.Scala
ctrl-space, scalac and jar must be installed. A .jar file is created if the compilation succeeded.java -jar main.jar. Use scalac -d main.jar MyFile.scala if you want to produce a jar that can be executed with scala main.jar.ctrl-w, scalafmt must be installed.D
ctrl-space, gdc must be available.JSON
fstab
fstab files (usually /etc/fstab) is a built-in feature. Just press ctrl-w. If you need a standalone utility, fstabfmt is available.JavaScript
prettier must be installed.Since kotlinc $filename -include-runtime -d builds to a .jar, I though I should do the same for Java. The idea is to easily compile a single or a small collection of .java files, where one of the files has a main function.
If you know about an easier way to build a .jar file from *.java, without using something like gradle, please let me know by submitting a pull request. This is pretty verbose...
javaFiles=$(find . -type f -name '*.java')
for f in $javaFiles; do
grep -q 'static void main' "$f" && mainJavaFile="$f"
done
className=$(grep -oP '(?<=class )[A-Z]+[a-z,A-Z,0-9]*' "$mainJavaFile" | head -1)
packageName=$(grep -oP '(?<=package )[a-z,A-Z,0-9,.]*' "$mainJavaFile" | head -1)
if [[ $packageName != "" ]]; then
packageName="$packageName."
fi
mkdir -p _o_build/META-INF
javac -d _o_build $javaFiles
cd _o_build
echo "Main-Class: $packageName$className" > META-INF/MANIFEST.MF
classFiles=$(find . -type f -name '*.class')
jar cmf META-INF/MANIFEST.MF ../main.jar $classFiles
cd ..
rm -rf _o_build
For Scala, this is the code that is used to produce a main.jar file that can be run directly with java -jar main.jar:
#!/bin/sh
scalaFiles=$(find . -type f -name '*.scala')
for f in $scalaFiles; do
grep -q 'def main' "$f" && mainScalaFile="$f"
grep -q ' extends App ' "$f" && mainScalaFile="$f"
done
objectName=$(grep -oP '(?<=object )[A-Z]+[a-z,A-Z,0-9]*' "$mainScalaFile" | head -1);
packageName=$(grep -oP '(?<=package )[a-z,A-Z,0-9,.]*' "$mainScalaFile" | head -1);
if [[ $packageName != "" ]]; then
packageName="$packageName."
fi
mkdir -p _o_build/META-INF
scalac -d _o_build $scalaFiles
cd _o_build
echo -e "Main-Class: $packageName$objectName\nClass-Path: /usr/share/scala/lib/scala-library.jar" > META-INF/MANIFEST.MF
classFiles=$(find . -type f -name '*.class')
jar cmf META-INF/MANIFEST.MF ../main.jar $classFiles
cd ..
rm -rf _o_build
/usr/share/scala/lib/scala-library.jar is not found scalac -d run_with_scala.jar is used instead.scala-library.jar was not found, then the resulting jar file will need scala to run.ctrl-t brings up a menu with a selection of special symbols.
There are also these shortcuts:
⊤ by pressing ctrl-t and then t.ℕ by pressing ctrl-t and then n.When editing PKGBUILD files, it is possible to press ctrl-o and select Call Guessica to update the pkgver= and source= fields, by a combination of guesswork and online searching. This functionality depends on the Guessica package update utility being installed, and will only work for some PKGBUILD files.
a68g - for compiling ALGOL 68 codeagda - for compiling Agda codeasciidoctor - for writing man pagesastyle - for formatting C# codeblack - for formatting Python codebrittany - for formatting Haskell codecargo - for compiling Rustclang - for formatting C++ code with clang-formatclojure - for compiling Clojurecrystal - for compiling Crystalcxx - for compiling C++fpc - for compiling Object Pascalg++ - for compiling C++ codegdc - for compiling D codeghc - for compiling Haskell codego - for compiling Go codego-tools - for formatting Go code and handling imports with goimportsgoogle-java-format - for formatting Java codejad - decompile .class files on the fly when opening them with ojava-environment - for compiling Java code and creating .jar files with javac and jarkotlin - for compiling Kotlinktlint - for formatting Kotlin codelua - for compiling Lua to bytecodelua-format - for formatting Lua codemlton - for compiling Standard MLmono - for compiling C# codeocaml - for compiling and formatting OCaml codeodin - for compiling Odinpandoc - for exporting Markdown to PDFprettier - for formatting JavaScript, TypeScript and CSSpython - for compiling Python to bytecoderustc - for compiling Rustrustfmt - for formatting Rustscala - for compiling Scalasdoc - for writing man pagestidy - for formatting XMLv - for compiling and formatting V codezig - for compiling and formatting Zig codeo executable is 1.5M when built with GCC 12 (for 64-bit Linux) and compressed with upx.One way of building with gccgo and upx (in the v2 directory):
go build -mod=vendor -gccgoflags '-Os -s' -o o && upx --best --lzma o
If the o executable is built with go instead, the size can be 8.7M, or just 2.8M when packed with upx:
go build -mod=vendor -ldflags='-s -w' -trimpath -o o && upx --best --lzma o
These four ways of opening file.txt at line 7 are supported:
o file.txt 7o file.txt +7o file.txt:7o file.txt+7This also means that filenames containing + or :, and then followed by a number, are not supported.
-c, --copy FILENAME Copy the given file into the clipboard.
-p, --paste FILENAME Paste the contents of the clipboard into the given file.
Combine with -f to overwrite the file.
-f, --force Ignore file locks when opening files.
-l, --last-command Output the last used build/format/export command.
-e, --clear-locks Clear all file locks and close all portals.
-m, --monitor FILENAME Monitor the given file for changes, and open it as read-only.
-o, --ollama Use Ollama and "deepseek-coder-v2" or $OLLAMA_MODEL
to explain the function under the cursor.
-r, --release Build with release instead of debug mode whenever applicable.
-x, --noapprox Disable approximate filename matching.
-n, --no-cache Avoid writing the location history, search history, highscore,
compilation and format command to ~/.cache/o.
-d, --create-dir When opening a new file, create directories as needed.
-s, --digraphs List all possible digraphs.
-t, --list List the given file using the red/black theme and quit.
-b, --bat List the given file using bat, if it exists in the PATH.
This can be useful when used with together with -c or -p.
-i, --input-file FILENAME Used as stdin when running programs with ctrl-space.
The default filename is input.txt. Handy for Advent of Code.
-a, --nano Emulate Pico/Nano.
-q, --quick-help Always display the quick help pane at start.
-z, --no-quick-help Never display the quick help pane at start.
-g, --glob GLOB Search for and open the first filename that matches the substring.
-h, --help Display this usage information.
-v, --version Display the current version.
When loading files that are large or from a slow disk, an animated spinner will appear. The loading operation can be interrupted by pressing esc, q or ctrl-q.
This shell function works in zsh and bash and may be useful for both searching for and opening a file at the given line number (works best if there is only one matching file, if not it will open several files in succession):
fo() { find . -type f -wholename "*$1" -exec o {} $2 \;; }
If too many files are found, it is possible to stop opening them by selecting Stop parent and quit without saving from the ctrl-o menu, which will quit the editor and also kill the parent find process.
Example use:
fo somefile.cpp 123
It is also possible to run a case-insensitive file search and open up the first match with, where "omfile" is a case-insensitive substring of the found filename:
o omefile
When using pandoc to export from Markdown to PDF:
PAPERSIZE environment variable is set to ie. a4 or letter, it will be respected when exporting from Markdown to PDF using pandoc, at the press of ctrl-space.--pdf-engine=xelatex and --listings flags are used, so xelatex and the listings package needs to be available. A standard installation of LaTeX and Pandoc should provide both.Render to PDF with pandoc will only appear on the ctrl-o menu when editing a Markdown file and pandoc is installed.ctrl-o menu to start a silly little game about feeding creatures with pellets before they are eaten. Alternatively, create a symlink for starting it directly, ie.: ln -sf /usr/bin/o /usr/bin/feedgame.right, down, left or left, down, right in rapid succession followed by either down to save or up to save and quit. The only purpose of this unusual shortcut is to help avoid the painful Emacs pinky.o - for terminal emulators that supports at least VT100og - for the VTE GUI (optional)# For starting o with the Light theme
ln -sf /usr/bin/o /usr/bin/li
# For starting o with the Red/Black theme
ln -sf /usr/bin/o /usr/bin/redblack
# For starting o with the Synthwave theme
ln -sf /usr/bin/o /usr/bin/sw
# For starting o with the Blue Edit theme
ln -sf /usr/bin/o /usr/bin/edi
# For starting o with the Light VS theme
ln -sf /usr/bin/o /usr/bin/vs
# For starting the GUI version of o with the Light theme
ln -sf /usr/bin/og /usr/bin/lig
# For starting the GUI version of o with the Red/Black theme
ln -sf /usr/bin/og /usr/bin/redblackg
# For starting the GUI version of o with the Synthwave theme
ln -sf /usr/bin/og /usr/bin/swg
# For starting the GUI version of o with the Blue Edit theme
ln -sf /usr/bin/og /usr/bin/edg
# For starting the GUI version of o with the Light VS theme
ln -sf /usr/bin/og /usr/bin/vg
ogBuild:
make gui
Install (use sudo or doas, if needed):
make gui-install
ctrl-f to search, and then type in t and press return to search for the next typo.ctrl-a to (temporarily) add it to the dictionary or ctrl-i to (temporarily) ignore it.o is launched by a symlink or executable named nan or nano), ctrl-t searches for the next typo.The built-in spellchecker uses a list of words from this project that is licensed under this MIT license:
MIT License, Copyright (c) Sindre Sorhus <[email protected]> (sindresorhus.com)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Flow control option in the profile settings, to ensure that ctrl-s will never freeze the terminal.