A Neovim-style editor without modes, with mouse and gestures
If you like Neovim for what surrounds the editing but not the modes, you have two choices. You can bend Neovim toward modeless editing with mappings, or you can use an editor that is modeless by design and ships the IDE features itself.
Skink is the second kind: no Normal mode, mouse and trackpad first, and LSP, tree-sitter, git, a terminal and AI agents built in. Like Neovim, it lives in the terminal, works over SSH and starts fast.
Can you make Neovim modeless?
Section titled “Can you make Neovim modeless?”Partly. Vim has an old “easy” mode (vim -y / evim) that keeps you in Insert mode and maps common shortcuts. In Neovim you can map desktop keys in Insert mode:
-- init.lua: a few desktop-style keys in Insert modevim.keymap.set("i", "<C-s>", "<Cmd>write<CR>")vim.keymap.set("i", "<C-z>", "<Cmd>undo<CR>")vim.keymap.set("i", "<C-q>", "<Cmd>quit<CR>")vim.opt.mouse = "a"vim.opt.keymodel = "startsel,stopsel" -- Shift+arrows start a selectionvim.opt.selectmode = "mouse,key" -- typing replaces the selectionThis gets you far, but plugins, help and documentation all assume Normal mode. You keep hitting places where Esc is expected. It is a workaround, not a different editor.
What “modeless” means in practice
Section titled “What “modeless” means in practice”- Every printable key types. Commands use Ctrl, Alt or function keys.
- Selection is Shift+movement or a mouse drag, and typing replaces it.
- There is never a state where you have to look at the screen to know what a key will do.
The trade-off is real: Vim’s operator + motion grammar (ci", dap, .) is more expressive than chorded shortcuts. Modeless editors close the gap with multiple cursors, syntax-aware selection and a command palette.
How Skink covers Vim habits
Section titled “How Skink covers Vim habits”Every key in the table also has a typed command: press Ctrl+E, type the name, press Enter. If you think in ex commands, that may feel more natural than chords. See typed commands.
| Vim habit | Skink key | Typed command |
|---|---|---|
ciw, viw |
Ctrl+D selects the word, then type | :addcursor |
vi(, vaf |
Alt+O grows the selection to the enclosing syntax node, Alt+I shrinks it | :expand / :contract |
* then cgn and . |
Ctrl+D repeatedly adds a cursor at each next match; Alt+X skips one | :addcursor / :skipcursor |
Visual block Ctrl-v |
Alt+Shift+↑ / ↓ adds cursors above / below | :cursorabove / :cursorbelow |
dd, yy, p |
Ctrl+X / Ctrl+C with no selection act on the line; Ctrl+V pastes | :cut / :copy / :paste |
ddp, :m |
Alt+↑ / ↓ move lines | :moveup / :movedown |
gcc |
Ctrl+/ or Alt+/ | :comment |
% |
Ctrl+] | :bracket |
qq … @q |
Ctrl+U to record, Ctrl+J to replay | :record / :replay |
za |
Alt+M folds by indentation | :fold |
Ctrl-o / Ctrl-i |
Alt+U / Alt+Shift+U | :back / :forward |
:cnext over diagnostics |
F6 / Shift+F6; Shift+F8 lists them | :nextproblem / :prevproblem, :problems |
:w, :q, :e, :vs |
Still work in the command line (Ctrl+E) | :w, :q, :e, :vs |
Rebind keys in bindings.json
Section titled “Rebind keys in bindings.json”Every action has a name you can bind in ~/.config/skink/bindings.json, in Micro’s format. There, a lowercase letter after Alt- means the plain key, so Alt-j is Alt+J:
{ "Alt-j": "MoveLinesDown", "Alt-k": "MoveLinesUp", "Ctrl-5": "JumpToMatchingBrace"}This example replaces the defaults for Alt+J (peek definition) and Alt+K (hover). Those stay reachable as :peek and :hover.
Mouse and gestures
Section titled “Mouse and gestures”This is where a modeless design pays off: the mouse never fights a mode.
In the text
Section titled “In the text”- Click to place the cursor, drag to select, Alt+click to add or remove a cursor.
- Wheel scrolls; Shift+wheel or a horizontal trackpad swipe scrolls long lines sideways, with line numbers staying put.
Around the text
Section titled “Around the text”- Tabs: click to switch, middle-click or the
xto close. - Splits: drag the divider or a pane’s title row to resize; click a pane to focus it.
- Gutter: click a git mark to peek at the change (stage, unstage or revert from there), click a fold mark to open it.
- Sticky scroll headers: click one to jump to that block.
- Merge conflicts: click “Accept ours | theirs | both” above the block.
- Terminal tabs: programs inside get the mouse too; Ctrl+click a
file:lineto open it.
All of it works over SSH and inside tmux (with set -g mouse on). See mouse and trackpad.
The IDE parts you would otherwise install
Section titled “The IDE parts you would otherwise install”- LSP for Rust, TS/JS, Python, Go, Dart and Zig, started on first use: completion, hover, definition, references, code actions, rename, format, inlay hints.
- tree-sitter colours for 19 languages, with injections (code in Markdown fences,
scriptandstylein HTML). - Fuzzy quick open (Alt+P, or
:recent) and project search (Alt+S) that respect.gitignore. - Git: gutter, hunks, blame, panel, diff, conflicts.
- Terminal tabs and a bottom dock (Alt+T).
- AI agents over ACP: Claude Code, Gemini CLI, Codex and more.
- A debugger (DAP) for gdb, lldb, debugpy and Delve.
Try it
Section titled “Try it”curl -fsSL https://skink.cc/install.sh | shskink .Keep Neovim installed; nothing conflicts. Compare in detail: Skink vs Neovim, Skink vs Helix.