cat can be used to both prepend a single line and then the output of something else. (I'm not sure what it's named, but it's convenient in a limited amount of scenarios - please edit the title if it's got an official naming)
Take the following example:
Somewhere on the internet there is no "bat can't syntax colorize it.
[zarthus@nomenclature ~] $ curl https://pastebin.com/raw/TLY5C6p5 -s | bat -l php
โโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ STDIN
โโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1 โ echo "file with missing syntax highlighting";
โโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
To resolve this, we can use echo and cat to concatenate the strings together.
[zarthus@nomenclature ~] $ echo '<?php' | cat - <(curl https://pastebin.com/raw/TLY5C6p5 -s)
<?php
echo "file with missing syntax highlighting";
Trying this with bat fails:
[zarthus@nomenclature ~] $ echo '<?php' | bat - <(curl https://pastebin.com/raw/TLY5C6p5 -s)
โโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ STDIN
โโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1 โ <?php
โโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ File: /proc/self/fd/12
โโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1 โ echo "file with missing syntax highlighting";
โโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
However that doesn't stop you from just piping back into bat:
$ echo '<?php' | cat - <(curl https://pastebin.com/raw/TLY5C6p5 -s) | bat -l php
โโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ STDIN
โโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1 โ <?php
2 โ echo "file with missing syntax highlighting";
โโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
In short: my suggestion is to mimic this behaviour with bat, for feature parity with cat. While it works fine with the -p switch, it destroys syntax highlighting. It's probably the categorizing of filenames that breaks this behaviour, and it might be a feature in that regard.
$ bat --version => bat 0.9.0
Thank you for the detailed report!
For this particular use case, I agree that it would be nice if things would "just work", but we can't really enable this in general. Consider what would happen if someone calls bat test.php test.js. We don't want to highlight the second file as PHP. Even if both files would be PHP files (bat test.php test2.php), it could potentially be wrong to "extend" the syntax highlighting context from the first file to the second.
Note, however, that there are many ways to make this work somehow for your case (as you also pointed out):
First, wherever you use cat above, you can also use bat:
echo '<?php' | bat - <(curl https://pastebin.com/raw/TLY5C6p5 -s) | bat -l php
Second, you can make this more symmetric by using a second shell substitution:
bat <(echo '<?php') <(curl https://pastebin.com/raw/TLY5C6p5 -s) | bat -l php
Third, you can combine the two shell substitutions into one:
bat <(echo '<?php'; curl https://pastebin.com/raw/TLY5C6p5 -s) | bat -l php
Once we are here, we are in "Useless use of ~cat~ bat" land because we can move over the subshell beyond the pipe:
bat -l php <(echo '<?php'; curl https://pastebin.com/raw/TLY5C6p5 -s)
Of course, if we prefer pipes, we can also rewrite this to:
(echo '<?php'; curl https://pastebin.com/raw/TLY5C6p5 -s) | bat -l php
That last command is probably what I would suggest for cases like this. I think it's not that bad. We can now even drop the -l php, arriving at:
(echo '<?php'; curl https://pastebin.com/raw/TLY5C6p5 -s) | bat
Aye, none of the alternatives are bad :) - thanks for the more indepth insights though! While I was thinking about this on my own the only sane non-backwards-incompatible solution I could think of was introducing some sort of flag that forces everything to be grouped in the same file.
But then again, that would have been rather meaningless (and probably a waste of development time) in the long run when good alternatives exist already, and the task I was trying to achieve wasn't performance bound anyways.
I will close this issue as I don't think there's anything to be done here; we're aware of alternatives around this (and they're not bad). It's neither a bug, nor a feature request. Merely me hoping to see if there's something special I might've been missing :)
Thanks!