9.4.2 Reading Markdown and Org tables

In a Markdown or Org table, press a Control-Meta arrow to enter table reading and move immediately. Left/right moves by cell; up/down moves by logical row. The first movement announces table reading and the destination together. Outside supported tables, these arrows retain their existing bindings, including inside code examples.

C-e C-t C-r enters without moving when the default speech prefix is used. It announces the dimensions and current cell. Press q or the same command to restore ordinary editing keys. From prose, C-e C-t ] and C-e C-t [ find and enter the next or previous table. Inside table reading, t and T do the same; code examples are skipped.

While table reading is active:

A horizontal edge or a missing cell in a shorter row leaves point unchanged and announces the boundary. Separators are skipped. A separator immediately after the first row identifies column titles; otherwise that row is data. Coordinates distinguish the header from one-based data rows. Empty cells are spoken as “blank.” Wrapping never shortens a logical cell’s speech or copy.

Reading does not align tables, create rows, or evaluate Org formulas. Copies use cell values: ordinary links become their labels and inline code becomes its literal text. Use the host mode to copy exact markup or formulas. This reader covers simple pipe tables; HTML spans, nested tables, and spreadsheet-specific structures have separate interfaces.

Leaving restores ordinary mode keys. Other editing commands retain their normal meaning, and an edit ends the reading context. Org’s table-editing feedback and Markdown’s markup-stripping speech option remain independent. Agent Shell has automatic contextual table entry and its own preferences. In Agent Shell, Control-Meta-up/down reads the destination cell, whereas plain up/down reads the destination row. Do not assume identical spoken units merely because the keys are similar; see Agent Shell.

9.4.3 Reading application lists

In an application built on Tabulated List mode, use a Control-Meta arrow or C-e C-t C-r to enter shared reading. Ordinary application navigation stays unchanged until you enter. Within reading, up/down reads complete logical rows, Control-Meta-left/right reads cells, and plain left/right inspects characters. q leaves reading and restores the application’s usual navigation.

Application actions take precedence over other shared reader keys. Opening, refreshing, sorting, searching, and editing keep their commands, including RET on a button. When a shared key is occupied, use M-x emacsvox-table-reader-speak-cell, M-x emacsvox-table-reader-speak-row, M-x emacsvox-table-reader-speak-column, M-x emacsvox-table-reader-speak-context, or M-x emacsvox-table-reader-speak-dimensions. The matching emacsvox-table-reader-copy-cell, emacsvox-table-reader-copy-row and emacsvox-table-reader-copy-column commands copy logical values.

Speech and copies use complete entry text even when a displayed column is truncated. Column headings come from the application, not the first item. Coordinates count visible data rows; hidden rows are excluded and empty cells say “blank.” Movement stops at the first or last row. A refresh ends reading; enter again to inspect the refreshed list. Custom table printers, image-only cells, and duplicate column names are not supported by this reader.

9.4.4 Browsing CSV data

Use emacsvox-table-find-csv-file to open a CSV file in the table browser, or emacsvox-table-view-csv-buffer for the current buffer’s CSV data. Quoted commas, doubled quotation marks, and multiline fields remain single logical cells. Blank records outside quoted fields are skipped; empty fields remain cells. Empty input or malformed quoting produces an error before creating a view.

Browsing preserves source text. If the file is already open, the view uses that buffer’s current contents, including unsaved edits, without replacing the source buffer. Shared table controls are active immediately:

These replace the old browser cell-arrow, header-reading, automatic-speech, and single-key table-copy bindings. The old local aliases b, n, p, A, B, E, and T are removed; speech-prefix table commands remain available.

Search with s, R for a row, C for a column, or h for headers. # sorts on the current column and M-<~/~M-> jumps to the top or bottom. At an edge, movement announces the boundary and leaves point in place.

Filters remain on f for a row and g for a column; a prefix argument requests a new filter. Filter indexes and the j jump prompt retain zero-based model coordinates, including the header, although spoken coordinates count data rows and columns from one. For example, the row filter (0 "value" 2) reads the first column, “value”, and the third column. M-l and M-s load and save filters. Filters are explicit inspections; shared row movement always reads the whole row. Sorting preserves filters and speech preferences. Use C-h m for the full browser key map.