From deec1581c589f43b60f579c8346af52a10b7b81c Mon Sep 17 00:00:00 2001 From: Sonny Bakker Date: Sat, 10 Aug 2024 16:08:06 +0200 Subject: [PATCH] Extract neovim from prebuilt archives for debian hosts --- tasks/neovim.yml | 55 +++++++++++++++++++++++++++++++++-- templates/nvim/lua/lsp.lua.j2 | 12 +++++++- vars/archlinux.yml | 50 ++++++++++++++++++++++++++----- vars/debian.yml | 31 +++++++++++++------- 4 files changed, 126 insertions(+), 22 deletions(-) diff --git a/tasks/neovim.yml b/tasks/neovim.yml index a85fd57..9a3b704 100644 --- a/tasks/neovim.yml +++ b/tasks/neovim.yml @@ -27,14 +27,21 @@ name: neovim global: true -# Note that the "python-lsp-server", "python-lsp-ruff" and "neovim" python -# packages should be installed to the corresponding virtualenv as well. - name: install language servers become: true package: name: '{{ item }}' state: present - loop: '{{ language_servers }}' + loop: '{{ language_servers | map(attribute="package") | list }}' + when: ansible_facts['os_family'] == 'Archlinux' + +- name: install language servers on debian hosts + become: true + npm: + name: '{{ item }}' + global: true + loop: '{{ language_servers | map(attribute="package") | list }}' + when: ansible_facts['os_family'] == 'Debian' - name: remove old neovim configuration file file: @@ -141,3 +148,45 @@ src: 'templates/nvim/lua/indent-blankline.lua.j2', dest: '{{ xdg_config_dir }}/nvim/lua/indent-blankline.lua', } + +- block: + - name: register the current version + command: + argv: + - '{{ neovim.install_path }}/bin/nvim' + - '--version' + register: neovim_stats + + - name: parse the current version + set_fact: + neovim_installed_version: neovim_stats.stdout_lines[0] | regex_search('(v\d+\.\d+\.\d+)') + when: neovim_stats.rc == 0 + + - name: download neovim {{ neovim.version }} + get_url: + url: 'https://github.com/neovim/neovim/releases/download/{{ neovim.version }}/nvim-linux64.tar.gz' + dest: /tmp/nvim-linux64.tar.gz + when: neovim_stats.rc > 0 or neovim_installed_version != neovim.version + register: neovim_download + + - name: extract downloaded neovim version + unarchive: + src: /tmp/nvim-linux64.tar.gz + dest: '{{ neovim.install_path }}' + extra_opts: + - '--strip-components=1' + - '--show-stored-names' + when: neovim_download.rc == 0 + + - name: set updated PATH variable + set_fact: + neovim_new_path: '{{ neovim.install_path }}/bin' + + - name: Update PATH to include {{ neovim_new_path }} + ansible.builtin.replace: + path: '~/.profile' + regexp: '^PATH="{{ ansible_env.PATH }}"' + replace: 'PATH="{{ ansible_env.PATH }}:{{ neovim_new_path }}"' + when: neovim_new_path not in ansible_env.PATH + + when: ansible_facts['os_family'] == 'Debian' diff --git a/templates/nvim/lua/lsp.lua.j2 b/templates/nvim/lua/lsp.lua.j2 index 812dc2c..507eb54 100644 --- a/templates/nvim/lua/lsp.lua.j2 +++ b/templates/nvim/lua/lsp.lua.j2 @@ -23,8 +23,15 @@ end --enable some language servers with the additional completion capabilities --offered by nvim-cmp +-- TODO: use `.join`? local servers = { - 'ansiblels', 'yamlls', 'cssls', 'jsonls', 'tsserver', 'bashls', 'lua_ls' + {% for item in language_servers %} + {% if item.auto_setup and not loop.last %} + '{{ item.server_name }}', + {% elif item.auto_setup %} + '{{ item.server_name }}' + {% endif %} + {% endfor %} } --add additional capabilities supported by nvim-cmp @@ -42,6 +49,7 @@ end local util = require('lspconfig/util') +{% if ansible_facts.os_family == 'Archlinux' %} local python_root_dir = function(fname) return util.root_pattern('.git', 'setup.cfg', 'requirements')(fname) or util.path.dirname(fname) @@ -72,12 +80,14 @@ nvim_lsp.pyright.setup({ root_dir = python_root_dir }) + nvim_lsp.html.setup({ on_attach = on_attach, capabilities = capabilities, filetypes = { 'html', 'htmldjango' }, }) +{% endif %} local cmp = require('cmp') local luasnip = require('luasnip') diff --git a/vars/archlinux.yml b/vars/archlinux.yml index b634a41..3fae616 100644 --- a/vars/archlinux.yml +++ b/vars/archlinux.yml @@ -32,15 +32,49 @@ aur_build_dir: '/usr/local/src' python_build_dir: '/usr/local/src' python_install_dir: '/opt' +# Note that the "python-lsp-server", "python-lsp-ruff" and "neovim" python +# packages should be installed to the corresponding virtualenv as well. language_servers: - - ansible-language-server - - yaml-language-server - - typescript-language-server - - vscode-html-languageserver - - vscode-json-languageserver - - vscode-css-languageserver - - bash-language-server - - lua-language-server + - { + package: ansible-language-server, + server_name: 'ansiblels', + auto_setup: true + } + - { + package: yaml-language-server, + server_name: 'yamlls', + auto_setup: true + } + - { + package: typescript-language-server, + server_name: 'tsserver', + auto_setup: true + } + - { + package: vscode-html-languageserver, + server_name: 'html', + auto_setup: false + } + - { + package: vscode-json-languageserver, + server_name: 'jsonls', + auto_setup: true + } + - { + package: vscode-css-languageserver, + server_name: 'cssls', + auto_setup: true + } + - { + package: bash-language-server, + server_name: 'bashls', + auto_setup: true + } + - { + package: lua-language-server, + server_name: 'lua_ls', + auto_setup: true + } python_download_url: 'https://www.python.org/ftp/python' python_versions: diff --git a/vars/debian.yml b/vars/debian.yml index 64641e3..6ccab17 100644 --- a/vars/debian.yml +++ b/vars/debian.yml @@ -5,18 +5,29 @@ packages: - python3 - git - vim - - neovim - npm - tree-sitter - ripgrep -# TODO: investigate available lsps +neovim: + version: 'v0.10.1' + install_path: '/opt/nvim' + download_checksum: 4867de01a17f6083f902f8aa5215b40b0ed3a36e83cc0293de3f11708f1f9793 + +# TODO: add lua language server, see https://github.com/LuaLS/lua-language-server? language_servers: - - ansible-language-server - - yaml-language-server - - typescript-language-server - - vscode-html-languageserver - - vscode-json-languageserver - - vscode-css-languageserver - - bash-language-server - - lua-language-server + - { + package: '@ansible/ansible-language-server', + server_name: 'ansiblels', + auto_setup: true + } + - { + package: yaml-language-server, + server_name: 'yamlls', + auto_setup: true + } + - { + package: bash-language-server, + server_name: 'bashls', + auto_setup: true + }