summaryrefslogtreecommitdiff
path: root/hosts/muhammed/home
diff options
context:
space:
mode:
authorLinnnus <[email protected]>2024-02-20 09:08:54 +0100
committerLinnnus <[email protected]>2024-02-20 09:09:08 +0100
commite275224ea8f3182916e715861a09d8a5a13147ca (patch)
treeb82ddf94e21d34ceee2d25e5cecec3cc686d24ba /hosts/muhammed/home
parent476150fa1384b2c77e527f3f138d458cdc05bd29 (diff)
reorg: Move muhammed-specific configuration into hosts/muhammed/home
Diffstat (limited to 'hosts/muhammed/home')
-rw-r--r--hosts/muhammed/home/default.nix10
-rw-r--r--hosts/muhammed/home/iterm2/default.nix26
-rw-r--r--hosts/muhammed/home/neovim/conjure.nix71
-rw-r--r--hosts/muhammed/home/neovim/default.nix8
-rw-r--r--hosts/muhammed/home/neovim/lsp.nix107
-rw-r--r--hosts/muhammed/home/noweb/default.nix12
6 files changed, 234 insertions, 0 deletions
diff --git a/hosts/muhammed/home/default.nix b/hosts/muhammed/home/default.nix
new file mode 100644
index 0000000..b0b126c
--- /dev/null
+++ b/hosts/muhammed/home/default.nix
@@ -0,0 +1,10 @@
+# Here we extend the HM user defined in `home/default.nix`. All the global HM
+# stuff is defined in there.
+{...}: {
+ home-manager.users.linus = {
+ imports = [
+ ./iterm2
+ ./noweb
+ ];
+ };
+}
diff --git a/hosts/muhammed/home/iterm2/default.nix b/hosts/muhammed/home/iterm2/default.nix
new file mode 100644
index 0000000..d868e57
--- /dev/null
+++ b/hosts/muhammed/home/iterm2/default.nix
@@ -0,0 +1,26 @@
+# This file configures iterm2. Note that the actual definition of iTerm2 for
+# home-manager is in `modules/home-manager/iterm2`. *That* file declares
+# `options.programs.iterm2.enable`.
+{
+ pkgs,
+ lib,
+ ...
+}: let
+ inherit (lib) mkIf;
+ inherit (pkgs.stdenv) isDarwin;
+in {
+ config = mkIf isDarwin {
+ home.packages = with pkgs; [imgcat];
+
+ programs.iterm2 = {
+ enable = true;
+ # config = {
+ # # Use the minimal tab style.
+ # # See: https://github.com/gnachman/iTerm2/blob/bd40fba0611fa94684dadf2478625f2a93eb6e47/sources/iTermPreferences.h#L29
+ # TabStyleWithAutomaticOption = 5;
+ # };
+
+ shellIntegration.enableZshIntegration = true;
+ };
+ };
+}
diff --git a/hosts/muhammed/home/neovim/conjure.nix b/hosts/muhammed/home/neovim/conjure.nix
new file mode 100644
index 0000000..0acfadd
--- /dev/null
+++ b/hosts/muhammed/home/neovim/conjure.nix
@@ -0,0 +1,71 @@
+{pkgs, ...}: {
+ programs.neovim.plugins = [
+ {
+ # Add interactive repl-like environment.
+ # See also the addition of cmp-conjure in `completion.nix`.
+ # See also the addition of clojure in `dev-utils/default.nix`.
+ plugin = pkgs.vimPlugins.conjure;
+ type = "lua";
+ config = ''
+ local start_clj_repl = "StartCljRepl";
+ local start_lein_repl = "StartLeinRepl";
+
+ -- Create a command to launch nRepl for Clojure support.
+ -- See: https://github.com/Olical/conjure/wiki/Quick-start:-Clojure
+ vim.api.nvim_create_user_command(start_clj_repl, function()
+ local id = vim.fn.jobstart({
+ "${pkgs.clojure}/bin/clj",
+ "-Sdeps",
+ '{:deps {nrepl/nrepl {:mvn/version "1.0.0"} cider/cider-nrepl {:mvn/version "0.40.0"}}}',
+ "--main",
+ "nrepl.cmdline",
+ "--middleware",
+ '["cider.nrepl/cider-middleware"]',
+ "--interactive",
+ })
+ print("Started nRepl job #" .. id)
+ end, {
+ desc = "Starts an nRepl session in the current directory using clj.",
+ })
+
+ vim.api.nvim_create_user_command(start_lein_repl, function()
+ local id = vim.fn.jobstart({
+ "${pkgs.leiningen}/bin/lein",
+ "repl",
+ })
+ print("Started nRepl job #" .. id)
+ end, {
+ desc = "Starts an nRepl session in the current directory using Lein.",
+ })
+
+ -- Launch nRepl when any clojure file is started.
+ -- vim.api.nvim_create_autocmd({"BufEnter", "BufWinEnter"}, {
+ -- pattern = "*.clj",
+ -- command = start_clj_repl,
+ -- });
+
+ -- Use Guile to evaluate scheme buffers.
+ local start_guile_repl = "StartGuileRepl";
+ local sock_path = "/tmp/guile-repl.sock"
+ vim.g["conjure#filetype#scheme"] = "conjure.client.guile.socket"
+ vim.g["conjure#client#guile#socket#pipename"] = sock_path
+ vim.api.nvim_create_user_command(start_guile_repl, function()
+ local id = vim.fn.jobstart({
+ "${pkgs.guile}/bin/guile",
+ "--listen=" .. sock_path,
+ })
+ print("Started Guile job #" .. id)
+ end, {
+ desc = "Starts an Guile repl session listening on " .. sock_path,
+ })
+
+ -- Jump to bottom of log when new evaluation happens
+ -- See: https://github.com/Olical/conjure/blob/58c46d1f4999679659a5918284b574c266a7ac83/doc/conjure.txt#L872
+ vim.cmd [[autocmd User ConjureEval if expand("%:t") =~ "^conjure-log-" | exec "normal G" | endif]]
+ '';
+ }
+
+ # Compe plugin to interact with conjure.
+ pkgs.vimPlugins.cmp-conjure
+ ];
+}
diff --git a/hosts/muhammed/home/neovim/default.nix b/hosts/muhammed/home/neovim/default.nix
new file mode 100644
index 0000000..905896c
--- /dev/null
+++ b/hosts/muhammed/home/neovim/default.nix
@@ -0,0 +1,8 @@
+# Once again we extend the global configuration defined in `home/neovim/` with
+# some stuff specific to this host (mainly development stuff).
+{...}: {
+ imports = [
+ ./lsp.nix
+ ./conjure.nix
+ ];
+}
diff --git a/hosts/muhammed/home/neovim/lsp.nix b/hosts/muhammed/home/neovim/lsp.nix
new file mode 100644
index 0000000..06745da
--- /dev/null
+++ b/hosts/muhammed/home/neovim/lsp.nix
@@ -0,0 +1,107 @@
+# This module sets up LSP server configurations for Neovim.
+{pkgs, ...}: {
+ programs.neovim.plugins = [
+ {
+ plugin = pkgs.vimPlugins.nvim-lspconfig;
+ type = "lua";
+ config = ''
+ local lspconfig = require("lspconfig")
+ local util = require("lspconfig.util")
+
+ -- Mappings.
+ -- See `:help vim.diagnostic.*` for documentation on any of the below functions
+ local opts = { noremap=true, silent=true }
+ vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float, opts)
+ vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
+ vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
+ vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, opts)
+
+ -- Use an on_attach function to only map the following keys
+ -- after the language server attaches to the current buffer
+ local on_attach = function(client, bufnr)
+ -- Enable completion triggered by <c-x><c-o>
+ vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
+
+ -- Mappings.
+ -- See `:help vim.lsp.*` for documentation on any of the below functions
+ local bufopts = { noremap=true, silent=true, buffer=bufnr }
+ vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
+ vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
+ vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
+ vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
+ vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
+ vim.keymap.set('n', '<leader>wa', vim.lsp.buf.add_workspace_folder, bufopts)
+ vim.keymap.set('n', '<leader>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
+ vim.keymap.set('n', '<leader>wl', function()
+ print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+ end, bufopts)
+ vim.keymap.set('n', '<leader>D', vim.lsp.buf.type_definition, bufopts)
+ vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, bufopts)
+ vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, bufopts)
+ vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
+ vim.keymap.set('n', '<leader>f', function() vim.lsp.buf.format { async = true } end, bufopts)
+ vim.keymap.set('n', '<leader>s', function() vim.cmd[[ClangdSwitchSourceHeader]] end, bufopts)
+ end
+
+ -- Use a loop to conveniently call 'setup' on multiple servers and
+ -- map buffer local keybindings when the language server attaches
+ local servers = {
+ pyright = { cmd = { "${pkgs.pyright}/bin/pyright-langserver", "--stdio" } },
+ nixd = { cmd = { "${pkgs.nixd}/bin/nixd" } },
+ denols = {
+ init_options = {
+ enable = true,
+ unstable = true,
+ lint = true,
+ },
+ cmd = { "${pkgs.unstable.deno}/bin/deno", "lsp", "--unstable" },
+ root_dir = function(startpath)
+ if util.find_package_json_ancestor(startpath) then
+ -- This is a Node project; let tsserver handle this one.
+ return nil
+ else
+ -- Otherwise, we try to find the root or
+ -- default to the current directory.
+ return util.root_pattern("deno.json", "deno.jsonc", ".git")(startpath)
+ or util.path.dirname(startpath)
+ end
+ end,
+ },
+ clangd = {
+ cmd = { "${pkgs.clang-tools}/bin/clangd" },
+ },
+ nimls = {
+ cmd = { "${pkgs.nimlsp}/bin/nimlsp" },
+ },
+ };
+ for server, config in pairs(servers) do
+ -- set common options
+ config.on_attach = on_attach;
+ config.debounce_text_changes = 150;
+
+ lspconfig[server].setup(config)
+ end
+ '';
+ }
+ ];
+}
+# I spent like an hour writing this, only to find it was a pretty bad idea.
+#
+# nixToLua = s:
+# if builtins.isAttrs s then
+# let
+# renderAttr = name: value: "[ [==========[" + name + "]==========] ] = " + (nixToLua value);
+# attrsList = map (name: renderAttr name s.${name}) (lib.attrNames s);
+# attrsListStr = lib.concatStringsSep ", " attrsList;
+# in
+# "{ ${attrsListStr} }"
+# else if builtins.isList s then
+# "{ " + (lib.concatStringsSep ", " (map nixToLua s)) + " }"
+# else if builtins.isString s then
+# # Oh boy I sure hope `s` doesn't contain "]==========]".
+# "[==========[" + s + "]==========]"
+# else if builtins.isInt s || builtins.isFloat s then
+# toString s
+# else
+# throw "Cannot convert ${builtins.typeOf s} to Lua value!";
+
diff --git a/hosts/muhammed/home/noweb/default.nix b/hosts/muhammed/home/noweb/default.nix
new file mode 100644
index 0000000..ef67862
--- /dev/null
+++ b/hosts/muhammed/home/noweb/default.nix
@@ -0,0 +1,12 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ noweb
+ texliveFull
+ yalafi-shell
+ ];
+
+ # Prepend nowebs STY files to the search path. I chose to do it globally,
+ # rather than using `makeWrapper` because I sometimes want to manually invoke
+ # `pdflatex` and the like on the output of `noweave`.
+ home.sessionVariables.TEXINPUTS = "${pkgs.noweb.tex}/tex/latex/noweb/:$TEXINPUTS";
+}