Snappy and configuration-free text editor/IDE for the terminal. Suitable for writing git commit messages, editing Markdown, config files, source code, man pages and for quick edit-format-compile cycles when programming. Has syntax highlighting, jump-to-error, rainbow parentheses, macros, cut/paste portals, LSP support and a simple gdb+dlv frontend.
700
stars
6,413
commits
Go
primary language
Sep 10, 2026
updated
![]()
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 (osudo) and has built-in support for neatly formatting /etc/fstab files.ctrl-g to see the word count).This has been my main editor since early 2022, and it is mostly written in itself, apart from some NeoViM in the early beginning. I spent too much time configuring text editors, IDEs and plugins, so I could just as well create a new one. I wanted something simple, but capable. Hope you like it too!
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:

With Go 1.25 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.74.4/orbiton-2.74.4-linux_armv7_static.tar.xz' | tar JxC /tmp && sudo install -Dm755 /tmp/orbiton-2.74.4-linux_armv7_static/o /usr/bin/o && sudo install -Dm644 /tmp/orbiton-2.74.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.+ and are removed.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, or open or close a portal. Toggle wrap when typing for prose with ctrl-r pressed twice. When a portal is open, copy lines across files (or within the same file) with ctrl-v.ctrl-space or ctrl-b 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-n to jump to the next one.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-b.o main.c, pressing ctrl-w and then a double ctrl-b..png, .jpg, .jpeg, .gif, .ico and .bmp 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./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. (Requires a terminal emulator that supports unicode to be able to display unicode runes, though).\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).o filename.md, press ctrl-b twice and quit with ctrl-q.ctrl-t or ctrl-space 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.o -b).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.There are pretty few hotkeys to remember:
ctrl-s - Save.ctrl-q - Quit.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.
Toggle the Markdown checkbox on the current line when in book mode.
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. Double press to cut a block of text (to the next blank line). Press thrice to cut the current function.ctrl-c - Copy one line. Double press to copy a block of text. Press thrice to copy the current function.ctrl-v - Paste one trimmed line. Double press to paste multiple untrimmed lines.ctrl-b - Build program, render to PDF or export to man page. Double press to also run.
Cycle book mode. Toggle a breakpoint in debug mode.
Toggle bold (**) when started directly in book mode.ctrl-space - Build program, render to PDF or export to man page. Double press to also run.
Toggle checkboxes in Markdown. Cycle display/export mode in book mode.ctrl-j - Join the current line with the next one.ctrl-u - Undo (ctrl-z is also possible, but may background the application).ctrl-y - Redo.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-i - Toggle italic (*) in book mode. Terminals that can not display italics, like the Linux console, show it unstyled.ctrl-w - Format the current file (see the table below), or cycle git rebase keywords. For Markdown, format the table under the cursor.
Toggle paragraph indent in book mode.F1 - Show the overview of hotkeys (same as ctrl-l and then /).F2 - Save (same as ctrl-s).F3 - Go to the next search match (same as ctrl-n).F4 - Launch the file browser, which is also available from the ctrl-o menu.F5 - Build or export (same as ctrl-space). In debug mode: continue.F6 - Toggle block editing mode, which is also available from the ctrl-o menu.F7 - Jump to the next typo.F8 - In debug mode: step over (same as F10, which some terminals take for themselves).F9 - In debug mode: toggle a breakpoint (same as ctrl-b).F10 - In debug mode: step over (same as ctrl-o).F11 - In debug mode: step out (same as ctrl-f).F12 - Go to a definition or include (same as ctrl-g).On macOS, the function keys may need to be held together with Fn, depending on the keyboard settings.
ctrl-g - Go to include or definition, go back or toggle the status bar.ctrl-r - Jump to matching bracket, otherwise open or close a portal. Double press to toggle "wrap when typing".
For git interactive rebase, cycle keywords.ctrl-\ - Comment in or out a block of code, or reflow the current paragraph when editing prose.ctrl-~ - Insert the current date and time.esc - Go back after having gone to another location or file. Redraw everything and clear the last search.










