diff --git a/.aliases b/.aliases deleted file mode 100644 index 7f906eb..0000000 --- a/.aliases +++ /dev/null @@ -1,198 +0,0 @@ -#!/usr/bin/env bash - -# Easier navigation: .., ..., ...., ....., ~ and - -alias ..="cd .." -alias ...="cd ../.." -alias ....="cd ../../.." -alias .....="cd ../../../.." -alias ~="cd ~" # `cd` is probably faster to type though -alias -- -="cd -" - -# Shortcuts -alias d="cd ~/Documents/Dropbox" -alias dl="cd ~/Downloads" -alias dt="cd ~/Desktop" -alias p="cd ~/projects" -alias g="git" -alias h="history" -alias j="jobs" - -# Detect which `ls` flavor is in use -if ls --color > /dev/null 2>&1; then # GNU `ls` - colorflag="--color" - export LS_COLORS='no=00:fi=00:di=01;31:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:' -else # macOS `ls` - colorflag="-G" - export LSCOLORS='BxBxhxDxfxhxhxhxhxcxcx' -fi - -# List all files colorized in long format -alias l="ls -lF ${colorflag}" - -# List all files colorized in long format, including dot files -alias la="ls -laF ${colorflag}" - -# List only directories -alias lsd="ls -lF ${colorflag} | grep --color=never '^d'" - -# Always use color output for `ls` -alias ls="command ls ${colorflag}" - -# Always enable colored `grep` output -# Note: `GREP_OPTIONS="--color=auto"` is deprecated, hence the alias usage. -alias grep='grep --color=auto' -alias fgrep='fgrep --color=auto' -alias egrep='ggrep -E --color=auto' - -# Enable aliases to be sudo’ed -alias sudo='sudo ' - -# Get week number -alias week='date +%V' - -# Stopwatch -alias timer='echo "Timer started. Stop with Ctrl-D." && date && time cat && date' - -# Get macOS Software Updates, and update installed Ruby gems, Homebrew, npm, and their installed packages -alias update='sudo softwareupdate -i -a; brew update; brew upgrade; brew cleanup; npm install npm -g; npm update -g; sudo gem update --system; sudo gem update; sudo gem cleanup' - -# Google Chrome -alias chrome='/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome' - -# IP addresses -alias ip="dig +short myip.opendns.com @resolver1.opendns.com" -alias localip="ipconfig getifaddr en0" -alias ips="ifconfig -a | grep -o 'inet6\? \(addr:\)\?\s\?\(\(\([0-9]\+\.\)\{3\}[0-9]\+\)\|[a-fA-F0-9:]\+\)' | awk '{ sub(/inet6? (addr:)? ?/, \"\"); print }'" - -# Show active network interfaces -alias ifactive="ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'" - -# Flush Directory Service cache -alias flush="dscacheutil -flushcache && killall -HUP mDNSResponder" - -# Clean up LaunchServices to remove duplicates in the “Open With” menu -alias lscleanup="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user && killall Finder" - -# View HTTP traffic -alias sniff="sudo ngrep -d 'en1' -t '^(GET|POST) ' 'tcp and port 80'" -alias httpdump="sudo tcpdump -i en1 -n -s 0 -w - | grep -a -o -E \"Host\: .*|GET \/.*\"" - -# Canonical hex dump; some systems have this symlinked -command -v hd > /dev/null || alias hd="hexdump -C" - -# macOS has no `md5sum`, so use `md5` as a fallback -command -v md5sum > /dev/null || alias md5sum="md5" - -# macOS has no `sha1sum`, so use `shasum` as a fallback -command -v sha1sum > /dev/null || alias sha1sum="shasum" - -# JavaScriptCore REPL -jscbin="/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc"; -[ -e "${jscbin}" ] && alias jsc="${jscbin}"; -unset jscbin; - -# Trim new lines and copy to clipboard -alias c="tr -d '\n' | pbcopy" - -# Recursively delete `.DS_Store` files -# alias cleanup="find . -type f -name '*.DS_Store' -ls -delete" - -# Empty the Trash on all mounted volumes and the main HDD. -# Also, clear Apple’s System Logs to improve shell startup speed. -# Finally, clear download history from quarantine. https://mths.be/bum -alias emptytrash="sudo rm -rfv /Volumes/*/.Trashes; sudo rm -rfv ~/.Trash; sudo rm -rfv /private/var/log/asl/*.asl; sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV* 'delete from LSQuarantineEvent'" - -# Show/hide hidden files in Finder -alias show="defaults write com.apple.finder AppleShowAllFiles -bool true && killall Finder" -alias hide="defaults write com.apple.finder AppleShowAllFiles -bool false && killall Finder" - -# Hide/show all desktop icons (useful when presenting) -alias hidedesktop="defaults write com.apple.finder CreateDesktop -bool false && killall Finder" -alias showdesktop="defaults write com.apple.finder CreateDesktop -bool true && killall Finder" - -# URL-encode strings -alias urlencode='python -c "import sys, urllib as ul; print ul.quote_plus(sys.argv[1]);"' - -# Merge PDF files -# Usage: `mergepdf -o output.pdf input{1,2,3}.pdf` -alias mergepdf='/System/Library/Automator/Combine\ PDF\ Pages.action/Contents/Resources/join.py' - -# Disable Spotlight -alias spotoff="sudo mdutil -a -i off" -# Enable Spotlight -alias spoton="sudo mdutil -a -i on" - -# PlistBuddy alias, because sometimes `defaults` just doesn’t cut it -alias plistbuddy="/usr/libexec/PlistBuddy" - -# Airport CLI alias -alias airport='/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport' - -# Ring the terminal bell, and put a badge on Terminal.app’s Dock icon -# (useful when executing time-consuming commands) -alias badge="tput bel" - -# Intuitive map function -# For example, to list all directories that contain a certain file: -# find . -name .gitattributes | map dirname -alias map="xargs -n1" - -# One of @janmoesen’s ProTip™s -for method in GET HEAD POST PUT DELETE TRACE OPTIONS; do - alias "$method"="lwp-request -m '$method'" -done - -# Make Grunt print stack traces by default -command -v grunt > /dev/null && alias grunt="grunt --stack" - -# Stuff I never really use but cannot delete either because of http://xkcd.com/530/ -alias stfu="osascript -e 'set volume output muted true'" -alias pumpitup="osascript -e 'set volume output volume 100'" - -# Kill all the tabs in Chrome to free up memory -# [C] explained: http://www.commandlinefu.com/commands/view/402/exclude-grep-from-your-grepped-output-of-ps-alias-included-in-description -alias chromekill="ps ux | grep '[C]hrome Helper --type=renderer' | grep -v extension-process | tr -s ' ' | cut -d ' ' -f2 | xargs kill" - -# Lock the screen (when going AFK) -alias afk="/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend" - -# Reload the shell (i.e. invoke as a login shell) -alias reload="exec $SHELL -l" - -# Print each PATH entry on a separate line -alias path='echo -e ${PATH//:/\\n}' - -# Docker aliases -alias dx='docker exec -it' -alias dc='docker compose' -alias dcx='docker compose exec' -alias dcr='docker compose run' - -# Kubernetes aliases -alias k='kubectl' -alias kc='kubectl config' -alias kctxt='kubectl config use-context' - -# Terraform aliases -alias tf='terraform' -alias ti='terraform init' -alias tg='terraform get' -alias tp='terraform plan -out tfplan' -alias ta='terraform apply tfplan && rm tfplan' - -# AWS -alias aws_whoami='aws sts get-caller-identity' -# alias login_aws='docker run -it --rm -v ~/.aws/credentials:/root/.aws/credentials -v ~/.okta_aws_login_config:/root/.okta_aws_login_config gimme-aws-creds' -alias login_aws='aws sso login' -alias fedaws='aws-vault exec govcloud-dev -- ' - -alias reload_dotfiles='~/dotfiles/install && source ~/.zshrc' -alias reload_shell="exec $SHELL -l" - -alias gcom-dev='~/grafana/deployment_tools/scripts/gcom/gcom-dev' -alias gcom-ops='~/grafana/deployment_tools/scripts/gcom/gcom-ops' -alias gcom='~/grafana/deployment_tools/scripts/gcom/gcom' - -# Bazel alias to disable zsh auto-correction for bazel commands -alias bazel='nocorrect bazel' - diff --git a/.bash_profile b/.bash_profile deleted file mode 100644 index 2cbaf32..0000000 --- a/.bash_profile +++ /dev/null @@ -1,46 +0,0 @@ -# Load the shell dotfiles, and then some: -# * ~/.path can be used to extend `$PATH`. -# * ~/.extra can be used for other settings you don’t want to commit. -for file in ~/.{path,bash_prompt,exports,aliases,functions,extra,secrets}; do - [ -r "$file" ] && [ -f "$file" ] && source "$file"; -done; -unset file; - -# Case-insensitive globbing (used in pathname expansion) -shopt -s nocaseglob; - -# Append to the Bash history file, rather than overwriting it -shopt -s histappend; - -# Autocorrect typos in path names when using `cd` -shopt -s cdspell; - -# Enable some Bash 4 features when possible: -# * `autocd`, e.g. `**/qux` will enter `./foo/bar/baz/qux` -# * Recursive globbing, e.g. `echo **/*.txt` -for option in autocd globstar; do - shopt -s "$option" 2> /dev/null; -done; - -# Add tab completion for many Bash commands -if which brew &> /dev/null && [ -f "$(brew --prefix)/share/bash-completion/bash_completion" ]; then - source "$(brew --prefix)/share/bash-completion/bash_completion"; -elif [ -f /etc/bash_completion ]; then - source /etc/bash_completion; -fi; - -# Enable tab completion for `g` by marking it as an alias for `git` -if type _git &> /dev/null && [ -f /usr/local/etc/bash_completion.d/git-completion.bash ]; then - complete -o default -o nospace -F _git g; -fi; - -# Add tab completion for SSH hostnames based on ~/.ssh/config, ignoring wildcards -[ -e "$HOME/.ssh/config" ] && complete -o "default" -o "nospace" -W "$(grep "^Host" ~/.ssh/config | grep -v "[?*]" | cut -d " " -f2- | tr ' ' '\n')" scp sftp ssh; - -# Add tab completion for `defaults read|write NSGlobalDomain` -# You could just use `-g` instead, but I like being explicit -complete -W "NSGlobalDomain" defaults; - -# Add `killall` tab completion for common apps -complete -o "nospace" -W "Contacts Calendar Dock Finder Mail Safari iTunes SystemUIServer Terminal Twitter" killall; - diff --git a/.bash_prompt b/.bash_prompt deleted file mode 100644 index 1420885..0000000 --- a/.bash_prompt +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env bash - -# Shell prompt based on the Solarized Dark theme. -# Screenshot: http://i.imgur.com/EkEtphC.png -# Heavily inspired by @necolas’s prompt: https://github.com/necolas/dotfiles -# iTerm → Profiles → Text → use 13pt Monaco with 1.1 vertical spacing. - -if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then - export TERM='gnome-256color'; -elif infocmp xterm-256color >/dev/null 2>&1; then - export TERM='xterm-256color'; -fi; - -prompt_git() { - local s=''; - local branchName=''; - - # Check if the current directory is in a Git repository. - if [ $(git rev-parse --is-inside-work-tree &>/dev/null; echo "${?}") == '0' ]; then - - # check if the current directory is in .git before running git checks - if [ "$(git rev-parse --is-inside-git-dir 2> /dev/null)" == 'false' ]; then - - # Ensure the index is up to date. - git update-index --really-refresh -q &>/dev/null; - - # Check for uncommitted changes in the index. - if ! $(git diff --quiet --ignore-submodules --cached); then - s+='+'; - fi; - - # Check for unstaged changes. - if ! $(git diff-files --quiet --ignore-submodules --); then - s+='!'; - fi; - - # Check for untracked files. - if [ -n "$(git ls-files --others --exclude-standard)" ]; then - s+='?'; - fi; - - # Check for stashed files. - if $(git rev-parse --verify refs/stash &>/dev/null); then - s+='$'; - fi; - - fi; - - # Get the short symbolic ref. - # If HEAD isn’t a symbolic ref, get the short SHA for the latest commit - # Otherwise, just give up. - branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \ - git rev-parse --short HEAD 2> /dev/null || \ - echo '(unknown)')"; - - [ -n "${s}" ] && s=" [${s}]"; - - echo -e "${1}${branchName}${2}${s}"; - else - return; - fi; -} - -if tput setaf 1 &> /dev/null; then - tput sgr0; # reset colors - bold=$(tput bold); - reset=$(tput sgr0); - # Solarized colors, taken from http://git.io/solarized-colors. - black=$(tput setaf 0); - blue=$(tput setaf 33); - cyan=$(tput setaf 37); - green=$(tput setaf 64); - orange=$(tput setaf 166); - purple=$(tput setaf 125); - red=$(tput setaf 124); - violet=$(tput setaf 61); - white=$(tput setaf 15); - yellow=$(tput setaf 136); -else - bold=''; - reset="\e[0m"; - black="\e[1;30m"; - blue="\e[1;34m"; - cyan="\e[1;36m"; - green="\e[1;32m"; - orange="\e[1;33m"; - purple="\e[1;35m"; - red="\e[1;31m"; - violet="\e[1;35m"; - white="\e[1;37m"; - yellow="\e[1;33m"; -fi; - -# Highlight the user name when logged in as root. -if [[ "${USER}" == "root" ]]; then - userStyle="${red}"; -else - userStyle="${orange}"; -fi; - -# Highlight the hostname when connected via SSH. -if [[ "${SSH_TTY}" ]]; then - hostStyle="${bold}${red}"; -else - hostStyle="${yellow}"; -fi; - -# Set the terminal title and prompt. -PS1="\[\033]0;\W\007\]"; # working directory base name -PS1+="\[${bold}\]\n"; # newline -PS1+="\[${userStyle}\]\u"; # username -PS1+="\[${white}\] at "; -PS1+="\[${hostStyle}\]\h"; # host -PS1+="\[${white}\] in "; -PS1+="\[${green}\]\w"; # working directory full path -PS1+="\$(prompt_git \"\[${white}\] on \[${violet}\]\" \"\[${blue}\]\")"; # Git repository details -PS1+="\n"; -PS1+="\[${white}\]\$ \[${reset}\]"; # `$` (and reset color) -export PS1; - -PS2="\[${yellow}\]→ \[${reset}\]"; -export PS2; - -function aws_account_info { - [ "$AWS_ACCOUNT_NAME" ] && [ "$AWS_ACCOUNT_ROLE" ] && echo -n "aws:($AWS_ACCOUNT_NAME:$AWS_ACCOUNT_ROLE) " -} - -PROMPT_COMMAND='aws_account_info' diff --git a/.bashrc b/.bashrc deleted file mode 100644 index 1257002..0000000 --- a/.bashrc +++ /dev/null @@ -1 +0,0 @@ -[ -n "$PS1" ] && source ~/.bash_profile; diff --git a/.curlrc b/.curlrc deleted file mode 100644 index 481d94b..0000000 --- a/.curlrc +++ /dev/null @@ -1,8 +0,0 @@ -# Disguise as IE 9 on Windows 7. -user-agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" - -# When following a redirect, automatically set the previous URL as referer. -referer = ";auto" - -# Wait 60 seconds before timing out. -connect-timeout = 60 diff --git a/.exports b/.exports deleted file mode 100644 index c8fa9ac..0000000 --- a/.exports +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env bash - -# Make VSCode the default editor. -export EDITOR='code --wait'; - -# Enable persistent REPL history for `node`. -export NODE_REPL_HISTORY=~/.node_history; -# Allow 32³ entries; the default is 1000. -export NODE_REPL_HISTORY_SIZE='32768'; -# Use sloppy mode by default, matching web browsers. -export NODE_REPL_MODE='sloppy'; - -# Make Python use UTF-8 encoding for output to stdin, stdout, and stderr. -export PYTHONIOENCODING='UTF-8'; - -# Increase Bash history size. Allow 32³ entries; the default is 500. -export HISTSIZE='32768'; -export HISTFILESIZE="${HISTSIZE}"; -# Omit duplicates and commands that begin with a space from history. -export HISTCONTROL='ignoreboth'; - -# Prefer US English and use UTF-8. -export LANG='en_US.UTF-8'; -export LC_ALL='en_US.UTF-8'; - -# Highlight section titles in manual pages. -export LESS_TERMCAP_md="${yellow}"; - -# Don’t clear the screen after quitting a manual page. -export MANPAGER='less -X'; - -export PKG_CONFIG_PATH="/usr/local/opt/libpq/lib/pkgconfig" - -# # From https://knasmueller.net/how-to-install-java-openjdk-17-on-macos-big-sur -# Commenting out because it makes Bazel unhappy -# export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home - -export NVM_DIR="$HOME/.nvm" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion - -export GOPATH=$HOME/go/bin - -export DOCKER_DEFAULT_PLATFORM=linux/amd64 - -export AWS_PROFILE=govcloud-dev - -export ASDF_DATA_DIR=$HOME/.asdf -# Doing PATH here and not in the `path` file because path is loaded before exports -export PATH="$ASDF_DATA_DIR/shims:$PATH" - -export ANSIBLE_PYTHON_INTERPRETER=$HOME/.asdf/shims/python diff --git a/.extra b/.extra deleted file mode 100644 index 69638a2..0000000 --- a/.extra +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# This is so we don't have to enter the ssh key password every time we -# restart -ssh-add --apple-use-keychain ~/.ssh/id_ed25519 -ssh-add -l - -# [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function* - - -[[ -f $HOME/.kube/configs ]] && \ -[[ $(grep minikube $HOME/.kube/configs | wc -l ) != 0 ]] \ -|| echo "No errant kubeconfigs." diff --git a/.functions b/.functions deleted file mode 100644 index d6728d7..0000000 --- a/.functions +++ /dev/null @@ -1,279 +0,0 @@ -#!/usr/bin/env bash - -# Create a new directory and enter it -function mkd() { - mkdir -p "$@" && cd "$_"; -} - -# Change working directory to the top-most Finder window location -function cdf() { # short for `cdfinder` - cd "$(osascript -e 'tell app "Finder" to POSIX path of (insertion location as alias)')"; -} - -# Create a .tar.gz archive, using `zopfli`, `pigz` or `gzip` for compression -function targz() { - local tmpFile="${@%/}.tar"; - tar -cvf "${tmpFile}" --exclude=".DS_Store" "${@}" || return 1; - - size=$( - stat -f"%z" "${tmpFile}" 2> /dev/null; # macOS `stat` - stat -c"%s" "${tmpFile}" 2> /dev/null; # GNU `stat` - ); - - local cmd=""; - if (( size < 52428800 )) && hash zopfli 2> /dev/null; then - # the .tar file is smaller than 50 MB and Zopfli is available; use it - cmd="zopfli"; - else - if hash pigz 2> /dev/null; then - cmd="pigz"; - else - cmd="gzip"; - fi; - fi; - - echo "Compressing .tar ($((size / 1000)) kB) using \`${cmd}\`…"; - "${cmd}" -v "${tmpFile}" || return 1; - [ -f "${tmpFile}" ] && rm "${tmpFile}"; - - zippedSize=$( - stat -f"%z" "${tmpFile}.gz" 2> /dev/null; # macOS `stat` - stat -c"%s" "${tmpFile}.gz" 2> /dev/null; # GNU `stat` - ); - - echo "${tmpFile}.gz ($((zippedSize / 1000)) kB) created successfully."; -} - -# Determine size of a file or total size of a directory -function fs() { - if du -b /dev/null > /dev/null 2>&1; then - local arg=-sbh; - else - local arg=-sh; - fi - if [[ -n "$@" ]]; then - du $arg -- "$@"; - else - du $arg .[^.]* ./*; - fi; -} - -# Use Git’s colored diff when available -# hash git &>/dev/null; -# if [ $? -eq 0 ]; then -# function diff() { -# git diff --no-index --color-words "$@"; -# } -# fi; - -# Create a data URL from a file -function dataurl() { - local mimeType=$(file -b --mime-type "$1"); - if [[ $mimeType == text/* ]]; then - mimeType="${mimeType};charset=utf-8"; - fi - echo "data:${mimeType};base64,$(openssl base64 -in "$1" | tr -d '\n')"; -} - -# Create a git.io short URL -function gitio() { - if [ -z "${1}" -o -z "${2}" ]; then - echo "Usage: \`gitio slug url\`"; - return 1; - fi; - curl -i https://git.io/ -F "url=${2}" -F "code=${1}"; -} - -# Start an HTTP server from a directory, optionally specifying the port -function server() { - local port="${1:-8000}"; - sleep 1 && open "http://localhost:${port}/" & - # Set the default Content-Type to `text/plain` instead of `application/octet-stream` - # And serve everything as UTF-8 (although not technically correct, this doesn’t break anything for binary files) - python -c $'import SimpleHTTPServer;\nmap = SimpleHTTPServer.SimpleHTTPRequestHandler.extensions_map;\nmap[""] = "text/plain";\nfor key, value in map.items():\n\tmap[key] = value + ";charset=UTF-8";\nSimpleHTTPServer.test();' "$port"; -} - -# Start a PHP server from a directory, optionally specifying the port -# (Requires PHP 5.4.0+.) -function phpserver() { - local port="${1:-4000}"; - local ip=$(ipconfig getifaddr en1); - sleep 1 && open "http://${ip}:${port}/" & - php -S "${ip}:${port}"; -} - -# Compare original and gzipped file size -function gz() { - local origsize=$(wc -c < "$1"); - local gzipsize=$(gzip -c "$1" | wc -c); - local ratio=$(echo "$gzipsize * 100 / $origsize" | bc -l); - printf "orig: %d bytes\n" "$origsize"; - printf "gzip: %d bytes (%2.2f%%)\n" "$gzipsize" "$ratio"; -} - -# Syntax-highlight JSON strings or files -# Usage: `json '{"foo":42}'` or `echo '{"foo":42}' | json` -function json() { - if [ -t 0 ]; then # argument - python -mjson.tool <<< "$*" | pygmentize -l javascript; - else # pipe - python -mjson.tool | pygmentize -l javascript; - fi; -} - -# Run `dig` and display the most useful info -function digga() { - dig +nocmd "$1" any +multiline +noall +answer; -} - -# UTF-8-encode a string of Unicode symbols -function escape() { - printf "\\\x%s" $(printf "$@" | xxd -p -c1 -u); - # print a newline unless we’re piping the output to another program - if [ -t 1 ]; then - echo ""; # newline - fi; -} - -# Decode \x{ABCD}-style Unicode escape sequences -function unidecode() { - perl -e "binmode(STDOUT, ':utf8'); print \"$@\""; - # print a newline unless we’re piping the output to another program - if [ -t 1 ]; then - echo ""; # newline - fi; -} - -# Get a character’s Unicode code point -function codepoint() { - perl -e "use utf8; print sprintf('U+%04X', ord(\"$@\"))"; - # print a newline unless we’re piping the output to another program - if [ -t 1 ]; then - echo ""; # newline - fi; -} - -# Show all the names (CNs and SANs) listed in the SSL certificate -# for a given domain -function getcertnames() { - if [ -z "${1}" ]; then - echo "ERROR: No domain specified."; - return 1; - fi; - - local domain="${1}"; - echo "Testing ${domain}…"; - echo ""; # newline - - local tmp=$(echo -e "GET / HTTP/1.0\nEOT" \ - | openssl s_client -connect "${domain}:443" -servername "${domain}" 2>&1); - - if [[ "${tmp}" = *"-----BEGIN CERTIFICATE-----"* ]]; then - local certText=$(echo "${tmp}" \ - | openssl x509 -text -certopt "no_aux, no_header, no_issuer, no_pubkey, \ - no_serial, no_sigdump, no_signame, no_validity, no_version"); - echo "Common Name:"; - echo ""; # newline - echo "${certText}" | grep "Subject:" | sed -e "s/^.*CN=//" | sed -e "s/\/emailAddress=.*//"; - echo ""; # newline - echo "Subject Alternative Name(s):"; - echo ""; # newline - echo "${certText}" | grep -A 1 "Subject Alternative Name:" \ - | sed -e "2s/DNS://g" -e "s/ //g" | tr "," "\n" | tail -n +2; - return 0; - else - echo "ERROR: Certificate not found."; - return 1; - fi; -} - - - -# `v` with no arguments opens the current directory in Vim, otherwise opens the -# given location -function v() { - if [ $# -eq 0 ]; then - vim .; - else - vim "$@"; - fi; -} - -# `o` with no arguments opens the current directory, otherwise opens the given -# location -function o() { - if [ $# -eq 0 ]; then - open .; - else - open "$@"; - fi; -} - -# `tre` is a shorthand for `tree` with hidden files and color enabled, ignoring -# the `.git` directory, listing directories first. The output gets piped into -# `less` with options to preserve color and line numbers, unless the output is -# small enough for one screen. -function tre() { - tree -aC -I '.git|node_modules|bower_components' --dirsfirst "$@" | less -FRNX; -} - -function initConfigVar () { - if [[ $(ls ~/.kube/configs | grep kubeconfig | wc -l) != 0 ]]; then - for f in `ls ~/.kube/configs/ | grep kubeconfig`; - do export KUBECONFIG="$HOME/.kube/configs/$f:$KUBECONFIG"; done && \ - export KUBECONFIG=$(echo $KUBECONFIG | sed 's/:$//') - fi -} -if [[ -d $HOME/.kube/configs ]] && initConfigVar; then - kubectl config get-contexts -else - mkdir $HOME/.kube/configs && \ - echo "No configs directory. Put kubeconfigs in $HOME/.kube/configs/ and source this profile to load." -fi - -# deletes local branches that are not ahead of master / are deleted remotely -function clean_branches() { - REMOTES="$@"; - if [ -z "$REMOTES" ]; then - REMOTES=$(git remote); - fi - REMOTES=$(echo "$REMOTES" | xargs -n1 echo) - RBRANCHES=() - while read REMOTE; do - CURRBRANCHES=($(git ls-remote $REMOTE | awk '{print $2}' | grep 'refs/heads/' | sed 's:refs/heads/::')) - RBRANCHES=("${CURRBRANCHES[@]}" "${RBRANCHES[@]}") - done < <(echo "$REMOTES" ) - [[ $RBRANCHES ]] || exit - LBRANCHES=($(git branch | sed 's:\*::' | awk '{print $1}')) - for i in "${LBRANCHES[@]}"; do - skip= - for j in "${RBRANCHES[@]}"; do - [[ $i == $j ]] && { skip=1; echo -e "\033[32m Keeping $i \033[0m"; break; } - done - [[ -n $skip ]] || { echo -e "\033[31m $(git branch -D $i) \033[0m"; } - done -} - -function profile() { - export AWS_PROFILE=$1 -} - -function download_secret() { - local SECRET_NAME=$1 - local OUTPUT_FILE="${2:-secrets.json}" - - aws secretsmanager get-secret-value \ - --secret-id ${SECRET_NAME} \ - | jq -S '.SecretString | fromjson' \ - > $(pwd)/${OUTPUT_FILE} -} - -function upload_secret() { - local SECRET_NAME=$1 - local INPUT_FILE="${2:-secrets.json}" - - aws secretsmanager put-secret-value \ - --secret-id ${SECRET_NAME} \ - --secret-string file://$(pwd)/${INPUT_FILE} -} - diff --git a/.gdbinit b/.gdbinit deleted file mode 100644 index 9422460..0000000 --- a/.gdbinit +++ /dev/null @@ -1 +0,0 @@ -set disassembly-flavor intel diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c175cc4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: ci + +on: + pull_request: + push: + branches: [main] + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 # full history so gitleaks scans everything + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install shellcheck and shfmt + run: | + sudo apt-get update + sudo apt-get install -y shellcheck + curl -fsSL -o /tmp/shfmt https://github.com/mvdan/sh/releases/download/v3.8.0/shfmt_v3.8.0_linux_amd64 + chmod +x /tmp/shfmt + sudo mv /tmp/shfmt /usr/local/bin/shfmt + + - name: Run pre-commit + uses: pre-commit/action@v3.0.1 + + gitleaks-history: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Install gitleaks + run: | + curl -fsSL -o /tmp/gitleaks.tar.gz https://github.com/gitleaks/gitleaks/releases/download/v8.18.4/gitleaks_8.18.4_linux_x64.tar.gz + tar -xzf /tmp/gitleaks.tar.gz -C /tmp gitleaks + sudo mv /tmp/gitleaks /usr/local/bin/gitleaks + + - name: Full-history gitleaks scan + run: gitleaks detect --no-banner --redact diff --git a/.gitignore b/.gitignore index 0bb7624..85045d5 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,9 @@ Thumbs.db .Spotlight-V100 .Trashes .secrets + +# Local Claude Code project state and overrides +.claude/ + +# nvim transient log +.nvimlog diff --git a/.gitleaks.toml b/.gitleaks.toml new file mode 100644 index 0000000..cea2cb9 --- /dev/null +++ b/.gitleaks.toml @@ -0,0 +1,13 @@ +# Use the upstream default ruleset, with a small allowlist for +# template/example files that legitimately contain placeholder values. + +[extend] +useDefault = true + +[allowlist] +description = "Template and example files" +paths = [ + '''\.example$''', + '''\.tmpl$''', + '''shell/local\.zsh\.example$''', +] diff --git a/.gvimrc b/.gvimrc deleted file mode 100644 index d2044d0..0000000 --- a/.gvimrc +++ /dev/null @@ -1,9 +0,0 @@ -" Use the Solarized Dark theme -set background=dark -colorscheme solarized -" Use 14pt Monaco -set guifont=Monaco:h14 -" Don’t blink cursor in normal mode -set guicursor=n:blinkon0 -" Better line-height -set linespace=8 diff --git a/.hgignore b/.hgignore deleted file mode 100644 index ac1973e..0000000 --- a/.hgignore +++ /dev/null @@ -1,17 +0,0 @@ -# Use shell-style glob syntax -syntax: glob - -# Compiled Python files -*.pyc - -# Folder view configuration files -.DS_Store -Desktop.ini - -# Thumbnail cache files -._* -Thumbs.db - -# Files that might appear on external disks -.Spotlight-V100 -.Trashes diff --git a/.hushlogin b/.hushlogin deleted file mode 100644 index bff8a51..0000000 --- a/.hushlogin +++ /dev/null @@ -1,4 +0,0 @@ -# The mere presence of this file in the home directory disables the system -# copyright notice, the date and time of the last login, the message of the -# day as well as other information that may otherwise appear on login. -# See `man login`. diff --git a/.inputrc b/.inputrc deleted file mode 100644 index 942281a..0000000 --- a/.inputrc +++ /dev/null @@ -1,40 +0,0 @@ -# Make Tab autocomplete regardless of filename case -set completion-ignore-case on - -# List all matches in case multiple possible completions are possible -set show-all-if-ambiguous on - -# Immediately add a trailing slash when autocompleting symlinks to directories -set mark-symlinked-directories on - -# Use the text that has already been typed as the prefix for searching through -# commands (i.e. more intelligent Up/Down behavior) -"\e[B": history-search-forward -"\e[A": history-search-backward - -# Do not autocomplete hidden files unless the pattern explicitly begins with a dot -set match-hidden-files off - -# Show all autocomplete results at once -set page-completions off - -# If there are more than 200 possible completions for a word, ask to show them all -set completion-query-items 200 - -# Show extra file information when completing, like `ls -F` does -set visible-stats on - -# Be more intelligent when autocompleting by also looking at the text after -# the cursor. For example, when the current line is "cd ~/src/mozil", and -# the cursor is on the "z", pressing Tab will not autocomplete it to "cd -# ~/src/mozillail", but to "cd ~/src/mozilla". (This is supported by the -# Readline used by Bash 4.) -set skip-completed-text on - -# Allow UTF-8 input and output, instead of showing stuff like $'\0123\0456' -set input-meta on -set output-meta on -set convert-meta off - -# Use Alt/Meta + Delete to delete the preceding word -"\e[3;3~": kill-word diff --git a/.macos b/.macos deleted file mode 100755 index 29009c5..0000000 --- a/.macos +++ /dev/null @@ -1,922 +0,0 @@ -#!/usr/bin/env bash - -# ~/.macos — https://mths.be/macos - -# Close any open System Preferences panes, to prevent them from overriding -# settings we’re about to change -osascript -e 'tell application "System Preferences" to quit' - -# Ask for the administrator password upfront -sudo -v - -# Keep-alive: update existing `sudo` time stamp until `.macos` has finished -while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null & - -############################################################################### -# General UI/UX # -############################################################################### - -# Set computer name (as done via System Preferences → Sharing) -#sudo scutil --set ComputerName "0x6D746873" -#sudo scutil --set HostName "0x6D746873" -#sudo scutil --set LocalHostName "0x6D746873" -#sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName -string "0x6D746873" - -# Set standby delay to 24 hours (default is 1 hour) -sudo pmset -a standbydelay 86400 - -# Disable the sound effects on boot -sudo nvram SystemAudioVolume=" " - -# Disable transparency in the menu bar and elsewhere on Yosemite -defaults write com.apple.universalaccess reduceTransparency -bool true - -# Menu bar: hide the Time Machine, Volume, and User icons -for domain in ~/Library/Preferences/ByHost/com.apple.systemuiserver.*; do - defaults write "${domain}" dontAutoLoad -array \ - "/System/Library/CoreServices/Menu Extras/TimeMachine.menu" \ - "/System/Library/CoreServices/Menu Extras/Volume.menu" \ - "/System/Library/CoreServices/Menu Extras/User.menu" -done -defaults write com.apple.systemuiserver menuExtras -array \ - "/System/Library/CoreServices/Menu Extras/Bluetooth.menu" \ - "/System/Library/CoreServices/Menu Extras/AirPort.menu" \ - "/System/Library/CoreServices/Menu Extras/Battery.menu" \ - "/System/Library/CoreServices/Menu Extras/Clock.menu" - -# Set highlight color to green -defaults write NSGlobalDomain AppleHighlightColor -string "0.764700 0.976500 0.568600" - -# Set sidebar icon size to medium -defaults write NSGlobalDomain NSTableViewDefaultSizeMode -int 2 - -# Always show scrollbars -defaults write NSGlobalDomain AppleShowScrollBars -string "Always" -# Possible values: `WhenScrolling`, `Automatic` and `Always` - -# Disable the over-the-top focus ring animation -defaults write NSGlobalDomain NSUseAnimatedFocusRing -bool false - -# Disable smooth scrolling -# (Uncomment if you’re on an older Mac that messes up the animation) -#defaults write NSGlobalDomain NSScrollAnimationEnabled -bool false - -# Increase window resize speed for Cocoa applications -defaults write NSGlobalDomain NSWindowResizeTime -float 0.001 - -# Expand save panel by default -defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true -defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true - -# Expand print panel by default -defaults write NSGlobalDomain PMPrintingExpandedStateForPrint -bool true -defaults write NSGlobalDomain PMPrintingExpandedStateForPrint2 -bool true - -# Save to disk (not to iCloud) by default -defaults write NSGlobalDomain NSDocumentSaveNewDocumentsToCloud -bool false - -# Automatically quit printer app once the print jobs complete -defaults write com.apple.print.PrintingPrefs "Quit When Finished" -bool true - -# Disable the “Are you sure you want to open this application?” dialog -defaults write com.apple.LaunchServices LSQuarantine -bool false - -# Remove duplicates in the “Open With” menu (also see `lscleanup` alias) -/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user - -# Display ASCII control characters using caret notation in standard text views -# Try e.g. `cd /tmp; unidecode "\x{0000}" > cc.txt; open -e cc.txt` -defaults write NSGlobalDomain NSTextShowsControlCharacters -bool true - -# Disable Resume system-wide -defaults write com.apple.systempreferences NSQuitAlwaysKeepsWindows -bool false - -# Disable automatic termination of inactive apps -defaults write NSGlobalDomain NSDisableAutomaticTermination -bool true - -# Disable the crash reporter -#defaults write com.apple.CrashReporter DialogType -string "none" - -# Set Help Viewer windows to non-floating mode -defaults write com.apple.helpviewer DevMode -bool true - -# Fix for the ancient UTF-8 bug in QuickLook (https://mths.be/bbo) -# Commented out, as this is known to cause problems in various Adobe apps :( -# See https://github.com/mathiasbynens/dotfiles/issues/237 -#echo "0x08000100:0" > ~/.CFUserTextEncoding - -# Reveal IP address, hostname, OS version, etc. when clicking the clock -# in the login window -sudo defaults write /Library/Preferences/com.apple.loginwindow AdminHostInfo HostName - -# Restart automatically if the computer freezes -sudo systemsetup -setrestartfreeze on - -# Never go into computer sleep mode -sudo systemsetup -setcomputersleep Off > /dev/null - -# Disable Notification Center and remove the menu bar icon -launchctl unload -w /System/Library/LaunchAgents/com.apple.notificationcenterui.plist 2> /dev/null - -# Disable smart quotes as they’re annoying when typing code -defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false - -# Disable smart dashes as they’re annoying when typing code -defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false - -# Set a custom wallpaper image. `DefaultDesktop.jpg` is already a symlink, and -# all wallpapers are in `/Library/Desktop Pictures/`. The default is `Wave.jpg`. -#rm -rf ~/Library/Application Support/Dock/desktoppicture.db -#sudo rm -rf /System/Library/CoreServices/DefaultDesktop.jpg -#sudo ln -s /path/to/your/image /System/Library/CoreServices/DefaultDesktop.jpg - -############################################################################### -# SSD-specific tweaks # -############################################################################### - -# Disable hibernation (speeds up entering sleep mode) -sudo pmset -a hibernatemode 0 - -# Remove the sleep image file to save disk space -sudo rm /private/var/vm/sleepimage -# Create a zero-byte file instead… -sudo touch /private/var/vm/sleepimage -# …and make sure it can’t be rewritten -sudo chflags uchg /private/var/vm/sleepimage - -# Disable the sudden motion sensor as it’s not useful for SSDs -sudo pmset -a sms 0 - -############################################################################### -# Trackpad, mouse, keyboard, Bluetooth accessories, and input # -############################################################################### - -# Trackpad: enable tap to click for this user and for the login screen -defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true -defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1 -defaults write NSGlobalDomain com.apple.mouse.tapBehavior -int 1 - -# Trackpad: map bottom right corner to right-click -defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadCornerSecondaryClick -int 2 -defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadRightClick -bool true -defaults -currentHost write NSGlobalDomain com.apple.trackpad.trackpadCornerClickBehavior -int 1 -defaults -currentHost write NSGlobalDomain com.apple.trackpad.enableSecondaryClick -bool true - -# Disable “natural” (Lion-style) scrolling -defaults write NSGlobalDomain com.apple.swipescrolldirection -bool false - -# Increase sound quality for Bluetooth headphones/headsets -defaults write com.apple.BluetoothAudioAgent "Apple Bitpool Min (editable)" -int 40 - -# Enable full keyboard access for all controls -# (e.g. enable Tab in modal dialogs) -defaults write NSGlobalDomain AppleKeyboardUIMode -int 3 - -# Use scroll gesture with the Ctrl (^) modifier key to zoom -defaults write com.apple.universalaccess closeViewScrollWheelToggle -bool true -defaults write com.apple.universalaccess HIDScrollZoomModifierMask -int 262144 -# Follow the keyboard focus while zoomed in -defaults write com.apple.universalaccess closeViewZoomFollowsFocus -bool true - -# Disable press-and-hold for keys in favor of key repeat -defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false - -# Set a blazingly fast keyboard repeat rate -defaults write NSGlobalDomain KeyRepeat -int 1 -defaults write NSGlobalDomain InitialKeyRepeat -int 10 - -# Set language and text formats -# Note: if you’re in the US, replace `EUR` with `USD`, `Centimeters` with -# `Inches`, `en_GB` with `en_US`, and `true` with `false`. -defaults write NSGlobalDomain AppleLanguages -array "en" "nl" -defaults write NSGlobalDomain AppleLocale -string "en_GB@currency=EUR" -defaults write NSGlobalDomain AppleMeasurementUnits -string "Centimeters" -defaults write NSGlobalDomain AppleMetricUnits -bool true - -# Set the timezone; see `sudo systemsetup -listtimezones` for other values -sudo systemsetup -settimezone "Europe/Brussels" > /dev/null - -# Disable auto-correct -defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false - -# Stop iTunes from responding to the keyboard media keys -#launchctl unload -w /System/Library/LaunchAgents/com.apple.rcd.plist 2> /dev/null - -############################################################################### -# Screen # -############################################################################### - -# Require password immediately after sleep or screen saver begins -defaults write com.apple.screensaver askForPassword -int 1 -defaults write com.apple.screensaver askForPasswordDelay -int 0 - -# Save screenshots to the desktop -defaults write com.apple.screencapture location -string "${HOME}/Desktop" - -# Save screenshots in PNG format (other options: BMP, GIF, JPG, PDF, TIFF) -defaults write com.apple.screencapture type -string "png" - -# Disable shadow in screenshots -defaults write com.apple.screencapture disable-shadow -bool true - -# Enable subpixel font rendering on non-Apple LCDs -defaults write NSGlobalDomain AppleFontSmoothing -int 2 - -# Enable HiDPI display modes (requires restart) -sudo defaults write /Library/Preferences/com.apple.windowserver DisplayResolutionEnabled -bool true - -############################################################################### -# Finder # -############################################################################### - -# Finder: allow quitting via ⌘ + Q; doing so will also hide desktop icons -defaults write com.apple.finder QuitMenuItem -bool true - -# Finder: disable window animations and Get Info animations -defaults write com.apple.finder DisableAllAnimations -bool true - -# Set Desktop as the default location for new Finder windows -# For other paths, use `PfLo` and `file:///full/path/here/` -defaults write com.apple.finder NewWindowTarget -string "PfDe" -defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/Desktop/" - -# Show icons for hard drives, servers, and removable media on the desktop -defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true -defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true -defaults write com.apple.finder ShowMountedServersOnDesktop -bool true -defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true - -# Finder: show hidden files by default -#defaults write com.apple.finder AppleShowAllFiles -bool true - -# Finder: show all filename extensions -defaults write NSGlobalDomain AppleShowAllExtensions -bool true - -# Finder: show status bar -defaults write com.apple.finder ShowStatusBar -bool true - -# Finder: show path bar -defaults write com.apple.finder ShowPathbar -bool true - -# Display full POSIX path as Finder window title -defaults write com.apple.finder _FXShowPosixPathInTitle -bool true - -# Keep folders on top when sorting by name -defaults write com.apple.finder _FXSortFoldersFirst -bool true - -# When performing a search, search the current folder by default -defaults write com.apple.finder FXDefaultSearchScope -string "SCcf" - -# Disable the warning when changing a file extension -defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false - -# Enable spring loading for directories -defaults write NSGlobalDomain com.apple.springing.enabled -bool true - -# Remove the spring loading delay for directories -defaults write NSGlobalDomain com.apple.springing.delay -float 0 - -# Avoid creating .DS_Store files on network or USB volumes -defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true -defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true - -# Disable disk image verification -defaults write com.apple.frameworks.diskimages skip-verify -bool true -defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true -defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true - -# Automatically open a new Finder window when a volume is mounted -defaults write com.apple.frameworks.diskimages auto-open-ro-root -bool true -defaults write com.apple.frameworks.diskimages auto-open-rw-root -bool true -defaults write com.apple.finder OpenWindowForNewRemovableDisk -bool true - -# Show item info near icons on the desktop and in other icon views -/usr/libexec/PlistBuddy -c "Set :DesktopViewSettings:IconViewSettings:showItemInfo true" ~/Library/Preferences/com.apple.finder.plist -/usr/libexec/PlistBuddy -c "Set :FK_StandardViewSettings:IconViewSettings:showItemInfo true" ~/Library/Preferences/com.apple.finder.plist -/usr/libexec/PlistBuddy -c "Set :StandardViewSettings:IconViewSettings:showItemInfo true" ~/Library/Preferences/com.apple.finder.plist - -# Show item info to the right of the icons on the desktop -/usr/libexec/PlistBuddy -c "Set DesktopViewSettings:IconViewSettings:labelOnBottom false" ~/Library/Preferences/com.apple.finder.plist - -# Enable snap-to-grid for icons on the desktop and in other icon views -/usr/libexec/PlistBuddy -c "Set :DesktopViewSettings:IconViewSettings:arrangeBy grid" ~/Library/Preferences/com.apple.finder.plist -/usr/libexec/PlistBuddy -c "Set :FK_StandardViewSettings:IconViewSettings:arrangeBy grid" ~/Library/Preferences/com.apple.finder.plist -/usr/libexec/PlistBuddy -c "Set :StandardViewSettings:IconViewSettings:arrangeBy grid" ~/Library/Preferences/com.apple.finder.plist - -# Increase grid spacing for icons on the desktop and in other icon views -/usr/libexec/PlistBuddy -c "Set :DesktopViewSettings:IconViewSettings:gridSpacing 100" ~/Library/Preferences/com.apple.finder.plist -/usr/libexec/PlistBuddy -c "Set :FK_StandardViewSettings:IconViewSettings:gridSpacing 100" ~/Library/Preferences/com.apple.finder.plist -/usr/libexec/PlistBuddy -c "Set :StandardViewSettings:IconViewSettings:gridSpacing 100" ~/Library/Preferences/com.apple.finder.plist - -# Increase the size of icons on the desktop and in other icon views -/usr/libexec/PlistBuddy -c "Set :DesktopViewSettings:IconViewSettings:iconSize 80" ~/Library/Preferences/com.apple.finder.plist -/usr/libexec/PlistBuddy -c "Set :FK_StandardViewSettings:IconViewSettings:iconSize 80" ~/Library/Preferences/com.apple.finder.plist -/usr/libexec/PlistBuddy -c "Set :StandardViewSettings:IconViewSettings:iconSize 80" ~/Library/Preferences/com.apple.finder.plist - -# Use list view in all Finder windows by default -# Four-letter codes for the other view modes: `icnv`, `clmv`, `Flwv` -defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv" - -# Disable the warning before emptying the Trash -defaults write com.apple.finder WarnOnEmptyTrash -bool false - -# Enable AirDrop over Ethernet and on unsupported Macs running Lion -defaults write com.apple.NetworkBrowser BrowseAllInterfaces -bool true - -# Enable the MacBook Air SuperDrive on any Mac -sudo nvram boot-args="mbasd=1" - -# Show the ~/Library folder -chflags nohidden ~/Library - -# Show the /Volumes folder -sudo chflags nohidden /Volumes - -# Remove Dropbox’s green checkmark icons in Finder -file=/Applications/Dropbox.app/Contents/Resources/emblem-dropbox-uptodate.icns -[ -e "${file}" ] && mv -f "${file}" "${file}.bak" - -# Expand the following File Info panes: -# “General”, “Open with”, and “Sharing & Permissions” -defaults write com.apple.finder FXInfoPanesExpanded -dict \ - General -bool true \ - OpenWith -bool true \ - Privileges -bool true - -############################################################################### -# Dock, Dashboard, and hot corners # -############################################################################### - -# Enable highlight hover effect for the grid view of a stack (Dock) -defaults write com.apple.dock mouse-over-hilite-stack -bool true - -# Set the icon size of Dock items to 36 pixels -defaults write com.apple.dock tilesize -int 36 - -# Change minimize/maximize window effect -defaults write com.apple.dock mineffect -string "scale" - -# Minimize windows into their application’s icon -defaults write com.apple.dock minimize-to-application -bool true - -# Enable spring loading for all Dock items -defaults write com.apple.dock enable-spring-load-actions-on-all-items -bool true - -# Show indicator lights for open applications in the Dock -defaults write com.apple.dock show-process-indicators -bool true - -# Wipe all (default) app icons from the Dock -# This is only really useful when setting up a new Mac, or if you don’t use -# the Dock to launch apps. -#defaults write com.apple.dock persistent-apps -array - -# Show only open applications in the Dock -#defaults write com.apple.dock static-only -bool true - -# Don’t animate opening applications from the Dock -defaults write com.apple.dock launchanim -bool false - -# Speed up Mission Control animations -defaults write com.apple.dock expose-animation-duration -float 0.1 - -# Don’t group windows by application in Mission Control -# (i.e. use the old Exposé behavior instead) -defaults write com.apple.dock expose-group-by-app -bool false - -# Disable Dashboard -defaults write com.apple.dashboard mcx-disabled -bool true - -# Don’t show Dashboard as a Space -defaults write com.apple.dock dashboard-in-overlay -bool true - -# Don’t automatically rearrange Spaces based on most recent use -defaults write com.apple.dock mru-spaces -bool false - -# Remove the auto-hiding Dock delay -defaults write com.apple.dock autohide-delay -float 0 -# Remove the animation when hiding/showing the Dock -defaults write com.apple.dock autohide-time-modifier -float 0 - -# Automatically hide and show the Dock -defaults write com.apple.dock autohide -bool true - -# Make Dock icons of hidden applications translucent -defaults write com.apple.dock showhidden -bool true - -# Disable the Launchpad gesture (pinch with thumb and three fingers) -#defaults write com.apple.dock showLaunchpadGestureEnabled -int 0 - -# Reset Launchpad, but keep the desktop wallpaper intact -find "${HOME}/Library/Application Support/Dock" -name "*-*.db" -maxdepth 1 -delete - -# Add iOS & Watch Simulator to Launchpad -sudo ln -sf "/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app" "/Applications/Simulator.app" -sudo ln -sf "/Applications/Xcode.app/Contents/Developer/Applications/Simulator (Watch).app" "/Applications/Simulator (Watch).app" - -# Add a spacer to the left side of the Dock (where the applications are) -#defaults write com.apple.dock persistent-apps -array-add '{tile-data={}; tile-type="spacer-tile";}' -# Add a spacer to the right side of the Dock (where the Trash is) -#defaults write com.apple.dock persistent-others -array-add '{tile-data={}; tile-type="spacer-tile";}' - -# Hot corners -# Possible values: -# 0: no-op -# 2: Mission Control -# 3: Show application windows -# 4: Desktop -# 5: Start screen saver -# 6: Disable screen saver -# 7: Dashboard -# 10: Put display to sleep -# 11: Launchpad -# 12: Notification Center -# Top left screen corner → Mission Control -defaults write com.apple.dock wvous-tl-corner -int 2 -defaults write com.apple.dock wvous-tl-modifier -int 0 -# Top right screen corner → Desktop -defaults write com.apple.dock wvous-tr-corner -int 4 -defaults write com.apple.dock wvous-tr-modifier -int 0 -# Bottom left screen corner → Start screen saver -defaults write com.apple.dock wvous-bl-corner -int 5 -defaults write com.apple.dock wvous-bl-modifier -int 0 - -############################################################################### -# Safari & WebKit # -############################################################################### - -# Privacy: don’t send search queries to Apple -defaults write com.apple.Safari UniversalSearchEnabled -bool false -defaults write com.apple.Safari SuppressSearchSuggestions -bool true - -# Press Tab to highlight each item on a web page -defaults write com.apple.Safari WebKitTabToLinksPreferenceKey -bool true -defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2TabsToLinks -bool true - -# Show the full URL in the address bar (note: this still hides the scheme) -defaults write com.apple.Safari ShowFullURLInSmartSearchField -bool true - -# Set Safari’s home page to `about:blank` for faster loading -defaults write com.apple.Safari HomePage -string "about:blank" - -# Prevent Safari from opening ‘safe’ files automatically after downloading -defaults write com.apple.Safari AutoOpenSafeDownloads -bool false - -# Allow hitting the Backspace key to go to the previous page in history -defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2BackspaceKeyNavigationEnabled -bool true - -# Hide Safari’s bookmarks bar by default -defaults write com.apple.Safari ShowFavoritesBar -bool false - -# Hide Safari’s sidebar in Top Sites -defaults write com.apple.Safari ShowSidebarInTopSites -bool false - -# Disable Safari’s thumbnail cache for History and Top Sites -defaults write com.apple.Safari DebugSnapshotsUpdatePolicy -int 2 - -# Enable Safari’s debug menu -defaults write com.apple.Safari IncludeInternalDebugMenu -bool true - -# Make Safari’s search banners default to Contains instead of Starts With -defaults write com.apple.Safari FindOnPageMatchesWordStartsOnly -bool false - -# Remove useless icons from Safari’s bookmarks bar -defaults write com.apple.Safari ProxiesInBookmarksBar "()" - -# Enable the Develop menu and the Web Inspector in Safari -defaults write com.apple.Safari IncludeDevelopMenu -bool true -defaults write com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true -defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2DeveloperExtrasEnabled -bool true - -# Add a context menu item for showing the Web Inspector in web views -defaults write NSGlobalDomain WebKitDeveloperExtras -bool true - -# Enable continuous spellchecking -defaults write com.apple.Safari WebContinuousSpellCheckingEnabled -bool true -# Disable auto-correct -defaults write com.apple.Safari WebAutomaticSpellingCorrectionEnabled -bool false - -# Disable AutoFill -defaults write com.apple.Safari AutoFillFromAddressBook -bool false -defaults write com.apple.Safari AutoFillPasswords -bool false -defaults write com.apple.Safari AutoFillCreditCardData -bool false -defaults write com.apple.Safari AutoFillMiscellaneousForms -bool false - -# Warn about fraudulent websites -defaults write com.apple.Safari WarnAboutFraudulentWebsites -bool true - -# Disable plug-ins -defaults write com.apple.Safari WebKitPluginsEnabled -bool false -defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2PluginsEnabled -bool false - -# Disable Java -defaults write com.apple.Safari WebKitJavaEnabled -bool false -defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2JavaEnabled -bool false - -# Block pop-up windows -defaults write com.apple.Safari WebKitJavaScriptCanOpenWindowsAutomatically -bool false -defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2JavaScriptCanOpenWindowsAutomatically -bool false - -# Enable “Do Not Track” -defaults write com.apple.Safari SendDoNotTrackHTTPHeader -bool true - -# Update extensions automatically -defaults write com.apple.Safari InstallExtensionUpdatesAutomatically -bool true - -############################################################################### -# Mail # -############################################################################### - -# Disable send and reply animations in Mail.app -defaults write com.apple.mail DisableReplyAnimations -bool true -defaults write com.apple.mail DisableSendAnimations -bool true - -# Copy email addresses as `foo@example.com` instead of `Foo Bar ` in Mail.app -defaults write com.apple.mail AddressesIncludeNameOnPasteboard -bool false - -# Add the keyboard shortcut ⌘ + Enter to send an email in Mail.app -defaults write com.apple.mail NSUserKeyEquivalents -dict-add "Send" "@\U21a9" - -# Display emails in threaded mode, sorted by date (oldest at the top) -defaults write com.apple.mail DraftsViewerAttributes -dict-add "DisplayInThreadedMode" -string "yes" -defaults write com.apple.mail DraftsViewerAttributes -dict-add "SortedDescending" -string "yes" -defaults write com.apple.mail DraftsViewerAttributes -dict-add "SortOrder" -string "received-date" - -# Disable inline attachments (just show the icons) -defaults write com.apple.mail DisableInlineAttachmentViewing -bool true - -# Disable automatic spell checking -defaults write com.apple.mail SpellCheckingBehavior -string "NoSpellCheckingEnabled" - -############################################################################### -# Spotlight # -############################################################################### - -# Hide Spotlight tray-icon (and subsequent helper) -#sudo chmod 600 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search -# Disable Spotlight indexing for any volume that gets mounted and has not yet -# been indexed before. -# Use `sudo mdutil -i off "/Volumes/foo"` to stop indexing any volume. -sudo defaults write /.Spotlight-V100/VolumeConfiguration Exclusions -array "/Volumes" -# Change indexing order and disable some search results -# Yosemite-specific search results (remove them if you are using macOS 10.9 or older): -# MENU_DEFINITION -# MENU_CONVERSION -# MENU_EXPRESSION -# MENU_SPOTLIGHT_SUGGESTIONS (send search queries to Apple) -# MENU_WEBSEARCH (send search queries to Apple) -# MENU_OTHER -defaults write com.apple.spotlight orderedItems -array \ - '{"enabled" = 1;"name" = "APPLICATIONS";}' \ - '{"enabled" = 1;"name" = "SYSTEM_PREFS";}' \ - '{"enabled" = 1;"name" = "DIRECTORIES";}' \ - '{"enabled" = 1;"name" = "PDF";}' \ - '{"enabled" = 1;"name" = "FONTS";}' \ - '{"enabled" = 0;"name" = "DOCUMENTS";}' \ - '{"enabled" = 0;"name" = "MESSAGES";}' \ - '{"enabled" = 0;"name" = "CONTACT";}' \ - '{"enabled" = 0;"name" = "EVENT_TODO";}' \ - '{"enabled" = 0;"name" = "IMAGES";}' \ - '{"enabled" = 0;"name" = "BOOKMARKS";}' \ - '{"enabled" = 0;"name" = "MUSIC";}' \ - '{"enabled" = 0;"name" = "MOVIES";}' \ - '{"enabled" = 0;"name" = "PRESENTATIONS";}' \ - '{"enabled" = 0;"name" = "SPREADSHEETS";}' \ - '{"enabled" = 0;"name" = "SOURCE";}' \ - '{"enabled" = 0;"name" = "MENU_DEFINITION";}' \ - '{"enabled" = 0;"name" = "MENU_OTHER";}' \ - '{"enabled" = 0;"name" = "MENU_CONVERSION";}' \ - '{"enabled" = 0;"name" = "MENU_EXPRESSION";}' \ - '{"enabled" = 0;"name" = "MENU_WEBSEARCH";}' \ - '{"enabled" = 0;"name" = "MENU_SPOTLIGHT_SUGGESTIONS";}' -# Load new settings before rebuilding the index -killall mds > /dev/null 2>&1 -# Make sure indexing is enabled for the main volume -sudo mdutil -i on / > /dev/null -# Rebuild the index from scratch -sudo mdutil -E / > /dev/null - -############################################################################### -# Terminal & iTerm 2 # -############################################################################### - -# Only use UTF-8 in Terminal.app -defaults write com.apple.terminal StringEncodings -array 4 - -# Use a modified version of the Solarized Dark theme by default in Terminal.app -osascript < /dev/null && sudo tmutil disablelocal - -############################################################################### -# Activity Monitor # -############################################################################### - -# Show the main window when launching Activity Monitor -defaults write com.apple.ActivityMonitor OpenMainWindow -bool true - -# Visualize CPU usage in the Activity Monitor Dock icon -defaults write com.apple.ActivityMonitor IconType -int 5 - -# Show all processes in Activity Monitor -defaults write com.apple.ActivityMonitor ShowCategory -int 0 - -# Sort Activity Monitor results by CPU usage -defaults write com.apple.ActivityMonitor SortColumn -string "CPUUsage" -defaults write com.apple.ActivityMonitor SortDirection -int 0 - -############################################################################### -# Address Book, Dashboard, iCal, TextEdit, and Disk Utility # -############################################################################### - -# Enable the debug menu in Address Book -defaults write com.apple.addressbook ABShowDebugMenu -bool true - -# Enable Dashboard dev mode (allows keeping widgets on the desktop) -defaults write com.apple.dashboard devmode -bool true - -# Enable the debug menu in iCal (pre-10.8) -defaults write com.apple.iCal IncludeDebugMenu -bool true - -# Use plain text mode for new TextEdit documents -defaults write com.apple.TextEdit RichText -int 0 -# Open and save files as UTF-8 in TextEdit -defaults write com.apple.TextEdit PlainTextEncoding -int 4 -defaults write com.apple.TextEdit PlainTextEncodingForWrite -int 4 - -# Enable the debug menu in Disk Utility -defaults write com.apple.DiskUtility DUDebugMenuEnabled -bool true -defaults write com.apple.DiskUtility advanced-image-options -bool true - -# Auto-play videos when opened with QuickTime Player -defaults write com.apple.QuickTimePlayerX MGPlayMovieOnOpen -bool true - -############################################################################### -# Mac App Store # -############################################################################### - -# Enable the WebKit Developer Tools in the Mac App Store -defaults write com.apple.appstore WebKitDeveloperExtras -bool true - -# Enable Debug Menu in the Mac App Store -defaults write com.apple.appstore ShowDebugMenu -bool true - -# Enable the automatic update check -defaults write com.apple.SoftwareUpdate AutomaticCheckEnabled -bool true - -# Check for software updates daily, not just once per week -defaults write com.apple.SoftwareUpdate ScheduleFrequency -int 1 - -# Download newly available updates in background -defaults write com.apple.SoftwareUpdate AutomaticDownload -int 1 - -# Install System data files & security updates -defaults write com.apple.SoftwareUpdate CriticalUpdateInstall -int 1 - -# Automatically download apps purchased on other Macs -defaults write com.apple.SoftwareUpdate ConfigDataInstall -int 1 - -# Turn on app auto-update -defaults write com.apple.commerce AutoUpdate -bool true - -# Allow the App Store to reboot machine on macOS updates -defaults write com.apple.commerce AutoUpdateRestartRequired -bool true - -############################################################################### -# Photos # -############################################################################### - -# Prevent Photos from opening automatically when devices are plugged in -defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool true - -############################################################################### -# Messages # -############################################################################### - -# Disable automatic emoji substitution (i.e. use plain text smileys) -defaults write com.apple.messageshelper.MessageController SOInputLineSettings -dict-add "automaticEmojiSubstitutionEnablediMessage" -bool false - -# Disable smart quotes as it’s annoying for messages that contain code -defaults write com.apple.messageshelper.MessageController SOInputLineSettings -dict-add "automaticQuoteSubstitutionEnabled" -bool false - -# Disable continuous spell checking -defaults write com.apple.messageshelper.MessageController SOInputLineSettings -dict-add "continuousSpellCheckingEnabled" -bool false - -############################################################################### -# Google Chrome & Google Chrome Canary # -############################################################################### - -# Disable the all too sensitive backswipe on trackpads -defaults write com.google.Chrome AppleEnableSwipeNavigateWithScrolls -bool false -defaults write com.google.Chrome.canary AppleEnableSwipeNavigateWithScrolls -bool false - -# Disable the all too sensitive backswipe on Magic Mouse -defaults write com.google.Chrome AppleEnableMouseSwipeNavigateWithScrolls -bool false -defaults write com.google.Chrome.canary AppleEnableMouseSwipeNavigateWithScrolls -bool false - -# Use the system-native print preview dialog -defaults write com.google.Chrome DisablePrintPreview -bool true -defaults write com.google.Chrome.canary DisablePrintPreview -bool true - -# Expand the print dialog by default -defaults write com.google.Chrome PMPrintingExpandedStateForPrint2 -bool true -defaults write com.google.Chrome.canary PMPrintingExpandedStateForPrint2 -bool true - -############################################################################### -# GPGMail 2 # -############################################################################### - -# Disable signing emails by default -defaults write ~/Library/Preferences/org.gpgtools.gpgmail SignNewEmailsByDefault -bool false - -############################################################################### -# Opera & Opera Developer # -############################################################################### - -# Expand the print dialog by default -defaults write com.operasoftware.Opera PMPrintingExpandedStateForPrint2 -boolean true -defaults write com.operasoftware.OperaDeveloper PMPrintingExpandedStateForPrint2 -boolean true - -############################################################################### -# SizeUp.app # -############################################################################### - -# Start SizeUp at login -defaults write com.irradiatedsoftware.SizeUp StartAtLogin -bool true - -# Don’t show the preferences window on next start -defaults write com.irradiatedsoftware.SizeUp ShowPrefsOnNextStart -bool false - -############################################################################### -# Sublime Text # -############################################################################### - -# Install Sublime Text settings -cp -r init/Preferences.sublime-settings ~/Library/Application\ Support/Sublime\ Text*/Packages/User/Preferences.sublime-settings 2> /dev/null - -############################################################################### -# Transmission.app # -############################################################################### - -# Use `~/Documents/Torrents` to store incomplete downloads -defaults write org.m0k.transmission UseIncompleteDownloadFolder -bool true -defaults write org.m0k.transmission IncompleteDownloadFolder -string "${HOME}/Documents/Torrents" - -# Don’t prompt for confirmation before downloading -defaults write org.m0k.transmission DownloadAsk -bool false -defaults write org.m0k.transmission MagnetOpenAsk -bool false - -# Trash original torrent files -defaults write org.m0k.transmission DeleteOriginalTorrent -bool true - -# Hide the donate message -defaults write org.m0k.transmission WarningDonate -bool false -# Hide the legal disclaimer -defaults write org.m0k.transmission WarningLegal -bool false - -# IP block list. -# Source: https://giuliomac.wordpress.com/2014/02/19/best-blocklist-for-transmission/ -defaults write org.m0k.transmission BlocklistNew -bool true -defaults write org.m0k.transmission BlocklistURL -string "http://john.bitsurge.net/public/biglist.p2p.gz" -defaults write org.m0k.transmission BlocklistAutoUpdate -bool true - -############################################################################### -# Twitter.app # -############################################################################### - -# Disable smart quotes as it’s annoying for code tweets -defaults write com.twitter.twitter-mac AutomaticQuoteSubstitutionEnabled -bool false - -# Show the app window when clicking the menu bar icon -defaults write com.twitter.twitter-mac MenuItemBehavior -int 1 - -# Enable the hidden ‘Develop’ menu -defaults write com.twitter.twitter-mac ShowDevelopMenu -bool true - -# Open links in the background -defaults write com.twitter.twitter-mac openLinksInBackground -bool true - -# Allow closing the ‘new tweet’ window by pressing `Esc` -defaults write com.twitter.twitter-mac ESCClosesComposeWindow -bool true - -# Show full names rather than Twitter handles -defaults write com.twitter.twitter-mac ShowFullNames -bool true - -# Hide the app in the background if it’s not the front-most window -defaults write com.twitter.twitter-mac HideInBackground -bool true - -############################################################################### -# Tweetbot.app # -############################################################################### - -# Bypass the annoyingly slow t.co URL shortener -defaults write com.tapbots.TweetbotMac OpenURLsDirectly -bool true - -############################################################################### -# Spectacle.app # -############################################################################### - -# Set up my preferred keyboard shortcuts -defaults write com.divisiblebyzero.Spectacle MakeLarger -data 62706c6973743030d40102030405061819582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708101155246e756c6cd4090a0b0c0d0e0d0f596d6f64696669657273546e616d65576b6579436f64655624636c6173731000800280035a4d616b654c6172676572d2121314155a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21617585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11a1b54726f6f74800108111a232d32373c424b555a62696b6d6f7a7f8a939c9fa8b1c3c6cb0000000000000101000000000000001c000000000000000000000000000000cd -defaults write com.divisiblebyzero.Spectacle MakeSmaller -data 62706c6973743030d40102030405061819582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708101155246e756c6cd4090a0b0c0d0e0d0f596d6f64696669657273546e616d65576b6579436f64655624636c6173731000800280035b4d616b65536d616c6c6572d2121314155a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21617585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11a1b54726f6f74800108111a232d32373c424b555a62696b6d6f7b808b949da0a9b2c4c7cc0000000000000101000000000000001c000000000000000000000000000000ce -defaults write com.divisiblebyzero.Spectacle MoveToBottomDisplay -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002107d80035f10134d6f7665546f426f74746f6d446973706c6179d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a217185d5a65726f4b6974486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e7072888d98a1afb2c0c9dbdee30000000000000101000000000000001d000000000000000000000000000000e5 -defaults write com.divisiblebyzero.Spectacle MoveToBottomHalf -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002107d80035f10104d6f7665546f426f74746f6d48616c66d2131415165a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21718585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e7072858a959ea7aab3bcced1d60000000000000101000000000000001d000000000000000000000000000000d8 -defaults write com.divisiblebyzero.Spectacle MoveToCenter -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002100880035c4d6f7665546f43656e746572d2131415165a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21718585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e70727f848f98a1a4adb6c8cbd00000000000000101000000000000001d000000000000000000000000000000d2 -defaults write com.divisiblebyzero.Spectacle MoveToFullscreen -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002102e80035f10104d6f7665546f46756c6c73637265656ed2131415165a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21718585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e7072858a959ea7aab3bcced1d60000000000000101000000000000001d000000000000000000000000000000d8 -defaults write com.divisiblebyzero.Spectacle MoveToLeftDisplay -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002107b80035f10114d6f7665546f4c656674446973706c6179d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a217185d5a65726f4b6974486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e7072868b969fadb0bec7d9dce10000000000000101000000000000001d000000000000000000000000000000e3 -defaults write com.divisiblebyzero.Spectacle MoveToLeftHalf -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002107b80035e4d6f7665546f4c65667448616c66d2131415165a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21718585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e70728186919aa3a6afb8cacdd20000000000000101000000000000001d000000000000000000000000000000d4 -defaults write com.divisiblebyzero.Spectacle MoveToLowerLeft -data 62706c6973743030d40102030405061a1b582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731113008002107b80035f100f4d6f7665546f4c6f7765724c656674d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a31718195d5a65726f4b6974486f744b6579585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11c1d54726f6f74800108111a232d32373c424b555a62696c6e70728489949dabafbdc6cfe1e4e90000000000000101000000000000001e000000000000000000000000000000eb -defaults write com.divisiblebyzero.Spectacle MoveToLowerRight -data 62706c6973743030d40102030405061a1b582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731113008002107c80035f10104d6f7665546f4c6f7765725269676874d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a31718195d5a65726f4b6974486f744b6579585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11c1d54726f6f74800108111a232d32373c424b555a62696c6e7072858a959eacb0bec7d0e2e5ea0000000000000101000000000000001e000000000000000000000000000000ec -defaults write com.divisiblebyzero.Spectacle MoveToNextDisplay -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731118008002107c80035f10114d6f7665546f4e657874446973706c6179d2131415165a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21718585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e7072868b969fa8abb4bdcfd2d70000000000000101000000000000001d000000000000000000000000000000d9 -defaults write com.divisiblebyzero.Spectacle MoveToNextThird -data 62706c6973743030d40102030405061819582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708101155246e756c6cd4090a0b0c0d0e0d0f596d6f64696669657273546e616d65576b6579436f64655624636c6173731000800280035f100f4d6f7665546f4e6578745468697264d2121314155a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21617585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11a1b54726f6f74800108111a232d32373c424b555a62696b6d6f8186919aa3a6afb8cacdd20000000000000101000000000000001c000000000000000000000000000000d4 -defaults write com.divisiblebyzero.Spectacle MoveToPreviousDisplay -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731118008002107b80035f10154d6f7665546f50726576696f7573446973706c6179d2131415165a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21718585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e70728a8f9aa3acafb8c1d3d6db0000000000000101000000000000001d000000000000000000000000000000dd -defaults write com.divisiblebyzero.Spectacle MoveToPreviousThird -data 62706c6973743030d40102030405061819582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708101155246e756c6cd4090a0b0c0d0e0d0f596d6f64696669657273546e616d65576b6579436f64655624636c6173731000800280035f10134d6f7665546f50726576696f75735468697264d2121314155a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21617585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11a1b54726f6f74800108111a232d32373c424b555a62696b6d6f858a959ea7aab3bcced1d60000000000000101000000000000001c000000000000000000000000000000d8 -defaults write com.divisiblebyzero.Spectacle MoveToRightDisplay -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002107c80035f10124d6f7665546f5269676874446973706c6179d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a217185d5a65726f4b6974486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e7072878c97a0aeb1bfc8dadde20000000000000101000000000000001d000000000000000000000000000000e4 -defaults write com.divisiblebyzero.Spectacle MoveToRightHalf -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002107c80035f100f4d6f7665546f526967687448616c66d2131415165a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21718585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e70728489949da6a9b2bbcdd0d50000000000000101000000000000001d000000000000000000000000000000d7 -defaults write com.divisiblebyzero.Spectacle MoveToTopDisplay -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002107e80035f10104d6f7665546f546f70446973706c6179d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a217185d5a65726f4b6974486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e7072858a959eacafbdc6d8dbe00000000000000101000000000000001d000000000000000000000000000000e2 -defaults write com.divisiblebyzero.Spectacle MoveToTopHalf -data 62706c6973743030d4010203040506191a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731119008002107e80035d4d6f7665546f546f7048616c66d2131415165a24636c6173736e616d655824636c6173736573585a4b486f744b6579a21718585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11b1c54726f6f74800108111a232d32373c424b555a62696c6e707280859099a2a5aeb7c9ccd10000000000000101000000000000001d000000000000000000000000000000d3 -defaults write com.divisiblebyzero.Spectacle MoveToUpperLeft -data 62706c6973743030d40102030405061a1b582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731111008002107b80035f100f4d6f7665546f55707065724c656674d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a31718195d5a65726f4b6974486f744b6579585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11c1d54726f6f74800108111a232d32373c424b555a62696c6e70728489949dabafbdc6cfe1e4e90000000000000101000000000000001e000000000000000000000000000000eb -defaults write com.divisiblebyzero.Spectacle MoveToUpperRight -data 62706c6973743030d40102030405061a1b582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731111008002107c80035f10104d6f7665546f55707065725269676874d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a31718195d5a65726f4b6974486f744b6579585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11c1d54726f6f74800108111a232d32373c424b555a62696c6e7072858a959eacb0bec7d0e2e5ea0000000000000101000000000000001e000000000000000000000000000000ec -defaults write com.divisiblebyzero.Spectacle RedoLastMove -data 62706c6973743030d40102030405061a1b582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c617373110b008002100680035c5265646f4c6173744d6f7665d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a31718195d5a65726f4b6974486f744b6579585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11c1d54726f6f74800108111a232d32373c424b555a62696c6e70727f848f98a6aab8c1cadcdfe40000000000000101000000000000001e000000000000000000000000000000e6 -defaults write com.divisiblebyzero.Spectacle UndoLastMove -data 62706c6973743030d40102030405061a1b582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a40708111255246e756c6cd4090a0b0c0d0e0f10596d6f64696669657273546e616d65576b6579436f64655624636c6173731109008002100680035c556e646f4c6173744d6f7665d2131415165a24636c6173736e616d655824636c61737365735d5a65726f4b6974486f744b6579a31718195d5a65726f4b6974486f744b6579585a4b486f744b6579584e534f626a6563745f100f4e534b657965644172636869766572d11c1d54726f6f74800108111a232d32373c424b555a62696c6e70727f848f98a6aab8c1cadcdfe40000000000000101000000000000001e000000000000000000000000000000e6 - -############################################################################### -# Kill affected applications # -############################################################################### - -for app in "Activity Monitor" "Address Book" "Calendar" "Contacts" "cfprefsd" \ - "Dock" "Finder" "Google Chrome" "Google Chrome Canary" "Mail" "Messages" \ - "Opera" "Photos" "Safari" "SizeUp" "Spectacle" "SystemUIServer" "Terminal" \ - "Transmission" "Tweetbot" "Twitter" "iCal"; do - killall "${app}" &> /dev/null -done -echo "Done. Note that some of these changes require a logout/restart to take effect." diff --git a/.osx b/.osx deleted file mode 100644 index 4eacb4e..0000000 --- a/.osx +++ /dev/null @@ -1 +0,0 @@ -# 301 https://github.com/mathiasbynens/dotfiles/blob/master/.macos diff --git a/.path b/.path deleted file mode 100644 index d0d115d..0000000 --- a/.path +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -export PATH="/opt/homebrew/opt/grep/libexec/gnubin:$PATH" # needed for gnu grep -export PATH="/usr/local/opt/python/libexec/bin:$PATH" -export PATH="/opt/homebrew/bin:$PATH" -export PATH=$HOME/bin:$PATH -export PATH=/usr/local/bin:/usr/local/sbin:$PATH -export PATH="/Applications/Visual Studio Code.app/Contents/Resources/app/bin:$PATH" -export PATH=/usr/local/bin/ansible/bin:/usr/local/bin/ansible/test/runner:$PATH -export PATH=/usr/local/opt/libxml2/bin:$PATH -export PATH=/usr/local/opt/libxslt/bin:$PATH -export PATH=/usr/local/bin/easyrsa:$PATH -export PATH=$HOME/.nix-profile/bin:$PATH - - -export PATH=$HOME/Library/Python/3.9/bin:$PATH -export PATH=$HOME/.local/bin:$PATH - -export PATH=~/go/bin/bin:$PATH diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..43c0881 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,29 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: mixed-line-ending + args: [--fix=lf] + + - repo: https://github.com/zricethezav/gitleaks + rev: v8.18.4 + hooks: + - id: gitleaks + + - repo: https://github.com/shellcheck-py/shellcheck-py + rev: v0.10.0.1 + hooks: + - id: shellcheck + types: [text] + files: \.(sh|zsh|bash)$|^shell/ + + - repo: https://github.com/scop/pre-commit-shfmt + rev: v3.8.0-1 + hooks: + - id: shfmt + args: [-i, "2", -ci, -bn, -w] + types: [text] + files: \.(sh|zsh|bash)$|^shell/ diff --git a/.screenrc b/.screenrc deleted file mode 100644 index a4a33ba..0000000 --- a/.screenrc +++ /dev/null @@ -1,8 +0,0 @@ -# Disable the startup message -startup_message off - -# Set a large scrollback buffer -defscrollback 32000 - -# Always start `screen` with UTF-8 enabled (`screen -U`) -defutf8 on diff --git a/.secrets.EXAMPLE b/.secrets.EXAMPLE deleted file mode 100644 index be235f1..0000000 --- a/.secrets.EXAMPLE +++ /dev/null @@ -1,3 +0,0 @@ -# Put env vars with secret values in a file called `.secrets`, gitignored - -# GITHUB_TOKEN=your_token diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 0000000..432d54a --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,19 @@ +# shellcheck has partial zsh support; the directives below let it lint +# the bash-compatible parts of our zsh files without false-positiving on +# zsh-only idioms. +shell=bash + +# SC1090, SC1091: "source" non-followable / file not found. Common in dotfiles +# where we conditionally source files that may not exist at lint time. +# SC2128: expanding an array without an index. Zsh ties `path`/`fpath` to +# `$PATH`/`$FPATH` and `$path` is the idiomatic way to splice in the +# existing entries. +# SC2206: word splitting on array assignment. Same zsh-array idiom. +# SC2168: 'local' is only valid in functions. zsh allows it at top level +# of a sourced file; we use it for scope hygiene on transient vars. +# SC2139: alias expansion at definition time. Intentional for color-flag +# detection (`alias l="ls ${colorflag}"`) -- we want the value baked in. +# SC2296, SC2298: parameter expansion can't start with ( / ${${x}} is invalid. +# Zsh-only syntax (e.g., ${(j.:.)array} for array join, ${${x}:A:h} for +# path manipulation). +disable=SC1090,SC1091,SC2128,SC2206,SC2168,SC2139,SC2296,SC2298 diff --git a/.vim/backups/.gitignore b/.vim/backups/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/.vim/colors/solarized.vim b/.vim/colors/solarized.vim deleted file mode 100644 index ee46b17..0000000 --- a/.vim/colors/solarized.vim +++ /dev/null @@ -1,969 +0,0 @@ -" Name: Solarized vim colorscheme -" Author: Ethan Schoonover -" URL: http://ethanschoonover.com/solarized -" (see this url for latest release & screenshots) -" License: OSI approved MIT license (see end of this file) -" Created: In the middle of the night -" Modified: 2011 Apr 14 -" -" Usage "{{{ -" -" --------------------------------------------------------------------- -" ABOUT: -" --------------------------------------------------------------------- -" Solarized is a carefully designed selective contrast colorscheme with dual -" light and dark modes that runs in both GUI, 256 and 16 color modes. -" -" See the homepage above for screenshots and details. -" -" --------------------------------------------------------------------- -" INSTALLATION: -" --------------------------------------------------------------------- -" -" Two options for installation: manual or pathogen -" -" MANUAL INSTALLATION OPTION: -" --------------------------------------------------------------------- -" -" 1. Put the files in the right place! -" 2. Move `solarized.vim` to your `.vim/colors` directory. -" -" RECOMMENDED PATHOGEN INSTALLATION OPTION: -" --------------------------------------------------------------------- -" -" 1. Download and install Tim Pope's Pathogen from: -" https://github.com/tpope/vim-pathogen -" -" 2. Next, move or clone the `vim-colors-solarized` directory so that it is -" a subdirectory of the `.vim/bundle` directory. -" -" a. **clone with git:** -" -" $ cd ~/.vim/bundle -" $ git clone git://github.com/altercation/vim-colors-solarized.git -" -" b. **or move manually into the pathogen bundle directory:** -" In the parent directory of vim-colors-solarized: -" -" $ mv vim-colors-solarized ~/.vim/bundle/ -" -" MODIFY VIMRC: -" -" After either Option 1 or Option 2 above, put the following two lines in your -" .vimrc: -" -" syntax enable -" set background=dark -" colorscheme solarized -" -" or, for the light background mode of Solarized: -" -" syntax enable -" set background=light -" colorscheme solarized -" -" I like to have a different background in GUI and terminal modes, so I can use -" the following if-then. However, I find vim's background autodetection to be -" pretty good and, at least with MacVim, I can leave this background value -" assignment out entirely and get the same results. -" -" if has('gui_running') -" set background=light -" else -" set background=dark -" endif -" -" See the Solarized homepage at http://ethanschoonover.com/solarized for -" screenshots which will help you select either the light or dark background. -" -" Other options are detailed below. -" -" IMPORTANT NOTE FOR TERMINAL USERS: -" -" If you are going to use Solarized in Terminal mode (i.e. not in a GUI version -" like gvim or macvim), **please please please** consider setting your terminal -" emulator's colorscheme to used the Solarized palette. I've included palettes -" for some popular terminal emulator as well as Xdefaults in the official -" Solarized download available from [Solarized homepage]. If you use -" Solarized *without* these colors, Solarized will need to be told to degrade -" its colorscheme to a set compatible with the limited 256 terminal palette -" (whereas by using the terminal's 16 ansi color values, you can set the -" correct, specific values for the Solarized palette). -" -" If you do use the custom terminal colors, solarized.vim should work out of -" the box for you. If you are using a terminal emulator that supports 256 -" colors and don't want to use the custom Solarized terminal colors, you will -" need to use the degraded 256 colorscheme. To do so, simply add the following -" line *before* the `colorschem solarized` line: -" -" let g:solarized_termcolors=256 -" -" Again, I recommend just changing your terminal colors to Solarized values -" either manually or via one of the many terminal schemes available for import. -" -" --------------------------------------------------------------------- -" TOGGLE BACKGROUND FUNCTION: -" --------------------------------------------------------------------- -" -" Solarized comes with a Toggle Background plugin that by default will map to -" if that mapping is available. If it is not available you will need to -" either map the function manually or change your current mapping to -" something else. If you wish to map the function manually, enter the following -" lines in your .vimrc: -" -" nmap ToggleBackground -" imap ToggleBackground -" vmap ToggleBackground -" -" Note that it is important to *not* use the noremap map variants. The plugin -" uses noremap internally. You may run `:help togglebg` for more information. -" -" --------------------------------------------------------------------- -" OPTIONS -" --------------------------------------------------------------------- -" -" Set these in your vimrc file prior to calling the colorscheme. -" -" option name default optional -" ------------------------------------------------ -" g:solarized_termcolors= 16 | 256 -" g:solarized_termtrans = 0 | 1 -" g:solarized_degrade = 0 | 1 -" g:solarized_bold = 1 | 0 -" g:solarized_underline = 1 | 0 -" g:solarized_italic = 1 | 0 -" g:solarized_contrast = "normal"| "high" or "low" -" g:solarized_visibility= "normal"| "high" or "low" -" ------------------------------------------------ -" -" OPTION DETAILS -" -" ------------------------------------------------ -" g:solarized_termcolors= 256 | 16 -" ------------------------------------------------ -" The most important option if you are using vim in terminal (non gui) mode! -" This tells Solarized to use the 256 degraded color mode if running in a 256 -" color capable terminal. Otherwise, if set to `16` it will use the terminal -" emulators colorscheme (best option as long as you've set the emulators colors -" to the Solarized palette). -" -" If you are going to use Solarized in Terminal mode (i.e. not in a GUI -" version like gvim or macvim), **please please please** consider setting your -" terminal emulator's colorscheme to used the Solarized palette. I've included -" palettes for some popular terminal emulator as well as Xdefaults in the -" official Solarized download available from: -" http://ethanschoonover.com/solarized . If you use Solarized without these -" colors, Solarized will by default use an approximate set of 256 colors. It -" isn't bad looking and has been extensively tweaked, but it's still not quite -" the real thing. -" -" ------------------------------------------------ -" g:solarized_termtrans = 0 | 1 -" ------------------------------------------------ -" If you use a terminal emulator with a transparent background and Solarized -" isn't displaying the background color transparently, set this to 1 and -" Solarized will use the default (transparent) background of the terminal -" emulator. *urxvt* required this in my testing; iTerm2 did not. -" -" Note that on Mac OS X Terminal.app, solarized_termtrans is set to 1 by -" default as this is almost always the best option. The only exception to this -" is if the working terminfo file supports 256 colors (xterm-256color). -" -" ------------------------------------------------ -" g:solarized_degrade = 0 | 1 -" ------------------------------------------------ -" For test purposes only; forces Solarized to use the 256 degraded color mode -" to test the approximate color values for accuracy. -" -" ------------------------------------------------ -" g:solarized_bold = 1 | 0 -" ------------------------------------------------ -" ------------------------------------------------ -" g:solarized_underline = 1 | 0 -" ------------------------------------------------ -" ------------------------------------------------ -" g:solarized_italic = 1 | 0 -" ------------------------------------------------ -" If you wish to stop Solarized from displaying bold, underlined or -" italicized typefaces, simply assign a zero value to the appropriate -" variable, for example: `let g:solarized_italic=0` -" -" ------------------------------------------------ -" g:solarized_contrast = "normal"| "high" or "low" -" ------------------------------------------------ -" Stick with normal! It's been carefully tested. Setting this option to high -" or low does use the same Solarized palette but simply shifts some values up -" or down in order to expand or compress the tonal range displayed. -" -" ------------------------------------------------ -" g:solarized_visibility = "normal"| "high" or "low" -" ------------------------------------------------ -" Special characters such as trailing whitespace, tabs, newlines, when -" displayed using ":set list" can be set to one of three levels depending on -" your needs. -" -" --------------------------------------------------------------------- -" COLOR VALUES -" --------------------------------------------------------------------- -" Download palettes and files from: http://ethanschoonover.com/solarized -" -" L\*a\*b values are canonical (White D65, Reference D50), other values are -" matched in sRGB space. -" -" SOLARIZED HEX 16/8 TERMCOL XTERM/HEX L*A*B sRGB HSB -" --------- ------- ---- ------- ----------- ---------- ----------- ----------- -" base03 #002b36 8/4 brblack 234 #1c1c1c 15 -12 -12 0 43 54 193 100 21 -" base02 #073642 0/4 black 235 #262626 20 -12 -12 7 54 66 192 90 26 -" base01 #586e75 10/7 brgreen 240 #4e4e4e 45 -07 -07 88 110 117 194 25 46 -" base00 #657b83 11/7 bryellow 241 #585858 50 -07 -07 101 123 131 195 23 51 -" base0 #839496 12/6 brblue 244 #808080 60 -06 -03 131 148 150 186 13 59 -" base1 #93a1a1 14/4 brcyan 245 #8a8a8a 65 -05 -02 147 161 161 180 9 63 -" base2 #eee8d5 7/7 white 254 #d7d7af 92 -00 10 238 232 213 44 11 93 -" base3 #fdf6e3 15/7 brwhite 230 #ffffd7 97 00 10 253 246 227 44 10 99 -" yellow #b58900 3/3 yellow 136 #af8700 60 10 65 181 137 0 45 100 71 -" orange #cb4b16 9/3 brred 166 #d75f00 50 50 55 203 75 22 18 89 80 -" red #dc322f 1/1 red 160 #d70000 50 65 45 220 50 47 1 79 86 -" magenta #d33682 5/5 magenta 125 #af005f 50 65 -05 211 54 130 331 74 83 -" violet #6c71c4 13/5 brmagenta 61 #5f5faf 50 15 -45 108 113 196 237 45 77 -" blue #268bd2 4/4 blue 33 #0087ff 55 -10 -45 38 139 210 205 82 82 -" cyan #2aa198 6/6 cyan 37 #00afaf 60 -35 -05 42 161 152 175 74 63 -" green #859900 2/2 green 64 #5f8700 60 -20 65 133 153 0 68 100 60 -" -" --------------------------------------------------------------------- -" COLORSCHEME HACKING -" --------------------------------------------------------------------- -" -" Useful commands for testing colorschemes: -" :source $VIMRUNTIME/syntax/hitest.vim -" :help highlight-groups -" :help cterm-colors -" :help group-name -" -" Useful links for developing colorschemes: -" http://www.vim.org/scripts/script.php?script_id=2937 -" http://vimcasts.org/episodes/creating-colorschemes-for-vim/ -" http://www.frexx.de/xterm-256-notes/" -" -" -" }}} -" Default option values"{{{ -" --------------------------------------------------------------------- -if !exists("g:solarized_termtrans") - if ($TERM_PROGRAM ==? "apple_terminal" && &t_Co < 256) - let g:solarized_termtrans = 1 - else - let g:solarized_termtrans = 0 - endif -endif -if !exists("g:solarized_degrade") - let g:solarized_degrade = 0 -endif -if !exists("g:solarized_bold") - let g:solarized_bold = 1 -endif -if !exists("g:solarized_underline") - let g:solarized_underline = 1 -endif -if !exists("g:solarized_italic") - let g:solarized_italic = 1 -endif -if !exists("g:solarized_termcolors") - let g:solarized_termcolors = 16 -endif -if !exists("g:solarized_contrast") - let g:solarized_contrast = "normal" -endif -if !exists("g:solarized_visibility") - let g:solarized_visibility = "normal" -endif -"}}} -" Colorscheme initialization "{{{ -" --------------------------------------------------------------------- -hi clear -if exists("syntax_on") - syntax reset -endif -let colors_name = "solarized" - -"}}} -" GUI & CSApprox hexadecimal palettes"{{{ -" --------------------------------------------------------------------- -" -" Set both gui and terminal color values in separate conditional statements -" Due to possibility that CSApprox is running (though I suppose we could just -" leave the hex values out entirely in that case and include only cterm colors) -" We also check to see if user has set solarized (force use of the -" neutral gray monotone palette component) -if (has("gui_running") && g:solarized_degrade == 0) - let s:vmode = "gui" - let s:base03 = "#002b36" - let s:base02 = "#073642" - let s:base01 = "#586e75" - let s:base00 = "#657b83" - let s:base0 = "#839496" - let s:base1 = "#93a1a1" - let s:base2 = "#eee8d5" - let s:base3 = "#fdf6e3" - let s:yellow = "#b58900" - let s:orange = "#cb4b16" - let s:red = "#dc322f" - let s:magenta = "#d33682" - let s:violet = "#6c71c4" - let s:blue = "#268bd2" - let s:cyan = "#2aa198" - let s:green = "#859900" -elseif (has("gui_running") && g:solarized_degrade == 1) - " These colors are identical to the 256 color mode. They may be viewed - " while in gui mode via "let g:solarized_degrade=1", though this is not - " recommened and is for testing only. - let s:vmode = "gui" - let s:base03 = "#1c1c1c" - let s:base02 = "#262626" - let s:base01 = "#4e4e4e" - let s:base00 = "#585858" - let s:base0 = "#808080" - let s:base1 = "#8a8a8a" - let s:base2 = "#d7d7af" - let s:base3 = "#ffffd7" - let s:yellow = "#af8700" - let s:orange = "#d75f00" - let s:red = "#af0000" - let s:magenta = "#af005f" - let s:violet = "#5f5faf" - let s:blue = "#0087ff" - let s:cyan = "#00afaf" - let s:green = "#5f8700" -elseif g:solarized_termcolors != 256 && &t_Co >= 16 - let s:vmode = "cterm" - let s:base03 = "8" - let s:base02 = "0" - let s:base01 = "10" - let s:base00 = "11" - let s:base0 = "12" - let s:base1 = "14" - let s:base2 = "7" - let s:base3 = "15" - let s:yellow = "3" - let s:orange = "9" - let s:red = "1" - let s:magenta = "5" - let s:violet = "13" - let s:blue = "4" - let s:cyan = "6" - let s:green = "2" -elseif g:solarized_termcolors == 256 - let s:vmode = "cterm" - let s:base03 = "234" - let s:base02 = "235" - let s:base01 = "239" - let s:base00 = "240" - let s:base0 = "244" - let s:base1 = "245" - let s:base2 = "187" - let s:base3 = "230" - let s:yellow = "136" - let s:orange = "166" - let s:red = "124" - let s:magenta = "125" - let s:violet = "61" - let s:blue = "33" - let s:cyan = "37" - let s:green = "64" -else - let s:vmode = "cterm" - let s:bright = "* term=bold cterm=bold" - let s:base03 = "0".s:bright - let s:base02 = "0" - let s:base01 = "2".s:bright - let s:base00 = "3".s:bright - let s:base0 = "4".s:bright - let s:base1 = "6".s:bright - let s:base2 = "7" - let s:base3 = "7".s:bright - let s:yellow = "3" - let s:orange = "1".s:bright - let s:red = "1" - let s:magenta = "5" - let s:violet = "13" - let s:blue = "4" - let s:cyan = "6" - let s:green = "2" -endif -"}}} -" Formatting options and null values for passthrough effect "{{{ -" --------------------------------------------------------------------- - let s:none = "NONE" - let s:none = "NONE" - let s:t_none = "NONE" - let s:n = "NONE" - let s:c = ",undercurl" - let s:r = ",reverse" - let s:s = ",standout" - let s:ou = "" - let s:ob = "" -"}}} -" Background value based on termtrans setting "{{{ -" --------------------------------------------------------------------- -if (has("gui_running") || g:solarized_termtrans == 0) - let s:back = s:base03 -else - let s:back = "NONE" -endif -"}}} -" Alternate light scheme "{{{ -" --------------------------------------------------------------------- -if &background == "light" - let s:temp03 = s:base03 - let s:temp02 = s:base02 - let s:temp01 = s:base01 - let s:temp00 = s:base00 - let s:base03 = s:base3 - let s:base02 = s:base2 - let s:base01 = s:base1 - let s:base00 = s:base0 - let s:base0 = s:temp00 - let s:base1 = s:temp01 - let s:base2 = s:temp02 - let s:base3 = s:temp03 - if (s:back != "NONE") - let s:back = s:base03 - endif -endif -"}}} -" Optional contrast schemes "{{{ -" --------------------------------------------------------------------- -if g:solarized_contrast == "high" - let s:base01 = s:base00 - let s:base00 = s:base0 - let s:base0 = s:base1 - let s:base1 = s:base2 - let s:base2 = s:base3 - let s:back = s:back -endif -if g:solarized_contrast == "low" - let s:back = s:base02 - let s:ou = ",underline" -endif -"}}} -" Overrides dependent on user specified values"{{{ -" --------------------------------------------------------------------- -if g:solarized_bold == 1 - let s:b = ",bold" -else - let s:b = "" -endif - -if g:solarized_underline == 1 - let s:u = ",underline" -else - let s:u = "" -endif - -if g:solarized_italic == 1 - let s:i = ",italic" -else - let s:i = "" -endif -"}}} -" Highlighting primitives"{{{ -" --------------------------------------------------------------------- - -exe "let s:bg_none = ' ".s:vmode."bg=".s:none ."'" -exe "let s:bg_back = ' ".s:vmode."bg=".s:back ."'" -exe "let s:bg_base03 = ' ".s:vmode."bg=".s:base03 ."'" -exe "let s:bg_base02 = ' ".s:vmode."bg=".s:base02 ."'" -exe "let s:bg_base01 = ' ".s:vmode."bg=".s:base01 ."'" -exe "let s:bg_base00 = ' ".s:vmode."bg=".s:base00 ."'" -exe "let s:bg_base0 = ' ".s:vmode."bg=".s:base0 ."'" -exe "let s:bg_base1 = ' ".s:vmode."bg=".s:base1 ."'" -exe "let s:bg_base2 = ' ".s:vmode."bg=".s:base2 ."'" -exe "let s:bg_base3 = ' ".s:vmode."bg=".s:base3 ."'" -exe "let s:bg_green = ' ".s:vmode."bg=".s:green ."'" -exe "let s:bg_yellow = ' ".s:vmode."bg=".s:yellow ."'" -exe "let s:bg_orange = ' ".s:vmode."bg=".s:orange ."'" -exe "let s:bg_red = ' ".s:vmode."bg=".s:red ."'" -exe "let s:bg_magenta = ' ".s:vmode."bg=".s:magenta."'" -exe "let s:bg_violet = ' ".s:vmode."bg=".s:violet ."'" -exe "let s:bg_blue = ' ".s:vmode."bg=".s:blue ."'" -exe "let s:bg_cyan = ' ".s:vmode."bg=".s:cyan ."'" - -exe "let s:fg_none = ' ".s:vmode."fg=".s:none ."'" -exe "let s:fg_back = ' ".s:vmode."fg=".s:back ."'" -exe "let s:fg_base03 = ' ".s:vmode."fg=".s:base03 ."'" -exe "let s:fg_base02 = ' ".s:vmode."fg=".s:base02 ."'" -exe "let s:fg_base01 = ' ".s:vmode."fg=".s:base01 ."'" -exe "let s:fg_base00 = ' ".s:vmode."fg=".s:base00 ."'" -exe "let s:fg_base0 = ' ".s:vmode."fg=".s:base0 ."'" -exe "let s:fg_base1 = ' ".s:vmode."fg=".s:base1 ."'" -exe "let s:fg_base2 = ' ".s:vmode."fg=".s:base2 ."'" -exe "let s:fg_base3 = ' ".s:vmode."fg=".s:base3 ."'" -exe "let s:fg_green = ' ".s:vmode."fg=".s:green ."'" -exe "let s:fg_yellow = ' ".s:vmode."fg=".s:yellow ."'" -exe "let s:fg_orange = ' ".s:vmode."fg=".s:orange ."'" -exe "let s:fg_red = ' ".s:vmode."fg=".s:red ."'" -exe "let s:fg_magenta = ' ".s:vmode."fg=".s:magenta."'" -exe "let s:fg_violet = ' ".s:vmode."fg=".s:violet ."'" -exe "let s:fg_blue = ' ".s:vmode."fg=".s:blue ."'" -exe "let s:fg_cyan = ' ".s:vmode."fg=".s:cyan ."'" - -exe "let s:fmt_none = ' ".s:vmode."=NONE". " term=NONE". "'" -exe "let s:fmt_bold = ' ".s:vmode."=NONE".s:b. " term=NONE".s:b."'" -exe "let s:fmt_bldi = ' ".s:vmode."=NONE".s:b. " term=NONE".s:b."'" -exe "let s:fmt_undr = ' ".s:vmode."=NONE".s:u. " term=NONE".s:u."'" -exe "let s:fmt_undb = ' ".s:vmode."=NONE".s:u.s:b. " term=NONE".s:u.s:b."'" -exe "let s:fmt_undi = ' ".s:vmode."=NONE".s:u. " term=NONE".s:u."'" -exe "let s:fmt_uopt = ' ".s:vmode."=NONE".s:ou. " term=NONE".s:ou."'" -exe "let s:fmt_curl = ' ".s:vmode."=NONE".s:c. " term=NONE".s:c."'" -exe "let s:fmt_ital = ' ".s:vmode."=NONE". " term=NONE". "'" -exe "let s:fmt_revr = ' ".s:vmode."=NONE".s:r. " term=NONE".s:r."'" -exe "let s:fmt_stnd = ' ".s:vmode."=NONE".s:s. " term=NONE".s:s."'" - -if has("gui_running") - exe "let s:sp_none = ' guisp=".s:none ."'" - exe "let s:sp_back = ' guisp=".s:back ."'" - exe "let s:sp_base03 = ' guisp=".s:base03 ."'" - exe "let s:sp_base02 = ' guisp=".s:base02 ."'" - exe "let s:sp_base01 = ' guisp=".s:base01 ."'" - exe "let s:sp_base00 = ' guisp=".s:base00 ."'" - exe "let s:sp_base0 = ' guisp=".s:base0 ."'" - exe "let s:sp_base1 = ' guisp=".s:base1 ."'" - exe "let s:sp_base2 = ' guisp=".s:base2 ."'" - exe "let s:sp_base3 = ' guisp=".s:base3 ."'" - exe "let s:sp_green = ' guisp=".s:green ."'" - exe "let s:sp_yellow = ' guisp=".s:yellow ."'" - exe "let s:sp_orange = ' guisp=".s:orange ."'" - exe "let s:sp_red = ' guisp=".s:red ."'" - exe "let s:sp_magenta = ' guisp=".s:magenta."'" - exe "let s:sp_violet = ' guisp=".s:violet ."'" - exe "let s:sp_blue = ' guisp=".s:blue ."'" - exe "let s:sp_cyan = ' guisp=".s:cyan ."'" -else - let s:sp_none = "" - let s:sp_back = "" - let s:sp_base03 = "" - let s:sp_base02 = "" - let s:sp_base01 = "" - let s:sp_base00 = "" - let s:sp_base0 = "" - let s:sp_base1 = "" - let s:sp_base2 = "" - let s:sp_base3 = "" - let s:sp_green = "" - let s:sp_yellow = "" - let s:sp_orange = "" - let s:sp_red = "" - let s:sp_magenta = "" - let s:sp_violet = "" - let s:sp_blue = "" - let s:sp_cyan = "" -endif - -"}}} -" Basic highlighting"{{{ -" --------------------------------------------------------------------- -" note that link syntax to avoid duplicate configuration doesn't work with the -" exe compiled formats - -exe "hi! Normal" .s:fmt_none .s:fg_base0 .s:bg_back - -exe "hi! Comment" .s:fmt_ital .s:fg_base01 .s:bg_none -" *Comment any comment - -exe "hi! Constant" .s:fmt_none .s:fg_cyan .s:bg_none -" *Constant any constant -" String a string constant: "this is a string" -" Character a character constant: 'c', '\n' -" Number a number constant: 234, 0xff -" Boolean a boolean constant: TRUE, false -" Float a floating point constant: 2.3e10 - -exe "hi! Identifier" .s:fmt_none .s:fg_blue .s:bg_none -" *Identifier any variable name -" Function function name (also: methods for classes) -" -exe "hi! Statement" .s:fmt_none .s:fg_green .s:bg_none -" *Statement any statement -" Conditional if, then, else, endif, switch, etc. -" Repeat for, do, while, etc. -" Label case, default, etc. -" Operator "sizeof", "+", "*", etc. -" Keyword any other keyword -" Exception try, catch, throw - -exe "hi! PreProc" .s:fmt_none .s:fg_orange .s:bg_none -" *PreProc generic Preprocessor -" Include preprocessor #include -" Define preprocessor #define -" Macro same as Define -" PreCondit preprocessor #if, #else, #endif, etc. - -exe "hi! Type" .s:fmt_none .s:fg_yellow .s:bg_none -" *Type int, long, char, etc. -" StorageClass static, register, volatile, etc. -" Structure struct, union, enum, etc. -" Typedef A typedef - -exe "hi! Special" .s:fmt_none .s:fg_red .s:bg_none -" *Special any special symbol -" SpecialChar special character in a constant -" Tag you can use CTRL-] on this -" Delimiter character that needs attention -" SpecialComment special things inside a comment -" Debug debugging statements - -exe "hi! Underlined" .s:fmt_none .s:fg_violet .s:bg_none -" *Underlined text that stands out, HTML links - -exe "hi! Ignore" .s:fmt_none .s:fg_none .s:bg_none -" *Ignore left blank, hidden |hl-Ignore| - -exe "hi! Error" .s:fmt_bold .s:fg_red .s:bg_none -" *Error any erroneous construct - -exe "hi! Todo" .s:fmt_bold .s:fg_magenta.s:bg_none -" *Todo anything that needs extra attention; mostly the -" keywords TODO FIXME and XXX -" -"}}} -" Extended highlighting "{{{ -" --------------------------------------------------------------------- -if (g:solarized_visibility=="high") - exe "hi! SpecialKey" .s:fmt_revr .s:fg_red .s:bg_none - exe "hi! NonText" .s:fmt_bold .s:fg_base1 .s:bg_none -elseif (g:solarized_visibility=="low") - exe "hi! SpecialKey" .s:fmt_bold .s:fg_base02 .s:bg_none - exe "hi! NonText" .s:fmt_bold .s:fg_base02 .s:bg_none -else - exe "hi! SpecialKey" .s:fmt_bold .s:fg_red .s:bg_none - exe "hi! NonText" .s:fmt_bold .s:fg_base01 .s:bg_none -endif -if (has("gui_running")) || &t_Co > 8 - exe "hi! StatusLine" .s:fmt_none .s:fg_base02 .s:bg_base1 - exe "hi! StatusLineNC" .s:fmt_none .s:fg_base02 .s:bg_base00 - "exe "hi! Visual" .s:fmt_stnd .s:fg_none .s:bg_base02 - exe "hi! Visual" .s:fmt_none .s:fg_base03 .s:bg_base01 -else - exe "hi! StatusLine" .s:fmt_none .s:fg_base02 .s:bg_base2 - exe "hi! StatusLineNC" .s:fmt_none .s:fg_base02 .s:bg_base2 - exe "hi! Visual" .s:fmt_none .s:fg_none .s:bg_base2 -endif -exe "hi! Directory" .s:fmt_none .s:fg_blue .s:bg_none -exe "hi! ErrorMsg" .s:fmt_revr .s:fg_red .s:bg_none -exe "hi! IncSearch" .s:fmt_stnd .s:fg_orange .s:bg_none -exe "hi! Search" .s:fmt_revr .s:fg_yellow .s:bg_none -exe "hi! MoreMsg" .s:fmt_none .s:fg_blue .s:bg_none -exe "hi! ModeMsg" .s:fmt_none .s:fg_blue .s:bg_none -exe "hi! LineNr" .s:fmt_none .s:fg_base01 .s:bg_base02 -exe "hi! Question" .s:fmt_bold .s:fg_cyan .s:bg_none -exe "hi! VertSplit" .s:fmt_bold .s:fg_base00 .s:bg_base00 -exe "hi! Title" .s:fmt_bold .s:fg_orange .s:bg_none -exe "hi! VisualNOS" .s:fmt_stnd .s:fg_none .s:bg_base02 -exe "hi! WarningMsg" .s:fmt_bold .s:fg_red .s:bg_none -exe "hi! WildMenu" .s:fmt_none .s:fg_base2 .s:bg_base02 -exe "hi! Folded" .s:fmt_undb .s:fg_base0 .s:bg_base02 .s:sp_base03 -exe "hi! FoldColumn" .s:fmt_bold .s:fg_base0 .s:bg_base02 -exe "hi! DiffAdd" .s:fmt_revr .s:fg_green .s:bg_none -exe "hi! DiffChange" .s:fmt_revr .s:fg_yellow .s:bg_none -exe "hi! DiffDelete" .s:fmt_revr .s:fg_red .s:bg_none -exe "hi! DiffText" .s:fmt_revr .s:fg_blue .s:bg_none -exe "hi! SignColumn" .s:fmt_none .s:fg_base0 .s:bg_base02 -exe "hi! Conceal" .s:fmt_none .s:fg_blue .s:bg_none -exe "hi! SpellBad" .s:fmt_curl .s:fg_none .s:bg_none .s:sp_red -exe "hi! SpellCap" .s:fmt_curl .s:fg_none .s:bg_none .s:sp_violet -exe "hi! SpellRare" .s:fmt_curl .s:fg_none .s:bg_none .s:sp_cyan -exe "hi! SpellLocal" .s:fmt_curl .s:fg_none .s:bg_none .s:sp_yellow -exe "hi! Pmenu" .s:fmt_none .s:fg_base0 .s:bg_base02 -exe "hi! PmenuSel" .s:fmt_none .s:fg_base2 .s:bg_base01 -exe "hi! PmenuSbar" .s:fmt_none .s:fg_base0 .s:bg_base2 -exe "hi! PmenuThumb" .s:fmt_none .s:fg_base03 .s:bg_base0 -exe "hi! TabLine" .s:fmt_undr .s:fg_base0 .s:bg_base02 .s:sp_base0 -exe "hi! TabLineSel" .s:fmt_undr .s:fg_base2 .s:bg_base01 .s:sp_base0 -exe "hi! TabLineFill" .s:fmt_undr .s:fg_base0 .s:bg_base02 .s:sp_base0 -exe "hi! CursorColumn" .s:fmt_none .s:fg_none .s:bg_base02 -exe "hi! CursorLine" .s:fmt_uopt .s:fg_none .s:bg_base02 .s:sp_base1 -exe "hi! ColorColumn" .s:fmt_none .s:fg_none .s:bg_base02 -exe "hi! Cursor" .s:fmt_none .s:fg_base03 .s:bg_base0 -hi! link lCursor Cursor -exe "hi! MatchParen" .s:fmt_bold .s:fg_red .s:bg_base01 - -"}}} -" vim syntax highlighting "{{{ -" --------------------------------------------------------------------- -exe "hi! vimLineComment" . s:fg_base01 .s:bg_none .s:fmt_ital -exe "hi! vimCommentString".s:fg_violet .s:bg_none .s:fmt_none -hi! link vimVar Identifier -hi! link vimFunc Function -hi! link vimUserFunc Function -exe "hi! vimCommand" . s:fg_yellow .s:bg_none .s:fmt_none -exe "hi! vimCmdSep" . s:fg_blue .s:bg_none .s:fmt_bold -exe "hi! helpExample" . s:fg_base1 .s:bg_none .s:fmt_none -hi! link helpSpecial Special -exe "hi! helpOption" . s:fg_cyan .s:bg_none .s:fmt_none -exe "hi! helpNote" . s:fg_magenta.s:bg_none .s:fmt_none -exe "hi! helpVim" . s:fg_magenta.s:bg_none .s:fmt_none -exe "hi! helpHyperTextJump" .s:fg_blue .s:bg_none .s:fmt_undr -exe "hi! helpHyperTextEntry".s:fg_green .s:bg_none .s:fmt_none -exe "hi! vimIsCommand" . s:fg_base00 .s:bg_none .s:fmt_none -exe "hi! vimSynMtchOpt" . s:fg_yellow .s:bg_none .s:fmt_none -exe "hi! vimSynType" . s:fg_cyan .s:bg_none .s:fmt_none -exe "hi! vimHiLink" . s:fg_blue .s:bg_none .s:fmt_none -exe "hi! vimHiGroup" . s:fg_blue .s:bg_none .s:fmt_none -exe "hi! vimGroup" . s:fg_blue .s:bg_none .s:fmt_undb -"}}} -" html highlighting "{{{ -" --------------------------------------------------------------------- -exe "hi! htmlTag" . s:fg_base01 .s:bg_none .s:fmt_none -exe "hi! htmlEndTag" . s:fg_base01 .s:bg_none .s:fmt_none -exe "hi! htmlTagN" . s:fg_base1 .s:bg_none .s:fmt_bold -exe "hi! htmlTagName" . s:fg_blue .s:bg_none .s:fmt_bold -exe "hi! htmlSpecialTagName". s:fg_blue .s:bg_none .s:fmt_ital -exe "hi! htmlArg" . s:fg_base00 .s:bg_none .s:fmt_none -exe "hi! javaScript" . s:fg_yellow .s:bg_none .s:fmt_none -"}}} -" perl highlighting "{{{ -" --------------------------------------------------------------------- -exe "hi! perlHereDoc" . s:fg_base1 .s:bg_back .s:fmt_none -exe "hi! perlVarPlain" . s:fg_yellow .s:bg_back .s:fmt_none -exe "hi! perlStatementFileDesc". s:fg_cyan.s:bg_back.s:fmt_none - -"}}} -" tex highlighting "{{{ -" --------------------------------------------------------------------- -exe "hi! texStatement" . s:fg_cyan .s:bg_back .s:fmt_none -exe "hi! texMathZoneX" . s:fg_yellow .s:bg_back .s:fmt_none -exe "hi! texMathMatcher" . s:fg_yellow .s:bg_back .s:fmt_none -exe "hi! texMathMatcher" . s:fg_yellow .s:bg_back .s:fmt_none -exe "hi! texRefLabel" . s:fg_yellow .s:bg_back .s:fmt_none -"}}} -" ruby highlighting "{{{ -" --------------------------------------------------------------------- -exe "hi! rubyDefine" . s:fg_base1 .s:bg_back .s:fmt_bold -"rubyInclude -"rubySharpBang -"rubyAccess -"rubyPredefinedVariable -"rubyBoolean -"rubyClassVariable -"rubyBeginEnd -"rubyRepeatModifier -"hi! link rubyArrayDelimiter Special " [ , , ] -"rubyCurlyBlock { , , } - -"hi! link rubyClass Keyword -"hi! link rubyModule Keyword -"hi! link rubyKeyword Keyword -"hi! link rubyOperator Operator -"hi! link rubyIdentifier Identifier -"hi! link rubyInstanceVariable Identifier -"hi! link rubyGlobalVariable Identifier -"hi! link rubyClassVariable Identifier -"hi! link rubyConstant Type -"}}} -" haskell syntax highlighting"{{{ -" --------------------------------------------------------------------- -" For use with syntax/haskell.vim : Haskell Syntax File -" http://www.vim.org/scripts/script.php?script_id=3034 -" See also Steffen Siering's github repository: -" http://github.com/urso/dotrc/blob/master/vim/syntax/haskell.vim -" --------------------------------------------------------------------- -" -" Treat True and False specially, see the plugin referenced above -let hs_highlight_boolean=1 -" highlight delims, see the plugin referenced above -let hs_highlight_delimiters=1 - -exe "hi! cPreCondit". s:fg_orange.s:bg_none .s:fmt_none - -exe "hi! VarId" . s:fg_blue .s:bg_none .s:fmt_none -exe "hi! ConId" . s:fg_yellow .s:bg_none .s:fmt_none -exe "hi! hsImport" . s:fg_magenta.s:bg_none .s:fmt_none -exe "hi! hsString" . s:fg_base00 .s:bg_none .s:fmt_none - -exe "hi! hsStructure" . s:fg_cyan .s:bg_none .s:fmt_none -exe "hi! hs_hlFunctionName" . s:fg_blue .s:bg_none -exe "hi! hsStatement" . s:fg_cyan .s:bg_none .s:fmt_none -exe "hi! hsImportLabel" . s:fg_cyan .s:bg_none .s:fmt_none -exe "hi! hs_OpFunctionName" . s:fg_yellow .s:bg_none .s:fmt_none -exe "hi! hs_DeclareFunction" . s:fg_orange .s:bg_none .s:fmt_none -exe "hi! hsVarSym" . s:fg_cyan .s:bg_none .s:fmt_none -exe "hi! hsType" . s:fg_yellow .s:bg_none .s:fmt_none -exe "hi! hsTypedef" . s:fg_cyan .s:bg_none .s:fmt_none -exe "hi! hsModuleName" . s:fg_green .s:bg_none .s:fmt_undr -exe "hi! hsModuleStartLabel" . s:fg_magenta.s:bg_none .s:fmt_none -hi! link hsImportParams Delimiter -hi! link hsDelimTypeExport Delimiter -hi! link hsModuleStartLabel hsStructure -hi! link hsModuleWhereLabel hsModuleStartLabel - -" following is for the haskell-conceal plugin -" the first two items don't have an impact, but better safe -exe "hi! hsNiceOperator" . s:fg_cyan .s:bg_none .s:fmt_none -exe "hi! hsniceoperator" . s:fg_cyan .s:bg_none .s:fmt_none - -"}}} -" pandoc markdown syntax highlighting "{{{ -" --------------------------------------------------------------------- - -"PandocHiLink pandocNormalBlock -exe "hi! pandocTitleBlock" .s:fg_blue .s:bg_none .s:fmt_none -exe "hi! pandocTitleBlockTitle" .s:fg_blue .s:bg_none .s:fmt_bold -exe "hi! pandocTitleComment" .s:fg_blue .s:bg_none .s:fmt_bold -exe "hi! pandocComment" .s:fg_base01 .s:bg_none .s:fmt_ital -exe "hi! pandocVerbatimBlock" .s:fg_yellow .s:bg_none .s:fmt_none -hi! link pandocVerbatimBlockDeep pandocVerbatimBlock -hi! link pandocCodeBlock pandocVerbatimBlock -hi! link pandocCodeBlockDelim pandocVerbatimBlock -exe "hi! pandocBlockQuote" .s:fg_blue .s:bg_none .s:fmt_none -exe "hi! pandocBlockQuoteLeader1" .s:fg_blue .s:bg_none .s:fmt_none -exe "hi! pandocBlockQuoteLeader2" .s:fg_cyan .s:bg_none .s:fmt_none -exe "hi! pandocBlockQuoteLeader3" .s:fg_yellow .s:bg_none .s:fmt_none -exe "hi! pandocBlockQuoteLeader4" .s:fg_red .s:bg_none .s:fmt_none -exe "hi! pandocBlockQuoteLeader5" .s:fg_base0 .s:bg_none .s:fmt_none -exe "hi! pandocBlockQuoteLeader6" .s:fg_base01 .s:bg_none .s:fmt_none -exe "hi! pandocListMarker" .s:fg_magenta.s:bg_none .s:fmt_none -exe "hi! pandocListReference" .s:fg_magenta.s:bg_none .s:fmt_undr - -" Definitions -" --------------------------------------------------------------------- -let s:fg_pdef = s:fg_violet -exe "hi! pandocDefinitionBlock" .s:fg_pdef .s:bg_none .s:fmt_none -exe "hi! pandocDefinitionTerm" .s:fg_pdef .s:bg_none .s:fmt_stnd -exe "hi! pandocDefinitionIndctr" .s:fg_pdef .s:bg_none .s:fmt_bold -exe "hi! pandocEmphasisDefinition" .s:fg_pdef .s:bg_none .s:fmt_ital -exe "hi! pandocEmphasisNestedDefinition" .s:fg_pdef .s:bg_none .s:fmt_bldi -exe "hi! pandocStrongEmphasisDefinition" .s:fg_pdef .s:bg_none .s:fmt_bold -exe "hi! pandocStrongEmphasisNestedDefinition" .s:fg_pdef.s:bg_none.s:fmt_bldi -exe "hi! pandocStrongEmphasisEmphasisDefinition" .s:fg_pdef.s:bg_none.s:fmt_bldi -exe "hi! pandocStrikeoutDefinition" .s:fg_pdef .s:bg_none .s:fmt_revr -exe "hi! pandocVerbatimInlineDefinition" .s:fg_pdef .s:bg_none .s:fmt_none -exe "hi! pandocSuperscriptDefinition" .s:fg_pdef .s:bg_none .s:fmt_none -exe "hi! pandocSubscriptDefinition" .s:fg_pdef .s:bg_none .s:fmt_none - -" Tables -" --------------------------------------------------------------------- -let s:fg_ptable = s:fg_blue -exe "hi! pandocTable" .s:fg_ptable.s:bg_none .s:fmt_none -exe "hi! pandocTableStructure" .s:fg_ptable.s:bg_none .s:fmt_none -hi! link pandocTableStructureTop pandocTableStructre -hi! link pandocTableStructureEnd pandocTableStructre -exe "hi! pandocTableZebraLight" .s:fg_ptable.s:bg_base03.s:fmt_none -exe "hi! pandocTableZebraDark" .s:fg_ptable.s:bg_base02.s:fmt_none -exe "hi! pandocEmphasisTable" .s:fg_ptable.s:bg_none .s:fmt_ital -exe "hi! pandocEmphasisNestedTable" .s:fg_ptable.s:bg_none .s:fmt_bldi -exe "hi! pandocStrongEmphasisTable" .s:fg_ptable.s:bg_none .s:fmt_bold -exe "hi! pandocStrongEmphasisNestedTable" .s:fg_ptable.s:bg_none .s:fmt_bldi -exe "hi! pandocStrongEmphasisEmphasisTable" .s:fg_ptable.s:bg_none .s:fmt_bldi -exe "hi! pandocStrikeoutTable" .s:fg_ptable.s:bg_none .s:fmt_revr -exe "hi! pandocVerbatimInlineTable" .s:fg_ptable.s:bg_none .s:fmt_none -exe "hi! pandocSuperscriptTable" .s:fg_ptable.s:bg_none .s:fmt_none -exe "hi! pandocSubscriptTable" .s:fg_ptable.s:bg_none .s:fmt_none - -" Headings -" --------------------------------------------------------------------- -let s:fg_phead = s:fg_orange -exe "hi! pandocHeading" .s:fg_phead .s:bg_none.s:fmt_bold -exe "hi! pandocHeadingMarker" .s:fg_yellow.s:bg_none.s:fmt_bold -exe "hi! pandocEmphasisHeading" .s:fg_phead .s:bg_none.s:fmt_bldi -exe "hi! pandocEmphasisNestedHeading" .s:fg_phead .s:bg_none.s:fmt_bldi -exe "hi! pandocStrongEmphasisHeading" .s:fg_phead .s:bg_none.s:fmt_bold -exe "hi! pandocStrongEmphasisNestedHeading" .s:fg_phead .s:bg_none.s:fmt_bldi -exe "hi! pandocStrongEmphasisEmphasisHeading".s:fg_phead .s:bg_none.s:fmt_bldi -exe "hi! pandocStrikeoutHeading" .s:fg_phead .s:bg_none.s:fmt_revr -exe "hi! pandocVerbatimInlineHeading" .s:fg_phead .s:bg_none.s:fmt_bold -exe "hi! pandocSuperscriptHeading" .s:fg_phead .s:bg_none.s:fmt_bold -exe "hi! pandocSubscriptHeading" .s:fg_phead .s:bg_none.s:fmt_bold - -" Links -" --------------------------------------------------------------------- -exe "hi! pandocLinkDelim" .s:fg_base01 .s:bg_none .s:fmt_none -exe "hi! pandocLinkLabel" .s:fg_blue .s:bg_none .s:fmt_undr -exe "hi! pandocLinkText" .s:fg_blue .s:bg_none .s:fmt_undb -exe "hi! pandocLinkURL" .s:fg_base00 .s:bg_none .s:fmt_undr -exe "hi! pandocLinkTitle" .s:fg_base00 .s:bg_none .s:fmt_undi -exe "hi! pandocLinkTitleDelim" .s:fg_base01 .s:bg_none .s:fmt_undi .s:sp_base00 -exe "hi! pandocLinkDefinition" .s:fg_cyan .s:bg_none .s:fmt_undr .s:sp_base00 -exe "hi! pandocLinkDefinitionID" .s:fg_blue .s:bg_none .s:fmt_bold -exe "hi! pandocImageCaption" .s:fg_violet .s:bg_none .s:fmt_undb -exe "hi! pandocFootnoteLink" .s:fg_green .s:bg_none .s:fmt_undr -exe "hi! pandocFootnoteDefLink" .s:fg_green .s:bg_none .s:fmt_bold -exe "hi! pandocFootnoteInline" .s:fg_green .s:bg_none .s:fmt_undb -exe "hi! pandocFootnote" .s:fg_green .s:bg_none .s:fmt_none -exe "hi! pandocCitationDelim" .s:fg_magenta.s:bg_none .s:fmt_none -exe "hi! pandocCitation" .s:fg_magenta.s:bg_none .s:fmt_none -exe "hi! pandocCitationID" .s:fg_magenta.s:bg_none .s:fmt_undr -exe "hi! pandocCitationRef" .s:fg_magenta.s:bg_none .s:fmt_none - -" Main Styles -" --------------------------------------------------------------------- -exe "hi! pandocStyleDelim" .s:fg_base01 .s:bg_none .s:fmt_none -exe "hi! pandocEmphasis" .s:fg_base0 .s:bg_none .s:fmt_ital -exe "hi! pandocEmphasisNested" .s:fg_base0 .s:bg_none .s:fmt_bldi -exe "hi! pandocStrongEmphasis" .s:fg_base0 .s:bg_none .s:fmt_bold -exe "hi! pandocStrongEmphasisNested" .s:fg_base0 .s:bg_none .s:fmt_bldi -exe "hi! pandocStrongEmphasisEmphasis" .s:fg_base0 .s:bg_none .s:fmt_bldi -exe "hi! pandocStrikeout" .s:fg_base01 .s:bg_none .s:fmt_revr -exe "hi! pandocVerbatimInline" .s:fg_yellow .s:bg_none .s:fmt_none -exe "hi! pandocSuperscript" .s:fg_violet .s:bg_none .s:fmt_none -exe "hi! pandocSubscript" .s:fg_violet .s:bg_none .s:fmt_none - -exe "hi! pandocRule" .s:fg_blue .s:bg_none .s:fmt_bold -exe "hi! pandocRuleLine" .s:fg_blue .s:bg_none .s:fmt_bold -exe "hi! pandocEscapePair" .s:fg_red .s:bg_none .s:fmt_bold -exe "hi! pandocCitationRef" .s:fg_magenta.s:bg_none .s:fmt_none -exe "hi! pandocNonBreakingSpace" . s:fg_red .s:bg_none .s:fmt_revr -hi! link pandocEscapedCharacter pandocEscapePair -hi! link pandocLineBreak pandocEscapePair - -" Embedded Code -" --------------------------------------------------------------------- -exe "hi! pandocMetadataDelim" .s:fg_base01 .s:bg_none .s:fmt_none -exe "hi! pandocMetadata" .s:fg_blue .s:bg_none .s:fmt_none -exe "hi! pandocMetadataKey" .s:fg_blue .s:bg_none .s:fmt_none -exe "hi! pandocMetadata" .s:fg_blue .s:bg_none .s:fmt_bold -hi! link pandocMetadataTitle pandocMetadata - -"}}} -" Utility autocommand "{{{ -" --------------------------------------------------------------------- -" In cases where Solarized is initialized inside a terminal vim session and -" then transferred to a gui session via the command `:gui`, the gui vim process -" does not re-read the colorscheme (or .vimrc for that matter) so any `has_gui` -" related code that sets gui specific values isn't executed. -" -" Currently, Solarized sets only the cterm or gui values for the colorscheme -" depending on gui or terminal mode. It's possible that, if the following -" autocommand method is deemed excessively poor form, that approach will be -" used again and the autocommand below will be dropped. -" -" However it seems relatively benign in this case to include the autocommand -" here. It fires only in cases where vim is transferring from terminal to gui -" mode (detected with the script scope s:vmode variable). It also allows for -" other potential terminal customizations that might make gui mode suboptimal. -" -autocmd GUIEnter * if (s:vmode != "gui") | exe "colorscheme " . g:colors_name | endif -"}}} -" License "{{{ -" --------------------------------------------------------------------- -" -" Copyright (c) 2011 Ethan Schoonover -" -" Permission is hereby granted, free of charge, to any person obtaining a copy -" of this software and associated documentation files (the "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. -" -" vim:foldmethod=marker:foldlevel=0 -"}}} diff --git a/.vim/swaps/.gitignore b/.vim/swaps/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/.vim/syntax/json.vim b/.vim/syntax/json.vim deleted file mode 100644 index 1e7761a..0000000 --- a/.vim/syntax/json.vim +++ /dev/null @@ -1,74 +0,0 @@ -" Vim syntax file -" Language: JSON -" Maintainer: Jeroen Ruigrok van der Werven -" Last Change: 2009-06-16 -" Version: 0.4 -" {{{1 - -" Syntax setup {{{2 -" For version 5.x: Clear all syntax items -" For version 6.x: Quit when a syntax file was already loaded - -if !exists("main_syntax") - if version < 600 - syntax clear - elseif exists("b:current_syntax") - finish - endif - let main_syntax = 'json' -endif - -" Syntax: Strings {{{2 -syn region jsonString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=jsonEscape -" Syntax: JSON does not allow strings with single quotes, unlike JavaScript. -syn region jsonStringSQ start=+'+ skip=+\\\\\|\\"+ end=+'+ - -" Syntax: Escape sequences {{{3 -syn match jsonEscape "\\["\\/bfnrt]" contained -syn match jsonEscape "\\u\x\{4}" contained - -" Syntax: Strings should always be enclosed with quotes. -syn match jsonNoQuotes "\<\a\+\>" - -" Syntax: Numbers {{{2 -syn match jsonNumber "-\=\<\%(0\|[1-9]\d*\)\%(\.\d\+\)\=\%([eE][-+]\=\d\+\)\=\>" - -" Syntax: An integer part of 0 followed by other digits is not allowed. -syn match jsonNumError "-\=\<0\d\.\d*\>" - -" Syntax: Boolean {{{2 -syn keyword jsonBoolean true false - -" Syntax: Null {{{2 -syn keyword jsonNull null - -" Syntax: Braces {{{2 -syn match jsonBraces "[{}\[\]]" - -" Define the default highlighting. {{{1 -" For version 5.7 and earlier: only when not done already -" For version 5.8 and later: only when an item doesn't have highlighting yet -if version >= 508 || !exists("did_json_syn_inits") - if version < 508 - let did_json_syn_inits = 1 - command -nargs=+ HiLink hi link - else - command -nargs=+ HiLink hi def link - endif - HiLink jsonString String - HiLink jsonEscape Special - HiLink jsonNumber Number - HiLink jsonBraces Operator - HiLink jsonNull Function - HiLink jsonBoolean Boolean - - HiLink jsonNumError Error - HiLink jsonStringSQ Error - HiLink jsonNoQuotes Error - delcommand HiLink -endif - -let b:current_syntax = "json" -if main_syntax == 'json' - unlet main_syntax -endif diff --git a/.vim/undo/.gitignore b/.vim/undo/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/.vimrc b/.vimrc deleted file mode 100644 index 25cf0d5..0000000 --- a/.vimrc +++ /dev/null @@ -1,106 +0,0 @@ -" Use the Solarized Dark theme -set background=dark -colorscheme solarized -let g:solarized_termtrans=1 - -" Make Vim more useful -set nocompatible -" Use the OS clipboard by default (on versions compiled with `+clipboard`) -set clipboard=unnamed -" Enhance command-line completion -set wildmenu -" Allow cursor keys in insert mode -set esckeys -" Allow backspace in insert mode -set backspace=indent,eol,start -" Optimize for fast terminal connections -set ttyfast -" Add the g flag to search/replace by default -set gdefault -" Use UTF-8 without BOM -set encoding=utf-8 nobomb -" Change mapleader -let mapleader="," -" Don’t add empty newlines at the end of files -set binary -set noeol -" Centralize backups, swapfiles and undo history -set backupdir=~/.vim/backups -set directory=~/.vim/swaps -if exists("&undodir") - set undodir=~/.vim/undo -endif - -" Don’t create backups when editing files in certain directories -set backupskip=/tmp/*,/private/tmp/* - -" Respect modeline in files -set modeline -set modelines=4 -" Enable per-directory .vimrc files and disable unsafe commands in them -set exrc -set secure -" Enable line numbers -set number -" Enable syntax highlighting -syntax on -" Highlight current line -set cursorline -" Make tabs as wide as two spaces -set tabstop=2 -" Show “invisible” characters -set lcs=tab:▸\ ,trail:·,eol:¬,nbsp:_ -set list -" Highlight searches -set hlsearch -" Ignore case of searches -set ignorecase -" Highlight dynamically as pattern is typed -set incsearch -" Always show status line -set laststatus=2 -" Enable mouse in all modes -set mouse=a -" Disable error bells -set noerrorbells -" Don’t reset cursor to start of line when moving around. -set nostartofline -" Show the cursor position -set ruler -" Don’t show the intro message when starting Vim -set shortmess=atI -" Show the current mode -set showmode -" Show the filename in the window titlebar -set title -" Show the (partial) command as it’s being typed -set showcmd -" Use relative line numbers -if exists("&relativenumber") - set relativenumber - au BufReadPost * set relativenumber -endif -" Start scrolling three lines before the horizontal window border -set scrolloff=3 - -" Strip trailing whitespace (,ss) -function! StripWhitespace() - let save_cursor = getpos(".") - let old_query = getreg('/') - :%s/\s\+$//e - call setpos('.', save_cursor) - call setreg('/', old_query) -endfunction -noremap ss :call StripWhitespace() -" Save a file as root (,W) -noremap W :w !sudo tee % > /dev/null - -" Automatic commands -if has("autocmd") - " Enable file type detection - filetype on - " Treat .json files as .js - autocmd BufNewFile,BufRead *.json setfiletype json syntax=javascript - " Treat .md files as Markdown - autocmd BufNewFile,BufRead *.md setlocal filetype=markdown -endif diff --git a/.wgetrc b/.wgetrc deleted file mode 100644 index eb531a1..0000000 --- a/.wgetrc +++ /dev/null @@ -1,38 +0,0 @@ -# Use the server-provided last modification date, if available -timestamping = on - -# Do not go up in the directory structure when downloading recursively -no_parent = on - -# Wait 60 seconds before timing out. This applies to all timeouts: DNS, connect and read. (The default read timeout is 15 minutes!) -timeout = 60 - -# Retry a few times when a download fails, but don’t overdo it. (The default is 20!) -tries = 3 - -# Retry even when the connection was refused -retry_connrefused = on - -# Use the last component of a redirection URL for the local file name -trust_server_names = on - -# Follow FTP links from HTML documents by default -follow_ftp = on - -# Add a `.html` extension to `text/html` or `application/xhtml+xml` files that lack one, or a `.css` extension to `text/css` files that lack one -adjust_extension = on - -# Use UTF-8 as the default system encoding -# Disabled as it makes `wget` builds that don’t support this feature unusable. -# Does anyone know how to conditionally configure a wget setting? -# http://unix.stackexchange.com/q/34730/6040 -#local_encoding = UTF-8 - -# Ignore `robots.txt` and `` -robots = off - -# Print the HTTP and FTP server responses -server_response = on - -# Disguise as IE 9 on Windows 7 -user_agent = Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) diff --git a/.zshrc b/.zshrc deleted file mode 100644 index b1e9cf6..0000000 --- a/.zshrc +++ /dev/null @@ -1,61 +0,0 @@ -# Load the shell dotfiles, and then some: -# * ~/.path can be used to extend `$PATH`. -# * ~/.extra can be used for other settings you don’t want to commit. -for file in ~/.{path,prompt,exports,aliases,functions,extra,secrets}; do - [ -r "$file" ] && [ -f "$file" ] && source "$file"; -done; -unset file; - -setopt NO_CASE_GLOB - -# Just enter the path you want, without `cd` -setopt AUTO_CD - -# append completions to fpath -fpath=(${ASDF_DIR}/completions $fpath) - -autoload -Uz compinit && compinit - -# Save history when closing the window -HISTFILE=${ZDOTDIR:-$HOME}/.zsh_history -setopt EXTENDED_HISTORY - -# share history across multiple zsh sessions -setopt SHARE_HISTORY -# append to history -setopt APPEND_HISTORY - -# adds commands as they are typed, not at shell exit -setopt INC_APPEND_HISTORY - -setopt CORRECT -setopt CORRECT_ALL - - -# # https://asdf-vm.com/guide/getting-started.html#_3-install-asdf -# . $HOME/.asdf/asdf.sh - -# DIRENV LOG_FORMAT comes before the hook setup -export DIRENV_LOG_FORMAT="$(printf "\033[2mdirenv: %%s\033[0m")" -export DIRENV_LOG_FORMAT="" - -[[ -e ~/.zprofile ]] && emulate sh -c 'source ~/.zprofile' - - -# The next line updates PATH for the Google Cloud SDK. -if [ -f '/Users/davidham/google-cloud-sdk/path.zsh.inc' ]; then . '/Users/davidham/google-cloud-sdk/path.zsh.inc'; fi - -# The next line enables shell command completion for gcloud. -if [ -f '/Users/davidham/google-cloud-sdk/completion.zsh.inc' ]; then . '/Users/davidham/google-cloud-sdk/completion.zsh.inc'; fi - -source <(apollo-cli completion zsh) - -eval "$(direnv hook zsh)" -_direnv_hook() { - eval "$(direnv export zsh 2> >(egrep -v -e '^....direnv: export' >&2))" -}; -# The following lines have been added by Docker Desktop to enable Docker CLI completions. -fpath=(/Users/davidham/.docker/completions $fpath) -autoload -Uz compinit -compinit -# End of Docker CLI completions diff --git a/LICENSE-MIT.txt b/LICENSE-MIT.txt deleted file mode 100644 index a41e0a7..0000000 --- a/LICENSE-MIT.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright Mathias Bynens - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"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. diff --git a/README.md b/README.md index f3968e5..a342c30 100644 --- a/README.md +++ b/README.md @@ -1,110 +1,80 @@ -# Mathias’s dotfiles +# dotfiles -![Screenshot of my shell prompt](https://i.imgur.com/EkEtphC.png) +Personal dotfiles managed by [Dotbot](https://github.com/anishathalye/dotbot). +zsh-first; macOS-only assumptions; XDG conventions where supported. -## Installation +## Layout -**Warning:** If you want to give these dotfiles a try, you should first fork this repository, review the code, and remove things you don’t want or need. Don’t blindly use my settings unless you know what that entails. Use at your own risk! - -### Using Git and the bootstrap script - -You can clone the repository wherever you want. (I like to keep it in `~/Projects/dotfiles`, with `~/dotfiles` as a symlink.) The bootstrapper script will pull in the latest version and copy the files to your home folder. - -```bash -git clone https://github.com/mathiasbynens/dotfiles.git && cd dotfiles && source bootstrap.sh ``` - -To update, `cd` into your local `dotfiles` repository and then: - -```bash -source bootstrap.sh +home/ files symlinked into $HOME (.zshrc, .zprofile, .editorconfig, .yarnrc.yml) +xdg/ files symlinked under ~/.config/ (git, npm, ghostty, zellij, nvim, direnv) +shell/ zsh modules sourced by home/zshrc.zsh (env, aliases, functions, prompt, fzf, local example) +scripts/ helper scripts (lint) ``` -Alternatively, to update while avoiding the confirmation prompt: +The directory name documents the symlink target. `home/X` -> `~/.X`. +`xdg//file` -> `~/.config//file`. `shell/*.zsh` is sourced, +not symlinked. + +## Bootstrap on a fresh machine ```bash -set -- -f; source bootstrap.sh +git clone git@github.com:davidham/dotfiles.git ~/dotfiles +cd ~/dotfiles +./install # creates symlinks; pulls dotbot submodule +pre-commit install # enables the git hook for secret scanning ``` -### Git-free install - -To install these dotfiles without Git: +Required tools (install with Homebrew): ```bash -cd; curl -#L https://github.com/mathiasbynens/dotfiles/tarball/master | tar -xzv --strip-components 1 --exclude={README.md,bootstrap.sh,.osx,LICENSE-MIT.txt} +brew install gitleaks shellcheck shfmt pre-commit fzf ``` -To update later on, just run that command again. +Optional tools the shell adapts to (no errors if absent): -### Specify the `$PATH` +- `fd` or `ripgrep` -- nicer file source for fzf's Ctrl-T. `brew install fd ripgrep` +- `tree` -- used by the `tre` shell function. `brew install tree` +- `jq` -- used by the `download_secret` / `upload_secret` AWS helpers. `brew install jq` +- `awscli`, `aws-vault`, `kubectl`, `terraform`, `docker`, `bazel` -- aliases reference these but only when invoked. +- `direnv` -- if installed, hooked at shell startup. If absent, no error. +- `apollo-cli` -- Grafana-internal; if installed, completions load. +- Google Cloud SDK at `~/google-cloud-sdk` -- if installed, paths and completions load. -If `~/.path` exists, it will be sourced along with the other files, before any feature testing (such as [detecting which version of `ls` is being used](https://github.com/mathiasbynens/dotfiles/blob/aff769fd75225d8f2e481185a71d5e05b76002dc/.aliases#L21-26)) takes place. +asdf, gcloud, Docker, etc. are managed outside this repo. -Here’s an example `~/.path` file that adds `/usr/local/bin` to the `$PATH`: +## Adding a shell module -```bash -export PATH="/usr/local/bin:$PATH" -``` +Drop a file in `shell/` ending in `.zsh`. Source it from `home/zshrc.zsh` +in the `for module in env aliases ... ; do` loop -- order matters +(env first). -### Add custom commands without creating a new fork +## Per-machine overrides -If `~/.extra` exists, it will be sourced along with the other files. You can use this to add a few custom commands without the need to fork this entire repository, or to add commands you don’t want to commit to a public repository. +Anything machine-local (e.g., a work-specific export, SSH key auto-load +with a non-default path) goes in +`${XDG_CONFIG_HOME:-$HOME/.config}/shell-local.zsh`. This file is +gitignored. `shell/local.zsh.example` is the template; copy it once and +edit in place. -My `~/.extra` looks something like this: +## Linting ```bash -# Git credentials -# Not in the repository, to prevent people from accidentally committing under my name -GIT_AUTHOR_NAME="Mathias Bynens" -GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME" -git config --global user.name "$GIT_AUTHOR_NAME" -GIT_AUTHOR_EMAIL="mathias@mailinator.com" -GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL" -git config --global user.email "$GIT_AUTHOR_EMAIL" +./scripts/lint # runs pre-commit on every file ``` -You could also use `~/.extra` to override settings, functions and aliases from my dotfiles repository. It’s probably better to [fork this repository](https://github.com/mathiasbynens/dotfiles/fork) instead, though. - -### Sensible macOS defaults +CI mirrors this. See `.github/workflows/ci.yml`. -When setting up a new Mac, you may want to set some sensible macOS defaults: +## Secrets -```bash -./.macos -``` +Never commit secrets. Patterns: -### Install Homebrew formulae - -When setting up a new Mac, you may want to install some common [Homebrew](http://brew.sh/) formulae (after installing Homebrew, of course): - -```bash -./brew.sh -``` +- Files containing real secrets are gitignored and live outside the repo. +- Template files end in `.example` or `.tmpl` and contain placeholders. +- gitleaks runs at commit time and in CI; it blocks accidental secret + pushes. The repo allowlists `*.example` and `*.tmpl` paths. +- GitHub push protection is enabled as a final backstop. -## Feedback - -Suggestions/improvements -[welcome](https://github.com/mathiasbynens/dotfiles/issues)! - -## Author - -| [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](http://twitter.com/mathias "Follow @mathias on Twitter") | -|---| -| [Mathias Bynens](https://mathiasbynens.be/) | - -## Thanks to… - -* @ptb and [his _OS X Lion Setup_ repository](https://github.com/ptb/Mac-OS-X-Lion-Setup) -* [Ben Alman](http://benalman.com/) and his [dotfiles repository](https://github.com/cowboy/dotfiles) -* [Chris Gerke](http://www.randomsquared.com/) and his [tutorial on creating an OS X SOE master image](http://chris-gerke.blogspot.com/2012/04/mac-osx-soe-master-image-day-7.html) + [_Insta_ repository](https://github.com/cgerke/Insta) -* [Cătălin Mariș](https://github.com/alrra) and his [dotfiles repository](https://github.com/alrra/dotfiles) -* [Gianni Chiappetta](http://gf3.ca/) for sharing his [amazing collection of dotfiles](https://github.com/gf3/dotfiles) -* [Jan Moesen](http://jan.moesen.nu/) and his [ancient `.bash_profile`](https://gist.github.com/1156154) + [shiny _tilde_ repository](https://github.com/janmoesen/tilde) -* [Lauri ‘Lri’ Ranta](http://lri.me/) for sharing [loads of hidden preferences](http://osxnotes.net/defaults.html) -* [Matijs Brinkhuis](http://hotfusion.nl/) and his [dotfiles repository](https://github.com/matijs/dotfiles) -* [Nicolas Gallagher](http://nicolasgallagher.com/) and his [dotfiles repository](https://github.com/necolas/dotfiles) -* [Sindre Sorhus](http://sindresorhus.com/) -* [Tom Ryder](https://sanctum.geek.nz/) and his [dotfiles repository](https://sanctum.geek.nz/cgit/dotfiles.git/about) -* [Kevin Suttle](http://kevinsuttle.com/) and his [dotfiles repository](https://github.com/kevinSuttle/dotfiles) and [OSXDefaults project](https://github.com/kevinSuttle/OSXDefaults), which aims to provide better documentation for [`~/.macos`](https://mths.be/macos) -* [Haralan Dobrev](http://hkdobrev.com/) -* anyone who [contributed a patch](https://github.com/mathiasbynens/dotfiles/contributors) or [made a helpful suggestion](https://github.com/mathiasbynens/dotfiles/issues) +If you discover a leaked credential in history: rotate the credential +first, decide whether to rewrite history second. Rotation is fast; +rewriting public history is loud and breaks forks. diff --git a/bin/subl b/bin/subl deleted file mode 120000 index 0170a20..0000000 --- a/bin/subl +++ /dev/null @@ -1 +0,0 @@ -/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl \ No newline at end of file diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100755 index 6844b84..0000000 --- a/bootstrap.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -cd "$(dirname "${BASH_SOURCE}")"; - -git pull origin master; - -function doIt() { - rsync --exclude ".git/" \ - --exclude ".DS_Store" \ - --exclude ".osx" \ - --exclude "bootstrap.sh" \ - --exclude "README.md" \ - --exclude "LICENSE-MIT.txt" \ - -avh --no-perms . ~; - source ~/.bash_profile; -} - -if [ "$1" == "--force" -o "$1" == "-f" ]; then - doIt; -else - read -p "This may overwrite existing files in your home directory. Are you sure? (y/n) " -n 1; - echo ""; - if [[ $REPLY =~ ^[Yy]$ ]]; then - doIt; - fi; -fi; -unset doIt; diff --git a/brew.sh b/brew.sh deleted file mode 100755 index 8cd1824..0000000 --- a/brew.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env bash - -# Install command-line tools using Homebrew. - -# Make sure we’re using the latest Homebrew. -brew update - -# Upgrade any already-installed formulae. -brew upgrade - -# Install GNU core utilities (those that come with macOS are outdated). -# Don’t forget to add `$(brew --prefix coreutils)/libexec/gnubin` to `$PATH`. -brew install coreutils - -# Install some other useful utilities like `sponge`. -brew install moreutils -# Install GNU `find`, `locate`, `updatedb`, and `xargs`, `g`-prefixed. -brew install findutils -# Install GNU `sed`, overwriting the built-in `sed`. -brew install gnu-sed --with-default-names -# Install Bash 4. -# Note: don’t forget to add `/usr/local/bin/bash` to `/etc/shells` before -# running `chsh`. -brew install bash -brew tap homebrew/versions -brew install bash-completion2 - -# Switch to using brew-installed bash as default shell -if ! fgrep -q '/usr/local/bin/bash' /etc/shells; then - echo '/usr/local/bin/bash' | sudo tee -a /etc/shells; - chsh -s /usr/local/bin/bash; -fi; - -# Install `wget` with IRI support. -brew install wget --with-iri - -# Install RingoJS and Narwhal. -# Note that the order in which these are installed is important; -# see http://git.io/brew-narwhal-ringo. -brew install ringojs -brew install narwhal - -# Install more recent versions of some macOS tools. -brew install vim --with-override-system-vi -brew install homebrew/dupes/grep -brew install homebrew/dupes/openssh -brew install homebrew/dupes/screen -brew install homebrew/php/php56 --with-gmp - -# Install font tools. -brew tap bramstein/webfonttools -brew install sfnt2woff -brew install sfnt2woff-zopfli -brew install woff2 - -# Install some CTF tools; see https://github.com/ctfs/write-ups. -brew install aircrack-ng -brew install bfg -brew install binutils -brew install binwalk -brew install cifer -brew install dex2jar -brew install dns2tcp -brew install fcrackzip -brew install foremost -brew install hashpump -brew install hydra -brew install john -brew install knock -brew install netpbm -brew install nmap -brew install pngcheck -brew install socat -brew install sqlmap -brew install tcpflow -brew install tcpreplay -brew install tcptrace -brew install ucspi-tcp # `tcpserver` etc. -brew install xpdf -brew install xz - -# Install other useful binaries. -brew install ack -brew install dark-mode -#brew install exiv2 -brew install git -brew install git-lfs -brew install imagemagick --with-webp -brew install lua -brew install lynx -brew install p7zip -brew install pigz -brew install pv -brew install rename -brew install rhino -brew install speedtest_cli -brew install ssh-copy-id -brew install testssl -brew install tree -brew install vbindiff -brew install webkit2png -brew install zopfli - -# Remove outdated versions from the cellar. -brew cleanup diff --git a/.editorconfig b/home/editorconfig similarity index 100% rename from .editorconfig rename to home/editorconfig diff --git a/home/yarnrc.yml b/home/yarnrc.yml new file mode 100644 index 0000000..1e5671c --- /dev/null +++ b/home/yarnrc.yml @@ -0,0 +1 @@ +enableScripts: false diff --git a/.zprofile b/home/zprofile.zsh similarity index 100% rename from .zprofile rename to home/zprofile.zsh diff --git a/home/zshrc.zsh b/home/zshrc.zsh new file mode 100644 index 0000000..05a9295 --- /dev/null +++ b/home/zshrc.zsh @@ -0,0 +1,69 @@ +#!/usr/bin/env zsh +# Entrypoint. Symlinked to ~/.zshrc by Dotbot. + +# Resolve the repo's shell/ dir. ${(%):-%N} is the path of the file +# being sourced (works in .zshrc where $0 is just "zsh"); :A resolves +# symlinks; :h takes the parent directory. +_DOTFILES_SHELL_DIR="${${(%):-%N}:A:h:h}/shell" + +# Source order matters: env.zsh first (PATH, EDITOR, XDG vars), then +# everything else. +for module in env aliases functions prompt fzf; do + module_path="${_DOTFILES_SHELL_DIR}/${module}.zsh" + [[ -r $module_path ]] && source "$module_path" +done +unset module module_path + +# Machine-local override (gitignored). Sourced last so it can override +# anything above. +local_override="${XDG_CONFIG_HOME:-$HOME/.config}/shell-local.zsh" +[[ -r $local_override ]] && source "$local_override" +unset local_override + +setopt NO_CASE_GLOB +setopt AUTO_CD + +# Augment fpath BEFORE compinit so all completion files are picked up. +if [ -d "$ASDF_DIR/completions" ]; then + fpath=("$ASDF_DIR/completions" $fpath) +fi +if [ -d "$HOME/.docker/completions" ]; then + fpath=("$HOME/.docker/completions" $fpath) +fi + +autoload -Uz compinit +compinit -d "${XDG_CACHE_HOME:-$HOME/.cache}/zsh/zcompdump" + +setopt EXTENDED_HISTORY +setopt SHARE_HISTORY +setopt APPEND_HISTORY +setopt INC_APPEND_HISTORY +setopt CORRECT +setopt CORRECT_ALL + +# Silence direnv output (empty format string suppresses all log lines). +# Must be set before the direnv hook runs. +export DIRENV_LOG_FORMAT="" + +[[ -e ~/.zprofile ]] && emulate sh -c 'source ~/.zprofile' + +# Google Cloud SDK -- only if installed at the conventional $HOME location. +if [ -f "$HOME/google-cloud-sdk/path.zsh.inc" ]; then + . "$HOME/google-cloud-sdk/path.zsh.inc" +fi +if [ -f "$HOME/google-cloud-sdk/completion.zsh.inc" ]; then + . "$HOME/google-cloud-sdk/completion.zsh.inc" +fi + +# Apollo CLI (Grafana internal tool) -- only if installed. +if command -v apollo-cli >/dev/null 2>&1; then + source <(apollo-cli completion zsh) +fi + +# direnv -- only if installed. +if command -v direnv >/dev/null 2>&1; then + eval "$(direnv hook zsh)" + _direnv_hook() { + eval "$(direnv export zsh 2> >(grep -E -v -e '^....direnv: export' >&2))" + } +fi diff --git a/init/Preferences.sublime-settings b/init/Preferences.sublime-settings deleted file mode 100644 index 1d190f9..0000000 --- a/init/Preferences.sublime-settings +++ /dev/null @@ -1,41 +0,0 @@ -{ - "color_scheme": "Packages/Color Scheme - Default/Solarized (Dark).tmTheme", - "default_encoding": "UTF-8", - "default_line_ending": "unix", - "detect_indentation": false, - "draw_white_space": "all", - "ensure_newline_at_eof_on_save": false, - "file_exclude_patterns": - [ - ".DS_Store", - "Desktop.ini", - "*.pyc", - "._*", - "Thumbs.db", - ".Spotlight-V100", - ".Trashes" - ], - "folder_exclude_patterns": - [ - ".git", - "node_modules" - ], - "font_face": "Monaco", - "font_size": 13, - "highlight_modified_tabs": true, - "hot_exit": false, - "line_padding_bottom": 5, - "match_brackets": true, - "match_brackets_angle": true, - "remember_open_files": false, - "rulers": - [ - 80 - ], - "show_encoding": true, - "show_line_endings": true, - "tab_size": 2, - "translate_tabs_to_spaces": false, - "trim_trailing_white_space_on_save": true, - "word_wrap": true -} diff --git a/init/Solarized Dark xterm-256color.terminal b/init/Solarized Dark xterm-256color.terminal deleted file mode 100644 index 46f179d..0000000 --- a/init/Solarized Dark xterm-256color.terminal +++ /dev/null @@ -1,160 +0,0 @@ - - - - - BackgroundColor - - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECgw - LjAxNTkyNDQwNTMxIDAuMTI2NTIwOTE2OCAwLjE1OTY5NjAxMjcAEAGAAtIQERITWiRj - bGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVjdF8QD05TS2V5ZWRBcmNo - aXZlctEXGFRyb290gAEIERojLTI3O0FITltijY+RlqGqsrW+0NPYAAAAAAAAAQEAAAAA - AAAAGQAAAAAAAAAAAAAAAAAAANo= - - BlinkText - - CursorColor - - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw - LjQ0MDU4MDI0ODggMC41MDk2MjkzMDkyIDAuNTE2ODU3OTgxNwAQAYAC0hAREhNaJGNs - YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp - dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA - AAAZAAAAAAAAAAAAAAAAAAAA2Q== - - Font - - YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs - YXNzI0AqAAAAAAAAEBCAAoADXU1lbmxvLVJlZ3VsYXLSExQVFlokY2xhc3NuYW1lWCRj - bGFzc2VzVk5TRm9udKIVF1hOU09iamVjdF8QD05TS2V5ZWRBcmNoaXZlctEaG1Ryb290 - gAEIERojLTI3PEJLUltiaXJ0dniGi5afpqmyxMfMAAAAAAAAAQEAAAAAAAAAHAAAAAAA - AAAAAAAAAAAAAM4= - - FontAntialias - - FontHeightSpacing - 1.1000000000000001 - FontWidthSpacing - 1 - ProfileCurrentVersion - 2.02 - SelectionColor - - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECgw - LjAzOTM4MDczNjY1IDAuMTYwMTE2NDYzOSAwLjE5ODMzMjc1NjgAEAGAAtIQERITWiRj - bGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVjdF8QD05TS2V5ZWRBcmNo - aXZlctEXGFRyb290gAEIERojLTI3O0FITltijY+RlqGqsrW+0NPYAAAAAAAAAQEAAAAA - AAAAGQAAAAAAAAAAAAAAAAAAANo= - - ShowWindowSettingsNameInTitle - - TerminalType - xterm-256color - TextBoldColor - - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw - LjUwNTk5MTkzNTcgMC41NjQ4NTgzNzcgMC41NjM2MzY1NDE0ABABgALSEBESE1okY2xh - c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 - ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA - ABkAAAAAAAAAAAAAAAAAAADY - - TextColor - - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw - LjQ0MDU4MDI0ODggMC41MDk2MjkzMDkyIDAuNTE2ODU3OTgxNwAQAYAC0hAREhNaJGNs - YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp - dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA - AAAZAAAAAAAAAAAAAAAAAAAA2Q== - - UseBrightBold - - blackColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg7JNIT2DkvUjPoO+F0s+AYY= - - blueColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmgyqcAj6DtOHsPoO+RUg/AYY= - - brightBlackColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg+ZzgjyDs44BPoNahyM+AYY= - - brightBlueColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg7yT4T6DEXcCP4POUAQ/AYY= - - brightCyanColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg7CIAT+Dj5oQP4N8ShA/AYY= - - brightGreenColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmgzyujT6DFZy2PoOYFsQ+AYY= - - brightMagentaColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmgxMjsj6D+uazPoNkyTc/AYY= - - brightRedColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmgyfkPT+D/15aPoMgl5Y9AYY= - - brightWhiteColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg49LfT+D0Dt1P4MGM10/AYY= - - brightYellowColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg1MTpj6DeHnQPoPQg+A+AYY= - - cyanColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg4VRFj6DfyESP4PkZwY/AYY= - - greenColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg9lI5j6DIYkKP4PVjKU8AYY= - - magentaColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg/4CRz+DBTzdPYMgzt4+AYY= - - name - Solarized Dark xterm-256color - redColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg6i7UT+DUATePYMl2hA+AYY= - - type - Window Settings - whiteColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmgzqGaj+D2tdjP4NYPUw/AYY= - - yellowColour - - BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMBhARm - ZmZmg0DAJT+DB17vPoM4Y8A8AYY= - - - diff --git a/init/Solarized Dark.itermcolors b/init/Solarized Dark.itermcolors deleted file mode 100644 index d630a40..0000000 --- a/init/Solarized Dark.itermcolors +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - Ansi 0 Color - - Blue Component - 0.19370138645172119 - Green Component - 0.15575926005840302 - Red Component - 0.0 - - Ansi 1 Color - - Blue Component - 0.14145714044570923 - Green Component - 0.10840655118227005 - Red Component - 0.81926977634429932 - - Ansi 10 Color - - Blue Component - 0.38298487663269043 - Green Component - 0.35665956139564514 - Red Component - 0.27671992778778076 - - Ansi 11 Color - - Blue Component - 0.43850564956665039 - Green Component - 0.40717673301696777 - Red Component - 0.32436618208885193 - - Ansi 12 Color - - Blue Component - 0.51685798168182373 - Green Component - 0.50962930917739868 - Red Component - 0.44058024883270264 - - Ansi 13 Color - - Blue Component - 0.72908437252044678 - Green Component - 0.33896297216415405 - Red Component - 0.34798634052276611 - - Ansi 14 Color - - Blue Component - 0.56363654136657715 - Green Component - 0.56485837697982788 - Red Component - 0.50599193572998047 - - Ansi 15 Color - - Blue Component - 0.86405980587005615 - Green Component - 0.95794391632080078 - Red Component - 0.98943418264389038 - - Ansi 2 Color - - Blue Component - 0.020208755508065224 - Green Component - 0.54115492105484009 - Red Component - 0.44977453351020813 - - Ansi 3 Color - - Blue Component - 0.023484811186790466 - Green Component - 0.46751424670219421 - Red Component - 0.64746475219726562 - - Ansi 4 Color - - Blue Component - 0.78231418132781982 - Green Component - 0.46265947818756104 - Red Component - 0.12754884362220764 - - Ansi 5 Color - - Blue Component - 0.43516635894775391 - Green Component - 0.10802463442087173 - Red Component - 0.77738940715789795 - - Ansi 6 Color - - Blue Component - 0.52502274513244629 - Green Component - 0.57082360982894897 - Red Component - 0.14679534733295441 - - Ansi 7 Color - - Blue Component - 0.79781103134155273 - Green Component - 0.89001238346099854 - Red Component - 0.91611063480377197 - - Ansi 8 Color - - Blue Component - 0.15170273184776306 - Green Component - 0.11783610284328461 - Red Component - 0.0 - - Ansi 9 Color - - Blue Component - 0.073530435562133789 - Green Component - 0.21325300633907318 - Red Component - 0.74176257848739624 - - Background Color - - Blue Component - 0.15170273184776306 - Green Component - 0.11783610284328461 - Red Component - 0.0 - - Bold Color - - Blue Component - 0.56363654136657715 - Green Component - 0.56485837697982788 - Red Component - 0.50599193572998047 - - Cursor Color - - Blue Component - 0.51685798168182373 - Green Component - 0.50962930917739868 - Red Component - 0.44058024883270264 - - Cursor Text Color - - Blue Component - 0.19370138645172119 - Green Component - 0.15575926005840302 - Red Component - 0.0 - - Foreground Color - - Blue Component - 0.51685798168182373 - Green Component - 0.50962930917739868 - Red Component - 0.44058024883270264 - - Selected Text Color - - Blue Component - 0.56363654136657715 - Green Component - 0.56485837697982788 - Red Component - 0.50599193572998047 - - Selection Color - - Blue Component - 0.19370138645172119 - Green Component - 0.15575926005840302 - Red Component - 0.0 - - - diff --git a/install.conf.yaml b/install.conf.yaml index 576a5a0..786633c 100644 --- a/install.conf.yaml +++ b/install.conf.yaml @@ -1,29 +1,31 @@ - defaults: link: relink: true + create: true -- clean: ['~'] +- clean: ['~', '~/.config'] - link: - ~/.prompt: .prompt - ~/.exports: .exports - ~/.aliases: .aliases - ~/.functions: .functions - ~/.extra: .extra - ~/.secrets: .secrets - ~/.path: .path - ~/.editorconfig: .editorconfig - ~/.gitconfig: .gitconfig ~/.zshrc: - path: .zshrc + path: home/zshrc.zsh force: true ~/.zprofile: - path: .zprofile + path: home/zprofile.zsh force: true + ~/.editorconfig: home/editorconfig + ~/.yarnrc.yml: home/yarnrc.yml -# - create: -# - ~/downloads -# - ~/.vim/undo-history + ~/.config/git/config: xdg/git/config + ~/.config/git/attributes: xdg/git/attributes + ~/.config/git/ignore: xdg/git/ignore + + ~/.config/npm/npmrc: xdg/npm/npmrc + + ~/.config/nvim: xdg/nvim + ~/.config/ghostty/config: xdg/ghostty/config + ~/.config/zellij/config.kdl: xdg/zellij/config.kdl + ~/.config/direnv/direnv.toml: xdg/direnv/direnv.toml + ~/.config/direnv/direnvrc: xdg/direnv/direnvrc - shell: - [git submodule update --init --recursive, Installing submodules] diff --git a/scripts/lint b/scripts/lint new file mode 100755 index 0000000..6bdbbd0 --- /dev/null +++ b/scripts/lint @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +cd "$(dirname "$0")/.." +exec pre-commit run --all-files "$@" diff --git a/shell/aliases.zsh b/shell/aliases.zsh new file mode 100644 index 0000000..34ff610 --- /dev/null +++ b/shell/aliases.zsh @@ -0,0 +1,76 @@ +#!/usr/bin/env zsh +# Aliases. Sourced by home/zshrc.zsh. +# shellcheck shell=bash + +# --- Navigation --- +alias ..="cd .." +alias ...="cd ../.." +alias ....="cd ../../.." +alias .....="cd ../../../.." +alias ~="cd ~" +alias -- -="cd -" + +# --- Shortcuts --- +alias d="cd ~/Documents/Dropbox" +alias dl="cd ~/Downloads" +alias dt="cd ~/Desktop" +alias p="cd ~/projects" +alias g="git" +alias h="history" +alias j="jobs" + +# --- ls / grep color setup --- +# macOS ships BSD ls; GNU coreutils only present if user opted in via brew. +if ls --color > /dev/null 2>&1; then + colorflag="--color" + export LS_COLORS='no=00:fi=00:di=01;31:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.zip=01;31:*.gz=01;31:*.bz2=01;31:*.jpg=01;35:*.png=01;35' +else + colorflag="-G" + export LSCOLORS='BxBxhxDxfxhxhxhxhxcxcx' +fi +alias l="ls -lF ${colorflag}" +alias la="ls -laF ${colorflag}" +alias lsd="ls -lF ${colorflag} | grep --color=never '^d'" +alias ls="command ls ${colorflag}" +alias grep='grep --color=auto' +alias fgrep='fgrep --color=auto' +alias egrep='egrep --color=auto' + +# --- Misc utility --- +alias sudo='sudo ' +alias c="tr -d '\n' | pbcopy" +alias path='echo -e ${PATH//:/\\n}' +alias map="xargs -n1" +alias reload="exec $SHELL -l" +alias reload_dotfiles='~/dotfiles/install && source ~/.zshrc' + +# --- Docker --- +alias dx='docker exec -it' +alias dc='docker compose' +alias dcx='docker compose exec' +alias dcr='docker compose run' + +# --- Kubernetes --- +alias k='kubectl' +alias kc='kubectl config' +alias kctxt='kubectl config use-context' + +# --- Terraform --- +alias tf='terraform' +alias ti='terraform init' +alias tg='terraform get' +alias tp='terraform plan -out tfplan' +alias ta='terraform apply tfplan && rm tfplan' + +# --- AWS --- +alias aws_whoami='aws sts get-caller-identity' +alias login_aws='aws sso login' +alias fedaws='aws-vault exec govcloud-dev -- ' + +# --- Grafana --- +alias gcom-dev='~/grafana/deployment_tools/scripts/gcom/gcom-dev' +alias gcom-ops='~/grafana/deployment_tools/scripts/gcom/gcom-ops' +alias gcom='~/grafana/deployment_tools/scripts/gcom/gcom' + +# --- Bazel: zsh auto-correction confuses bazel target paths --- +alias bazel='nocorrect bazel' diff --git a/shell/env.zsh b/shell/env.zsh new file mode 100644 index 0000000..b4e0b52 --- /dev/null +++ b/shell/env.zsh @@ -0,0 +1,89 @@ +#!/usr/bin/env zsh +# Environment variables and PATH. Sourced first by home/zshrc.zsh. +# shellcheck shell=bash + +# --- XDG Base Directory --- +export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}" +export XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}" +export XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}" +export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}" + +# Ensure XDG state/cache dirs that hold relocated histories exist. +for d in "$XDG_STATE_HOME"/{zsh,less,psql,python,node} "$XDG_CACHE_HOME"/zsh; do + [[ -d $d ]] || mkdir -p "$d" +done +unset d + +# --- PATH --- +# Order: most-specific first. asdf shims (prepended below) end up at the +# front. /opt/homebrew/bin is added by `brew shellenv` in ~/.zprofile, +# which zshrc.zsh sources AFTER this file, so it does not appear here. +# In zsh, the `path` array and `$PATH` are tied -- assigning to one +# updates the other. +# shellcheck disable=SC2206 +path=( + "$HOME/bin" + "$HOME/.local/bin" + "$HOME/.nix-profile/bin" + "/opt/homebrew/opt/grep/libexec/gnubin" + "/Applications/Visual Studio Code.app/Contents/Resources/app/bin" + $path +) + +# --- Editor --- +export EDITOR='code --wait' + +# --- Locale --- +export LANG='en_US.UTF-8' +export LC_ALL='en_US.UTF-8' + +# --- Less --- +export MANPAGER='less -X' +export LESSHISTFILE="$XDG_STATE_HOME/less/history" + +# --- Zsh history (relocated to XDG state) --- +export HISTFILE="$XDG_STATE_HOME/zsh/history" + +# --- Node --- +export NODE_REPL_HISTORY="$XDG_STATE_HOME/node/history" +export NODE_REPL_HISTORY_SIZE='32768' +export NODE_REPL_MODE='sloppy' + +# --- Python --- +export PYTHONIOENCODING='UTF-8' +export PYTHON_HISTORY="$XDG_STATE_HOME/python/history" + +# --- psql --- +export PSQL_HISTORY="$XDG_STATE_HOME/psql/history" + +# --- npm --- +export NPM_CONFIG_USERCONFIG="$XDG_CONFIG_HOME/npm/npmrc" + +# --- Go --- +# GOPATH is the parent of bin/, not bin/ itself. Prior version +# (GOPATH=$HOME/go/bin combined with PATH entry ~/go/bin/bin) was a +# pair of bugs that partly cancelled. +export GOPATH="$HOME/go" +# shellcheck disable=SC2206 +path=("$GOPATH/bin" $path) + +# --- Docker --- +export DOCKER_DEFAULT_PLATFORM=linux/amd64 + +# --- AWS --- +# Default profile; can be overridden in shell-local.zsh or by the env. +export AWS_PROFILE="${AWS_PROFILE:-govcloud-dev}" + +# --- asdf --- +# ASDF_DATA_DIR is where shims and installs live. ASDF_DIR is where the +# asdf installation itself lives (completions, asdf.sh). For the default +# Homebrew/asdf install they are the same directory. +export ASDF_DATA_DIR="$HOME/.asdf" +export ASDF_DIR="${ASDF_DIR:-$ASDF_DATA_DIR}" +# shellcheck disable=SC2206 +path=("$ASDF_DATA_DIR/shims" $path) + +# Re-export PATH once at the end. zsh ties `path` and `PATH` automatically, +# but a single explicit export documents the intent and covers any subshell +# weirdness. +export PATH diff --git a/shell/functions.zsh b/shell/functions.zsh new file mode 100644 index 0000000..b3544d2 --- /dev/null +++ b/shell/functions.zsh @@ -0,0 +1,132 @@ +#!/usr/bin/env zsh +# Shell functions. Sourced by home/zshrc.zsh. +# shellcheck shell=bash + +# Create a directory and cd into it. +mkd() { + mkdir -p "$@" && cd "$_" || return +} + +# cd to the directory of the front Finder window. +cdf() { + cd "$(osascript -e 'tell app "Finder" to POSIX path of (insertion location as alias)')" || return +} + +# Size of a file or total size of a directory. +fs() { + local arg + if du -b /dev/null > /dev/null 2>&1; then + arg=-sbh + else + arg=-sh + fi + if [[ -n "$*" ]]; then + du $arg -- "$@" + else + du $arg .[^.]* ./* + fi +} + +# Open in $EDITOR (vim if $EDITOR unset). +v() { + if [ $# -eq 0 ]; then + "${EDITOR:-vim}" . + else + "${EDITOR:-vim}" "$@" + fi +} + +# Open in default app. +o() { + if [ $# -eq 0 ]; then + open . + else + open "$@" + fi +} + +# Tree with sensible defaults piped through less. +tre() { + tree -aC -I '.git|node_modules|bower_components' --dirsfirst "$@" | less -FRNX +} + +# Aggregate kubeconfigs from ~/.kube/configs/ into KUBECONFIG. +# Previously ran kubectl config get-contexts at shell start (slow + noisy +# + auto-mkdir). Now: just set KUBECONFIG if the directory exists, no +# side effects. +load_kubeconfigs() { + local configs_dir="$HOME/.kube/configs" + [[ -d $configs_dir ]] || return 0 + local kubeconfigs=() + local f + for f in "$configs_dir"/*kubeconfig*(N); do + kubeconfigs+=("$f") + done + if (( ${#kubeconfigs} > 0 )); then + export KUBECONFIG="${(j.:.)kubeconfigs}${KUBECONFIG:+:$KUBECONFIG}" + fi +} +load_kubeconfigs + +# Set AWS_PROFILE. +profile() { + export AWS_PROFILE=$1 +} + +# Pull a JSON secret out of AWS Secrets Manager. +download_secret() { + local SECRET_NAME=$1 + local OUTPUT_FILE="${2:-secrets.json}" + aws secretsmanager get-secret-value \ + --secret-id "${SECRET_NAME}" \ + | jq -S '.SecretString | fromjson' \ + > "$(pwd)/${OUTPUT_FILE}" +} + +# Push a JSON secret to AWS Secrets Manager. +upload_secret() { + local SECRET_NAME=$1 + local INPUT_FILE="${2:-secrets.json}" + aws secretsmanager put-secret-value \ + --secret-id "${SECRET_NAME}" \ + --secret-string "file://$(pwd)/${INPUT_FILE}" +} + +# Delete local branches not present at any remote. +# The commit-commands:clean_gone Claude skill is the recommended workflow +# alternative for "delete local branches whose upstream is gone." This +# function is broader: it deletes any local branch that has no remote +# counterpart, not just gone-upstream branches. Force-delete is used -- +# review your branch list before running. +clean_branches() { + local REMOTES="$*" + if [ -z "$REMOTES" ]; then + REMOTES=$(git remote) + fi + REMOTES=$(echo "$REMOTES" | xargs -n1 echo) + local RBRANCHES=() + while read -r REMOTE; do + local CURRBRANCHES=() + while IFS= read -r b; do + CURRBRANCHES+=("$b") + done < <(git ls-remote "$REMOTE" | awk '{print $2}' | grep 'refs/heads/' | sed 's:refs/heads/::') + RBRANCHES=("${CURRBRANCHES[@]}" "${RBRANCHES[@]}") + done < <(echo "$REMOTES") + [[ ${#RBRANCHES[@]} -eq 0 ]] && return + local LBRANCHES=() + while IFS= read -r b; do + LBRANCHES+=("$b") + done < <(git branch | sed 's:\*::' | awk '{print $1}') + local i j skip + for i in "${LBRANCHES[@]}"; do + skip= + for j in "${RBRANCHES[@]}"; do + if [[ "$i" == "$j" ]]; then + skip=1 + printf '\033[32m Keeping %s \033[0m\n' "$i" + break + fi + done + [[ -n $skip ]] || printf '\033[31m %s \033[0m\n' "$(git branch -D "$i")" + done +} diff --git a/shell/fzf.zsh b/shell/fzf.zsh new file mode 100644 index 0000000..24add7c --- /dev/null +++ b/shell/fzf.zsh @@ -0,0 +1,23 @@ +#!/usr/bin/env zsh +# fzf shell integration. Sourced after env/aliases/functions. +# Provides Ctrl-R (history search) and Ctrl-T (file search), plus ** +# completion. Degrades cleanly if fzf is not installed. +# shellcheck shell=bash + +if command -v fzf >/dev/null 2>&1; then + fzf_prefix="$(brew --prefix 2>/dev/null)/opt/fzf/shell" + if [[ -d $fzf_prefix ]]; then + [[ -r "$fzf_prefix/key-bindings.zsh" ]] && source "$fzf_prefix/key-bindings.zsh" + [[ -r "$fzf_prefix/completion.zsh" ]] && source "$fzf_prefix/completion.zsh" + fi + unset fzf_prefix + + # Use a nicer default command if rg or fd is installed. + if command -v fd >/dev/null 2>&1; then + export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git' + export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" + elif command -v rg >/dev/null 2>&1; then + export FZF_DEFAULT_COMMAND='rg --files --hidden --follow --glob !.git' + export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" + fi +fi diff --git a/shell/local.zsh.example b/shell/local.zsh.example new file mode 100644 index 0000000..8439154 --- /dev/null +++ b/shell/local.zsh.example @@ -0,0 +1,17 @@ +# Machine-local shell config. Copy this file to +# ${XDG_CONFIG_HOME:-$HOME/.config}/shell-local.zsh and edit there. +# The real file is gitignored. Never commit secrets to the dotfiles repo. + +# --- SSH key auto-load (uncomment if you want it) --- +# Loads your default SSH key into the macOS keychain at shell start so +# you do not have to enter the passphrase after every reboot. +# if [[ -o interactive ]] && [[ -f ~/.ssh/id_ed25519 ]]; then +# ssh-add --apple-use-keychain ~/.ssh/id_ed25519 2>/dev/null +# fi + +# --- Per-machine env vars --- +# export SOMETHING=value + +# --- Per-machine secrets --- +# Prefer 1Password CLI, AWS Secrets Manager, etc. over plaintext here. +# export GITHUB_TOKEN=... diff --git a/.prompt b/shell/prompt.zsh similarity index 98% rename from .prompt rename to shell/prompt.zsh index b07fd49..ea8e86c 100644 --- a/.prompt +++ b/shell/prompt.zsh @@ -1,4 +1,6 @@ #!/usr/bin/env zsh +# shellcheck disable=all +# zsh-heavy: TRAPUSR1, ZLE, porcelain v2 parsing -- shellcheck cannot lint usefully. setopt PROMPT_SUBST if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then diff --git a/xdg/direnv/direnv.toml b/xdg/direnv/direnv.toml new file mode 100644 index 0000000..e22d7c2 --- /dev/null +++ b/xdg/direnv/direnv.toml @@ -0,0 +1,2 @@ +[global] +warn_timeout = 0 diff --git a/xdg/direnv/direnvrc b/xdg/direnv/direnvrc new file mode 100644 index 0000000..2de723b --- /dev/null +++ b/xdg/direnv/direnvrc @@ -0,0 +1,6 @@ +# source $HOME/.nix-profile/share/nix-direnv/direnvrc + +layout_git() { + export GIT_DIR=$(git rev-parse --git-dir) + export GIT_WORK_TREE=$(pwd) +} diff --git a/xdg/ghostty/config b/xdg/ghostty/config new file mode 100644 index 0000000..db01d85 --- /dev/null +++ b/xdg/ghostty/config @@ -0,0 +1,7 @@ +font-family = RobotoMono Nerd Font +font-size = 14 +font-style-bold = false +font-style-bold-italic = false +font-synthetic-style = no-bold + +theme = Solarized Dark Higher Contrast diff --git a/.gitattributes b/xdg/git/attributes similarity index 100% rename from .gitattributes rename to xdg/git/attributes diff --git a/.gitconfig b/xdg/git/config similarity index 98% rename from .gitconfig rename to xdg/git/config index 8faeb4e..06ebdfe 100644 --- a/.gitconfig +++ b/xdg/git/config @@ -83,10 +83,6 @@ [core] - # Use custom `.gitignore` and `.gitattributes` - excludesfile = ~/.gitignore - attributesfile = ~/.gitattributes - # Treat spaces before tabs and all kinds of trailing whitespace as an error # [default] trailing-space: looks for spaces at the end of a line # [default] space-before-tab: looks for spaces before tabs at the beginning of a line diff --git a/xdg/git/ignore b/xdg/git/ignore new file mode 100644 index 0000000..476c66e --- /dev/null +++ b/xdg/git/ignore @@ -0,0 +1,3 @@ +.direnv/ +.DS_Store +**/.claude/settings.local.json diff --git a/xdg/npm/npmrc b/xdg/npm/npmrc new file mode 100644 index 0000000..97b895e --- /dev/null +++ b/xdg/npm/npmrc @@ -0,0 +1 @@ +ignore-scripts=true diff --git a/xdg/nvim/.gitignore b/xdg/nvim/.gitignore new file mode 100644 index 0000000..cc5457a --- /dev/null +++ b/xdg/nvim/.gitignore @@ -0,0 +1,8 @@ +tt.* +.tests +doc/tags +debug +.repro +foo.* +*.log +data diff --git a/xdg/nvim/.neoconf.json b/xdg/nvim/.neoconf.json new file mode 100644 index 0000000..7c48087 --- /dev/null +++ b/xdg/nvim/.neoconf.json @@ -0,0 +1,15 @@ +{ + "neodev": { + "library": { + "enabled": true, + "plugins": true + } + }, + "neoconf": { + "plugins": { + "lua_ls": { + "enabled": true + } + } + } +} diff --git a/xdg/nvim/LICENSE b/xdg/nvim/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/xdg/nvim/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/xdg/nvim/README.md b/xdg/nvim/README.md new file mode 100644 index 0000000..185280b --- /dev/null +++ b/xdg/nvim/README.md @@ -0,0 +1,4 @@ +# 💤 LazyVim + +A starter template for [LazyVim](https://github.com/LazyVim/LazyVim). +Refer to the [documentation](https://lazyvim.github.io/installation) to get started. diff --git a/xdg/nvim/init.lua b/xdg/nvim/init.lua new file mode 100644 index 0000000..2514f9e --- /dev/null +++ b/xdg/nvim/init.lua @@ -0,0 +1,2 @@ +-- bootstrap lazy.nvim, LazyVim and your plugins +require("config.lazy") diff --git a/xdg/nvim/lazy-lock.json b/xdg/nvim/lazy-lock.json new file mode 100644 index 0000000..01ceec4 --- /dev/null +++ b/xdg/nvim/lazy-lock.json @@ -0,0 +1,38 @@ +{ + "LazyVim": { "branch": "main", "commit": "28db03f958d58dfff3c647ce28fdc1cb88ac158d" }, + "SchemaStore.nvim": { "branch": "main", "commit": "c4177be30087dc0cad7dd9ef2402ee4a42707114" }, + "blink.cmp": { "branch": "main", "commit": "4b18c32adef2898f95cdef6192cbd5796c1a332d" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, + "catppuccin": { "branch": "main", "commit": "0a5de4da015a175f416d6ef1eda84661623e0500" }, + "claudecode.nvim": { "branch": "main", "commit": "aa9a5cebebdbfa449c1c5ff229ba5d98e66bafed" }, + "conform.nvim": { "branch": "master", "commit": "e969e302bced7ffb9a0a0323629f31feb0ca35a6" }, + "flash.nvim": { "branch": "main", "commit": "fcea7ff883235d9024dc41e638f164a450c14ca2" }, + "friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" }, + "gitsigns.nvim": { "branch": "main", "commit": "9f3c6dd7868bcc116e9c1c1929ce063b978fa519" }, + "grug-far.nvim": { "branch": "main", "commit": "275dbedc96e61a6b8d1dfb28ba51586ddd233dcf" }, + "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, + "lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" }, + "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" }, + "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "9e3a9fe4f1f9f34b19307a2695dee8fbbd0be776" }, + "mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" }, + "mini.ai": { "branch": "main", "commit": "4b0a6207341d895b6cfe9bcb1e4d3e8607bfe4f4" }, + "mini.icons": { "branch": "main", "commit": "5b9076dae1bfbe47ba4a14bc8b967cde0ab5d77e" }, + "mini.pairs": { "branch": "main", "commit": "b7fde3719340946feb75017ef9d75edebdeb0566" }, + "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" }, + "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, + "nvim-lint": { "branch": "master", "commit": "606b823a57b027502a9ae00978ebf4f5d5158098" }, + "nvim-lspconfig": { "branch": "master", "commit": "f2193125da0bff2e4eae8e0a45e343ec9bca4c72" }, + "nvim-treesitter": { "branch": "main", "commit": "ae2081cfcd3719d74b600f8377e4a99d1ec19c4a" }, + "nvim-treesitter-textobjects": { "branch": "main", "commit": "a0e182ae21fda68c59d1f36c9ed45600aef50311" }, + "nvim-ts-autotag": { "branch": "main", "commit": "8e1c0a389f20bf7f5b0dd0e00306c1247bda2595" }, + "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" }, + "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "render-markdown.nvim": { "branch": "main", "commit": "1c958131c083c8557ea499fdb08c88b8afb05c4e" }, + "snacks.nvim": { "branch": "main", "commit": "fe7cfe9800a182274d0f868a74b7263b8c0c020b" }, + "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, + "tokyonight.nvim": { "branch": "main", "commit": "5da1b76e64daf4c5d410f06bcb6b9cb640da7dfd" }, + "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" }, + "ts-comments.nvim": { "branch": "main", "commit": "123a9fb12e7229342f807ec9e6de478b1102b041" }, + "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } +} diff --git a/xdg/nvim/lazyvim.json b/xdg/nvim/lazyvim.json new file mode 100644 index 0000000..20bc2d1 --- /dev/null +++ b/xdg/nvim/lazyvim.json @@ -0,0 +1,17 @@ +{ + "extras": [ + "lazyvim.plugins.extras.ai.claudecode", + "lazyvim.plugins.extras.lang.docker", + "lazyvim.plugins.extras.lang.go", + "lazyvim.plugins.extras.lang.json", + "lazyvim.plugins.extras.lang.markdown", + "lazyvim.plugins.extras.lang.terraform", + "lazyvim.plugins.extras.lang.toml", + "lazyvim.plugins.extras.lang.yaml" + ], + "install_version": 8, + "news": { + "NEWS.md": "11866" + }, + "version": 8 +} diff --git a/xdg/nvim/lua/config/autocmds.lua b/xdg/nvim/lua/config/autocmds.lua new file mode 100644 index 0000000..4221e75 --- /dev/null +++ b/xdg/nvim/lua/config/autocmds.lua @@ -0,0 +1,8 @@ +-- Autocmds are automatically loaded on the VeryLazy event +-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua +-- +-- Add any additional autocmds here +-- with `vim.api.nvim_create_autocmd` +-- +-- Or remove existing autocmds by their group name (which is prefixed with `lazyvim_` for the defaults) +-- e.g. vim.api.nvim_del_augroup_by_name("lazyvim_wrap_spell") diff --git a/xdg/nvim/lua/config/keymaps.lua b/xdg/nvim/lua/config/keymaps.lua new file mode 100644 index 0000000..2c134f7 --- /dev/null +++ b/xdg/nvim/lua/config/keymaps.lua @@ -0,0 +1,3 @@ +-- Keymaps are automatically loaded on the VeryLazy event +-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua +-- Add any additional keymaps here diff --git a/xdg/nvim/lua/config/lazy.lua b/xdg/nvim/lua/config/lazy.lua new file mode 100644 index 0000000..d73bfa1 --- /dev/null +++ b/xdg/nvim/lua/config/lazy.lua @@ -0,0 +1,53 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end +vim.opt.rtp:prepend(lazypath) + +require("lazy").setup({ + spec = { + -- add LazyVim and import its plugins + { "LazyVim/LazyVim", import = "lazyvim.plugins" }, + -- import/override with your plugins + { import = "plugins" }, + }, + defaults = { + -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. + -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. + lazy = false, + -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, + -- have outdated releases, which may break your Neovim install. + version = false, -- always use the latest git commit + -- version = "*", -- try installing the latest stable version for plugins that support semver + }, + install = { colorscheme = { "tokyonight", "habamax" } }, + checker = { + enabled = true, -- check for plugin updates periodically + notify = false, -- notify on update + }, -- automatically check for plugin updates + performance = { + rtp = { + -- disable some rtp plugins + disabled_plugins = { + "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + "tarPlugin", + "tohtml", + "tutor", + "zipPlugin", + }, + }, + }, +}) diff --git a/xdg/nvim/lua/config/options.lua b/xdg/nvim/lua/config/options.lua new file mode 100644 index 0000000..3ea1454 --- /dev/null +++ b/xdg/nvim/lua/config/options.lua @@ -0,0 +1,3 @@ +-- Options are automatically loaded before lazy.nvim startup +-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua +-- Add any additional options here diff --git a/xdg/nvim/lua/config/snacks.lua b/xdg/nvim/lua/config/snacks.lua new file mode 100644 index 0000000..a579a5e --- /dev/null +++ b/xdg/nvim/lua/config/snacks.lua @@ -0,0 +1,36 @@ +-- ~/.config/nvim/lua/plugins/snacks.lua +return { + { + "folke/snacks.nvim", + config = function() + local snacks = require("snacks") + + -- force config at plugin load time + snacks.setup({ + picker = { + hidden = true, -- show dotfiles by default + ignored = false, -- show gitignored files as well (optional) + sources = { + files = { + hidden = true, + ignored = false, + }, + }, + }, + }) + + -- optional: keymap to toggle hidden files inside explorer + vim.api.nvim_set_keymap( + "n", + "uh", + "lua require('snacks.explorer').toggle_hidden()", + { noremap = true, silent = true } + ) + end, + }, + + -- disable other file-explorer plugins that might take precedence (example) + -- add this block if you have neo-tree or nvim-tree enabled and want to disable them + -- { "nvim-neo-tree/neo-tree.nvim", enabled = false }, + -- { "kyazdani42/nvim-tree.lua", enabled = false }, +} diff --git a/xdg/nvim/lua/plugins/example.lua b/xdg/nvim/lua/plugins/example.lua new file mode 100644 index 0000000..17f53d6 --- /dev/null +++ b/xdg/nvim/lua/plugins/example.lua @@ -0,0 +1,197 @@ +-- since this is just an example spec, don't actually load anything here and return an empty spec +-- stylua: ignore +if true then return {} end + +-- every spec file under the "plugins" directory will be loaded automatically by lazy.nvim +-- +-- In your plugin files, you can: +-- * add extra plugins +-- * disable/enabled LazyVim plugins +-- * override the configuration of LazyVim plugins +return { + -- add gruvbox + { "ellisonleao/gruvbox.nvim" }, + + -- Configure LazyVim to load gruvbox + { + "LazyVim/LazyVim", + opts = { + colorscheme = "gruvbox", + }, + }, + + -- change trouble config + { + "folke/trouble.nvim", + -- opts will be merged with the parent spec + opts = { use_diagnostic_signs = true }, + }, + + -- disable trouble + { "folke/trouble.nvim", enabled = false }, + + -- override nvim-cmp and add cmp-emoji + { + "hrsh7th/nvim-cmp", + dependencies = { "hrsh7th/cmp-emoji" }, + ---@param opts cmp.ConfigSchema + opts = function(_, opts) + table.insert(opts.sources, { name = "emoji" }) + end, + }, + + -- change some telescope options and a keymap to browse plugin files + { + "nvim-telescope/telescope.nvim", + keys = { + -- add a keymap to browse plugin files + -- stylua: ignore + { + "fp", + function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root }) end, + desc = "Find Plugin File", + }, + }, + -- change some options + opts = { + defaults = { + layout_strategy = "horizontal", + layout_config = { prompt_position = "top" }, + sorting_strategy = "ascending", + winblend = 0, + }, + }, + }, + + -- add pyright to lspconfig + { + "neovim/nvim-lspconfig", + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- pyright will be automatically installed with mason and loaded with lspconfig + pyright = {}, + }, + }, + }, + + -- add tsserver and setup with typescript.nvim instead of lspconfig + { + "neovim/nvim-lspconfig", + dependencies = { + "jose-elias-alvarez/typescript.nvim", + init = function() + require("lazyvim.util").lsp.on_attach(function(_, buffer) + -- stylua: ignore + vim.keymap.set( "n", "co", "TypescriptOrganizeImports", { buffer = buffer, desc = "Organize Imports" }) + vim.keymap.set("n", "cR", "TypescriptRenameFile", { desc = "Rename File", buffer = buffer }) + end) + end, + }, + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- tsserver will be automatically installed with mason and loaded with lspconfig + tsserver = {}, + }, + -- you can do any additional lsp server setup here + -- return true if you don't want this server to be setup with lspconfig + ---@type table + setup = { + -- example to setup with typescript.nvim + tsserver = function(_, opts) + require("typescript").setup({ server = opts }) + return true + end, + -- Specify * to use this function as a fallback for any server + -- ["*"] = function(server, opts) end, + }, + }, + }, + + -- for typescript, LazyVim also includes extra specs to properly setup lspconfig, + -- treesitter, mason and typescript.nvim. So instead of the above, you can use: + { import = "lazyvim.plugins.extras.lang.typescript" }, + + -- add more treesitter parsers + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "bash", + "html", + "javascript", + "json", + "lua", + "markdown", + "markdown_inline", + "python", + "query", + "regex", + "tsx", + "typescript", + "vim", + "yaml", + }, + }, + }, + + -- since `vim.tbl_deep_extend`, can only merge tables and not lists, the code above + -- would overwrite `ensure_installed` with the new value. + -- If you'd rather extend the default config, use the code below instead: + { + "nvim-treesitter/nvim-treesitter", + opts = function(_, opts) + -- add tsx and treesitter + vim.list_extend(opts.ensure_installed, { + "tsx", + "typescript", + }) + end, + }, + + -- the opts function can also be used to change the default opts: + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function(_, opts) + table.insert(opts.sections.lualine_x, { + function() + return "😄" + end, + }) + end, + }, + + -- or you can return new options to override all the defaults + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function() + return { + --[[add your custom lualine config here]] + } + end, + }, + + -- use mini.starter instead of alpha + { import = "lazyvim.plugins.extras.ui.mini-starter" }, + + -- add jsonls and schemastore packages, and setup treesitter for json, json5 and jsonc + { import = "lazyvim.plugins.extras.lang.json" }, + + -- add any tools you want to have installed below + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "stylua", + "shellcheck", + "shfmt", + "flake8", + }, + }, + }, +} diff --git a/xdg/nvim/stylua.toml b/xdg/nvim/stylua.toml new file mode 100644 index 0000000..0f90030 --- /dev/null +++ b/xdg/nvim/stylua.toml @@ -0,0 +1,3 @@ +indent_type = "Spaces" +indent_width = 2 +column_width = 120 diff --git a/xdg/zellij/config.kdl b/xdg/zellij/config.kdl new file mode 100644 index 0000000..46d6146 --- /dev/null +++ b/xdg/zellij/config.kdl @@ -0,0 +1,532 @@ +keybinds clear-defaults=true { + locked { + bind "Ctrl g" { SwitchToMode "normal"; } + } + pane { + bind "left" { MoveFocus "left"; } + bind "down" { MoveFocus "down"; } + bind "up" { MoveFocus "up"; } + bind "right" { MoveFocus "right"; } + bind "c" { SwitchToMode "renamepane"; PaneNameInput 0; } + bind "d" { NewPane "down"; SwitchToMode "normal"; } + bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "normal"; } + bind "f" { ToggleFocusFullscreen; SwitchToMode "normal"; } + bind "h" { MoveFocus "left"; } + bind "i" { TogglePanePinned; SwitchToMode "normal"; } + bind "j" { MoveFocus "down"; } + bind "k" { MoveFocus "up"; } + bind "l" { MoveFocus "right"; } + bind "n" { NewPane; SwitchToMode "normal"; } + bind "p" { SwitchFocus; } + bind "Ctrl p" { SwitchToMode "normal"; } + bind "r" { NewPane "right"; SwitchToMode "normal"; } + bind "s" { NewPane "stacked"; SwitchToMode "normal"; } + bind "w" { ToggleFloatingPanes; SwitchToMode "normal"; } + bind "z" { TogglePaneFrames; SwitchToMode "normal"; } + } + tab { + bind "left" { GoToPreviousTab; } + bind "down" { GoToNextTab; } + bind "up" { GoToPreviousTab; } + bind "right" { GoToNextTab; } + bind "1" { GoToTab 1; SwitchToMode "normal"; } + bind "2" { GoToTab 2; SwitchToMode "normal"; } + bind "3" { GoToTab 3; SwitchToMode "normal"; } + bind "4" { GoToTab 4; SwitchToMode "normal"; } + bind "5" { GoToTab 5; SwitchToMode "normal"; } + bind "6" { GoToTab 6; SwitchToMode "normal"; } + bind "7" { GoToTab 7; SwitchToMode "normal"; } + bind "8" { GoToTab 8; SwitchToMode "normal"; } + bind "9" { GoToTab 9; SwitchToMode "normal"; } + bind "[" { BreakPaneLeft; SwitchToMode "normal"; } + bind "]" { BreakPaneRight; SwitchToMode "normal"; } + bind "b" { BreakPane; SwitchToMode "normal"; } + bind "h" { GoToPreviousTab; } + bind "j" { GoToNextTab; } + bind "k" { GoToPreviousTab; } + bind "l" { GoToNextTab; } + bind "n" { NewTab; SwitchToMode "normal"; } + bind "r" { SwitchToMode "renametab"; TabNameInput 0; } + bind "s" { ToggleActiveSyncTab; SwitchToMode "normal"; } + bind "Ctrl t" { SwitchToMode "normal"; } + bind "x" { CloseTab; SwitchToMode "normal"; } + bind "tab" { ToggleTab; } + } + resize { + bind "left" { Resize "Increase left"; } + bind "down" { Resize "Increase down"; } + bind "up" { Resize "Increase up"; } + bind "right" { Resize "Increase right"; } + bind "+" { Resize "Increase"; } + bind "-" { Resize "Decrease"; } + bind "=" { Resize "Increase"; } + bind "H" { Resize "Decrease left"; } + bind "J" { Resize "Decrease down"; } + bind "K" { Resize "Decrease up"; } + bind "L" { Resize "Decrease right"; } + bind "h" { Resize "Increase left"; } + bind "j" { Resize "Increase down"; } + bind "k" { Resize "Increase up"; } + bind "l" { Resize "Increase right"; } + bind "Ctrl n" { SwitchToMode "normal"; } + } + move { + bind "left" { MovePane "left"; } + bind "down" { MovePane "down"; } + bind "up" { MovePane "up"; } + bind "right" { MovePane "right"; } + bind "h" { MovePane "left"; } + bind "Ctrl h" { SwitchToMode "normal"; } + bind "j" { MovePane "down"; } + bind "k" { MovePane "up"; } + bind "l" { MovePane "right"; } + bind "n" { MovePane; } + bind "p" { MovePaneBackwards; } + bind "tab" { MovePane; } + } + scroll { + bind "e" { EditScrollback; SwitchToMode "normal"; } + bind "s" { SwitchToMode "entersearch"; SearchInput 0; } + } + search { + bind "c" { SearchToggleOption "CaseSensitivity"; } + bind "n" { Search "down"; } + bind "o" { SearchToggleOption "WholeWord"; } + bind "p" { Search "up"; } + bind "w" { SearchToggleOption "Wrap"; } + } + session { + bind "a" { + LaunchOrFocusPlugin "zellij:about" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + bind "c" { + LaunchOrFocusPlugin "configuration" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + bind "Ctrl o" { SwitchToMode "normal"; } + bind "p" { + LaunchOrFocusPlugin "plugin-manager" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + bind "s" { + LaunchOrFocusPlugin "zellij:share" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + bind "w" { + LaunchOrFocusPlugin "session-manager" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + } + shared_except "locked" { + bind "Alt left" { MoveFocusOrTab "left"; } + bind "Alt down" { MoveFocus "down"; } + bind "Alt up" { MoveFocus "up"; } + bind "Alt right" { MoveFocusOrTab "right"; } + bind "Alt +" { Resize "Increase"; } + bind "Alt -" { Resize "Decrease"; } + bind "Alt =" { Resize "Increase"; } + bind "Alt [" { PreviousSwapLayout; } + bind "Alt ]" { NextSwapLayout; } + bind "Alt f" { ToggleFloatingPanes; } + bind "Ctrl g" { SwitchToMode "locked"; } + bind "Alt h" { MoveFocusOrTab "left"; } + bind "Alt i" { MoveTab "left"; } + bind "Alt j" { MoveFocus "down"; } + bind "Alt k" { MoveFocus "up"; } + bind "Alt l" { MoveFocusOrTab "right"; } + bind "Alt n" { NewPane; } + bind "Alt o" { MoveTab "right"; } + bind "Alt p" { TogglePaneInGroup; } + bind "Alt Shift p" { ToggleGroupMarking; } + bind "Ctrl q" { Quit; } + } + shared_except "locked" "move" { + bind "Ctrl h" { SwitchToMode "move"; } + } + shared_except "locked" "session" { + bind "Ctrl o" { SwitchToMode "session"; } + } + shared_except "locked" "scroll" "search" "tmux" { + bind "Ctrl b" { SwitchToMode "tmux"; } + } + shared_except "locked" "scroll" "search" { + bind "Ctrl s" { SwitchToMode "scroll"; } + } + shared_except "locked" "tab" { + bind "Ctrl t" { SwitchToMode "tab"; } + } + shared_except "locked" "pane" { + bind "Ctrl p" { SwitchToMode "pane"; } + } + shared_except "locked" "resize" { + bind "Ctrl n" { SwitchToMode "resize"; } + } + shared_except "normal" "locked" "entersearch" { + bind "enter" { SwitchToMode "normal"; } + } + shared_except "normal" "locked" "entersearch" "renametab" "renamepane" { + bind "esc" { SwitchToMode "normal"; } + } + shared_among "pane" "tmux" { + bind "x" { CloseFocus; SwitchToMode "normal"; } + } + shared_among "scroll" "search" { + bind "PageDown" { PageScrollDown; } + bind "PageUp" { PageScrollUp; } + bind "left" { PageScrollUp; } + bind "down" { ScrollDown; } + bind "up" { ScrollUp; } + bind "right" { PageScrollDown; } + bind "Ctrl b" { PageScrollUp; } + bind "Ctrl c" { ScrollToBottom; SwitchToMode "normal"; } + bind "d" { HalfPageScrollDown; } + bind "Ctrl f" { PageScrollDown; } + bind "h" { PageScrollUp; } + bind "j" { ScrollDown; } + bind "k" { ScrollUp; } + bind "l" { PageScrollDown; } + bind "Ctrl s" { SwitchToMode "normal"; } + bind "u" { HalfPageScrollUp; } + } + entersearch { + bind "Ctrl c" { SwitchToMode "scroll"; } + bind "esc" { SwitchToMode "scroll"; } + bind "enter" { SwitchToMode "search"; } + } + renametab { + bind "esc" { UndoRenameTab; SwitchToMode "tab"; } + } + shared_among "renametab" "renamepane" { + bind "Ctrl c" { SwitchToMode "normal"; } + } + renamepane { + bind "esc" { UndoRenamePane; SwitchToMode "pane"; } + } + shared_among "session" "tmux" { + bind "d" { Detach; } + } + tmux { + bind "left" { MoveFocus "left"; SwitchToMode "normal"; } + bind "down" { MoveFocus "down"; SwitchToMode "normal"; } + bind "up" { MoveFocus "up"; SwitchToMode "normal"; } + bind "right" { MoveFocus "right"; SwitchToMode "normal"; } + bind "space" { NextSwapLayout; } + bind "\"" { NewPane "down"; SwitchToMode "normal"; } + bind "%" { NewPane "right"; SwitchToMode "normal"; } + bind "," { SwitchToMode "renametab"; } + bind "[" { SwitchToMode "scroll"; } + bind "Ctrl b" { Write 2; SwitchToMode "normal"; } + bind "c" { NewTab; SwitchToMode "normal"; } + bind "h" { MoveFocus "left"; SwitchToMode "normal"; } + bind "j" { MoveFocus "down"; SwitchToMode "normal"; } + bind "k" { MoveFocus "up"; SwitchToMode "normal"; } + bind "l" { MoveFocus "right"; SwitchToMode "normal"; } + bind "n" { GoToNextTab; SwitchToMode "normal"; } + bind "o" { FocusNextPane; } + bind "p" { GoToPreviousTab; SwitchToMode "normal"; } + bind "z" { ToggleFocusFullscreen; SwitchToMode "normal"; } + } +} + +// Plugin aliases - can be used to change the implementation of Zellij +// changing these requires a restart to take effect +plugins { + about location="zellij:about" + compact-bar location="zellij:compact-bar" + configuration location="zellij:configuration" + filepicker location="zellij:strider" { + cwd "/" + } + plugin-manager location="zellij:plugin-manager" + session-manager location="zellij:session-manager" + status-bar location="zellij:status-bar" + strider location="zellij:strider" + tab-bar location="zellij:tab-bar" + welcome-screen location="zellij:session-manager" { + welcome_screen true + } +} + +// Plugins to load in the background when a new session starts +// eg. "file:/path/to/my-plugin.wasm" +// eg. "https://example.com/my-plugin.wasm" +load_plugins { +} +web_client { + font "monospace" +} + +// Use a simplified UI without special fonts (arrow glyphs) +// Options: +// - true +// - false (Default) +// +// simplified_ui true + +// Choose the theme that is specified in the themes section. +// Default: default +// +// theme "dracula" + +// Choose the base input mode of zellij. +// Default: normal +// +// default_mode "locked" + +// Choose the path to the default shell that zellij will use for opening new panes +// Default: $SHELL +// +// default_shell "fish" + +// Choose the path to override cwd that zellij will use for opening new panes +// +// default_cwd "/tmp" + +// The name of the default layout to load on startup +// Default: "default" +// +// default_layout "compact" + +// The folder in which Zellij will look for layouts +// (Requires restart) +// +// layout_dir "/tmp" + +// The folder in which Zellij will look for themes +// (Requires restart) +// +// theme_dir "/tmp" + +// Toggle enabling the mouse mode. +// On certain configurations, or terminals this could +// potentially interfere with copying text. +// Options: +// - true (default) +// - false +// +// mouse_mode false + +// Toggle having pane frames around the panes +// Options: +// - true (default, enabled) +// - false +// +// pane_frames false + +// When attaching to an existing session with other users, +// should the session be mirrored (true) +// or should each user have their own cursor (false) +// (Requires restart) +// Default: false +// +// mirror_session true + +// Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP +// eg. when terminal window with an active zellij session is closed +// (Requires restart) +// Options: +// - detach (Default) +// - quit +// +// on_force_close "quit" + +// Configure the scroll back buffer size +// This is the number of lines zellij stores for each pane in the scroll back +// buffer. Excess number of lines are discarded in a FIFO fashion. +// (Requires restart) +// Valid values: positive integers +// Default value: 10000 +// +// scroll_buffer_size 10000 + +// Provide a command to execute when copying text. The text will be piped to +// the stdin of the program to perform the copy. This can be used with +// terminal emulators which do not support the OSC 52 ANSI control sequence +// that will be used by default if this option is not set. +// Examples: +// +// copy_command "xclip -selection clipboard" // x11 +// copy_command "wl-copy" // wayland +// copy_command "pbcopy" // osx +// +// copy_command "pbcopy" + +// Choose the destination for copied text +// Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. +// Does not apply when using copy_command. +// Options: +// - system (default) +// - primary +// +// copy_clipboard "primary" + +// Enable automatic copying (and clearing) of selection when releasing mouse +// Default: true +// +// copy_on_select true + +// Path to the default editor to use to edit pane scrollbuffer +// Default: $EDITOR or $VISUAL +// scrollback_editor "/usr/bin/vim" + +// A fixed name to always give the Zellij session. +// Consider also setting `attach_to_session true,` +// otherwise this will error if such a session exists. +// Default: +// +// session_name "My singleton session" + +// When `session_name` is provided, attaches to that session +// if it is already running or creates it otherwise. +// Default: false +// +// attach_to_session true + +// Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible +// Options: +// - true (default) +// - false +// +// auto_layout false + +// Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected +// Options: +// - true (default) +// - false +// +// session_serialization false + +// Whether pane viewports are serialized along with the session, default is false +// Options: +// - true +// - false (default) +// +// serialize_pane_viewport false + +// Scrollback lines to serialize along with the pane viewport when serializing sessions, 0 +// defaults to the scrollback size. If this number is higher than the scrollback size, it will +// also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true. +// +// scrollback_lines_to_serialize 10000 + +// Enable or disable the rendering of styled and colored underlines (undercurl). +// May need to be disabled for certain unsupported terminals +// (Requires restart) +// Default: true +// +// styled_underlines false + +// How often in seconds sessions are serialized +// +// serialization_interval 10000 + +// Enable or disable writing of session metadata to disk (if disabled, other sessions might not know +// metadata info on this session) +// (Requires restart) +// Default: false +// +// disable_session_metadata false + +// Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it) +// (Requires restart) +// Default: true (if the host terminal supports it) +// +// support_kitty_keyboard_protocol false +// Whether to make sure a local web server is running when a new Zellij session starts. +// This web server will allow creating new sessions and attaching to existing ones that have +// opted in to being shared in the browser. +// When enabled, navigate to http://127.0.0.1:8082 +// (Requires restart) +// +// Note: a local web server can still be manually started from within a Zellij session or from the CLI. +// If this is not desired, one can use a version of Zellij compiled without +// `web_server_capability` +// +// Possible values: +// - true +// - false +// Default: false +// +// web_server false +// Whether to allow sessions started in the terminal to be shared through a local web server, assuming one is +// running (see the `web_server` option for more details). +// (Requires restart) +// +// Note: This is an administrative separation and not intended as a security measure. +// +// Possible values: +// - "on" (allow web sharing through the local web server if it +// is online) +// - "off" (do not allow web sharing unless sessions explicitly opt-in to it) +// - "disabled" (do not allow web sharing and do not permit sessions started in the terminal to opt-in to it) +// Default: "off" +// +// web_sharing "off" +// A path to a certificate file to be used when setting up the web client to serve the +// connection over HTTPs +// +// web_server_cert "/path/to/cert.pem" +// A path to a key file to be used when setting up the web client to serve the +// connection over HTTPs +// +// web_server_key "/path/to/key.pem" +/// Whether to enforce https connections to the web server when it is bound to localhost +/// (127.0.0.0/8) +/// +/// Note: https is ALWAYS enforced when bound to non-local interfaces +/// +/// Default: false +// +// enforce_https_for_localhost false + +// Whether to stack panes when resizing beyond a certain size +// Default: true +// +// stacked_resize false + +// Whether to show tips on startup +// Default: true +// +// show_startup_tips false + +// Whether to show release notes on first version run +// Default: true +// +// show_release_notes false + +// Whether to enable mouse hover effects and pane grouping functionality +// default is true +// advanced_mouse_actions false + +// The ip address the web server should listen on when it starts +// Default: "127.0.0.1" +// (Requires restart) +// web_server_ip "127.0.0.1" + +// The port the web server should listen on when it starts +// Default: 8082 +// (Requires restart) +// web_server_port 8082 + +// A command to run (will be wrapped with sh -c and provided the RESURRECT_COMMAND env variable) +// after Zellij attempts to discover a command inside a pane when resurrecting sessions, the STDOUT +// of this command will be used instead of the discovered RESURRECT_COMMAND +// can be useful for removing wrappers around commands +// Note: be sure to escape backslashes and similar characters properly +// post_command_discovery_hook "echo $RESURRECT_COMMAND | sed "