TabWell

TabWell User Guide

Version 1.1.0 · A native macOS source-code editor for Windows → Mac migrants

Welcome to TabWell. If you are coming from a classic Windows text editor, this guide is written for you: it walks through every feature, calls out where macOS does things differently, and ends with a "where did X go?" migration table and an honest list of current limitations.

Every behaviour described here matches what actually ships in v1.1.0. Where a feature is incomplete or behaves differently from the Windows editor you're used to, you'll find it under Known limitations rather than glossed over.


Table of contents

  1. Getting started
  2. Working with files
  3. Folder workspace
  4. Encodings & line endings
  5. Editing
  6. Find & Replace
  7. Find in Files
  8. Navigation & line operations
  9. Reading aids & Symbols
  10. Preferences
  11. Session restore
  12. Windows editor → TabWell migration
  13. Known limitations

1. Getting started

Launching the app

Open TabWell from the Applications folder, Launchpad, or Spotlight. On first launch you get a single window with one empty Untitled tab, a blinking caret, and you can start typing immediately.

The window at a glance

Tabs


2. Working with files

Opening files

Choose Clear Menu at the bottom to empty the list.

macOS sandbox note: TabWell runs in the macOS App Sandbox, so it can only open files and folders you pick in a panel (or drag in). It remembers your permission to reopen a file later using a secure bookmark, not a raw path, which is why Open Recent keeps working after you quit and relaunch.

Saving

Save is greyed out when there is nothing to save.

When you close or quit with unsaved changes

Choosing Cancel on any prompt stops the quit entirely.

The "file changed on disk" banner

If a file you have open is modified by another program, TabWell shows a non-blocking yellow banner at the top of the editor: "This file has changed on disk." It offers:

The banner never blocks typing, and it tucks neatly below the find bar if both are open.


3. Folder workspace

Open a project folder to browse and jump between its files without leaving TabWell, the classic "project explorer" workflow.

The workspace is read-mostly: it is for browsing and opening files, not project-wide file management, Git status, a terminal, or build tasks. It also rejects symlink escapes and cycles outside the chosen root as a safety measure.


4. Encodings & line endings

TabWell treats encodings and line endings the way a serious code editor should: it detects them on open, preserves them on save, and lets you change them deliberately.

Detection (on open)

The status bar shows the detected encoding (e.g. UTF-8, UTF-8 with BOM, UTF-16 LE) and the detected line-ending style:

StyleUsed by
LF (\n)macOS, Linux
CRLF (\r\n)Windows
CR (\r)classic Mac OS

New Untitled documents default to UTF-8 / LF (you can change these defaults in Preferences ▸ New Files).

Preserve on save

If you open a Windows file (CRLF / UTF-8), edit it, and save without touching the popups, it stays CRLF / UTF-8. TabWell never silently "fixes" your line endings or encoding. These settings also survive quit and relaunch with the rest of your session.

Reinterpret vs Convert

Both the encoding and line-ending popups in the status bar offer two distinct operations, and the distinction matters:

Example: open a UTF-16 LE file, choose Convert to ▸ UTF-8, then save. The file is now UTF-8 on disk (no BOM). Convert CRLF → LF the same way.

