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.