diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 0000000..4759413 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,78 @@ +name: Bug Report +description: Report a bug +title: 'bug: ' +labels: [bug] +body: + - type: checkboxes + attributes: + label: Prerequisites + options: + - label: + I have searched [existing + issues](https://github.com/barrettruth/midnight.nvim/issues) + required: true + - label: I have updated to the latest version + required: true + + - type: textarea + attributes: + label: 'Neovim version' + description: 'Output of `nvim --version`' + render: text + validations: + required: true + + - type: input + attributes: + label: 'Operating system' + placeholder: 'e.g. Arch Linux, macOS 15, Ubuntu 24.04' + validations: + required: true + + - type: textarea + attributes: + label: Description + description: What happened? What did you expect? + validations: + required: true + + - type: textarea + attributes: + label: Steps to reproduce + description: Minimal steps to trigger the bug + value: | + 1. + 2. + 3. + validations: + required: true + + - type: textarea + attributes: + label: 'Health check' + description: 'Output of `:checkhealth midnight`' + render: text + + - type: textarea + attributes: + label: Minimal reproduction + description: | + Save the script below as `repro.lua`, edit if needed, and run: + ``` + nvim -u repro.lua + ``` + Confirm the bug reproduces with this config before submitting. + render: lua + value: | + vim.env.LAZY_STDPATH = '.repro' + load(vim.fn.system('curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua'))() + require('lazy.nvim').setup({ + spec = { + { + 'barrett-ruth/midnight.nvim', + opts = {}, + }, + }, + }) + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml new file mode 100644 index 0000000..92bd099 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yaml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Questions + url: https://github.com/barrettruth/midnight.nvim/discussions + about: Ask questions and discuss ideas diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 0000000..77998c2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,30 @@ +name: Feature Request +description: Suggest a feature +title: 'feat: ' +labels: [enhancement] +body: + - type: checkboxes + attributes: + label: Prerequisites + options: + - label: + I have searched [existing + issues](https://github.com/barrettruth/midnight.nvim/issues) + required: true + + - type: textarea + attributes: + label: Problem + description: What problem does this solve? + validations: + required: true + + - type: textarea + attributes: + label: Proposed solution + validations: + required: true + + - type: textarea + attributes: + label: Alternatives considered diff --git a/.github/workflows/quality.yaml b/.github/workflows/quality.yaml index d7be890..e43f71c 100644 --- a/.github/workflows/quality.yaml +++ b/.github/workflows/quality.yaml @@ -11,7 +11,6 @@ jobs: runs-on: ubuntu-latest outputs: lua: ${{ steps.changes.outputs.lua }} - python: ${{ steps.changes.outputs.python }} markdown: ${{ steps.changes.outputs.markdown }} steps: - uses: actions/checkout@v4 @@ -25,10 +24,7 @@ jobs: - '*.lua' - '.luarc.json' - '*.toml' - python: - - 'scripts/**/*.py' - - 'pyproject.toml' - - 'uv.lock' + - 'vim.yaml' markdown: - '*.md' @@ -39,11 +35,8 @@ jobs: if: ${{ needs.changes.outputs.lua == 'true' }} steps: - uses: actions/checkout@v4 - - uses: JohnnyMorganz/stylua-action@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - version: 2.1.0 - args: --check . + - uses: cachix/install-nix-action@v31 + - run: nix develop --command stylua --check . lua-lint: name: Lua Lint Check @@ -52,11 +45,8 @@ jobs: if: ${{ needs.changes.outputs.lua == 'true' }} steps: - uses: actions/checkout@v4 - - name: Lint with Selene - uses: NTBBloodbath/selene-action@v1.0.0 - with: - token: ${{ secrets.GITHUB_TOKEN }} - args: --display-style quiet . + - uses: cachix/install-nix-action@v31 + - run: nix develop --command selene --display-style quiet . lua-typecheck: name: Lua Type Check @@ -72,48 +62,6 @@ jobs: directories: lua configpath: .luarc.json - python-format: - name: Python Format Check - runs-on: ubuntu-latest - needs: changes - if: ${{ needs.changes.outputs.python == 'true' }} - steps: - - uses: actions/checkout@v4 - - name: Install uv - uses: astral-sh/setup-uv@v4 - - name: Install ruff - run: uv tool install ruff - - name: Check Python formatting with ruff - run: ruff format --check . - - python-lint: - name: Python Lint Check - runs-on: ubuntu-latest - needs: changes - if: ${{ needs.changes.outputs.python == 'true' }} - steps: - - uses: actions/checkout@v4 - - name: Install uv - uses: astral-sh/setup-uv@v4 - - name: Install ruff - run: uv tool install ruff - - name: Lint Python files with ruff - run: ruff check . - - python-typecheck: - name: Python Type Check - runs-on: ubuntu-latest - needs: changes - if: ${{ needs.changes.outputs.python == 'true' }} - steps: - - uses: actions/checkout@v4 - - name: Install uv - uses: astral-sh/setup-uv@v4 - - name: Install dependencies with mypy - run: uv sync --dev - - name: Type check Python files with mypy - run: uv run mypy . - markdown-format: name: Markdown Format Check runs-on: ubuntu-latest @@ -121,15 +69,5 @@ jobs: if: ${{ needs.changes.outputs.markdown == 'true' }} steps: - uses: actions/checkout@v4 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 8 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - name: Install prettier - run: pnpm add -g prettier@3.1.0 - - name: Check markdown formatting with prettier - run: prettier --check . + - uses: cachix/install-nix-action@v31 + - run: nix develop --command prettier --check . diff --git a/.gitignore b/.gitignore index 7451084..d13bcc9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ venv/ CLAUDE.md __pycache__ node_modules/ + +.direnv/ +.envrc diff --git a/.luarc.json b/.luarc.json index 3ccfeda..e240dd5 100644 --- a/.luarc.json +++ b/.luarc.json @@ -1,8 +1,9 @@ { - "runtime.version": "Lua 5.1", + "runtime.version": "LuaJIT", "runtime.path": ["lua/?.lua", "lua/?/init.lua"], "diagnostics.globals": ["vim"], "workspace.library": ["$VIMRUNTIME/lua", "${3rd}/luv/library"], "workspace.checkThirdParty": false, + "workspace.ignoreDir": [".direnv"], "completion.callSnippet": "Replace" } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4706ce4..3477598 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,26 +9,6 @@ repos: files: \.lua$ pass_filenames: true - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.14.3 - hooks: - - id: ruff-format - name: ruff (format) - files: \.py$ - - id: ruff - name: ruff (lint imports) - args: ['--fix', '--select=I'] - files: \.py$ - - - repo: local - hooks: - - id: mypy - name: mypy (type check) - entry: uv run mypy - language: system - args: ['.'] - pass_filenames: false - - repo: https://github.com/pre-commit/mirrors-prettier rev: v4.0.0-alpha.8 hooks: diff --git a/.styluaignore b/.styluaignore new file mode 100644 index 0000000..9b42106 --- /dev/null +++ b/.styluaignore @@ -0,0 +1 @@ +.direnv/ diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b6f667a --- /dev/null +++ b/flake.lock @@ -0,0 +1,43 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1771423170, + "narHash": "sha256-K7Dg9TQ0mOcAtWTO/FX/FaprtWQ8BmEXTpLIaNRhEwU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "bcc4a9d9533c033d806a46b37dc444f9b0da49dd", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..18752aa --- /dev/null +++ b/flake.nix @@ -0,0 +1,33 @@ +{ + description = "midnight.nvim — a dark colorscheme for Neovim"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + systems.url = "github:nix-systems/default"; + }; + + outputs = + { + nixpkgs, + systems, + ... + }: + let + forEachSystem = + f: nixpkgs.lib.genAttrs (import systems) (system: f nixpkgs.legacyPackages.${system}); + in + { + formatter = forEachSystem (pkgs: pkgs.nixfmt-tree); + + devShells = forEachSystem (pkgs: { + default = pkgs.mkShell { + packages = [ + pkgs.prettier + pkgs.stylua + pkgs.selene + pkgs.lua-language-server + ]; + }; + }); + }; +} diff --git a/lua/midnight/init.lua b/lua/midnight/init.lua index 50a83ba..41d066f 100644 --- a/lua/midnight/init.lua +++ b/lua/midnight/init.lua @@ -1,7 +1,14 @@ local M = {} +local loading = false + ---@return nil function M.load() + if loading then + return + end + loading = true + if vim.g.colors_name then vim.cmd('hi clear') end @@ -15,6 +22,21 @@ function M.load() local theme = require('midnight.theme') theme.apply() + + loading = false +end + +---@deprecated Use `vim.cmd('colorscheme midnight')` instead +function M.setup(_opts) + vim.deprecate( + 'require("midnight").setup()', + 'vim.cmd("colorscheme midnight")', + 'v0.1.0', + 'midnight.nvim', + false + ) + + M.load() end return M diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index 25a7a15..1fbfa02 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -121,9 +121,13 @@ function M.apply() hi('@variable', { none = true }) - hi('Pmenu', { bg = cs.dark_grey }, { 'PmenuSbar' }) + hi('Pmenu', { fg = cs.background, bg = cs.foreground }, { 'PmenuSbar' }) hi('PmenuSel', { bg = cs.med_grey }) hi('PmenuThumb', { bg = cs.grey }) + hi('BlinkCmpMenu', { fg = cs.background, bg = cs.foreground }) + hi('BlinkCmpMenuBorder', { fg = cs.background, bg = cs.foreground }) + hi('BlinkCmpDoc', { fg = cs.background, bg = cs.foreground }) + hi('BlinkCmpDocBorder', { fg = cs.background, bg = cs.foreground }) hi('LspInlayHint', { fg = cs.light_black }) hi('LspSignatureActiveParameter', { underline = true, italic = true }) @@ -145,7 +149,13 @@ function M.apply() hi('gitCommitSummary', { fg = cs.background }) - hi('@attribute.diff', { fg = cs.background }) + hi('@attribute.diff', { fg = cs.blue }) + hi('@diff.minus', { fg = cs.red }) + hi('@diff.plus', { fg = cs.green }) + hi('@diff.delta', { fg = cs.blue }) + hi('@punctuation.special.diff', { fg = cs.blue }) + + link('Normal', { '@string.special.path', '@variable.parameter' }) hi('DiffAdd', { bg = cs.diff_add, fg = cs.green }, { '@text.diff.add', 'diffAdded' }) hi('DiffDelete', { bg = cs.diff_delete, fg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) hi('DiffChange', { bg = cs.diff_change, fg = cs.blue }) @@ -159,10 +169,12 @@ function M.apply() hi('@constructor.lua', { fg = cs.background }) hi('@markup.heading.gitcommit', { none = true }) + hi('@function.latex', { fg = cs.blue }) + hi('GitSignsCurrentLineBlame', { italic = true, fg = cs.light_black }) - link('DiffAdd', 'GitSignsAdd') - link('DiffChange', 'GitSignsChange') - link('DiffDelete', 'GitSignsDelete') + hi('GitSignsAdd', { fg = cs.green }) + hi('GitSignsChange', { fg = cs.blue }) + hi('GitSignsDelete', { fg = cs.red }) link('Search', 'HighlightUndo') @@ -171,6 +183,23 @@ function M.apply() hi('CmpItemAbbr', { fg = cs.background }) hi('CmpItemAbbrMatch', { fg = cs.background, bold = true }) hi('CmpItemAbbrMatchFuzzy', { fg = cs.background, bold = true }) + hi('BlinkCmpLabelMatch', { fg = cs.green }) + hi('BlinkCmpGhostText', { fg = cs.light_black }) + hi('BlinkCmpGitKindMR', { fg = cs.magenta }) + hi('BlinkCmpGitKindPR', { fg = cs.magenta }) + hi('BlinkCmpGitKindIssue', { fg = cs.magenta }) + hi('BlinkCmpGitKindCommit', { fg = cs.magenta }) + hi('BlinkCmpGitKindMention', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconMR', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconPR', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconIssue', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconCommit', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconMention', { fg = cs.magenta }) + hi('BlinkCmpGitLabelMRId', { fg = cs.magenta }) + hi('BlinkCmpGitLabelPRId', { fg = cs.magenta }) + hi('BlinkCmpGitLabelIssueId', { fg = cs.magenta }) + hi('BlinkCmpGitLabelCommitId', { fg = cs.magenta }) + hi('BlinkCmpGitLabelMentionId', { fg = cs.magenta }) hi('CmpItemAbbrDeprecated', { fg = cs.light_black, strikethrough = true }) hi('CmpItemMenu', { fg = cs.light_black }) diff --git a/scripts/ci.sh b/scripts/ci.sh new file mode 100755 index 0000000..18dc321 --- /dev/null +++ b/scripts/ci.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -eu + +nix develop --command stylua --check . +git ls-files '*.lua' | xargs nix develop --command selene --display-style quiet +nix develop --command prettier --check . +nix fmt +git diff --exit-code -- '*.nix' +nix develop --command lua-language-server --check . --checklevel=Warning diff --git a/selene.toml b/selene.toml index 96cf5ab..f2ada4b 100644 --- a/selene.toml +++ b/selene.toml @@ -1 +1,4 @@ std = 'vim' + +[lints] +bad_string_escape = 'allow' diff --git a/vim.toml b/vim.toml deleted file mode 100644 index 8bf26ea..0000000 --- a/vim.toml +++ /dev/null @@ -1,30 +0,0 @@ -[selene] -base = "lua51" -name = "vim" - -[vim] -any = true - -[jit] -any = true - -[assert] -any = true - -[describe] -any = true - -[it] -any = true - -[before_each] -any = true - -[after_each] -any = true - -[spy] -any = true - -[stub] -any = true diff --git a/vim.yaml b/vim.yaml new file mode 100644 index 0000000..3821d25 --- /dev/null +++ b/vim.yaml @@ -0,0 +1,26 @@ +--- +base: lua51 +name: vim +lua_versions: + - luajit +globals: + vim: + any: true + jit: + any: true + assert: + any: true + describe: + any: true + it: + any: true + before_each: + any: true + after_each: + any: true + spy: + any: true + stub: + any: true + bit: + any: true