Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 0 additions & 28 deletions .github/ISSUE_TEMPLATE/bug_report.md

This file was deleted.

24 changes: 24 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Neovim config

on:
push:
pull_request:

permissions:
contents: read

jobs:
smoke-test:
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- uses: actions/checkout@v6
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y build-essential curl git ripgrep
- name: Install Neovim 0.12.2
run: |
curl -fL https://github.com/neovim/neovim/releases/download/v0.12.2/nvim-linux-x86_64.tar.gz -o /tmp/nvim.tar.gz
tar -xzf /tmp/nvim.tar.gz -C /tmp
echo "/tmp/nvim-linux-x86_64/bin" >> "$GITHUB_PATH"
- name: Restore locked plugins and start Neovim
run: scripts/nvim-test.sh restore
21 changes: 0 additions & 21 deletions .github/workflows/stylua.yml

This file was deleted.

52 changes: 52 additions & 0 deletions .github/workflows/update-plugins.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Update locked plugins

on:
schedule:
- cron: '17 7 * * 1'
workflow_dispatch:

permissions:
contents: write
pull-requests: write

jobs:
update:
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y build-essential curl git ripgrep
- name: Install Neovim 0.12.2
run: |
curl -fL https://github.com/neovim/neovim/releases/download/v0.12.2/nvim-linux-x86_64.tar.gz -o /tmp/nvim.tar.gz
tar -xzf /tmp/nvim.tar.gz -C /tmp
echo "/tmp/nvim-linux-x86_64/bin" >> "$GITHUB_PATH"
- name: Update plugins and smoke test the result
run: scripts/nvim-test.sh update
- name: Open or refresh the update pull request
env:
GH_TOKEN: ${{ github.token }}
run: |
if git diff --quiet -- lazy-lock.json; then
echo "Plugin lockfile is already current."
exit 0
fi

branch=automation/plugin-updates
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git fetch origin "$branch" || true
git switch -C "$branch"
git add lazy-lock.json
git commit -m "chore: update locked plugins"
git push --force-with-lease origin "$branch"

gh pr create \
--base "${GITHUB_REF_NAME}" \
--head "$branch" \
--title "chore: update locked Neovim plugins" \
--body "Automated weekly plugin update. Merge only after the Neovim config check passes." \
|| gh pr edit "$branch" --body "Automated weekly plugin update. Merge only after the Neovim config check passes."
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ test.sh
nvim

spell/
lazy-lock.json
# The plugin lockfile is intentionally committed. It is the rollback point for
# safe updates and must not be ignored.
1 change: 1 addition & 0 deletions .nvim-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v0.12.2
236 changes: 34 additions & 202 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,218 +1,50 @@
# kickstart.nvim
# River's Neovim config

## Introduction
This configuration targets **Neovim 0.12.x** and pins the complete plugin graph
in `lazy-lock.json`. Normal editor startup never updates plugins. A weekly GitHub
Actions job proposes lockfile updates in a pull request, and the same isolated
smoke test runs on every push and pull request.

A starting point for Neovim that is:
That gives updates a rollback point and keeps upstream breaking changes out of
the working editor until they pass CI. It cannot make arbitrary upstream
changes risk-free, but it turns them into reviewed, reversible changes instead
of surprise startup failures.

* Small
* Single-file
* Completely Documented
## Install

**NOT** a Neovim distribution, but instead a starting point for your configuration.

## Installation

### Install Neovim

