Skip to content

Keyboard

Shortcuts

Everyone learns Esc. These are the rest — all checked against Claude Code itself, not copied off a blog.

The three to learn first

If you remember nothing else.

  • Esc Esc
    Stop Claude mid-action The moment Claude starts doing something you did not intend.
  • Esc thenEsc Esc thenEsc
    Clear the input box Your half-written prompt has turned into a mess and you want a clean line.
  • Shift +Tab Shift +Tab
    Cycle permission mode Starting an exploration (plan) or letting an agreed plan run (accept edits). On older Windows setups without VT mode, this is Meta+M instead.

Writing the prompt

Composing, searching, pasting.

  • Ctrl +J Ctrl +J
    Start a new line without sending Any prompt longer than one sentence.
  • Ctrl +R Ctrl +R
    Search your prompt history "What did I type last week that worked?" Inside the search, Ctrl+S cycles the scope: this session → this project → everywhere.
  • Ctrl +S Ctrl +S
    Park the half-written prompt You are three sentences into a prompt and need to go check something.
  • Ctrl +G Ctrl +G
    Edit the prompt in your real editor Writing anything long or carefully structured.
  • Ctrl +V Alt +V
    Paste an image Anything visual. Annotate the screenshot first and it works even better. Ctrl+V, not Cmd+V — macOS keeps Cmd+V for its own paste. Windows and WSL use Alt+V. On WSL both Ctrl+V and Alt+V work.
  • Option +T Alt +T
    Toggle thinking for the next turn One hard question in the middle of otherwise simple work.
  • Ctrl +_ Ctrl +_
    Undo in the input box You deleted half a prompt by accident.

Seeing what happened

What Claude did and what it plans to do.

  • Ctrl +O Ctrl +O
    Toggle the full transcript You want to know what it actually did, not the summary.
  • Ctrl +T Ctrl +T
    Toggle the task checklist Any multi-step task, before it gets far.

Running the session

Long jobs, models, the terminal.

  • Ctrl +B Ctrl +B
    Send the running job to the background A long build, test run, or search you do not want to sit and watch.
  • Option +P Alt +P
    Switch model Between tasks — rarely a good idea mid-task.
  • Option +O Alt +O
    Toggle fast mode Straightforward work where you would rather have speed than depth.
  • Ctrl +Z Ctrl +Z
    Step out to the shell without quitting You need the terminal for one command and do not want to lose the session. Terminal-level shortcut (Unix SIGTSTP), not a Claude Code binding. Windows has no direct equivalent.

The keys are the same on both systems — only the modifier's name changes (macOS calls Alt Option). Run /keybindings in any session to see exactly what is bound on your machine.

Hooks for the non-negotiables — CLAUDE.md only asks nicely

← Tips Workflow & commands

Hooks for the non-negotiables — CLAUDE.md only asks nicely

is advisory — Claude follows it about 80% of the time. are deterministic — they run every time, no exceptions. If something must happen 100% of the time (lint, security check, format), make it a hook.

advanced External reference ↗

There’s one detail about that takes most teams a few weeks to internalise: it’s advisory. Claude reads it at the start of every and tries to follow it. Most of the time it does. Not every time.

The empirical number that floats around the team and community guides: ~80% adherence. Good enough for “prefer const over let”. Not good enough for “never force-push to main” or “always run the linter after editing”.

For the things that must happen, use . A hook is a runs on a specific event — and it runs deterministically, every time.

The events worth knowing:

  • PreToolUse — fires before Claude calls a tool. Use to block dangerous commands or require a confirmation. Example: “if Claude tries to run git push --force, refuse.”
  • PostToolUse — fires after. Use to enforce post-edit invariants. Example: “after any file edit, run npm run lint --fix.”
  • Stop — fires when Claude finishes a turn. Use for safety nets. Example: “after every turn, run the test suite; if it fails, surface the failures to the next .”
  • UserPromptSubmit — fires when you press enter on a prompt. Use to inject context. Example: “before every prompt, append the current name.”

Hooks are configured in .claude/settings.json () or ~/.claude/settings.json (personal). A minimal example — auto-lint after every edit:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "npm run lint:fix --silent"
      }
    ]
  }
}

After every Edit or Write, the lint runs. Claude can’t forget it. The hook doesn’t need permission. It just happens.

You don’t have to memorise the JSON — ask Claude to set it up

Most newcomers see the snippet above and freeze: “do I edit this by hand?” You don’t. Tell Claude what you want enforced and let it wire the hook for you.

Add a hook to this project that runs npm run lint:fix after every file edit. Make sure it doesn’t run on .md files.

Claude finds (or creates) .claude/settings.json, drops the right hook block in, and shows you the diff before applying. You stay in the “describe the outcome” lane; the syntax is Claude’s job. Same trick for PreToolUse blockers, Stop test runs, or UserPromptSubmit context injections — describe the rule, let Claude write it.

The mental that helps:

If the rule is……put it in…
”Prefer this style” / “Use this pattern”CLAUDE.md
”Always run this after editing”PostToolUse hook
”Block this dangerous command”PreToolUse hook
”Surface this on every prompt”UserPromptSubmit hook

A small warning: hooks compose with and in non-obvious ways. Start with one hook, see how it behaves, then add more. Hooks that fail noisily are annoying; hooks that fail silently are dangerous. Log generously while you’re tuning them.

Next tip →

One session, one task — don't pile work into a long conversation

Long mixed-topic confuse Claude and burn context. Finish the auth refactor, then `/clear` and start the cart bug fresh. Sessions are cheap; misremembering isn't.