- name: Ensure neovim configuration directories exist ansible.builtin.file: path: '{{ item }}' state: directory mode: '0755' loop: - '{{ xdg_config_dir }}/nvim/' - '{{ xdg_config_dir }}/nvim/lua' - '{{ xdg_config_dir }}/nvim/after' - '{{ xdg_config_dir }}/nvim/after/ftplugin' - '{{ xdg_data_dir }}/nvim/site' - '{{ xdg_data_dir }}/nvim/site/pack' - '{{ xdg_data_dir }}/nvim/site/pack/default' - '{{ xdg_data_dir }}/nvim/site/pack/default/start' - name: Remove old neovim packages ansible.builtin.file: path: '{{ item }}' state: absent loop: - '{{ xdg_data_dir }}/nvim/site/pack/default/start/catpuccin' - '{{ xdg_data_dir }}/nvim/site/pack/default/start/vim-colors-xcode' # Note that helptags may need to be regenerated (see `:h helptags`) - name: Clone neovim packages ansible.builtin.git: repo: '{{ item.url }}' dest: '{{ xdg_data_dir }}/nvim/site/pack/default/start/{{ item.name }}' update: true version: '{{ item.version | default("HEAD") }}' force: true # some maintainers overwrite existing tags :/ loop: '{{ neovim_plugins }}' - name: Install neovim node package become: true community.general.npm: name: neovim global: true - name: Install language servers become: true ansible.builtin.package: name: '{{ item }}' state: present loop: '{{ language_servers | map(attribute="package") | list }}' when: ansible_facts['os_family'] == 'Archlinux' - name: Install language servers on debian hosts become: true community.general.npm: name: '{{ item }}' global: true loop: '{{ language_servers | map(attribute="package") | list }}' when: ansible_facts['os_family'] == 'Debian' - name: Remove old neovim configuration file ansible.builtin.file: path: '{{ xdg_config_dir }}/nvim/init.vim' state: absent - name: Remove coc.nvim extension ansible.builtin.file: path: '{{ xdg_data_dir }}/nvim/site/pack/default/start/coc.nvim' state: absent - name: Setup neovim configuration files ansible.builtin.template: dest: '{{ item.dest }}' src: '{{ item.src }}' mode: '0755' loop: - src: 'templates/nvim/ftplugin/bash.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/bash.lua' - src: 'templates/nvim/ftplugin/css.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/css.lua' - src: 'templates/nvim/ftplugin/html.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/html.lua' - src: 'templates/nvim/ftplugin/htmldjango.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/htmldjango.lua' - src: 'templates/nvim/ftplugin/javascript.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/javascript.lua' - src: 'templates/nvim/ftplugin/json.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/json.lua' - src: 'templates/nvim/ftplugin/lua.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/lua.lua' - src: 'templates/nvim/ftplugin/python.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/python.lua' - src: 'templates/nvim/ftplugin/scss.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/scss.lua' - src: 'templates/nvim/ftplugin/sh.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/sh.lua' - src: 'templates/nvim/ftplugin/yaml.lua.j2' dest: '{{ xdg_config_dir }}/nvim/after/ftplugin/yaml.lua' - src: 'templates/nvim/init.lua.j2' dest: '{{ xdg_config_dir }}/nvim/init.lua' - src: 'templates/nvim/lua/lsp.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/lsp.lua' - src: 'templates/nvim/lua/options.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/options.lua' - src: 'templates/nvim/lua/tree-sitter.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/tree-sitter.lua' - src: 'templates/nvim/lua/git-signs.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/git-signs.lua' - src: 'templates/nvim/lua/lua-line.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/lua-line.lua' - src: 'templates/nvim/lua/telescope.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/_telescope.lua' - src: 'templates/nvim/lua/indent-blankline.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/indent-blankline.lua' - src: 'templates/nvim/lua/nvim-tree.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/_nvim-tree.lua' - src: 'templates/nvim/lua/colorscheme.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/colorscheme.lua' - src: 'templates/nvim/lua/source-link.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/_source-link.lua' - src: 'templates/nvim/lua/filetype.lua.j2' dest: '{{ xdg_config_dir }}/nvim/lua/_filetype.lua' - name: Install neovim from archive when: ansible_facts['os_family'] == 'Debian' block: - name: Create neovim install directory become: true ansible.builtin.file: state: directory path: '{{ neovim.install_path }}' owner: '{{ ansible_user_id }}' group: '{{ ansible_user_gid }}' mode: '0755' - name: Register the current neovim version ansible.builtin.command: argv: - '{{ neovim.install_path }}/bin/nvim' - '--version' register: neovim_stats changed_when: false ignore_errors: true - name: Parse the current neovim version ansible.builtin.set_fact: neovim_installed_version: neovim_stats.stdout_lines[0] | regex_search('(v\d+\.\d+\.\d+)') when: neovim_stats.rc == 0 # TODO: verify checksum - name: Download neovim {{ neovim.version }} ansible.builtin.get_url: url: 'https://github.com/neovim/neovim/releases/download/{{ neovim.version }}/nvim-linux64.tar.gz' dest: /tmp/nvim-linux64.tar.gz mode: '0755' when: neovim_stats.rc > 0 or neovim_installed_version != neovim.version register: neovim_download - name: Extract downloaded neovim version ansible.builtin.unarchive: src: /tmp/nvim-linux64.tar.gz dest: '{{ neovim.install_path }}' extra_opts: - '--strip-components=1' - '--show-stored-names' - '--overwrite' when: | neovim_download.state == 'file' and (neovim_installed_version is undefined or neovim_installed_version != neovim.version) - name: Add neovim to PATH become: true ansible.builtin.template: src: 'templates/nvim.profile.j2' dest: '/etc/profile.d/neovim.sh' mode: '0755'