ctrl-b 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 |
|---|---|---|---|---|
| ABC Music | .abc | WIP | abc2midi $filename | N/A |
| 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, .mac | Yes | yasm -f elf64 -o $output.o $filename | N/A |
| C | .c | Yes | gcc $filename -o $output | clang-format -fallback-style=WebKit -style=file -i -- $filename |
| C++ | .cpp, .cc, .cxx, .h, .hpp, .h++, .c++ | Yes | g++ $filename -o $output | clang-format -fallback-style=WebKit -style=file -i -- $filename |
| C# | .cs | Yes | csc $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 |
| COBOL | .cb, .cbl, .cob, .cby, .cobol | WIP | cobc -x -o $output $filename | N/A |
| 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 | WIP | glslangValidator -V -o $output $filename | WIP |
| Gleam | .gleam | Yes | gleam build | gleam format $filename |
| Go | .go | Yes | go build $filename | goimports -w $filename |
| Hare | .ha | Yes | hare build $filename | N/A |
| Haskell | .hs, .hts, .cabal | Yes | ghc -dynamic $filename | ormolu --mode=inplace $filename |
| HTML | .htm, .html | WIP | No | tidy -m $filename |
| Inko | .inko | WIP | inko build $filename | N/A |
| Ivy | .ivy | WIP | WIP | N/A |
| Java | .java | Yes | javac + jar, see details below | google-java-format -a -i $filename |
| JavaScript | .js, .jsx | WIP | No | prettier --tab-width 4 -w $filename |
| Jakt | .jakt | WIP | jakt $filename | WIP |
| Just | justfile, .just, .justfile | No | No | just --unstable --fmt -f $filename |
| Koka | .kk | WIP | koka -o $output $filename | N/A |
| 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 |
| Lilypond | .ly | WIP | lilypond -o $output $filename (exports to PDF) | N/A |
| Lua | .lua | Yes | luac -o $output.luac $filename | stylua $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 -fallback-style=WebKit -style=file -i -- $filename |
| Odin | .odin | Yes | odin build $filename | odinfmt -w $filename |
| Objective Pascal | .pas, .pp, .lpr | Yes | fpc $filename | WIP |
| OCaml | .ml | WIP | No | ocamlformat $filename |
| Perl | .pl, .perl | Yes | perl $filename | /usr/bin/vendor_perl/perltidy -se -b -i=2 -ole=unix -bt=2 -pt=2 -sbt=2 -ce $filename |
| PHP | .php, .php3, .php4, .php5, .phtml | WIP | No | php-cs-fixer fix $filename |
| Python | .py | Yes | python -m py_compile $filename | ruff format $filename |
| Ruby | .rb | No | ruby -c $filename | rubocop --autocorrect $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 |
| Scheme | .scm, .rkt, .ss, .sch, .sld, .sls | WIP | guile -s $filename | N/A |
| Shell | .sh, PKGBUILD, APKBUILD | WIP | makepkg | shfmt -s -w -i 2 -bn -ci -sr -kp $filename |
| Standard ML | .sml, .fun, .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, .zir | 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 reflow the text to a length of 99.kotlinc-native is not available, this build command will be used instead: kotlinc $filename -include-runtime -d $name.jar| File type | File extensions | Build or export command |
|---|---|---|
| AsciiDoc | .adoc | asciidoctor -b manpage (writes to out.1) |
| Lilypond | .ly | lilypond -o $output $filename (writes to $output.pdf) |
| 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-b, or set a breakpoint with ctrl-b and continue with ctrl-b.There is Tab-completion support for Go (gopls), Rust (rust-analyzer), C and C++ (clangd), Python (pyright-langserver or pylsp), Zig (zls), Odin (ols), Haskell (haskell-language-server-wrapper), Gleam (gleam lsp), Lua (lua-language-server), Ruby (ruby-lsp) and Bash (bash-language-server).
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
It is also possibly to specify any base16 theme, like ie. this:
export O_THEME=/usr/share/base16/monokai.yaml
æ, 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-b, gcc must be installed.ctrl-w, clang-format must be installed.clangd must be installed.C++
ctrl-b, gcc/clang/cmake/make/ninja should be installed.ctrl-w, clang-format must be installed.clangd must be installed.Go
ctrl-b, The go compiler must be installed.ctrl-w, goimports must be installed.gopls must be installed.Zig
zig command is needed.zls must be installed.V
v command is needed.Odin
ctrl-b, odin must be installed.ctrl-w, odinfmt must be installed.ols must be installed.Gleam
ctrl-b, gleam must be installed.gleam lsp is used.Lua
ctrl-b, luac must be installed.ctrl-w, stylua must be installed.lua-language-server must be installed.Ruby
ctrl-w, rubocop must be installed.ruby-lsp must be installed.Bash
bash-language-server must be installed.Rust
ctrl-b, Cargo.toml must exist and cargo must be installed.ctrl-w, rustfmt must be installed.rust-analyzer must be installed.Haskell
ctrl-b, the ghc compiler must be installed.ctrl-w, ormolu must be installed.haskell-language-server-wrapper must be installed.Python
ctrl-b only checks the syntax, without executing. This only requires python to be available.ctrl-w, ruff must be installed.pyright-langserver or pylsp must be installed.Crystal
crystal command is needed.Kotlin
ctrl-b, kotlinc must be installed. A .jar file is created if the compilation succeeded.ctrl-w, ktlint must be installed.Java
ctrl-b, 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-b, 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-b, 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.ctrl-g in the filebrowser, lazygit is needed.ctrl-t in the filebrowser, tig is needed.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# codebash-language-server - for tab completion for Bashcargo - for compiling Rustclang - for formatting C++ code with clang-formatclangd - for tab completion for C and C++clojure - for compiling Clojurecrystal - for compiling Crystalfpc - for compiling Object Pascalg++ - for compiling C++ codegdc - for compiling D codeghc - for compiling Haskell codegleam - for compiling Gleam code and for tab completiongo - for compiling Go codego-tools - for formatting Go code and handling imports with goimportsgoogle-java-format - for formatting Java codegopls - for tab completion for Gohaskell-language-server-wrapper - for tab completion for Haskelljad - 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-language-server - for tab completion for Luamlton - for compiling Standard MLmono - for compiling C# codeocaml - for compiling and formatting OCaml codeodin - for compiling Odinodinfmt - for formatting Odin codeols - for tab completion for Odinormolu - for formatting Haskell codepandoc - for exporting Markdown to PDFphp-cs-fixer - for formatting PHP codeprettier - for formatting JavaScript, TypeScript and CSSpyright-langserver - for tab completion for Python (or pylsp)python - for compiling Python to bytecoderuby-lsp - for tab completion for Rubyrust-analyzer - for tab completion for Rustrustc - for compiling Rustruff - for formatting Python coderustfmt - for formatting Rustscala - for compiling Scalasdoc - for writing man pagesstylua - for formatting Lua codetidy - for formatting XMLv - for compiling and formatting V codezig - for compiling and formatting Zig codezls - for tab completion for Zigo 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 to explain the function under the cursor.
-B, --book Open in best available book mode (graphical if supported, text otherwise).
-T, --book-mode-text Open in text book mode: soft wrap, plain text, word count.
-G, --book-mode-graphical Open in graphical book mode (requires Kitty, iTerm2 or Sixel support).
-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, --debug Start the editor in debug mode.
-k, --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.
-i, --input-file FILENAME Piped to stdin when running programs with ctrl-b.
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 string.
-h, --help Display this usage information.
-y, --esc Just pressing Esc will exit the program.
-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-b.--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 VS theme
ln -sf /usr/bin/o /usr/bin/vs
# For behaving exactly like "visudo" but using Orbiton instead
ln -sf /usr/bin/o /usr/bin/osudo
# For building C, C++, Go etc. projects, by trying to auto-detect everything
ln -sf /usr/bin/o /usr/bin/obuild
# For being a pico/nano replacement (or use just `nan` to avoid conflict with `nano`)
ln -sf /usr/bin/o /usr/bin/nano
# For starting the GUI version of o with the Light theme
ln -sf /usr/bin/og /usr/bin/lig
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 <sindresorhus@gmail.com> (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.Go
90.8%
Starlark
4.2%
C++
1.6%
Snappy and configuration-free text editor/IDE for the terminal. Suitable for writing git commit messages, editing Markdown, config files, source code, man pages and for quick edit-format-compile cycles when programming. Has syntax highlighting, jump-to-error, rainbow parentheses, macros, cut/paste portals, LSP support and a simple gdb+dlv frontend.
700
stars
6,413
commits
Go
primary language
Sep 10, 2026
updated
![]()
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 (osudo) and has built-in support for neatly formatting /etc/fstab files.ctrl-g to see the word count).This has been my main editor since early 2022, and it is mostly written in itself, apart from some NeoViM in the early beginning. I spent too much time configuring text editors, IDEs and plugins, so I could just as well create a new one. I wanted something simple, but capable. Hope you like it too!
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:

