Git Product home page Git Product logo

awk-language-server's Introduction

AWK Language Server

tests npm

Implementation of AWK Language Server based on tree-sitter and tree-sitter-awk.

Features

  • Syntax highlighting
  • Diagnostics
  • Autocomplete
    • Builtins
    • User defined symbols
  • Hints on hover
    • Builtins
    • User defined symbols
  • Go to definition
  • Code outline & symbol references
  • Document symbols
  • Workspace symbols
  • Rename symbols
  • Code formatting (requires prettier-plugin-awk)

How to use with editors

VSCode

VSCode extension is developed as part of this project and can be downloaded from marketplace here.

Emacs

Add to your config:

(with-eval-after-load 'eglot
  (add-to-list 'eglot-server-programs
               '(awk-mode . ("awk-language-server"))))

Support is built-in, so no action is needed besides turning lsp-mode on.

Vim

  • npm install -g "awk-language-server@>=0.5.2"
  • Choose and install plugin with support for LSP (some examples are below).
  • Configure plugin to use awk-language-server.

Add following to .vimrc:

call ale#linter#Define('awk', {
\   'name': 'awk-language-server',
\   'lsp': 'stdio',
\   'executable': 'awk-language-server',
\   'command': '%e',
\   'project_root': { _ -> expand('%p:h') }
\})

Note that with such configuration project_root will be set to directory containing opened awk file.

Edit config with :CocConfig command and add the following:

{
  "languageserver": {
    "awk": {
      "command": "awk-language-server",
      "args": [],
      "filetypes": ["awk"]
    }
  }
}

It works partially unless support for multi-root workspaces is implemented by vim-lsp.

Add to your .vimrc:

if executable('awk-language-server')
    au User lsp_setup call lsp#register_server({
        \ 'name': 'awk-language-server',
        \ 'cmd': {server_info->['awk-language-server']},
        \ 'allowlist': ['awk'],
        \ })
endif

Nvim

A default config for awk-language-server was merged into nvim-lspconfig. It works only if workspaceFolders requests are handled and a default handler for these was only just set to be added upstream in Neovim 0.7, so the config itself is gated for use only in Neovim >= v0.7. For users below that version, please use a manual config that handles these requests by adding the following to your init.vim (or init.lua):

lua << EOF
local configs = require('lspconfig.configs')
local lspconfig = require('lspconfig')
if not configs.awklsp then
  configs.awklsp = {
    default_config = {
      cmd = { 'awk-language-server' },
      filetypes = { 'awk' },
      single_file_support = true,
      handlers = {
        ['workspace/workspaceFolders'] = function()
          return {{
            uri = 'file://' .. vim.fn.getcwd(),
            name = 'current_dir',
          }}
        end
      }
    },
  }
end
lspconfig.awklsp.setup{}
EOF

Notes

AWK Language Server supports AWKPATH. If you prefer to place all your awk libs in some directory and then @include it without dir name, then simply pass this env variable to your editor of choice.

AWKPATH=./include vim main.vim

or

export AWKPATH=./include
vim main.vim

Check this cool project for inspiration.

Contributing

Thanks for considering it.

Please check this guide.

awk-language-server's People

Contributors

beaglefoot avatar dependabot[bot] avatar hi-angel avatar lilibyte avatar terminalfi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

awk-language-server's Issues

"else" seemingly not parsed correctly

I have some working awk scripts to convert data files into other formats. They include if-else constructs, which are shown as errors in your addin to vs-code. I tried several changes like adding semicolon, different spaces in different places, and braces. Some way or other it shows problems.
Any idea?

A minimal test case (Test.awk):

BEGINFILE {
    if( FILENAME == "Test.awk" )
        print "Test"
    else
        print "not Test"
}

gawk -f Test.awk Test.awk
GNU Awk 5.1.0, API: 3.0 (GNU MPFR 3.1.5, GNU MP 6.1.2)
Error message in the addin for this is "Syntax error: missing identifier [5,25]". But of course it works as intended and gawk itself doesn't show any errors.

snip not work

1, seems somewhere did not set for snip compl item:

item: {'label': 'for', 'data': {'type': 2}, 'kind': 15}

e.g: no insertTextFormat is 2 found.

  1. perhaps should be using 'prefix' as its label, or following patch should be required.
diff --git a/server/snippets.json b/server/snippets.json
index f7ea08b..aa3bdab 100644
--- a/server/snippets.json
+++ b/server/snippets.json
@@ -39,13 +39,13 @@
         "description": "! operator",
         "prefix": "not",
         "body": [
             "!${1:expression}"
         ]
     },
