Releases: balwierz/vv
Release list
v1.15.0
Fixed
- TUI zebra stripe readable on light terminals. The default theme's
alternating-row background is a near-black grey that only reads as a subtle
stripe on a dark terminal; on a light-background terminal (e.g. JupyterLab's
web terminal) it became a hard black band that swallowed the default-foreground
text. vv now detects the terminal background (OSC 11 query, thenCOLORFGBG,
overridable withVV_BACKGROUND=light|dark) and, on a light terminal, uses a
subtle light-grey stripe instead. Dark terminals are unchanged; detection
failure falls back to the previous behaviour.
Added
--arrow/--featheroutput — write an Arrow IPC file (Feather v2), the
zero-copy interchange format for pandas / polars / Rarrow. Same column
projection /--filter/-(stdout) handling as--parquet; streams
chunk-by-chunk.--compressionacceptszstd(default),lz4, ornone
(Arrow IPC body compression). Round-trips through vv and is read by pyarrow.--count— print the row count and exit. Instant on formats that carry a
count in metadata (Parquet, LociSSD); reflects a-rregion and, with
--filter, counts only matching rows. Awc -lfor any supported format.--describe --json/--describe --ndjson— machine-readable per-column
statistics (the same count/nulls/min/max/mean/distinct as the text table) as a
JSON array or one object per line, for reproducible QC in pipelines. Integers
are exact (not%.6g-rounded), floats round-trippable, strings JSON-escaped;
numeric columns omitdistinct, all-null columns reportnullmin/max/mean.- Reference-aware pileup —
vv x.bam --pileup -f ref.fa. With a reference
FASTA (needs a.fai), the--pileupoutput fills therefcolumn from the
reference and renders read bases matching it as.(forward) /,(reverse),
byte-for-byte likesamtools mpileup -f(vv applies no BAQ, i.e.-B); deleted
bases are filled from the reference too. Without-fthe previous behaviour is
unchanged (refN, literal bases). The current contig is fetched once and
cached. Verified byte-identical againstsamtools mpileup -B -f(matches,
mismatches, deletions, ref-column case).-fwithout--pileupis a clean
usage error.
Changed
- LociSSD v4 reads faster. The colblock
read_chunkdecoded theStart
column twice wheneverEndwas also present (once for the LENGTH/mask input,
once as an output column) — the universal case for these interval files. Start
is now decoded once and the array reused. ~40% less time on both a full
--tsvscan and a-rregion query over a 1 M-row file; output byte-identical.
Fixed
- LociSSD v4 reader hardening (memory safety). The colblock decoders trusted
on-disk offsets from the (untrusted) file: the DICT and ARENA string codecs did
assign(blob + o0, o1 - o0)with noo0 ≤ o1 ≤ blob_lencheck (a non-monotone
offset underflowed the length to ~4 GiB → out-of-bounds read),n_dict + 1was
computed in 32-bit (wrap atUINT32_MAX), a-rregion query on a file lacking
Start/End indexed columns out of range, andzstd_inflatehad no output ceiling
(a tiny chunk could inflate to gigabytes). All now validate and reject with a
clean error (non-zero exit), never an OOB read or OOM. Crafted-input fixtures
(tiny.v4.baddict/badarena/nocoord/zbomb.lociss) guard each path.
v1.13.0
A focused follow-up that makes AnnData obs / var actually dumpable as text.
Added
- Full obs/var text dump.
vv file.h5ad --tab obs --tsv(and--tab var)
now exports the complete DataFrame instead of the 1000-row interactive
preview — previously the dump was silently truncated at 1000 rows.-n N
limits it; the TUI and plain table view keep the bounded preview. The sparse /
denseXmatrix stays capped (a full text dump of X is intentionally not
enabled).
Fixed
- High-cardinality categorical obs/var columns now decode to their string
labels instead of integer codes. The category-dictionary cap was 65536, which
wrongly showed real columns like CRISPR perturbation guides / targets
(hundreds of thousands of categories) as raw codes; the default is now
1,000,000, overridable withVV_CATEGORY_DICT_CAP. - Boolean obs/var columns (stored as HDF5 enums — e.g.
highly_variable,
mt) render their values (FALSE/TRUE) instead of?.
v1.12.0
AnnData depth (CSC sparse, uns, labelled X), data-correctness fixes across
the CSV / display / numeric paths, security hardening, and broad RAM/throughput
work on the streaming and TUI paths.
Added
- AnnData
unsdecoding — a new key/value tab surfaces the unstructured
annotations: scalars, strings and short arrays show their values, nested dicts
flatten with dotted keys (pca.variance_ratio), and an encoded sub-object
(dataframe / categorical) shows itsencoding-type. Previously skipped. - AnnData CSC sparse
Xpreview —csc_matrixmatrices now densify to a
rows × columns preview just like CSR (the compressed axis is columns, not
rows); they previously showed only a "not implemented" note. - Labelled AnnData
Xpreview — the sparse / denseXpreview names its
value columns by thevarindex (gene names) and prepends theobsindex
(cell barcodes) as a row-label column, instead of genericcol0/ row numbers.
Fixed
- Leading-zero IDs in CSV/TSV (and spreadsheet / markdown / HTML tables) are
preserved — a column of values like007is read as text instead of being
inferred as the integer7. Scientific notation stays numeric. - Wide and combining characters align.
display_widthnow measures terminal
columns (CJK / fullwidth / emoji = 2, combining / zero-width = 0) instead of
counting codepoints, so tables with such data no longer skew; truncation cuts
on a column boundary. - Hostile / malformed files are handled gracefully — AnnData sparse
shape
and DataFrame column lengths are validated against the real dataset extents
(no out-of-bounds read). - Date / timestamp / decimal columns are read as numeric values, so
--describemin/max/mean and--heatmapwork on them;--describenow
summarises the whole table rather than the first chunk. - Genomic / format correctness — Parquet region pruning indexes column
statistics by Parquet leaf (not Arrow field); pileup honours reference skips
(CIGARN) like samtools; mid-stream htslib read errors in pileup / BCF
region mode are surfaced instead of silently truncating; region mode reports
exact post-filter row counts; CSV headers ofnan/inf/ hex are no longer
mistaken for headerless numeric data. - TUI / terminal robustness — the terminal is restored on
SIGINT/SIGTERM/SIGHUP via an async-signal-safe handler; markdown rendering
strips terminal control bytes;truncatenever splits a multibyte codepoint;
a missing flag argument reports the specific flag instead of "Unknown option".
Performance
- Bounded RAM on streaming sources — DelimitedSource and the other streaming
readers evict old chunks behind a retention window instead of retaining every
decoded batch; SQLite computesCOUNT(*)lazily (not at open); generic HDF5
1-D datasets and wide NPZ arrays preview a capped head; delimited preamble
stripping is buffered. TUI redraws format each visible cell once and reuse the
LRU chunk cache during sorted search.
Security
- SQLite identifier quoting escapes embedded double quotes, so a table named
a"bno longer produces malformed / injectable SQL. - NPZ allocation hint — the zip central-directory
uncompressed_size(which
is attacker-controllable) is no longer passed straight toreserve(), so a
tiny crafted entry can't force a multi-GB allocation.
Build / CI
- KDE plugins stop including
KDEInstallDirs, silencing the ECM directory
warning in the GUI build.
v1.11.0
Large-AnnData usability, a Debian package, and build/CI maintenance.
Added
--tab <name>— view a named component tab (AnnDataobs/var/X,
a workbook sheet, …) straight from the CLI, e.g.
vv cells.h5ad --tab obs -n 20. Case-insensitive; an unknown name lists the
available tabs. The data components were previously only reachable in the
interactive TUI.- Debian package —
packaging/debian/build-deb.shwraps the static
AlmaLinux 8 binary into a self-contained.deb(Depends: libc6only), and
the release workflow now publishes avv_<version>_<arch>.debfor x86_64 and
aarch64 alongside the tarballs.
Fixed
- Large AnnData components no longer stall. Opening a multi-GB
.h5ad
(e.g. a 100M-cell atlas plate with a 4.7M-rowobs) used to hang for minutes:
the TUI eagerly materialised every component and readobs/varin full.
Now each component tab is built lazily (only when viewed), andobs/var/X
are read as a bounded first-rows preview (footer notes the true size). A
high-cardinality categorical (e.g. a per-cell barcode with millions of
categories) is shown as integer codes instead of reading its whole dictionary. - Arrow deprecation warnings in the Parquet read paths silenced by moving to
thearrow::Resultoverloads ofReadRowGroups/GetRecordBatchReader
(version-guarded so the Arrow 23.0.1 static build still compiles).
Build / CI
- ncurses is fetched from the GNU mirror (
ftp.gnu.org) instead of
invisible-mirror.net, which intermittently WAF-blocked CI runners and broke
a release. - GitHub Actions bumped to their Node 24 runtimes ahead of the forced migration.
v1.10.0
A feature and robustness release: a new terminal heatmap view, a major
upgrade to the Qt6 desktop GUI (vvg), and the remaining high-severity
correctness/OOM fixes from the code audit.
Added
--heatmap— render the numeric columns as a colour heatmap in the
terminal (rows × numeric-columns, globally normalised, viridis palette).
--image-modeselects the backend:auto(kitty graphics if supported, else
half-block),kitty,sixel,halfblock, orascii. When stdout is not a
terminal a plain ASCII intensity grid is written instead of raw escape
sequences.- Qt6 GUI (
vvg) — a real desktop application: menu bar, File▸Open
(multi-file → tabs), drag-and-drop, recent files, and error dialogs; a
genomic region/tabix query bar with a pileup toggle (re-opens BAM/VCF/BED
over a region); a View menu (column show/hide, go-to-row, shortcuts help).
Filtering, sorting and find now run off the UI thread with a progress bar
and a Cancel button, so the window stays responsive on large files.
Fixed
- HDF5 / AnnData — a dense
Xmatrix tab is previewed (first 1000 rows ×
200 columns) instead of densifying the entire matrix into RAM, which could
OOM/abort the reader on a real dataset. - Workbooks (XLSX & ODS) — a row wider than the header no longer makes
Arrow reject the whole sheet; every row is padded to the widest and the
overflow header columns are namedcolN. - ODS —
table:number-rows-repeatedon a non-empty row now expands to N
rows (capped) instead of silently dropping the duplicates. - TUI — sort / filter / stats / search drain a streaming source to EOF
first, so they cover the whole file instead of only the chunks scrolled
through so far. --heatmap—Inf/NaNcells no longer poison normalization (they're
treated as gaps); the scan buffer is bounded; non-TTY output is guarded.- KDE plugins — the Dolphin thumbnailer and KFileMetaData extractor handle
malformed input gracefully (empty result, no worker abort).
Performance
- GUI — row→chunk mapping is
O(log chunks)via a cumulative-offset binary
search (wasO(chunks)per cell); find navigates a precomputed match list in
O(log matches)and uses an Arrowmatch_substringprefilter for literals.
Docs
- Documented
--heatmap/--image-mode, NumPy.npz/.npy, and.fods
across--help, the man page, the README, and the bash/fish/zsh completions;
clarified that the KF6 GUI plugins are optional.
v1.9.1
A correctness- and robustness-focused patch release: it fixes a class of
silently-wrong results, several crash/hang/OOM paths on malformed input found
in a code audit, and the release/CI pipeline. No user-facing feature changes.
Fixed
- Region coordinates — every htslib-backed range query (tabix BED/VCF/GFF,
BAM--pileup -r, BCF) fed vv's canonical UCSC 0-based half-open coordinates
to htslib's 1-based-inclusive region parsers, shifting every query one base
and disagreeing with the Parquet path for the same-r. Coordinates are now
converted at the htslib boundary so all formats agree. - Parquet region queries now handle every integer coordinate width
(UInt32/Int16/…, and dictionary-encoded ints), not just Int32/Int64 — a
UInt32Start/Endcolumn previously made region queries return nothing. - SQLite
NUMERIC/DATE/DATETIME/BOOLEANcolumns are preserved
verbatim instead of being coerced throughdouble(which turned dates into
their year and rounded 64-bit integers beyond 2^53). - BCF keeps the
FORMATfield (e.g.GT:AD:DP) in theFORMAT_SAMPLES
column instead of dropping it. - Delimited streaming surfaces a mid-file parse error (a malformed row
beyond the first 16 MiB block) as a non-zero exit instead of silently
truncating output with status 0. - Streaming sources (Arrow IPC, FASTA/FASTQ, SQLite) no longer spin or
silently truncate when a read error occurs past the first batch. - Empty tabix region (a window overlapping no records) returns an empty
result with exit 0, matching the Parquet/BCF/BAM paths, instead of erroring.
Security
Memory-safety fixes for malformed/untrusted input (reachable in-process via
the KDE thumbnailer / KFileMetaData extractor):
- HDF5 — array-valued attributes no longer overflow fixed-size buffers in
H5Aread(a craftedshape/string attribute could smash the stack — verified
segfault, now rejected). - NumPy
.npz— the declared array shape is validated against the stored
data (rejecting negative dimensions, overflowing products, and shapes larger
than the buffer) instead of driving an out-of-bounds read. - 2bit — the header
seqCountis bounded against the file size before
reserving (a crafted value requested ~170 GB and aborted the process); the
N-block table skip is computed in 64-bit.
Build / CI
- The KF6 Dolphin/KFileMetaData GUI plugins are now optional in CI so the
Ubuntu 24.04 job (which lacks the KF6 dev packages) builds the Qt GUI without
them rather than failing. - The static-binary release fetch step retries on transfer timeouts
(--retry-all-errors, connect timeout), fixing the flaky-download failure
that blocked the 1.9.0 release.
v1.8.2
Fixed
- Static-binary build: the vendored libhdf5 was configured with
--disable-deprecated-symbols, but main.cpp uses
H5Dvlen_reclaimto free variable-length strings (its 1.12+
replacementH5Treclaimdoesn't exist on Ubuntu 22.04's libhdf5
1.10, so the deprecated name is the portable choice). Dropped
the flag from the AlmaLinux 8 build so the static binary
compiles. Packaging-only release; no source changes.
v1.7.0
Interactive-viewer focus on top of 1.6.0. Major additions to the
ncurses TUI: mouse clicks, an in-place theme picker with XDG-spec
persistence, a vim-style : command line, and multi-file tabs.
Added
- TUI multi-file tabs —
vv a.vcf b.bed c.parquetopens each
file as a tab.Tab/Shift+Tabcycle. Each tab keeps its own
scroll position, sort, filter, column-visibility set, search
anchor, and chunk cache; switching back is instant. Status bar
showstab N/M: basenamewhen more than one file is open.
Non-interactive output modes (--tsv,--parquet, …) still
process only the first positional — multi-file is TUI-only. - TUI command line (
:key) — vim/less-style typed-command
prompt at the bottom of the screen. First verbs::<N>— jump to row N (matches the row-index column;
out-of-range clamps to the last page). Closes the "scroll
through millions of rows by hand" pain point.:q/:quit— quit (vim muscle memory).:theme NAME— text-driven theme switch (alt to theT
overlay), with the same name set as--theme. Persisted to
~/.config/vv/configvia the standard XDG path.
Errors stay in the input bar so the line can be edited;Esc
cancels. Extensible — future verbs (:reload,:w FILE, …)
slot in without new key bindings.
- TUI theme picker (
Tkey) — overlay listing every built-in
theme;[*]marks the currently-active one,j/kmove the
cursor,Enterapplies the choice. The new theme takes effect
immediately (ncurses color pairs re-initialised in place) and
the choice is persisted to~/.config/vv/config
($XDG_CONFIG_HOME/vv/configif set) so future runs start with
the same theme.Esccloses the overlay without changing. - XDG-spec user config —
vvnow reads
$XDG_CONFIG_HOME/vv/config(default~/.config/vv/config)
at startup. Format is plain INI-stylekey = value; lines
starting with#are comments. Today onlythemeis read;
the format is extensible — future preferences (default
--threads,--decode-threads, etc.) slot in without breaking
existing files. Writes are atomic (.tmp+ rename) and preserve
any comments / other keys in place. CLI flags always win over
the config file. - TUI mouse clicks — three additive bindings on top of the
existing wheel-scroll: click a column header to sort by that
column (toggle asc/desc on repeat; updates the active column
forS/y); click a data row to scroll it to the top;
double-click a data row to open the detail pane (same as
Enter). Shift+drag continues to work as the universal escape
hatch for native terminal text selection.
v1.6.0
A broad feature release on top of 1.5.0. Highlights: bigBed / bigWig
and 2bit support via a vendored libBigWig and a hand-rolled 2bit
reader; full TUI exploration suite (column stats, sort, show/hide,
live filter, copy cell); generic Parquet range queries with column
auto-detection; markdown output and LociSSD validation; coordinate-
convention selector with UCSC and NCBI labels; color themes; LTO +
ccache static builds; and ARM64 release artifacts.
Changed
- Smarter inline truncation for
list/mapcells. The
truncator now walks every top-level comma and picks the largest
leading-element prefix that fits the column. Previous behavior
always dropped to[first, …]after the first comma, even when
[first, second]would have fit. Most visible on VCF INFO
expansions, BAM tags, and other multi-element list cells common
in real data. Falls back to char-truncation only when even one
element + ellipsis doesn't fit.
Added
-
TUI copy cell (
ykey) — copies the top-left visible cell to
the system clipboard via OSC52. Works through SSH and tmux 3.3+
with noxclip/pbcopyhelper required (modern terminal
emulators intercept the escape directly). Status bar flashes
copied: <preview>until the next key; auto-clears. -
UCSC 2bit (
.2bit) — sequence container used for genome
references (hg38.2bit, mm10.2bit). vv exposes the sequence index
rather than decoded bases (chromosome-scale strings are too large
to materialise):name,length,n_blocks(unknown-base runs),
mask_blocks(soft-masked-region runs). Endianness is detected
from the signature; long-offset 64-bit 2bit is rejected with a
clear message (usetwoBitToFafor that variant). -
--theme <name>— color palette selector. Built-in themes:
default,dark,light,solarized-dark,solarized-light
(solarizedaccepted as a synonym forsolarized-dark). Affects
both the non-interactive ASCII table (ANSI escapes) and the
ncurses TUI. Each theme provides a 256-color palette and a
16-color fallback for older terminals; thelighttheme also
suppresses zebra stripes so the table reads cleanly on a bright
background. Unknown theme names produce a clear error listing the
available choices. -
TUI live filter (
&key) — long-requested. Opens a
&<expression>input bar; expression grammar matches the
--filterCLI flag. Rows not matching the predicate are hidden
from the display; status bar showsfilter:<expr> N/M(rows
kept / total). Composes with sort (s): one full-file pass
rebuilds the combined view via the existingsource_row(display)
indirection. Empty input orEsc(in normal mode) clears.Internals: a new
rebuild_display_order()orchestrates both
sort and filter into the singlesort_order_permutation. When
both are active, rows that pass the filter are collected with
their sort keys in one pass and sorted at the end. -
--decode-threads N— separately size Arrow's CPU thread pool
(Parquet column decode and CSV / TSV parallel parsing) without
touching htslib's thread count. Defaults to--threads; useful
when cold reads bottleneck on column decompression. Bounded at
2 × hardware_concurrency().
Changed
- Release pipeline: now builds both x86_64 and aarch64
(ARM64) static Linux binaries on every tag. The release workflow
matrices overubuntu-latestand the new GitHub-hosted
ubuntu-22.04-armrunner — native builds on each architecture,
no QEMU emulation. Tarballs are named
vv-<ver>-linux-<arch>.tar.gz; a mergedSHA256SUMScovers both. - AlmaLinux 8 Docker build: dropped the
-march=x86-64
baseline flag from the build-app CMake invocation so the same
Dockerfile builds on aarch64. (-march=x86-64is the default
target on x86_64 gcc anyway, so the change is a no-op there.) - AlmaLinux 8 Docker build: rebuild every static dep + vv itself
with-flto=auto. gcc-ar / gcc-ranlib preserve LTO IR in archives
so the final link can drop unused code across library boundaries
(not just within each.a). Significant text-segment shrink vs
the previous non-LTO 15 MB static binary. - AlmaLinux 8 Docker build: install
ccache(via EPEL) and put
its compiler-symlink dir ahead of gcc-toolset-12 onPATH. A
BuildKit cache mount (id=vv-ccache) persists the compile cache
across docker builds. Requires Docker BuildKit + buildx.
Added
- TUI interactive-exploration batch — three new keybindings turn
the ncurses viewer into a real exploration tool:Sopens a per-column stats popup (count, nulls, min, max,
mean, distinct count) for the leftmost visible column. Full-file
scan with progress in the status line.ssorts by the leftmost visible column. Repeatedson the
same column toggles ascending / descending;son a different
column re-sorts ascending;uclears the sort. Numeric types
sort by raw value, others lexicographically; nulls last. Search
and the detail pane follow the sorted display order via a single
source_row(display)indirection that routes all cache lookups
through the sort permutation when active.copens a column show/hide picker overlay;Spacetoggles
the column under the cursor, hidden columns drop from the
layout, and the status bar shows ahidden:Nindicator.
--tail N— show the last N rows instead of the first N.
Mirrors-nbut operates on the tail. Reuses the
MemoryTableSourceadapter: every chunk is read (through any
active--filter) and the last N rows are sliced off, so the
result renders identically through every view / export mode
(table, TUI, TSV, CSV, JSON, Markdown, Parquet).--coords UCSC|NCBI— pick the coordinate convention for
-r. UCSC (default; aliases0-based,bed) means 0-based
half-open as in BED, bigBed, bigWig, BAM and LociSSD — the
convention introduced by Jim Kent's UCSC Genome Browser source
tree in 2000. NCBI (aliasesGenBank,1-based,tabix)
means 1-based inclusive as in GenBank (1982), VCF, GFF, and the
samtools / bcftools / tabix command lines.vv -r chr1:101-200 --coords NCBI filematches the same rows as the UCSC default
vv -r chr1:100-200 file. Conversion happens once in
apply_region_modifiers; downstream sources see normalized
UCSC.--regions-fileis always BED (UCSC) per the spec.--parquet -— write Parquet to stdout. Parquet's
footer-at-end requires seekable writes, so the data is spooled
to anmkstempstemp file under/tmp, then streamed to stdout
and unlinked. Bit-identical to writing to a file path. Enables
vv ... --parquet - | toolpipelines.- Generic Parquet range queries —
-r chr1:1000-2000 file.parquet
now works on any Parquet file with chrom/start/end columns, not just
LociSSD. Chromosome / Start / End column names are auto-detected
(common variants:Chromosome/Chrom/Chr,Start/POS/
chromStart,End/Stop/chromEnd). When auto-detection isn't
clear (or your columns have unusual names) use
--region-cols Chr,Start,End. Row-group pruning uses Parquet
ByteArray statistics on chrom plus Int statistics on Start/End;
per-row filtering inside surviving row groups is correct for
unsorted files too, just less efficient. Dictionary-encoded chrom
columns are handled transparently. --validate— LociSSD invariants checker. Verifies the
lociSSD_manifestfooter parses, the required columns
(Chromosome / Start / End / MaxEndSoFar) have the right types,
the manifest's per-chromosome row ranges cover every row
contiguously, rows are sorted by(Start, End)within each
chromosome,MaxEndSoFar[i]matchesmax(End[chrom_first..i]),
and every row'sChromosomelabel agrees with the manifest's
window. PrintsPASS/FAILper check, caps repeat violations
at 5 lines per category, exits non-zero on any failure.--md/--markdown— write a GitHub-flavored markdown table
to stdout. Useful for pasting query results into issues, READMEs,
and reports. Cells escape|as\|and turn embedded newlines
into<br>. Honours--select,--filter,-n,--no-header,
-r,--sample. Numbers keep their_thousands separators
so the rendered table stays readable.- bigBed / bigWig support via a vendored copy of
libBigWig (0.4.8, MIT-licensed,
compiled with-DNOCURLso only zlib is required). Source lives
undervendored/libBigWig/; CMake compiles it as a private static
library (libbigwig.a) and links it intovv. The static AlmaLinux 8
Docker build picks it up automatically — no new external dependency
for any distribution channel. - bigBed: the embedded autoSql definition is parsed into typed
Arrow columns (signalValue,pValue,qValue, …). A small
~150-LOC hand-rolled parser handles primitives,char[N]fixed-
width strings,enum{…}/set{…}(as strings), and arrays
(int[N]/int[fieldName]→ Arrowlist<int>). - bigWig: rendered as four columns (
chrom,start,end,value). - Range queries (
-r chr1:78-99) use libBigWig's overlap APIs
(bbGetOverlappingEntries/bwGetOverlappingIntervals); no
external index needed. - User manual at
docs/USAGE.md, with worked examples for every
flag, every output mode, the LociSSD / tabix / BCF range-query
flows, and a "by-workflow" cookbook section.docs/build_docs.sh
renders it to self-contained HTML and PDF via pandoc (with a
texlive → chromium-via-HTML fallback). - BCF range queries —
-r chr1:100-200 file.bcfnow works, using
bcf_itr_querysover an existing.csi/.tbiindex. Missing
index produces a clear hint pointing atbcftools index. --regions-file <BED>— read additional windows from a BED file's
first three columns. Combines with explicit-r; both a...
v1.1.0
What's new
--tsv/--csv/--delimiter <sep>— convert Parquet to delimited text, streamed row-group by row-group for memory efficiency--no-header— omit the header row in delimited output--color=auto/always/never— rich ANSI colors in the terminal, plain text when piped- RFC 4180 compliant CSV quoting
- Dictionary-encoded columns now show decoded values