[HN Gopher] Bat: Cat with syntax highlighting
       ___________________________________________________________________
        
       Bat: Cat with syntax highlighting
        
       Author : Olshansky
       Score  : 139 points
       Date   : 2025-10-05 22:21 UTC (2 days ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | iefbr14 wrote:
       | cat <whatever> | highlight --force -O xterm256 | less -SRNI
       | 
       | works fine for me.
        
         | b_e_n_t_o_n wrote:
         | and rsync works fine for people too, I guess that's why nobody
         | uses Dropbox
        
           | yjftsjthsd-h wrote:
           | Dropbox and rsync do different things. It looks like this
           | does essentially the same thing.
        
             | tclancy wrote:
             | Assuming perfect memory and you never make typos they are
             | exactly the same. For most installs. Or distros. Probably.
        
               | GodelNumbering wrote:
               | You don't need to memorize
               | 
               | alias bat='f(){ cat "$1" | highlight --force -O xterm256
               | | less -SRNI; }; f'
        
               | lynndotpy wrote:
               | For all the other issues people have pointed out, this
               | assumes you have `highlight` installed.
        
               | yjftsjthsd-h wrote:
               | > Assuming perfect memory and you never make typos they
               | are exactly the same.
               | 
               | You can make an alias.
               | 
               | > For most installs. Or distros. Probably.
               | 
               | Comparing https://repology.org/project/bat-cat/packages
               | vs https://repology.org/project/highlight/packages
               | appears to show them with approximately equal
               | availability. (Unless you're trying some other point, in
               | which case I don't follow.)
        
             | inopinatus wrote:
             | I don't know if it still uses librsync but for a long time
             | Dropbox was based directly upon it.
             | 
             | Whether this proves or disproves anything in re syntax
             | highlighting utilities I leave as an exercise.
        
             | b_e_n_t_o_n wrote:
             | It's a reference to this:
             | 
             | https://news.ycombinator.com/item?id=8863
        
         | spookie wrote:
         | I call cat when I need to pipe or copy something, and just bat
         | if I wanna read it myself. I find this as a good compromise, I
         | like how bat formats things.
         | 
         | Your solution would be ok with an alias as well, so thanks.
         | Might try it just so I dont need yet another program lying
         | around
        
           | seedie wrote:
           | You can still pipe bat output as it falls back to unformated
           | output when it detects a non-interactive terminal.
           | https://github.com/sharkdp/bat?tab=readme-ov-file#file-
           | conca...
        
         | postepowanieadm wrote:
         | But it's not in rust.
        
         | MangoToupe wrote:
         | I don't seem to have "highlight" on my system.
        
           | JdeBP wrote:
           | That's because it is in ports rather than in base. (-:
           | 
           | * https://freshports.org/textproc/highlight/
           | 
           | * https://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/textproc/h
           | i...
           | 
           | * http://ports.su/textproc/highlight
           | 
           | * https://ports.macports.org/port/highlight/
        
             | MangoToupe wrote:
             | Why not just install `bat` at that point?
        
         | freddie_mercury wrote:
         | That has git integration, like bat does? That shows non-
         | printable characters like bat does? That allows you to
         | concatenate and page multiple files at once like bat does? That
         | supports the --line-range option like bat does? You can pipe
         | the output of tail -f through your alias?
         | 
         | I guess if all you did was read the headline of the post you
         | could assume your alias does all the same things as bat.
        
           | feelamee wrote:
           | looks like you are right, but... I almost never used all of
           | this features with bat. Maybe tail -f sometimes. Do you
           | really need this in daily workflow?
        
             | freddie_mercury wrote:
             | I use the syntax highlighting of manpages, fd, ripgrep, and
             | git pretty regularly.
             | 
             | I also use the fzf previewer with --range-limited pretty
             | frequently.
        
           | petepete wrote:
           | It's clearly a joke in the vein of being able to recreate
           | Dropbox with an FTP account, curlftpfs, and SVN/CVS.
        
           | hnlmorg wrote:
           | Not the GP and I do like bat, but to answer your questions:
           | 
           | > That shows non-printable characters like bat does?
           | 
           | cat does actually support that via the flags with -v (you can
           | also use -t and -e to view tab and line endings too)
           | 
           | > That allows you to concatenate and page multiple files at
           | once like bat does?
           | 
           | cat is literally called "cat" because it's intended purpose
           | is concatenation.
           | 
           | It's not a pager though the GPs example did pipe to less
           | anyway.
           | 
           | > That supports the --line-range option like bat does?
           | 
           | 'tail' and 'head' would be muscle memory to a lot of people
           | and not that different in terms of number of keystrokes.
           | 
           | But I do take your point that it's nice to have that built
           | into your pager.
           | 
           | > You can pipe the output of tail -f through your alias?
           | 
           | I couldn't see why not. tail -f isn't doing anything weird
           | with the fd.
           | 
           | ------
           | 
           | I'm not arguing against using bat though. I have it aliased
           | to cat on my own machines, so I clearly and would recommend
           | bat. But I do think some people might be surprised how far
           | you can get with coreutils if bat wasn't available
        
             | em-bee wrote:
             | highlight is not part of coreutils either. at least not on
             | fedora.
        
         | MisterTea wrote:
         | You don't need cat:                 highlight --force -O
         | xterm256 < whatever | less -SRNI
        
           | dicytea wrote:
           | Sadly does not work on fish because the developers does not
           | believe that users are intelligent enough to understand the
           | obvious and intuitive outcome of flipping ">" (a valid
           | operator in fish).
        
         | em-bee wrote:
         | i tried that:                   cat .bashrc  | highlight
         | --force -O xterm256 | less -SRNI
         | 
         | everything is green, except line numbers are black (which comes
         | from less), but                   bat .bashrc
         | 
         | shows actual syntax highlighting.
         | 
         | so apparently, no, it doesn't work.
         | 
         | to be fair, this is how it works:                  cat .bashrc
         | | highlight --syntax shellscript -O ansi | less -R
         | 
         | to avoid getting caught by the _useless use of cat_ police,
         | this does too:                  highlight --syntax shellscript
         | -O ansi .bashrc | less -R
         | 
         | however, i have to tell it which syntax to use
         | 
         | but to its credit, highlight even has support for pike, which
         | bat doesn't (yet) (fixed that for myself, at least)
         | 
         | so overall, bat wins.
        
       | b_e_n_t_o_n wrote:
       | This is super nice!
        
       | perihelions wrote:
       | Other threads about (IMHO very nice) tools by this developer (fd,
       | hexyl, and hyperfine),
       | 
       | https://news.ycombinator.com/from?site=github.com/sharkdp
        
         | JamesCoyne wrote:
         | Also "numbat". A favorite of mine
        
         | seemaze wrote:
         | shardkp makes my terminal a home. Thanks sharkdp!
        
       | Crespyl wrote:
       | I've been using bat for several years and it's been a really nice
       | drop-in replacement for cat/less/etc.
       | 
       | Like rg, it's one of those "rewrite it in rust" projects that
       | turned out to actually be quite well thought through.
        
         | oncallthrow wrote:
         | "rewrite it in rust" gets a lot of hate, but generally the
         | people rewriting things in Rust actually give a shit, which
         | tends to pay dividends. I say this as someone who doesn't use
         | Rust and doesn't particularly like it or its community.
        
           | ajkjk wrote:
           | does... it... get a lot of hate? I've only ever heard of it
           | positively.
        
             | DonaldPShimoda wrote:
             | If you hang around certain spaces of the internet (here,
             | Reddit, etc), any sufficiently popular post about a Rust-
             | related project is bound to accrue some comments along the
             | lines of "Rust is actually not that great", "rewriting is
             | bound to gain new bugs that won't be caught", "the borrow
             | checker is practically byzantine and not worth the
             | trouble", "C is perfectly adequate", "more advanced type
             | systems are less useful than writing more tests", etc. I
             | would even say that comments of this nature constituted a
             | good chunk of the discussion around the US government's
             | C-to-Rust initiative (a very popular post with a lot of
             | comments).
        
             | nine_k wrote:
             | It's often framed as useless monkey business, rewriting
             | working software to produce a copy of it but in another
             | language, for questionable benefits.
             | 
             | I'd say that rewriting anything in any language (even in
             | the same language) would remove large amounts of cruft, and
             | add long-missing neat things that are easier to add when
             | you build from scratch, and with a good understanding which
             | the original authors lacked. Often it also can afford using
             | a better architecture, see rg vs grep: grep has many
             | brilliant technical solutions, but making it multithreaded
             | would be a major rewrite anyway.
        
             | pityJuke wrote:
             | Along with everything else mentioned, there is a certain
             | group of people who consider the language "woke". Usually
             | that's not the critique you see on HN, but be wary of it.
        
           | hnlmorg wrote:
           | People who wrote the coreutils give a shit too.
           | 
           | The reason "rewrite in Rust" gets a lot of hate is because
           | it's often a poorer replica in that it supports a subset of
           | features and sometimes so littered with unsafe blocks that
           | it's barely any safer than their C counterparts.
           | 
           | Ripgrep and bat are the exceptions in that they're
           | modernisations in every sense of the term. They're safer,
           | have more modern features, and better defaults. Even if you
           | don't give a crap about memory safety, there's a reason to
           | use ripgrep and bat.
           | 
           | Personally I really don't see the benefit in rewriting stuff
           | unless you're bringing other modernisations to the table too.
           | But I suspect for some people, it's more of an exercise to
           | learn Rust than it is an ambition to displace a particular
           | coreutil.
        
             | sureglymop wrote:
             | I have no issue with rewriting the coreutils in rust
             | technically but I also don't think it's that interesting.
             | They work just fine as they are.
             | 
             | However what I truly don't understand is using a different
             | license. For something so fundamental, please just let that
             | be the same.
             | 
             | But I think there are a lot more great examples. I have
             | used pandas and I like polars. I have used latex but I like
             | typst. People are creating generally valuable tools that
             | bring something new to the table. More competition and
             | diversity is rarely a bad thing.
        
         | tetris11 wrote:
         | I use it on and off, but for the life of me can't get over the
         | issue that line wrapping is the default behaviour with no easy
         | switch
        
           | rascul wrote:
           | the --wrap options don't do it for you?
        
             | tetris11 wrote:
             | oh yeah `--wrap never`, I guess I should setup an alias --
             | thanks
        
               | stephenlf wrote:
               | I don't even think you need an alias. There's a bat
               | config file (`bat --config-file` to find it). You can
               | probably drop `--wrap never` there. I include a few
               | different `--map-syntax` declarations there.
        
         | baby wrote:
         | Check exa
        
           | KerrAvon wrote:
           | yeah, exa is a very convincing argument
           | 
           | it replaces default `ls` in interactive shells on some
           | distros, which is where I encountered it
        
           | stouset wrote:
           | The original author appears to have abandoned exa, but it has
           | continued life as eza.
        
         | Olshansky wrote:
         | 100%. I'd add fd to the list as well.
        
       | layer8 wrote:
       | As a more general-purpose tool, there is also GNU Source-
       | highlight [0] which comes in most distributions. For example to
       | use with less: https://www.gnu.org/software/src-highlite/source-
       | highlight.h...
       | 
       | [0] https://www.gnu.org/software/src-highlite/
        
         | binaryturtle wrote:
         | In Safari I get "Too Many Requests" error; in Firefox ESR I get
         | a straight "403 Forbidden". What the heck is going on with
         | gnu.org?
         | 
         | Edit, with cURL it's OK... 200.
         | 
         | That makes no sense.
        
       | oxguy3 wrote:
       | Neat! One of those tools that I would never have thought to look
       | for, but I'm sure I'll be glad I have.
        
       | arjie wrote:
       | Very cool tool. It's perfect for the "take a quick look" use-
       | case.
       | 
       | I just downloaded it on MacOS and when I ran it the first time it
       | took a really long time on a one-line JSON which disappointed me
       | but then any subsequent run on anything was fast. I'd completely
       | forgotten about MacOS doing that thing on first run.
       | 
       | Uses the pager for large files automatically etc. Very nice.
        
         | steezeburger wrote:
         | What thing does MacOS do on first run?
        
           | cobbal wrote:
           | It phones home to apple malware servers, among other things:
           | https://lapcatsoftware.com/articles/2024/2/3.html
        
       | dang wrote:
       | Related. Others?
       | 
       |  _bat: A cat(1) Clone with Wings_ -
       | https://news.ycombinator.com/item?id=33382307 - Oct 2022 (2
       | comments)
       | 
       |  _bat, a cat(1) clone with syntax highlighting, Git integration
       | written in Rust_ - https://news.ycombinator.com/item?id=24850244
       | - Oct 2020 (6 comments)
       | 
       |  _Bat: A cat(1) clone with wings_ -
       | https://news.ycombinator.com/item?id=17887819 - Aug 2018 (12
       | comments)
       | 
       |  _Bat: A cat(1) clone with wings_ -
       | https://news.ycombinator.com/item?id=17849535 - Aug 2018 (1
       | comment)
       | 
       |  _Bat: cat(1) clone with syntax highlighting and Git integration_
       | - https://news.ycombinator.com/item?id=16968755 - May 2018 (1
       | comment)
        
       ___________________________________________________________________
       (page generated 2025-10-07 23:00 UTC)