Kickstart.nvim targets *only* the latest
['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest
['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim.
If you are experiencing issues, please make sure you have the latest versions.

### Install External Dependencies

> **NOTE**
> [Backup](#FAQ) your previous configuration (if any exists)

External Requirements:
- Basic utils: `git`, `make`, `unzip`, C Compiler (`gcc`)
- [ripgrep](https://github.com/BurntSushi/ripgrep#installation)
- Language Setup:
- If want to write Typescript, you need `npm`
- If want to write Golang, you will need `go`
- etc.

> **NOTE**
> See [Windows Installation](#Windows-Installation) to double check any additional Windows notes

Neovim's configurations are located under the following paths, depending on your OS:

| OS | PATH |
| :- | :--- |
| Linux, MacOS | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` |
| Windows (cmd)| `%userprofile%\AppData\Local\nvim\` |
| Windows (powershell)| `$env:USERPROFILE\AppData\Local\nvim\` |

### Install Kickstart

Clone kickstart.nvim:

<details><summary> Linux and Mac </summary>

```sh
git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim
```

</details>

<details><summary> Windows </summary>

If you're using `cmd.exe`:

```
git clone https://github.com/nvim-lua/kickstart.nvim.git %userprofile%\AppData\Local\nvim\
```

If you're using `powershell.exe`

```
git clone https://github.com/nvim-lua/kickstart.nvim.git $env:USERPROFILE\AppData\Local\nvim\
```

</details>

### Post Installation

Start Neovim
Required: Neovim 0.12.x, Git, a C compiler, `make`, `unzip`, and `ripgrep`. A Nerd
Font is recommended. Language servers, formatters, and debuggers are installed
through Mason on first interactive startup.

```sh
git clone https://github.com/RiverMatsumoto/kickstart.nvim.git \
"${XDG_CONFIG_HOME:-$HOME/.config}/nvim"
nvim
```

That's it! Lazy will install all the plugins you have. Use `:Lazy` to view
current plugin status.

Read through the `init.lua` file in your configuration folder for more
information about extending and exploring Neovim.

### Getting Started

See [Effective Neovim: Instant IDE](https://youtu.be/stqUbv-5u2s), covering the
previous version. Note: The install via init.lua is outdated, please follow the
install instructions in this file instead. An updated video is coming soon.

### Recommended Steps

[Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo
(so that you have your own copy that you can modify) and then installing you
can install to your machine using the methods above.

> **NOTE**
> Your fork's url will be something like this: `https://github.com/<your_github_username>/kickstart.nvim.git`

#### Examples of adding popularly requested plugins

NOTE: You'll need to uncomment the line in the init.lua that turns on loading custom plugins.

<details>
<summary>Adding autopairs</summary>

This will automatically install [windwp/nvim-autopairs](https://github.com/windwp/nvim-autopairs) and enable it on startup. For more information, see documentation for [lazy.nvim](https://github.com/folke/lazy.nvim).

In the file: `lua/custom/plugins/autopairs.lua`, add:

```lua
-- File: lua/custom/plugins/autopairs.lua

return {
"windwp/nvim-autopairs",
-- Optional dependency
dependencies = { 'hrsh7th/nvim-cmp' },
config = function()
require("nvim-autopairs").setup {}
-- If you want to automatically add `(` after selecting a function or method
local cmp_autopairs = require('nvim-autopairs.completion.cmp')
local cmp = require('cmp')
cmp.event:on(
'confirm_done',
cmp_autopairs.on_confirm_done()
)
end,
}
```

</details>
<details>
<summary>Adding a file tree plugin</summary>
To try it without replacing another config:

This will install the tree plugin and add the command `:Neotree` for you. You can explore the documentation at [neo-tree.nvim](https://github.com/nvim-neo-tree/neo-tree.nvim) for more information.

In the file: `lua/custom/plugins/filetree.lua`, add:

```lua
-- Unless you are still migrating, remove the deprecated commands from v1.x
vim.cmd([[ let g:neo_tree_remove_legacy_commands = 1 ]])

return {
"nvim-neo-tree/neo-tree.nvim",
version = "*",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
"MunifTanjim/nui.nvim",
},
config = function ()
require('neo-tree').setup {}
end,
}
```

</details>

### FAQ

* What should I do if I already have a pre-existing neovim configuration?
* You should back it up, then delete all files associated with it.
* This includes your existing init.lua and the neovim files in `~/.local` which can be deleted with `rm -rf ~/.local/share/nvim/`
* Can I keep my existing configuration in parallel to kickstart?
* Yes! You can use [NVIM_APPNAME](https://neovim.io/doc/user/starting.html#%24NVIM_APPNAME)`=nvim-NAME` to maintain multiple configurations. For example you can install the kickstart configuration in `~/.config/nvim-kickstart` and create an alias:
```
alias nvim-kickstart='NVIM_APPNAME="nvim-kickstart" nvim'
```
When you run Neovim using `nvim-kickstart` alias it will use the alternative config directory and the matching local directory `~/.local/share/nvim-kickstart`. You can apply this approach to any Neovim distribution that you would like to try out.
* What if I want to "uninstall" this configuration:
* See [lazy.nvim uninstall](https://github.com/folke/lazy.nvim#-uninstalling) information
* Why is the kickstart `init.lua` a single file? Wouldn't it make sense to split it into multiple files?
* The main purpose of kickstart is to serve as a teaching tool and a reference
configuration that someone can easily `git clone` as a basis for their own.
As you progress in learning Neovim and Lua, you might consider splitting `init.lua`
into smaller parts. A fork of kickstart that does this while maintaining the exact
same functionality is available here:
* [kickstart-modular.nvim](https://github.com/dam9000/kickstart-modular.nvim)
* Discussions on this topic can be found here:
* [Restructure the configuration](https://github.com/nvim-lua/kickstart.nvim/issues/218)
* [Reorganize init.lua into a multi-file setup](https://github.com/nvim-lua/kickstart.nvim/pull/473)

### Windows Installation

Installation may require installing build tools, and updating the run command for `telescope-fzf-native`

See `telescope-fzf-native` documentation for [more details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation)

This requires:

- Install CMake, and the Microsoft C++ Build Tools on Windows

```lua
{'nvim-telescope/telescope-fzf-native.nvim', build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' }
```sh
git clone https://github.com/RiverMatsumoto/kickstart.nvim.git ~/.config/nvim-river
NVIM_APPNAME=nvim-river nvim
```

Alternatively one can install gcc and make which don't require changing the config,
the easiest way is to use choco:
## Updates

1. install [chocolatey](https://chocolatey.org/install)
either follow the instructions on the page or use winget,
run in cmd as **admin**:
```
winget install --accept-source-agreements chocolatey.chocolatey
```

2. install all requirements using choco, exit previous cmd and
open a new one so that choco path is set, run in cmd as **admin**:
```
choco install -y neovim git ripgrep wget fd unzip gzip mingw make
```
- Do not use `:Lazy update` on the main branch for routine updates.
- Merge the automated `chore: update locked Neovim plugins` pull request after
its checks pass.
- To test an update locally, run `scripts/nvim-test.sh update`. This uses
isolated data/cache directories and changes only `lazy-lock.json`.
- Restore the committed versions at any time with `:Lazy restore`.

Then continue with the [Install Kickstart](#Install-Kickstart) step.
The Neovim version is pinned in `.nvim-version`. Upgrade Neovim separately from
plugin updates so failures have one clear cause.

## Design choices

The version guard, modular setup conventions, native `vim.lsp.config` API, and
current Treesitter `main` API follow the useful compatibility patterns in
[jdhao/nvim-config](https://github.com/jdhao/nvim-config). The system package
installer is intentionally not run from Neovim; editor startup should never ask
for administrator privileges or mutate the operating system.
Loading
Loading