mirror of
https://github.com/kmein/niveum
synced 2026-03-18 11:01:07 +01:00
MASSIVE restructuring
This commit is contained in:
139
configs/base/default.nix
Normal file
139
configs/base/default.nix
Normal file
@@ -0,0 +1,139 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${builtins.fetchTarball https://github.com/rycee/home-manager/archive/master.tar.gz}/nixos"
|
||||
./editors.nix
|
||||
./networks.nix
|
||||
./scripts.nix
|
||||
./shells.nix
|
||||
../../options.nix
|
||||
];
|
||||
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
sound.enable = true;
|
||||
|
||||
hardware.pulseaudio = {
|
||||
enable = true;
|
||||
package = pkgs.pulseaudioFull; # for bluetooth sound output
|
||||
};
|
||||
|
||||
hardware.bluetooth = {
|
||||
enable = true;
|
||||
extraConfig = ''
|
||||
[General]
|
||||
Enable=Source,Sink,Media,Socket
|
||||
'';
|
||||
};
|
||||
|
||||
i18n = {
|
||||
defaultLocale = "en_GB.UTF-8";
|
||||
consoleKeyMap = "de";
|
||||
# consoleColors = with import ../theme.nix; map (c: lib.strings.removePrefix "#" c) colorPalette;
|
||||
};
|
||||
|
||||
services.printing = {
|
||||
enable = true;
|
||||
drivers = [ pkgs.hplipWithPlugin ];
|
||||
};
|
||||
|
||||
security.sudo = {
|
||||
enable = true;
|
||||
extraConfig = ''
|
||||
Defaults pwfeedback
|
||||
'';
|
||||
};
|
||||
|
||||
users.mutableUsers = false;
|
||||
|
||||
users.users.kfm = {
|
||||
name = "kfm";
|
||||
description = config.constants.user.name;
|
||||
home = "/home/kfm";
|
||||
createHome = true;
|
||||
group = "users";
|
||||
extraGroups = [ "wheel" "audio" ];
|
||||
hashedPassword = "$6$w9hXyGFl/.IZBXk$5OiWzS1G.5hImhh1YQmZiCXYNAJhi3X6Y3uSLupJNYYXPLMsQpx2fwF4Xr2uYzGMV8Foqh8TgUavx1APD9rcb/";
|
||||
shell = pkgs.zsh;
|
||||
};
|
||||
|
||||
home-manager.users.kfm = {
|
||||
programs.git = {
|
||||
enable = true;
|
||||
userName = config.constants.user.name;
|
||||
userEmail = config.constants.user.email;
|
||||
aliases = {
|
||||
br = "branch";
|
||||
co = "checkout";
|
||||
ci = "commit";
|
||||
amend = "commit --amend";
|
||||
st = "status";
|
||||
unstage = "reset HEAD --";
|
||||
sdiff = "diff --staged";
|
||||
last = "log -1 HEAD";
|
||||
pull-all = "!pull-all"; # from dot/scripts.nix
|
||||
};
|
||||
ignores = config.constants.ignore;
|
||||
};
|
||||
|
||||
home.file = {
|
||||
".config/htop/htoprc".text = import ../../dot/htop.nix;
|
||||
".zshrc".text = "# nothing to see here";
|
||||
};
|
||||
};
|
||||
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
] ++ [ # internet
|
||||
aria2
|
||||
w3m
|
||||
wget
|
||||
curl
|
||||
httpie
|
||||
whois
|
||||
] ++ [ # media
|
||||
imagemagick
|
||||
] ++ [ # archive
|
||||
unzip
|
||||
unrar
|
||||
p7zip
|
||||
zip
|
||||
] ++ [ # monitor
|
||||
htop
|
||||
iotop
|
||||
iftop
|
||||
lsof
|
||||
psmisc
|
||||
] ++ [ # shell
|
||||
bat
|
||||
dos2unix
|
||||
fd
|
||||
file
|
||||
git
|
||||
gitAndTools.hub
|
||||
gitstats
|
||||
jo
|
||||
jq
|
||||
manpages
|
||||
patch
|
||||
patchutils
|
||||
posix_man_pages
|
||||
most
|
||||
ranger
|
||||
ripgrep
|
||||
rlwrap
|
||||
tree
|
||||
] ++ [ # hardware
|
||||
pmount
|
||||
usbutils
|
||||
pciutils
|
||||
];
|
||||
|
||||
programs.command-not-found.enable = true;
|
||||
programs.java = {
|
||||
enable = true;
|
||||
package = pkgs.openjdk;
|
||||
};
|
||||
|
||||
}
|
||||
213
configs/base/editors.nix
Normal file
213
configs/base/editors.nix
Normal file
@@ -0,0 +1,213 @@
|
||||
{ pkgs, config, ... }:
|
||||
let vim_conf = ''
|
||||
" if tabular
|
||||
vmap a= :Tabularize /=<CR>
|
||||
vmap a; :Tabularize /::<CR>
|
||||
vmap a- :Tabularize /-><CR>
|
||||
|
||||
colorscheme delek
|
||||
|
||||
filetype plugin indent on
|
||||
set title
|
||||
set nocompatible
|
||||
set smartcase
|
||||
set shiftwidth=2 tabstop=2 expandtab
|
||||
set number
|
||||
set path=$PWD/**
|
||||
set completeopt=menu,longest
|
||||
set wildmode=list:full wildignore+=${builtins.concatStringsSep "," config.constants.ignore}
|
||||
set shortmess+=aI
|
||||
set nowritebackup noswapfile
|
||||
set mouse=a
|
||||
set showmatch
|
||||
set encoding=utf8 ffs=unix,dos,mac
|
||||
set smartindent
|
||||
set nowrap
|
||||
set nohlsearch
|
||||
set clipboard=unnamedplus
|
||||
set nopaste
|
||||
set list listchars=tab:⇥\ ,extends:❯,precedes:❮,nbsp:␣,trail:· showbreak=↪
|
||||
set foldlevelstart=30
|
||||
|
||||
if exists("g:loaded_netrwPlugin")
|
||||
let g:netrw_banner=0
|
||||
let g:netrw_browse_split=4
|
||||
let g:netrw_altv=1 " open splits to the right
|
||||
let g:netrw_liststyle=3 " tree view
|
||||
let g:netrw_list_hide=netrw_gitignore#Hide()
|
||||
let g:netrw_list_hide.=',\(^\|\s\s\)\zs\.\S\+'
|
||||
endif
|
||||
|
||||
call matchadd('colorcolumn', '\%101v', 100)
|
||||
highlight colorcolumn ctermbg=red
|
||||
|
||||
" undofile - This allows you to use undos after exiting and restarting
|
||||
" This, like swap and backups, uses .vim-undo first, then ~/.vim/undo
|
||||
" :help undo-persistence
|
||||
if exists("+undofile")
|
||||
if isdirectory($HOME . '/.vim/undo') == 0
|
||||
:silent !mkdir -p ~/.vim/undo > /dev/null 2>&1
|
||||
endif
|
||||
set undodir=./.vim-undo//
|
||||
set undodir+=~/.vim/undo//
|
||||
set undofile
|
||||
endif
|
||||
|
||||
nmap <C-j> ddp | vmap <C-j> xp`[V`]
|
||||
nmap <C-k> ddkP | vmap <C-k> xkP`[V`]
|
||||
|
||||
nnoremap <silent> <Space> @=(foldlevel('.')?'za':"\<Space>")<CR>
|
||||
vnoremap <Space> zf
|
||||
|
||||
command! RandomLine execute 'normal! '.(system('/bin/sh -c "echo -n $RANDOM"') % line('$')).'G'
|
||||
|
||||
function! <SID>StripTrailingWhitespaces()
|
||||
let _s=@/
|
||||
let l=line(".")
|
||||
let c=col(".")
|
||||
|
||||
%s/\s\+$//e
|
||||
|
||||
let @/=_s
|
||||
call cursor(l,c)
|
||||
endfunction
|
||||
|
||||
function! s:DiffWithSaved()
|
||||
let filetype=&ft
|
||||
diffthis
|
||||
vnew | r # | normal! 1Gdd
|
||||
diffthis
|
||||
execute "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
|
||||
endfunction
|
||||
command! DiffSaved call s:DiffWithSaved()
|
||||
|
||||
if has("autocmd")
|
||||
autocmd bufnewfile,bufread *.4th set filetype=forth
|
||||
autocmd bufnewfile,bufread *.asm set filetype=nasm
|
||||
autocmd bufnewfile,bufread *.c set keywordprg=man\ 3
|
||||
autocmd bufnewfile,bufread *.conf set filetype=conf
|
||||
autocmd bufnewfile,bufread *.fs :packadd vim-fsharp | set filetype=fsharp
|
||||
autocmd bufnewfile,bufread *.h set keywordprg=man\ 3
|
||||
autocmd bufnewfile,bufread *.md set filetype=markdown.pandoc | set nospell
|
||||
autocmd bufnewfile,bufread *.nix :packadd vim-nix | set filetype=nix
|
||||
autocmd bufnewfile,bufread *.rust :packadd rust-vim deoplete-rust
|
||||
autocmd bufnewfile,bufread *.tex :packadd vimtex | set filetype=tex
|
||||
autocmd bufnewfile,bufread *.ts :packadd vim-typescript
|
||||
autocmd bufnewfile,bufread *.journal :packadd vim-ledger | set filetype=ledger shiftwidth=4
|
||||
autocmd bufnewfile,bufread config set filetype=conf
|
||||
autocmd bufnewfile,bufread *.elm :packadd elm-vim | set filetype=elm shiftwidth=4
|
||||
autocmd filetype haskell set formatprg=hindent
|
||||
autocmd filetype python set formatprg=black
|
||||
autocmd filetype javascript *.js :packadd vim-javascript
|
||||
autocmd filetype make setlocal noexpandtab
|
||||
autocmd filetype markdown,text set formatoptions+=t
|
||||
autocmd filetype markdown,text set formatprg=par\ -w80
|
||||
autocmd filetype markdown,text set textwidth=80
|
||||
autocmd bufreadpost *
|
||||
\ if line("'\"") > 0 && line("'\"") <= line("$") |
|
||||
\ exe "normal! g`\"" |
|
||||
\ endif
|
||||
autocmd bufreadpre * setlocal foldmethod=indent
|
||||
autocmd bufwritepre * :call <SID>StripTrailingWhitespaces()
|
||||
autocmd bufwinenter * if &fdm == 'indent' | setlocal foldmethod=manual | endif
|
||||
endif
|
||||
|
||||
if exists("g:loaded_startify")
|
||||
let g:startify_custom_header = \'\'
|
||||
endif
|
||||
|
||||
"if exists("g:loaded_airline")
|
||||
set noshowmode laststatus=0 noruler
|
||||
let g:airline#extensions#tabline#close_symbol = 'X'
|
||||
let g:airline#extensions#tabline#enabled = 0
|
||||
"let g:airline#extensions#tabline#left_alt_sep = ''
|
||||
"let g:airline#extensions#tabline#left_sep = ''
|
||||
"let g:airline#extensions#tabline#right_alt_sep = ''
|
||||
"let g:airline#extensions#tabline#right_sep = ''
|
||||
let g:airline#extensions#tabline#show_close_button = 1
|
||||
let g:airline#extensions#tabline#show_tab_type = 0
|
||||
let g:airline#extensions#tabline#tab_min_count = 2
|
||||
let g:airline#extensions#tabline#tab_nr_type = 0
|
||||
let g:airline#extensions#tmuxline#enabled = 0
|
||||
"let g:airline#extensions#wordcount#enabled = 1
|
||||
"let g:airline_left_alt_sep = ''
|
||||
"let g:airline_left_sep = ''
|
||||
"let g:airline_right_alt_sep = ''
|
||||
"let g:airline_right_sep = ''
|
||||
let g:airline_section_z = '%{line(".")}/%{line("$")} %{col(".")}'
|
||||
"endif
|
||||
"if exists("g:loaded_airline_themes")
|
||||
let g:airline_theme='base16'
|
||||
"endif
|
||||
'';
|
||||
in {
|
||||
environment.variables.EDITOR = pkgs.lib.mkForce "nvim";
|
||||
environment.shellAliases.vi = "nvim";
|
||||
environment.shellAliases.view = "nvim -R";
|
||||
|
||||
programs.nano.nanorc = ''
|
||||
set autoindent
|
||||
set boldtext
|
||||
set morespace
|
||||
set smarthome
|
||||
set tabsize 4
|
||||
set tabstospaces
|
||||
'';
|
||||
|
||||
nixpkgs.config.packageOverrides = pkgs: {
|
||||
nvim = pkgs.neovim.override {
|
||||
configure = {
|
||||
customRC = vim_conf;
|
||||
packages.nvim = with pkgs.vimPlugins; {
|
||||
start = [
|
||||
ctrlp
|
||||
deoplete-nvim
|
||||
supertab
|
||||
syntastic
|
||||
tabular
|
||||
vim-airline vim-airline-themes
|
||||
vim-commentary
|
||||
vim-eunuch
|
||||
vim-fugitive
|
||||
vim-gitgutter
|
||||
vim-pandoc vim-pandoc-after vim-pandoc-syntax
|
||||
vim-repeat
|
||||
vim-sensible
|
||||
vim-startify
|
||||
vim-surround
|
||||
];
|
||||
opt = [
|
||||
elm-vim
|
||||
deoplete-rust
|
||||
idris-vim
|
||||
vimtex
|
||||
rust-vim
|
||||
typescript-vim
|
||||
vim-javascript
|
||||
vim-nix
|
||||
(pkgs.vimUtils.buildVimPluginFrom2Nix {
|
||||
name = "vim-ledger";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "ledger";
|
||||
repo = "vim-ledger";
|
||||
rev = "6eb3bb21aa979cc295d0480b2179938c12b33d0d";
|
||||
sha256 = "0rbwyaanvl2bqk8xm4kq8fkv8y92lpf9xx5n8gw54iij7xxhnj01";
|
||||
};
|
||||
})
|
||||
(pkgs.vimUtils.buildVimPluginFrom2Nix {
|
||||
name = "vim-fsharp";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "fsharp";
|
||||
repo = "vim-fsharp";
|
||||
rev = "627db7d701747e8fd7924b6505c61e16a369fb72";
|
||||
sha256 = "00hhgn2p54faysx1ddccyhl9jnvddgxsczhv0np3mgzza6ls4838";
|
||||
};
|
||||
})
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = [pkgs.nvim];
|
||||
}
|
||||
57
configs/base/networks.nix
Normal file
57
configs/base/networks.nix
Normal file
@@ -0,0 +1,57 @@
|
||||
{ pkgs, config, lib, ... }:
|
||||
let
|
||||
sshPort = 22022;
|
||||
sshKey = {
|
||||
homeros = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDn13Y6CznabMvKJPIrr/dj1TX4boe8F98yc3FDElJeprQo2RXlDzjg/po9/lHTHaoC5yQUjlRg/AnI4vizYkn2sqJebAeSPahmpS+l0eFnjZgsqds2cCFqSPB6Qc5YEkGRhN4aq/ABz0jdFJLBYOYGxuuXowYxyNrqrItxDR7tF7upG+kVjYiDoP/qFm8C7zv6Zy8aoehNbzf8HlIJd0ITbMr/vUftNsQ8C84QmbZljReHmchPgE8GUfVLTlCORkhndbvNX3jXo+75y7JOIZZ6193FZHM4seg/VSDWYLJtpnhttD1w6qmiLrlimqbJB9ihoXq2eDmQ+4zo6hxQ6pFH6P0xQClJ0hxVWn6hEM3rkMwoMfbq4v54gKJsYxcGdnwjAX6d9DQv/QVjmVZffKWsGGoC7uz7bdmc0akVKi+GLSPOx8sJwXqvyvFStfqLaweVcuikUqQ72JLK7pZyliA7na6KuQ1PE3LTpfSr0lbBJ73xtS2rU1nF/Oe5zwA4LX5s/QeDVmS86D8acUrSCO62pBB3Yv8go0KR4mEvfxLiUWV6gR2uTeIPXvo4ouYFZqyABAGybjUATlGCXJaeHd/y/VWkpIB8ocqNESlRMCEe4TrYjw91AEmYBL6kWIeop3dyhovm3dTB3fQvC97kbL16wuXBrOcN4lEc+56ShhmvdQ== kieran.meinhardt@gmail.com";
|
||||
scardanelli = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC19H0FhSNWcfBRPKzbTVSMJikIWZl0CoM8zCm+/3fdMgoaLRpeZWe/AfDK6b4qOjk/sez/J0JUFCGr+JbMwjsduoazsuQowu9L9DLP9Q5UkJje4BD7MHznaeu9/XfVng/MvyaEWArA/VUJeKQesHe76tR511/+n3+bdzlIh8Zw/3wfFxmg1OTNA99/vLkXrQzHDTuV/yj1pxykL4xFtN0OIssW1IKncJeKtkO/OHGT55ypz52Daj6bNKqvxiTuzeEhv5M+5ppyIPcRf1uj/7IaPKttCgZAntEqBTIR9MbyXFeAZVayzaFnLl2okeam5XreeZbj+Y1h2ZjxiIuWoab3MLndSekVfLtfa63gtcWIf8CIvZO2wJoH8v73y0U78JsfWVaTM09ZCfFlHHA/bWqZ6laAjW+mWLO/c77DcYkB3IBzaMVNfc6mfTcGFIC+biWeYpKgA0zC6rByUPbmbIoMueP9zqJwqUaM90Nwd6559inBB107/BK3Ktb3b+37mMCstetIPB9e4EFpGMjhmnL/G81jS53ACWLXJYzt7mKU/fEsiW93MtaB+Le46OEC18y/4G8F7p/nnH7i0kO74ukxbnc4PlpiM7iWT6ra2Cyy+nzEgdXCNXywIxr05TbCQDwX6/NY8k7Hokgdfyz+1Pq3sX0yCcWRPaoB26YF12KYFQ== kieran.meinhardt@gmail.com";
|
||||
};
|
||||
in {
|
||||
networking.hosts = lib.mapAttrs (_: value: [ (value + ".local") ]) {
|
||||
"192.168.178.1" = "router";
|
||||
"192.168.178.21" = "scardanelli";
|
||||
"192.168.178.22" = "homeros";
|
||||
"192.168.178.24" = "catullus";
|
||||
"192.168.178.27" = "printer";
|
||||
};
|
||||
|
||||
home-manager.users.kfm = {
|
||||
programs.ssh = {
|
||||
enable = true;
|
||||
matchBlocks = {
|
||||
catullus = {
|
||||
hostname = "catullus.local";
|
||||
user = "kfm";
|
||||
port = sshPort;
|
||||
};
|
||||
scardanelli = {
|
||||
hostname = "scardanelli.local";
|
||||
user = "kfm";
|
||||
port = sshPort;
|
||||
};
|
||||
homeros = {
|
||||
hostname = "homeros.local";
|
||||
user = "kfm";
|
||||
port = sshPort;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
programs.ssh = {
|
||||
startAgent = true;
|
||||
forwardX11 = true;
|
||||
};
|
||||
|
||||
services.openssh = {
|
||||
ports = [ sshPort ];
|
||||
enable = true;
|
||||
forwardX11 = true;
|
||||
passwordAuthentication = false;
|
||||
};
|
||||
|
||||
users.users.kfm.openssh.authorizedKeys.keys = [
|
||||
sshKey.homeros
|
||||
sshKey.scardanelli
|
||||
];
|
||||
|
||||
}
|
||||
501
configs/base/scripts.nix
Normal file
501
configs/base/scripts.nix
Normal file
@@ -0,0 +1,501 @@
|
||||
{ pkgs, lib, ... }:
|
||||
let
|
||||
theme = import ../../theme.nix;
|
||||
unstable = import <nixos-unstable> {};
|
||||
bingWallpaper = unstable.writers.writeBash "bing-wallpaper.sh" ''
|
||||
PICTURE_DIR="$HOME/pictures/external/bing/"
|
||||
|
||||
mkdir -p $PICTURE_DIR
|
||||
|
||||
urls=( $(${pkgs.curl}/bin/curl -s http://www.bing.com \
|
||||
| grep -Eo "url:'.*?'" \
|
||||
| sed -e "s/url:'\([^']*\)'.*/http:\/\/bing.com\1/" \
|
||||
| sed -e "s/\\\//g") )
|
||||
|
||||
for p in ''${urls[@]}; do
|
||||
filename=$(echo $p | sed -e "s/.*\/\(.*\)/\1/")
|
||||
if [ ! -f $PICTURE_DIR/$filename ]; then
|
||||
${pkgs.curl}/bin/curl -Lo "$PICTURE_DIR/$filename" $p
|
||||
fi
|
||||
done
|
||||
'';
|
||||
scripts.easy-backup = unstable.writers.writeDash "easy-backup" ''
|
||||
if [ -d "$1" ]; then
|
||||
OUTPUT_ROOT=''${1}/backup/current
|
||||
rsync -hav --delete --stats --progress --exclude-from=$HOME/bin/backup.exclude $HOME/* $OUTPUT_ROOT/
|
||||
else
|
||||
echo "No backup directory supplied"
|
||||
exit 1
|
||||
fi
|
||||
'';
|
||||
scripts.pull-all = unstable.writers.writeDashBin "pull-all" ''
|
||||
# store the current dir
|
||||
CUR_DIR=$(pwd)
|
||||
# Let the person running the script know what's going on.
|
||||
echo -e "\n\033[1mPulling in latest changes for all repositories...\033[0m\n"
|
||||
# Find all git repositories and update it to the master latest revision
|
||||
for i in $(find . -name ".git" | cut -c 3-); do
|
||||
echo "";
|
||||
echo -e "\033[33m"+$i+"\033[0m";
|
||||
# We have to go to the .git parent directory to call the pull command
|
||||
cd "$i";
|
||||
cd ..;
|
||||
# finally pull
|
||||
git pull origin master;
|
||||
# lets get back to the CUR_DIR
|
||||
cd $CUR_DIR
|
||||
done
|
||||
echo -e "\n\033[32mComplete!\033[0m\n"
|
||||
'';
|
||||
scripts.sp = unstable.writers.writeBashBin "sp" ''
|
||||
# This is sp, the command-line Spotify controller. It talks to a running
|
||||
# instance of the Spotify Linux client over dbus, providing an interface not
|
||||
# unlike mpc.
|
||||
#
|
||||
# Put differently, it allows you to control Spotify without leaving the comfort
|
||||
# of your command line, and without a custom client or Premium subscription.
|
||||
#
|
||||
# As an added bonus, it also works with ssh, at and cron.
|
||||
#
|
||||
# Example:
|
||||
# $ sp weather girls raining men
|
||||
# $ sp current
|
||||
# Album 100 Hits Of The '80s
|
||||
# Artist The Weather Girls
|
||||
# Title It's Raining Men
|
||||
# $ sp pause
|
||||
#
|
||||
# Alarm clock example:
|
||||
# $ at 7:45 <<< 'sp bangarang'
|
||||
#
|
||||
# Remote example:
|
||||
# $ ssh vader@prod02.nomoon.ta 'sp imperial march'
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2013 Wander Nauta
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software, to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the following
|
||||
# conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# The software is provided "as is", without warranty of any kind, express or
|
||||
# implied, including but not limited to the warranties of merchantability,
|
||||
# fitness for a particular purpose and noninfringement. In no event shall the
|
||||
# authors or copyright holders be liable for any claim, damages or other
|
||||
# liability, whether in an action of contract, tort or otherwise, arising from,
|
||||
# out of or in connection with the software or the use or other dealings in the
|
||||
# software.
|
||||
#
|
||||
|
||||
# CONSTANTS
|
||||
|
||||
SP_VERSION="0.1"
|
||||
SP_DEST="org.mpris.MediaPlayer2.spotify"
|
||||
SP_PATH="/org/mpris/MediaPlayer2"
|
||||
SP_MEMB="org.mpris.MediaPlayer2.Player"
|
||||
|
||||
# SHELL OPTIONS
|
||||
|
||||
shopt -s expand_aliases
|
||||
|
||||
# UTILITY FUNCTIONS
|
||||
|
||||
function require {
|
||||
hash $1 2>/dev/null || {
|
||||
echo >&2 "Error: '$1' is required, but was not found."; exit 1;
|
||||
}
|
||||
}
|
||||
|
||||
# COMMON REQUIRED BINARIES
|
||||
|
||||
# We need dbus-send to talk to Spotify.
|
||||
require dbus-send
|
||||
|
||||
# Assert standard Unix utilities are available.
|
||||
require grep
|
||||
require sed
|
||||
require cut
|
||||
require tr
|
||||
|
||||
# 'SPECIAL' (NON-DBUS-ALIAS) COMMANDS
|
||||
|
||||
function sp-dbus {
|
||||
# Sends the given method to Spotify over dbus.
|
||||
dbus-send --print-reply --dest=$SP_DEST $SP_PATH $SP_MEMB.$1 ''${*:2} > /dev/null
|
||||
}
|
||||
|
||||
function sp-open {
|
||||
# Opens the given spotify: URI in Spotify.
|
||||
sp-dbus OpenUri string:$1
|
||||
}
|
||||
|
||||
function sp-metadata {
|
||||
# Prints the currently playing track in a parseable format.
|
||||
|
||||
dbus-send \
|
||||
--print-reply `# We need the reply.` \
|
||||
--dest=$SP_DEST \
|
||||
$SP_PATH \
|
||||
org.freedesktop.DBus.Properties.Get \
|
||||
string:"$SP_MEMB" string:'Metadata' \
|
||||
| grep -Ev "^method" `# Ignore the first line.` \
|
||||
| grep -Eo '("(.*)")|(\b[0-9][a-zA-Z0-9.]*\b)' `# Filter interesting fiels.`\
|
||||
| sed -E '2~2 a|' `# Mark odd fields.` \
|
||||
| tr -d '\n' `# Remove all newlines.` \
|
||||
| sed -E 's/\|/\n/g' `# Restore newlines.` \
|
||||
| sed -E 's/(xesam:)|(mpris:)//' `# Remove ns prefixes.` \
|
||||
| sed -E 's/^"//' `# Strip leading...` \
|
||||
| sed -E 's/"$//' `# ...and trailing quotes.` \
|
||||
| sed -E 's/"+/|/' `# Regard "" as seperator.` \
|
||||
| sed -E 's/ +/ /g' `# Merge consecutive spaces.`
|
||||
}
|
||||
|
||||
function sp-current {
|
||||
# Prints the currently playing track in a friendly format.
|
||||
require column
|
||||
|
||||
sp-metadata \
|
||||
| grep --color=never -E "(title)|(album)|(artist)" \
|
||||
| sed 's/^\(.\)/\U\1/' \
|
||||
| column -t -s'|'
|
||||
}
|
||||
|
||||
function sp-eval {
|
||||
# Prints the currently playing track as shell variables, ready to be eval'ed
|
||||
require sort
|
||||
|
||||
sp-metadata \
|
||||
| grep --color=never -E "(title)|(album)|(artist)|(trackid)|(trackNumber)" \
|
||||
| sort -r \
|
||||
| sed 's/^\([^|]*\)\|/\U\1/' \
|
||||
| sed -E 's/\|/="/' \
|
||||
| sed -E 's/$/"/' \
|
||||
| sed -E 's/^/SPOTIFY_/'
|
||||
}
|
||||
|
||||
function sp-art {
|
||||
# Prints the artUrl.
|
||||
|
||||
sp-metadata | grep "artUrl" | cut -d'|' -f2
|
||||
}
|
||||
|
||||
function sp-display {
|
||||
# Calls display on the artUrl.
|
||||
|
||||
require display
|
||||
display $(sp-art)
|
||||
}
|
||||
|
||||
function sp-feh {
|
||||
# Calls feh on the artURl.
|
||||
|
||||
require feh
|
||||
feh $(sp-art)
|
||||
}
|
||||
|
||||
function sp-url {
|
||||
# Prints the HTTP url.
|
||||
|
||||
TRACK=$(sp-metadata | grep "url" | cut -d'|' -f2 | cut -d':' -f3)
|
||||
echo "http://open.spotify.com/track/$TRACK"
|
||||
}
|
||||
|
||||
function sp-clip {
|
||||
# Copies the HTTP url.
|
||||
|
||||
require xclip
|
||||
sp-url | xclip
|
||||
}
|
||||
|
||||
function sp-http {
|
||||
# xdg-opens the HTTP url.
|
||||
|
||||
require xdg-open
|
||||
xdg-open $(sp-url)
|
||||
}
|
||||
|
||||
function sp-help {
|
||||
# Prints usage information.
|
||||
|
||||
echo "Usage: sp [command]"
|
||||
echo "Control a running Spotify instance from the command line."
|
||||
echo ""
|
||||
echo " sp play - Play/pause Spotify"
|
||||
echo " sp pause - Pause Spotify"
|
||||
echo " sp next - Go to next track"
|
||||
echo " sp prev - Go to previous track"
|
||||
echo ""
|
||||
echo " sp current - Format the currently playing track"
|
||||
echo " sp metadata - Dump the current track's metadata"
|
||||
echo " sp eval - Return the metadata as a shell script"
|
||||
echo ""
|
||||
echo " sp art - Print the URL to the current track's album artwork"
|
||||
echo " sp display - Display the current album artwork with \`display\`"
|
||||
echo " sp feh - Display the current album artwork with \`feh\`"
|
||||
echo ""
|
||||
echo " sp url - Print the HTTP URL for the currently playing track"
|
||||
echo " sp clip - Copy the HTTP URL to the X clipboard"
|
||||
echo " sp http - Open the HTTP URL in a web browser"
|
||||
echo ""
|
||||
echo " sp open <uri> - Open a spotify: uri"
|
||||
echo " sp search <q> - Start playing the best search result for the given query"
|
||||
echo ""
|
||||
echo " sp version - Show version information"
|
||||
echo " sp help - Show this information"
|
||||
echo ""
|
||||
echo "Any other argument will start a search (i.e. 'sp foo' will search for foo)."
|
||||
}
|
||||
|
||||
function sp-search {
|
||||
# Searches for tracks, plays the first result.
|
||||
|
||||
require curl
|
||||
|
||||
Q="$@"
|
||||
SPTFY_URI=$( \
|
||||
curl -s -G --data-urlencode "q=$Q" ws.spotify.com/search/1/track \
|
||||
| grep -E -o "spotify:track:[a-zA-Z0-9]+" -m 1 \
|
||||
)
|
||||
|
||||
sp-open $SPTFY_URI
|
||||
}
|
||||
|
||||
function sp-version {
|
||||
# Prints version information.
|
||||
|
||||
echo "sp $SP_VERSION"
|
||||
echo "Copyright (C) 2013 Wander Nauta"
|
||||
echo "License MIT"
|
||||
}
|
||||
|
||||
# 'SIMPLE' (DBUS-ALIAS) COMMANDS
|
||||
|
||||
alias sp-play=" sp-dbus PlayPause"
|
||||
alias sp-pause=" sp-dbus Pause"
|
||||
alias sp-next=" sp-dbus Next"
|
||||
alias sp-prev=" sp-dbus Previous"
|
||||
|
||||
# DISPATCHER
|
||||
|
||||
# First, we connect to the dbus session spotify is on. This isn't really needed
|
||||
# when running locally, but is crucial when we don't have an X display handy
|
||||
# (for instance, when running sp over ssh.)
|
||||
|
||||
SPOTIFY_PID="$(pidof -s spotify)"
|
||||
|
||||
if [[ -z "$SPOTIFY_PID" ]]; then
|
||||
echo "Error: Spotify is not running."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
QUERY_ENVIRON="$(cat /proc/''${SPOTIFY_PID}/environ | tr '\0' '\n' | grep "DBUS_SESSION_BUS_ADDRESS" | cut -d "=" -f 2-)"
|
||||
if [[ "''${QUERY_ENVIRON}" != "" ]]; then
|
||||
export DBUS_SESSION_BUS_ADDRESS="''${QUERY_ENVIRON}"
|
||||
fi
|
||||
|
||||
# Then we dispatch the command.
|
||||
|
||||
subcommand="$1"
|
||||
|
||||
if [[ -z "$subcommand" ]]; then
|
||||
# No arguments given, print help.
|
||||
sp-help
|
||||
else
|
||||
# Arguments given, check if it's a command.
|
||||
if $(type sp-$subcommand > /dev/null 2> /dev/null); then
|
||||
# It is. Run it.
|
||||
shift
|
||||
eval "sp-$subcommand $@"
|
||||
else
|
||||
# It's not. Try a search.
|
||||
eval "sp-search $@"
|
||||
fi
|
||||
fi
|
||||
'';
|
||||
spotifyGenius = unstable.writers.writeDashBin "spgenius.sh" ''
|
||||
function normalise {
|
||||
echo "$1" | tr ' ' -
|
||||
}
|
||||
eval $(${scripts.sp} eval)
|
||||
${pkgs.xdg_utils}/bin/xdg-open "http://genius.com/$(normalise "$SPOTIFY_ARTIST")-$(normalise "$SPOTIFY_TITLE")-lyrics"
|
||||
'';
|
||||
scripts.genius = unstable.writers.writeDashBin "genius" ''
|
||||
test $# -eq 2 || (
|
||||
echo "usage: $0 <artist> <song>"
|
||||
exit 1
|
||||
)
|
||||
|
||||
normalize() {
|
||||
tr -d -c '0-9A-Za-z ' | tr ' ' - | tr '[:upper:]' '[:lower:]'
|
||||
}
|
||||
|
||||
ARTIST=$(echo "$1" | normalize | ${pkgs.gnused}/bin/sed 's/./\U&/')
|
||||
TITLE=$(echo "$2" | normalize)
|
||||
GENIUS_URL="https://genius.com/$ARTIST-$TITLE-lyrics"
|
||||
|
||||
${pkgs.curl}/bin/curl -s "$GENIUS_URL" \
|
||||
| ${pkgs.gnused}/bin/sed -ne '/class="lyrics"/,/<\/p>/p' \
|
||||
| ${pkgs.pandoc}/bin/pandoc -f html -s -t plain \
|
||||
| ${pkgs.gnused}/bin/sed 's/^_/\x1b[3m/g;s/_$/\x1b[0m/g;s/^\[/\n\x1b\[1m\[/g;s/\]$/\]\x1b[0m/g'
|
||||
|
||||
printf "\n(source: $GENIUS_URL)\n" >/dev/stderr
|
||||
'';
|
||||
scripts.generate-shell-nix =
|
||||
let generateShellNixPath = pkgs.fetchurl {
|
||||
url = "https://raw.githubusercontent.com/kmein/generate-shell-nix/81f77661705ee628d1566f2dea01f2d731fda79d/generate-shell-nix";
|
||||
sha256 = "0r661z9s5zw0gas2f73aakplfblj1jjlbijmm7gf513xkq61jxm8";
|
||||
executable = true;
|
||||
};
|
||||
in unstable.writers.writeDashBin "generate-shell-nix" ''${generateShellNixPath} $*'';
|
||||
scripts.dic =
|
||||
let dicPath = pkgs.fetchurl {
|
||||
url = "https://cgit.krebsco.de/dic/plain/dic?id=beeca40313f68874e05568f4041423c16202e9da";
|
||||
sha256 = "1d25pm420fnbrr273i96syrcd8jkh8qnflpfgxlsbzmbmfizfzld";
|
||||
executable = true;
|
||||
};
|
||||
in unstable.writers.writeDashBin "dic" ''${dicPath} $*'';
|
||||
scripts.font-size = unstable.writers.writeDashBin "font-size" ''
|
||||
set -efu
|
||||
|
||||
# set_font NORMAL_FONT BOLD_FONT
|
||||
set_font() {
|
||||
printf '\033]710;%s\007' "$1"
|
||||
printf '\033]711;%s\007' "$2"
|
||||
}
|
||||
|
||||
case ''${1-} in
|
||||
'''|0|--reset)
|
||||
set_font \
|
||||
"xft:${theme.terminalFont.name}:size=${toString theme.terminalFont.size}" \
|
||||
"xft:${theme.terminalFont.name}:size=${toString theme.terminalFont.size}:bold" \
|
||||
;;
|
||||
[2-9]|[1-9][0-9]|[1-9][0-9][0-9])
|
||||
set_font \
|
||||
"xft:${theme.terminalFont.name}:size=$1" \
|
||||
"xft:${theme.terminalFont.name}:size=$1:bold" \
|
||||
;;
|
||||
*)
|
||||
echo "$0: bad argument: $1" >&2
|
||||
exit 1
|
||||
esac
|
||||
'';
|
||||
scripts.wttr = unstable.writers.writeDashBin "wttr" ''
|
||||
${pkgs.curl}/bin/curl -s -H "Accept-Language: ''${LANG%_*}" --compressed "wttr.in/''${1-$(${pkgs.curl}/bin/curl -s ipinfo.io | ${pkgs.jq}/bin/jq .loc)}?0"
|
||||
'';
|
||||
scripts.nix-git = unstable.writers.writeDashBin "nix-git" ''
|
||||
${pkgs.nix-prefetch-git}/bin/nix-prefetch-git "$@" 2> /dev/null | ${pkgs.jq}/bin/jq -r '"rev = \"\(.rev)\";\nsha256 = \"\(.sha256)\";"'
|
||||
'';
|
||||
scripts.q =
|
||||
let
|
||||
q-performance = ''
|
||||
show_load() {
|
||||
${pkgs.coreutils}/bin/cat /proc/loadavg | ${pkgs.gawk}/bin/gawk '{ print $1, $2, $3}'
|
||||
}
|
||||
|
||||
show_memory() {
|
||||
${pkgs.procps}/bin/free -h | ${pkgs.gnugrep}/bin/grep "Mem" | ${pkgs.gawk}/bin/gawk '{print $3}'
|
||||
}
|
||||
|
||||
printf "\x1b[33m%s \x1b[1m%s\x1b[0m\n" "$(show_load)" "$(show_memory)"
|
||||
'';
|
||||
q-isodate = ''
|
||||
${pkgs.coreutils}/bin/date '+[1m%Y-%m-%d[0m [35m%H:%M[0m:%S%:z'
|
||||
'';
|
||||
q-volume = ''
|
||||
is_mute() {
|
||||
if $(${pkgs.pamixer}/bin/pamixer --get-mute); then
|
||||
echo "(Mute)"
|
||||
else
|
||||
echo
|
||||
fi
|
||||
}
|
||||
|
||||
current_volume() {
|
||||
${pkgs.pamixer}/bin/pamixer --get-volume
|
||||
}
|
||||
|
||||
printf "\x1b[36m%d%%\x1b[0m %s\n" "$(current_volume)" "$(is_mute)"
|
||||
'';
|
||||
q-online = ''
|
||||
if ${pkgs.curl}/bin/curl -s google.com >/dev/null; then
|
||||
echo '[32;1monline[0m'
|
||||
else
|
||||
echo '[31;1moffline[0m'
|
||||
fi
|
||||
'';
|
||||
q-battery = ''
|
||||
BAT_DIR="/sys/class/power_supply/BAT1/"
|
||||
if test ! -d "$BAT_DIR"; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -e "$BAT_DIR/charge_now" -a -e "$BAT_DIR/charge_full"; then
|
||||
FULL_CHARGE="$BAT_DIR/charge_full"
|
||||
CURR_CHARGE="$BAT_DIR/charge_now"
|
||||
elif test -e "$BAT_DIR/energy_now" -a -e "$BAT_DIR/energy_full"; then
|
||||
FULL_CHARGE="$BAT_DIR/energy_full"
|
||||
CURR_CHARGE="$BAT_DIR/energy_now"
|
||||
else
|
||||
ls >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
STATUS="$BAT_DIR/status"
|
||||
|
||||
charge_d=$((100 * $(${pkgs.coreutils}/bin/cat $CURR_CHARGE) / $(${pkgs.coreutils}/bin/cat $FULL_CHARGE)))
|
||||
if [[ "$charge_d" -lt 10 ]]; then
|
||||
printf "\x1b[31m"
|
||||
elif [[ "$charge_d" -lt 20 ]]; then
|
||||
printf "\x1b[33m"
|
||||
else
|
||||
printf "\x1b[32m"
|
||||
fi
|
||||
|
||||
printf '%s%%\x1b[0m (%s)\n' "$charge_d" $(${pkgs.coreutils}/bin/cat "$STATUS")
|
||||
'';
|
||||
q-todo = ''
|
||||
TODO_file=$PWD/.todo
|
||||
if test -e "$TODO_file"; then
|
||||
printf "\n\x1b[1mTodo\x1b[0m\n"
|
||||
${pkgs.coreutils}/bin/cat "$TODO_file" \
|
||||
| ${pkgs.gawk}/bin/gawk -v now=$(${pkgs.coreutils}/bin/date +%s) '
|
||||
BEGIN { print "remind=0" }
|
||||
/^[0-9]/{
|
||||
x = $1
|
||||
gsub(".", "\\\\&", x)
|
||||
rest = substr($0, index($0, " "))
|
||||
rest = $0
|
||||
sub(" *", "", rest)
|
||||
gsub(".", "\\\\&", rest)
|
||||
print "test $(${pkgs.coreutils}/bin/date +%s -d"x") -lt "now" && \
|
||||
echo \"\x1b[93m\""rest esc "\"\x1b[m\" && \
|
||||
(( remind++ ))"
|
||||
}
|
||||
END { print "test $remind = 0 && echo \"nothing to remind\"" }
|
||||
' \
|
||||
| {
|
||||
# bash needed for (( ... ))
|
||||
${pkgs.bash}/bin/bash
|
||||
}
|
||||
fi
|
||||
'';
|
||||
in unstable.writers.writeBashBin "q" ''
|
||||
set -eu
|
||||
export PATH=/var/empty
|
||||
${q-isodate}
|
||||
${q-performance}
|
||||
(${q-volume}) &
|
||||
(${q-battery}) &
|
||||
(${q-online}) &
|
||||
wait
|
||||
${q-todo}
|
||||
'';
|
||||
in {
|
||||
users.users.kfm.packages = lib.attrsets.attrValues scripts;
|
||||
}
|
||||
61
configs/base/shells.nix
Normal file
61
configs/base/shells.nix
Normal file
@@ -0,0 +1,61 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
environment.shellAliases =
|
||||
let rlwrap = cmd: "${pkgs.rlwrap}/bin/rlwrap ${cmd}";
|
||||
in {
|
||||
o = "${pkgs.xdg_utils}/bin/xdg-open";
|
||||
ns = "nix-shell --command zsh";
|
||||
":r" = ''echo "You stupid!"'';
|
||||
clipboard = "${pkgs.xclip}/bin/xclip -se c";
|
||||
ip = "${pkgs.iproute}/bin/ip -c";
|
||||
ocaml = rlwrap "${pkgs.ocaml}/bin/ocaml";
|
||||
tmux = "${pkgs.tmux}/bin/tmux -2";
|
||||
nixi = ''nix repl "<nixpkgs>"'';
|
||||
};
|
||||
|
||||
environment.interactiveShellInit = "export PATH=$PATH:$HOME/.local/bin:$HOME/.cargo/bin";
|
||||
|
||||
programs.zsh = {
|
||||
enable = true;
|
||||
enableCompletion = true;
|
||||
autosuggestions.enable = true;
|
||||
syntaxHighlighting.enable = true;
|
||||
syntaxHighlighting.highlighters = [ "main" "brackets" "pattern" "cursor" "root" "line" ];
|
||||
interactiveShellInit = ''
|
||||
setopt INTERACTIVE_COMMENTS
|
||||
setopt MULTIOS
|
||||
setopt CORRECT
|
||||
setopt AUTO_NAME_DIRS
|
||||
setopt PUSHD_MINUS PUSHD_TO_HOME AUTO_PUSHD
|
||||
export KEYTIMEOUT=1
|
||||
bindkey -v
|
||||
bindkey '^w' backward-kill-word
|
||||
bindkey '^r' history-incremental-search-backward
|
||||
'';
|
||||
promptInit = ''
|
||||
PROMPT=$'%{\e[1m%}%~%{\e[0m%}'
|
||||
PROMPT="$PROMPT \$([[ \$? == 0 ]] && echo \"%{$fg_bold[green]%}\" || echo \"%{$fg_bold[red]%}\")\$(test $IN_NIX_SHELL && echo λ || echo %#)%{$reset_color%} "
|
||||
RPROMPT='$(git_prompt_info) $(date +%H:%M)'
|
||||
ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[cyan]%}"
|
||||
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}*"
|
||||
'';
|
||||
ohMyZsh.enable = true;
|
||||
ohMyZsh.plugins = [ "common-aliases" ];
|
||||
};
|
||||
|
||||
programs.bash = {
|
||||
promptInit = ''PS1="$(tput bold)\w \$([[ \$? == 0 ]] && echo \"\[\033[1;32m\]\" || echo \"\[\033[1;31m\]\")\$$(tput sgr0) "'';
|
||||
interactiveShellInit = ''
|
||||
set -o vi
|
||||
'';
|
||||
enableCompletion = true;
|
||||
};
|
||||
|
||||
programs.tmux = {
|
||||
enable = true;
|
||||
extraTmuxConf = import ../../dot/tmux.nix;
|
||||
keyMode = "vi";
|
||||
terminal = "screen-256color";
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user