miti.sh/posts/2024-01-01-build-a-neovim-qt-appimage-from-source.md
2025-05-28 18:12:34 -07:00

153 lines
5.3 KiB
Markdown

---
title: "Build A Neovim Qt AppImage from Source"
blurb: "Building an AppImage package from source allows us to run the
latest version of Neovim-QT on our machine running the Debian Linux
distribution."
...
![Neovim Qt](/images/neovim-qt-sample.png)
## Introduction
We have [Debian](https://www.debian.org/) installed on our machine and would like to run [Neovim](https://neovim.io/) with the latest version of the [Neovim Qt](https://github.com/equalsraf/neovim-qt) GUI. While a Debian `neovim-qt` package exists, it is not the latest version. To solve this problem, we will build Neovim Qt from source and package it as an AppImage.
### Requirements
We will assume Neovim is already installed. Neovim AppImages are available from the [Neovim GitHub repo](https://github.com/neovim/neovim/releases).
## 1. Install [Toolbox](https://containertoolbx.org/)
We will have to install all the Neovim Qt build dependencies, so we will use Toolbox to build in a container, keeping our system clean.
$ sudo apt-get update
$ sudo apt-get install podman-toolbox
## 2. Download Neovim Qt
We start by downloading the latest `*.tar.gz` source code asset from the [Neovim Qt GitHub repository](https://github.com/equalsraf/neovim-qt/releases/).
Then, we unpack and unzip it and `cd` into the directory.
$ tar -xzvf neovim-qt-0.2.18.tar.gz
$ cd neovim-qt-0.2.18
## 3. Create and enter a new Toolbox container
$ toolbox create --distro debian neovim-qt
$ toolbox enter neovim-qt
## 4. Add `deb-src` to the sources list
Toolbox's base Debian image only lists binary archive types in the sources list. We will have to add the archive type for source packages, as well.
$ sudo nano /etc/apt/sources.list.d/debian.sources
We change the two lines that read `Types: deb` to `Types: deb deb-src` and save the changes.
Types: deb deb-src
...
Types: deb deb-src
...
## 5. Install build dependencies
We can install all the build dependencies we will need to build Neovim Qt with the `build-dep` option. `fuse` will be needed to build the AppImage package.
$ sudo apt-get update
$ sudo apt-get build-dep neovim-qt
$ sudo apt-get install fuse
## 6. Add a build script
We copy a sample `cmake` build-script from the [appimage.org online documentation](https://docs.appimage.org/packaging-guide/from-source/native-binaries.html#bundle-qtquickapp-with-cmake) into a file called `build-with-cmake.sh`.
Alternatively, we can download it directly from their GitHub repository with
$ wget https://raw.githubusercontent.com/linuxdeploy/QtQuickApp/master/travis/build-with-cmake.sh
We need to make two changes.
1. On the line that contains
cmake "$REPO_ROOT" -DCMAKE_INSTALL_PREFIX=/usr
we add the variable `DCMAKE_BUILD_TYPE` and set it to `Release` (per the [Neovim Qt build instructions](https://github.com/equalsraf/neovim-qt/wiki/Build-Instructions)):
cmake "$REPO_ROOT" -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release
2. On the very last line,
mv QtQuickApp*.AppImage "$OLD_CWD"
we remove the sample app name, `QtQuickApp`.
mv *.AppImage "$OLD_CWD"
(We could, optionally, set it to `mv Neovim-Qt*.AppImage "$OLD_CWD"`, but for our case, it's not necessary).
## 7. Run the build script
We make the script runnable and then run it.
$ chmod +x build-with-cmake.sh
$ ./build-with-cmake.sh
## 8. Test-run the AppImage
We should now have an AppImage package in our directory that we can run.
$ ./Neovim-Qt-x86_64.AppImage
When we run it we should see Neovim open in a new GUI window.
![Neovim Qt Running In a Window](/images/neovim-qt-test-run.png)
## 9. Exit the Toolbox container
$ exit
logout
The Toolbox container is still running. We can stop it with
$ podman stop neovim-qt
## 10. Add the package to our user-specific executable directory
According to the [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html), user-specific executables belong in `$HOME/.local/bin`. We will place our AppImage in its own directory in `~/.local/neovim-qt` and create a symlink to it in `~/.local/bin`.
$ mkdir ~/.local/neovim-qt
$ mv ./Neovim-Qt-x86_64.AppImage ~/.local/neovim-qt
$ ln -s ~/.local/neovim-qt/Neovim-Qt-x86_64.AppImage ~/.local/bin/nvim-qt
We can now run it by calling `nvim-qt` directly from the command line.
$ nvim-qt --version
NVIM-QT v0.2.18.0
Build type: Release
Compilation: -Wall -Wextra -Wno-unused-parameter -Wunused-variable
Qt Version: 5.15.8
...
## 11. Add Neovim Qt to the applications menu
We simply need to copy the `.desktop` file from the source directory.
$ cp src/gui/nvim-qt.desktop ~/.local/share/applications/
## 12. Add an icon
And finally, we copy over the icon from the source directory as well.
$ mkdir ~/.local/neovim-qt/icons
$ cp third-party/neovim.png ~/.local/neovim-qt/icons/nvim-qt.png
$ mkdir -p ~/.local/share/icons/hicolor/192x192/apps
$ ln -s ~/.local/neovim-qt/icons/nvim-qt.png ~/.local/share/icons/hicolor/192x192/apps/
$ xdg-icon-resource forceupdate --mode user
## Conclusion
When we search for `neovim` in our applications menu, we should now see an entry we can use to start our new Neovim Qt AppImage.
![Neovim Qt Application Menu Entry](/images/neovim-qt.png)