# Skink commands and actions

> Every command you can type on Skink's command line (Ctrl+E) and every bindable action, generated from the editor's source.

Source: https://skink.cc/reference/commands/

Press Ctrl+E to open the command line, type a command and press Enter. Tab completes names and paths, ↑ and ↓ walk the history. You type the command in plain text; Skink shows the `:` on the left for you. That is why these docs write commands as `:quit` or `:grep`: type `quit` or `grep`. F1 opens the same list as a searchable palette.

| Command | What it does |
|---|---|
| `:addroot DIR` | add another project root (tree, quick open, project search) |
| `:agent [MESSAGE | cancel | stop | send | errors]` | agent panel: chat with the configured ACP agent; send = selection or terminal output; errors = diagnostics or the last terminal command |
| `:agentdock` | show or hide the agent panel on the right (Alt-Shift-T) |
| `:agents [check]` | supported agents, which are installed, the active one; check = test it now |
| `:ai [TEXT]` | AI prompt box for the selection (Ctrl-G); /ask /search /implement /model inside |
| `:amend` | toggle amending the last commit in the message tab |
| `:back` | back to where you were before the last jump (Alt-U) |
| `:bindings` | open bindings.json (Micro format: key -> action); keys that replace a default or repeat show as problems |
| `:blame` | git blame of this file in a tab (Enter shows the commit) |
| `:both` | resolve the conflict under the cursor: keep both |
| `:branch NAME` | create branch NAME and switch to it |
| `:branches` | local branches; Enter switches |
| `:breakpoint [if COND|hits N|log MSG|clear|clearall|list]` | toggle a breakpoint on the cursor line (F9), or set a condition, hit count or logpoint |
| `:commit [MESSAGE...]` | commit with MESSAGE, or open a message tab (saving it commits) |
| `:conflicts` | open all git-conflicted files at the first conflict |
| `:cq` | leave without saving and exit 1 (git aborts the commit or rebase) |
| `:debug [NAME|stop|pause|continue|restart|panel|eval EXPR|watch EXPR]` | debug: pick a launch configuration (F5 reruns the last), control the session, evaluate |
| `:definition` | go to the definition of the symbol at the cursor |
| `:diff [HEAD|all]` | this file side by side against the index (or HEAD); `all`: `git diff` |
| `:extract var|fn [NAME]` | extract the selection into a variable or function (server action; tree-sitter fallback for var) |
| `:fetch [ARGS...]` | git fetch in a terminal tab |
| `:fold` | fold or unfold the block at the cursor (Alt-M) |
| `:foldall` | fold every top-level block |
| `:fontsize +1|-1|0` | change the terminal font size (EveryAI, Kitty; else use the terminal's keys) |
| `:format` | format the selection or the file with the language server |
| `:forward` | forward again after :back (Alt-Shift-U) |
| `:git ARGS...` | run git, output in a tab |
| `:gitstatus` | the git panel: status, stage, commit, branches, stash, push |
| `:goto LINE[:COL]` | jump to a line |
| `:grep [TEXT]` | search every file in the project (Alt-s); results stream into a tab, Enter jumps |
| `:greprep WITH` | replace the last project search's matches in every file, through the preview |
| `:help [topic]` | open this documentation in a tab (topics: tabs, editing, conflicts, settings, ...) |
| `:hidden` | show / hide dotfiles in the file tree (Alt-H) |
| `:hsplit [FILE]` | split the pane top and bottom, optionally opening FILE in the new pane (Alt-\) |
| `:hunk` | show the change at the cursor inline (s stage, u unstage, r revert) |
| `:implementation` | go to the implementations of the symbol at the cursor |
| `:inlineblame` | toggle the cursor line's blame |
| `:install NAME | owner/repo[/package][@tag] | DIR | .` | install a package (grammar, language server, theme, font); . = what this project needs |
| `:lsp [restart|log]` | language server status (memory, progress, log); restart it; full log |
| `:messages` | the last notes and errors in full (toasts are cut to one line) |
| `:mkdir [PATH]` | create a folder (parents too); relative to the project root |
| `:mode` | full editor or a lean file for another tool, and why |
| `:model [NAME | default]` | show or set the model for AI requests (until restart; settings: ai.model) |
| `:mv [NEW_PATH]` | move / rename the current file (relative to the project root); servers update imports |
| `:new [PATH]` | create a file (parents too) and open it; relative to the project root |
| `:nextconflict` | next merge conflict |
| `:nexthunk` | go to the next git change |
| `:only` | close every pane but the focused one |
| `:open [FILE[:LINE[:COL]]]` | open a file or folder in a tab (no argument: new empty tab) |
| `:ours` | resolve the conflict under the cursor: keep ours |
| `:packages [enable NAME | disable NAME]` | installed packages; turn one off or on without removing it |
| `:port PORT[:LOCAL]` | skink ssh: forward a port of this machine to yours (:port 3000, :port 3000:8080) |
| `:ports [stop PORT | forward PORT[:LOCAL]]` | skink ssh: ports listening on this machine and their forwards; stop one (:port adds one) |
| `:prevconflict` | previous merge conflict |
| `:prevhunk` | go to the previous git change |
| `:preview` | live preview of this Markdown or SVG file in a tab (Alt-V); again to go back |
| `:problems` | errors and warnings of the open files (Enter jumps) |
| `:pull [ARGS...]` | git pull in a terminal tab |
| `:push [ARGS...]` | git push in a terminal tab (credentials stay with git) |
| `:qa` | quit everything (refuses when tabs have unsaved changes) |
| `:quit` | close the tab (quits on the last document tab) |
| `:rebase pick|reword|edit|squash|fixup|drop` | set the verb of the cursor line in git-rebase-todo (Alt-Shift-K cycles) |
| `:recent` | quick open: tabs, recent files, project files (Alt-P) |
| `:references` | every use of the symbol at the cursor (Enter jumps) |
| `:reload` | reload settings.json and bindings.json |
| `:remotes` | saved skink ssh targets ("remotes" in settings.json) |
| `:removeroot [DIR]` | remove an added root (no argument: the one selected in the tree) |
| `:renamesymbol NEW_NAME` | rename the symbol at the cursor everywhere (language server; shown in the preview) |
| `:replace FIND WITH` | replace every FIND with WITH (selection, else whole file; literal; quote to use spaces) |
| `:reverthunk` | put the index version of the change at the cursor back (undoable) |
| `:review` | review the edits the agent staged (refactor preview) |
| `:run COMMAND...` | run a shell command in the project root, output in a tab |
| `:safedelete` | delete the declaration at the cursor if find-references shows no other use; preview first |
| `:safedelete!` | preview deleting the declaration at the cursor without checking references |
| `:save` | save the file |
| `:scrollback [last]` | the terminal's history in a searchable tab (Shift-F11); `last` selects the last output (Shift-F4) |
| `:set eol=lf|crlf` | set a file option (line endings are written on the next save) |
| `:settings [project]` | open settings.json (created with defaults if missing); project: this project's .skink/settings.json |
| `:sgrep PATTERN` | structural search (ast-grep) in files of the current language: `foo($A, $$REST)` |
| `:signoff` | toggle a Signed-off-by line in the message tab |
| `:srep PATTERN => WITH` | structural replace through the preview: `srep foo($A, $B) => bar($B, $A)` |
| `:stage [PATH]` | git add this file (or PATH) |
| `:stagehunk` | stage the change at the cursor |
| `:stash [MESSAGE...]` | stash the current changes |
| `:stashes` | list stashes; Enter applies, p pops, D drops |
| `:stopsearch` | stop a running project search |
| `:switch BRANCH` | switch to BRANCH |
| `:symbols` | symbols in this file |
| `:tab N` | select tab N |
| `:task [LABEL|last]` | run a task in a terminal tab (Shift-F10 picks, Shift-F9 reruns); problems go to Shift-F8 |
| `:term [COMMAND...]` | new terminal tab running COMMAND (default: your shell), e.g. `term claude` |
| `:termdock` | show or hide a shell along the bottom (Alt-T) |
| `:theirs` | resolve the conflict under the cursor: keep theirs |
| `:theme [NAME]` | pick a theme with a live preview (Esc keeps the old one), or switch to NAME |
| `:tree [collapse|expand|hide|hidden]` | show / focus the file tree (F8); collapse all, expand the selected folder, hide it, show/hide dotfiles |
| `:unfoldall` | open every fold (Alt-Shift-M) |
| `:uninstall NAME` | remove a package and everything it placed |
| `:unsplit` | close the focused pane; its tab stays open (Alt-Q) |
| `:unstage [PATH]` | take this file (or PATH) out of the index |
| `:unstagehunk` | unstage the staged change at the cursor |
| `:upgrade` | download and install the latest skink release (runs from the next start) |
| `:vsplit [FILE]` | split the pane side by side, optionally opening FILE in the new pane (Ctrl-\) |
| `:zoom` | zoom pane: only the text (also Alt-Z) |
