text processing utilities

Highlight News

Language Server Protocol Support

Beginnend mit Version 4.0 nutzt highlight das LS-Protokoll, um seine Ausgabe zu verbessern.

Was bedeutet das?

Viele Editoren nutzen "Language Server", um Syntaxinformationen verschiedener Programmiersprachen darzustellen, ohne dazu selbst ein tiefes Verständnis der Syntax implementieren zu müssen. Der prominenteste Editor mit LSP-Support ist VSCode. Viele Language Server wurden mit und für VSCode entwickelt, da MS die LSP-Spezifikation veröffentlicht hat und VSCode die Referenz ist. Andere bekannte Editoren mit LSP Support sind Kate, vim, Emacs und Eclipse.

Mehr Informationen dazu: https://langserver.org/

Beispiele

Rust-Code mit Default-Highlighting

//http://rosettacode.org/wiki/Fibonacci_n-step_number_sequences#Rust

struct GenFibonacci {
    buf:    Vec<u64>,
    sum:    u64,
    idx:    usize,
}

impl Iterator for GenFibonacci {
    type Item = u64;
    fn next(&mut self) -> Option<u64> {
        let result = Some(self.sum);
        self.sum -= self.buf[self.idx];
        self.buf[self.idx] += self.sum;
        self.sum += self.buf[self.idx];
        self.idx = (self.idx + 1) % self.buf.len();
        result
    }
}

fn print(buf: Vec<u64>, len: usize) {
    let mut sum = 0;
    for &elt in buf.iter() { sum += elt; print!("\t{}", elt); }
    let iter = GenFibonacci { buf: buf, sum: sum, idx: 0 };
    for x in iter.take(len) {
        print!("\t{}", x);
    }
}

fn main() {
    print!("Fib2:");
    print(vec![1,1], 10 - 2);

    print!("\nFib3:");
    print(vec![1,1,2], 10 - 3);

    print!("\nFib4:");
    print(vec![1,1,2,4], 10 - 4);

    print!("\nLucas:");
    print(vec![2,1], 10 - 2);
}

Rust-Code mit LSP Semantic-Token und Hover-Informationen

//http://rosettacode.org/wiki/Fibonacci_n-step_number_sequences#Rust

struct GenFibonacci {
    buf:    Vec<u64>,
    sum:    u64,
    idx:    usize,
}

impl Iterator for GenFibonacci {
    type Item = u64;
    fn next(&mut self) -> Option<u64> {
        let result = Some(self.sum);
        self.sum -= self.buf[self.idx];
        self.buf[self.idx] += self.sum;
        self.sum += self.buf[self.idx];
        self.idx = (self.idx + 1) % self.buf.len();
        result
    }
}

fn print(buf: Vec<u64>, len: usize) {
    let mut sum = 0;
    for &elt in buf.iter() { sum += elt; print!("\t{}", elt); }
    let iter = GenFibonacci { buf: buf, sum: sum, idx: 0 };
    for x in iter.take(len) {
        print!("\t{}", x);
    }
}

fn main() {
    print!("Fib2:");
    print(vec![1,1], 10 - 2);

    print!("\nFib3:");
    print(vec![1,1,2], 10 - 3);

    print!("\nFib4:");
    print(vec![1,1,2,4], 10 - 4);

    print!("\nLucas:");
    print(vec![2,1], 10 - 2);
}

Ausgabe von Syntax-Fehlern

//http://rosettacode.org/wiki/Fibonacci_n-step_number_sequences#Rust

struc GenFibonacci {expected one of `!` or `::`, found `GenFibonacci` expected one of `!` or `::`
    buf:    Vec<u64>,
    sum:    u64,
    idx:    usize,
}

Profile

Language Server werden in lsp.conf konfiguriert:

Servers = {

  { Server="clangd", Exec="clangd", Syntax="c", Options={"--log=error"} },
  { Server="ccls", Exec="ccls", Syntax="c", Options={"-v=-3", "--"} },
  { Server="ccls-objc", Exec="ccls", Syntax="objc", Options={"-v=-3", "--"} },

  { Server="gopls", Exec="gopls", Syntax="go", Options={} },

  { Server="rls", Exec="rls", Syntax="rust", Options={} },
  { Server="rust-analyzer", Exec="rust-analyzer", Syntax="rust", Delay=250, Options={} },

  { Server="pyls", Exec="pyls", Syntax="python", Options={"--check-parent-process"} },

  { Server="R", Exec="R", Syntax="r", Options={"--slave", "-e", "languageserver::run()"} },

  { Server="clangd-win", Exec="F:\\LLVM\\bin\\clangd.exe", Syntax="c", Options={"--log=error"} },

}

Diese Profileinstellungen können auch mit den jeweiligen --ls-* Optionen gesetzt werden (siehe highlight -h).

Optionen

Kommandozeilenoptionen:

     --ls-profile=<server>      read LSP configuration from lsp.conf
     --ls-delay=<ms>            set server initialization delay
     --ls-exec=<bin>            set server executable name
     --ls-option=<option>       set server CLI option (can be repeated)
     --ls-hover                 execute hover requests (HTML output only)
     --ls-semantic              retrieve semantic token types (requires LSP 3.16)
     --ls-syntax=<lang>         set syntax which is understood by the server
     --ls-syntax-error          retrieve syntax error information
                                  (assumes --ls-hover or --ls-semantic)
     --ls-workspace=<dir>       set workspace directory to init. the server

Wichtig: LSP-Funktionen erwarten absolute Dateipfade.

Beispiele

highlight -I --ls-profile ccls --ls-workspace '/home/andre/Projekte/c' ⤦
           /home/andre/Projekte/c/re.cpp  --ls-hover ⤦
           > /home/andre/Projekte/c/re.cpp.ccls.html

highlight --ls-profile rls --ls-workspace '/home/andre/Projekte/rust/hello_world' ⤦
           /home/andre/Projekte/rust/hello_world/src/main.rs ⤦
           --outdir ~/test_out

highlight -I --ls-profile clangd --ls-workspace '/home/andre/Projekte/export/highlight-4.0.beta1/src/'  ⤦
           /home/andre/Projekte/export/highlight-4.0.beta1/src/core/datadir.cpp  --out-format html ⤦
           -s base16/chalk --ls-semantic --ls-syntax-error

Die GUI enthält einen LSP-Tab mit den entsprechenden Optionen.

Tupel7