From da26523acca4654e1d77fdbbd095a75d5bf17e69 Mon Sep 17 00:00:00 2001 From: Uros Mrkobrada <59397844+uros-5@users.noreply.github.com> Date: Mon, 12 Feb 2024 01:04:47 +0100 Subject: [PATCH] update README.md --- README.md | 141 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 104 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 55eaf72..b6673f6 100644 --- a/README.md +++ b/README.md @@ -1,65 +1,132 @@
- HTMX-LSP logo - HTMX-LSP logo + HTMX-LSP logo + HTMX-LSP logo
- crates.io - build status + crates.io + build status

its so over

-## LSP +## Installation -Right now this is very much so a work in progress and currently provides basic autocomplete for _most_ HTMX attributes. We have reached a point where I could use help! If you want to fill in documentation or help with autocompletes please open an issue/pr! +```console +cargo install htmx-lsp2 +``` -## Integration +## Configuration -### Neovim +```json +{ + "lang": "rust", + "template_ext": "jinja", + "templates": ["./templates"], + "js_tags": ["./frontend"], + "backend_tags": ["./backend"] +} +``` -`htmx-lsp` can be installed via Mason. And can be configured with `lspconfig` +## Supported languages -```lua -local lspconfig = require('lspconfig') --- ... -lspconfig.htmx.setup{} -``` +Go, Python, JavaScript, TypeScript, Rust -Another option is to use [lsp-debug-tools](https://github.com/ThePrimeagen/lsp-debug-tools.nvim) +## When to use htmx-lsp or this lsp ? -### VSCode +If you are working on small hello world example web app, then you probably don't need this improved version of htmx-lsp. -No published extension yet, but there is a development extension in the [`clients/vscode`](client/vscode/README.md) folder (with setup instructions) +For bigger projects(many templates, many backend routes, few JavaScript modules) you should try this. -## Development +## Difference between htmx-lsp and this lsp -### General +### Backend/frontend tags -As of right now the general goal is just to provide completion for any `-` -character received without even looking at the context. +Tags are similar to JSDoc comments. In some sense they act like documentation for htmx part of your application. +They are helpful when you arrive at some htmx project. In order to understand codebase you constantly need to browse +through files or use global search for every part of project. +With tags you can simply use goto definition feature for that attribute and _you are exactly where you need to be_. -After that, would be to perform some code actions that make sense and allow for -amazing utility around htmx. +#### Example -```console -htmx-lsp -f /path/to/file --level [OFF | TRACE | DEBUG | INFO | WARN | ERROR] +```rust +fn example() { + // some code ... + + // part of app that is 'connected' with htmx template + // this is tag hx@tag1 + // ... +} +``` + +```html + +hello world ``` -### Build +It is also possible to have multiple tags on one element. Some tag is in your Go function, other can be in JavaScript. +This improves _locality of behavior_, you don't need to think too much, you just quickly read and act. -```console -cargo build +If you use editor that behind the scenes uses TreeSitter, then you can include one query in `textobjects.scm` +that can move your cursor to hx-lsp tag: -# OR auto-build on file save, requires `cargo-watch` -cargo install cargo-watch -cargo watch -x build +```scheme +( + (attribute_name) @attr + (quoted_attribute_value + (attribute_value) @class.inside + ) @class.around + (#eq? @attr "hx-lsp") +) ``` -## Contributors +To have syntax highlighting for tags in your backend language or JavaScript use this query(it's _comment grammar_, `highlights.scm`): -
- - - -
+```scheme +("text" @hint + (#match? @hint "^(hx@)")) +``` + +And here is one for template(it's _html grammar_, `highlights.scm`): + +```scheme +((attribute_name) @keyword + (quoted_attribute_value + (attribute_value) @function + ) + (#eq? @keyword "hx-lsp") +) +``` + +#### Goto reference + +There are situations where you tag is used in multiple places in one template or in many templates that are located deep in your directory tree. +To avoid messing with global search just call goto reference on tag definition and you can check each htmx-lsp instance. + +https://github.com/uros-5/htmx-lsp2/assets/59397844/786c9312-6792-4d22-b1b8-c4b00bdc58f3 + +If there is only one reference for tag, then you will be redirected directy to that location. + +#### Goto definition + +https://github.com/uros-5/htmx-lsp2/assets/59397844/dc744a59-8902-44bf-9bd0-1a1d6188d4ca + +#### Goto implementation + +If your editor doesn't support TreeSitter, you can use goto implementation feature for navigating between `htmx-lsp` attributes. +When you are deep in some template, searching for `htmx-lsp` attribute can be tedious, so this feature can help use navigating to our target much faster. + +https://github.com/uros-5/htmx-lsp2/assets/59397844/032c32f8-2c5f-4401-8999-2792383dc49c + +#### Incremental parsing for TreeSitter + +One problem with htmx-lsp is that it doesn't use full power of TreeSitter, and that is incremental parsing. +Right now for every change inside of template entire file is sent and parsed by TreeSitter. And second problem is that only takes first +change that is sent by text editor. +So what if you use multiple cursors and you start applying changes for text document ? And what if client only supports +incremental synchronization for `didChange` lsp feature ? +This forked version of htmx-lsp aims to fix this issues, not just for template part, but also for backend languages. + +#### VSCode plugin + +It's still work in progress. Right now it's usable in debug mode.