Compare commits

...

14 commits

Author SHA1 Message Date
raf
9e94434190
Merge 9b111d1fe4 into 57067e85ed 2024-11-08 05:31:43 -05:00
57067e85ed flake: rename input for nvim-scrollbar 2024-11-08 10:15:23 +00:00
1b16c6b19f tabline/nvim-bufferline: remove assertion; enable nvim-web-devicons by default 2024-11-08 10:15:23 +00:00
a6bb6e1b3e modules/visuals: migrate plugins to setupOpts 2024-11-08 10:15:23 +00:00
raf
b3f51048db
Merge branch 'main' into v0.7 2024-11-08 09:33:15 +00:00
Noire
8997e62b3b
utility/precognition: init module (#437)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
Build and deploy documentation / Check latest commit (push) Has been cancelled
Build and deploy documentation / publish (push) Has been cancelled
* utility/precognition: init

* utility/precognition: fix priority example, add default

* utility/precognition: add files to default.nix

* utility/precognition: fix typos, manual fmt

* utility/precognition: remove useless mappings

i was going to add binds to toggle/enable/disable but ehhh
idk

* utility/precognition: fix hints option

it broke

* utility/precognition: update gutter hints, new description

* utility/precognition: add files to motion defaults

* utility/precognition: add plugin to flake

* utility/precognition: remove comment reference

oops

* utility/precognition: add precognition to maximal configuration

it does work!

* utility/precognition: update descriptions

needs docs link, desc is somewhat obscure.

* docs: add credit to release notes

* utility/precognition: format

* utility/precognition: de-linkify descriptions

* utility/precognition: no more rec

* utility/precognition: convert to setupOpts

honestly raf was cooking with this one.
it's much nicer to use compared to interpolation lol

* utility/precognition: remove unnecessary function parameter

* utility/precognition: format

* utility/precognition: add description to disabled_fts

oops

* utility/precognition: manual format

* utility/precognition: remove periods at the end of descriptions

* utility/precognition: fix configuration.nix entry

oops lol

* utility/precognition: format

* utility/precognition: expand `vim`

* precognition: consistency changes

Just my minor nits.

---------

Co-authored-by: NotAShelf <raf@notashelf.dev>
2024-11-08 09:32:02 +00:00
82c2d4bdd0
flake/packages: rename deprecated xdg_utils 2024-11-08 12:30:39 +03:00
9b111d1fe4
docs/installation: fix logical errors in standalone chapters 2024-11-08 12:27:42 +03:00
f738ad9d1a
docs: use the correct NVF_REPO url 2024-11-08 12:20:16 +03:00
775a867196
docs: compile stylesheet via dart-sass 2024-11-08 12:19:19 +03:00
1badee81db
flake: bump nixpkgs 2024-11-08 12:08:12 +03:00
d582228889
docs: add anchors to individual headers
Taken from Nixpkgs manual derivation, neat.
2024-11-07 16:11:53 +03:00
20dd5f8bb9
docs/installation: connect custom-configuration section to the module chapters better 2024-11-07 15:45:03 +03:00
383924d225
meta: update release info 2024-11-07 11:12:38 +03:00
48 changed files with 972 additions and 1332 deletions

View file

@ -77,20 +77,17 @@ isMaximal: {
};
visuals = {
enable = true;
nvimWebDevicons.enable = true;
scrollBar.enable = isMaximal;
smoothScroll.enable = true;
cellularAutomaton.enable = false;
nvim-scrollbar.enable = isMaximal;
nvim-web-devicons.enable = true;
nvim-cursorline.enable = true;
cinnamon-nvim.enable = true;
fidget-nvim.enable = true;
highlight-undo.enable = true;
indent-blankline.enable = true;
indentBlankline.enable = true;
cursorline = {
enable = true;
lineTimeout = 0;
};
# Fun
cellular-automaton.enable = false;
};
statusline = {
@ -164,6 +161,7 @@ isMaximal: {
motion = {
hop.enable = true;
leap.enable = true;
precognition.enable = isMaximal;
};
images = {

View file

@ -4,60 +4,88 @@
# build inputs
nixos-render-docs,
documentation-highlighter,
dart-sass,
path,
# nrd configuration
release,
optionsJSON,
}:
stdenvNoCC.mkDerivation {
name = "nvf-manual";
src = builtins.path {
path = lib.sourceFilesBySuffices ./manual [".md"];
} @ args: let
manual-release = args.release or "unstable";
in
stdenvNoCC.mkDerivation {
name = "nvf-manual";
};
src = builtins.path {
name = "nvf-manual-${manual-release}";
path = lib.sourceFilesBySuffices ./manual [".md" ".md.in"];
};
nativeBuildInputs = [nixos-render-docs];
strictDependencies = true;
nativeBuildInputs = [nixos-render-docs];
buildInputs = [dart-sass];
buildPhase = ''
dest="$out/share/doc/nvf"
mkdir -p "$(dirname "$dest")"
mkdir -p $dest/{highlightjs,media}
postPatch = ''
ln -s ${optionsJSON}/share/doc/nixos/options.json ./config-options.json
'';
cp -vt $dest/highlightjs \
${documentation-highlighter}/highlight.pack.js \
${documentation-highlighter}/LICENSE \
${documentation-highlighter}/mono-blue.css \
${documentation-highlighter}/loader.js
buildPhase = ''
dest="$out/share/doc/nvf"
mkdir -p "$(dirname "$dest")"
mkdir -p $dest/{highlightjs,script}
substituteInPlace ./options.md \
--subst-var-by \
OPTIONS_JSON \
${optionsJSON}/share/doc/nixos/options.json
# Copy highlight scripts to /highlights in document root.
cp -vt $dest/highlightjs \
${documentation-highlighter}/highlight.pack.js \
${documentation-highlighter}/LICENSE \
${documentation-highlighter}/mono-blue.css \
${documentation-highlighter}/loader.js
substituteInPlace ./manual.md \
--subst-var-by \
NVF_VERSION \
${release}
# Copy anchor scripts to the script directory in document root.
cp -vt $dest/script \
${./static/script}/anchor-min.js \
${./static/script}/anchor-use.js
# copy stylesheet
cp ${./static/style.css} "$dest/style.css"
substituteInPlace ./options.md \
--subst-var-by OPTIONS_JSON ./config-options.json
# copy release notes
cp -vr ${./release-notes} release-notes
substituteInPlace ./manual.md \
--subst-var-by NVF_VERSION ${manual-release}
# generate manual from
nixos-render-docs manual html \
--manpage-urls ${path + "/doc/manpage-urls.json"} \
--revision ${lib.trivial.revisionWithDefault release} \
--stylesheet style.css \
--script highlightjs/highlight.pack.js \
--script highlightjs/loader.js \
--toc-depth 2 \
--section-toc-depth 1 \
manual.md \
"$dest/index.xhtml"
substituteInPlace ./hacking/additional-plugins.md \
--subst-var-by NVF_REPO "https://github.com/notashelf/nvf/blob/${manual-release}"
mkdir -p $out/nix-support/
echo "doc manual $dest index.html" >> $out/nix-support/hydra-build-products
'';
}
# Compile and copy stylesheet to the project root.
sass ${./static/style.css} "$dest/style.css"
# Move release notes
cp -vr ${./release-notes} release-notes
# Generate final manual from a set of parameters. Explanation of the CLI flags are
# as follows:
#
# 1. --manpage-urls will allow you to use manual pages as they are defined in
# the nixpkgs documentation.
# 2. --revision is the project revision as it is defined in 'release.json' in the
# repository root
# 3. --script will inject a given Javascript file into the resulting pages inside
# the <script> tag.
# 4. --toc-depth will determine the depth of the initial Table of Contents while
# --section-toc-depth will determine the depth of per-section Table of Contents
# sections.
nixos-render-docs manual html \
--manpage-urls ${path + "/doc/manpage-urls.json"} \
--revision ${lib.trivial.revisionWithDefault manual-release} \
--stylesheet style.css \
--script highlightjs/highlight.pack.js \
--script highlightjs/loader.js \
--script script/anchor-use.js \
--script script/anchor-min.js \
--toc-depth 2 \
--section-toc-depth 1 \
manual.md \
"$dest/index.xhtml"
# Hydra support. Probably not necessary.
mkdir -p $out/nix-support/
echo "doc manual $dest index.html" >> $out/nix-support/hydra-build-products
'';
}

View file

@ -1,10 +1,9 @@
# Adding Plugins {#sec-additional-plugins}
To add a new Neovim plugin, first add the source url in the inputs section of `flake.nix`
with the prefix `plugin-`
To add a new Neovim plugin, first add the source url in the inputs section of
`flake.nix` with the prefix `plugin-`
```nix
{
inputs = {
# ...
@ -17,13 +16,18 @@ with the prefix `plugin-`
}
```
Prepending `plugin-` to the name of the input will allow nvf to automatically
discover inputs that are marked as plugins, and make them available in
`vim.startPlugins` or other areas that require a very specific plugin type as it
is defined in `@NVF_REPO@/lib/types/plugins.nix`
The addition of the `plugin-` prefix will allow **nvf** to autodiscover the
input from the flake inputs automatically, allowing you to refer to it in areas
that require a very specific plugin type as defined in `lib/types/plugins.nix`
You can now reference this plugin using its string name, the plugin will be
built with the name and source URL from the flake input, allowing you to
refer to it as a **string**.
built with the name and source URL from the flake input, allowing you to refer
to it as a **string**.
```nix
config.vim.startPlugins = ["neodev-nvim"];
@ -33,11 +37,11 @@ config.vim.startPlugins = ["neodev-nvim"];
Most plugins is initialized with a call to `require('plugin').setup({...})`.
We use a special function that lets you easily add support for such setup options in a modular way:
`mkPluginSetupOption`.
We use a special function that lets you easily add support for such setup
options in a modular way: `mkPluginSetupOption`.
Once you have added the source of the plugin as shown above, you can define the setup options like
this:
Once you have added the source of the plugin as shown above, you can define the
setup options like this:
```nix
# in modules/.../your-plugin/your-plugin.nix
@ -86,7 +90,8 @@ require('plugin-name').setup({
})
```
Now users can set any of the pre-defined option field, and can also add their own fields!
Now users can set any of the pre-defined option field, and can also add their
own fields!
```nix
# in user's config
@ -110,8 +115,8 @@ As you've seen above, `toLuaObject` is used to convert our nix attrSet
1. nix `null` converts to lua `nil`
2. number and strings convert to their lua counterparts
3. nix attrSet/list convert into lua tables
4. you can write raw lua code using `lib.generators.mkLuaInline`. This
function is part of nixpkgs.
4. you can write raw lua code using `lib.generators.mkLuaInline`. This function
is part of nixpkgs.
Example:
@ -127,8 +132,8 @@ vim.your-plugin.setupOpts = {
## Lazy plugins {#sec-lazy-plugins}
If the plugin can be lazy-loaded, `vim.lazy.plugins` should be used to add it. Lazy
plugins are managed by `lz.n`.
If the plugin can be lazy-loaded, `vim.lazy.plugins` should be used to add it.
Lazy plugins are managed by `lz.n`.
```nix
# in modules/.../your-plugin/config.nix
@ -163,6 +168,7 @@ in {
```
This results in the following lua code:
```lua
require('lz.n').load({
{

View file

@ -58,8 +58,10 @@ An example flake that exposes your custom Neovim configuration might look like
<!-- TODO: mention the built-in flake template here when it is added -->
The next two chapters will detail specific usage of standalone nvf
configurations on NixOS and Home-Manager.
The above setup will allow to set up nvf as a standalone flake, which you can
build independently from your system configuration while also possibly sharing
it with others. The next two chapters will detail specific usage of such a setup
for a package output in the context of NixOS or Home-Manager installation.
```{=include=} chapters
standalone/nixos.md

View file

@ -77,7 +77,9 @@ configure **nvf**.
```
::: {.note}
**nvf** exposes a lot of options, most of which are not referenced in the
installation sections of the manual. You may find all avaliable options
in the [appendix](https://notashelf.github.io/nvf/options)
installation sections of the manual. You may find all available options in the
[appendix](https://notashelf.github.io/nvf/options)
:::

View file

@ -76,7 +76,9 @@ configure **nvf**.
```
::: {.note}
**nvf** exposes a lot of options, most of which are not referenced in the
installation sections of the manual. You may find all avaliable options
in the [appendix](https://notashelf.github.io/nvf/options)
installation sections of the manual. You may find all available options in the
[appendix](https://notashelf.github.io/nvf/options)
:::

View file

@ -6,7 +6,7 @@ your system packages to make it available across your system.
The following is an example installation of `nvf` as a standalone package with
the default theme enabled. You may use other options inside `config.vim` in
`configModule`, but this example will not cover that.
`configModule`, but this example will not cover that extensively.
```nix
{
@ -30,23 +30,22 @@ the default theme enabled. You may use other options inside `config.vim` in
};
customNeovim = nvf.lib.neovimConfiguration {
modules = [configModule];
inherit pkgs;
modules = [configModule];
};
in {
# this will make the package available as a flake input
# This will make the package available as a flake output under 'packages'
packages.${system}.my-neovim = customNeovim.neovim;
# this is an example home-manager configuration
# using the built neovim package
# Example Home-Manager configuration using the configured Neovim package
homeConfigurations = {
"your-username@your-hostname" = home-manager.lib.homeManagerConfiguration {
# ...
modules = [
./home.nix
# this will make wrapped neovim available in your system packages
{environment.systemPackages = [customNeovim.neovim];}
# This will make Neovim available to users using the Home-Manager
# configuration. To make the package available to all users, prefer
# environment.systemPackages in your NixOS configuration.
{home.packages = [customNeovim.neovim];}
];
# ...
};

View file

@ -6,7 +6,7 @@ your system packages to make it available across your system.
The following is an example installation of `nvf` as a standalone package with
the default theme enabled. You may use other options inside `config.vim` in
`configModule`, but this example will not cover that.
`configModule`, but this example will not cover that extensively.
```nix
{
@ -30,21 +30,19 @@ the default theme enabled. You may use other options inside `config.vim` in
};
customNeovim = nvf.lib.neovimConfiguration {
modules = [configModule];
inherit pkgs;
modules = [configModule];
};
in {
# this will make the package available as a flake input
# This will make the package available as a flake output under 'packages'
packages.${system}.my-neovim = customNeovim.neovim;
# this is an example nixosConfiguration using the built neovim package
# Example nixosConfiguration using the configured Neovim package
nixosConfigurations = {
yourHostName = nixpkgs.lib.nixosSystem {
# ...
modules = [
./configuration.nix # or whatever your configuration is
# this will make wrapped neovim available in your system packages
# This will make wrapped neovim available in your system packages
{environment.systemPackages = [customNeovim.neovim];}
];
# ...

View file

@ -322,3 +322,8 @@ To migrate to `nixfmt`, simply change `vim.languages.nix.format.type` to
[](#opt-vim.languages.svelte.format.type) respectively.
- Replace [nixpkgs-fmt](https://github.com/nix-community/nixpkgs-fmt) with
[nixfmt](https://github.com/NixOS/nixfmt) (nixfmt-rfc-style).
[Nowaaru](https://github.com/Nowaaru):
- Add `precognition-nvim`.

10
docs/static/script/anchor-min.js vendored Normal file

File diff suppressed because one or more lines are too long

4
docs/static/script/anchor-use.js vendored Normal file
View file

@ -0,0 +1,4 @@
document.addEventListener('DOMContentLoaded', function(event) {
anchors.add('h1[id]:not(div.note h1, div.warning h1, div.tip h1, div.caution h1, div.important h1), h2[id]:not(div.note h2, div.warning h2, div.tip h2, div.caution h2, div.important h2), h3[id]:not(div.note h3, div.warning h3, div.tip h3, div.caution h3, div.important h3), h4[id]:not(div.note h4, div.warning h4, div.tip h4, div.caution h4, div.important h4), h5[id]:not(div.note h5, div.warning h5, div.tip h5, div.caution h5, div.important h5), h6[id]:not(div.note h6, div.warning h6, div.tip h6, div.caution h6, div.important h6)');
});

830
docs/static/style.css vendored
View file

@ -1,830 +0,0 @@
:root {
--nmd-color0: #0a3e68;
--nmd-color1: #268598;
--nmd-color2: #b8d09e;
--nmd-color3: #f6cf5e;
--nmd-color4: #ec733b;
--nmd-color-info: #167cb9;
--nmd-color-warn: #ff6700;
}
html {
-webkit-text-size-adjust: 100%;
}
html:focus-within {
scroll-behavior: smooth;
}
body {
-webkit-text-size-adjust: 100%;
-moz-text-size-adjust: 100%;
text-size-adjust: 100%;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
min-height: 100vh;
position: relative;
text-rendering: optimizeSpeed;
width: 100%;
}
*,
:after,
:before {
box-sizing: border-box;
}
a:not([class]) {
-webkit-text-decoration-skip: ink;
text-decoration-skip-ink: auto;
}
a,
abbr,
acronym,
address,
applet,
article,
aside,
audio,
b,
big,
blockquote,
body,
canvas,
caption,
center,
cite,
code,
dd,
del,
details,
dfn,
div,
dl,
dt,
em,
embed,
fieldset,
figcaption,
figure,
footer,
form,
h1,
h2,
h3,
h4,
h5,
h6,
header,
hgroup,
html,
i,
iframe,
img,
ins,
kbd,
label,
legend,
li,
mark,
menu,
nav,
object,
ol,
output,
p,
pre,
q,
ruby,
s,
samp,
section,
small,
span,
strike,
strong,
sub,
summary,
sup,
table,
tbody,
td,
tfoot,
th,
thead,
time,
tr,
tt,
u,
ul,
var,
video {
border: 0;
font-size: 100%;
font: inherit;
margin: 0;
padding: 0;
vertical-align: baseline;
}
:focus {
outline: 0;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section {
display: block;
}
ol,
ul {
list-style: none;
}
blockquote,
q {
quotes: none;
}
blockquote:after,
blockquote:before,
q:after,
q:before {
content: "";
content: none;
}
input,
input:required {
box-shadow: none;
}
input:-webkit-autofill,
input:-webkit-autofill:active,
input:-webkit-autofill:focus,
input:-webkit-autofill:hover {
-webkit-box-shadow: inset 0 0 0 30px #fff;
}
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-results-button,
input[type="search"]::-webkit-search-results-decoration {
-webkit-appearance: none;
-moz-appearance: none;
}
input[type="search"] {
-webkit-appearance: none;
-moz-appearance: none;
}
input:focus {
outline: 0;
}
audio,
canvas,
video {
display: inline-block;
max-width: 100%;
}
audio:not([controls]) {
display: none;
height: 0;
}
[hidden] {
display: none;
}
a:active,
a:hover {
outline: 0;
}
img {
height: auto;
max-width: 100%;
vertical-align: middle;
}
img,
picture {
display: inline-block;
}
button,
input {
line-height: normal;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button;
background: 0 0;
border: 0;
cursor: pointer;
}
button[disabled],
html input[disabled] {
cursor: default;
}
[disabled] {
pointer-events: none;
}
input[type="checkbox"],
input[type="radio"] {
padding: 0;
}
input[type="search"] {
-webkit-appearance: textfield;
box-sizing: content-box;
}
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
button {
background: 0 0;
border: 0;
}
textarea {
overflow: auto;
resize: vertical;
vertical-align: top;
}
table {
border-collapse: collapse;
border-spacing: 0;
text-indent: 0;
}
hr {
background: #000;
border: 0;
box-sizing: content-box;
height: 1px;
line-height: 0;
margin: 0;
overflow: visible;
padding: 0;
page-break-after: always;
width: 100%;
}
pre {
font-family: monospace, monospace;
font-size: 100%;
}
a {
background-color: transparent;
}
abbr[title] {
border-bottom: none;
text-decoration: none;
}
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
}
small,
sub,
sup {
font-size: 75%;
}
sub,
sup {
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -5px;
}
sup {
top: -5px;
}
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
font-size: 100%;
line-height: 1;
margin: 0;
padding: 0;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
[type="button"],
[type="reset"],
[type="submit"],
button {
-webkit-appearance: button;
}
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner,
button::-moz-focus-inner {
border-style: none;
outline: 0;
padding: 0;
}
legend {
border: 0;
color: inherit;
display: block;
max-width: 100%;
white-space: normal;
width: 100%;
}
fieldset {
min-width: 0;
}
body:not(:-moz-handler-blocked) fieldset {
display: block;
}
progress {
vertical-align: baseline;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
summary {
display: list-item;
}
template {
display: none;
}
body {
background: white;
color: #111827;
max-width: min(100ch, 1024px);
margin: 0 auto;
padding: 10px;
font-family: "Lucida Sans", Arial, sans-serif;
font-size: 16px;
line-height: 1.4em;
}
@media (prefers-color-scheme: dark) {
body {
background: #111827;
color: #f9fafb;
}
}
h1,
h2,
h3 {
color: var(--nmd-color0);
font-family: "Lato", sans-serif;
font-weight: 300;
line-height: 1.125;
}
@media (prefers-color-scheme: dark) {
h1,
h2,
h3 {
color: var(--nmd-color4);
}
}
h1 {
font-size: 48px;
font-weight: 300;
margin: 4rem 0 1.5rem;
}
h2 {
font-size: 32px;
font-weight: 300;
margin: 2rem 0 1rem;
}
h3 {
font-size: 20px;
font-weight: 400;
margin: 0.5rem 0.25rem;
}
p {
margin: 0.9rem 0;
}
p:first-child {
margin-top: 0;
}
p:last-child {
margin-bottom: 0;
}
a {
color: var(--nmd-color0);
text-decoration: underline;
text-underline-offset: 3px;
}
a:visited {
color: var(--nmd-color1);
}
a:hover {
color: var(--nmd-color1);
}
@media (prefers-color-scheme: dark) {
a {
color: var(--nmd-color3);
}
a:visited {
color: var(--nmd-color2);
}
a:hover {
color: var(--nmd-color4);
}
}
code {
font-size: 90%;
}
span.command {
font-size: 90%;
font-family: monospace;
}
em {
font-style: italic;
}
strong {
font-weight: bold;
}
pre {
background: #f9fafb;
margin: 2rem 16px;
padding: 10px;
border: 1px solid #e5e7eb;
border-radius: 4px;
box-shadow: 4px 4px 8px #e5e7eb;
font-size: 90%;
margin-bottom: 1.5rem;
padding: 6px;
overflow: auto;
}
@media (prefers-color-scheme: dark) {
pre {
background: #1f2937;
border-color: black;
box-shadow: 4px 4px 8px black;
}
}
pre span img {
user-select: none;
}
pre:has(code) {
padding: 0;
}
td,
th {
padding: 2px 5px;
}
td:first-child,
th:first-child {
padding-left: 0;
}
td:last-child,
th:last-child {
padding-right: 0;
}
dt {
margin: 1.2rem 0 0.8rem;
}
dd {
margin-left: 2rem;
}
ul {
margin: 0.9rem 0;
padding-left: 30px;
list-style: disc;
}
ul:first-child {
margin-top: 0;
}
ul:last-child {
margin-bottom: 0;
}
ol {
margin: 0.9rem 0;
padding-left: 30px;
list-style: decimal;
}
ol:first-child {
margin-top: 0;
}
ol:last-child {
margin-bottom: 0;
}
li {
margin: 0.9rem 0;
padding-left: 5px;
}
li:first-child {
margin-top: 0;
}
li:last-child {
margin-bottom: 0;
}
.navheader hr,
.navfooter hr {
margin: 1rem 0;
background: #e5e7eb;
}
@media (prefers-color-scheme: dark) {
.navheader hr,
.navfooter hr {
background: #4b5563;
}
}
.navheader a,
.navfooter a {
text-decoration: none;
}
div.titlepage {
margin: 40px 0;
}
div.titlepage hr {
display: none;
}
div.toc {
background: #f9fafb;
margin: 2rem 16px;
padding: 10px;
border: 1px solid #e5e7eb;
border-radius: 4px;
box-shadow: 4px 4px 8px #e5e7eb;
}
@media (prefers-color-scheme: dark) {
div.toc {
background: #1f2937;
border-color: black;
box-shadow: 4px 4px 8px black;
}
}
div.toc a {
text-decoration: none;
}
div.note,
div.warning {
background: #f9fafb;
margin: 2rem 16px;
padding: 10px;
border: 1px solid #e5e7eb;
border-radius: 4px;
box-shadow: 4px 4px 8px #e5e7eb;
font-style: italic;
}
@media (prefers-color-scheme: dark) {
div.note,
div.warning {
background: #1f2937;
border-color: black;
box-shadow: 4px 4px 8px black;
}
}
div.note h3,
div.warning h3 {
float: right;
margin: 0 0 1rem 1rem;
width: 42px;
height: 42px;
content: url();
}
div.note h3 + p,
div.warning h3 + p {
margin-top: 0;
}
div.note h3 {
background-color: var(--nmd-color-info);
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='42' height='42' viewBox='0 0 24 24' stroke-width='2' stroke='black' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M12 8h.01'%3E%3C/path%3E%3Cpath d='M11 12h1v4h1'%3E%3C/path%3E%3Cpath d='M12 3c7.2 0 9 1.8 9 9s-1.8 9 -9 9s-9 -1.8 -9 -9s1.8 -9 9 -9z'%3E%3C/path%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='42' height='42' viewBox='0 0 24 24' stroke-width='2' stroke='black' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M12 8h.01'%3E%3C/path%3E%3Cpath d='M11 12h1v4h1'%3E%3C/path%3E%3Cpath d='M12 3c7.2 0 9 1.8 9 9s-1.8 9 -9 9s-9 -1.8 -9 -9s1.8 -9 9 -9z'%3E%3C/path%3E%3C/svg%3E");
}
div.warning h3 {
background-color: var(--nmd-color-warn);
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='42' height='42' viewBox='0 0 24 24' stroke-width='2' stroke='black' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M12 9v2m0 4v.01'%3E%3C/path%3E%3Cpath d='M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75'%3E%3C/path%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='42' height='42' viewBox='0 0 24 24' stroke-width='2' stroke='black' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M12 9v2m0 4v.01'%3E%3C/path%3E%3Cpath d='M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75'%3E%3C/path%3E%3C/svg%3E");
}
.term {
font-weight: 300;
}
.docbook .xref img[src^="images\/callouts\/"],
.screen img,
.programlisting img {
width: 1em;
}
.calloutlist img {
width: 1.3em;
}
.programlisting.language-shell .hljs-meta.prompt_ {
user-select: none;
} /*!
Theme: Tomorrow
Author: Chris Kempson (http://chriskempson.com)
License: ~ MIT (or more permissive) [via base16-schemes-source]
Maintainer: @highlightjs/core-team
Version: 2021.09.0
*/
pre code.hljs {
display: block;
overflow-x: auto;
padding: 1em;
}
code.hljs {
padding: 3px 5px;
}
.hljs {
color: #4d4d4c;
background: #fff;
}
.hljs ::selection,
.hljs::selection {
background-color: #d6d6d6;
color: #4d4d4c;
}
.hljs-comment {
color: #8e908c;
}
.hljs-tag {
color: #969896;
}
.hljs-operator,
.hljs-punctuation,
.hljs-subst {
color: #4d4d4c;
}
.hljs-operator {
opacity: 0.7;
}
.hljs-bullet,
.hljs-deletion,
.hljs-name,
.hljs-selector-tag,
.hljs-template-variable,
.hljs-variable {
color: #c82829;
}
.hljs-attr,
.hljs-link,
.hljs-literal,
.hljs-number,
.hljs-symbol,
.hljs-variable.constant_ {
color: #f5871f;
}
.hljs-class .hljs-title,
.hljs-title,
.hljs-title.class_ {
color: #eab700;
}
.hljs-strong {
font-weight: 700;
color: #eab700;
}
.hljs-addition,
.hljs-code,
.hljs-string,
.hljs-title.class_.inherited__ {
color: #718c00;
}
.hljs-built_in,
.hljs-doctag,
.hljs-keyword.hljs-atrule,
.hljs-quote,
.hljs-regexp {
color: #3e999f;
}
.hljs-attribute,
.hljs-function .hljs-title,
.hljs-section,
.hljs-title.function_,
.ruby .hljs-property {
color: #4271ae;
}
.diff .hljs-meta,
.hljs-keyword,
.hljs-template-tag,
.hljs-type {
color: #8959a8;
}
.hljs-emphasis {
color: #8959a8;
font-style: italic;
}
.hljs-meta,
.hljs-meta .hljs-keyword,
.hljs-meta .hljs-string {
color: #a3685a;
}
.hljs-meta .hljs-keyword,
.hljs-meta-keyword {
font-weight: 700;
}
@media (prefers-color-scheme: dark) {
/*! Theme: Tomorrow Night Author: Chris Kempson (http://chriskempson.com) License: ~ MIT (or more permissive) [via base16-schemes-source] Maintainer: @highlightjs/core-team Version: 2021.09.0*/
pre code.hljs {
display: block;
overflow-x: auto;
padding: 1em;
}
code.hljs {
padding: 3px 5px;
}
.hljs {
color: #ccc;
background: #2d2d2d;
}
.hljs ::selection,
.hljs::selection {
background-color: #515151;
color: #ccc;
}
.hljs-comment {
color: #999;
}
.hljs-tag {
color: #b4b7b4;
}
.hljs-operator,
.hljs-punctuation,
.hljs-subst {
color: #ccc;
}
.hljs-operator {
opacity: 0.7;
}
.hljs-bullet,
.hljs-deletion,
.hljs-name,
.hljs-selector-tag,
.hljs-template-variable,
.hljs-variable {
color: #f2777a;
}
.hljs-attr,
.hljs-link,
.hljs-literal,
.hljs-number,
.hljs-symbol,
.hljs-variable.constant_ {
color: #f99157;
}
.hljs-class .hljs-title,
.hljs-title,
.hljs-title.class_ {
color: #fc6;
}
.hljs-strong {
font-weight: 700;
color: #fc6;
}
.hljs-addition,
.hljs-code,
.hljs-string,
.hljs-title.class_.inherited__ {
color: #9c9;
}
.hljs-built_in,
.hljs-doctag,
.hljs-keyword.hljs-atrule,
.hljs-quote,
.hljs-regexp {
color: #6cc;
}
.hljs-attribute,
.hljs-function .hljs-title,
.hljs-section,
.hljs-title.function_,
.ruby .hljs-property {
color: #69c;
}
.diff .hljs-meta,
.hljs-keyword,
.hljs-template-tag,
.hljs-type {
color: #c9c;
}
.hljs-emphasis {
color: #c9c;
font-style: italic;
}
.hljs-meta,
.hljs-meta .hljs-keyword,
.hljs-meta .hljs-string {
color: #a3685a;
}
.hljs-meta .hljs-keyword,
.hljs-meta-keyword {
font-weight: 700;
}
}

View file

@ -98,11 +98,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1726871744,
"narHash": "sha256-V5LpfdHyQkUF7RfOaDPrZDP+oqz88lTJrMT1+stXNwo=",
"lastModified": 1730958623,
"narHash": "sha256-JwQZIGSYnRNOgDDoIgqKITrPVil+RMWHsZH1eE1VGN0=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "a1d92660c6b3b7c26fb883500a80ea9d33321be2",
"rev": "85f7e662eda4fa3a995556527c87b2524b691933",
"type": "github"
},
"original": {
@ -1390,6 +1390,22 @@
"type": "github"
}
},
"plugin-nvim-scrollbar": {
"flake": false,
"locked": {
"lastModified": 1729162132,
"narHash": "sha256-/nB7eP2Rz/A9zMXrNEH4FReo6eZS0C/SEGvKhxV7AUA=",
"owner": "petertriho",
"repo": "nvim-scrollbar",
"rev": "6994eb9f73d5fdc36ee2c8717940e8c853e51a49",
"type": "github"
},
"original": {
"owner": "petertriho",
"repo": "nvim-scrollbar",
"type": "github"
}
},
"plugin-nvim-session-manager": {
"flake": false,
"locked": {
@ -1614,6 +1630,22 @@
"type": "github"
}
},
"plugin-precognition-nvim": {
"flake": false,
"locked": {
"lastModified": 1730325090,
"narHash": "sha256-onY1Aa+dwLR1wRua52hpSXj6zZOZXjkUlDjDa0xEEcE=",
"owner": "tris203",
"repo": "precognition.nvim",
"rev": "0189e8d6f96275a079b2805d68d49414871885cd",
"type": "github"
},
"original": {
"owner": "tris203",
"repo": "precognition.nvim",
"type": "github"
}
},
"plugin-project-nvim": {
"flake": false,
"locked": {
@ -1694,22 +1726,6 @@
"type": "github"
}
},
"plugin-scrollbar-nvim": {
"flake": false,
"locked": {
"lastModified": 1684886154,
"narHash": "sha256-zLBexSxQCn9HPY04a9w/UCJP1F5ShI2X12I9xE9H0cM=",
"owner": "petertriho",
"repo": "nvim-scrollbar",
"rev": "35f99d559041c7c0eff3a41f9093581ceea534e8",
"type": "github"
},
"original": {
"owner": "petertriho",
"repo": "nvim-scrollbar",
"type": "github"
}
},
"plugin-smartcolumn": {
"flake": false,
"locked": {
@ -2071,6 +2087,7 @@
"plugin-nvim-neoclip": "plugin-nvim-neoclip",
"plugin-nvim-nio": "plugin-nvim-nio",
"plugin-nvim-notify": "plugin-nvim-notify",
"plugin-nvim-scrollbar": "plugin-nvim-scrollbar",
"plugin-nvim-session-manager": "plugin-nvim-session-manager",
"plugin-nvim-surround": "plugin-nvim-surround",
"plugin-nvim-tree-lua": "plugin-nvim-tree-lua",
@ -2085,12 +2102,12 @@
"plugin-oxocarbon": "plugin-oxocarbon",
"plugin-pathlib-nvim": "plugin-pathlib-nvim",
"plugin-plenary-nvim": "plugin-plenary-nvim",
"plugin-precognition-nvim": "plugin-precognition-nvim",
"plugin-project-nvim": "plugin-project-nvim",
"plugin-registers": "plugin-registers",
"plugin-rose-pine": "plugin-rose-pine",
"plugin-rtp-nvim": "plugin-rtp-nvim",
"plugin-rustaceanvim": "plugin-rustaceanvim",
"plugin-scrollbar-nvim": "plugin-scrollbar-nvim",
"plugin-smartcolumn": "plugin-smartcolumn",
"plugin-sqls-nvim": "plugin-sqls-nvim",
"plugin-tabular": "plugin-tabular",

View file

@ -439,7 +439,7 @@
flake = false;
};
plugin-scrollbar-nvim = {
plugin-nvim-scrollbar = {
url = "github:petertriho/nvim-scrollbar";
flake = false;
};
@ -562,6 +562,11 @@
flake = false;
};
plugin-precognition-nvim = {
url = "github:tris203/precognition.nvim";
flake = false;
};
# Note-taking
plugin-obsidian-nvim = {
url = "github:epwalsh/obsidian.nvim";

View file

@ -19,7 +19,7 @@
docs-html-wrapped = pkgs.writeScriptBin "docs-html-wrapped" ''
#!${pkgs.stdenv.shell}
# use xdg-open to open the docs in the browser
${pkgs.xdg_utils}/bin/xdg-open ${docs.manual.html}
${pkgs.xdg-utils}/bin/xdg-open ${docs.manual.html}
'';
# Exposed neovim configurations
@ -29,10 +29,10 @@
# Published docker images
docker-nix = let
inherit (pkgs) bash gitFull buildEnv dockerTools;
inherit (pkgs) bash gitFull buildEnv;
inherit (config.legacyPackages) neovim-nix;
in
dockerTools.buildImage {
pkgs.dockerTools.buildImage {
name = "nvf";
tag = "latest";

View file

@ -15,10 +15,14 @@ in {
config = mkIf cfg.enable {
vim = {
startPlugins = [
(assert config.vim.visuals.nvimWebDevicons.enable; "nvim-bufferline-lua")
"nvim-bufferline-lua"
"bufdelete-nvim"
];
# Soft-dependency for bufferline.
# Recommended by upstream, so enabled here.
visuals.nvim-web-devicons.enable = true;
maps.normal = mkMerge [
(mkLuaBinding cfg.mappings.closeCurrent "require(\"bufdelete\").bufdelete" mappings.closeCurrent.description)
(mkBinding cfg.mappings.cycleNext ":BufferLineCycleNext<CR>" mappings.cycleNext.description)

View file

@ -2,5 +2,6 @@ _: {
imports = [
./hop
./leap
./precognition
];
}

View file

@ -0,0 +1,18 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf;
cfg = config.vim.utility.motion.precognition;
in {
config = mkIf cfg.enable {
vim = {
startPlugins = ["precognition-nvim"];
luaConfigRC.precognition = lib.nvim.dag.entryAnywhere ''
require('precognition').setup(${lib.nvim.lua.toLuaObject cfg.setupOpts})
'';
};
};
}

View file

@ -0,0 +1,6 @@
{
imports = [
./precognition.nix
./config.nix
];
}

View file

@ -0,0 +1,66 @@
{lib, ...}: let
inherit (lib.options) mkEnableOption mkOption literalExpression;
inherit (lib.types) attrsOf listOf str bool int submodule;
inherit (lib.nvim.types) mkPluginSetupOption;
mkHintType = description:
mkOption {
inherit description;
default = {};
type = attrsOf (submodule {
options = {
text = mkOption {
type = str;
description = "The easier-to-read depiction of the motion";
};
prio = mkOption {
type = int;
default = 1;
description = "The priority of the hint";
example = 10;
};
};
});
};
in {
options.vim.utility.motion.precognition = {
enable = mkEnableOption "assisted motion discovery[precognition.nvim]";
setupOpts = mkPluginSetupOption "precognition.nvim" {
startVisible = mkOption {
type = bool;
default = true;
description = "Whether to start 'precognition' automatically";
};
showBlankVirtLine = mkOption {
type = bool;
default = true;
description = "Whether to show a blank virtual line when no movements are shown";
};
highlightColor = mkOption {
type = attrsOf str;
default = {link = "Comment";};
example = literalExpression ''
{ link = "Comment"; }
# or
{ foreground = "#0000FF"; background = "#000000"; };
'';
description = "The highlight for the virtual text";
};
disabled_fts = mkOption {
type = listOf str;
default = ["startify"];
example = literalExpression ''["startify"]'';
description = "Filetypes that automatically disable 'precognition'";
};
hints = mkHintType "What motions display, and at what priority";
gutterHints = mkHintType ''
What motions display and at what priority. Only appears in gutters
'';
};
};
}

View file

@ -0,0 +1,60 @@
{lib, ...}: let
inherit (lib.modules) mkRenamedOptionModule;
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.nvim.types) luaInline;
inherit (lib.nvim.binds) mkMappingOption;
inherit (lib.generators) mkLuaInline;
in {
imports = [
(mkRenamedOptionModule ["vim" "visuals" "cellularAutomaton"] ["vim" "visuals" "cellular-automaton"])
];
options.vim.visuals.cellular-automaton = {
enable = mkEnableOption "cellular-automaton to help you cope with stubborn code [cellular-automaton]";
mappings = {
makeItRain = mkMappingOption "Make it rain [cellular-automaton]" "<leader>fml";
};
animation = {
register = mkEnableOption "registering configured animation(s) automatically" // {default = true;};
setup = mkOption {
type = luaInline;
default = mkLuaInline ''
local ca_config = {
fps = 50,
name = 'slide',
}
-- init function is invoked only once at the start
-- config.init = function (grid)
--
-- end
-- update function
ca_config.update = function (grid)
for i = 1, #grid do
local prev = grid[i][#(grid[i])]
for j = 1, #(grid[i]) do
grid[i][j], prev = prev, grid[i][j]
end
end
return true
end
'';
description = ''
Configuration used to generate an animation to be registered.
The final value for `ca_config` will be used to register a new
animation using `require("cellular-automaton").register_animation(ca_config)`
::: {.warning}
`ca_config` **must** eval to a valid Lua table. nvf does not and cannot
perform any kind of validation on your Lua code, so bogus values will
result in errors when the animation is registered.
:::
'';
};
};
};
}

View file

@ -0,0 +1,39 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.strings) optionalString;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.dag) entryAnywhere entryAfter;
inherit (lib.nvim.binds) mkBinding;
cfg = config.vim.visuals.cellular-automaton;
in {
config = mkIf cfg.enable {
vim = {
startPlugins = ["cellular-automaton"];
maps.normal = mkBinding cfg.mappings.makeItRain "<cmd>CellularAutomaton make_it_rain<CR>" "Make it rain";
pluginRC = {
# XXX: This has no error handling. User can set
# `animation.setup` to a bogus value, and we would
# have an error in our hands. I don't think there
# is a good way to check for errors, so I'm leaving
# it like this under the assumption that the user
# will not mess it up for no reason.
cellular-automaton-anim = entryAnywhere (optionalString cfg.animation.register ''
-- Coerce user animation config into pluginRC
${toLuaObject cfg.animation.setup}
'');
cellular-automaton = entryAfter ["cellular-automaton-anim"] ''
-- Register the animation
require("cellular-automaton").register_animation(ca_config)
'';
};
};
};
}

View file

@ -0,0 +1,6 @@
{
imports = [
./config.nix
./cellular-automaton.nix
];
}

View file

@ -0,0 +1,35 @@
{lib, ...}: let
inherit (lib.modules) mkRemovedOptionModule;
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.types) submodule attrs attrsOf;
inherit (lib.nvim.types) mkPluginSetupOption;
in {
imports = [
(mkRemovedOptionModule ["vim" "visuals" "smoothScroll"] ''
`vim.visuals.smoothScroll` has been removed. You may consider enabling the
option `vim.visuals.cinnamon-nvim` to repliace previous smooth scrolling
behaviour.
'')
];
options.vim.visuals.cinnamon-nvim = {
enable = mkEnableOption "smooth scrolling for ANY command [cinnamon-nvim]";
setupOpts = mkPluginSetupOption "cinnamon.nvim" {
options = mkOption {
type = attrs;
default = {
# Defaults provided for the sake of documentation only!
# Who would've guessed setupOpts.options would be confusing?
mode = "cursor";
count_only = false;
};
description = "Scroll options";
};
keymaps = {
basic = mkEnableOption "basic animation keymaps";
extra = mkEnableOption "extra animation keymaps";
};
};
};
}

View file

@ -0,0 +1,21 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.dag) entryAnywhere;
cfg = config.vim.visuals.cinnamon-nvim;
in {
config = mkIf cfg.enable {
vim = {
startPlugins = ["cinnamon-nvim"];
pluginRC.cursorline = entryAnywhere ''
require("cinnamon").setup(${toLuaObject cfg.setupOpts})
'';
};
};
}

View file

@ -0,0 +1,6 @@
{
imports = [
./config.nix
./cinnamon-nvim.nix
];
}

View file

@ -1,118 +0,0 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf mkMerge;
inherit (lib.trivial) boolToString;
inherit (lib.nvim.binds) mkBinding;
inherit (lib.nvim.dag) entryAnywhere;
inherit (lib.nvim.lua) toLuaObject;
cfg = config.vim.visuals;
in {
config = mkIf cfg.enable (mkMerge [
(mkIf cfg.indentBlankline.enable {
vim.startPlugins = ["indent-blankline"];
vim.pluginRC.indent-blankline = entryAnywhere ''
require("ibl").setup(${toLuaObject cfg.indentBlankline.setupOpts})
'';
})
(mkIf cfg.cursorline.enable {
vim.startPlugins = ["nvim-cursorline"];
vim.pluginRC.cursorline = entryAnywhere ''
require('nvim-cursorline').setup {
cursorline = {
timeout = ${toString cfg.cursorline.lineTimeout},
number = ${boolToString (!cfg.cursorline.lineNumbersOnly)},
}
}
'';
})
(mkIf cfg.nvimWebDevicons.enable {
vim.startPlugins = ["nvim-web-devicons"];
})
(mkIf cfg.scrollBar.enable {
vim.startPlugins = ["scrollbar-nvim"];
vim.pluginRC.scrollBar = entryAnywhere ''
require('scrollbar').setup{
excluded_filetypes = {
'prompt',
'TelescopePrompt',
'noice',
'NvimTree',
'alpha',
'notify',
'Navbuddy'
},
}
'';
})
(mkIf cfg.smoothScroll.enable {
vim.startPlugins = ["cinnamon-nvim"];
vim.pluginRC.smoothScroll = entryAnywhere ''
require('cinnamon').setup()
'';
})
(mkIf cfg.cellularAutomaton.enable {
vim.startPlugins = ["cellular-automaton"];
vim.maps.normal = mkBinding cfg.cellularAutomaton.mappings.makeItRain "<cmd>CellularAutomaton make_it_rain<CR>" "Make it rain";
vim.pluginRC.cellularAUtomaton = entryAnywhere ''
local config = {
fps = 50,
name = 'slide',
}
-- init function is invoked only once at the start
-- config.init = function (grid)
--
-- end
-- update function
config.update = function (grid)
for i = 1, #grid do
local prev = grid[i][#(grid[i])]
for j = 1, #(grid[i]) do
grid[i][j], prev = prev, grid[i][j]
end
end
return true
end
require("cellular-automaton").register_animation(config)
'';
})
(mkIf cfg.highlight-undo.enable {
vim.startPlugins = ["highlight-undo"];
vim.pluginRC.highlight-undo = entryAnywhere ''
require('highlight-undo').setup({
duration = ${toString cfg.highlight-undo.duration},
highlight_for_count = ${boolToString cfg.highlight-undo.highlightForCount},
undo = {
hlgroup = ${cfg.highlight-undo.undo.hlGroup},
mode = 'n',
lhs = 'u',
map = 'undo',
opts = {}
},
redo = {
hlgroup = ${cfg.highlight-undo.redo.hlGroup},
mode = 'n',
lhs = '<C-r>',
map = 'redo',
opts = {}
},
})
'';
})
]);
}

View file

@ -1,7 +1,19 @@
{...}: {
{lib, ...}: let
inherit (lib.modules) mkRemovedOptionModule;
in {
imports = [
./config.nix
./visuals.nix
./fidget
(mkRemovedOptionModule ["vim" "visuals" "enable"] ''
As top-level toggles are being deprecated, you are encouraged
to handle plugin toggles under individual options.
'')
./cellular-automaton
./cinnamon-nvim
./fidget-nvim
./highlight-undo
./indent-blankline
./nvim-cursorline
./nvim-scrollbar
./nvim-web-devicons
];
}

View file

@ -12,8 +12,11 @@
in {
imports = [
(mkRenamedOptionModule ["vim" "visuals" "fidget-nvim" "align" "bottom"] ["vim" "visuals" "fidget-nvim" "setupOpts" "notification" "window" "align"])
(mkRemovedOptionModule ["vim" "visuals" "fidget-nvim" "align" "right"]
"Option `vim.fidget-nvim.align.right` has been removed and does not have an equivalent replacement in rewritten fidget.nvim configuration.")
(mkRemovedOptionModule ["vim" "visuals" "fidget-nvim" "align" "right"] ''
Option `vim.fidget-nvim.align.right` has been removed and does not have an
equivalent replacement in rewritten fidget.nvim configuration. Please remove
it from your configuration.
'')
];
options.vim.visuals.fidget-nvim = {

View file

@ -0,0 +1,21 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.dag) entryAnywhere;
cfg = config.vim.visuals.highlight-undo;
in {
config = mkIf cfg.enable {
vim = {
startPlugins = ["highlight-undo"];
pluginRC.highlight-undo = entryAnywhere ''
require("highlight-undo").setup(${toLuaObject cfg.setupOpts})
'';
};
};
}

View file

@ -0,0 +1,6 @@
{
imports = [
./config.nix
./highlight-undo.nix
];
}

View file

@ -0,0 +1,32 @@
{lib, ...}: let
inherit (lib.modules) mkRemovedOptionModule;
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.types) int;
inherit (lib.nvim.types) mkPluginSetupOption;
checkDocsMsg = ''
highlight-undo.nvim has deprecated previously used configuration options in
a recent update, so previous values will no longer work as expected.
Please use `vim.visuals.highlight-undo.setupOpts` with upstream instructions
'';
in {
imports = [
# This gives a lot of error messages for those with default values set or modified. Could
# there be a better way to handle his? Perhaps an assertion?
(mkRemovedOptionModule ["vim" "visuals" "highlight-undo" "highlightForCount"] checkDocsMsg)
(mkRemovedOptionModule ["vim" "visuals" "highlight-undo" "undo" "hlGroup"] checkDocsMsg)
(mkRemovedOptionModule ["vim" "visuals" "highlight-undo" "redo" "hlGroup"] checkDocsMsg)
];
options.vim.visuals.highlight-undo = {
enable = mkEnableOption "highlight undo [highlight-undo]";
setupOpts = mkPluginSetupOption "highlight-undo" {
duration = mkOption {
type = int;
default = 500;
description = "Duration of the highlight";
};
};
};
}

View file

@ -0,0 +1,21 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.dag) entryAnywhere;
cfg = config.vim.visuals.indent-blankline;
in {
config = mkIf cfg.enable {
vim = {
startPlugins = ["indent-blankline"];
pluginRC.indent-blankline = entryAnywhere ''
require("ibl").setup(${toLuaObject cfg.setupOpts})
'';
};
};
}

View file

@ -0,0 +1,6 @@
{
imports = [
./config.nix
./indent-blankline.nix
];
}

View file

@ -0,0 +1,195 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkRenamedOptionModule;
inherit (lib.options) mkOption mkEnableOption literalExpression;
inherit (lib.types) int bool str nullOr either listOf attrsOf;
cfg = config.vim.visuals;
in {
imports = [
(mkRenamedOptionModule ["vim" "visuals" "indentBlankline"] ["vim" "visuals" "indent-blankline"])
];
options.vim.visuals.indent-blankline = {
enable = mkEnableOption "indentation guides [indent-blankline]";
setupOpts = {
debounce = mkOption {
type = int;
description = "Debounce time in milliseconds";
default = 200;
};
viewport_buffer = {
min = mkOption {
type = int;
description = "Number of lines above and below of what is currently
visible in the window";
default = 30;
};
max = mkOption {
type = int;
description = "Number of lines above and below of what is currently
visible in the window";
default = 500;
};
};
indent = {
char = mkOption {
type = either str (listOf str);
description = "Character(s) for indentation guide";
default = "";
};
tab_char = mkOption {
type = nullOr (either str (listOf str));
description = ''
Character(s) for tab indentation guide.
See `:help ibl.config.indent.tab_char`.
'';
default = null;
};
highlight = mkOption {
type = nullOr (either str (listOf str));
description = ''
The highlight group(s) applied to the indentation guide.
See `:help ibl.config.indent.highlight`.
'';
default = null;
};
smart_indent_cap = mkOption {
type = bool;
description = "Caps the number of indentation levels based on surrounding code";
default = true;
};
priority = mkOption {
type = int;
description = "Virtual text priority for the indentation guide";
default = 1;
};
repeat_linebreak = mkOption {
type = bool;
description = "Repeat indentation guides on wrapped lines";
default = true;
};
};
whitespace = {
highlight = mkOption {
type = nullOr (either str (listOf str));
description = ''
The highlight group(s) applied to whitespace.
See `:help ibl.config.whitespace.highlight`.
'';
default = null;
};
remove_blankline_trail = mkOption {
type = bool;
description = "Remove trailing whitespace on blanklines";
default = true;
};
};
scope = {
enabled = mkOption {
description = "Highlight current scope from treesitter";
type = bool;
default = config.vim.treesitter.enable;
defaultText = literalExpression "config.vim.treesitter.enable";
};
char = mkOption {
type = either str (listOf str);
description = "The character(s) for the scope indentation guide";
default = cfg.indent-blankline.setupOpts.indent.char;
defaultText = literalExpression "config.vim.visuals.indent-blankline.setupOpts.indent.char";
};
show_start = mkOption {
type = bool;
description = "Show an underline on the first line of the scope";
default = false;
};
show_end = mkOption {
type = bool;
description = "Show an underline on the last line of the scope";
default = false;
};
show_exact_scope = mkOption {
type = bool;
description = "Show the scope underline at the exact start of the scope, even if that's to the right of the indentation guide";
default = false;
};
injected_languages = mkOption {
type = bool;
description = "Check for injected languages (treesitter)";
default = config.vim.treesitter.enable;
defaultText = literalExpression "config.vim.treesitter.enable";
};
highlight = mkOption {
type = nullOr (either str (listOf str));
description = ''
The highlight group(s) applied to the scope.
See `:help `ibl.config.scope.highlight`.
'';
default = null;
};
priority = mkOption {
type = int;
description = "Virtual text priority for the scope";
default = 1024;
};
include.node_type = mkOption {
type = attrsOf (listOf str);
description = "Additional nodes to be used for scope checking, per language";
default = {};
};
exclude = {
language = mkOption {
type = listOf str;
description = ''
The list of treesitter languages to disable scope for.
`*` can be used as a wildcard for every language/node type.
'';
default = [];
};
node_type = mkOption {
type = attrsOf (listOf str);
description = ''
Nodes to ignore in scope checking, per language.
`*` can be used as a wildcard for every language.
'';
default = {
"*" = ["source_file" "program"];
lua = ["chunk"];
python = ["module"];
};
};
};
};
};
};
}

View file

@ -0,0 +1,21 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.dag) entryAnywhere;
cfg = config.vim.visuals.nvim-cursorline;
in {
config = mkIf cfg.enable {
vim = {
startPlugins = ["nvim-cursorline"];
pluginRC.nvim-cursorline = entryAnywhere ''
require("nvim-cursorline").setup(${toLuaObject cfg.setupOpts})
'';
};
};
}

View file

@ -0,0 +1,6 @@
{
imports = [
./config.nix
./nvim-cursorline.nix
];
}

View file

@ -0,0 +1,65 @@
{lib, ...}: let
inherit (lib.modules) mkRenamedOptionModule mkRemovedOptionModule;
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.types) int bool;
inherit (lib.nvim.types) mkPluginSetupOption;
in {
imports = [
(mkRenamedOptionModule ["vim" "visuals" "cursorline"] ["vim" "visuals" "nvim-cursorline"])
(mkRenamedOptionModule ["vim" "visuals" "nvim-cursorline" "lineTimeout"] ["vim" "visuals" "nvim-cursorline" "setupOpts" "line_timeout"])
(mkRemovedOptionModule ["vim" "visuals" "nvim-cursorline" "lineNumbersOnly"] ''
`vim.visuals.nvim-cursorline.lineNumbersOnly` has been removed. Use `vim.visuals.nvim-cursorline.number` instead.
'')
];
options.vim.visuals.nvim-cursorline = {
enable = mkEnableOption "cursor word and line highlighting [nvim-cursorline]";
# Upstream has **zero** documentation whatsoever. I'm making wild assumptions
# on what goes into description based don the source code. I'm sorry. Not.
setupOpts = mkPluginSetupOption "nvim-cursorline" {
cursorline = {
enable = mkEnableOption "cursor line highlighting";
timeout = mkOption {
type = int;
default = 1000;
description = "Cursorline timeout";
};
number = mkOption {
type = bool;
default = false;
description = ''
If true, `vim.wo.cursorlineopt` will be set to "number"
when the trigger conditions are met.
'';
};
};
cursorword = {
enable = mkEnableOption "cursor word highlighting";
timeout = mkOption {
type = int;
default = 1000;
description = "Cursorword timeout";
};
min_length = mkOption {
type = int;
default = 3;
description = ''
The min_length option defines the minimum number of characters
a word must have to be highlighted as a "cursor word." Any word
shorter than this value will be ignored and not highlighted.
'';
};
hl.underline = mkOption {
type = bool;
default = true;
description = "Whether to underline matching cursorword";
};
};
};
};
}

View file

@ -0,0 +1,21 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.dag) entryAnywhere;
cfg = config.vim.visuals.nvim-scrollbar;
in {
config = mkIf cfg.enable {
vim = {
startPlugins = ["nvim-scrollbar"];
pluginRC.cursorline = entryAnywhere ''
require("scrollbar").setup(${toLuaObject cfg.setupOpts})
'';
};
};
}

View file

@ -0,0 +1,6 @@
{
imports = [
./config.nix
./scrollbar-nvim.nix
];
}

View file

@ -0,0 +1,21 @@
{lib, ...}: let
inherit (lib.modules) mkRenamedOptionModule;
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.types) listOf str;
inherit (lib.nvim.types) mkPluginSetupOption;
in {
imports = [
(mkRenamedOptionModule ["vim" "visuals" "scrollBar"] ["vim" "visuals" "nvim-scrollbar"])
];
options.vim.visuals.nvim-scrollbar = {
enable = mkEnableOption "extensible Neovim Scrollbar [nvim-scrollbar]";
setupOpts = mkPluginSetupOption "scrollbar-nvim" {
excluded_filetypes = mkOption {
type = listOf str;
default = ["prompt" "TelescopePrompt" "noice" "noice" "NvimTree" "neo-tree" "alpha" "notify" "Navbuddy"];
description = "Filetypes to hide the scrollbar on";
};
};
};
}

View file

@ -0,0 +1,21 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.dag) entryAnywhere;
cfg = config.vim.visuals.nvim-web-devicons;
in {
config = mkIf cfg.enable {
vim = {
startPlugins = ["nvim-web-devicons"];
pluginRC.nvim-web-devicons = entryAnywhere ''
require("nvim-web-devicons").setup(${toLuaObject cfg.setupOpts})
'';
};
};
}

View file

@ -0,0 +1,6 @@
{
imports = [
./config.nix
./nvim-web-devicons.nix
];
}

View file

@ -0,0 +1,48 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkRenamedOptionModule;
inherit (lib.options) mkOption mkEnableOption literalExpression;
inherit (lib.types) nullOr attrsOf attrs enum;
inherit (lib.nvim.types) mkPluginSetupOption;
in {
imports = [
(mkRenamedOptionModule ["vim" "visuals" "nvimWebDevicons"] ["vim" "visuals" "nvim-web-devicons"])
];
options.vim.visuals.nvim-web-devicons = {
enable = mkEnableOption "Neovim dev icons [nvim-web-devicons]";
setupOpts = mkPluginSetupOption "nvim-web-devicons" {
color_icons = mkEnableOption "different highlight colors per icon";
variant = mkOption {
type = nullOr (enum ["light" "dark"]);
default = null;
description = "Set the light or dark variant manually, instead of relying on `background`";
};
override = mkOption {
type = attrsOf attrs;
default = {};
example = literalExpression ''
{
zsh = {
name = "Zsh";
icon = "";
color = "#428850";
cterm_color = "65";
};
}
'';
description = ''
Your personal icon overrides.
You can specify color or cterm_color instead of specifying
both of them. DevIcon will be appended to `name`
'';
};
};
};
}

View file

@ -1,261 +0,0 @@
{
config,
lib,
...
}: let
inherit (lib.options) mkEnableOption mkOption literalExpression;
inherit (lib.types) int bool str nullOr either listOf attrsOf;
inherit (lib.nvim.binds) mkMappingOption;
cfg = config.vim.visuals;
in {
options.vim.visuals = {
enable = mkEnableOption "Visual enhancements.";
nvimWebDevicons.enable = mkEnableOption "dev icons. Required for certain plugins [nvim-web-devicons].";
scrollBar.enable = mkEnableOption "scrollbar [scrollbar.nvim]";
smoothScroll.enable = mkEnableOption "smooth scrolling [cinnamon-nvim]";
cellularAutomaton = {
enable = mkEnableOption "cellular automaton [cellular-automaton]";
mappings = {
makeItRain = mkMappingOption "Make it rain [cellular-automaton]" "<leader>fml";
};
};
cursorline = {
enable = mkEnableOption "line hightlighting on the cursor [nvim-cursorline]";
lineTimeout = mkOption {
type = int;
description = "Time in milliseconds for cursorline to appear";
default = 0;
};
lineNumbersOnly = mkOption {
type = bool;
description = "Hightlight only in the presence of line numbers";
default = true;
};
};
indentBlankline = {
enable = mkEnableOption "indentation guides [indent-blankline]";
setupOpts = {
debounce = mkOption {
type = int;
description = "Debounce time in milliseconds";
default = 200;
};
viewport_buffer = {
min = mkOption {
type = int;
description = "Number of lines above and below of what is currently
visible in the window";
default = 30;
};
max = mkOption {
type = int;
description = "Number of lines above and below of what is currently
visible in the window";
default = 500;
};
};
indent = {
char = mkOption {
type = either str (listOf str);
description = "Character(s) for indentation guide";
default = "";
};
tab_char = mkOption {
type = nullOr (either str (listOf str));
description = ''
Character(s) for tab indentation guide.
See `:help ibl.config.indent.tab_char`.
'';
default = null;
};
highlight = mkOption {
type = nullOr (either str (listOf str));
description = ''
The highlight group(s) applied to the indentation guide.
See `:help ibl.config.indent.highlight`.
'';
default = null;
};
smart_indent_cap = mkOption {
type = bool;
description = "Caps the number of indentation levels based on surrounding code";
default = true;
};
priority = mkOption {
type = int;
description = "Virtual text priority for the indentation guide";
default = 1;
};
repeat_linebreak = mkOption {
type = bool;
description = "Repeat indentation guides on wrapped lines";
default = true;
};
};
whitespace = {
highlight = mkOption {
type = nullOr (either str (listOf str));
description = ''
The highlight group(s) applied to whitespace.
See `:help ibl.config.whitespace.highlight`.
'';
default = null;
};
remove_blankline_trail = mkOption {
type = bool;
description = "Remove trailing whitespace on blanklines";
default = true;
};
};
scope = {
enabled = mkOption {
description = "Highlight current scope from treesitter";
type = bool;
default = config.vim.treesitter.enable;
defaultText = literalExpression "config.vim.treesitter.enable";
};
char = mkOption {
type = either str (listOf str);
description = "The character(s) for the scope indentation guide";
default = cfg.indentBlankline.setupOpts.indent.char;
defaultText = literalExpression "config.vim.visuals.indentBlankline.setuopOpts.indent.char";
};
show_start = mkOption {
type = bool;
description = "Show an underline on the first line of the scope";
default = false;
};
show_end = mkOption {
type = bool;
description = "Show an underline on the last line of the scope";
default = false;
};
show_exact_scope = mkOption {
type = bool;
description = "Show the scope underline at the exact start of the scope, even if that's to the right of the indentation guide";
default = false;
};
injected_languages = mkOption {
type = bool;
description = "Check for injected languages (treesitter)";
default = config.vim.treesitter.enable;
defaultText = literalExpression "config.vim.treesitter.enable";
};
highlight = mkOption {
type = nullOr (either str (listOf str));
description = ''
The highlight group(s) applied to the scope.
See `:help `ibl.config.scope.highlight`.
'';
default = null;
};
priority = mkOption {
type = int;
description = "Virtual text priority for the scope";
default = 1024;
};
include.node_type = mkOption {
type = attrsOf (listOf str);
description = "Additional nodes to be used for scope checking, per language";
default = {};
};
exclude = {
language = mkOption {
type = listOf str;
description = ''
The list of treesitter languages to disable scope for.
`*` can be used as a wildcard for every language/node type.
'';
default = [];
};
node_type = mkOption {
type = attrsOf (listOf str);
description = ''
Nodes to ignore in scope checking, per language.
`*` can be used as a wildcard for every language.
'';
default = {
"*" = ["source_file" "program"];
lua = ["chunk"];
python = ["module"];
};
};
};
};
};
};
highlight-undo = {
enable = mkEnableOption "highlight undo [highlight-undo]";
highlightForCount = mkOption {
type = bool;
default = true;
description = ''
Enable support for highlighting when a <count> is provided before the key
If set to false it will only highlight when the mapping is not prefixed with a <count>
'';
};
duration = mkOption {
type = int;
description = "Duration of highlight";
default = 500;
};
undo = {
hlGroup = mkOption {
type = str;
description = "Highlight group for undo";
default = "HighlightUndo";
};
};
redo = {
hlGroup = mkOption {
type = str;
description = "Highlight group for redo";
default = "HighlightUndo";
};
};
};
};
}

View file

@ -1,4 +1,4 @@
{
"release": "v0.6",
"isReleaseBranch": true
"release": "v0.7",
"isReleaseBranch": false
}