sharkdp/bat

[Feature request] Add setting to enable maximum column for TSV hyghlighting

jrom99 opened this issue · 2 comments

The following file

TSV file, with bat --wrap never notes.tsv:
image

Same file, with bat --wrap never --tabs 0 notes.tsv:
image

I'm not sure what is causing the misalignment bug, but my problem is that some columns data is a lot wider than their headers, and I'd like bat to have a setting to use the largest visible width for these, since setting --tabs to an arbitrary big value applies to all columns.

I tried using column -ts $'\t' notes.tsv | bat -l tsv to columnate the data, but then bat doesn't understand the file:

image

But column -ts $'\t' -o $'\t' notes.tsv | bat -l tsv --wrap never --tabs 0 seems to work, but I think it'd be better to have it as a setting.

System information

bat 0.23.0
GNOME Terminal 3.49.92 using VTE 0.74.0 +BIDI +GNUTLS +ICU +SYSTEMD
Ubuntu 23.10 (Gnome 45 on Wayland)

Hi, thanks for sharing your feature request.

I tried using column -ts $'\t' notes.tsv | bat -l tsv to columnate the data, but then bat doesn't understand the file

That is expected, as there is no way for bat to know with a variable-space-separated file whether a field contains a space character or not and would highlight it wrongly/misleadingly.

But column -ts $'\t' -o $'\t' notes.tsv | bat -l tsv --wrap never --tabs 0 seems to work, but I think it'd be better to have it as a setting.

Nice solution. In my testing the --tabs 0 has no effect here, but maybe I'm missing something.
In terms of making a setting for it, well, bat reads the input one line at a time (especially when piping from stdin), so there is no way in advance for it to know the max width of each column. Indeed, the syntax highlighting engine wouldn't support it anyway. So I think your column pre-processing is the way to go. Now that we have $LESSOPEN support (#2444), perhaps that can also be utilized somehow - perhaps with a wrapper script - to "make it easier" than having to type the whole thing out each time you work with a tsv file?

I'm not sure what $LESSOPEN does, but it seems to be defined as LESSOPEN=| /usr/bin/lesspipe %s on my computer. I didn't know that bat read one line at a time, thanks for the information, at the end I put this in my .bashrc:

tsv() {
  column -ts $'\t' -o $'\t' "$1" | bat -l tsv --wrap never --tabs 0 --file-name "$1"
}

The --file-name parameter is really useful!