diff --git a/flake.nix b/flake.nix index ec802c7..dfda8c5 100644 --- a/flake.nix +++ b/flake.nix @@ -14,7 +14,7 @@ # url = "github:nix-community/nixvim/nixos-25.11"; # }; - outputs = { self, nixpkgs, home-manager, ... }@inputs: + outputs = { self, nixpkgs, home-manager,... }@inputs: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; diff --git a/hosts/laptop/configuration.nix b/hosts/laptop/configuration.nix index b89f249..a2dd0a8 100755 --- a/hosts/laptop/configuration.nix +++ b/hosts/laptop/configuration.nix @@ -11,14 +11,16 @@ ../../modules/nixos/battery.nix ]; - - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - -home-manager.users = { - tomasr = ./home.nix; +home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + users = { + tomasr = ./home.nix; + }; + #extraSpecialArgs = { inherit inputs; }; }; + environment.pathsToLink = [ "/share/applications" "/share/xdg-desktop-portal" @@ -175,6 +177,7 @@ cmatrix tomato-c # pomodoro timer pavucontrol # PulseAudio Volume Control hyprshot +hyprcursor ]; # fonts diff --git a/hosts/laptop/home.nix b/hosts/laptop/home.nix index f8704d5..d94122d 100755 --- a/hosts/laptop/home.nix +++ b/hosts/laptop/home.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, pkgs, inputs, ... }: { # every import imports a specific module for an app. This module contains the enabling of this app and its settings. @@ -16,6 +16,7 @@ imports = [ ../../modules/home-manager/rofi.nix # launcher and keybindings helper ../../modules/home-manager/swaync.nix # notification daemon ../../modules/home-manager/neovim.nix # dont use nixvim. broken +#../../modules/home-manager/neovim2.nix # ./neovim2.nix uses vim plug instead of the nix repository as with ./neovim.nix see the begining of neovim2 for an explanation ../../modules/home-manager/rclone.nix ../../modules/home-manager/waybar.nix #../../modules/home-manager/oh-my-posh.nix # zsh customizer @@ -26,6 +27,7 @@ imports = [ + #programs.nixvim = { # enable = true; # imports = [ ../../modules/nixvim/neovim.nix ]; diff --git a/modules/home-manager/hyprland.nix b/modules/home-manager/hyprland.nix index b2c7216..32946f2 100644 --- a/modules/home-manager/hyprland.nix +++ b/modules/home-manager/hyprland.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, pkgs,... }: let wallpaper = ../../assets/wallpaper1.jpg; @@ -14,6 +14,7 @@ in wayland.windowManager.hyprland.plugins = [ pkgs.hyprlandPlugins.hyprspace + pkgs.hyprlandPlugins.hypr-dynamic-cursors ]; wayland.windowManager.hyprland.settings = { "$mod" = "SUPER"; @@ -250,6 +251,79 @@ in #| | | || || |_| || | | | | | _____| | #|___| |_______||_______||_______||___| |_| |__||_______| # + "plugin:dynamic-cursors" = { + enabled = true; + threshold = 2; + mode = "rotate"; + rotate = { + # length in px of the simulated stick used to rotate the cursor + # most realistic if this is your actual cursor size + length = 20; + offset = 0; + }; + shake = { + enabled = true; + # use nearest-neighbour (pixelated) scaling when shaking + # may look weird when effects are enabled + nearest = true; + threshold = 4; + # magnification level immediately after shake start + base = 4.0; + # magnification increase per second when continuing to shake + speed = 4.0; + # how much the speed is influenced by the current shake intensitiy + influence = 0.0; + + # maximal magnification the cursor can reach + # values below 1 disable the limit (e.g. 0) + limit = 0.0; + + # time in millseconds the cursor will stay magnified after a shake has ended + timeout = 2000; + + # show cursor behaviour `tilt`, `rotate`, etc. while shaking + effects = true; + + # enable ipc events for shake + ipc = false; + }; + + }; + +##################################################### +##################################################### +# theme + decoration = { + dim_special = 0.3; + blur = { + special = true; + enabled = true; + size = 4; + passes = 2; + new_optimizations = true; + ignore_opacity = true; + }; + }; + general = { + gaps_in = 3; + gaps_out = 8; + border_size = 4; + "col.active_border" = "rgba(ca6702ff) rgba(ecd3a0ff) 45deg"; + "col.inactive_border" = "rgba(f1dca7d9) rgba(ffe1a8d9) 45deg"; + layout = "dwindle"; + resize_on_border = true; + + + }; + group = { + "col.border_active" = "rgba(ca6702ff) rgba(ecd3a0ff) 45deg"; + "col.border_inactive" = "rgba(f1dca7d9) rgba(ffe1a8d9) 45deg"; + "col.border_locked_active" = "rgba(ca6702ff) rgba(ecd3a0ff) 45deg"; + "col.border_locked_inactive" = "rgba(f1dca7d9) rgba(ffe1a8d9) 45deg"; + }; +#################################################### +################################################## + # █░█░█ █ █▄░█ █▀▄ █▀█ █░█░█   █▀█ █░█ █░░ █▀▀ █▀ # ▀▄▀▄▀ █ █░▀█ █▄▀ █▄█ ▀▄▀▄▀   █▀▄ █▄█ █▄▄ ██▄ ▄█ windowrulev2 = [ @@ -325,6 +399,7 @@ in "float,class:^(com.github.unrud.VideoDownloader)$" # VideoDownloader-Gkk "float,class:^(io.gitlab.adhami3310.Impression)$" # Impression-Gtk "float,class:^(io.missioncenter.MissionCenter)$" # MissionCenter-Gtk +# add a float for tomato when in kitty #"plugin:imgborders:noimgborders, tag:noborder" ]; layerrule = [ @@ -339,5 +414,8 @@ in "blur,logout_dialog" ]; + }; } + + diff --git a/modules/home-manager/neovim.nix b/modules/home-manager/neovim.nix index 8aa72b5..acfd81a 100644 --- a/modules/home-manager/neovim.nix +++ b/modules/home-manager/neovim.nix @@ -3,5 +3,592 @@ { programs.neovim = { enable = true; + vimAlias = true; + viAlias = true; + plugins = [ + pkgs.vimPlugins.vimtex + pkgs.vimPlugins.zoxide-vim + pkgs.vimPlugins.gruvbox + pkgs.vimPlugins.neovim-sensible + pkgs.vimPlugins.nvim-web-devicons + pkgs.vimPlugins.nvim-tree-lua + pkgs.vimPlugins.nvim-surround + pkgs.vimPlugins.floaterm + pkgs.vimPlugins.nvim-lspconfig + pkgs.vimPlugins.cmp-nvim-lsp + pkgs.vimPlugins.cmp-buffer + pkgs.vimPlugins.cmp-path + pkgs.vimPlugins.cmp-cmdline + pkgs.vimPlugins.nvim-cmp + pkgs.vimPlugins.cmp-vsnip + pkgs.vimPlugins.vim-vsnip + pkgs.vimPlugins.dashboard-nvim + pkgs.vimPlugins.lualine-nvim + # nix coloring and etc. + pkgs.vimPlugins.vim-nix + # required for Telescope + pkgs.vimPlugins.plenary-nvim + pkgs.vimPlugins.blink-ripgrep-nvim + pkgs.vimPlugins.nvim-treesitter + pkgs.vimPlugins.telescope-nvim + # scrollbar + pkgs.vimPlugins.nvim-scrollbar + # ufo + pkgs.vimPlugins.promise-async + pkgs.vimPlugins.nvim-ufo + # cheatsheet + pkgs.vimPlugins.cheatsheet-nvim + pkgs.vimPlugins.popup-nvim + # multiple cursor + #Plug 'brenton-leighton/multiple-cursors.nvim' + # i use instead the following: + pkgs.vimPlugins.vim-visual-multi +# plugins not found + #Plug 'arminveres/md-pdf.nvim' + #Plug "sharkdp/fd" + #Plug 'sontungexpt/better-diagnostic-virtual-text' + ]; + extraLuaConfig = '' +local vim = vim +-- local Plug = vim.fn['plug#'] +vim.g.mapleader ='ü' +vim.g.maplocalleader = 'ü' + +-- Set to true if you have a Nerd Font installed and selected in the terminal +vim.g.have_nerd_font = true + +-- [[ Setting options ]] +-- See `:help vim.opt` +-- NOTE: You can change these options as you wish! +-- For more options, you can see `:help option-list` + +-- Make line numbers default +-- You can also add relative line numbers, to help with jumping. +-- Experiment for yourself to see if you like it! +vim.opt.relativenumber = false + +-- Enable mouse mode, can be useful for resizing splits for example! +vim.opt.mouse = 'a' + +-- Don't show the mode, since it's already in the status line +vim.opt.showmode = false + +-- Sync clipboard between OS and Neovim. +-- Schedule the setting after `UiEnter` because it can increase startup-time. +-- Remove this option if you want your OS clipboard to remain independent. +-- See `:help 'clipboard'` +vim.schedule(function() + vim.opt.clipboard = 'unnamedplus' +end) + + +-- Enable break indent +vim.opt.breakindent = true + +-- Save undo history +vim.opt.undofile = true + +-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term +vim.opt.ignorecase = true +vim.opt.smartcase = true + +-- Keep signcolumn on by default +vim.opt.signcolumn = 'yes' + +-- Decrease update time +vim.opt.updatetime = 250 + +-- Decrease mapped sequence wait time +-- Displays which-key popup sooner +vim.opt.timeoutlen = 300 + +-- Configure how new splits should be opened +vim.opt.splitright = true +vim.opt.splitbelow = true + +-- Sets how neovim will display certain whitespace characters in the editor. +-- See `:help 'list'` +-- and `:help 'listchars'` +vim.opt.list = true +vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' } + + + +-- indentation settings - added by me +-- refere to https://stackoverflow.com/questions/51995128/setting-autoindentation-to-spaces-in-neovim for more information +vim.opt.expandtab = true +vim.opt.smartindent = true +vim.opt.tabstop = 4 +vim.opt.shiftwidth = 4 + +-- Preview substitutions live, as you type! +vim.opt.inccommand = 'split' + +-- Show which line your cursor is on +vim.opt.cursorline = true + +-- Minimal number of screen lines to keep above and below the cursor. +vim.opt.scrolloff = 10 + +-- [[ Basic Keymaps ]] +-- See `:help vim.keymap.set()` + +-- Clear highlights on search when pressing in normal mode +-- See `:help hlsearch` +vim.keymap.set('n', '', 'nohlsearch') + +-- Diagnostic keymaps +vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' }) + +-- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier +-- for people to discover. Otherwise, you normally need to press , which +-- is not what someone will guess without a bit more experience. +-- +-- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping +-- or just use to exit terminal mode +vim.keymap.set('t', '', '', { desc = 'Exit terminal mode' }) + +-- TIP: Disable arrow keys in normal mode +-- vim.keymap.set('n', '', 'echo "Use h to move!!"') +-- vim.keymap.set('n', '', 'echo "Use l to move!!"') +-- vim.keymap.set('n', '', 'echo "Use k to move!!"') +-- vim.keymap.set('n', '', 'echo "Use j to move!!"') + +-- Keybinds to make split navigation easier. +-- Use CTRL+ to switch between windows +-- +-- See `:help wincmd` for a list of all window commands +vim.keymap.set('n', '', '', { desc = 'Move focus to the left window' }) +vim.keymap.set('n', '', '', { desc = 'Move focus to the right window' }) +vim.keymap.set('n', '', '', { desc = 'Move focus to the lower window' }) +vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) + +-- jump to next error +vim.keymap.set("n", "t", vim.diagnostic.goto_prev) +vim.keymap.set("n", "z", vim.diagnostic.goto_next) + + +-- [[ Basic Autocommands ]] +-- See `:help lua-guide-autocommands` + +-- Highlight when yanking (copying) text +-- Try it with `yap` in normal mode +-- See `:help vim.highlight.on_yank()` +vim.api.nvim_create_autocmd('TextYankPost', { + desc = 'Highlight when yanking (copying) text', + group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }), + callback = function() + vim.highlight.on_yank() + end, +}) + +--require("multiple-cursors").setup({ +-- version = "*", -- Use the latest tagged version +-- opts = {}, -- This causes the plugin setup function to be called +-- keys = { +-- {"", "MultipleCursorsAddDown", mode = {"n", "x"}, desc = "Add cursor and move down"}, +-- {"", "MultipleCursorsAddUp", mode = {"n", "x"}, desc = "Add cursor and move up"}, +-- +-- {"", "MultipleCursorsAddUp", mode = {"n", "i", "x"}, desc = "Add cursor and move up"}, +-- {"", "MultipleCursorsAddDown", mode = {"n", "i", "x"}, desc = "Add cursor and move down"}, +-- +-- {"", "MultipleCursorsMouseAddDelete", mode = {"n", "i"}, desc = "Add or remove cursor"}, +-- +-- {"m", "MultipleCursorsAddVisualArea", mode = {"x"}, desc = "Add cursors to the lines of the visual area"}, +-- +-- {"a", "MultipleCursorsAddMatches", mode = {"n", "x"}, desc = "Add cursors to cword"}, +-- {"A", "MultipleCursorsAddMatchesV", mode = {"n", "x"}, desc = "Add cursors to cword in previous area"}, +-- +-- {"d", "MultipleCursorsAddJumpNextMatch", mode = {"n", "x"}, desc = "Add cursor and jump to next cword"}, +-- {"D", "MultipleCursorsJumpNextMatch", mode = {"n", "x"}, desc = "Jump to next cword"}, +-- +-- {"l", "MultipleCursorsLock", mode = {"n", "x"}, desc = "Lock virtual cursors"}, +-- }, +--}) + + +vim.keymap.set("n","§", "Cheatsheet") + +require("cheatsheet").setup({ + bundled_cheatsheets = { + -- only show the default cheatsheet + enabled = { "default" }, + }, + bundled_plugin_cheatsheets = { + -- show cheatsheets for all plugins except gitsigns + disabled = { "gitsigns.nvim" }, + } +}) + + + +-- Can be applied to each buffer separately + +local default_options = { + ui = { + wrap_line_after = false, -- wrap the line after this length to avoid the virtual text is too long + left_kept_space = 3, --- the number of spaces kept on the left side of the virtual text, make sure it enough to custom for each line + right_kept_space = 3, --- the number of spaces kept on the right side of the virtual text, make sure it enough to custom for each line + arrow = "  ", + up_arrow = "  ", + down_arrow = "  ", + above = false, -- the virtual text will be displayed above the line + }, + priority = 2003, -- the priority of virtual text + inline = true, +} + + +-- scrollbar +require("scrollbar").setup() + +-- ufo https://github.com/kevinhwang91/nvim-ufo +vim.o.foldcolumn = '1' -- '0' is not bad +vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value +vim.o.foldlevelstart = 99 +vim.o.foldenable = true + +-- Using ufo provider need remap `zR` and `zM`. If Neovim is 0.6.1, remap yourself +vim.keymap.set('n', '1', "foldopen") +vim.keymap.set('n', '2', "foldclose") +vim.keymap.set('n', '3', "openAllFold") +vim.keymap.set('n', '4', " closeAllFold") +-- Option 3: treesitter as a main provider instead +-- (Note: the `nvim-treesitter` plugin is *not* needed.) +-- ufo uses the same query files for folding (queries//folds.scm) +-- performance and stability are better than `foldmethod=nvim_treesitter#foldexpr()` +--vim.keymap.set('n', '1', function() require("ufo").foldopen() end, {buffer=0}) +--vim.keymap.set('n', '2', function() require("ufo").foldclose() end) + + + +-- added by myself +require('ufo').setup({ + provider_selector = function(bufnr, filetype, buftype) + return {'treesitter', 'indent'} + end +}) + +-- Color schemes should be loaded after plug#end(). +vim.o.background = "dark" -- or "light" for light mode +-- Default options: +--require("gruvbox").setup({ +-- terminal_colors = true, -- add neovim terminal colors +-- undercurl = true, +-- underline = true, +-- bold = true, +-- italic = { +-- strings = true, +-- emphasis = true, +-- comments = true, +-- operators = false, +-- folds = true, +-- }, +-- strikethrough = true, +-- invert_selection = false, +-- invert_signs = false, +-- invert_tabline = false, +-- invert_intend_guides = false, +-- inverse = true, -- invert background for search, diffs, statuslines and errors +-- contrast = "", -- can be "hard", "soft" or empty string +-- palette_overrides = {}, +-- overrides = {}, +-- dim_inactive = false, +-- transparent_mode = false, +--}) +vim.cmd("colorscheme gruvbox") +-- nvim-tree https://github.com/nvim-tree/nvim-tree.lua +-- disable netrw at the very start of your init.lua +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 + +-- optionally enable 24-bit colour +vim.opt.termguicolors = true + + +-- setup with some options +require("nvim-tree").setup({ + sort = { + sorter = "case_sensitive", + }, + view = { + width = 30, + }, + renderer = { + group_empty = true, + }, + filters = { + dotfiles = true, + }, +}) +vim.opt.number = true +-- Uncomment for opening the navigable tree file systeme on startup of NeoVim +--vim.cmd('NvimTreeOpen') + +--require('md-pdf').setup({ +-- --- Set margins around document +-- margins = "1.5cm", +-- -- tango, pygments are quite nice for white on white +-- highlight = "tango", +-- -- Generate a table of contents, on by default +-- toc = true, +-- -- Define a custom preview command, enabling hooks and other custom logic +-- preview_cmd = function() return 'firefox' end, +-- -- if true, then the markdown file is continuously converted on each write, even if the +-- -- file viewer closed, e.g., firefox is "closed" once the document is opened in it. +-- ignore_viewer_state = false, +-- -- Specify font, `nil` uses the default font of the theme +-- fonts = nil, +-- -- or, where all or only some options can be specified. NOTE: those that are `nil` can be left +-- -- out completely +-- fonts = { +-- main_font = nil, +-- sans_font = "DejaVuSans", +-- mono_font = "IosevkaTerm Nerd Font Mono", +-- math_font = nil, +-- }, +-- -- Custom options passed to `pandoc` CLI call, can be ignored for setup +-- pandoc_user_args = nil, +-- -- or +-- pandoc_user_args = { +-- -- short +-- "-V KEY[:VALUE]", +-- -- long options +-- "--standalone=[true|false]", +-- }, +-- --- Path to output. Needs to be always relative, e.g.: "./", "../", "./out" or simply "out", but +-- --- not absolute e.g.: "/"! +-- output_path = "", +--}) + +-- setup mapping +vim.keymap.set("n", ",", function() + require('md-pdf').convert_md_to_pdf() +end) + -- Set up nvim-cmp. + local cmp = require'cmp' + + cmp.setup({ + snippet = { + -- REQUIRED - you must specify a snippet engine + expand = function(args) + vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users. + -- require('luasnip').lsp_expand(args.body) -- For `luasnip` users. + -- require('snippy').expand_snippet(args.body) -- For `snippy` users. + -- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users. + -- vim.snippet.expand(args.body) -- For native neovim snippets (Neovim v0.10+) + end, + }, + window = { + -- completion = cmp.config.window.bordered(), + -- documentation = cmp.config.window.bordered(), + }, + mapping = cmp.mapping.preset.insert({ + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.abort(), + [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + }), + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + { name = 'vsnip' }, -- For vsnip users. + -- { name = 'luasnip' }, -- For luasnip users. + -- { name = 'ultisnips' }, -- For ultisnips users. + -- { name = 'snippy' }, -- For snippy users. + }, { + { name = 'buffer' }, + }) + }) + + -- To use git you need to install the plugin petertriho/cmp-git and uncomment lines below + -- Set configuration for specific filetype. + --[[ cmp.setup.filetype('gitcommit', { + sources = cmp.config.sources({ + { name = 'git' }, + }, { + { name = 'buffer' }, + }) + }) + require("cmp_git").setup() ]]-- + + -- Use buffer source for `/` and `?` (if you enabled `native_menu`, this won't work anymore). + cmp.setup.cmdline({ '/', '?' }, { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = 'buffer' } + } + }) + + -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). + cmp.setup.cmdline(':', { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources({ + { name = 'path' } + }, { + { name = 'cmdline' } + }), + matching = { disallow_symbol_nonprefix_matching = false } + }) + + + -- require(lspconfig) is deprecated +-- -- Set up lspconfig. +-- local capabilities = require('cmp_nvim_lsp').default_capabilities() +-- -- Replace with each lsp server you've enabled. +-- require('lspconfig')['texlab'].setup { +-- capabilities = capabilities +-- } +--require'lspconfig'.clangd.setup{} +--lspconfig = require("lspconfig") +--lspconfig.pylsp.setup { +--on_attach = custom_attach, +--settings = { +-- pylsp = { +-- plugins = { +-- -- formatter options +-- black = { enabled = true }, +-- autopep8 = { enabled = false }, +-- yapf = { enabled = false }, +-- -- linter options +-- pylint = { enabled = true, executable = "pylint" }, +-- pyflakes = { enabled = false }, +-- pycodestyle = { enabled = false }, +-- -- type checker +-- pylsp_mypy = { enabled = true }, +-- -- auto-completion options +-- jedi_completion = { fuzzy = true }, +-- -- import sorting +-- pyls_isort = { enabled = true }, +-- }, +-- }, +--}, +--flags = { +-- debounce_text_changes = 200, +--}, +--capabilities = capabilities, +--} +---- lua-lsp +--require'lspconfig'.lua_ls.setup{} +-- +--new version +-- ============================ +-- LSP CONFIGURATION (Neovim 0.11+) +-- ============================ + +-- Set up capabilities for nvim-cmp LSP completion +local capabilities = require('cmp_nvim_lsp').default_capabilities() + +-- Optional: custom on_attach function if you have keymaps +-- local custom_attach = function(client, bufnr) +-- -- your on_attach code here +-- end + +-- Utility function to simplify server setup +local function setup_lsp(server_name, opts) + vim.lsp.config(server_name, opts or {}) +end + +-- ======== LSP SERVERS ======== + +-- TeXLab +setup_lsp("texlab", { + capabilities = capabilities, +}) + +-- Clangd (C/C++) +setup_lsp("clangd", { + capabilities = capabilities, +}) + +-- Python LSP (pylsp) +setup_lsp("pylsp", { + on_attach = custom_attach, + capabilities = capabilities, + flags = { + debounce_text_changes = 200, + }, + settings = { + pylsp = { + plugins = { + -- Formatter options + black = { enabled = true }, + autopep8 = { enabled = false }, + yapf = { enabled = false }, + -- Linter options + pylint = { enabled = true, executable = "pylint" }, + pyflakes = { enabled = false }, + pycodestyle = { enabled = false }, + -- Type checker + pylsp_mypy = { enabled = true }, + -- Auto-completion options + jedi_completion = { fuzzy = true }, + -- Import sorting + pyls_isort = { enabled = true }, + }, + }, + }, +}) + +-- Lua LSP +setup_lsp("lua_ls", { + capabilities = capabilities, +}) + + +-- dashboard config +require('dashboard').setup { + theme = 'hyper', + config = { + header = { + " ... ... . ", + " .=*8888n..\"%888: @88> ", + " X ?8888f '8888 u. ... .. %8P .. . : ", + " 88x. '8888X 8888> .u ...ue888b :~\"\"888h.:^\"888: . .888: x888 x888. ", + "'8888k 8888X '\"*8h. ud8888. 888R Y888r 8X `8888X 8888> .@88u ~`8888~'888X`?888f` ", + " \"8888 X888X .xH8 :888'8888. 888R I888> X888n. 8888X ?888> '\"888E` X888 888X '888> ", + " `8\" X888!:888X d888 '88%\" 888R I888> '88888 8888X ?**h. 888E X888 888X '888> ", + " =~` X888 X888X 8888.+\" 888R I888> `*88 8888~ x88x. 888E X888 888X '888> ", + " :h. X8*` !888X 8888L u8888cJ888 ..<\" 88*` 88888X 888E X888 888X '888> ", + " X888xX\" '8888..: '8888c. .+ \"*888*P\" ..XC. `*8888k 888& \"*88%\"\"*88\" '888!` ", + ":~`888f '*888*\" \"88888% 'Y\" :888888H. `%88> R888\" `~ \" `\"` ", + " \"\" `\"` \"YP' < `\"888888: X\" \"\" ", + " %888888x.-` ", + " \"\"**\"\" ", + "", + "" +}, + shortcut = { + { desc = " Open File Tree", group = "", key = 't', action = 'NvimTreeOpen' }, + -- action can be a function type + }, + packages = { enable = false }, -- show how many plugins neovim loaded + -- limit how many projects list, action when you press key or enter it will run this action. + -- action can be a functino type, e.g. + -- action = func(path) vim.cmd('Telescope find_files cwd=' .. path) end + project = { enable = true, limit = 8, icon = ' New file', label = "", action = 'Telescope find_files cwd=' }, + mru = { limit = 10, icon = ' History', label = "", cwd_only = false }, + footer = {}, -- footer +} +} + +-- lualine config https://github.com/nvim-lualine/lualine.nvim/blob/master/examples/bubbles.lua +require('lualine').setup { + options = { theme = "gruvbox_dark" }, +} +local builtin = require('telescope.builtin') +vim.keymap.set('n', 'ff', builtin.find_files, { desc = 'Telescope find files' }) +vim.keymap.set('n', 'fg', builtin.live_grep, { desc = 'Telescope live grep' }) +vim.keymap.set('n', 'fb', builtin.buffers, { desc = 'Telescope buffers' }) +vim.keymap.set('n', 'fh', builtin.help_tags, { desc = 'Telescope help tags' }) + +-- Disable relative numbers even if a plugin (like neovim-sensible) turns them on + vim.opt.colorcolumn = "" + vim.api.nvim_create_autocmd("VimEnter", { + callback = function() + vim.opt.relativenumber = false + end, +}) +''; }; } diff --git a/modules/home-manager/neovim2.nix b/modules/home-manager/neovim2.nix new file mode 100644 index 0000000..e5797f5 --- /dev/null +++ b/modules/home-manager/neovim2.nix @@ -0,0 +1,547 @@ +{ config, pkgs, ... }: +# same as ./neovim.nix but you vim plug. +# i tried importing my nvim config from fedora to a more nixy way but a lot of settings and plugins didnt work. Maybe i'll fix it latter +# the only difference is the we use :PlugInstall or a similar command before doing anything + +{ + programs.neovim = { + enable = true; + vimAlias = true; + viAlias = true; + extraLuaConfig = '' +local vim = vim +-- local Plug = vim.fn['plug#'] +vim.g.mapleader ='ü' +vim.g.maplocalleader = 'ü' + +-- Set to true if you have a Nerd Font installed and selected in the terminal +vim.g.have_nerd_font = true + +-- [[ Setting options ]] +-- See `:help vim.opt` +-- NOTE: You can change these options as you wish! +-- For more options, you can see `:help option-list` + +-- Make line numbers default +-- You can also add relative line numbers, to help with jumping. +-- Experiment for yourself to see if you like it! +-- vim.opt.relativenumber = true + +-- Enable mouse mode, can be useful for resizing splits for example! +vim.opt.mouse = 'a' + +-- Don't show the mode, since it's already in the status line +vim.opt.showmode = true + +-- Sync clipboard between OS and Neovim. +-- Schedule the setting after `UiEnter` because it can increase startup-time. +-- Remove this option if you want your OS clipboard to remain independent. +-- See `:help 'clipboard'` +vim.schedule(function() + vim.opt.clipboard = 'unnamedplus' +end) + + +-- Enable break indent +vim.opt.breakindent = true + +-- Save undo history +vim.opt.undofile = true + +-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term +vim.opt.ignorecase = true +vim.opt.smartcase = true + +-- Keep signcolumn on by default +vim.opt.signcolumn = 'yes' + +-- Decrease update time +vim.opt.updatetime = 250 + +-- Decrease mapped sequence wait time +-- Displays which-key popup sooner +vim.opt.timeoutlen = 300 + +-- Configure how new splits should be opened +vim.opt.splitright = true +vim.opt.splitbelow = true + +-- Sets how neovim will display certain whitespace characters in the editor. +-- See `:help 'list'` +-- and `:help 'listchars'` +vim.opt.list = true +vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' } + + + +-- indentation settings - added by me +-- refere to https://stackoverflow.com/questions/51995128/setting-autoindentation-to-spaces-in-neovim for more information +vim.opt.expandtab = true +vim.opt.smartindent = true +vim.opt.tabstop = 4 +vim.opt.shiftwidth = 4 + +-- Preview substitutions live, as you type! +vim.opt.inccommand = 'split' + +-- Show which line your cursor is on +vim.opt.cursorline = true + +-- Minimal number of screen lines to keep above and below the cursor. +vim.opt.scrolloff = 10 + +-- [[ Basic Keymaps ]] +-- See `:help vim.keymap.set()` + +-- Clear highlights on search when pressing in normal mode +-- See `:help hlsearch` +vim.keymap.set('n', '', 'nohlsearch') + +-- Diagnostic keymaps +vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' }) + +-- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier +-- for people to discover. Otherwise, you normally need to press , which +-- is not what someone will guess without a bit more experience. +-- +-- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping +-- or just use to exit terminal mode +vim.keymap.set('t', '', '', { desc = 'Exit terminal mode' }) + +-- TIP: Disable arrow keys in normal mode +-- vim.keymap.set('n', '', 'echo "Use h to move!!"') +-- vim.keymap.set('n', '', 'echo "Use l to move!!"') +-- vim.keymap.set('n', '', 'echo "Use k to move!!"') +-- vim.keymap.set('n', '', 'echo "Use j to move!!"') + +-- Keybinds to make split navigation easier. +-- Use CTRL+ to switch between windows +-- +-- See `:help wincmd` for a list of all window commands +vim.keymap.set('n', '', '', { desc = 'Move focus to the left window' }) +vim.keymap.set('n', '', '', { desc = 'Move focus to the right window' }) +vim.keymap.set('n', '', '', { desc = 'Move focus to the lower window' }) +vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) + +-- jump to next error +vim.keymap.set("n", "t", vim.diagnostic.goto_prev) +vim.keymap.set("n", "z", vim.diagnostic.goto_next) + + +-- [[ Basic Autocommands ]] +-- See `:help lua-guide-autocommands` + +-- Highlight when yanking (copying) text +-- Try it with `yap` in normal mode +-- See `:help vim.highlight.on_yank()` +vim.api.nvim_create_autocmd('TextYankPost', { + desc = 'Highlight when yanking (copying) text', + group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }), + callback = function() + vim.highlight.on_yank() + end, +}) + +--require("multiple-cursors").setup({ +-- version = "*", -- Use the latest tagged version +-- opts = {}, -- This causes the plugin setup function to be called +-- keys = { +-- {"", "MultipleCursorsAddDown", mode = {"n", "x"}, desc = "Add cursor and move down"}, +-- {"", "MultipleCursorsAddUp", mode = {"n", "x"}, desc = "Add cursor and move up"}, +-- +-- {"", "MultipleCursorsAddUp", mode = {"n", "i", "x"}, desc = "Add cursor and move up"}, +-- {"", "MultipleCursorsAddDown", mode = {"n", "i", "x"}, desc = "Add cursor and move down"}, +-- +-- {"", "MultipleCursorsMouseAddDelete", mode = {"n", "i"}, desc = "Add or remove cursor"}, +-- +-- {"m", "MultipleCursorsAddVisualArea", mode = {"x"}, desc = "Add cursors to the lines of the visual area"}, +-- +-- {"a", "MultipleCursorsAddMatches", mode = {"n", "x"}, desc = "Add cursors to cword"}, +-- {"A", "MultipleCursorsAddMatchesV", mode = {"n", "x"}, desc = "Add cursors to cword in previous area"}, +-- +-- {"d", "MultipleCursorsAddJumpNextMatch", mode = {"n", "x"}, desc = "Add cursor and jump to next cword"}, +-- {"D", "MultipleCursorsJumpNextMatch", mode = {"n", "x"}, desc = "Jump to next cword"}, +-- +-- {"l", "MultipleCursorsLock", mode = {"n", "x"}, desc = "Lock virtual cursors"}, +-- }, +--}) + + +vim.keymap.set("n","§", "Cheatsheet") + +require("cheatsheet").setup({ + bundled_cheatsheets = { + -- only show the default cheatsheet + enabled = { "default" }, + }, + bundled_plugin_cheatsheets = { + -- show cheatsheets for all plugins except gitsigns + disabled = { "gitsigns.nvim" }, + } +}) + + + +-- Can be applied to each buffer separately + +local default_options = { + ui = { + wrap_line_after = false, -- wrap the line after this length to avoid the virtual text is too long + left_kept_space = 3, --- the number of spaces kept on the left side of the virtual text, make sure it enough to custom for each line + right_kept_space = 3, --- the number of spaces kept on the right side of the virtual text, make sure it enough to custom for each line + arrow = "  ", + up_arrow = "  ", + down_arrow = "  ", + above = false, -- the virtual text will be displayed above the line + }, + priority = 2003, -- the priority of virtual text + inline = true, +} + + +-- scrollbar +require("scrollbar").setup() + +-- ufo https://github.com/kevinhwang91/nvim-ufo +vim.o.foldcolumn = '1' -- '0' is not bad +vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value +vim.o.foldlevelstart = 99 +vim.o.foldenable = true + +-- Using ufo provider need remap `zR` and `zM`. If Neovim is 0.6.1, remap yourself +vim.keymap.set('n', '1', "foldopen") +vim.keymap.set('n', '2', "foldclose") +vim.keymap.set('n', '3', "openAllFold") +vim.keymap.set('n', '4', " closeAllFold") +-- Option 3: treesitter as a main provider instead +-- (Note: the `nvim-treesitter` plugin is *not* needed.) +-- ufo uses the same query files for folding (queries//folds.scm) +-- performance and stability are better than `foldmethod=nvim_treesitter#foldexpr()` +--vim.keymap.set('n', '1', function() require("ufo").foldopen() end, {buffer=0}) +--vim.keymap.set('n', '2', function() require("ufo").foldclose() end) + + + +-- added by myself +require('ufo').setup({ + provider_selector = function(bufnr, filetype, buftype) + return {'treesitter', 'indent'} + end +}) + +-- Color schemes should be loaded after plug#end(). +vim.o.background = "dark" -- or "light" for light mode +-- Default options: +require("gruvbox").setup({ + terminal_colors = true, -- add neovim terminal colors + undercurl = true, + underline = true, + bold = true, + italic = { + strings = true, + emphasis = true, + comments = true, + operators = false, + folds = true, + }, + strikethrough = true, + invert_selection = false, + invert_signs = false, + invert_tabline = false, + invert_intend_guides = false, + inverse = true, -- invert background for search, diffs, statuslines and errors + contrast = "", -- can be "hard", "soft" or empty string + palette_overrides = {}, + overrides = {}, + dim_inactive = false, + transparent_mode = false, +}) +vim.cmd("colorscheme gruvbox") +-- nvim-tree https://github.com/nvim-tree/nvim-tree.lua +-- disable netrw at the very start of your init.lua +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 + +-- optionally enable 24-bit colour +vim.opt.termguicolors = true + + +-- setup with some options +require("nvim-tree").setup({ + sort = { + sorter = "case_sensitive", + }, + view = { + width = 30, + }, + renderer = { + group_empty = true, + }, + filters = { + dotfiles = true, + }, +}) +vim.opt.number = true +-- Uncomment for opening the navigable tree file systeme on startup of NeoVim +--vim.cmd('NvimTreeOpen') + +require('md-pdf').setup({ + --- Set margins around document + margins = "1.5cm", + -- tango, pygments are quite nice for white on white + highlight = "tango", + -- Generate a table of contents, on by default + toc = true, + -- Define a custom preview command, enabling hooks and other custom logic + preview_cmd = function() return 'firefox' end, + -- if true, then the markdown file is continuously converted on each write, even if the + -- file viewer closed, e.g., firefox is "closed" once the document is opened in it. + ignore_viewer_state = false, + -- Specify font, `nil` uses the default font of the theme + fonts = nil, + -- or, where all or only some options can be specified. NOTE: those that are `nil` can be left + -- out completely + fonts = { + main_font = nil, + sans_font = "DejaVuSans", + mono_font = "IosevkaTerm Nerd Font Mono", + math_font = nil, + }, + -- Custom options passed to `pandoc` CLI call, can be ignored for setup + pandoc_user_args = nil, + -- or + pandoc_user_args = { + -- short + "-V KEY[:VALUE]", + -- long options + "--standalone=[true|false]", + }, + --- Path to output. Needs to be always relative, e.g.: "./", "../", "./out" or simply "out", but + --- not absolute e.g.: "/"! + output_path = "", +}) + +-- setup mapping +vim.keymap.set("n", ",", function() + require('md-pdf').convert_md_to_pdf() +end) + -- Set up nvim-cmp. + local cmp = require'cmp' + + cmp.setup({ + snippet = { + -- REQUIRED - you must specify a snippet engine + expand = function(args) + vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users. + -- require('luasnip').lsp_expand(args.body) -- For `luasnip` users. + -- require('snippy').expand_snippet(args.body) -- For `snippy` users. + -- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users. + -- vim.snippet.expand(args.body) -- For native neovim snippets (Neovim v0.10+) + end, + }, + window = { + -- completion = cmp.config.window.bordered(), + -- documentation = cmp.config.window.bordered(), + }, + mapping = cmp.mapping.preset.insert({ + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.abort(), + [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + }), + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + { name = 'vsnip' }, -- For vsnip users. + -- { name = 'luasnip' }, -- For luasnip users. + -- { name = 'ultisnips' }, -- For ultisnips users. + -- { name = 'snippy' }, -- For snippy users. + }, { + { name = 'buffer' }, + }) + }) + + -- To use git you need to install the plugin petertriho/cmp-git and uncomment lines below + -- Set configuration for specific filetype. + --[[ cmp.setup.filetype('gitcommit', { + sources = cmp.config.sources({ + { name = 'git' }, + }, { + { name = 'buffer' }, + }) + }) + require("cmp_git").setup() ]]-- + + -- Use buffer source for `/` and `?` (if you enabled `native_menu`, this won't work anymore). + cmp.setup.cmdline({ '/', '?' }, { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = 'buffer' } + } + }) + + -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). + cmp.setup.cmdline(':', { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources({ + { name = 'path' } + }, { + { name = 'cmdline' } + }), + matching = { disallow_symbol_nonprefix_matching = false } + }) + + + -- require(lspconfig) is deprecated +-- -- Set up lspconfig. +-- local capabilities = require('cmp_nvim_lsp').default_capabilities() +-- -- Replace with each lsp server you've enabled. +-- require('lspconfig')['texlab'].setup { +-- capabilities = capabilities +-- } +--require'lspconfig'.clangd.setup{} +--lspconfig = require("lspconfig") +--lspconfig.pylsp.setup { +--on_attach = custom_attach, +--settings = { +-- pylsp = { +-- plugins = { +-- -- formatter options +-- black = { enabled = true }, +-- autopep8 = { enabled = false }, +-- yapf = { enabled = false }, +-- -- linter options +-- pylint = { enabled = true, executable = "pylint" }, +-- pyflakes = { enabled = false }, +-- pycodestyle = { enabled = false }, +-- -- type checker +-- pylsp_mypy = { enabled = true }, +-- -- auto-completion options +-- jedi_completion = { fuzzy = true }, +-- -- import sorting +-- pyls_isort = { enabled = true }, +-- }, +-- }, +--}, +--flags = { +-- debounce_text_changes = 200, +--}, +--capabilities = capabilities, +--} +---- lua-lsp +--require'lspconfig'.lua_ls.setup{} +-- +--new version +-- ============================ +-- LSP CONFIGURATION (Neovim 0.11+) +-- ============================ + +-- Set up capabilities for nvim-cmp LSP completion +local capabilities = require('cmp_nvim_lsp').default_capabilities() + +-- Optional: custom on_attach function if you have keymaps +-- local custom_attach = function(client, bufnr) +-- -- your on_attach code here +-- end + +-- Utility function to simplify server setup +local function setup_lsp(server_name, opts) + vim.lsp.config(server_name, opts or {}) +end + +-- ======== LSP SERVERS ======== + +-- TeXLab +setup_lsp("texlab", { + capabilities = capabilities, +}) + +-- Clangd (C/C++) +setup_lsp("clangd", { + capabilities = capabilities, +}) + +-- Python LSP (pylsp) +setup_lsp("pylsp", { + on_attach = custom_attach, + capabilities = capabilities, + flags = { + debounce_text_changes = 200, + }, + settings = { + pylsp = { + plugins = { + -- Formatter options + black = { enabled = true }, + autopep8 = { enabled = false }, + yapf = { enabled = false }, + -- Linter options + pylint = { enabled = true, executable = "pylint" }, + pyflakes = { enabled = false }, + pycodestyle = { enabled = false }, + -- Type checker + pylsp_mypy = { enabled = true }, + -- Auto-completion options + jedi_completion = { fuzzy = true }, + -- Import sorting + pyls_isort = { enabled = true }, + }, + }, + }, +}) + +-- Lua LSP +setup_lsp("lua_ls", { + capabilities = capabilities, +}) + + +-- dashboard config +require('dashboard').setup { + theme = 'hyper', + config = { + header = { + " ... ... . ", + " .=*8888n..\"%888: @88> ", + " X ?8888f '8888 u. ... .. %8P .. . : ", + " 88x. '8888X 8888> .u ...ue888b :~\"\"888h.:^\"888: . .888: x888 x888. ", + "'8888k 8888X '\"*8h. ud8888. 888R Y888r 8X `8888X 8888> .@88u ~`8888~'888X`?888f` ", + " \"8888 X888X .xH8 :888'8888. 888R I888> X888n. 8888X ?888> '\"888E` X888 888X '888> ", + " `8\" X888!:888X d888 '88%\" 888R I888> '88888 8888X ?**h. 888E X888 888X '888> ", + " =~` X888 X888X 8888.+\" 888R I888> `*88 8888~ x88x. 888E X888 888X '888> ", + " :h. X8*` !888X 8888L u8888cJ888 ..<\" 88*` 88888X 888E X888 888X '888> ", + " X888xX\" '8888..: '8888c. .+ \"*888*P\" ..XC. `*8888k 888& \"*88%\"\"*88\" '888!` ", + ":~`888f '*888*\" \"88888% 'Y\" :888888H. `%88> R888\" `~ \" `\"` ", + " \"\" `\"` \"YP' < `\"888888: X\" \"\" ", + " %888888x.-` ", + " \"\"**\"\" ", + "", + "" +}, + shortcut = { + { desc = " Open File Tree", group = "", key = 't', action = 'NvimTreeOpen' }, + -- action can be a function type + }, + packages = { enable = false }, -- show how many plugins neovim loaded + -- limit how many projects list, action when you press key or enter it will run this action. + -- action can be a functino type, e.g. + -- action = func(path) vim.cmd('Telescope find_files cwd=' .. path) end + project = { enable = true, limit = 8, icon = ' New file', label = "", action = 'Telescope find_files cwd=' }, + mru = { limit = 10, icon = ' History', label = "", cwd_only = false }, + footer = {}, -- footer +} +} + +-- lualine config https://github.com/nvim-lualine/lualine.nvim/blob/master/examples/bubbles.lua +require('lualine').setup { + options = { theme = "gruvbox_dark" }, +} +local builtin = require('telescope.builtin') +vim.keymap.set('n', 'ff', builtin.find_files, { desc = 'Telescope find files' }) +vim.keymap.set('n', 'fg', builtin.live_grep, { desc = 'Telescope live grep' }) +vim.keymap.set('n', 'fb', builtin.buffers, { desc = 'Telescope buffers' }) +vim.keymap.set('n', 'fh', builtin.help_tags, { desc = 'Telescope help tags' }) + + ''; + }; +} diff --git a/todo b/todo index 673477f..9e2bacd 100644 --- a/todo +++ b/todo @@ -24,3 +24,35 @@ write an install script which setups config. and setups github and ssh + + + + + + + +some cursor-themed +audacity.x86_64 +biber.noarch +dolphin.x86_64 may be customized or nautilus cust +gimp.x86_64 +git.x86_64 end config +hyprcursor.x86_64 +hyprgraphics.x86_64 +librewolf ? +ollama.x86_64 +plymouth.x86_64 +python3.x86_64 +qt6-qtwebsockets.x86_64 maybe copy from rivendel hy +quickshell.x86_64 +raylib-devel.x86_64 +some notification daemon 0.12-32.fc43 +texlive.noarch +texlive-biblatex.noarch +texlive-bibtex.x86_64 +thunderbird.x86_64 +tor.x86_64 +torbrowser-launcher.noarch +wlogout.x86_64 +Google Chrome needed for Framework 16 rgb macropad +