-    "compare to": {
+    "compare-to": {
         "description": "comparison operator",
         "prefix": "compare-to",
         "body": [
             "${1:expression} ${2|<,>,<=,>=,==,!=|} ${3:expression}"
         ]
     },
@@ -68,13 +68,13 @@
         "prefix": "if",
         "body": [
             "if (${1:condition})",
             "\t$0"
         ]
     },
-    "if else": {
+    "if-else": {
         "description": "if else operator",
         "prefix": "if-else",
         "body": [
             "if (${1:condition})",
             "\t${2:print}",
             "else",
@@ -87,13 +87,13 @@
         "prefix": "while",
         "body": [
             "while (${1:condition})",
             "\t$0"
         ]
     },
-    "do while": {
+    "do-while": {
         "description": "do while operator",
         "prefix": "do-while",
         "body": [
             "do",
             "\t$0",
             "while (${1:condition})"

RangeError: Maximum call stack size exceeded

Hi, I'm trying to run the language server using emacs' lsp-mode,
but the server is crashing shortly after starting with the following
stderr output:

Language Server is started.
node:internal/fs/utils:248
function getDirents(path, { 0: names, 1: types }, callback) {
^

RangeError: Maximum call stack size exceeded
at getDirents (node:internal/fs/utils:248:20)
at readdirSync (node:fs:1551:34)
RangeError: Maximum call stack size exceeded
at getAwkFilesInDir (<...>/nodejs/20.7.0/lib/node_modules/awk-language-server/out/io.js:22:26)

Same thing with node versions v18.5.0 and v20.7.0.

Tracing the calls from lsp-mode to the awk language server, it appears
that emacs is receiving a request for 'workspace/workspaceFolders', then
sending its response 'workspace/workspaceFolders' with params:

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": [
        {
            "uri": "file:///..."
        },
        etc...
    ]
}

At which point the error happens.
Do you know why this might be? A problem on the lsp-mode side or with the language server?

Enhance automatically generated snippets

Use placeholders instead of:

  • var
  • file
  • expr-list
  • fmt
  • cmd-line
  • how

and the same terms enclosed inside square brackets. To be clear, generate: getline ${1:var} <${2:file} instead of getline var <file.

BTW, I also suggest preprocess initial terms replacing them for more human readable ones:

  • var -> variable
  • file -> path/to/file
  • expr-list -> expressions
  • fmt -> format
  • cmd-line -> command

In other words, generate: getline ${1:variable} <${2:path/to/file} instead of getline var <file.

Install > missing chmod +x

Hi,

Tickled that there's an awk LSP. Thank you!

A slight install issue, ../lib/node_modules/awk-language-server/out/cli.js needs its execution bit set.

Test case

With a fresh install:

  • # npm i -g awk-language-server
  • $ awk-language-server faults with /usr/local/bin/awk-language-server: Permission denied.

Work-around

# cd /usr/local/bin
# chmod +x ../lib/node_modules/awk-language-server/out/cli.js

Error when running "npm update -g"

When running npm update -g I'm getting this error

$ npm update -g
npm ERR! code 1
npm ERR! path /opt/homebrew/lib/node_modules/awk-language-server/node_modules/tree-sitter-awk
npm ERR! command failed
...

This only happened after upgrading NodeJS to v21

Language server won't start due to invalid url

I've installed the server with:

$ doas npm install --global awk-language-server

I wanted to use it with neovim. However, it exits immediately when opening an awk script. Trying to execute it directly from the command line yields:

$ awk-language-server test.awk                                                                                                                                                                     13:50
Language Server is started.
(node:16701) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
node:internal/deps/undici/undici:4813
            throw new TypeError("Failed to parse URL from " + input, { cause: err });
                  ^

TypeError: Failed to parse URL from /usr/lib/node_modules/awk-language-server/node_modules/web-tree-sitter/tree-sitter.wasm
    at new Request (node:internal/deps/undici/undici:4813:19)
    at Agent.fetch2 (node:internal/deps/undici/undici:5505:29)
    ... 4 lines matching cause stack trace ...
    at /usr/lib/node_modules/awk-language-server/node_modules/web-tree-sitter/tree-sitter.js:1:144
    at Object.<anonymous> (/usr/lib/node_modules/awk-language-server/node_modules/web-tree-sitter/tree-sitter.js:1:170)
    at Module._compile (node:internal/modules/cjs/loader:1105:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1159:10) {
  [cause]: TypeError [ERR_INVALID_URL]: Invalid URL
      at new NodeError (node:internal/errors:377:5)
      at URL.onParseError (node:internal/url:563:9)
      at new URL (node:internal/url:643:5)
      at new Request (node:internal/deps/undici/undici:4811:25)
      at Agent.fetch2 (node:internal/deps/undici/undici:5505:29)
      at Object.fetch (node:internal/deps/undici/undici:6332:20)
      at fetch (node:internal/bootstrap/pre_execution:196:25)
      at /usr/lib/node_modules/awk-language-server/node_modules/web-tree-sitter/tree-sitter.js:1:15041
      at /usr/lib/node_modules/awk-language-server/node_modules/web-tree-sitter/tree-sitter.js:1:15262
      at /usr/lib/node_modules/awk-language-server/node_modules/web-tree-sitter/tree-sitter.js:1:144 {
    input: '/usr/lib/node_modules/awk-language-server/node_modules/web-tree-sitter/tree-sitter.wasm',
    code: 'ERR_INVALID_URL'
  }
}

Node.js v18.3.0

The file, however, does exist:

$ ls /usr/lib/node_modules/awk-language-server/node_modules/web-tree-sitter -l                                                                                                                     
.rw-r--r--  783 root 16 Jun 13:47  package.json
.rw-r--r-- 4.1k root 16 Jun 13:47  README.md
.rw-r--r-- 5.0k root 16 Jun 13:47  tree-sitter-web.d.ts
.rw-r--r--  51k root 16 Jun 13:47  tree-sitter.js
.rwxr-xr-x 171k root 16 Jun 13:47  tree-sitter.wasm

Not sure what I am doing wrong.

Multidimensional array index is not recognized

Given the following test.awk script:

BEGIN {
  array["foo", "bar"] = "hello world"

  print "index [\"foo\"] is" (("foo") in array ? "" : "n't") " part of the array"
  print "index [\"foo\",\"bar\"] is" (("foo", "bar") in array ? "" : "n't") " part of the array"
}

The index ("foo", "bar") provides a Syntax error when editing the script with nvim and the awk-language-server plugin.
The index ("foo") doesn't show any error.

npm install fails

npm install "awk-language-server@>=0.5.2"
fails with:
npm ERR! gyp: /usr/include/node16/common.gypi not found (cwd: /home/user/.my_tmp/tests/node_modules/tree-sitter-awk) while reading includes of binding.gyp while trying to load binding.gyp

❯ npm --version
8.5.0

full log:
2022-05-21T14_47_10_330Z-debug-0.log

Maximum call stack size exceeded

Error: Connection got disposed.
    at Object.dispose (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-jsonrpc/lib/common/connection.js:1044:27)
    at Object.dispose (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-languageclient/lib/common/client.js:73:35)
    at LanguageClient.handleConnectionClosed (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-languageclient/lib/common/client.js:2424:42)
    at LanguageClient.handleConnectionClosed (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-languageclient/lib/node/main.js:155:15)
    at closeHandler (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-languageclient/lib/common/client.js:2411:18)
    at CallbackList.invoke (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-jsonrpc/lib/common/events.js:55:39)
    at Emitter.fire (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-jsonrpc/lib/common/events.js:117:36)
    at closeHandler (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-jsonrpc/lib/common/connection.js:256:26)
    at CallbackList.invoke (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-jsonrpc/lib/common/events.js:55:39)
    at Emitter.fire (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-jsonrpc/lib/common/events.js:117:36)
    at IPCMessageReader.fireClose (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-jsonrpc/lib/common/messageReader.js:40:27)
    at ChildProcess.<anonymous> (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/vscode-jsonrpc/lib/node/main.js:33:45)
    at ChildProcess.emit (node:events:525:35)
    at maybeClose (node:internal/child_process:1091:16)
    at Socket.<anonymous> (node:internal/child_process:449:11)
    at Socket.emit (node:events:513:28)
    at Pipe.<anonymous> (node:net:322:12)
node:internal/url:185
  constructor(init = undefined) {
             ^

RangeError: Maximum call stack size exceeded
    at new URLSearchParams (node:internal/url:185:14)
    at URL.onParseComplete (node:internal/url:559:26)
    at new URL (node:internal/url:646:5)
    at getAwkFilesInDir (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/awk-language-server/out/io.js:24:17)
    at getAwkFilesInDir (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/awk-language-server/out/io.js:37:28)
    at getAwkFilesInDir (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/awk-language-server/out/io.js:37:28)
    at getAwkFilesInDir (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/awk-language-server/out/io.js:37:28)
    at getAwkFilesInDir (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/awk-language-server/out/io.js:37:28)
    at getAwkFilesInDir (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/awk-language-server/out/io.js:37:28)
    at getAwkFilesInDir (/home/itdev/.vscode-server/extensions/beaglefoot.awk-ide-vscode-0.10.3/node_modules/awk-language-server/out/io.js:37:28)

Node.js v18.15.0
[Error - 11:48:30 AM] Connection to server got closed. Server will not be restarted.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.