# A Neovim-style editor without modes, with mouse and gestures

> Want Neovim's terminal speed and IDE features without Normal and Insert mode? Options for modeless editing, and how Skink maps Vim habits to mouse and keys.

Source: https://skink.cc/articles/modeless-editor-for-vim-users/

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?

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:

```lua
-- init.lua: a few desktop-style keys in Insert mode
vim.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 selection
vim.opt.selectmode = "mouse,key"       -- typing replaces the selection
```

This 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

- 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

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](https://skink.cc/editing/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

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:

```json
{
  "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

This is where a modeless design pays off: the mouse never fights a mode.

### 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

- **Tabs:** click to switch, middle-click or the `x` to 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:line` to open it.

All of it works over SSH and inside tmux (with `set -g mouse on`). See [mouse and trackpad](https://skink.cc/editing/mouse-and-trackpad/).

## 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, `script` and `style` in 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.

**Caution:**
What you do not get yet: plugins or scripting, soft wrap, and Neovim's maturity. Skink is alpha. If any of those is a deal-breaker, stay on Neovim and use the mappings above.

## Try it

```sh
curl -fsSL https://skink.cc/install.sh | sh
skink .
```

Keep Neovim installed; nothing conflicts. Compare in detail: [Skink vs Neovim](https://skink.cc/compare/neovim/), [Skink vs Helix](https://skink.cc/compare/helix/).
