Code highlighting

Code highlighting is supported for the following languages:

LanguageExecution support
ada
asp
awk
bash
batchfile
C
cmake
crontab
C#
clojure
C++
CSS
D
diff
docker
dotenv
elixir
elm
erlang
fish
go
haskell
HTML
java
javascript
json
kotlin
latex
lua
makefile
markdown
nix
ocaml
perl
php
protobuf
puppet
python
R
ruby
rust
scala
shell
sql
swift
svelte
tcl
toml
terraform
typescript
xml
yaml
vue
zig
zsh

Other languages that are supported are:

  • nushell, for which highlighting isn't supported but execution is.
  • rust-script, which is highlighted as rust but is executed via the rust-script tool, which lets you specify dependencies in your snippet.

If there's a language that is not in this list and you would like it to be supported, please create an issue. If you'd also like code execution support, provide details on how to compile (if necessary) and run snippets for that language. You can also configure how to run code snippet for a language locally in your config file.

Enabling line numbers

If you would like line numbers to be shown on the left of a code block use the +line_numbers switch after specifying the language in a code block:

```rust +line_numbers
   fn hello_world() {
       println!("Hello world");
   }
```

Selective highlighting

By default, the entire code block will be syntax-highlighted. If instead you only wanted a subset of it to be highlighted, you can use braces and a list of either individual lines, or line ranges that you'd want to highlight.

```rust {1,3,5-7}
   fn potato() -> u32 {         // 1: highlighted
                                // 2: not highlighted
       println!("Hello world"); // 3: highlighted
       let mut q = 42;          // 4: not highlighted
       q = q * 1337;            // 5: highlighted
       q                        // 6: highlighted
   }                            // 7: highlighted
```

Dynamic highlighting

Similar to the syntax used for selective highlighting, dynamic highlighting will change which lines of the code in a code block are highlighted every time you move to the next/previous slide.

This is achieved by using the separator | to indicate what sections of the code will be highlighted at a given time. You can also use all to highlight all lines for a particular frame.

```rust {1,3|5-7}
   fn potato() -> u32 {

       println!("Hello world");
       let mut q = 42;
       q = q * 1337;
       q
   }
```

In this example, lines 1 and 3 will be highlighted initially. Then once you press a key to move to the next slide, lines 1 and 3 will no longer be highlighted and instead lines 5 through 7 will. This allows you to create more dynamic presentations where you can display sections of the code to explain something specific about each of them.

See this real example of how this looks like.

asciicast

Including external code snippets

The file snippet type can be used to specify an external code snippet that will be included and highlighted as usual.

```file +exec +line_numbers
path: snippet.rs
language: rust
```

Showing a snippet without a background

Using the +no_background flag will cause the snippet to have no background. This is useful when combining it with the +exec_replace flag described further down.

Adding highlighting syntaxes for new languages

presenterm uses the syntaxes supported by bat to highlight code snippets, so any languages supported by bat natively can be added to presenterm easily. Please create a ticket or use this as a reference to submit a pull request to make a syntax officially supported by presenterm as well.

If a language isn't natively supported by bat but you'd like to use it, you can follow this guide in the bat docs and invoke bat directly in a presentation:

```bash +exec_replace
bat --color always script.py
```

note

Check the code execution docs for more details on how to allow the tool to run exec_replace blocks.