Separate system from home-manager again

This commit is contained in:
Greg Hellings
2025-06-10 14:28:46 -05:00
parent 389a55d8bc
commit eecd6e6d5d
37 changed files with 277 additions and 284 deletions
+28
View File
@@ -0,0 +1,28 @@
{ ... }:
{
home.file.".ansible.cfg".text = ''
[defaults]
forks=10
host_key_checking=False
# Also available: profile_roles
callback_enabled=timer,profile_tasks
callback_result_format=yaml
nocows=1
cow_selection=tux
collections_path=~/src
[ssh_connection]
pipelining=True
ssh_args = -o ControlMaster=auto -o ControlPersist=600s -o IdentitiesOnly=yes -o GSSAPIAuthentication=no -o StrictHostKeyChecking=no
control_path=%(directory)s/%%h-%%r
control_path_dir=/tmp
[callback_profile_tasks]
sort_order=descending
[galaxy]
role_skeleton_ignore = ^.git$,^.*/.git_keep$,\..*.swp
role_skeleton = ~/src/ansible_collections/meta_ansible_templates/role
'';
}
+93
View File
@@ -0,0 +1,93 @@
{ pkgs, ... }:
{
programs.bash = {
enable = true;
shellAliases = {
acp = "rsync --progress -ah";
agbuild = "ansible-galaxy collection build";
apub = "ansible-galaxy collection publish --api-key \${GALAXY_API_KEY}";
calc = "bc";
d = "deactivate";
devroles = "cd ~/src/ansible_collections/devroles";
gohome = "ssh greg@dns.greg-hellings.gmail.com.beta.tailscale.net -D localhost:10080";
ll = "ls -l";
molcol = "molecule -c ../../tests/molecule.yml";
packaging = "cd ~/src/packaging";
vdown = "vagrant destroy";
vhalt = "vagrant halt";
vos = "vagrant up --provision --provider openstack";
vprov = "vagrant provision";
vssh = "vagrant ssh";
vup = "vagrant up --provision --provider libvirt";
yaml2js = "python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)";
};
sessionVariables = {
ANSIBLE_COLLECTIONS_PATH = "\${HOME}/src/";
CLICOLOR = "1";
EDITOR = "${pkgs.vim}/bin/vim";
GIT_SSL_NO_VERIFY = "True";
LSCOLORS = "ExGxBxDxCxEgEdxbxgxcxd";
MAVEN_OPTS = " -Dmaven.wagon.http.ssl.insecure=true ";
OS_CLOUD = "default";
SWORD_PATH = "\${HOME}/.sword";
TIMEFORMAT = "%3Uu %3Ss %3lR %P%%";
};
profileExtra = ''
if [ -e /etc/profile ]; then
. /etc/profile
fi
'';
bashrcExtra = ''
function swordtag {
if [ x"$1" == "x" ]; then
echo "Please provide tag version"
return
fi
svn cp http://crosswire.org/svn/sword/branches/sword-1-8-x/ http://crosswire.org/svn/sword/tags/sword-$1/
}
function newdock {
if [ x"$1" == "x" -o x"$2" == "x" ]; then
echo "expected arguments [name] [source]"
return
fi
podman run -P --privileged=true -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v "$(pwd):/dmnt" -t -i --name="$1" "$2" /bin/bash
}
function rundock {
podman start -a -i "$1"
}
function ac {
source ~/venv/''${1}/bin/activate
}
function py2env {
/usr/bin/virtualenv -p /usr/bin/python2 "''${HOME}/venv/''${1}"
"''${HOME}/venv/''${1}/bin/pip" install -U pip
}
function py3env {
VENV_NAME="''${1}"
#PYVERSION="$(python3 -c "import sys;print(sys.version[:sys.version.find('.',2)])")"
#SITE_PACKAGES_PATH="/usr/lib64/python''${PYVERSION}/site-packages/"
#VENV_SITE_PACKAGES="''${HOME}/venv/''${VENV_NAME}/lib64/python''${PYVERSION}/site-packages/"
# Create the virtualenv and update pip to latest
/usr/bin/python3 -m venv --clear "''${HOME}/venv/''${VENV_NAME}" --system-site-packages
"''${HOME}/venv/''${1}/bin/python3" -m pip install -U pip
# Link SELinux into the environment if necessary
#if [ -d "''${SITE_PACKAGES_PATH}" ]; then
# ln -s "''${SITE_PACKAGES_PATH}/selinux" "''${VENV_SITE_PACKAGES}"
# ln -s ''${SITE_PACKAGES_PATH}/_selinux*.so "''${VENV_SITE_PACKAGES}"
#else
# echo "ERROR: LibSELinux not found for Python ''${PYVERSION}. Install system package to enable."
#fi
}
function unknown_host {
sed -i -e ''${1}d ~/.ssh/known_hosts
}
'';
};
}
+13
View File
@@ -0,0 +1,13 @@
{ ... }:
{
imports = [
./ansible.nix
./bash.nix
./direnv.nix
./git.nix
./ssh.nix
./vim
./xonsh.nix
];
}
+21
View File
@@ -0,0 +1,21 @@
{ ... }:
{
programs.direnv = {
enable = true;
nix-direnv.enable = true;
stdlib = ''
layout_poetry() {
if [[ ! -f pyproject.toml ]]; then
echo "No pyproject.toml found"
exit 1
fi
venv="$(dirname "$(poetry run which python)")"
export VIRTUAL_ENV="$(echo "$venv" | rev | cut -d'/' -f2- | rev)"
export POETRY_ACTIVE=1
PATH_add "$venv"
}
'';
};
}
+50
View File
@@ -0,0 +1,50 @@
{ ... }:
{
programs.git = {
enable = true;
userName = "Greg Hellings";
userEmail = "greg.hellings@gmail.com";
aliases = {
st = "status";
ci = "commit";
co = "checkout";
ups = "push -u origin HEAD";
amend = "commit --amend";
};
ignores = [
".*.swp"
".*.swo"
".*.swn" # vim
".idea" # IntelliJ
".DS_Store" # Macs
"Thumbs.db" # Windows
".tox" # Tox temp directory
".eclipse" # These next two are created by VSCodium plugins
".bazelproject"
];
extraConfig = {
branch.sort = "-committerdate";
column.ui = "auto";
commit.verbose = "true";
diff = {
algorithm = "histogram";
colorMoved = "plain";
mnemonicPrefix = "true";
renames = "true";
};
init.defaultBranch = "main";
push.default = "upstream";
pull.rebase = "false";
rebase = {
autoSquash = "true";
updateRefs = "true";
};
rerere = {
autoupdate = "true";
enabled = "true";
};
tag.sort = "version:refname";
};
};
}
+83
View File
@@ -0,0 +1,83 @@
{ lib, ... }:
{
# Workaround to set the config value to user read-only
# This allows things like SSH in distrobox to read the config file just fine
home.file.".ssh/config" = {
target = ".ssh/config_source";
onChange = ''cat ~/.ssh/config_source > ~/.ssh/config && chmod 600 ~/.ssh/config'';
};
programs.ssh = {
enable = true;
serverAliveInterval = 60;
includes = [ "config.local" ];
matchBlocks =
let
nas = {
user = "admin";
};
owned = {
user = "greg";
};
in
{
inherit nas;
"*" = {
dynamicForwards = [ { port = 10240; } ];
};
"10.42.1.4" = lib.hm.dag.entryBefore [ "10.42.*" ] nas;
"nas.thehellings.lan" = nas;
"nas.greg-hellings.gmail.com.beta.tailscale.net" = nas;
chronicles = nas;
"chronicles.thehellings.lan" = lib.hm.dag.entryBefore [ "*.thehellings.lan" ] nas;
gh = {
user = "git";
hostname = "github.com";
};
"src" = {
user = "gitlab";
hostname = "git.thehellings.lan";
};
srcpub = {
user = "gitlab";
hostname = "src.thehellings.com";
port = 2222;
};
ivr = {
user = "git";
hostname = "gitlab.com";
};
"ivr.thehellings.lan" = lib.hm.dag.entryBefore [ "ivr" ] {
user = "gregory.hellings";
};
"*.thehellings.lan" = owned;
"10.42.*" = owned;
"host.crosswire.org crosswire" = {
hostname = "host.crosswire.org";
user = "ghellings";
};
fedpeople = {
hostname = "fedorapeople.org";
user = "greghellings";
};
"src.fedoraproject.org pkgs.fedoraproject.org" = {
user = "greghellings";
};
"127.*".extraOptions = {
PubkeyAcceptedAlgorithms = "+ssh-rsa";
HostkeyAlgorithms = "+ssh-rsa";
};
};
};
}
+157
View File
@@ -0,0 +1,157 @@
{ pkgs, ... }:
{
colorschemes.gruvbox.enable = true;
globals = {
indent_guides_enable_on_vim_startup = 1;
nix_recommended_style = 0;
};
opts = {
background = "dark";
backup = false;
copyindent = true;
cursorline = true;
expandtab = false;
hidden = true;
hlsearch = true;
ignorecase = true;
lazyredraw = true;
list = true;
listchars = "tab: ,extends:,precedes:,trail:·,eol:¬";
mouse = "a";
number = true;
preserveindent = true;
relativenumber = true;
shiftwidth = 4;
showcmd = true;
showmatch = true;
signcolumn = "yes";
smartcase = true;
softtabstop = 4;
tabstop = 4;
# Setting for CtrlP
wildignore = "*.swp,*.pyc,*.class,.tox";
wrap = false;
writebackup = false;
};
keymaps =
let
winMove = key: {
mode = "n";
key = "<C-${key}>";
action = "<C-w>${key}<C-w><CR>";
};
in
[
{
mode = "n";
key = "<C-e>";
action = "<Esc>:BufExplorer<CR>";
}
{
mode = "n";
key = "<C-t>";
#action = "<Esc>:NERDTreeToggle<CR>";
action = "<Esc>:Neotree toggle<CR>";
}
{
mode = "n";
key = "<C-g>";
action = "<Esc>:Git<CR>";
}
(winMove "h")
(winMove "j")
(winMove "k")
(winMove "l")
];
plugins = {
airline.enable = true;
cmp = {
enable = true;
autoEnableSources = true;
settings = {
sources = [
{ name = "nvim_lsp"; }
{
name = "buffer";
group_index = 2;
}
{
name = "path";
gruop_index = 3;
}
];
mapping = {
"<C-Space>" = "cmp.mapping.complete()";
"<CR>" = "cmp.mapping.confirm({ select = true })";
"<C-f>" = "cmp.mapping.select_next_item()";
"<C-b>" = "cmp.mapping.select_prev_item()";
"<C-c>" = "cmp.mapping.abort()";
};
};
};
direnv.enable = true;
gitgutter.enable = true;
fugitive.enable = true;
fzf-lua = {
enable = true;
keymaps = {
"<C-o>" = {
action = "files";
settings = {
previewers.cat.cmd = "${pkgs.coreutils}/bin/cat";
winopts.height = 0.5;
};
};
"<C-p>" = {
action = "git_files";
settings = {
previewers.cat.cmd = "${pkgs.coreutils}/bin/cat";
winopts.height = 0.5;
};
};
};
profile = "fzf-vim";
};
lsp = {
enable = true;
servers = {
ansiblels.enable = true;
cmake.enable = true;
gopls.enable = true;
html.enable = true;
nixd.enable = true;
pylsp.enable = true;
pyright.enable = true;
rust_analyzer = {
# No need to have these installed on every one of my systems
installCargo = false;
installRustc = false;
enable = true;
};
terraformls.enable = true;
};
};
neo-tree.enable = true;
notify.enable = true;
remote-nvim.enable = true;
web-devicons.enable = true;
};
userCommands = {
Ggr = {
command = "Ggrep! <q-args> | cw | redraw!";
nargs = "+";
};
};
extraConfigLua = builtins.replaceStrings [ "@git@" ] [ "${pkgs.git}/bin/git" ] (
builtins.readFile ./extra.lua
);
extraConfigVim = builtins.readFile ./extra.vimrc;
extraPlugins = with pkgs.vimPlugins; [
bufexplorer
context-vim
vim-indent-guides
];
viAlias = true;
vimAlias = true;
}
+16
View File
@@ -0,0 +1,16 @@
{
config,
pkgs,
lib,
...
}:
{
# The Hack font is used in the Fugitive sidebars
fonts.fontconfig.enable = true;
home.packages = with pkgs.nerd-fonts; [ hack ];
programs.nixvim = (import ./config.nix { inherit config pkgs lib; }) // {
enable = true;
};
}
+37
View File
@@ -0,0 +1,37 @@
-- ======================================================================
--
-- automatic commands
--
-- ======================================================================
local api = vim.api
local all = {"n", "v", "i"}
-- Highlights bad whitespace
--api.nvim_create_autocmd("ColorScheme", { command = "highlight ExtraWhitespace ctermbg=red guibg=red" })
--api.nvim_create_autocmd("BufWinEnter", { command = "match ExtraWhitespace /\s\+$/" })
--api.nvim_create_autocmd("InsertEnter", { command = "match ExtraWhitespace /\s\+\%#\@<!$/" })
--api.nvim_create_autocmd("InsertLeave", { command = "match ExtraWhitespace /\s\+$/" })
vim.fn.matchadd('errorMsg', [[\s\+$]])
api.nvim_create_autocmd("BufWinLeave", { command = "call clearmatches()" })
-- Automatically source .vimrc when we write that file
-- This is probably no longer valid since we're writing init.lua, but we'll keep it for the sake
-- of posterity at the moment
api.nvim_create_autocmd("BufWritePost", {
pattern = ".vimrc",
command = "source $MYVIMRC"
})
-- Toggles absolute line numbers on/off when a window has focus or not
numbertoggle = api.nvim_create_augroup("numbertoggle", { clear = true })
api.nvim_create_autocmd({ "BufEnter", "FocusGained", "InsertLeave" }, {
command = "set relativenumber",
group = numbertoggle
})
api.nvim_create_autocmd({ "BufLeave", "FocusLost", "InsertEnter" }, {
command = "set norelativenumber",
group = numbertoggle
})
-- Set file highlighting to Ruby for Vagrantfiles
api.nvim_create_autocmd({ "BufRead", "BufNewFile"}, {
pattern = "Vagrantfile*",
command = "set filetype=ruby"
})
+35
View File
@@ -0,0 +1,35 @@
function! s:MkNonExDir(file, buf)
if empty(getbufvar(a:buf, '&buftype')) && a:file!~#'\v^\w+\:\/'
let dir=fnamemodify(a:file, ':h')
if !isdirectory(dir)
call mkdir(dir, 'p')
endif
endif
endfunction
augroup BWCCreateDir
autocmd!
autocmd BufWritePre * :call s:MkNonExDir(expand('<afile>'), +expand('<abuf>'))
augroup END
function! Indenting(indent, what, cols)
let spccol = repeat(' ', a:cols)
let result = substitute(a:indent, spccol, '\t', 'g')
let result = substitute(result, ' \+\ze\t', ''', 'g')
if a:what == 1
let result = substitute(result, '\t', spccol, 'g')
endif
return result
endfunction
function! IndentConvert(line1, line2, what, cols)
let savepos = getpos('.')
let cols = empty(a:cols) ? &tabstop : a:cols
execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
call histdel('search', -1)
call setpos('.', savepos)
endfunction
command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)
noremap <expr> <C-p> (fugitive#Head() != '' ? ':GFiles --exclude-standard --others --cached' : ':Files')."\<cr>"
+88
View File
@@ -0,0 +1,88 @@
-- ======================================================================
--
-- nvim-cmp configuration
--
-- ======================================================================
local cmp = require'cmp'
cmp.setup({
snippet = {
expand = function(args)
vim.fn["vsnip#anonymous"](args.body)
end,
},
window = {
-- completion = cmp.config.window.bordered(),
-- documentation = cmp.config.window.bordered(),
},
mapping = cmp.mapping.preset.insert({
['<C-b>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.abort(),
['<CR>'] = cmp.mapping.confirm({ select = true }),
}),
sources = cmp.config.sources({
{ name = 'nvim_lspconfig' },
{ name = 'vsnip' },
},{
{ name = 'buffer' }
})
})
cmp.setup.filetype('gitcommit', {
sources = cmp.config.sources({
{ name = 'git' }
},{
{ name = 'buffer' }
})
})
cmp.setup.cmdline({ '/', '?' }, {
mapping = cmp.mapping.preset.cmdline(),
sources = { { name = 'buffer' } }
})
cmp.setup.cmdline(':', {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({
{ name = 'path' }
},{
{ name = 'cmdline' }
})
})
local capabilities = require('cmp_nvim_lsp').default_capabilities()
local lspconfig = require('lspconfig')
-- Add each LSP that you have configured here
--require('lspconfig')['<LANGUAGE_SERVER_HERE>'].setup {
-- capabilities = capabilities
--}
--lspconfig.pyright.setup { capabilities = capabilities }
lspconfig.ansiblels.setup { capabilities = capabilities }
--lspconfig.jedi_language_server.setup { capabilities }
-- ======================================================================
--
-- Plugin configurations
--
-- ======================================================================
-- Set filetype to the way I want it
-- Settings for CtrlP
vim.opt.wildignore="*.swp,*.pyc,*.class,.tox"
-- Settings for NerdTree
vim.g.NERDTreeIgnore = {'\\.pyc$', '\\.o$', '\\.class$'}
-- indent guides
vim.g.indent_guides_enable_on_vim_startup = 1
-- Tell syntastic to use yamllint
vim.g.syntastic_yaml_checkers = {'yamllint'}
vim.g.syntastic_yaml_yamllint_args = {}
vim.g.syntastic_shell = "${pkgs.bash}/bin/bash"
-- Shortcuts for resolving git diff conflicts
vim.g.diffget_local_map = "gl"
vim.g.diffget_upstream_map = "gu"
-- ============================================================================
-- User functions to just make life easier
-- ============================================================================
+220
View File
@@ -0,0 +1,220 @@
set background=dark
set copyindent
set noexpandtab
set hidden
set ignorecase
set mouse="a"
set number
set relativenumber
set shiftwidth=4
set smartcase
set tabstop=4
syntax enable
set preserveindent
set softtabstop=0
set nowrap
set showcmd
set cursorline
set lazyredraw
set showmatch
set hlsearch
set nobackup
set nowritebackup
set signcolumn=yes
" Milliseconds between updates
set updatetime=300
" Shows non-printing characters
set listchars=tab:→\ ,extends:→,precedes:←,trail,eol
set list
" nvim-cmp configuration
"
lua <<EOF
local cmp = require'cmp'
cmp.setup({
snippet = {
expand = function(args)
vim.fn["vsnip#anonymous"](args.body)
end,
},
window = {
-- completion = cmp.config.window.bordered(),
-- documentation = cmp.config.window.bordered(),
},
mapping = cmp.mapping.preset.insert({
['<C-b>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.abort(),
['<CR>'] = cmp.mapping.confirm({ select = true }),
}),
sources = cmp.config.sources({
{ name = 'nvim_lspconfig' },
{ name = 'vsnip' },
},{
{ name = 'buffer' }
})
})
cmp.setup.filetype('gitcommit', {
sources = cmp.config.sources({
{ name = 'git' }
},{
{ name = 'buffer' }
})
})
cmp.setup.cmdline({ '/', '?' }, {
mapping = cmp.mapping.preset.cmdline(),
sources = { { name = 'buffer' } }
})
cmp.setup.cmdline(':', {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({
{ name = 'path' }
},{
{ name = 'cmdline' }
})
})
local capabilities = require('cmp_nvim_lsp').default_capabilities()
local lspconfig = require('lspconfig')
-- Add each LSP that you have configured here
--require('lspconfig')['<LANGUAGE_SERVER_HERE>'].setup {
-- capabilities = capabilities
--}
--lspconfig.pyright.setup { capabilities = capabilities }
lspconfig.ansiblels.setup { capabilities = capabilities }
lspconfig.jedi_language_server.setup { capabilities = capabilities }
EOF
" Set filetype to the way I want it
let g:nix_recommended_style = 0
" Highlights bad whitespace
autocmd ColorScheme * highlight ExtraWhitespace ctermbg=red guibg=red
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()
" Settings for CtrlP
set wildignore+=*.swp,*.pyc,*.class,.tox
" Settings for NerdTree
let NERDTreeIgnore = ['\.pyc$', '\.o$', '\.class$']
" indent guides
let g:indent_guides_enable_on_vim_startup = 1
autocmd! BufWritePost .vimrc source $MYVIMRC
" Tell syntastic to use yamllint
let g:syntastic_yaml_checkers = ['yamllint']
let g:syntastic_yaml_yamllint_args = []
let g:syntastic_shell = "${pkgs.bash}/bin/bash"
" Shortcuts for resolving git diff conflicts
let g:diffget_local_map = 'gl'
let g:diffget_upstream_map = 'gu'
" Key mappings
map <F2> <Esc>\be
imap <F2> <Esc>\be
map <F4> <Esc>:NERDTreeToggle<Cr>
silent !git rev-parse --is-inside-work-tree
if v:shell_error == 0
map <C-p> :GFiles --cached --others --exclude-standard<CR>
map <C-o> :GFiles?
else
map <C-p> :Files<CR>
endif
map <F6> <Esc>:Files<Cr>
" Allows navigating splits
map <C-j> <C-w>j<C-w><Cr>
map <C-k> <C-w>k<C-w><Cr>
map <C-h> <C-w>h<C-w><Cr>
map <C-l> <C-w>l<C-w><Cr>
colorscheme gruvbox
" ============================================================================
" User functions to just make life easier
" ============================================================================
" Toggle absolute line numbers when we don't have focus, and hybrid when
" we do have it
augroup numbertoggle
autocmd!
autocmd BufEnter,FocusGained,InsertLeave * set relativenumber
autocmd BufLeave,FocusLost,InsertEnter * set norelativenumber
augroup END
" syntax highlighting for Vagrantfiles
augroup vagrant
au!
au BufRead,BufNewFile Vagrantfile set filetype=ruby
augroup END
" Creates the directory for a file if it doesn't already exist.
function! s:MkNonExDir(file, buf)
if empty(getbufvar(a:buf, '&buftype')) && a:file!~#'\v^\w+\:\/'
let dir=fnamemodify(a:file, ':h')
if !isdirectory(dir)
call mkdir(dir, 'p')
endif
endif
endfunction
augroup BWCCreateDir
autocmd!
autocmd BufWritePre * :call s:MkNonExDir(expand('<afile>'), +expand('<abuf>'))
augroup END
" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
let spccol = repeat(' ', a:cols)
let result = substitute(a:indent, spccol, '\t', 'g')
let result = substitute(result, ' \+\ze\t', ''', 'g')
if a:what == 1
let result = substitute(result, '\t', spccol, 'g')
endif
return result
endfunction
" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
let savepos = getpos('.')
let cols = empty(a:cols) ? &tabstop : a:cols
execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
call histdel('search', -1)
call setpos('.', savepos)
endfunction
command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)
"""""""""
""" Unused, but kept in case I end up on a system where I can't use my preferred plugins
"""""""""
" Base of search is ordered as
" r - searching up from here to the nearest marker (.git, .hg, .svn, etc)
" a - dir of current file, unless that's a subdirectory of CWD
" c - dir of current file
let g:ctrlp_working_path_mode = 'arc'
let g:ctrlp_switch_buffer = 0
let g:ctrlp_cmd = 'CtrlPMixed'
let g:ctrlp_show_hidden = 1
let g:ctrlp_user_command = {
\'types': {
\1: ['.git', '${pkgs.git}/bin/git ls-files --cached --exclude-standard --others' ],
\},
\'fallback': '${pkgs.findutils}/bin/find . -type f | ${pkgs.gnugrep}/bin/grep -v -e "\.tox/" -e "\.git/"',
\}
" let g:ctrpl_match_func = { 'match': 'pymatcher#PyMatch' }
" map <F6> <Esc>:CtrlP<Cr>
+96
View File
@@ -0,0 +1,96 @@
{ pkgs, config, ... }:
{
# Programs that are used in the settings file
home.packages = with pkgs; [
copier
git
gnused
nix-output-monitor
nvd
];
programs.xonsh = {
enable = true;
sessionVariables = {
# This is for pushing builds to my local S3 cache
AWS_SHARED_CREDENTIALS_FILE = "/run/agenix/cache-credentials";
CLICOLOR = 1;
EDITOR = "nvim";
# vte_new_tab_cwd causes new Terminal tabs to open in the
# same CWD as the current tab
LESS_TERMCAP_mb = "\\033[01;31m"; # begin blinking
LESS_TERMCAP_md = "\\033[01;31m"; # begin bold
LESS_TERMCAP_me = "\\033[0m"; # end mode
LESS_TERMCAP_so = "\\033[01;44;36m"; # begin standout-mode (bottom of screen)
LESS_TERMCAP_se = "\\033[0m"; # end standout-mode
LESS_TERMCAP_us = "\\033[00;36m"; # begin underline
LESS_TERMCAP_ue = "\\033[0m"; # end underline
LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN = "1";
LSCOLORS = "ExGxBxDxCxEgEdxbxgxcxd";
MAVEN_OPTS = " -Dmaven.wagon.http.ssl.insecure=true";
OS_CLOUD = "default";
PROMPT = "{vte_new_tab_cwd}{env_name}{BOLD_GREEN}{user}@{hostname}{BOLD_BLUE} {short_cwd}{branch_color}{curr_branch: {}}{RESET} {BOLD_BLUE}{prompt_end}{RESET} ";
SWORD_PATH = "${config.home.homeDirectory}/.sword/";
TIMEFORMAT = "%3Uu %3Ss %3lR %P%%";
# Tells vox where to find virtualenvs
VIRTUALENV_HOME = "${config.home.homeDirectory}/venv/";
XONSH_COLOR_STYLE = "default";
GOPATH = "${config.home.homeDirectory}/src/go";
GOBIN = "${config.home.homeDirectory}/src/bin";
};
aliases = {
# Python related ones
ac = "vox activate";
d = "vox deactivate";
s = "nix run \".#runserver\"";
# Nix related ones
deploy = "nixos-rebuild switch --use-remote-sudo --use-substitutes --target-host";
gl-nging = "sudo nixos-container run gitlab -- systemctl restart nginx";
nb = "nix build -L";
nixdu = "sudo nix-store --gc --print-roots | egrep -v r\"^(/nix/var|/run/\\w+-system|\\{memory|/proc)\"";
nixtest = "nixpkgs-review rev HEAD";
nixup = "nix flake lock --update-input";
nixcopy = "nix copy --to \"s3://binary-cache/?profile=default&endpoint=nas.home%3A9000&scheme=http\"";
stable = "nix flake lock --update-input nixstable --update-input hm --update-input nixvimstable";
unstable = "nix flake lock --update-input nixunstable --update-input hmunstable --update-input nixvimunstable --update-input nurpkgs --update-input vsext --update-input wsl";
updateScript = "nix-shell maintainers/scripts/update.nix --argstr package";
# General
gh-personal = "$GH_CONFIG_DIR=\"${config.home.homeDirectory}/.config/gh/personal\" gh";
k = "kubectl";
kn = "kubectl get nodes -o wide";
kp = "kubectl get pods -o wide";
ls = "ls --color";
ll = "ls -l --color";
win = "sudo virsh start win10";
z = "zeditor .";
# Tailscale related ones
tsup = "sudo tailscale up";
tspub = "sudo tailscale up --exit-node=linode";
tshome = "sudo tailscale up --exit-node=2maccabees";
tsclear = "sudo tailscale up --exit-node=''";
# Vagrant related
vdown = "vagrant destroy";
vhalt = "vagrant halt";
vos = "vagrant up --provision --provider openstack";
vprov = "vagrant provision";
vup = "vagrant up --provision --provider libvirt";
vssh = "vagrant ssh";
};
configHeader = builtins.readFile ./xonsh_header.xsh;
configFooter =
(builtins.readFile ./xonsh_footer.xsh)
+ (builtins.concatStringsSep "\n" [
"with open('${pkgs.stdenv.cc}/nix-support/dynamic-linker', 'r') as fp:"
" $NIX_LD = fp.read().strip()"
]);
};
}
+131
View File
@@ -0,0 +1,131 @@
# vim: set ft=xonsh :
from tempfile import NamedTemporaryFile, TemporaryDirectory
def bw_unlock():
"""Unlocks the BitWarden CLI and adds the resulting session code to the
current environment variables. Also returns the code for them."""
if "BW_SESSION" in ${...}:
return $BW_SESSION
result = !(bw unlock --raw)
while result.returncode != 0:
result = !(bw unlock --raw)
$BW_SESSION = result.output.strip()
return token
def vpn(con, bwname):
nmcli c down @(con)
bw_unlock()
base=$(bw get password @(bwname))
secret=$(bw get totp @(bwname))
#echo vpn.secrets.password:${base}$(oathtool -b -d "${digits}" -s "${period}" --totp "${secret}") > "${f}"
with NamedTemporaryFile(delete_on_close=False) as fp:
secret = f"vpn.secrets.password:{base}{secret}"
fp.write(secret.encode("utf-8"))
fp.close()
nmcli c up @(con) passwd-file @(fp.name)
def _unlock(args):
bw_unlock()
aliases['unlock'] = _unlock
def _ivr(args):
vpn("350Main", "IVR Technology")
aliases['ivr'] = _ivr
def _ivr2(args):
vpn("gregory_hellings@ra.ivrtechnology.com", "IVR Technology")
aliases['ivr2'] = _ivr2
def _glrestart(args):
sudo nixos-container run gitlab -- systemctl restart gitlab
sudo nixos-container run gitlab -- systemctl restart nginx
aliases['glrestart'] = _glrestart
def _aws_creds(args):
$AWS_ACCESS_KEY_ID=$(bw get username "AWS Access Key")
$AWS_SECRET_ACCESS_KEY=$(bw get password "AWS Access Key")
aliases['aws_creds'] = _aws_creds
def _rebuild(args):
system = uname()
hostname = system.nodename
if system.sysname == 'Darwin':
sudo darwin-rebuild switch
else:
with TemporaryDirectory() as td:
pushd @(td)
nom build f"/etc/nixos#nixosConfigurations.{hostname}.config.system.build.toplevel"
if g`result`:
nvd diff /run/current-system result
sudo nixos-rebuild switch
popd
aliases['rebuild'] = _rebuild
def _yaml2json(args, stdin=None, stdout=None):
import sys, yaml, json
from yaml import CLoader
json.dump(yaml.load(stdin, Loader=CLoader), stdout, indent=4)
aliases['yaml2json'] = _yaml2json
def _py2env(args):
vox new @(args[0]) -p /usr/bin/python2
aliases['py2env'] = _py2env
def _py3env(args):
vox new @(args[0])
aliases['py3env'] = _py3env
def _rundock(args):
if Path('/usr/bin/podman').exists():
e = 'podman'
else:
e = 'docker'
@(e) exec -ti @(args[0]) /bin/bash
aliases['rundock'] = _rundock
def _pip_extras(args):
import importlib_metadata
print(importlib_metadata.metadata(args[0]).get_all('Provides-Extra'))
aliases['pip_extras'] = _pip_extras
# Container stuff
def _newdock(args):
if Path('/usr/bin/podman').exists():
e = 'podman'
else:
e = 'docker'
@(e) run -P --privileged=true -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v @(getcwd()):/dmnt -v /etc/pki:/etc/pki:ro -d --name @(args[1]) @(args[0]) /sbin/init
rundock @(args[1])
aliases['newdock'] = _newdock
def _unknown_host(args):
sed -i -e @(args[0])d ~/.ssh/known_hosts
aliases['unknown_host'] = _unknown_host
def _bake(args):
from pathlib import Path
templates = Path("~/.copier-templates/").expanduser()
if not templates.exists():
git clone src:greg/copier-templates.git ~/.copier-templates
copier copy @(str(templates / args[0])) .
aliases['bake'] = _bake
def _cleanup(args):
sudo nix profile wipe-history --profile ~/.local/state/nix/profiles/home-manager --older-than '30d'
sudo nix-collect-garbage --delete-older-than 30d
sudo nix store optimise
aliases['cleanup'] = _cleanup
###
#
# Other random nice-to-have things
#
###
# Allows identifying JSON as if it was Python by adding some new builtins to the language
import builtins
builtins.true = True
builtins.false = False
builtins.null = None
+35
View File
@@ -0,0 +1,35 @@
# vim: set ft=python:
from os import getcwd, uname
from pathlib import Path
from sys import platform
#if uname().sysname == 'Darwin' and ('__NIX_DARWIN_SET_ENVIRONMENT_DONE' not in ${...} or not $__NIX_DARWIN_SET_ENVIRONMENT_DONE):
# source-bash /etc/bashrc
# set -e == $RAISE_SUBPROC_ERROR = True
# set -x == trace on; $XONSH_TRACE_SUBPROC = True
# $? == _.rtn
# Does virtualenv support
xontrib load vox
# Faster coreutils
xontrib load coreutils
xontrib load direnv
xontrib load coreutils
xontrib load xonsh-apipenv
$APIPENV="1"
# Insert to the front, because when we spawn xonsh in tmux we have raw python3
# paths added before these. That ends up screwing with finding the python3 version
# with all of our dependencies that we want
$PATH.insert(0, Path("~/.nix-profile/bin").expanduser())
$PATH.insert(0, Path("~/src/bin").expanduser())
$PATH.insert(0, Path("~/.local/bin").expanduser())
if platform == "darwin":
$PATH.append(Path("/opt/homebrew/bin/"))
$PATH.append(Path("/run/current-system/sw/bin"))
$PATH.append(Path("/nix/var/nix/profiles/default/bin"))
$PATH.append(Path("/usr/local/bin"))