Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b74f488
fix: preserve source formatting during paste and reorder (#83)
jonaraphael Oct 17, 2026
e8247c0
docs: explain privacy and omit cell values from edit logs (#82)
jonaraphael Oct 17, 2026
20049b3
Merge branch 'codex/fix-edit-integrity' into codex/fix-source-formatting
jonaraphael Oct 17, 2026
e906bba
docs: scope document handling to editable views
jonaraphael Oct 17, 2026
c19fb7b
Implement full-source column filtering with source row identities
jonaraphael Oct 17, 2026
4cdd149
Merge branch 'codex/feat-hidden-row-defaults' into codex/feat-column-…
jonaraphael Oct 17, 2026
511bfc6
Clarify filtered operation scopes and preserve native control focus
jonaraphael Oct 17, 2026
acad064
Merge branch 'codex/fix-source-formatting' into codex/feat-column-fil…
jonaraphael Oct 17, 2026
da47884
Preserve hidden source formatting during filtered mutations
jonaraphael Oct 17, 2026
d2ac357
Merge branch 'codex/docs-privacy' into codex/feat-column-filters
jonaraphael Oct 17, 2026
800e6e0
Validate filter controls and retain source row numbering
jonaraphael Oct 17, 2026
a520a88
Merge branch 'codex/feat-hidden-row-defaults' into codex/feat-column-…
jonaraphael Oct 17, 2026
9a08db5
Merge branch 'codex/feat-hidden-row-defaults' into codex/feat-column-…
jonaraphael Oct 17, 2026
493f44b
Merge branch 'codex/feat-hidden-row-defaults' into codex/feat-column-…
jonaraphael Oct 17, 2026
c58e7a5
Merge branch 'codex/feat-hidden-row-defaults' into codex/feat-column-…
jonaraphael Oct 17, 2026
dba0659
Add datatype-aware column filter operators
jonaraphael Oct 17, 2026
6186388
Include typed filter browser verification
jonaraphael Oct 17, 2026
f5f8623
Integrate narrowed high-contrast support into column filters
jonaraphael Oct 17, 2026
2886fa7
Integrate frozen row divider paint into column filters
jonaraphael Oct 17, 2026
4128584
Edit live AND filters in the table details row
jonaraphael Oct 17, 2026
09e9663
Preserve live filter drafts through safe view refreshes
jonaraphael Oct 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Privacy and data handling

CSV does not implement an upload service, analytics client, or extension-specific telemetry collection. Normal editable views parse, search, sort, and edit files through the VS Code document and the extension's bundled code. No account or external processing service is required by CSV.

## Where processing happens

Normal editable CSV views receive the file's decoded text from VS Code. The extension parses that text with the bundled Papa Parse library, sends table content to its VS Code webview, and applies edits through VS Code's document APIs. Saving in these views uses VS Code's normal file-saving behavior and the selected file encoding.

The read-only large-file preview supports host-local UTF-8 files and reads bounded blocks directly from the saved file. It does not write the saved file.

For a normal local workspace, these operations run on your computer. In Remote SSH, WSL, Dev Containers, or another remote workspace, the extension host and files can be on that remote environment. File contents travel through your existing VS Code connection to display and edit them in the webview. “No external processing service” does not mean that a remote workspace's data stays on your local computer.

The font picker uses the bundled `font-list` package to enumerate fonts available to the extension host through operating-system helpers. It does not use an online font service.

## Actions that share information outside the table

- **Clipboard:** Copying writes the selected contents to the system clipboard; pasting reads clipboard contents supplied by the editor. Other applications, clipboard managers, and operating-system clipboard synchronization may have access to that clipboard.
- **Links:** Ctrl/Cmd+click on a recognized link asks VS Code to open its URL using your configured browser or application. Supported schemes include HTTP, HTTPS, FTP, and email links. The destination receives the URL, including any information in its path or query, according to that application's behavior. CSV does not fetch a link merely to render its text. You can disable link interaction with `csv.clickableLinks`.
- **Support:** If you attach a file, screenshot, or log to a GitHub issue, you are sharing it with that issue's audience. CSV does not submit these materials automatically.

VS Code's Marketplace connections, updates, Settings Sync, remote services, other extensions, and the browser or application used for links have their own data-handling behavior. They are separate from CSV's runtime processing.

## Logs and stored state

The extension writes diagnostic messages to the extension host's console. Routine messages include file paths/URIs, row counts, and the row/column coordinates of an edit; routine edit messages omit the cell value. Errors can still contain document or operation details, and a failed external-link operation can log its URL. Treat extension host logs as potentially containing sensitive information, especially before sharing them for support. The log location and retention are controlled by VS Code and may be in a remote environment.

CSV's code does not send those logs or cell contents to a telemetry endpoint. This statement does not describe or override VS Code's own telemetry, logging, crash reporting, or another extension's behavior. Consult your editor's privacy policy and settings for those services.

CSV stores per-file view preferences in VS Code workspace state on the extension host, keyed by the file URI: header mode, serial-index visibility, separator overrides, hidden leading rows, manual column widths, frozen rows/columns, and column filters. Valid filter conditions are saved as you type in the filter details row and may contain sensitive CSV values; incomplete or invalid drafts are not saved. Clear all filters removes the saved conditions for that file. Its webview state remembers scroll/selection positions, column widths, row heights, and zoom. View preferences and saved state can themselves contain sensitive data and metadata; they are not intended as full-document backups. VS Code independently manages the document, undo history, unsaved-file backups, autosave, and any platform synchronization you enable.

## Scope of these statements

These statements describe this repository's extension and webview implementation. The main data paths are in [`src/CsvEditorProvider.ts`](src/CsvEditorProvider.ts), [`media/main.js`](media/main.js), [`src/commands.ts`](src/commands.ts), and [`src/extension.ts`](src/extension.ts); runtime dependencies are declared in [`package.json`](package.json). They are not a promise about every VS Code component, remote host, dependency version, or installed extension. Review the version you use and your environment's policies when deciding whether it fits your data requirements.
22 changes: 17 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,14 @@ Working with CSV files shouldn’t be a chore. With CSV, you get:
- **Add/Delete Columns:** Right-click any cell to add a column left or right, or remove the selected column.
- **Add/Delete Rows:** Insert above/below or remove the selected row via context menu.
- **Edit Empty CSVs:** Create or open an empty CSV file and start typing immediately.
- **Column Sorting:** Right-click a header and choose A–Z or Z–A.
- **Column Sorting:** Right-click a header and choose A–Z or Z–A. With filters active, sorting rearranges matching rows within their source positions and leaves hidden rows in place.
- **Column Filters:** Right-click a column and choose **Filter this column** at the top of the menu to add a condition to the filter details row. Choose its column and operator and type a value there; matching rows update as you type. **Add filter** and repeated right-clicks add more conditions, including multiple conditions on the same column; every condition combines with AND. Remove a condition individually or use **Clear all filters**. Every column offers Contains, Does Not Contain, Regular Expression, Equals, Does Not Equal, Is Empty and Is Not Empty. Number and date columns also offer >, >=, < and <= comparisons. Operator choices use the inferred type from the original body rows, excluding headers and hidden metadata; other filters do not change it. A text column whose nonblank cells all contain supported dates also offers date comparisons, without changing column colors. Filtering searches the full file, retains source row numbers and remembers valid conditions per file.
- **Custom Font Controls:** Choose a font family and optional font-size override, or inherit VS Code defaults.
- **In-View Zoom:** Use `Ctrl/Cmd + Mouse Wheel` or `Ctrl/Cmd + +/-/0` to zoom the CSV view without changing global editor zoom.
- **Find & Replace Overlay:** Built-in find/replace bar with match options (case, whole-word, regex), keyboard navigation, and single/all replace actions across the full file (including chunked rows).
- **Find & Replace Overlay:** Built-in find/replace bar with match options (case, whole-word, regex), keyboard navigation, and single/all replace actions across the full file (including chunked rows), or the matching rows while column filters are active.
- **Multiline Cell Display:** Cells with embedded newlines render as wrapped multi-line content (with preserved line breaks and matching row height).
- **Clickable Links:** URLs in cells are automatically detected and displayed as clickable links. Ctrl/Cmd+click to open them in your browser.
- **Preserved CSV Integrity:** All modifications respect CSV formatting—no unwanted extra characters or formatting issues.
- **Preserved CSV Integrity:** Cell edits, expanding grid pastes, and row/column moves preserve existing field quoting and line endings. Appended values follow the existing column quote style when the column uses one consistently.
- **Optimized for Performance:** Designed for medium-sized datasets, ensuring a smooth editing experience without compromising on functionality.
- **Large File Support:** Loads big CSVs in chunks so even large datasets open quickly.
- **CSV/TSV/TAB/PSV Support:** `.csv`, `.tsv`, `.tab`, and `.psv` files are recognized automatically. Defaults: comma for CSV, tab for TSV/TAB, pipe for PSV.
Expand Down Expand Up @@ -75,7 +76,11 @@ Cursor (built on VS Code 1.99) and the latest VS Code releases (1.102).
- Detail edit: press `Enter` on a selected cell or double‑click to enter a focused edit. Arrow Left/Right move the text caret; Arrow Up goes to start; Arrow Down goes to end. Click outside the cell (or blur) to save.
- **Keyboard Navigation:** Use Arrow keys to move between cells when not editing. Use `Tab`/`Shift+Tab` to move horizontally (wrapping across rows as needed).
- **Multi-Cell Selection:** Click and drag or use `Shift + Click` to select multiple cells, then copy them as CSV using `Ctrl/Cmd + C`.
- **Find & Replace:** Press `Ctrl/Cmd + F` to open Find, or `Ctrl/Cmd + H` to open Find + Replace.
- **Find & Replace:** Press `Ctrl/Cmd + F` to open Find, or `Ctrl/Cmd + H` to open Find + Replace. With filters active, Find and Replace All operate on the visible filtered table (including its header); hidden metadata and nonmatching rows are excluded.

Filter comparisons use the column's inferred type. Text matching ignores case. Numbers compare finite decimal/scientific values, including consistently grouped thousands. Boolean equality accepts `true/false`, `t/f`, `yes/no`, `y/n`, `on/off` and `1/0`. Date queries accept explicit numeric dates and English month names, optional times and timezone offsets; date-only or timezone-less values use UTC. Ambiguous numeric dates default to month/day/year (`03/04/2026` means March 4); a leading day above 12 is unambiguous (`13/04/2026` means April 13). Use an ISO date or an explicit month name to avoid ambiguity. Supported timestamps compare exactly, including sub-millisecond fractional seconds. Blank or invalid cell values do not match typed comparisons, including Does Not Equal; use Is Empty to find empty cells. Incomplete or invalid values show an inline error and retain the last valid results until corrected. A blank value leaves that draft condition inactive; Is Empty and Is Not Empty apply without a value. Filter controls retain focus while results update.

Regular Expression uses [RE2 syntax](https://github.com/google/re2/wiki/Syntax). Plain patterns ignore case; `/pattern/flags` accepts `i`, `m` and `s`, and explicit flags override that default (`/pattern/` is case-sensitive). Lookaround and backreferences are unsupported and rejected by input validation.

---

Expand Down Expand Up @@ -124,6 +129,7 @@ Per-file (stored by the extension; set via commands):
- Serial index column (default `true`) — `CSV: Toggle Serial Index Column`
- CSV separator override — `CSV: Change CSV Separator` (or clear it with `CSV: Reset CSV Separator (Inherit)`)
- Hide first N rows (inherits `csv.defaultIgnoreRows`) — `CSV: Hide First N Rows`. An explicit `0` overrides a nonzero default; blank input clears the per-file override.
- Column filter conditions — edit in the live filter details row; add from its Add filter button or a column’s context menu and remove individually. Conditions, including any entered CSV text, are stored in VS Code workspace state on the extension host (which may be remote). Clear all filters removes the saved conditions for that file. No CSV rows are removed by filtering.
- Frozen leading visible rows/columns — `CSV: Freeze Leading Rows` / `CSV: Freeze Leading Columns`. Enter `0` to unfreeze that axis. The default keeps the first header row frozen; with headers off, no rows freeze until requested. Hidden metadata rows do not count; the virtual append row is never frozen as a leading row.

---
Expand All @@ -141,7 +147,7 @@ Per-file (stored by the extension; set via commands):
- Save the file: `Ctrl/Cmd + S` commits the active cell before saving, including all inserted line breaks.
- Global:
- Copy selection: `Ctrl/Cmd + C`
- Paste selection: `Ctrl/Cmd + V` (selection mode). Pasting a single value into a selected rectangle fills that rectangle.
- Paste selection: `Ctrl/Cmd + V` (selection mode). Pasting a single value into a selected rectangle fills that rectangle. With filters active, copying/cutting and filling affect visible selected rows; matrix paste advances through matching rows and appends at the physical end when needed. Nonmatching rows remain intact, and saving always includes the full source file.
- Zoom in/out/reset: `Ctrl/Cmd + +`, `Ctrl/Cmd + -`, `Ctrl/Cmd + 0` (also `Ctrl/Cmd + Mouse Wheel`)
- Find: `Ctrl/Cmd + F`
- Replace: `Ctrl/Cmd + H`
Expand Down Expand Up @@ -197,6 +203,12 @@ npm run compile

---

## Privacy

CSV processes files through VS Code and bundled libraries, with no extension-specific upload service or telemetry client. Remote workspaces, clipboard operations, links, diagnostic logs, and editor-managed backups have additional data-handling implications. See [Privacy and data handling](PRIVACY.md) for the verified behavior and scope.

---

## Support

Have questions, suggestions, or encountered an issue?
Expand Down
Binary file added images/inline-column-filters.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading