diff --git a/nixos/configuration.nix b/nixos/configuration.nix new file mode 100644 index 0000000..e368334 --- /dev/null +++ b/nixos/configuration.nix @@ -0,0 +1,146 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + +{ config, pkgs, ... }: + +{ + imports = + [ # Include the results of the hardware scan. + /etc/nixos/hardware-configuration.nix + ]; + + # Use the systemd-boot EFI boot loader. + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + # networking.hostName = "nixos"; # Define your hostname. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + + # Set your time zone. + time.timeZone = "America/New_York"; + + # The global useDHCP flag is deprecated, therefore explicitly set to false here. + # Per-interface useDHCP will be mandatory in the future, so this generated config + # replicates the default behaviour. + networking.useDHCP = false; + networking.interfaces.enp0s31f6.useDHCP = true; + networking.interfaces.wlp3s0.useDHCP = true; + + # Configure network proxy if necessary + # networking.proxy.default = "http://user:password@proxy:port/"; + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + # Select internationalisation properties. + # i18n.defaultLocale = "en_US.UTF-8"; + # console = { + # font = "Lat2-Terminus16"; + # keyMap = "us"; + # }; + + # Enable the X11 windowing system. + # services.xserver.enable = true; + services.xserver = { + enable = true; + desktopManager = { + xterm.enable = false; + xfce.enable = true; + }; + displayManager.defaultSession = "xfce"; + + # Disable mouse acceleration + libinput.mouse.accelProfile = "flat"; + }; + + # Configure keymap in X11 + services.xserver.layout = "us"; + services.xserver.xkbOptions = "eurosign:e"; + + # Enable CUPS to print documents. + # services.printing.enable = true; + + # Enable sound. + sound.enable = true; + hardware.pulseaudio.enable = true; + + # Enable touchpad support (enabled default in most desktopManager). + # services.xserver.libinput.enable = true; + + # Replace sudo with doas + security = { + + # Remove sudo + sudo.enable = false; + + # Add doas + doas = { + enable = true; + + # No password required + wheelNeedsPassword = false; + + # Pass environment variables from user to root + # Also requires removing password here + extraRules = [{ + groups = [ "wheel" ]; + noPass = true; + keepEnv = true; + }]; + }; + }; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.noah = { + + # Not sure what this means tbh + isNormalUser = true; + + # Automatically create a password to start + initialPassword = "changeme"; + + # Enable sudo privileges + extraGroups = [ "wheel" ]; + + # Use the fish shell + shell = pkgs.fish; + }; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + fish + vim + wget + curl + home-manager + just + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "21.05"; # Did you read the comment? + +} diff --git a/nixos/flakes/flake.nix b/nixos/flakes/flake.nix new file mode 100644 index 0000000..619f45d --- /dev/null +++ b/nixos/flakes/flake.nix @@ -0,0 +1,31 @@ +{ + description = "System Config"; + + inputs = { + nixpkgs.url = "nixpkgs/nixos-21.05"; + home-manager.url = "github:nix-community/home-manager/release-21.05"; + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = { nixpkgs, home-manager, ... }: { + let + system = "x86_64-linux"; + + pkgs = import nixpkgs { + inherit system; + config = { allowUnfree = true; }; + }; + + lib = nixpkgs.lib; + + in { + nixosConfigurations = { + nixos = lib.nixosSystem { + inherit system; + modules = [ + ./configuration.nix + ] + }; + }; + }; +} diff --git a/nixos/home.nix b/nixos/home.nix new file mode 100644 index 0000000..d280df6 --- /dev/null +++ b/nixos/home.nix @@ -0,0 +1,157 @@ +{ pkgs, ... }: + +let + + # Import unstable channel (for Neovim 0.5) + unstable = import { config = { allowUnfree = true; }; }; + +in + +{ + home.packages = with pkgs; [ + firefox + unzip + # alacritty + # unstable.neovim + tmux + rsync + ripgrep + bat + fd + exa + sd + jq + tealdeer + zoxide + unstable._1password-gui + ]; + + programs.alacritty = { + enable = true; + settings = { + window = { + dimensions = { + columns = 110; + lines = 30; + }; + padding = { + x = 20; + y = 20; + }; + }; + scrolling.history = 10000; + font = { + size = 15.0; + }; + key_bindings = [ + { + key = "F"; + mods = "Super"; + action = "ToggleFullscreen"; + } + { + key = "L"; + mods = "Super"; + chars = "\x1F"; + } + ]; + }; + }; + + programs.fish = { + enable = true; + }; + + home.sessionVariables = { + EDITOR = "nvim"; + }; + + programs.starship = { + enable = true; + enableFishIntegration = true; + }; + + programs.fzf = { + enable = true; + enableFishIntegration = true; + }; + + # Other configs + xdg.configFile = { + "starship.toml".source = ../starship/starship.toml.configlink; + #"alacritty/alacritty.yml".source = ../alacritty.configlink/alacritty.yml; + # "nvim/init.lua".source = ../nvim.configlink/init.lua; + }; + + # nixpkgs.overlays = [( + # self: super: { + # neovim = unstable.neovim; + # }) + # ]; + nixpkgs.overlays = [ + (import (builtins.fetchTarball { + url = https://github.com/nix-community/neovim-nightly-overlay/archive/master.tar.gz; + })) + ]; + + programs.neovim = { + enable = true; + package = pkgs.neovim-nightly; + vimAlias = true; + plugins = with pkgs.vimPlugins; [ + fzf-vim + fzfWrapper + vim-eunuch + vim-vinegar + surround + commentary + repeat + gruvbox-nvim + nvim-lspconfig + lsp-colors-nvim + vim-vsnip + vim-vsnip-integ + nvim-compe + tabular + vimwiki + vim-rooter + lualine-nvim + nvim-web-devicons + nvim-treesitter + vim-fish + nginx-vim + vim-terraform + vim-toml + vim-helm + vim-nix + gitsigns-nvim + plenary-nvim + vim-hexokinase + ]; + extraPackages = with pkgs; [ + nodePackages.pyright + rust-analyzer + ]; + extraConfig = '' + lua << EOF + ${builtins.readFile ./init.lua} + EOF + ''; + }; + + # # Neovim config + # home.file = { + # ".config/nvim/init.lua".source = ../nvim.configlink/init.lua; + # }; + + programs.git = { + enable = true; + userName = "Noah Masur"; + userEmail = "7386960+nmasur@users.noreply.github.com"; + extraConfig = { + core = { + editor = "nvim"; + }; + }; + }; +} diff --git a/nixos/init.lua b/nixos/init.lua new file mode 100644 index 0000000..1c2cdad --- /dev/null +++ b/nixos/init.lua @@ -0,0 +1,285 @@ +-- LSP Settings +-- ============ + +require('lspconfig').rust_analyzer.setup{} +require('lspconfig').pyright.setup{ + cmd = { "poetry", "run", "pyright-langserver", "--stdio" } +} +require'compe'.setup({ + enabled = true, + source = { + path = true, + buffer = true, + nvim_lsp = true, + }, +}) +if require('lspconfig/util').has_bins('diagnostic-languageserver') then + require('lspconfig').diagnosticls.setup{ + cmd = { "diagnostic-languageserver", "--stdio" }, + filetypes = { "sh" }, + on_attach = on_attach, + init_options = { + filetypes = { + sh = "shellcheck", + }, + linters = { + shellcheck = { + sourceName = "shellcheck", + command = "shellcheck", + debounce = 100, + args = { "--format=gcc", "-" }, + offsetLine = 0, + offsetColumn = 0, + formatLines = 1, + formatPattern = { + "^[^:]+:(\\d+):(\\d+):\\s+([^:]+):\\s+(.*)$", + { + line = 1, + column = 2, + message = 4, + security = 3 + } + }, + securities = { + error = "error", + warning = "warning", + } + }, + } + } + } +end + +-- Auto-complete +-- ==================== + +-- Auto-complete mapping +local t = function(str) + return vim.api.nvim_replace_termcodes(str, true, true, true) +end + +local check_back_space = function() + local col = vim.fn.col('.') - 1 + if col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then + return true + else + return false + end +end +-- Use (s-)tab to: +--- move to prev/next item in completion menuone +--- jump to prev/next snippet's placeholder +_G.tab_complete = function() + if vim.fn.pumvisible() == 1 then + return t "" + elseif vim.fn.call("vsnip#available", {1}) == 1 then + return t "(vsnip-expand-or-jump)" + elseif check_back_space() then + return t "" + else + return vim.fn['compe#complete']() + end +end +_G.s_tab_complete = function() + if vim.fn.pumvisible() == 1 then + return t "" + elseif vim.fn.call("vsnip#jumpable", {-1}) == 1 then + return t "(vsnip-jump-prev)" + else + return t "" + end +end + +-- Auto-complete keybinds +vim.api.nvim_set_keymap("i", "", "v:lua.tab_complete()", {expr = true}) +vim.api.nvim_set_keymap("s", "", "v:lua.tab_complete()", {expr = true}) +vim.api.nvim_set_keymap("i", "", "v:lua.s_tab_complete()", {expr = true}) +vim.api.nvim_set_keymap("s", "", "v:lua.s_tab_complete()", {expr = true}) + +-- Settings +-- ======== + +-- Basic Settings +vim.o.termguicolors = true -- Set to truecolor +vim.cmd[[colorscheme gruvbox]] -- Installed with a plugin +vim.o.hidden = true -- Don't unload buffers when leaving them +vim.wo.number = true -- Show line numbers +vim.wo.relativenumber = true -- Relative numbers instead of absolute +vim.o.list = true -- Reveal whitespace with dashes +vim.o.expandtab = true -- Tabs into spaces +vim.o.shiftwidth = 4 -- Amount to shift with > key +vim.o.softtabstop = 4 -- Amount to shift with key +vim.o.ignorecase = true -- Ignore case when searching +vim.o.smartcase = true -- Check case when using capitals in search +vim.o.infercase = true -- Don't match cases when completing suggestions +vim.o.incsearch = true -- Search while typing +vim.o.visualbell = true -- No sounds +vim.o.scrolljump = 1 -- Number of lines to scroll +vim.o.scrolloff = 3 -- Margin of lines to see while scrolling +vim.o.splitright = true -- Vertical splits on the right side +vim.o.splitbelow = true -- Horizontal splits on the bottom side +vim.o.pastetoggle = "" -- Use F3 to enter raw paste mode +vim.o.clipboard = "unnamedplus" -- Uses system clipboard for yanking +vim.o.updatetime = 300 -- Faster diagnostics +vim.o.mouse = "nv" -- Mouse interaction / scrolling + +-- Neovim features +vim.o.inccommand = "split" -- Live preview search and replace +vim.o.completeopt = "menuone,noselect" -- Required for nvim-compe completion + +-- Remember last position when reopening file +vim.api.nvim_exec([[ + if has("autocmd") + au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g`\"" | endif + endif +]], false) + +-- Better backup, swap and undo storage +vim.o.backup = true -- Easier to recover and more secure +vim.bo.swapfile = false -- Instead of swaps, create backups +vim.bo.undofile = true -- Keeps undos after quit + +-- Create backup directories if they don't exist +vim.api.nvim_exec([[ + set backupdir=~/.local/share/nvim/backup + set undodir=~/.local/share/nvim/undo + if !isdirectory(&backupdir) + call mkdir(&backupdir, "p") + endif + if !isdirectory(&undodir) + call mkdir(&undodir, "p") + endif +]], false) + +-- Keep selection when tabbing +vim.api.nvim_set_keymap("v", "<", "", ">gv", {noremap=true}) + +-- Force filetype patterns that Vim doesn't know about +vim.api.nvim_exec([[ + au BufRead,BufNewFile *.Brewfile setfiletype brewfile + au BufRead,BufNewFile tmux.conf* setfiletype tmux + au BufRead,BufNewFile *ignore.*link setfiletype gitignore + au BufRead,BufNewFile gitconfig.*link setfiletype gitconfig + au BufRead,BufNewFile *.toml.*link setfiletype toml + au BufRead,BufNewFile *.muttrc setfiletype muttrc + au BufRead,BufNewFile .env* set ft=text | set syntax=sh +]], false) + +-- LaTeX options +vim.api.nvim_exec([[ + au FileType tex inoremap ;bf \textbf{}i + au BufWritePost *.tex silent! execute "!pdflatex -output-directory=%:p:h % >/dev/null 2>&1" | redraw! +]], false) + +-- Highlight when yanking +vim.api.nvim_exec([[ + au TextYankPost * silent! lua vim.highlight.on_yank { timeout = 250 } +]], false) + +-- Rust stuff +-- vim.api.nvim_exec([[ +-- au BufWritePost *.rs silent! execute "%! rustfmt" +-- ]], false) + +-- Auto-pairs +vim.g.AutoPairsFlyMode = 0 + +-- Netrw +vim.g.netrw_liststyle = 3 -- Change style to 'tree' view +vim.g.netrw_banner = 0 -- Remove useless banner +vim.g.netrw_winsize = 15 -- Explore window takes % of page +vim.g.netrw_browse_split = 4 -- Open in previous window +vim.g.netrw_altv = 1 -- Always split left + +-- Polyglot +vim.g.terraform_fmt_on_save = 1 -- Formats with terraform plugin +vim.g.rustfmt_autosave = 1 -- Formats with rust plugin + +-- VimWiki +vim.g.vimwiki_list = { + { + ["path"] = "$NOTES_PATH", + ["syntax"] = "markdown", + ["index"] = "home", + ["ext"] = ".md" + } +} +vim.g.vimwiki_key_mappings = { + ["all_maps"] = 1, + ["mouse"] = 1, +} +vim.g.vimwiki_auto_chdir = 1 -- Set local dir to Wiki when open +vim.g.vimwiki_create_link = 0 -- Don't automatically create new links +vim.g.vimwiki_listsyms = " x" -- Set checkbox symbol progression +vim.g.vimwiki_table_mappings = 0 -- VimWiki table keybinds interfere with tab completion +vim.api.nvim_exec([[ + au FileType markdown inoremap ;tt :AddTag + + function! PInsert(item) + let @z=a:item + norm "zpx + endfunction + + command! AddTag call fzf#run({'source': 'rg "#[A-Za-z/]+[ |\$]" -o --no-filename --no-line-number | sort | uniq', 'sink': function('PInsert')}) +]], false) + +-- Status bar +require('lualine').setup({ + options = { theme = 'gruvbox' } +}) + +-- Remap space as leader key +vim.api.nvim_set_keymap("", "", "", {noremap=true, silent=true}) +vim.g.mapleader = " " +vim.g.maplocalleader = " " + +-- Unset search pattern register +vim.api.nvim_set_keymap("n", "", ":noh", {noremap=true, silent=true}) + +-- Shuffle lines around +vim.api.nvim_set_keymap("n", "", ":m .+1==", {noremap=true}) +vim.api.nvim_set_keymap("n", "", ":m .-2==", {noremap=true}) +vim.api.nvim_set_keymap("i", "", ":m .+1==gi", {noremap=true}) +vim.api.nvim_set_keymap("i", "", ":m .-2==gi", {noremap=true}) +vim.api.nvim_set_keymap("v", "", ":m '>+1gv=gv", {noremap=true}) +vim.api.nvim_set_keymap("v", "", ":m '<-2gv=gv", {noremap=true}) + +-- Fzf (fuzzy finder) +vim.api.nvim_set_keymap("n", "/", ":Rg", {noremap=true}) +vim.api.nvim_set_keymap("n", "ff", ":Files", {noremap=true}) +vim.api.nvim_set_keymap("n", "fr", ":History", {noremap=true}) +vim.api.nvim_set_keymap("n", "b", ":Buffers", {noremap=true}) +vim.api.nvim_set_keymap("n", "s", ":BLines", {noremap=true}) + +-- File commands +vim.api.nvim_set_keymap("n", "q", ":quit", {noremap=true}) +vim.api.nvim_set_keymap("n", "Q", ":quitall", {noremap=true}) +vim.api.nvim_set_keymap("n", "fs", ":write", {noremap=true}) +vim.api.nvim_set_keymap("n", "fe", ":!chmod 755 %", {noremap=true}) +vim.api.nvim_set_keymap("n", "fn", ":!chmod 644 %", {noremap=true}) +vim.api.nvim_set_keymap("n", "fd", ":lcd %:p:h", {silent=true, noremap=true}) +vim.api.nvim_set_keymap("n", "fu", ":lcd ..", {silent=true, noremap=true}) +vim.api.nvim_set_keymap("n", "", ":b#", {silent=true, noremap=true}) +vim.api.nvim_set_keymap("n", "gr", ":!gh repo view -w", {silent=true, noremap=true}) +vim.api.nvim_set_keymap("n", "tt", [[exe 'edit ~/notes/journal/'.strftime("%Y-%m-%d_%a").'.md']], {noremap=true}) + +-- Window commands +vim.api.nvim_set_keymap("n", "wv", ":vsplit", {noremap=true}) +vim.api.nvim_set_keymap("n", "wh", ":split", {noremap=true}) +vim.api.nvim_set_keymap("n", "wm", ":only", {noremap=true}) + +-- Tabularize +vim.api.nvim_set_keymap("", "ta", ":Tabularize /", {noremap=true}) +vim.api.nvim_set_keymap("", "t#", ":Tabularize /#", {noremap=true}) +vim.api.nvim_set_keymap("", "t\"", ":Tabularize /\"", {noremap=true}) + +-- Vimrc +vim.api.nvim_set_keymap("n", "fv", ":edit $MYVIMRC", {noremap=true}) +vim.api.nvim_set_keymap("n", "rr", ":luafile $MYVIMRC", {noremap=true}) + +-- Other +vim.api.nvim_set_keymap("n", "", ":HopWord", {noremap=true}) +vim.api.nvim_set_keymap("t", "", "", {noremap=true}) -- Exit terminal mode +vim.api.nvim_set_keymap("n", "", ":noh", {noremap=true, silent=true}) +vim.api.nvim_set_keymap('n', 'Y', 'y$', { noremap = true}) diff --git a/nixos/justfile b/nixos/justfile new file mode 100644 index 0000000..dda353e --- /dev/null +++ b/nixos/justfile @@ -0,0 +1,11 @@ +# Show these options +default: + @just --list --list-heading $'Update NixOS config:\n' + +# Update the system +system: + nixos-rebuild switch -I nixos-config=./configuration.nix + +# Update the user environment +home: + home-manager switch -f ./home.nix diff --git a/nixos/todo.txt b/nixos/todo.txt new file mode 100644 index 0000000..75e24ea --- /dev/null +++ b/nixos/todo.txt @@ -0,0 +1,3 @@ +libratbag (ratbagd) for input devices + +inspiration: https://github.com/JonathanReeve/dotfiles/blob/minimal/dotfiles/home.nix