about summary refs log tree commit diff
path: root/configs/shared/.config
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/.config')
-rw-r--r--configs/shared/.config/compton.conf33
-rw-r--r--configs/shared/.config/fish/config.fish319
-rw-r--r--configs/shared/.config/lf/lfrc163
-rw-r--r--configs/shared/.config/lf/marks6
-rw-r--r--configs/shared/.config/mpd/databasebin0 -> 247 bytes
-rw-r--r--configs/shared/.config/mpd/mpd.conf4
-rw-r--r--configs/shared/.config/nixpkgs/config.nix3
-rw-r--r--configs/shared/.config/nvim/init.vim668
-rw-r--r--configs/shared/.config/nvim/simple.vim98
-rw-r--r--configs/shared/.config/nvim/templates/boilerplate.c6
-rw-r--r--configs/shared/.config/nvim/templates/boilerplate.rs5
-rw-r--r--configs/shared/.config/rofi/config6
-rw-r--r--configs/shared/.config/rofi/config.bak6
-rw-r--r--configs/shared/.config/systemd/user/clipmenud.service18
l---------configs/shared/.config/systemd/user/default.target.wants/clipmenud.service1
-rw-r--r--configs/shared/.config/terminator/config15
-rw-r--r--configs/shared/.config/terminator/config.bak23
-rw-r--r--configs/shared/.config/terminator/plugins/terminator-themes.py250
18 files changed, 1624 insertions, 0 deletions
diff --git a/configs/shared/.config/compton.conf b/configs/shared/.config/compton.conf
new file mode 100644
index 000000000000..a6b5f637e60a
--- /dev/null
+++ b/configs/shared/.config/compton.conf
@@ -0,0 +1,33 @@
+# shadow
+shadow = false;
+shadow-radius = 7;
+shadow-offset-x = -7;
+shadow-offset-y = -7;
+
+# TODO: Remove active opacity
+
+# opacity
+menu-opacity = 0.8;
+inactive-opacity = 0.96;
+active-opacity = 0.96;
+
+# transitions
+fading = true;
+fade-in-step = 0.07;
+fade-out-step = 0.07;
+
+# lock screen
+# NOTE: Need this rule here because I set XSECURELOCK_NO_COMPOSITE=1 in
+# ~/.profile. Without this, the lock screen will adopt the opacity settings
+# above, which is a security risk if you lock your screen while it has sensitive
+# content on it.
+#
+# NOTE: For some reason, `100:class_g` doesn't work, so settling for
+# `99:class_g` instead.
+opacity-rule = [
+  "99:class_g = 'xsecurelock'",
+  # TODO: Ensure this works.
+  "80:class_g = 'terminator'",
+  # TODO: Ensure this work.
+  "80:class_g = 'Google Emacs'"
+];
diff --git a/configs/shared/.config/fish/config.fish b/configs/shared/.config/fish/config.fish
new file mode 100644
index 000000000000..754470618c1f
--- /dev/null
+++ b/configs/shared/.config/fish/config.fish
@@ -0,0 +1,319 @@
+# While I work use a variety of programs, below of some of my more commonly used
+# programs that I have decided to support with aliases. # Applications
+#   java:       jv
+#   tmux:       t
+#   $EDITOR:    e
+#   vim:        v
+#   GnuPG:      gpg
+#   blaze:      bz
+#   borgcfg:    br
+#   piper:      pi
+#   pass:       ps
+#   pastebin:   pb
+#   pacman:     pm
+#   codesearch: cs
+#   git:        g
+#   mercurial:  hg
+#   aptitude:   apt
+#   chrome:     c
+#   elixir:     ex
+#   haskell:    hk
+#   wifi:       wf
+#   piper:      pp
+#   g4:         pp
+#   g4d:        pp
+#   cci:        circleci
+#
+# Below are some common modifiers or flags that programs support.
+# Supported qualifiers:
+#   hidden:      h
+#   ignore-case: i
+#
+# I've found that much of my time is spent working with programs that support
+# some many of the following actions.
+# Supported verbs:
+#   source:  s
+#   install: i
+#   test:    t
+#   build:   b
+#   list:    ls
+#   shell:   REPL
+#
+# Commentary:
+# Ideally a file like this would be either unnecessary in the case of a fully
+# embraced Emacs workflow or compiled from some high-level language like
+# Elisp.
+#
+# Most of this was ported from my aliases.zsh file, which I accumulated over a
+# two to three year period. If some of the fish code herein is not idiomatic, it
+# is most likely because I'm new to the ecosystem.
+
+# TODO: Decide if I prefer `abbr` or `alias` for fish. `abbr` is a new concept
+# for me.
+
+# Remove the default greeting from fish
+set fish_greeting ""
+
+# Prompt
+function fish_prompt
+    set -l color_cwd
+    set -l suffix
+    switch "$USER"
+        case root toor
+            if set -q fish_color_cwd_root
+                set color_cwd $fish_color_cwd_root
+            else
+                set color_cwd $fish_color_cwd
+            end
+            set suffix '#'
+        case '*'
+            set color_cwd $fish_color_cwd
+            set suffix '>'
+    end
+
+    echo -n -s "$USER" @ (prompt_hostname) ' ' (set_color $color_cwd) (pwd) (set_color normal)
+    echo -e "\n$suffix "
+end
+
+function nix-eval --description 'Evaluate Nix expression from file, $1.'
+    # Notice the empty string at the end of the invocation here. This is
+    # intentional. For more information, see this issue:
+    # https://github.com/NixOS/nix/issues/2078
+    nix eval --file $argv[1] ""
+end
+
+# Setup fzf for fuzzily finding commands, files, directories
+source (fzf-share)/key-bindings.fish && fzf_key_bindings
+
+eval (direnv hook fish)
+
+# Miscellaneous
+abbr --add c xclip -selection clipboard -i
+abbr --add p xclip -selection clipboard -o
+# TODO: Depend on `cp_dwim`.
+abbr --add cp cp_dwim
+abbr --add lorem echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+abbr --add e emacsclient
+
+abbr --add cat bat --theme=TwoDark
+# TODO: Support this once `fasd` works.
+# abbr --add j fasd_cd -d # Use j to emulate autojump; my muscle memory is hardened here
+abbr --add vim nvim
+
+# TODO: Support `blutetoothctl` with Nix.
+abbr --add btctl bluetoothctl
+
+abbr --add rg rg --ignore-case
+abbr --add rgh rg --hidden # By default, rg skips hidden files
+abbr --add fdh fd --hidden # By default, rg skips hidden files
+abbr --add define sdcv # uses stardict to lookup a word
+abbr --add intellij nohup /opt/intellij-ce-stable/bin/idea.sh >/dev/null 2>&1 &
+abbr --add tpr tput reset
+abbr --add nordvpn sudo openvpn /etc/openvpn/ovpn_tcp/us3559.nordvpn.com.tcp.ovpn # connects to the nordvpn servers in USA
+abbr --add perms ls -ld # list the permissions of a directory
+abbr --add rmrf rm -rf # sometimes the space and dash are too much...
+abbr --add open xdg-open
+abbr --add o open
+abbr --add stopx sudo service lightdm stop # stop X server session
+abbr --add please 'eval sudo $history[1]'
+abbr --add plz please
+
+# TODO: Package this with Nix.
+abbr --add simple_vim vim -u ~/.config/nvim/simple.vim
+
+# Filesystem
+# TODO: Depend on `mkdir_cd`.
+abbr --add mdd mkdir_cd
+abbr --add mdp mkdir --parents
+abbr --add ls exa --sort=type
+abbr --add ll exa --long --sort=type
+abbr --add la exa --long --all --sort=type
+
+# TODO: Depend on these functions once they're defined.
+abbr --add files laf
+abbr --add dirs  lad
+abbr --add links lal
+
+# Device and power management
+abbr --add off       shutdown now
+abbr --add suspend   systemctl suspend
+abbr --add hibernate systemctl hibernate
+
+abbr --add pscp pass show --clip
+
+# TODO: Debug `Error: No interface specified.`.
+abbr --add wfls nmcli device wifi
+abbr --add wfls nmcli device connect
+
+# Tmux
+abbr --add tls tmux list-sessions
+abbr --add ta  tmux attach
+abbr --add td  tmux detach
+
+# Chrome
+abbr --add chrome google-chrome
+abbr --add cssh   chrome --app-id=pnhechapfaindjhompbnflcldabbghjo # Secure Shell
+abbr --add crd    chrome --app-id=gbchcmhmhahfdphkhkmpfmihenigjmpp # Chrome Remote Desktop
+
+# Dropbox
+abbr --add drst dropbox.py status
+
+# Docker
+abbr --add dk    docker
+abbr --add dkps  docker ps
+abbr --add dkpsa docker ps -a
+abbr --add dkrm  docker rm
+abbr --add dkrmi docker rmi
+abbr --add dkrd  docker run -d
+abbr --add dki   docker images
+
+# Java
+# TODO: Consider packaging this idea with Nix instead
+abbr --add jvsh env CLASSPATH=(fd '\\.jar$' ~/Dropbox/programming/jars | tr \\n :) jshell
+
+# Elixir
+abbr --add m mix
+abbr --add mc mix compile
+abbr --add mcf mix compile --force
+abbr --add ism iex -S mix
+abbr --add tism MIX_ENV=test iex -S mix
+abbr --add mdg mix deps.get
+abbr --add mdu mix deps.update
+abbr --add mdup mix docker.up
+# TODO: Support `repl_ex` and company as Nix-built programs.
+abbr --add repl_ex dkish elixir iex
+
+# Clojure
+abbr --add cljsh dkish clojure lein repl
+
+# GPG
+abbr --add gpged gpg --edit-key wpcarro@gmail.com
+abbr --add gpge  gpg --encrypt
+abbr --add gpgd  gpg --decrypt
+abbr --add gpgls gpg --list-keys
+
+# Git
+abbr --add glp   git log --graph --pretty='format:"%Cred%h%Creset -%Cblue %an %Creset - %C(yellow)%d%Creset %s %Cgreen(%cr)%Creset" --abbrev-commit --date=relative'
+abbr --add g     hub
+abbr --add git   hub
+abbr --add ga    git add
+abbr --add gc    git commit
+abbr --add gco   git checkout
+abbr --add gd    git diff
+abbr --add gp    git push
+abbr --add grbi  git rebase --interactive
+abbr --add grba  git rebase --abort
+abbr --add grbc  git rebase --continue
+abbr --add gprom git pull --rebase origin master
+abbr --add gca   git commit --amend
+abbr --add gcan  git commit --amend --no-edit
+abbr --add gpf   git push --force
+abbr --add gpff  git push --force --no-verify
+abbr --add gds   git diff --staged
+abbr --add gfx   git commit --fixup
+abbr --add gsh   git show
+abbr --add gwip  'git add . && git commit -m wip'
+abbr --add gpr   git pull-request
+abbr --add gst   'git status && hub pr list'
+
+# Mercurial
+# The attempt here is to map my well-known, existing `git` aliases to their
+# Mercurial counterparts. Some may map 1:1, others may be like putting a square
+# peg into a round hole. I will try and use my best judgement in these cases
+# while erring on the side of unifying the two APIs.
+abbr --add hgst  hg status
+abbr --add hglp  hg xl
+abbr --add hgp   hg uploadchain # this is like `git push`
+abbr --add hga   hg add
+abbr --add hgc   hg commit
+abbr --add hgcan hg amend # like `git commit --amend --no-edit'
+abbr --add hgpr  hg mail -r . -m # this may be similar to `hub pull-request`
+abbr --add hgd   hg diff
+abbr --add hgsh  hg export
+abbr --add hgco  hg update
+abbr --add hgls  hg citc --list # should have different output from `pils`
+abbr --add hgrc  hg rebase --continue
+abbr --add hgra  hg rebase --abort
+abbr --add hgrm  hg citc -d # delete a CitC client created with Fig
+abbr --add hgconflicts hg resolve --list 'set:unresolved()' # much like `gconflicts`
+
+# Haskell
+abbr --add sb stack build
+abbr --add se stack exec --
+abbr --add sc stack clean
+abbr --add st stack test
+abbr --add haddocks open (stack path --local-doc-root)/index.html
+# TODO: Remove `dkish` in favor of a Nix-built solution.
+abbr --add hksh 'dkish haskell ghci'
+
+# Kubernetes
+abbr --add kc kubectl
+abbr --add kpods kubectl get pods
+abbr --add knodes kubectl get nodes
+abbr --add kdeploys kubectl get deployments
+abbr --add kdns kubectl get ing
+abbr --add kedit kubectl edit deployments
+abbr --add kswitch gcloud container clusters get-credentials
+
+# Nix
+# TODO: Ensure that this depends on `nix_introspect` as defined in
+# functions.fish.
+abbr --add nq nix_introspect
+abbr --add nsh nix-shell
+abbr --add nshp nix-shell --pure
+abbr --add nr nix repl
+abbr --add ni nix-env --install
+abbr --add nrm nix-env --uninstall
+abbr --add nls nix-env --query
+abbr --add nrs sudo nixos-rebuild switch
+
+# Aptitude (apt)
+abbr --add apti  sudo apt-get install --assume-yes
+abbr --add aptrm sudo apt remove
+
+# Pacman
+abbr --add pmi sudo pacman -S --noconfirm
+abbr --add pms pacman -Ss
+abbr --add pmrm sudo pacman -Rs
+
+# Couple the e* aliases to the <leader>e* kbds in vim.
+abbr --add ev e ~/.config/nvim/init.vim
+abbr --add ee e ~/.emacs.d/init.el
+abbr --add ez e ~/.zshrc
+abbr --add ea e ~/aliases.zsh
+abbr --add ef e ~/functions.zsh
+abbr --add el e ~/variables.zsh
+abbr --add ex e ~/.Xresources
+abbr --add em e ~/.tmux.conf
+abbr --add er e ~/Dropbox/dotfiles/README.md
+
+# Couple the s* aliases to the <leader>s* kbds in vim.
+abbr --add sz source ~/.zshrc
+abbr --add sa source ~/aliases.zsh
+abbr --add sf source ~/functions.zsh
+abbr --add sl source ~/variables.zsh
+abbr --add sx xrdb ~/.Xresources
+abbr --add sm tmux source-file ~/.tmux.conf
+abbr --add sn sudo nixos-rebuild switch
+
+# CircleCI
+abbr --add cci    circleci local
+abbr --add ccijob circleci local execute --job
+
+# Google stuff
+abbr --add bzb      blaze build
+abbr --add bzt      blaze test --test_output=all
+abbr --add br       borgcfg
+abbr --add pils     p4 listclients
+abbr --add pirm     p4 citc -d
+abbr --add ppls     'g4 listclients | sed \'s/^Client wpcarro://\' | sed \'s/:[0-9]*:citc.*$//g\''
+abbr --add pprm     p4 citc -d -f # WARNING: This will forcefully delete a CitC client even if contains pending changes.
+abbr --add flagpick /google/data/ro/users/sk/skaushik/www/public-tools/flagpick
+abbr --add jaze     /google/data/ro/projects/devtools/javascript/jaze
+abbr --add aclcheck /google/data/ro/projects/ganpati/aclcheck
+abbr --add g3python /google/data/ro/projects/g3python/g3python
+abbr --add pb       /google/src/head/depot/eng/tools/pastebin
+abbr --add pbc      'pb --private --title $(date +$date_fmt)| tee >(c && chrome (p))' # create a private gPaste from your clipboard's content; open the result in a browser
+abbr --add pbcp     'p | pb --private --title (date +$date_fmt)| tee >(c && chrome (p))' # create a private gPaste from your clipboard's content; open the result in a browser
+abbr --add pbls     $BROWSER https://paste.googleplex.com/(whoami)
diff --git a/configs/shared/.config/lf/lfrc b/configs/shared/.config/lf/lfrc
new file mode 100644
index 000000000000..f6045d2973c7
--- /dev/null
+++ b/configs/shared/.config/lf/lfrc
@@ -0,0 +1,163 @@
+# It might be possible to attempt to share KBDs between `lf` and `dired`.
+# Currently shared KBDs with `dired`:
+#   - D: delete file
+#   - R: rename file
+#   - +: create directory
+#   - c: create file
+#
+# The following command prefixes are used by lf (taken from the docs):
+#
+#    :  read (default)  builtin/custom command
+#    $  shell           shell command
+#    %  shell-pipe      shell command running with the ui
+#    !  shell-wait      shell command waiting for key press
+#    &  shell-async     shell command running asynchronously
+#    /  search          search file in current directory
+#    ?  search-back     search file in the reverse order
+#
+# `x` will be used as a generic prefix KBD for most of my user-defined KBDs. Do
+# not map anything to just `x`. Instead prefer `x<char>`. Mneumonically, "x" is
+# intended to resemble "eXecute".
+#
+# If `x<char>` does one thing; `x<uppercase-char>` should do the opposite when
+# possible. This is convenient for things that pass the round-trip test like
+# encrypt/decrypt, archive/unarchive.
+
+# TODO: move most of these commands to function.zsh and call those functions
+# herein. Especially the `archive` and `extract` functions.
+#
+# TODO: consider integrations with `xdg-open` and configuring filetypes to
+# behave in expected "dwim" ways.
+#
+# TODO: learn more about the terms "archive", "compress", "decompress",
+# "expand", "extract", etc. See if a larger abstraction can be created on top
+# without sacrificing too much nuance. This might be the case of "serialize",
+# "deserialize", "pickle", "unpickle", "marshal", "unmarshal", "encode",
+# "decode" -- in which case, a broader abstraction would be nice to decrease the
+# surface area of the vocabulary.
+#
+# TODO: find a way to visualize all of the bound or unbound KBDs.
+#
+# TODO: support polymorphic way encrypt/decrypt a file or directory.
+#
+# TODO: support "toggle" for encryption/decryption that detects which function
+# to run based on the extension.
+#
+# TODO: support "toggle" for archive/unarchive that detects which function to
+# run based on the extension.
+
+# Basic configuration
+set hidden on
+set info size:time
+set sortby time
+set period 1 # auto-refreshes the view
+
+# Arguably the most import function herein
+cmd help $lf -doc | less
+
+# delete a file, dir
+map D delete
+
+# reload the view
+map r load
+
+# rename files
+cmd rename %[ -e $1 ] && printf 'file exists' || mv $f $1
+map R push :rename<space>
+
+cmd mkdir %{{
+    # mkdir and cd into that dir
+    mkdir -p "$1"
+}}
+map + push :mkdir<space>
+
+cmd touch %{{
+    # Create a file
+    touch "$1"
+}}
+map c push :touch<space> # this interferes with `clear` command
+
+cmd encrypt %{{
+  # depends on my shell function, encrypt
+  zsh -i -c "encrypt $f"
+}}
+map xe :encrypt
+
+cmd decrypt %{{
+  # depends on my shell function, decrypt
+  zsh -i -c "decrypt $f"
+}}
+map xE :decrypt
+
+cmd archive %{{
+    # Generic function for archiving directories.
+    # TODO: support selections of multiple files.
+    set -f
+    printf "Which type of archive would you like to create? (tar,tar.gz,zip) "
+    read answer
+    case $answer in
+         tar.gz) tar -czf "$f.tar.gz" "$(basename $f)"; rm -rf "$f";;
+         tar)    tar -cf "$f.tar" "$(basename $f)"; rm -rf "$f";;
+         zip)    zip -r "$f.zip" "$(basename $f)"; rm -rf "$f";;
+         *)      printf "\"$1\" is not a support archive. Aborting..."
+    esac
+}}
+map xa :archive
+
+cmd unarchive %{{
+    # Generic function for extracting archived directories.
+    # Assumes directories were archived with the `archive`.
+    set -f
+    case $f in
+         *.tar.gz) tar -xzvf $f; rm "$f";;
+         *.tar)    tar -xvf  $f; rm "$f";;
+         *.zip)    unzip "$f"; rm "$f";;
+         # TODO: grab extension from $f and display it in `printf` call.
+         *)        printf "Unsupported archive type. Aborting..."
+    esac
+}}
+map xA: unarchive
+
+cmd tar %{{
+    # tars a directory
+    set -f
+    printf "gzip? (y,n) "
+    read answer
+    case $answer in
+         y) tar -czf "$f.tar.gz" "$(basename $f)"; rm -rf "$f";;
+         n) tar -cf  "$f.tar"    "$(basename $f)"; rm -rf "$f";;
+         *) printf "\"$answer\" is not a supported answer. Aborting...";;
+    esac
+}}
+map xt :tar
+
+cmd untar %{{
+    # untars a directory tar'd with `tar`.
+    set -f
+    case $f in
+         *.tar.gz) tar -xzvf $f; rm "$f";;
+         *.tar)    tar -xvf  $f; rm "$f";;
+    esac
+}}
+map xT :untar
+
+cmd zip %{{
+    # zip a directory
+    set -f
+    zip -r "$f.zip" "$(basename $f)"
+    rm -rf "$f"
+}}
+map xz :zip
+
+cmd unzip %{{
+    # unzip a directory
+    set -f
+    unzip "$f"
+    rm "$f"
+}}
+map xZ :unzip
+
+# outputs the size of a particular file, dir
+# TODO: consider mapping this to a KBD
+cmd size %du -hs "$f"
+map xs :size
diff --git a/configs/shared/.config/lf/marks b/configs/shared/.config/lf/marks
new file mode 100644
index 000000000000..295576a0da1a
--- /dev/null
+++ b/configs/shared/.config/lf/marks
@@ -0,0 +1,6 @@
+D:~/Dropbox
+G:/usr/local/google/home/wpcarro/Downloads
+M:/usr/local/google/home/wpcarro/Downloads
+c:~/dotfiles/configs
+d:~/dotfiles
+s:~/Pictures/screenshots
diff --git a/configs/shared/.config/mpd/database b/configs/shared/.config/mpd/database
new file mode 100644
index 000000000000..b39f769e68e0
--- /dev/null
+++ b/configs/shared/.config/mpd/database
Binary files differdiff --git a/configs/shared/.config/mpd/mpd.conf b/configs/shared/.config/mpd/mpd.conf
new file mode 100644
index 000000000000..fbb3858f3d74
--- /dev/null
+++ b/configs/shared/.config/mpd/mpd.conf
@@ -0,0 +1,4 @@
+db_file "~/.config/mpd/database"
+log_file "syslog"
+# music_directory "~/.local/share/sounds"
+auto_update "yes"
\ No newline at end of file
diff --git a/configs/shared/.config/nixpkgs/config.nix b/configs/shared/.config/nixpkgs/config.nix
new file mode 100644
index 000000000000..1dd1750ae025
--- /dev/null
+++ b/configs/shared/.config/nixpkgs/config.nix
@@ -0,0 +1,3 @@
+{
+  allowUnfree = true;
+}
diff --git a/configs/shared/.config/nvim/init.vim b/configs/shared/.config/nvim/init.vim
new file mode 100644
index 000000000000..57cfe7ea6a20
--- /dev/null
+++ b/configs/shared/.config/nvim/init.vim
@@ -0,0 +1,668 @@
+" -- BEGIN: Vundle config --
+set nocompatible              " be iMproved, required
+filetype off                  " required
+
+" set the runtime path to include Vundle and initialize
+" share Vundle between vim and neovim
+set rtp+=~/.vim/bundle/Vundle.vim
+set rtp+=~/.config/nvim/bundle/Vundle.vim
+call vundle#begin()
+" alternatively, pass a path where Vundle should install plugins
+"call vundle#begin('~/some/path/here')
+
+" let Vundle manage Vundle, required
+Plugin 'VundleVim/Vundle.vim'
+
+" Rust IDE features
+Plugin 'racer-rust/vim-racer'
+
+set hidden
+let g:racer_experimental_completer = 1
+autocmd FileType rust nmap         gd <Plug>(rust-def)
+autocmd FileType rust nmap         gs <Plug>(rust-def-split)
+autocmd FileType rust nmap         gx <Plug>(rust-def-vertical)
+autocmd FileType rust nmap <leader>gd <Plug>(rust-doc)
+
+Plugin 'xolox/vim-misc'
+
+" The following are examples of different formats supported.
+" Keep Plugin commands between vundle#begin/end.
+
+" Displays git information in airline.
+Plugin 'tpope/vim-fugitive'
+
+" easier file navigation
+Plugin 'tpope/vim-vinegar'
+
+" Displays git-tracked C*UD ops within gutter.
+Plugin 'airblade/vim-gitgutter'
+
+" Fuzzy-finder
+Plugin 'kien/ctrlp.vim'
+
+" Grep file contents
+Plugin 'mileszs/ack.vim'
+
+" Syntax and other light-weight suppor for a variety of languages
+Plugin 'sheerun/vim-polyglot'
+
+" Themes
+Plugin 'deviantfero/wpgtk.vim'
+Plugin 'rainglow/vim'
+
+
+" Executes shell commands and pipes output into new Vim buffer.
+Plugin 'sjl/clam.vim'
+
+" Multiple cursors for simultaneous edits.
+" NOTE: use <C-n> to run miltiple cursors not <C-d>
+Plugin 'terryma/vim-multiple-cursors'
+
+" Visualize buffers
+Plugin 'vim-airline/vim-airline'
+Plugin 'vim-airline/vim-airline-themes'
+
+" Visually align assignments
+Plugin 'godlygeek/tabular'
+
+" Visually Highlight and comment code.
+Plugin 'tpope/vim-commentary'
+
+" Macros for quotes, parens, etc.
+Plugin 'tpope/vim-surround'
+
+" Allows Plugins to be repeated with `.` character
+Plugin 'tpope/vim-repeat'
+
+" Pairs of mappings
+Plugin 'tpope/vim-unimpaired'
+
+" LISPs support
+Plugin 'guns/vim-sexp'
+Plugin 'tpope/vim-sexp-mappings-for-regular-people'
+let g:sexp_enable_insert_mode_mappings = 0
+let g:sexp_filetypes = ''
+
+" Seamlessly navigate Vim and Tmux with similar bindings.
+Plugin 'christoomey/vim-tmux-navigator'
+
+" Async `:make` for code linting etc.
+Plugin 'neomake/neomake'
+
+" Better buffer mgt than CtrlP
+Plugin 'yegappan/mru'
+
+Plugin 'zanglg/nova.vim'
+
+" Emulates Emacs's Helm Swoop search
+Plugin 'pelodelfuego/vim-swoop'
+
+" Transparent encryption + decryption
+Plugin 'jamessan/vim-gnupg'
+
+" Javascript auto-formatting
+" Plugin 'prettier/vim-prettier', {
+"   \ 'do': 'yarn install',
+  " \ 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql', 'markdown'] }
+
+" Support Org mode
+Plugin 'jceb/vim-orgmode'
+
+" Autocompletion
+Plugin 'junegunn/fzf'
+
+" Text objects made easy
+Plugin 'kana/vim-textobj-user'
+
+" Elixir text objects
+Plugin 'andyl/vim-textobj-elixir'
+
+" Making HTML editing faster
+Plugin 'mattn/emmet-vim'
+
+" Snippets for all languages
+Plugin 'honza/vim-snippets'
+
+" Automatic bracket insertion
+Plugin 'jiangmiao/auto-pairs'
+
+" Linting & error warnings
+Plugin 'vim-syntastic/syntastic'
+
+" Angular.js support
+Plugin 'burnettk/vim-angular'
+
+" Asynchronous Linting Engine
+Plugin 'w0rp/ale'
+
+call vundle#end()            " required
+filetype plugin indent on    " required
+" Put your non-Plugin stuff after this line
+" -- END: Vundle config --
+
+" Changes <leader> to <space> character.
+let mapleader = " "
+
+
+" Highlight column width
+set textwidth=80
+set colorcolumn=+0
+
+" autoreload a file when it changes on disk
+set autoread
+
+" default to case-insensitive searching
+set ignorecase
+
+" JSX configuration
+let g:jsx_ext_required = 0
+
+
+autocmd FileType reason nnoremap <buffer> gd :call LanguageClient_textDocument_definition()<CR>
+autocmd FileType reason nnoremap <buffer> gf :call LanguageClient_textDocument_formatting()<CR>
+autocmd FileType reason nnoremap <buffer> gh :call LanguageClient_textDocument_hover()<CR>
+autocmd FileType reason nnoremap <buffer> gr :call LanguageClient_textDocument_rename()<CR>
+
+" Replace <CR> with G for faster navigation
+nnoremap <CR> G
+onoremap <CR> G
+vnoremap <CR> G
+
+" Mirror ZLE KBD
+inoremap <M-'> :echo "Working"<CR>
+
+" Syntastic configuration
+set statusline+=%#warningmsg#
+set statusline+=%{SyntasticStatuslineFlag()}
+set statusline+=%*
+
+let g:syntastic_always_populate_loc_list = 1
+let g:syntastic_auto_loc_list = 1
+let g:syntastic_check_on_open = 1
+let g:syntastic_check_on_wq = 0
+" let g:syntastic_javascript_checkers = ['eslint']
+let g:syntastic_javascript_eslint_generic = 1
+" this is a hack to prevent a false negative
+" https://github.com/vim-syntastic/syntastic/issues/1692
+" let g:syntastic_javascript_eslint_exec = '/bin/ls'
+" let g:syntastic_javascript_eslint_exe = 'npx eslint'
+" let g:syntastic_javascript_eslint_args = '-f compact'
+
+" javascript autocompletion
+" autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
+" autocmd FileType javascript nnoremap <buffer> gf :Prettier<CR>
+
+" Maximize the current window
+" Similar to Tmux mapping alt-z in my tmux.conf
+nnoremap t% :tab sp<CR>
+
+" Allow C-g to act like C-c the way it does in Emacs
+cnoremap <C-g> <C-c>
+
+" Prettier configuration
+" let g:prettier#exec_cmd_async = 1
+" force Prettier to run on files even without the @format pragma
+" let g:prettier#autoformat = 0
+
+
+" Basic settings
+" Thin cursor on INSERT mode
+if has('nvim')
+  let $NVIM_TUI_ENABLE_CURSOR_SHAPE = 1
+endif
+
+set number
+set nowrap
+set tabstop=2
+set expandtab
+set shiftwidth=2
+set background=dark
+
+syntax enable
+colorscheme peacock
+
+" Vim in terminal cannot have a different font from the one set within your
+" terminal. However, this setting will set the font for the GUI version.
+if has('gui_running')
+  set guifont=Operator\ Mono:h12
+endif
+
+if has('termguicolors')
+  set termguicolors
+endif
+
+if &term =~# '^screen'
+  let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
+  let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
+endif
+
+set history=1000
+set undolevels=1000
+
+set t_Co=255
+
+" Support italics
+highlight Comment cterm=italic
+
+
+" quickly edit popular configuration files
+nnoremap <leader>ev :vsplit $MYVIMRC<CR>
+nnoremap <leader>ee :vsplit ~/.emacs.d/init.el<CR>
+nnoremap <leader>ez :vsplit ~/.zshrc<CR>
+nnoremap <leader>ea :vsplit ~/aliases.zsh<CR>
+nnoremap <leader>ef :vsplit ~/functions.zsh<CR>
+nnoremap <leader>el :vsplit ~/variables.zsh<CR>
+nnoremap <leader>ex :vsplit ~/.Xresources<CR>
+
+" quickly source your vimrc
+nnoremap <leader>sv :source $MYVIMRC<CR>
+
+" quickly edit your snippets
+nnoremap <leader>es :vsplit<CR>:edit ~/.vim/bundle/vim-snippets/snippets/reason.snippets<CR>
+
+
+" Auto resize window splits
+autocmd VimResized * wincmd =
+
+
+" Neomake Settings
+autocmd! BufWritePost * Neomake
+
+" Elixir linting
+let g:neomake_elixir_credo_maker = {
+      \ 'exe': 'mix',
+      \ 'args': ['credo', 'list', '%:p', '--format=oneline'],
+      \ 'errorformat':
+      \   '%W[F] %. %f:%l:%c %m,' .
+      \   '%W[F] %. %f:%l %m,' .
+      \   '%W[R] %. %f:%l:%c %m,' .
+      \   '%W[R] %. %f:%l %m,' .
+      \   '%I[C] %. %f:%l:%c %m,' .
+      \   '%I[C] %. %f:%l %m,' .
+      \   '%-Z%.%#'
+      \ }
+
+
+let g:neomake_elixir_enabled_makers = ['mix', 'credo']
+
+augroup my_error_signs
+  au!
+  autocmd ColorScheme * hi NeomakeErrorSign ctermfg=203 guifg=#ff5f5f
+  autocmd ColorScheme * hi NeomakeWarningSign ctermfg=209 guifg=#ffaf00
+  autocmd ColorScheme * hi NeomakeInfoSign ctermfg=183 guifg=#dfafff
+  autocmd ColorScheme * hi NeomakeMessageSign ctermfg=27 guifg=#0087ff
+augroup END
+
+
+" templates
+if has("autocmd")
+  autocmd BufNewFile *.c  0r ~/.config/nvim/templates/boilerplate.c
+  autocmd BufNewFile *.rs 0r ~/.config/nvim/templates/boilerplate.rs
+endif
+
+let g:neomake_error_sign = {
+            \ 'text': '>>',
+            \ 'texthl': 'NeoMakeErrorSign',
+            \ }
+
+let g:neomake_warning_sign = {
+            \ 'text': '>>',
+            \ 'texthl': 'NeoMakeWarningSign',
+            \ }
+
+let g:neomake_info_sign = {
+            \ 'text': '>>',
+            \ 'texthl': 'NeoMakeInfoSign',
+            \ }
+
+let g:neomake_message_sign = {
+            \ 'text': '>>',
+            \ 'texthl': 'NeoMakeMessageSign',
+            \ }
+
+function! <SID>LocationPrevious()
+  try
+    lprev
+  catch /^Vim\%((\a\+)\)\=:E553/
+    llast
+  endtry
+endfunction
+
+function! <SID>LocationNext()
+  try
+    lnext
+  catch /^Vim\%((\a\+)\)\=:E553/
+    lfirst
+  endtry
+endfunction
+
+nnoremap <Leader>[ :call <SID>LocationPrevious()<CR>
+nnoremap <Leader>] :call <SID>LocationNext()<CR>
+
+
+" Alchemist settings
+let g:alchemist#elixir_erlang_src = '/usr/local/share/src'
+
+
+" Airline Settings
+" Enables the list of buffers.
+let g:airline#extensions#tabline#enabled = 0
+
+" Buffer numbers alongside files
+let g:airline#extensions#tabline#buffer_nr_show = 0
+
+" Shows the filename only.
+let g:airline#extensions#tabline#fnamemod = ':t'
+
+" Allow glyphs in airline
+let g:airline_powerline_fonts = 1
+
+" Change Airline theme
+let g:airline_theme = 'hybrid'
+
+
+" Vim-Swoop Settings
+" Edits colorscheme
+let g:swoopHighlight = ["hi! link SwoopBufferLineHi Warning", "hi! link SwoopPatternHi Error"]
+
+
+" Jump to buffers.
+nmap <F1> :1b<CR>
+nmap <F2> :2b<CR>
+nmap <F3> :3b<CR>
+nmap <F4> :4b<CR>
+nmap <F5> :5b<CR>
+nmap <F6> :6b<CR>
+nmap <F7> :7b<CR>
+nmap <F8> :8b<CR>
+nmap <F9> :9b<CR>
+
+
+" It's the twenty-first century...no swaps.
+set noswapfile
+
+
+" Allow visual tab completion in command mode
+set wildmenu
+
+
+" Show Vim commands as they're being input.
+set showcmd
+
+
+" Code folding
+" set foldmethod=indent
+" set foldnestmax=10
+" set nofoldenable
+" set foldlevel=4
+
+
+" emulate ci" and ci' behavior
+nnoremap ci( f(%ci(
+nnoremap ci[ f[%ci[
+
+
+" extend functionality of <C-e> & <C-y> scrolling
+nnoremap <C-e> <C-e>j
+vnoremap <C-e> <C-e>j
+nnoremap <C-y> <C-y>k
+vnoremap <C-y> <C-y>k
+
+
+" Opens all folds within the buffer
+" nnoremap ZZ zR
+
+" Closes all folds within the buffer
+" nnoremap zz zM
+
+" Opens all folds beneath the cursor
+" NOTE: j is the character to go down
+" nnoremap zJ zO
+
+" Opens single fold beneath the cursor
+" NOTE: j is the character to go down
+" nnoremap zj zo
+
+" Opens single fold beneath the cursor
+" NOTE: k is the character to go down
+" nnoremap zK zC
+
+" Opens single fold beneath the cursor
+" NOTE: k is the character to go down
+" nnoremap zk zc
+
+
+" Save shortcut
+nnoremap <C-s> :w<CR>
+
+
+" Switch to MRU'd buffer
+nnoremap <leader><leader> <C-^>
+
+
+" Alternative MRU to CtrlP MRU
+nnoremap <leader>b :MRU<CR>
+
+
+" Supports mouse interaction.
+set mouse=a
+
+
+" Highlights matches during a search.
+set hlsearch
+
+" Clear highlight
+noremap <silent> <leader>h :nohlsearch<bar>:echo<CR>
+
+
+" backspace settings
+set backspace=2
+set backspace=indent,eol,start
+
+
+" Javascript specific variables
+let g:javascript_plugin_jsdoc = 1
+
+" GlobalListchars
+set list
+set listchars=tab:··,trail:·,nbsp:·
+
+
+" Keeps everything concealed at all times. Even when cursor is on the word.
+set conceallevel=1
+set concealcursor=nvic
+
+
+" map jk to <Esc>
+inoremap jk <Esc>
+
+
+" Hybrid mode for Vim
+inoremap <C-a> <Esc>I
+inoremap <C-e> <Esc>A
+
+inoremap <M-b> <S-Left>
+inoremap <M-f> <S-Right>
+
+inoremap <C-b> <Left>
+inoremap <C-f> <Right>
+inoremap <C-p> <Up>
+inoremap <C-n> <Down>
+
+" temporarily disable <C-p> in normal mode so it doesn't attempt to index all of
+" Google3.
+nnoremap <C-p> :echo "You are attempting to index all of Google3. Aborting..."<CR>
+
+" tab maintenence
+nnoremap <C-t> :tabnew<CR>
+nnoremap <C-w> :tabclose<CR>
+nnoremap <Tab> :tabnext<CR>
+nnoremap <S-Tab> :tabprevious<CR>
+
+" Manage Vertical and Horizontal splits
+nnoremap sl <Esc>:vs<CR><C-w>l
+nnoremap sh <Esc>:vs<CR>
+nnoremap sj <Esc>:sp<CR><C-w>j
+nnoremap sk <Esc>:sp<CR>
+
+
+" Delete (i.e. "close") the currently opened buffer
+" TODO: unless it's a split window, which should be :q
+nnoremap <leader>q :bdelete<CR>
+
+
+" Set CtrlP runtime path
+set runtimepath^=~/.vim/bundle/ctrlp.vim
+
+
+" Pane movement
+let g:tmux_navigator_no_mappings = 1
+
+nnoremap <silent> <M-h> :TmuxNavigateLeft<CR>
+nnoremap <silent> <M-j> :TmuxNavigateDown<CR>
+nnoremap <silent> <M-k> :TmuxNavigateUp<CR>
+nnoremap <silent> <M-l> :TmuxNavigateRight<CR>
+nnoremap <silent> <M-q> :q<CR>
+
+" make Y do what is intuitive given:
+"   D: deletes until EOL
+"   C: changes until EOL
+"   Y: (should) yank until EOL
+nnoremap Y y$
+
+
+" scrolling and maintaing mouse position
+" nnoremap <C-j> j<C-e>
+" nnoremap <C-k> k<C-y>
+
+
+" remap redo key that is eclipsed by `rotate` currently
+nnoremap U :redo<CR>
+
+
+" Define highlighting groups
+" NOTE: The ANSII aliases for colors will change when iTerm2 settings are
+" changed.
+highlight InterestingWord1 ctermbg=Magenta ctermfg=Black
+highlight InterestingWord2 ctermbg=Blue ctermfg=Black
+
+" h1 highlighting
+nnoremap <silent> <leader>1 :execute '2match InterestingWord1 /\<<c-r><c-w>\>/'<CR>
+nnoremap <silent> <leader>x1 :execute '2match none'<CR>
+vnoremap <silent> <leader>1 :execute '2match InterestingWord1 /\<<c-r><c-w>\>/'<CR>
+
+" h2 highlighting
+nnoremap <silent> <leader>2 :execute '3match InterestingWord2 /\<<c-r><c-w>\>/'<CR>
+nnoremap <silent> <leader>x2 :execute '3match none'<CR>
+
+"clear all highlighted groups
+nnoremap <silent> <leader>xx :execute '2match none'<CR> :execute '3match none'<CR> hh
+
+
+" pasteboard copy & paste
+set clipboard+=unnamedplus
+
+
+" Manage 80 char line limits
+highlight OverLength1 ctermbg=Magenta ctermfg=Black
+highlight OverLength2 ctermbg=LightMagenta ctermfg=Black
+highlight OverLength3 ctermbg=White ctermfg=Black
+" match OverLength3 /\%81v.\+/
+match OverLength2 /\%91v.\+/
+" match OverLength3 /\%101v.\+/
+
+nnoremap <leader>w :w<CR>
+
+
+" Resize split to 10,20,...,100 chars
+" Uncomment the next lines for support at those sizes.
+" These bindings interfere with the highlight groups, however.
+" Increases the width of a vertical split.
+" nnoremap <leader>1 :vertical resize 10<CR>
+" nnoremap <leader>2 :vertical resize 20<CR>
+nnoremap <leader>3 :vertical resize 30<CR>
+nnoremap <leader>4 :vertical resize 40<CR>
+nnoremap <leader>5 :vertical resize 50<CR>
+nnoremap <leader>6 :vertical resize 60<CR>
+nnoremap <leader>7 :vertical resize 70<CR>
+nnoremap <leader>8 :vertical resize 80<CR>
+nnoremap <leader>9 :vertical resize 90<CR>
+nnoremap <leader>0 :vertical resize 100<CR>
+
+
+" Increases the height of a horizontal split.
+nnoremap <leader>v1 :resize 5<CR>
+nnoremap <leader>v2 :resize 10<CR>
+nnoremap <leader>v3 :resize 15<CR>
+nnoremap <leader>v4 :resize 20<CR>
+nnoremap <leader>v5 :resize 25<CR>
+nnoremap <leader>v6 :resize 30<CR>
+nnoremap <leader>v7 :resize 35<CR>
+nnoremap <leader>v8 :resize 40<CR>
+nnoremap <leader>v9 :resize 45<CR>
+nnoremap <leader>v0 :resize 50<CR>
+
+
+" BOL and EOL
+nnoremap H ^
+vnoremap H ^
+nnoremap L $
+vnoremap L $
+
+
+" Search for visually selected text
+vnoremap // y/<C-r>"<CR>N
+
+
+" trim trailing whitespace on save
+" Are there any file type where I wouldn't want this?
+autocmd BufWritePre *.{js,py,tpl,less,html,ex,exs,txt,hs,java,rs,ml} :%s/\s\+$//e
+
+
+" Use .gitignore file to populate Ctrl-P
+let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files . -co --exclude-standard', 'find %s -type f']
+
+
+" Ignores dirs and files
+let g:ctrlp_custom_ignore = {
+  \ 'dir':  'node_modules',
+  \ 'file': '\v\.(exe|dll|png|jpg|jpeg)$'
+\}
+
+
+" WIP: Run elixir tests on that line
+" TODO: only register binding in *.exs? file extensions
+nnoremap <leader>t :call ExTestToggle()<CR>
+
+
+" Jumps from an Elixir module file to an Elixir test file.
+fun! ExTestToggle()
+  if expand('%:e') == "ex"
+
+    let test_file_name = expand('%:t:r') . "_test.exs"
+    let test_file_dir = substitute(expand('%:p:h'), "/lib/", "/test/", "")
+    let full_test_path = join([test_file_dir, test_file_name], "/")
+
+    e `=full_test_path`
+
+  elseif match(expand('%:t'), "_test.exs") != -1
+
+    let test_file_name = expand('%:t:r')
+    let offset_amt = strlen(test_file_name) - strlen("_test")
+    let module_file_name = strpart(test_file_name, 0, offset_amt) . ".ex"
+    let module_file_dir = substitute(expand('%:p:h'), "/test/", "/lib/", "")
+    let full_module_path = join([module_file_dir, module_file_name], "/")
+
+    e `=full_module_path`
+
+  endif
+endfun
+
+
+" Creates intermediate directories and file to match current buffer's filepath
+fun! CreateNonExistingDirsAndFile()
+  ! echo "Creating directory..." && mkdir -p %:p:h && echo "Created directory." && echo "Creating file..." && touch %:t:p && echo "Created file."
+
+  " Write the buffer to the recently created file.
+  w
+endfun
diff --git a/configs/shared/.config/nvim/simple.vim b/configs/shared/.config/nvim/simple.vim
new file mode 100644
index 000000000000..ea40964ee803
--- /dev/null
+++ b/configs/shared/.config/nvim/simple.vim
@@ -0,0 +1,98 @@
+" My barebones vimrc without any Vundle dependencies.
+"
+" I'm attempting to optimize the following:
+" - Minimize dependencies
+" - Maximize ergonomics
+" - Maximize Tmux compatibility
+" - Minimize shadowing of existing Vim KBDs
+"
+" Warning: This is currently unstable as it is a work-in-progress.
+"
+" Author: William Carroll <wpcarro@gmail.com>
+
+" Use <Space> as the leader key.
+let mapleader = " "
+nnoremap <leader>ev :tabnew<CR>:edit ~/.vimrc<CR>
+nnoremap <leader>sv :source ~/.vimrc<CR>
+nnoremap <leader>w  :w<CR>
+nnoremap <leader>h  :help 
+
+" increment,decrement numbers
+nnoremap + <C-a>
+" TODO: Restore with better KBD
+" nnoremap - <C-x>
+
+" Visit the CWD
+nnoremap - :e .<CR>
+
+" Turn line numbers on.
+set number
+
+" Easily create vertical, horizontal window splits.
+nnoremap sh :vsplit<CR>
+nnoremap sj :split<CR>:wincmd j<CR>
+nnoremap sk :split<CR>
+nnoremap sl :vsplit<CR>:wincmd l<CR>
+
+" Move across window splits.
+" TODO: Change to <M-{h,j,k,l}>.
+nnoremap <C-h> :wincmd h<CR>
+nnoremap <C-j> :wincmd j<CR>
+nnoremap <C-k> :wincmd k<CR>
+nnoremap <C-l> :wincmd l<CR>
+
+" TODO: Support these.
+" nnoremap <M-q> :q<CR>
+" nnoremap <M-h> :wincmd h<CR>
+" nnoremap <M-j> :wincmd j<CR>
+" nnoremap <M-k> :wincmd k<CR>
+" nnoremap <M-l> :wincmd l<CR>
+
+" Use <Enter> instead of G to support:
+"        20<Enter> - to jump to line 20
+"       d20<Enter> - to delete from the current line until line 20
+"   <C-v>20<Enter> - to select from the current line until line 20
+nnoremap <Enter> G
+onoremap <Enter> G
+vnoremap <Enter> G
+
+" Easily change modes on keyboards that don't have CapsLock mapped to <Esc>
+inoremap jk      <ESC>
+
+" CRUD tabs.
+nnoremap <TAB>   :tabnext<CR>
+nnoremap <S-TAB> :tabprevious<CR>
+nnoremap <C-t>   :tabnew<CR>:edit .<CR>
+nnoremap <C-w>   :tabclose<CR>
+" TODO: Re-enable these once <M-{h,j,k,l}> are supported.
+" nnoremap <C-l> :+tabmove<CR>
+" nnoremap <C-h> :-tabmove<CR>
+
+" Use H,L to goto beggining,end of a line.
+" Swaps the keys to ensure original functionality of H,L are preserved.
+nnoremap H ^
+nnoremap L $
+nnoremap ^ H
+nnoremap $ L
+
+" Use H,L in visual mode too
+vnoremap H ^
+vnoremap L $
+vnoremap ^ H
+vnoremap $ L
+
+" Emacs hybrid mode
+" TODO: model this after tpope's rsi.vim (Readline-style insertion)
+cnoremap <C-g> <C-c>
+cnoremap <C-a> <C-b>
+inoremap <C-a> <C-o>^
+inoremap <C-e> <C-o>$
+inoremap <C-b> <C-o>h
+inoremap <C-f> <C-o>l
+
+" Indenting
+" The following three settings are based on option 2 of `:help tabstop`
+set tabstop=4
+set shiftwidth=4
+set expandtab
+set autoindent
diff --git a/configs/shared/.config/nvim/templates/boilerplate.c b/configs/shared/.config/nvim/templates/boilerplate.c
new file mode 100644
index 000000000000..949743d72587
--- /dev/null
+++ b/configs/shared/.config/nvim/templates/boilerplate.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+int main() {
+  printf("Hello, world!");
+  return 0;
+}
diff --git a/configs/shared/.config/nvim/templates/boilerplate.rs b/configs/shared/.config/nvim/templates/boilerplate.rs
new file mode 100644
index 000000000000..c83adbc69fa0
--- /dev/null
+++ b/configs/shared/.config/nvim/templates/boilerplate.rs
@@ -0,0 +1,5 @@
+fn main() {
+    // The statements here will be executed when the compiled binary is called.
+
+    println!("Hello, world!");
+}
diff --git a/configs/shared/.config/rofi/config b/configs/shared/.config/rofi/config
new file mode 100644
index 000000000000..576ab5cd8e68
--- /dev/null
+++ b/configs/shared/.config/rofi/config
@@ -0,0 +1,6 @@
+rofi.font:                           Monospace 10
+rofi.color-normal:                   #31213f, #8de0e1, #31213f, #83526a, #8de0e1
+rofi.color-urgent:                   #31213f, #d6b48d, #22231D, #d6b48d, #8de0e1
+rofi.color-active:                   #31213f, #3CC2B5, #31213f, #3CC2B5, #31213f
+rofi.color-window:                   #31213f, #83526a, #5a3849
+rofi.modi: window,run,ssh,combi
diff --git a/configs/shared/.config/rofi/config.bak b/configs/shared/.config/rofi/config.bak
new file mode 100644
index 000000000000..cd77833442f4
--- /dev/null
+++ b/configs/shared/.config/rofi/config.bak
@@ -0,0 +1,6 @@
+rofi.font:                           Source Code Pro 10
+rofi.color-normal:                   #01022E, #a7dff4, #01022E, #015f9e, #a7dff4
+rofi.color-urgent:                   #01022E, #d6b48d, #22231D, #d6b48d, #a7dff4
+rofi.color-active:                   #01022E, #3FA4E0, #01022E, #3FA4E0, #01022E
+rofi.color-window:                   #01022E, #015f9e, #01416c
+rofi.modi: window,run,ssh,combi
diff --git a/configs/shared/.config/systemd/user/clipmenud.service b/configs/shared/.config/systemd/user/clipmenud.service
new file mode 100644
index 000000000000..fac317f3f072
--- /dev/null
+++ b/configs/shared/.config/systemd/user/clipmenud.service
@@ -0,0 +1,18 @@
+[Unit]
+Description=Clipmenu daemon
+
+[Service]
+ExecStart=clipmenud
+Restart=always
+RestartSec=500ms
+Environment=DISPLAY=:0
+
+MemoryDenyWriteExecute=yes
+NoNewPrivileges=yes
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+RestrictAddressFamilies=
+RestrictRealtime=yes
+
+[Install]
+WantedBy=default.target
diff --git a/configs/shared/.config/systemd/user/default.target.wants/clipmenud.service b/configs/shared/.config/systemd/user/default.target.wants/clipmenud.service
new file mode 120000
index 000000000000..387f2023d2d2
--- /dev/null
+++ b/configs/shared/.config/systemd/user/default.target.wants/clipmenud.service
@@ -0,0 +1 @@
+/usr/local/google/home/wpcarro/.config/systemd/user/clipmenud.service
\ No newline at end of file
diff --git a/configs/shared/.config/terminator/config b/configs/shared/.config/terminator/config
new file mode 100644
index 000000000000..5830575f30e3
--- /dev/null
+++ b/configs/shared/.config/terminator/config
@@ -0,0 +1,15 @@
+[global_config]
+  enabled_plugins = LaunchpadBugURLHandler, LaunchpadCodeURLHandler, APTURLHandler, TerminatorThemes
+[keybindings]
+[profiles]
+  [[default]]
+    background_color = "#fcf4dc"
+    cursor_shape = ibeam
+    cursor_color = "#536870"
+    font = JetBrainsMono 9
+    foreground_color = "#536870"
+    show_titlebar = False
+    scrollbar_position = hidden
+    palette = "#002831:#d11c24:#738a05:#a57706:#2176c7:#c61c6f:#259286:#eae3cb:#001e27:#bd3613:#475b62:#536870:#708284:#5956ba:#819090:#fcf4dc"
+    use_system_font = False
+[plugins]
diff --git a/configs/shared/.config/terminator/config.bak b/configs/shared/.config/terminator/config.bak
new file mode 100644
index 000000000000..d25a89c99e60
--- /dev/null
+++ b/configs/shared/.config/terminator/config.bak
@@ -0,0 +1,23 @@
+[global_config]
+  enabled_plugins = LaunchpadBugURLHandler, LaunchpadCodeURLHandler, APTURLHandler
+[keybindings]
+[profiles]
+  [[default]]
+    background_color = "#01022E"
+    cursor_shape = ibeam
+    cursor_color = "#434AA6"
+    font = Source Code Pro 10
+    foreground_color = "#0278C6"
+    show_titlebar = False
+    scrollbar_position = hidden
+    palette = "#01022E:#434AA6:#0278C6:#9B6DB0:#018CD5:#07AAE9:#3FA4E0:#a7dff4:#749caa:#434AA6:#0278C6:#9B6DB0:#018CD5:#07AAE9:#3FA4E0:#a7dff4"
+    use_system_font = False
+[layouts]
+  [[default]]
+    [[[child1]]]
+      parent = window0
+      type = Terminal
+    [[[window0]]]
+      parent = ""
+      type = Window
+[plugins]
diff --git a/configs/shared/.config/terminator/plugins/terminator-themes.py b/configs/shared/.config/terminator/plugins/terminator-themes.py
new file mode 100644
index 000000000000..fa807c65bd2a
--- /dev/null
+++ b/configs/shared/.config/terminator/plugins/terminator-themes.py
@@ -0,0 +1,250 @@
+import requests
+import terminatorlib.plugin as plugin
+from gi.repository import Gtk
+from terminatorlib.config import ConfigBase
+from terminatorlib.translation import _
+from terminatorlib.util import get_config_dir, err, dbg, gerr
+
+AVAILABLE = ['TerminatorThemes']
+
+class TerminatorThemes(plugin.Plugin):
+
+    capabilities = ['terminal_menu']
+    config_base = ConfigBase()
+    base_url = 'https://api.github.com/repos/EliverLara/terminator-themes/contents/themes.json'
+    inherits_config_from = "default"
+
+    def callback(self, menuitems, menu, terminal):
+        """Add our item to the menu"""
+        self.terminal = terminal
+        item = Gtk.ImageMenuItem(Gtk.STOCK_FIND)
+        item.connect('activate',self.configure)
+        item.set_label("Themes")
+        item.set_sensitive(True)
+        menuitems.append(item)
+
+    def configure(self, widget, data = None):
+        ui = {}
+        dbox = Gtk.Dialog( _("Terminator themes"), None, Gtk.DialogFlags.MODAL)
+        
+        headers = { "Accept": "application/vnd.github.v3.raw" }
+        response = requests.get(self.base_url, headers=headers)
+
+        if response.status_code != 200:
+            gerr(_("Failed to get list of available themes"))
+            return
+        
+        self.themes_from_repo = response.json()["themes"]
+        self.profiles = self.terminal.config.list_profiles()
+
+        main_container = Gtk.HBox(spacing=5)
+        main_container.pack_start(self._create_themes_grid(ui), True, True, 0)
+        main_container.pack_start(self._create_settings_grid(ui), True, True, 0)
+        dbox.vbox.pack_start(main_container, True, True, 0)
+        
+        self.dbox = dbox
+        dbox.show_all()
+        res = dbox.run()
+
+        if res == Gtk.ResponseType.ACCEPT:
+            self.terminal.config.save()
+
+        del(self.dbox)
+        dbox.destroy()
+
+        return
+
+    def _create_themes_grid(self, ui):
+        grid = Gtk.Grid()
+        grid.set_column_spacing(5)
+        grid.set_row_spacing(7)
+        grid.set_column_homogeneous(True)
+        grid.set_row_homogeneous(True)
+
+        scroll_window = self._create_themes_list(ui)
+
+        #creating buttons to filter by theme type, and setting up their events
+        buttons = list()
+        for theme_type in ["light", "dark", "None"]:
+            button = Gtk.Button(theme_type)
+            buttons.append(button)
+            button.connect("clicked", self.on_filter_button_clicked)
+
+        grid.attach(scroll_window, 0, 0, 4, 10)
+        grid.attach_next_to(buttons[0], scroll_window, Gtk.PositionType.BOTTOM, 1, 1)
+
+        for i, button in enumerate(buttons[1:]):
+            grid.attach_next_to(button, buttons[i], Gtk.PositionType.RIGHT, 1, 1)
+
+        return grid
+
+    def _create_themes_list(self, ui):
+
+        profiles_list_model = Gtk.ListStore(str, str,bool, object)
+        # Set add/remove buttons availability
+        for theme in self.themes_from_repo:
+            if theme["name"] in self.profiles:
+                profiles_list_model.append([theme["name"], theme["type"],False, theme])
+            else:
+                profiles_list_model.append([theme["name"], theme["type"],True, theme])
+
+        self.current_filter_theme = None
+        self.theme_filter = profiles_list_model.filter_new()
+        self.theme_filter.set_visible_func(self.theme_filter_func)
+        
+        treeview = Gtk.TreeView.new_with_model(self.theme_filter)
+
+        selection = treeview.get_selection()
+        selection.set_mode(Gtk.SelectionMode.SINGLE)
+        selection.connect("changed", self.on_selection_changed, ui)
+        ui['treeview'] = treeview
+
+        for i, column_title in enumerate(["Theme", "Type"]):
+            renderer = Gtk.CellRendererText()
+            column = Gtk.TreeViewColumn(column_title, renderer, text=i)
+            treeview.append_column(column)
+
+        scroll_window = Gtk.ScrolledWindow()
+        scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+        scroll_window.add(treeview)
+
+        return scroll_window
+
+
+    def _create_settings_grid(self, ui):
+        grid = Gtk.Grid()
+        grid.set_column_spacing(5)
+        grid.set_row_spacing(7)
+        grid.attach(self._create_default_inherits_check(ui), 0, 0, 2, 1)
+        grid.attach(Gtk.Label("Available profiles: "), 0, 1, 1, 1)
+        grid.attach(self._create_inherits_from_combo(ui), 1, 1, 1, 1)
+        grid.attach(self._create_main_action_button(ui, "install", self.on_install), 0, 4, 1, 1)
+        grid.attach(self._create_main_action_button(ui, "remove", self.on_uninstall), 1, 4, 1, 1)
+
+        return grid
+
+    def _create_default_inherits_check(self, ui):
+        check = Gtk.CheckButton("Inherit preferences from default profile")
+        check.set_active(True)
+        check.connect("toggled", self.on_inheritsfromdefaultcheck_toggled, ui)
+        ui['check_inherits_from_default'] = check
+        
+        return check
+
+    def _create_inherits_from_combo(self, ui):
+        combo = Gtk.ComboBoxText()
+        combo.set_entry_text_column(0)
+        combo.set_sensitive(False)
+        combo.connect("changed", self.on_inheritsfromcombo_changed, ui)
+        ui['inherits_from_combo'] = combo
+
+        for profile in self.profiles:
+            combo.append_text(profile)
+
+        combo.set_active(self.profiles.index(self.terminal.config.get_profile()))
+
+        return combo
+    
+    def _create_main_action_button(self, ui, label, action):
+        btn = Gtk.Button(_(label.capitalize()))
+        btn.connect("clicked", action, ui) 
+        btn.set_sensitive(False)
+        ui['button_' + label] = btn
+
+        return btn
+
+    def theme_filter_func(self, model, iter, data):
+        """Tests if the theme in the row is the one in the filter"""
+        if self.current_filter_theme is None or self.current_filter_theme == "None":
+            return True
+        else:
+            return model[iter][1] == self.current_filter_theme
+
+    def on_filter_button_clicked(self, widget):
+        """Called on any of the button clicks"""
+        #we set the current theme filter to the button's label
+        self.current_filter_theme = widget.get_label()
+
+        #we update the filter, which updates in turn the view
+        self.theme_filter.refilter()
+
+
+    def  on_inheritsfromdefaultcheck_toggled(self, check, data=None):
+        if check.get_active() is not True:
+            data["inherits_from_combo"].set_sensitive(True)
+            self.inherits_config_from = self.profiles[data['inherits_from_combo'].get_active()]
+        else:
+            data["inherits_from_combo"].set_sensitive(False)
+            self.inherits_config_from = 'default'
+        
+    def  on_inheritsfromcombo_changed(self, combo, data):
+        if combo.get_sensitive():    
+            self.inherits_config_from = self.profiles[combo.get_active()]
+        else:
+            self.inherits_config_from = 'default'
+
+    def on_selection_changed(self, selection, data=None):
+        (model, iter) = selection.get_selected()
+        data['button_install'].set_sensitive(model[iter][2])
+        data['button_remove'].set_sensitive(model[iter][2] is not True)
+
+    def on_uninstall(self, button, data):
+        treeview = data['treeview']
+        selection = treeview.get_selection()
+        (store, iter) = selection.get_selected()
+        target = store[iter][0]
+
+        # If selected theme is active, sets terminal profile to default before unistalling
+        if self.terminal.get_profile() == target:
+            widget = self.terminal.get_vte()
+            self.terminal.force_set_profile(widget, 'default')
+
+        self.terminal.config.del_profile(target)
+        self.terminal.config.save()
+        self.update_comboInheritsFrom(data)
+
+        #'Add' button available again
+        data['treeview'].get_model().set_value(iter, 2, True)
+        self.on_selection_changed(selection, data)
+
+    def on_install(self, button, data):
+        treeview = data['treeview']
+        selection = treeview.get_selection()
+        (store, iter) = selection.get_selected()
+        target = store[iter][3]
+        widget = self.terminal.get_vte()
+        treeview.set_enable_tree_lines(False)
+        
+        if not iter:
+            return
+
+        self.terminal.config.add_profile(target["name"]) 
+        template_data = self.config_base.profiles[self.inherits_config_from].copy()
+
+        for k, v in target.items():
+            if k != 'background_image' and k != 'name' and k != 'type':
+                if k == 'background_darkness':
+                    template_data[k] = float(v)
+                else:
+                    template_data[k] = v
+
+        for k, v in template_data.items():
+            self.config_base.set_item(k, v, target["name"])
+                 
+        self.terminal.force_set_profile(widget, target["name"])
+        self.terminal.config.save()
+        self.update_comboInheritsFrom(data)
+
+        # "Remove" button available again
+        data['treeview'].get_model().set_value(iter, 2, False)
+        self.on_selection_changed(selection, data)
+        treeview.set_enable_tree_lines(True)
+
+    def update_comboInheritsFrom(self, data):
+        data['inherits_from_combo'].remove_all()
+        profiles = self.terminal.config.list_profiles()
+        self.profiles = profiles
+        for profile in profiles:
+            data['inherits_from_combo'].append_text(profile)
+
+        data['inherits_from_combo'].set_active(profiles.index(self.terminal.config.get_profile()))
\ No newline at end of file