If a conversion would lose characters (for example, converting text containing an emoji 🚀 to Windows-1252, which can't represent it), TabWell warns you and leaves the encoding unchanged rather than corrupting your text.

Byte-order marks (BOM)

A UTF-16 file with a BOM opens correctly and the BOM is handled invisibly: you won't see a stray glyph at the start of the document.

See Known limitations for the one detection edge case: a UTF-16 file with no BOM.


5. Editing

Typing & the basics

Type and characters appear immediately at the caret. The standard Edit menu is all there with the shortcuts you'd expect: Undo (⌘Z), Redo (⇧⌘Z), Cut (⌘X), Copy (⌘C), Paste (⌘V), Select All (⌘A). The default editor font is a 13-pt monospaced face; text is always drawn clear of the line-number gutter.

Word wrap

The Wrap button in the status bar toggles word wrapping for the current tab. Wrap is per-tab, so you can wrap a prose file while leaving a code file unwrapped. New documents can be set to wrap by default in Preferences ▸ New Files.

Column (rectangular) selection

Hold Option (⌥) and drag vertically to select the same column range on every line, a rectangular block. Press Delete and the selected prefix is removed from all those lines at once; a single ⌘Z restores them all.

Multiple carets

TabWell supports editing at many places at once, a favourite power-user feature:

Select All Occurrences (⌃⌘G)

Multiple carets are a live editing state: they are not saved across quit/relaunch and collapse back to a single caret on restore (this matches the classic Windows behavior).

Occurrence highlighting, comments & indent


6. Find & Replace

Open the find bar with Find… (⌘F). It has two rows, a Find row and a Replace row, and pre-fills the search field from a single-line selection if you have one.

Searching

Search toggles

ToggleMeaning
AaMatch case
.*Regular-expression mode
\bWhole word only
In SelRestrict the search to the text that was selected when the bar opened

An invalid regular expression shows a red "Invalid regex" label and simply waits: fix the pattern and matching resumes. (Nothing crashes, nothing is replaced.)

Replacing


7. Find in Files

Search a whole folder tree at once: the classic "Find in Files" workflow.

Because of the macOS sandbox, Find in Files searches only the folder you pick in the panel (or your open workspace). TabWell can't silently scan arbitrary paths. This is expected macOS behaviour.


8. Navigation & line operations

Go to Line (⌘G)

Edit ▸ Go to Line… (⌘G) opens a sheet showing the valid line range. Enter a valid number and the editor scrolls there and selects the line; an out-of-range number shows an inline red error and keeps the sheet open. (If the target line is inside a folded block, it is revealed.)

Coming from Windows: yes, ⌘G is Go to Line here, not "Find Next" (which is ⌘K). This is deliberate parity with the classic Windows Ctrl+G.

Line Operations (Edit ▸ Line Operations)

All of these operate on the selected lines, or the whole document if there's no selection, and each is a single undo step:

OperationWhat it does
Sort Lines Ascending / DescendingSort lines A→Z or Z→A
Remove Duplicate LinesDrop duplicates, keeping the first occurrence
Trim Trailing WhitespaceStrip trailing spaces/tabs from each line (idempotent)
Change Case ▸ UPPERCASE / lowercase / Title CaseRe-case the selection
Move Line Up / DownSwap the current line with the one above/below
Duplicate LineCopy the current line(s) below
Join LinesJoin the selected lines into one, separated by spaces
Convert Tabs to SpacesReplace tabs with spaces
Convert Spaces to TabsReplace runs of spaces with tabs

Bookmarks (Edit ▸ Bookmarks)


9. Reading aids & Symbols

Syntax highlighting

TabWell highlights code with tree-sitter grammars, picked automatically from the file extension. Supported languages:

LanguageRecognised extensions
Swift.swift
Python.py, .pyw, .pyi
JavaScript.js, .cjs, .mjs
TypeScript.ts, .cts, .mts
JSON.json
YAML.yml, .yaml
Markdown.md, .markdown, .mkd, .mkdn, .mdown, .mdwn
HTML.html, .htm, .shtml, .xhtml
CSS.css
Shell.sh, .bash, .zsh, .ksh
SQL.sql
Java.java, .jav
C.c, .h
C++.cc, .cpp, .cxx, .c++, .hpp, .hh, .hxx
Go.go
Rust.rs
Ruby.rb, .rbw
PHP.php, .phtml
TSX.tsx
XML family.xml, .svg, .plist, .xhtml

Anything else opens as Plain Text (no colouring). .h is treated as C.

Line numbers, fold ribbon, minimap & whitespace

Click a fold triangle to collapse or expand that block.

Comparing two files (Edit ▸ Compare)

Compare two text files side by side in a dedicated, read-only window — the comparison never edits your documents.

In the compare window, added, removed, and changed lines are shown in distinct colours (adapting to Light/Dark) with the two columns kept row-aligned. The columns scroll together; ◀ / ▶ jump to the previous / next change and a counter shows “N of M”. Swap exchanges the sides and Close dismisses the window; you can select and copy a line from either side. Identical files report “No differences.”, a line-endings-only difference is surfaced rather than called identical, and a very large pair shows a “too large to compare” message instead of hanging. The compare view is compare-only (no merge or write-back), is not a tab, and does not take part in session restore.

Symbols

The sidebar's Symbols tab shows a filterable outline of the active document for Python, JavaScript, TypeScript, and Swift files.


10. Preferences

Open Preferences with ⌘, (App menu ▸ Preferences…). Every control applies live and persists across launches. Sections:

Appearance

The caret stays visible in all three modes, and the app follows a macOS-wide appearance change while running.

Editor

Zoom (⌘+ / ⌘- / ⌘0, or hold / Ctrl and scroll the mouse wheel) drives the same size and stays in sync with this control. Size is clamped between 6 pt and 96 pt.

Indentation

New Files

These do not affect existing files you open (those keep their detected settings).

Startup


11. Session restore

TabWell quietly saves your working state so you can pick up where you left off. State is written about 2 seconds after you stop typing, and again when you quit.

What comes back on relaunch:

Reopen Tabs at Launch (File menu, and Preferences ▸ Startup) controls this. It is on by default. Turn it off and TabWell starts each time with a single fresh Untitled tab (your saved session file is left intact on disk, not deleted).

If a remembered file was deleted or moved while TabWell was closed, its tab reappears with the filename but an empty buffer marked as unsaved: no crash, no data loss elsewhere.

Unsaved changes are safe across quit. Untitled text is restored automatically; for a file-backed tab with unsaved edits, quitting prompts you to Save / Don't Save / Cancel first.


12. Windows editor → TabWell migration

A quick "where did X go?" map for Windows-editor habits:

In your Windows editorIn TabWell (Mac)
Ctrl for shortcuts⌘ (Command)
Ctrl+N / Ctrl+O / Ctrl+S⌘N / ⌘O / ⌘S
Ctrl+Alt+S (Save As)⇧⌘S
Ctrl+W (close tab)⌘W
Ctrl+F (Find) / Ctrl+H (Replace)⌘F / ⌥⌘R
F3 / Shift+F3 (Find Next/Prev)⌘K / ⇧⌘K
Ctrl+Shift+F (Find in Files)⌥⌘F
Ctrl+G (Go to Line)⌘G (kept the same)
Ctrl+F2 (Toggle Bookmark)⇧⌘B
F2 / Shift+F2 (Next/Prev Bookmark)Edit ▸ Bookmarks menu
Column mode (Alt+drag)⌥-drag (same idea)
Multi-edit (Ctrl+click)⌘-click for extra carets
Ctrl+D (Duplicate Line)Edit ▸ Line Operations ▸ Duplicate Line
Ctrl+Shift+Up/Down (Move Line)Edit ▸ Line Operations ▸ Move Line Up/Down
Ctrl+U / Ctrl+Shift+U (case)Edit ▸ Line Operations ▸ Change Case
Encoding menuEncoding popup in the status bar
EOL ConversionLine-ending popup in the status bar
Language menuLanguage popup in the status bar
View ▸ Word wrapWrap button in the status bar
Settings ▸ PreferencesApp menu ▸ Preferences… (⌘,)
Plugins / macrosNot in this release (see below)

13. Known limitations

These are honest, documented gaps in v1.1.0. Most are waiting on the upstream editor engine and are expected to light up in a later release.

Not in this release at all (post-MVP): plugins, macros, User-Defined Languages, and split-editor view.


Need a hand? See the FAQ & Troubleshooting and the Keyboard Shortcut Reference.