feat: neovim lsp

This commit is contained in:
DACHXY 2025-01-13 18:46:15 +08:00
parent 45563277d5
commit c8ef495a63
22 changed files with 177 additions and 86 deletions

37
flake.lock generated
View file

@ -685,6 +685,22 @@
} }
}, },
"nixpkgs_4": { "nixpkgs_4": {
"locked": {
"lastModified": 1736523798,
"narHash": "sha256-Xb8mke6UCYjge9kPR9o4P1nVrhk7QBbKv3xQ9cj7h2s=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "130595eba61081acde9001f43de3248d8888ac4a",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_5": {
"locked": { "locked": {
"lastModified": 1729265718, "lastModified": 1729265718,
"narHash": "sha256-4HQI+6LsO3kpWTYuVGIzhJs1cetFcwT7quWCk/6rqeo=", "narHash": "sha256-4HQI+6LsO3kpWTYuVGIzhJs1cetFcwT7quWCk/6rqeo=",
@ -863,6 +879,24 @@
"type": "github" "type": "github"
} }
}, },
"pipewire-screenaudio": {
"inputs": {
"nixpkgs": "nixpkgs_4"
},
"locked": {
"lastModified": 1720719825,
"narHash": "sha256-+StN4RWwuVHmGFHeDr815t8lTWmRNC16uGTx8jEffPw=",
"owner": "IceDBorn",
"repo": "pipewire-screenaudio",
"rev": "bd404d0ee4b32fb797f2dcdeee3b6e773c06455c",
"type": "github"
},
"original": {
"owner": "IceDBorn",
"repo": "pipewire-screenaudio",
"type": "github"
}
},
"plugin-aerial-nvim": { "plugin-aerial-nvim": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -2840,6 +2874,7 @@
"nix-index-database": "nix-index-database", "nix-index-database": "nix-index-database",
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs_2",
"nvf": "nvf", "nvf": "nvf",
"pipewire-screenaudio": "pipewire-screenaudio",
"yazi": "yazi" "yazi": "yazi"
} }
}, },
@ -3035,7 +3070,7 @@
"yazi": { "yazi": {
"inputs": { "inputs": {
"flake-utils": "flake-utils_3", "flake-utils": "flake-utils_3",
"nixpkgs": "nixpkgs_4", "nixpkgs": "nixpkgs_5",
"rust-overlay": "rust-overlay_2" "rust-overlay": "rust-overlay_2"
}, },
"locked": { "locked": {

View file

@ -2,7 +2,11 @@
description = "DACHXY NixOS with hyprland"; description = "DACHXY NixOS with hyprland";
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs = {
url = "github:nixos/nixpkgs/nixos-unstable";
};
pipewire-screenaudio.url = "github:IceDBorn/pipewire-screenaudio";
home-manager.url = "github:nix-community/home-manager"; home-manager.url = "github:nix-community/home-manager";
home-manager.inputs.nixpkgs.follows = "nixpkgs"; home-manager.inputs.nixpkgs.follows = "nixpkgs";
@ -67,7 +71,7 @@
nixosConfigurations = { nixosConfigurations = {
dn-pre7780 = nixpkgs.lib.nixosSystem { dn-pre7780 = nixpkgs.lib.nixosSystem {
modules = [ modules = [
nvf.nixosModules.default nvf.nixosModules.default
nix-index-database.nixosModules.nix-index nix-index-database.nixosModules.nix-index
./system/dev/dn-pre7780 ./system/dev/dn-pre7780
]; ];

View file

@ -1,4 +1,6 @@
local util = require("lspconfig.util") local util = require("lspconfig.util")
local async = require("lspconfig.async")
local mod_cache = nil
require("lspconfig").lua_ls.setup({ require("lspconfig").lua_ls.setup({
on_init = function(client) on_init = function(client)
@ -90,6 +92,42 @@ return {
cmd = { "typescript-language-server", "--stdio" }, cmd = { "typescript-language-server", "--stdio" },
filetypes = { "vue", "ts", "tsx" }, filetypes = { "vue", "ts", "tsx" },
}, },
clangd = {
cmd = { "clangd" },
root_markers = { ".git", ".clangd", "compile_commands.json" },
filetypes = { "cpp", "c" },
capabilities = {
textDocument = {
semanticTokens = {
multilineTokenSupport = true,
},
},
},
},
gopls = {
cmd = { "gopls" },
filetypes = { "go", "gomod", "gowork", "gotmpl" },
root_dir = function(fname)
-- see: https://github.com/neovim/nvim-lspconfig/issues/804
if not mod_cache then
local result = async.run_command({ "go", "env", "GOMODCACHE" })
if result and result[1] then
mod_cache = vim.trim(result[1])
else
mod_cache = vim.fn.system("go env GOMODCACHE")
end
end
if mod_cache and fname:sub(1, #mod_cache) == mod_cache then
local clients = util.get_lsp_clients({ name = "gopls" })
if #clients > 0 then
return clients[#clients].config.root_dir
end
end
return util.root_pattern("go.work", "go.mod", ".git")(fname)
end,
single_file_support = true,
},
}, },
}, },
setup = {}, setup = {},

View file

@ -2,8 +2,9 @@
nix-version, nix-version,
username, username,
... ...
}: { }:
imports = [./user]; {
imports = [ ./user ];
home = { home = {
inherit username; inherit username;
homeDirectory = "/home/${username}"; homeDirectory = "/home/${username}";

36
home/user/bin.nix Normal file
View file

@ -0,0 +1,36 @@
{ pkgs, lib, ... }:
let
findDirs = [
"~/practice"
"~/projects"
];
tmuxSessionizer = pkgs.writeShellScriptBin "tmux-sessionizer" ''
if [[ $# -eq 1 ]]; then
selected=$1
else
selected=$(find ${lib.concatStringsSep " " findDirs} mindepth 1 -maxdepth 1 -type d | fzf)
fi
if [[ -z $selected ]]; then
exit 0
fi
selected_name=$(basename "$selected" | tr . _)
tmux_running=$(pgrep tmux)
if [[ -z $TMUX ]] && [[ -z $tmux_running ]]; then
tmux new-session -s $selected_name -c $selected
exit 0
fi
if ! tmux has-session -t=$selected_name 2> /dev/null; then
tmux new-session -ds $selected_name -c $selected
fi
tmux switch-client -t $selected_name
'';
in
{
home.packages = [ tmuxSessionizer ];
}

View file

@ -1,6 +1,7 @@
let let
configDir = ../config; configDir = ../config;
in { in
{
home.file = { home.file = {
".config/wallpapers".source = "${configDir}/wallpapers"; ".config/wallpapers".source = "${configDir}/wallpapers";
".config/kitty".source = "${configDir}/kitty"; ".config/kitty".source = "${configDir}/kitty";

View file

@ -1,4 +1,5 @@
{inputs, ...}: { { inputs, ... }:
{
imports = [ imports = [
./git.nix ./git.nix
./gtk.nix ./gtk.nix
@ -10,8 +11,8 @@
./virtualization.nix ./virtualization.nix
./hyprland.nix ./hyprland.nix
./swaync.nix ./swaync.nix
./desktop.nix
./neovim.nix ./neovim.nix
./bin.nix
inputs.hyprland.homeManagerModules.default inputs.hyprland.homeManagerModules.default
]; ];

View file

@ -1,50 +0,0 @@
{
nvidia-offload-enabled,
lib,
pkgs,
...
}:
let
offloadScript = import ../../system/modules/offload.nix { inherit pkgs; };
launcher = "${offloadScript}/bin/offload firefox";
in
with lib;
{
xdg.desktopEntries = lib.mkIf nvidia-offload-enabled {
firefox = {
actions = {
"new-private-window" = {
exec = "${launcher} --private-window %U";
name = "New Private Window";
};
"new-window" = {
exec = "${launcher} --new-window %U";
name = "New Window";
};
"profile-manager-window" = {
exec = "${launcher} --ProfileManager";
name = "Profile Manager";
};
};
exec = "${launcher} --name firefox %U";
categories = [
"Network"
"WebBrowser"
];
genericName = "Web Browser";
name = "Firefox";
startupNotify = true;
terminal = false;
type = "Application";
icon = "firefox";
mimeType = [
"text/html"
"text/xml"
"application/xhtml+xml"
"application/vnd.mozilla.xul+xml"
"x-scheme-handler/http"
"x-scheme-handler/https"
];
};
};
}

View file

@ -11,7 +11,6 @@
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
QT_AUTO_SCREEN_SCALE_FACTOR = "1"; QT_AUTO_SCREEN_SCALE_FACTOR = "1";
GTK_CSD = "0"; GTK_CSD = "0";
WLR_DRM_DEVICES = "/dev/dri/card1";
WLR_NO_HARDWARE_CURSORS = "1"; WLR_NO_HARDWARE_CURSORS = "1";
CLUTTER_BACKEND = "wayland"; CLUTTER_BACKEND = "wayland";
EGL_PLATFORM = "wayland"; EGL_PLATFORM = "wayland";

View file

@ -6,6 +6,10 @@ let
terminal = "${prefix}ghostty"; terminal = "${prefix}ghostty";
filemanager = "nemo"; filemanager = "nemo";
scripts = "~/.config/scripts"; scripts = "~/.config/scripts";
flatEmoji = "it.mijorus.smile";
# freezeShot = "--freeze";
freezeShot = "";
resizeStep = builtins.toString 20; resizeStep = builtins.toString 20;
brightnessStep = builtins.toString 10; brightnessStep = builtins.toString 10;
@ -25,17 +29,17 @@ in
''${mainMod}, P, pseudo, # dwindle'' ''${mainMod}, P, pseudo, # dwindle''
''${mainMod}, S, togglesplit, # dwindle'' ''${mainMod}, S, togglesplit, # dwindle''
''CTRL ${mainMod} SHIFT, L, exec, hyprlock'' ''CTRL ${mainMod} SHIFT, L, exec, hyprlock''
''${mainMod} SHIFT, s, exec, hyprshot -m region --clipboard-only --freeze'' ''${mainMod} SHIFT, s, exec, hyprshot -m region --clipboard-only ${freezeShot}''
''CTRL SHIFT, s, exec, hyprshot -m window --clipboard-only --freeze'' ''CTRL SHIFT, s, exec, hyprshot -m window --clipboard-only ${freezeShot}''
''CTRL SHIFT ${mainMod}, s, exec, hyprshot -m output --clipboard-only --freeze'' ''CTRL SHIFT ${mainMod}, s, exec, hyprshot -m output --clipboard-only ${freezeShot}''
''${mainMod}, PERIOD, exec, flatpak run it.mijorus.smile '' ''${mainMod}, PERIOD, exec, flatpak run ${flatEmoji}''
''${mainMod}, X, exec, sleep 0.1 && swaync-client -t -sw'' ''${mainMod}, X, exec, sleep 0.1 && swaync-client -t -sw''
''${mainMod} SHIFT, C, centerwindow'' ''${mainMod} SHIFT, C, centerwindow''
'',F11, fullscreen'' '',F11, fullscreen''
''${mainMod}, C, exec, code'' ''${mainMod}, C, exec, code''
# Color Picker # Color Picker
''${mainMod} SHIFT, P, exec, hyprpicker -f hex -a -z -r'' ''${mainMod} SHIFT, P, exec, hyprpicker -f hex -a -z''
# Cycle windows # Cycle windows
''ALT, TAB, cyclenext'' ''ALT, TAB, cyclenext''
@ -73,6 +77,7 @@ in
# ==== Plugins ==== # # ==== Plugins ==== #
# Overview # Overview
''${mainMod}, o, hyprexpo:expo, toggle'' ''${mainMod}, o, hyprexpo:expo, toggle''
''${mainMod}, TAB, hyprexpo:expo, toggle''
] ]
++ ( ++ (
# workspaces # workspaces

View file

@ -19,7 +19,7 @@ in
firefox = { firefox = {
enable = true; enable = true;
package = (pkgs.wrapFirefox (pkgs.firefox-unwrapped.override { pipewireSupport = true; }) { });
languagePacks = [ languagePacks = [
"en-US" "en-US"
"zh-TW" "zh-TW"
@ -50,6 +50,8 @@ in
"font.name.monospace.ja" = "Noto Sans Mono CJK JP"; "font.name.monospace.ja" = "Noto Sans Mono CJK JP";
"font.name.monospace.x-western" = "CaskaydiaCove Nerd Font Mono"; "font.name.monospace.x-western" = "CaskaydiaCove Nerd Font Mono";
"font.name.monospace.zh-TW" = "Noto Sans Mono CJK TC"; "font.name.monospace.zh-TW" = "Noto Sans Mono CJK TC";
# Disable Ctrl+Q
"browser.quitShortcut.disabled" = true;
}; };
}; };

View file

@ -7,7 +7,8 @@
username, username,
config, config,
... ...
}: let }:
let
hyprcursor-size = "32"; hyprcursor-size = "32";
xcursor-size = "24"; xcursor-size = "24";
nvidia-mode = "offload"; nvidia-mode = "offload";
@ -15,7 +16,8 @@
intel-bus-id = "PCI:0:2:0"; intel-bus-id = "PCI:0:2:0";
nvidia-bus-id = "PCI:1:0:0"; nvidia-bus-id = "PCI:1:0:0";
nvidia-offload-enabled = config.hardware.nvidia.prime.offload.enable; nvidia-offload-enabled = config.hardware.nvidia.prime.offload.enable;
in { in
{
imports = [ imports = [
inputs.home-manager.nixosModules.default inputs.home-manager.nixosModules.default
./hardware-configuration.nix ./hardware-configuration.nix

View file

@ -1,4 +1,5 @@
{...}: { { ... }:
{
imports = [ imports = [
./plymouth.nix # Boot splash ./plymouth.nix # Boot splash
./fonts.nix ./fonts.nix

View file

@ -10,10 +10,6 @@ let
pkgs-unstable = inputs.hyprland.inputs.nixpkgs.legacyPackages.${system}; pkgs-unstable = inputs.hyprland.inputs.nixpkgs.legacyPackages.${system};
in in
{ {
nixpkgs.config.packageOverrides = pkgs: {
intel-vaapi-driver = pkgs.intel-vaapi-driver.override { enableHybridCodec = true; };
};
hardware = { hardware = {
bluetooth = { bluetooth = {
enable = true; enable = true;

View file

@ -2,7 +2,8 @@
pkgs, pkgs,
inputs, inputs,
... ...
}: { }:
{
programs.hyprland = { programs.hyprland = {
enable = true; enable = true;
withUWSM = true; withUWSM = true;
@ -12,11 +13,9 @@
xdg.portal = { xdg.portal = {
enable = true; enable = true;
wlr.enable = true;
xdgOpenUsePortal = true; xdgOpenUsePortal = true;
extraPortals = [ extraPortals = [
pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-gtk
pkgs.xdg-desktop-portal-wlr
]; ];
}; };
@ -52,7 +51,7 @@
"flakes" "flakes"
]; ];
auto-optimise-store = true; auto-optimise-store = true;
substituters = ["https://hyprland.cachix.org"]; substituters = [ "https://hyprland.cachix.org" ];
trusted-public-keys = [ trusted-public-keys = [
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="

View file

@ -14,5 +14,6 @@
nginx-language-server nginx-language-server
nodePackages_latest.vscode-json-languageserver nodePackages_latest.vscode-json-languageserver
bash-language-server bash-language-server
gopls
]; ];
} }

View file

@ -1,5 +1,5 @@
{ {
nvidia-mode ? "sync", nvidia-mode ? "offload",
nvidia-bus-id, nvidia-bus-id,
intel-bus-id, intel-bus-id,
... ...
@ -10,7 +10,6 @@ let
"sync" "sync"
"rsync" "rsync"
]; ];
in in
{ {
config, config,
@ -54,7 +53,7 @@ lib.checkListOfEnum "Nvidia Prime Mode" validModes [ nvidia-mode ] {
nvidia.nvidiaSettings = true; nvidia.nvidiaSettings = true;
nvidia.dynamicBoost.enable = true; nvidia.dynamicBoost.enable = true;
nvidia.package = config.boot.kernelPackages.nvidiaPackages.beta; nvidia.package = config.boot.kernelPackages.nvidiaPackages.stable;
nvidia.prime = nvidia.prime =
( (
@ -95,7 +94,7 @@ lib.checkListOfEnum "Nvidia Prime Mode" validModes [ nvidia-mode ] {
environment.variables = { environment.variables = {
# GPU # GPU
LIBVA_DRIVER_NAME = "nvidia"; LIBVA_DRIVER_NAME = "nvidia";
__GLX_VENDOR_LIBRARY_NAME = "nvidia"; # __GLX_VENDOR_LIBRARY_NAME = "nvidia";
NVD_BACKEND = "direct"; NVD_BACKEND = "direct";
MOZ_DISABLE_RDD_SANDBOX = 1; MOZ_DISABLE_RDD_SANDBOX = 1;
OGL_DEDICATED_HW_STATE_PER_CONTEXT = "ENABLE_ROBUST"; OGL_DEDICATED_HW_STATE_PER_CONTEXT = "ENABLE_ROBUST";

View file

@ -16,13 +16,11 @@
gtk3 gtk3
adwaita-icon-theme adwaita-icon-theme
# Browser
firefox
# File Manager # File Manager
nemo nemo
# Utils # Utils
upower
jq jq
bat bat
btop btop

View file

@ -25,5 +25,4 @@
''; '';
}; };
}; };
} }

View file

@ -15,5 +15,8 @@
services.playerctld.enable = true; services.playerctld.enable = true;
environment.systemPackages = with pkgs; [ pavucontrol playerctl ]; environment.systemPackages = with pkgs; [
pavucontrol
playerctl
];
} }

View file

@ -11,7 +11,6 @@ in
environment.variables = { environment.variables = {
TMUXINATOR_CONFIG = "/etc/tmuxinator"; TMUXINATOR_CONFIG = "/etc/tmuxinator";
}; };
environment.etc = { environment.etc = {
"tmuxinator/tmux.yaml" = { "tmuxinator/tmux.yaml" = {
source = ../../home/config/tmux.yaml; source = ../../home/config/tmux.yaml;
@ -92,6 +91,9 @@ in
unbind -T copy-mode-vi MouseDragEnd1Pane unbind -T copy-mode-vi MouseDragEnd1Pane
unbind f
bind-key -r f run-shell "tmux neww tmux-sessionizer"
set -g @resurrect-capture-pane-contents 'on' set -g @resurrect-capture-pane-contents 'on'
set -g @continuum-restore 'on' set -g @continuum-restore 'on'
set -g @catppuccin-flavour 'macchiato' set -g @catppuccin-flavour 'macchiato'

19
utils/gpu-offload.nix Normal file
View file

@ -0,0 +1,19 @@
{
pkgs,
lib,
...
}:
with pkgs;
let
patchDesktop =
pkg: appName: from: to:
lib.hiPrio (
pkgs.runCommand "$patched-desktop-entry-for-${appName}" { } ''
${coreutils}/bin/mkdir -p $out/share/applications
${gnused}/bin/sed 's#${from}#${to}#g' < ${pkg}/share/applications/${appName}.desktop > $out/share/applications/${appName}.desktop
''
);
GPUOffloadApp = pkg: desktopName: patchDesktop pkg desktopName "^Exec=" "Exec=nvidia-offload ";
in
GPUOffloadApp