With Go 1.25 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.74.4/orbiton-2.74.4-linux_armv7_static.tar.xz' | tar JxC /tmp && sudo install -Dm755 /tmp/orbiton-2.74.4-linux_armv7_static/o /usr/bin/o && sudo install -Dm644 /tmp/orbiton-2.74.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.+ and are removed.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, or open or close a portal. Toggle wrap when typing for prose with ctrl-r pressed twice. When a portal is open, copy lines across files (or within the same file) with ctrl-v.ctrl-space or ctrl-b 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-n to jump to the next one.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-b.o main.c, pressing ctrl-w and then a double ctrl-b..png, .jpg, .jpeg, .gif, .ico and .bmp 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./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. (Requires a terminal emulator that supports unicode to be able to display unicode runes, though).\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).o filename.md, press ctrl-b twice and quit with ctrl-q.ctrl-t or ctrl-space 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.o -b).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.There are pretty few hotkeys to remember:
ctrl-s - Save.ctrl-q - Quit.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.
Toggle the Markdown checkbox on the current line when in book mode.
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. Double press to cut a block of text (to the next blank line). Press thrice to cut the current function.ctrl-c - Copy one line. Double press to copy a block of text. Press thrice to copy the current function.ctrl-v - Paste one trimmed line. Double press to paste multiple untrimmed lines.ctrl-b - Build program, render to PDF or export to man page. Double press to also run.
Cycle book mode. Toggle a breakpoint in debug mode.
Toggle bold (**) when started directly in book mode.ctrl-space - Build program, render to PDF or export to man page. Double press to also run.
Toggle checkboxes in Markdown. Cycle display/export mode in book mode.ctrl-j - Join the current line with the next one.ctrl-u - Undo (ctrl-z is also possible, but may background the application).ctrl-y - Redo.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-i - Toggle italic (*) in book mode. Terminals that can not display italics, like the Linux console, show it unstyled.ctrl-w - Format the current file (see the table below), or cycle git rebase keywords. For Markdown, format the table under the cursor.
Toggle paragraph indent in book mode.F1 - Show the overview of hotkeys (same as ctrl-l and then /).F2 - Save (same as ctrl-s).F3 - Go to the next search match (same as ctrl-n).F4 - Launch the file browser, which is also available from the ctrl-o menu.F5 - Build or export (same as ctrl-space). In debug mode: continue.F6 - Toggle block editing mode, which is also available from the ctrl-o menu.F7 - Jump to the next typo.F8 - In debug mode: step over (same as F10, which some terminals take for themselves).F9 - In debug mode: toggle a breakpoint (same as ctrl-b).F10 - In debug mode: step over (same as ctrl-o).F11 - In debug mode: step out (same as ctrl-f).F12 - Go to a definition or include (same as ctrl-g).On macOS, the function keys may need to be held together with Fn, depending on the keyboard settings.
ctrl-g - Go to include or definition, go back or toggle the status bar.ctrl-r - Jump to matching bracket, otherwise open or close a portal. Double press to toggle "wrap when typing".
For git interactive rebase, cycle keywords.ctrl-\ - Comment in or out a block of code, or reflow the current paragraph when editing prose.ctrl-~ - Insert the current date and time.esc - Go back after having gone to another location or file. Redraw everything and clear the last search.










ctrl-b 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 |
|---|---|---|---|---|
| ABC Music | .abc | WIP | abc2midi $filename | N/A |
| 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, .mac | Yes | yasm -f elf64 -o $output.o $filename | N/A |
| C | .c | Yes | gcc $filename -o $output | clang-format -fallback-style=WebKit -style=file -i -- $filename |
| C++ | .cpp, .cc, .cxx, .h, .hpp, .h++, .c++ | Yes | g++ $filename -o $output | clang-format -fallback-style=WebKit -style=file -i -- $filename |
| C# | .cs | Yes | csc $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 |
| COBOL | .cb, .cbl, .cob, .cby, .cobol | WIP | cobc -x -o $output $filename | N/A |
| 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 | WIP | glslangValidator -V -o $output $filename | WIP |
| Gleam | .gleam | Yes | gleam build | gleam format $filename |
| Go | .go | Yes | go build $filename | goimports -w $filename |
| Hare | .ha | Yes | hare build $filename | N/A |
| Haskell | .hs, .hts, .cabal | Yes | ghc -dynamic $filename | ormolu --mode=inplace $filename |
| HTML | .htm, .html | WIP | No | tidy -m $filename |
| Inko | .inko | WIP | inko build $filename | N/A |
| Ivy | .ivy | WIP | WIP | N/A |
| Java | .java | Yes | javac + jar, see details below | google-java-format -a -i $filename |
| JavaScript | .js, .jsx | WIP | No | prettier --tab-width 4 -w $filename |
| Jakt | .jakt | WIP | jakt $filename | WIP |
| Just | justfile, .just, .justfile | No | No | just --unstable --fmt -f $filename |
| Koka | .kk | WIP | koka -o $output $filename | N/A |
| 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 |
| Lilypond | .ly | WIP | lilypond -o $output $filename (exports to PDF) | N/A |
| Lua | .lua | Yes | luac -o $output.luac $filename | stylua $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 -fallback-style=WebKit -style=file -i -- $filename |
| Odin | .odin | Yes | odin build $filename | odinfmt -w $filename |
| Objective Pascal | .pas, .pp, .lpr | Yes | fpc $filename | WIP |
| OCaml | .ml | WIP | No | ocamlformat $filename |
| Perl | .pl, .perl | Yes | perl $filename | /usr/bin/vendor_perl/perltidy -se -b -i=2 -ole=unix -bt=2 -pt=2 -sbt=2 -ce $filename |
| PHP | .php, .php3, .php4, .php5, .phtml | WIP | No | php-cs-fixer fix $filename |
| Python | .py | Yes | python -m py_compile $filename | ruff format $filename |
| Ruby | .rb | No | ruby -c $filename | rubocop --autocorrect $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 |
| Scheme | .scm, .rkt, .ss, .sch, .sld, .sls | WIP | guile -s $filename | N/A |
| Shell | .sh, PKGBUILD, APKBUILD | WIP | makepkg | shfmt -s -w -i 2 -bn -ci -sr -kp $filename |
| Standard ML | .sml, .fun, .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, .zir | 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 reflow the text to a length of 99.kotlinc-native is not available, this build command will be used instead: kotlinc $filename -include-runtime -d $name.jar| File type | File extensions | Build or export command |
|---|---|---|
| AsciiDoc | .adoc | asciidoctor -b manpage (writes to out.1) |
| Lilypond | .ly | lilypond -o $output $filename (writes to $output.pdf) |
| 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-b, or set a breakpoint with ctrl-b and continue with ctrl-b.There is Tab-completion support for Go (gopls), Rust (rust-analyzer), C and C++ (clangd), Python (pyright-langserver or pylsp), Zig (zls), Odin (ols), Haskell (haskell-language-server-wrapper), Gleam (gleam lsp), Lua (lua-language-server), Ruby (ruby-lsp) and Bash (bash-language-server).
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
It is also possibly to specify any base16 theme, like ie. this:
export O_THEME=/usr/share/base16/monokai.yaml
æ, 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-b, gcc must be installed.ctrl-w, clang-format must be installed.clangd must be installed.C++
ctrl-b, gcc/clang/cmake/make/ninja should be installed.ctrl-w, clang-format must be installed.clangd must be installed.Go
ctrl-b, The go compiler must be installed.ctrl-w, goimports must be installed.gopls must be installed.Zig
zig command is needed.zls must be installed.V
v command is needed.Odin
ctrl-b, odin must be installed.ctrl-w, odinfmt must be installed.ols must be installed.Gleam
ctrl-b, gleam must be installed.gleam lsp is used.Lua
ctrl-b, luac must be installed.ctrl-w, stylua must be installed.lua-language-server must be installed.Ruby
ctrl-w, rubocop must be installed.ruby-lsp must be installed.Bash
bash-language-server must be installed.Rust
ctrl-b, Cargo.toml must exist and cargo must be installed.ctrl-w, rustfmt must be installed.rust-analyzer must be installed.Haskell
ctrl-b, the ghc compiler must be installed.ctrl-w, ormolu must be installed.haskell-language-server-wrapper must be installed.Python
ctrl-b only checks the syntax, without executing. This only requires python to be available.ctrl-w, ruff must be installed.pyright-langserver or pylsp must be installed.Crystal
crystal command is needed.Kotlin
ctrl-b, kotlinc must be installed. A .jar file is created if the compilation succeeded.ctrl-w, ktlint must be installed.Java
ctrl-b, 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-b, 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-b, 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.ctrl-g in the filebrowser, lazygit is needed.ctrl-t in the filebrowser, tig is needed.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# codebash-language-server - for tab completion for Bashcargo - for compiling Rustclang - for formatting C++ code with clang-formatclangd - for tab completion for C and C++clojure - for compiling Clojurecrystal - for compiling Crystalfpc - for compiling Object Pascalg++ - for compiling C++ codegdc - for compiling D codeghc - for compiling Haskell codegleam - for compiling Gleam code and for tab completiongo - for compiling Go codego-tools - for formatting Go code and handling imports with goimportsgoogle-java-format - for formatting Java codegopls - for tab completion for Gohaskell-language-server-wrapper - for tab completion for Haskelljad - 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-language-server - for tab completion for Luamlton - for compiling Standard MLmono - for compiling C# codeocaml - for compiling and formatting OCaml codeodin - for compiling Odinodinfmt - for formatting Odin codeols - for tab completion for Odinormolu - for formatting Haskell codepandoc - for exporting Markdown to PDFphp-cs-fixer - for formatting PHP codeprettier - for formatting JavaScript, TypeScript and CSSpyright-langserver - for tab completion for Python (or pylsp)python - for compiling Python to bytecoderuby-lsp - for tab completion for Rubyrust-analyzer - for tab completion for Rustrustc - for compiling Rustruff - for formatting Python coderustfmt - for formatting Rustscala - for compiling Scalasdoc - for writing man pagesstylua - for formatting Lua codetidy - for formatting XMLv - for compiling and formatting V codezig - for compiling and formatting Zig codezls - for tab completion for Zigo 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 to explain the function under the cursor.
-B, --book Open in best available book mode (graphical if supported, text otherwise).
-T, --book-mode-text Open in text book mode: soft wrap, plain text, word count.
-G, --book-mode-graphical Open in graphical book mode (requires Kitty, iTerm2 or Sixel support).
-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, --debug Start the editor in debug mode.
-k, --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.
-i, --input-file FILENAME Piped to stdin when running programs with ctrl-b.
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 string.
-h, --help Display this usage information.
-y, --esc Just pressing Esc will exit the program.
-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-b.--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 VS theme
ln -sf /usr/bin/o /usr/bin/vs
# For behaving exactly like "visudo" but using Orbiton instead
ln -sf /usr/bin/o /usr/bin/osudo
# For building C, C++, Go etc. projects, by trying to auto-detect everything
ln -sf /usr/bin/o /usr/bin/obuild
# For being a pico/nano replacement (or use just `nan` to avoid conflict with `nano`)
ln -sf /usr/bin/o /usr/bin/nano
# For starting the GUI version of o with the Light theme
ln -sf /usr/bin/og /usr/bin/lig
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 <sindresorhus@gmail.com> (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.Go
90.8%
Starlark
4.2%
C++
1.6%