├── .gitignore ├── .gitmodules ├── Brewfile ├── CHECKLIST.md ├── LICENSE ├── README.md ├── defaults.yaml ├── run ├── after │ ├── emacs_setup.sh │ ├── haskell_setup.sh │ ├── node_setup.sh │ ├── python_setup.sh │ ├── ruby_setup.sh │ ├── rust_setup.sh │ ├── tmux_setup.sh │ ├── vim_setup.sh │ ├── xcode_setup.sh │ └── z_macos_setup.sh ├── before │ └── fish_setup.sh └── lib │ ├── KeyBindings │ ├── DefaultKeyBinding.dict │ └── install │ ├── Launchterm │ ├── .gitignore │ ├── Package.resolved │ ├── Package.swift │ ├── Sources │ │ └── Launchterm │ │ │ └── main.swift │ ├── install │ └── org.mksanders.Launchterm.template.plist │ ├── assets │ ├── Alacritty.icns │ ├── Emacs.icns │ ├── LICENSE.md │ ├── San Jose.xccolortheme │ └── Zenburn.terminal │ └── set-icon └── symlinks ├── alacritty └── .config │ └── alacritty │ └── alacritty.yml ├── bash └── .bashrc ├── bin └── bin │ ├── em │ ├── emc │ └── quit ├── emacs └── .config │ └── doom │ ├── banners │ ├── LICENSE.md │ ├── emacs.png │ └── emacs@2x.png │ ├── config.org │ ├── init.el │ └── snippets │ └── ledger-mode │ ├── .yas-compiled-snippets.el │ ├── expense │ ├── income │ ├── payment │ └── transaction ├── fish ├── .config │ └── fish │ │ └── config.fish └── .functions.fish ├── git ├── .git_template │ └── hooks │ │ ├── gtags │ │ ├── post-checkout │ │ ├── post-commit │ │ ├── post-gtags-hook │ │ ├── post-merge │ │ └── post-rewrite ├── .gitconfig └── dot-gitignore ├── lldb └── .lldbinit ├── sh ├── .aliases ├── .hushlogin ├── .inputrc └── .shellcheckrc ├── tags ├── .ctags └── .globalrc ├── tmux └── .config │ └── tmux │ ├── sh │ └── smart-kill-pane │ └── tmux.conf ├── vim ├── .config │ └── nvim │ │ └── init.vim └── .vimrc └── zsh └── .zshrc /.gitignore: -------------------------------------------------------------------------------- 1 | Brewfile.lock.json 2 | symlinks/emacs/.config/doom/autoload.el 3 | symlinks/emacs/.config/doom/config.el 4 | symlinks/emacs/.config/doom/packages.el 5 | symlinks/emacs/.config/doom/secrets.el 6 | symlinks/fish/.config/fish/completions 7 | symlinks/fish/.config/fish/conf.d 8 | symlinks/fish/.config/fish/fish_variables 9 | symlinks/fish/.config/fish/functions 10 | symlinks/tmux/.config/tmux/plugins 11 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "zero"] 2 | path = zero 3 | url = https://github.com/zero-sh/zero.sh 4 | -------------------------------------------------------------------------------- /Brewfile: -------------------------------------------------------------------------------- 1 | # 2 | # Auto-generated using `brew bundle --dump --describe`. 3 | # 4 | tap "homebrew/cask" 5 | tap "homebrew/cask-fonts" 6 | tap "railwaycat/emacsmacport" 7 | tap "zero-sh/tap" 8 | 9 | # Bourne-Again SHell, a UNIX command interpreter 10 | brew "bash" 11 | 12 | # Clone of cat(1) with syntax highlighting and Git integration 13 | brew "bat" 14 | 15 | # Decentralized dependency manager for Cocoa 16 | brew "carthage" 17 | 18 | # Emacs dependency management 19 | brew "cask" 20 | 21 | # Collection of LLDB commands to assist debugging iOS apps 22 | brew "chisel" 23 | 24 | # Reimplementation of ctags(1) 25 | brew "ctags" 26 | 27 | # Tool for managing dock items 28 | brew "dockutil" 29 | 30 | # Select default apps for documents and URL schemes on macOS 31 | brew "duti" 32 | 33 | # Maintain consistent coding style between multiple editors 34 | brew "editorconfig" 35 | 36 | # Functional programming language for building browser-based GUIs 37 | brew "elm" 38 | 39 | # Elm source code formatter, inspired by gofmt 40 | brew "elm-format" 41 | 42 | # Modern replacement for 'ls' 43 | brew "exa" 44 | 45 | # Simple, fast and user-friendly alternative to find 46 | brew "fd" 47 | 48 | # User-friendly command-line shell for UNIX-like operating systems 49 | brew "fish" 50 | 51 | # Command-line fuzzy finder written in Go 52 | brew "fzf" 53 | 54 | # Distributed revision control system 55 | brew "git" 56 | 57 | # Syntax-highlighting pager for git and diff output 58 | brew "git-delta" 59 | 60 | # Source code tag system 61 | brew "global" 62 | 63 | # OpenGL and OpenGL ES reference compiler for shading languages 64 | brew "glslang" 65 | 66 | # Terminal interface for viewing git repositories 67 | brew "grv" 68 | 69 | # GNU Ubiquitous Intelligent Language for Extensions 70 | brew "guile" 71 | 72 | # Command-line accounting tool 73 | brew "hledger" 74 | 75 | # Haskell source code suggestions 76 | brew "hlint" 77 | 78 | # Command-line, double-entry accounting tool 79 | brew "ledger" 80 | 81 | # Mac App Store command-line interface 82 | brew "mas" 83 | 84 | # Remote terminal application 85 | brew "mosh" 86 | 87 | # Text-based UI library 88 | brew "ncurses" 89 | 90 | # Install and debug iPhone apps from the command-line 91 | brew "ios-deploy" 92 | 93 | # Swiss-army knife of markup format conversion 94 | brew "pandoc" 95 | 96 | # International Ispell 97 | brew "ispell" 98 | 99 | # Anti-bikeshedding Kotlin linter with built-in formatter 100 | brew "ktlint" 101 | 102 | # Small memory footprint, flexible web-server 103 | brew "lighttpd" 104 | 105 | # Ambitious Vim-fork focused on extensibility and agility 106 | brew "neovim" 107 | 108 | # Platform built on V8 to build network applications 109 | brew "node" 110 | 111 | # Search PDFs for strings matching a regular expression 112 | brew "pdfgrep" 113 | 114 | # Python version management 115 | brew "pyenv" 116 | 117 | # File browser 118 | brew "ranger" 119 | 120 | # Ruby version manager 121 | brew "rbenv" 122 | 123 | # Tools for file renaming 124 | brew "renameutils" 125 | 126 | # Search tool like grep and The Silver Searcher 127 | brew "ripgrep" 128 | 129 | # Experimental Rust compiler front-end for IDEs 130 | brew "rust-analyzer" 131 | 132 | # Intuitive find & replace CLI 133 | brew "sd" 134 | 135 | # Static analysis and lint tool, for (ba)sh scripts 136 | brew "shellcheck" 137 | 138 | # Autoformat shell script source code 139 | brew "shfmt" 140 | 141 | # Organize software neatly under a single directory tree (e.g. /usr/local) 142 | brew "stow" 143 | 144 | # Formatting tool for reformatting Swift code 145 | brew "swiftformat" 146 | 147 | # Tool to enforce Swift style and conventions 148 | brew "swiftlint" 149 | 150 | # Scripting with easy zero-conf dependency imports 151 | brew "swift-sh" 152 | 153 | # Very fast implementation of tldr in Rust 154 | brew "tealdeer" 155 | 156 | # Send macOS User Notifications from the command-line 157 | brew "terminal-notifier" 158 | 159 | # Granddaddy of HTML tools, with support for modern standards 160 | brew "tidy-html5" 161 | 162 | # Terminal multiplexer 163 | brew "tmux" 164 | 165 | # Language for application scale JavaScript development 166 | brew "typescript" 167 | 168 | # Internet file retriever 169 | brew "wget" 170 | 171 | # Fast static site generator in a single binary with everything built-in 172 | brew "zola" 173 | 174 | # Small tool to set macOS user defaults from a YAML file 175 | brew "zero-sh/tap/apply-user-defaults" 176 | 177 | # Radically simple personal bootstrapping tool for macOS 178 | brew "zero-sh/tap/zero" 179 | 180 | cask "1password" 181 | cask "acorn" 182 | cask "alacritty" 183 | cask "backblaze" 184 | cask "calibre" 185 | cask "chromium" 186 | cask "dash" 187 | cask "discord" 188 | cask "dropbox" 189 | cask "emacs-mac" 190 | cask "firefox" 191 | cask "flux" 192 | cask "font-fira-mono" 193 | cask "font-fira-mono-for-powerline" 194 | cask "gitup" 195 | cask "gpg-suite" 196 | cask "iina" 197 | cask "imageoptim" 198 | cask "lingon-x" 199 | cask "little-snitch" 200 | cask "pacifist" 201 | cask "pine" 202 | cask "protonvpn" 203 | cask "qlcolorcode" 204 | cask "qlstephen" 205 | cask "rectangle" 206 | cask "shrinkit" 207 | cask "sketch" 208 | cask "transmission" 209 | cask "transmit" 210 | 211 | mas "Amphetamine", id: 937984704 212 | mas "Cookie", id: 1473091386 213 | mas "DaisyDisk", id: 411643860 214 | mas "Fantastical", id: 975937182 215 | mas "Haskell", id: 841285201 216 | mas "Keynote", id: 409183694 217 | mas "Numbers", id: 409203825 218 | mas "PDF Expert", id: 1055273043 219 | mas "Pages", id: 409201541 220 | mas "Pixelmator", id: 407963104 221 | mas "Slack", id: 803453959 222 | mas "xScope", id: 889428659 223 | mas "The Unarchiver", id: 425424353 224 | mas "Xcode", id: 497799835 225 | -------------------------------------------------------------------------------- /CHECKLIST.md: -------------------------------------------------------------------------------- 1 | Manual steps that are still done on every new setup: 2 | 3 | 1. Run `~/.dotfiles/zero/setup`. 4 | 2. Restart once completed (and as-needed for system updates done by the script). 5 | 3. Rotate or import GPG keys. 6 | 4. Rotate or import SSH keys. 7 | 5. Import software licenses. 8 | 6. Copy various documents from backup; login to applications. 9 | 10 | Then, in no particular order: 11 | 12 | - System Preferences > Keyboard > Key Repeat > Fast. 13 | 14 | - System Preferences > Keyboard > Delay Until Repeat > Short. 15 | 16 | - System Preferences > Keyboard > Modifier Keys... > Caps Lock Key > Control. 17 | 18 | - System Preferences > Display > Night Shift > Schedule > Sunset to Sunrise. 19 | 20 | - System Preferences > Display > Night Shift > Color Temperature > More Warm 21 | (max). 22 | 23 | - System Preferences > Language & Region > Time format > 24-Hour Time. 24 | 25 | - System Preferences > GPG Suite > Remember for 86400. 26 | 27 | - Change login shell to `/usr/local/bin/fish` via System Preferences > Users & 28 | Groups > Current User > Advanced Options (right click) > Login shell. 29 | 30 | - Change system colors under System Preferences > General > Access Color & 31 | Highlight Color. 32 | 33 | - Turn off font smoothing under System Preferences > General > Use font 34 | smoothing when available. 35 | 36 | - Turn off System Preferences > Spotlight > Allow Spotlight Suggestions in Look 37 | up. 38 | 39 | - Turn off various categories in System Preferences > Spotlight > Search 40 | Results. 41 | 42 | - Turn off Messages > Edit > Substitutions > Emoji. 43 | 44 | - Turn off Firefox > Preferences > Privacy & Security > Firefox Data Collection 45 | and Use > Allow Firefox to install and run studies. 46 | 47 | - Turn on Firefox > Preferences > Privacy & Security > Prevent accessibility 48 | services from accessing your browser. 49 | 50 | - Set host name under System Preferences > Sharing > Computer Name. 51 | 52 | - Mail > Preferences > Composing > Message Format: Plain Text. 53 | 54 | - Firefox > View > Toolbars > Customize... > Density > Compact. 55 | 56 | - Firefox > Preferences > Privacy & Security > History > Firefox Will > Use 57 | custom settings for history. 58 | 59 | - Firefox > Preferences > Privacy & Security > History > Remember search and 60 | form history > false. 61 | 62 | - Firefox > about:config > `layout.css.osx-font-smoothing.enable` > false. 63 | 64 | - Firefox > about:config > `dom.event.clipboardevents.enabled` > false. 65 | 66 | - Flux > Preferences > Sunset > Normal/Daylight. (I use Night Shift for sunset, 67 | and Flux for "Bedtime".) 68 | 69 | - Flux > Preferences > Bedtime > 1200K (max). 70 | 71 | - Edit `/etc/pam.d/sudo` and add the following as the first two lines to enable 72 | [PAM Touch ID](https://github.com/Reflejo/pam-touchID) and [PAM Watch 73 | ID](https://github.com/biscuitehh/pam-watchid): 74 | 75 | ``` 76 | auth sufficient pam_touchid.so "reason=execute a command as root" 77 | auth sufficient pam_watchid.so "reason=execute a command as root" 78 | ``` 79 | 80 | Some of these are preferably not automated, others weren't possible AFAICT. 81 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2019 Michael Sanders. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Installation 2 | 3 | Run this: 4 | 5 | ```sh 6 | $ git clone --recursive https://github.com/msanders/setup ~/.dotfiles 7 | $ caffeinate ~/.dotfiles/zero/setup 8 | ``` 9 | 10 | This will run the appropriate installers and symlink the contained files to your 11 | home directory. Everything is configured and tweaked within `~/.dotfiles`. 12 | 13 | **Note**: it may be necessary to log in to the App Store before running, as 14 | `brew bundle` will invoke [`mas`](https://github.com/mas-cli/mas) which requires 15 | it. 16 | 17 | For a full list of steps done on new machines, see 18 | [CHECKLIST.md](./CHECKLIST.md). 19 | 20 | ## 21 | 22 | This repo uses [zero.sh](https://github.com/zero-sh/zero.sh) for system setup 23 | and configuration. 24 | 25 | Licensed under the MIT License, except where otherwise noted. See 26 | [LICENSE](LICENSE) for more information. 27 | -------------------------------------------------------------------------------- /defaults.yaml: -------------------------------------------------------------------------------- 1 | NSGlobalDomain: 2 | # System Preferences > Keyboard > Shortcuts > Full Keyboard Access > All 3 | # controls. 4 | AppleKeyboardUIMode: 3 5 | 6 | # System Preferences > General > Sidebar icon size > Large. 7 | NSTableViewDefaultSizeMode: 3 8 | 9 | # Disable press and hold character picker. 10 | ApplePressAndHoldEnabled: false 11 | 12 | # Disable smooth scrolling. 13 | NSScrollAnimationEnabled: false 14 | 15 | com.apple.desktopservices: 16 | # Disable .DS_Store files on network drives. 17 | DSDontWriteNetworkStores: true 18 | 19 | # Disable .DS_Store files on external drives. 20 | DSDontWriteUSBStores: true 21 | 22 | com.apple.finder: 23 | # Finder > View > Show view options > Sort Group By > Name. 24 | FXArrangeGroupViewBy: Name 25 | 26 | # Finder > Preferences > Advanced > When performing a search > Search the 27 | # current folder. 28 | FXDefaultSearchScope: SCcf 29 | 30 | # Finder > View > Show view options > Group By > None. 31 | FXPreferredGroupBy: None 32 | 33 | # Finder > View > As List. 34 | FXPreferredViewStyle: Nlsv 35 | 36 | # Finder > Preferences > New Finder windows show > Home directory. 37 | NewWindowTarget: PfHm 38 | 39 | # Finder > Preferences > New Finder windows show > Home directory. 40 | NewWindowTargetPath: "file://${HOME}" 41 | 42 | # Enable "Quit Finder" menu item. 43 | QuitMenuItem: true 44 | 45 | # Finder > Preferences > Show these items on the desktop > Hard disks. 46 | ShowHardDrivesOnDesktop: false 47 | 48 | com.apple.iTunes: 49 | # iTunes > Preferences > Devices > Prevent iPods, iPhones, and iPads from 50 | # syncing automatically. 51 | dontAutomaticallySyncIPods: true 52 | 53 | com.apple.Safari: 54 | # Use substring search by default in Safari. 55 | FindOnPageMatchesWordStartsOnly: false 56 | 57 | com.apple.dt.Xcode: 58 | # Xcode > Preferences > Text Editing > Page guide at column. 59 | DVTTextShowPageGuide: true 60 | 61 | # Xcode > Preferences > Text Editing > While editing: Automatically trim 62 | # trailing whitespace. 63 | DVTTextEditorTrimTrailingWhitespace: true 64 | 65 | # Xcode > Preferences > Text Editing > While editing: Automatically trim 66 | # trailing whitespace > Including whitespace-only lines. 67 | DVTTextEditorTrimWhitespaceOnlyLines: true 68 | 69 | # Xcode > Preferences > Text Editing > Page guide at column: 120. 70 | DVTTextPageGuideLocation: 120 71 | 72 | # Xcode > Preferences > General > Issue Navigator Detail > Up to Ten Lines. 73 | IDESearchNavigatorDetailLevel: 10 74 | 75 | # Show build timer within Xcode UI. 76 | ShowBuildOperationDuration: true 77 | 78 | # Xcode > Preferences > Fonts & Colors > Theme > San Jose. 79 | XCFontAndColorCurrentTheme: "San Jose.xccolortheme" 80 | XCFontAndColorCurrentDarkTheme: "San Jose.xccolortheme" 81 | 82 | com.apple.TextEdit: 83 | # TextEdit > Preferences > New Document > Plain text. 84 | RichText: false 85 | 86 | com.apple.Terminal: 87 | # Terminal > Secure Keyboard Entry. 88 | SecureKeyboardEntry: true 89 | 90 | # Set custom theme as default. 91 | "Default Window Settings": Zenburn 92 | "Startup Window Settings": Zenburn 93 | 94 | com.apple.SoftwareUpdate: 95 | # System Preferences > Software Update > Advanced... > Automatically check 96 | # for updates. 97 | AutomaticCheckEnabled: true 98 | 99 | # System Preferences > Software Update > Advanced... > Download new updates 100 | # when available. 101 | AutomaticDownload: true 102 | 103 | org.gnu.Emacs: 104 | # Enable natural title bar patch for Emacs. 105 | TransparentTitleBar: DARK 106 | -------------------------------------------------------------------------------- /run/after/emacs_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | EMACS_DIR="$HOME/.emacs.d" 5 | 6 | if [ ! -d "$EMACS_DIR" ]; then 7 | git clone https://github.com/hlissner/doom-emacs "$EMACS_DIR" 8 | "$EMACS_DIR/bin/doom" install 9 | else 10 | "$EMACS_DIR/bin/doom" --yes upgrade 11 | fi 12 | -------------------------------------------------------------------------------- /run/after/haskell_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | if ! command -v stack >/dev/null; then 5 | curl -sSL https://get.haskellstack.org/ | sh 6 | fi 7 | 8 | set +x 9 | stack update 10 | stack upgrade 11 | stack install hoogle 12 | set -x 13 | -------------------------------------------------------------------------------- /run/after/node_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | echo "Updating node dependencies." 5 | npm install -g tern 6 | -------------------------------------------------------------------------------- /run/after/python_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | eval "$(pyenv init -)" 3 | set -o errexit 4 | 5 | pyenv install 2.7.18 --skip-existing 6 | pyenv install 3.6.12 --skip-existing 7 | pyenv install 3.7.9 --skip-existing 8 | pyenv install 3.8.6 --skip-existing 9 | pyenv install 3.9.0 --skip-existing 10 | 11 | install_common_dependencies() { 12 | pip install -U pip setuptools virtualenv pipenv pytest nose pyflakes isort \ 13 | setuptools-rust 14 | } 15 | 16 | install_py3_dependencies() { 17 | pip install -U black 18 | } 19 | 20 | pyenv shell 2.7.18 21 | install_common_dependencies 22 | pyenv shell 3.6.12 23 | install_common_dependencies 24 | install_py3_dependencies 25 | pyenv shell 3.7.9 26 | install_common_dependencies 27 | install_py3_dependencies 28 | pyenv shell 3.8.6 29 | install_common_dependencies 30 | install_py3_dependencies 31 | pyenv shell 3.9.0 32 | install_common_dependencies 33 | install_py3_dependencies 34 | pyenv global 3.9.0 35 | -------------------------------------------------------------------------------- /run/after/ruby_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | export RBENV_ROOT=/usr/local/var/rbenv 5 | 6 | if command -v rbenv >/dev/null; then 7 | eval "$(rbenv init -)" 8 | else 9 | echo >&2 "Error: rbenv not installed" 10 | exit 1 11 | fi 12 | 13 | echo "Updating Ruby" 14 | rbenv install 2.6.6 --skip-existing 15 | rbenv global 2.6.6 16 | gem update --system 17 | gem install pry rubocop 18 | -------------------------------------------------------------------------------- /run/after/rust_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | export PATH="$HOME/.cargo/bin:$PATH" 5 | COMPLETIONS_DIR="$HOME/.config/fish/completions" 6 | 7 | if ! command -v rustup >/dev/null; then 8 | curl https://sh.rustup.rs -sSf | sh 9 | fi 10 | 11 | set -x 12 | mkdir -p "$COMPLETIONS_DIR" 13 | rustup default stable 14 | rustup install nightly 15 | rustup update 16 | rustup completions fish >"$COMPLETIONS_DIR/rustup.fish" 17 | rustup component add rust-src 18 | rustup component add rustfmt clippy 19 | 20 | cargo install bottom 21 | -------------------------------------------------------------------------------- /run/after/tmux_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | TPM_DIR="$HOME/.config/tmux/plugins/tpm" 5 | 6 | if [ ! -d "$HOME/.config/tmux/plugins/tpm" ]; then 7 | git clone https://github.com/tmux-plugins/tpm "$TPM_DIR" 8 | fi 9 | -------------------------------------------------------------------------------- /run/after/vim_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | VIM_PLUG="$HOME/.vim/autoload/plug.vim" 5 | 6 | if [ ! -f "$VIM_PLUG" ]; then 7 | echo "Downloading vim-plug..." 8 | curl -#fLo "$VIM_PLUG" --create-dirs \ 9 | https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 10 | fi 11 | 12 | nvim +PlugUpdate +PlugUpgrade +qall 13 | -------------------------------------------------------------------------------- /run/after/xcode_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 5 | TARGET_DIR="$HOME/Library/Developer/Xcode/UserData/FontAndColorThemes/" 6 | 7 | echo "Installing Xcode theme..." 8 | mkdir -p "$TARGET_DIR" 9 | cp "$SCRIPT_DIR/../lib/assets/"*.xccolortheme "$TARGET_DIR" 10 | echo "Successfully installed Xcode theme." 11 | -------------------------------------------------------------------------------- /run/after/z_macos_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 5 | REPOS_DIR="$(mktemp -d -t macos_setup_repos)" 6 | 7 | trap 'rm -rf "$REPOS_DIR"' EXIT 8 | ( 9 | echo "Installing PAM Touch ID..." 10 | cd "$REPOS_DIR" 11 | set -x 12 | git clone https://github.com/Reflejo/pam-touchID.git 13 | cd pam-touchID 14 | sudo make install 15 | set +x 16 | 17 | cd - 18 | echo "Installing PAM Watch ID..." 19 | set -x 20 | git clone https://github.com/biscuitehh/pam-watchid.git 21 | cd pam-watchid 22 | sudo make install 23 | set +x 24 | ) 25 | 26 | echo "Updating Dock..." 27 | 28 | set -x 29 | dockutil --remove all --no-restart 30 | dockutil --add /Applications/Firefox.app --no-restart 31 | dockutil --add /Applications/Emacs.app --no-restart 32 | dockutil --add /Applications/Alacritty.app --no-restart 33 | dockutil --add ~/Downloads --display stack # Implicitly restarts the Dock. 34 | set +x 35 | 36 | echo "Updating default application handlers..." 37 | 38 | set -x 39 | duti -s org.gnu.Emacs com.apple.property-list all 40 | duti -s org.gnu.Emacs com.apple.xcode.strings-text all 41 | duti -s org.gnu.Emacs com.netscape.javascript-source all 42 | duti -s org.gnu.Emacs net.daringfireball.markdown all 43 | duti -s org.gnu.Emacs public.c-header all 44 | duti -s org.gnu.Emacs public.c-plus-plus-source all 45 | duti -s org.gnu.Emacs public.c-source all 46 | duti -s org.gnu.Emacs public.comma-separated-values-text all 47 | duti -s org.gnu.Emacs public.data all 48 | duti -s org.gnu.Emacs public.json all 49 | duti -s org.gnu.Emacs public.objective-c-source all 50 | duti -s org.gnu.Emacs public.perl-script all 51 | duti -s org.gnu.Emacs public.plain-text all 52 | duti -s org.gnu.Emacs public.precompiled-c-header all 53 | duti -s org.gnu.Emacs public.python-script all 54 | duti -s org.gnu.Emacs public.ruby-script all 55 | duti -s org.gnu.Emacs public.shell-script all 56 | duti -s org.gnu.Emacs public.swift-source all 57 | duti -s org.gnu.Emacs public.unix-executable all 58 | duti -s org.gnu.Emacs public.xml all 59 | duti -s org.gnu.Emacs public.yaml all 60 | set +x 61 | 62 | ( 63 | cd "$SCRIPT_DIR/../lib" 64 | 65 | echo "Adding Terminal theme..." 66 | if ! defaults read com.apple.Terminal "Window Settings" | grep -Fw Zenburn >/dev/null; then 67 | open -a Terminal assets/Zenburn.terminal 68 | fi 69 | 70 | echo "Applying icons..." 71 | ./set-icon assets/Alacritty.icns /Applications/Alacritty.app 72 | ./set-icon assets/Emacs.icns /Applications/Emacs.app 73 | 74 | echo "Installing custom utilities..." 75 | ./KeyBindings/install 76 | ./LaunchTerm/install 77 | ) 78 | 79 | echo "Adding applications to Gatekeeper whitelist..." 80 | (while read -r app; do 81 | spctl --remove "$app" 2>/dev/null ||: 82 | spctl --add "$app" 83 | echo "Whitelisted $app." 84 | done) <<-EOF 85 | /Applications/Alacritty.app 86 | /Applications/Chromium.app 87 | /Applications/Pine.app 88 | $HOME/Library/QuickLook/Pacifist.qlgenerator 89 | $HOME/Library/QuickLook/QLColorCode.qlgenerator 90 | $HOME/Library/QuickLook/QLStephen.qlgenerator 91 | EOF 92 | 93 | echo "Resetting QuickLook." 94 | set -x 95 | qlmanage -r 96 | qlmanage -r cache 97 | killall Finder 98 | set +x 99 | 100 | echo "Disabling Homebrew analytics." 101 | set -x 102 | brew analytics off 103 | set +x 104 | 105 | echo "Disabling netbiosd." 106 | set -x 107 | sudo launchctl disable system/netbiosd 108 | sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.netbiosd.plist 2>/dev/null 109 | sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.netbiosd.plist 2>/dev/null 110 | set +x 111 | -------------------------------------------------------------------------------- /run/before/fish_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | OMF_DOWNLOAD_DIR="$(mktemp -d -t ohmyfish)" 5 | trap 'rm -rf "$OMF_DOWNLOAD_DIR"' EXIT 6 | ( 7 | cd "$OMF_DOWNLOAD_DIR" 8 | echo "Downloading Oh My Fish..." 9 | curl --progress-bar -L https://get.oh-my.fish >install 10 | echo "Installing..." 11 | NONINTERACTIVE=true fish ./install --path=~/.local/share/omf --config=~/.config/omf --yes 12 | ) 13 | 14 | fish -c "omf install bobthefish" 15 | fish -c "omf install z" 16 | -------------------------------------------------------------------------------- /run/lib/KeyBindings/DefaultKeyBinding.dict: -------------------------------------------------------------------------------- 1 | // 2 | // Adopted from 3 | // http://www.deepsky.com/~misaka/MacOSX/DefaultKeyBinding.dict 4 | // 5 | // Original bindings grabbed from Mike Ferris of lorax.com as shipped 6 | // with his TextExtras package. Modified by Mishka Gorodnitzky 7 | // . The following note is kept from those original 8 | // bindings. 9 | // 10 | // C-a and C-e bindings added, thanks to Patrick Linskey. (11/05/2003) 11 | // 12 | 13 | // This property list has not been converted to XML because XML 14 | // key-binding files are really nasty to try to read in a text editor... 15 | // PropertyListEditor using the "Show Strings as ASCII" option does OK, 16 | // but even that will put in real carriage returns and tabs and stuff 17 | // instead of backslash escape sequences and you also lose the useful 18 | // comments that way. 19 | 20 | // When editing this file remember to be carefull with your syntax. 21 | // If you forget a semicolon or inadvertently insert a 22 | // control-character (due to testing while editing this file in 23 | // TextEdit, for example) then this file will be silently ignored and 24 | // can lead to puzzling behaviour while testing changes. 25 | { 26 | "~f" = "moveWordForward:"; 27 | "~b" = "moveWordBackward:"; 28 | "~<" = "moveToBeginningOfDocument:"; 29 | "~>" = "moveToEndOfDocument:"; 30 | "~v" = "pageUp:"; 31 | "^v" = "pageDown:"; 32 | "~d" = "deleteWordForward:"; 33 | "^w" = "deleteWordBackward:"; 34 | "~\010" = "deleteWordBackward:"; /* M-backspace */ 35 | "~a" = "moveToBeginningOfParagraph:"; 36 | "~e" = "moveToEndOfParagraph:"; 37 | "^/" = "undo:"; 38 | "^_" = "undo:"; 39 | "~c" = "capitalizeWord:"; 40 | "~u" = "uppercaseWord:"; 41 | "~l" = "lowercaseWord:"; 42 | "^t" = "transpose:"; 43 | "~t" = "transposeWords:"; 44 | "~/" = "complete:"; 45 | "^g" = "_cancelKey:"; 46 | "^a" = "moveToBeginningOfLine:"; 47 | "^e" = "moveToEndOfLine:"; 48 | "^i" = "insertTab:"; 49 | "^u" = "deleteToBeginningOfLine:"; 50 | "^l" = "centerSelectionInVisibleArea:"; 51 | 52 | // Bind some ^x combos. 53 | "^x" = { 54 | "^x" = "swapWithMark:"; /* C-x C-x */ 55 | "^m" = "selectToMark:"; /* C-x C-m */ 56 | "^s" = "save:"; /* C-x C-s */ 57 | "^w" = "saveAs:"; /* C-x C-w */ 58 | }; 59 | 60 | // Mark-point stuff (Emacs-style mark and point bindings are 61 | // implemented but not bound by default. In the text system the 62 | // mark and point are ranges, not just locations. The "point" is 63 | // the selected range.) 64 | "^@" = "setMark:"; 65 | "^ " = "setMark:"; 66 | } 67 | -------------------------------------------------------------------------------- /run/lib/KeyBindings/install: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | OUTPUT_DIR="$HOME/Library/KeyBindings" 5 | SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 6 | 7 | # Apparently DefaultKeyBinding.dict can't be symlinked. 8 | # See https://apple.stackexchange.com/a/53110 9 | mkdir -p "$OUTPUT_DIR" 10 | cp -p "$SCRIPT_DIR/DefaultKeyBinding.dict" "$OUTPUT_DIR" 11 | echo "Installed Key Bindings." 12 | -------------------------------------------------------------------------------- /run/lib/Launchterm/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | -------------------------------------------------------------------------------- /run/lib/Launchterm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "HotKey", 6 | "repositoryURL": "https://github.com/soffes/HotKey.git", 7 | "state": { 8 | "branch": null, 9 | "revision": "c13662730cb5bc28de4a799854bbb018a90649bf", 10 | "version": "0.1.3" 11 | } 12 | } 13 | ] 14 | }, 15 | "version": 1 16 | } 17 | -------------------------------------------------------------------------------- /run/lib/Launchterm/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.1 2 | import PackageDescription 3 | 4 | let package = Package( 5 | name: "Launchterm", 6 | dependencies: [ 7 | .package(url: "https://github.com/soffes/HotKey.git", .upToNextMinor(from: "0.1.3")), 8 | ], 9 | targets: [ 10 | .target(name: "Launchterm", dependencies: ["HotKey"]), 11 | ] 12 | ) 13 | -------------------------------------------------------------------------------- /run/lib/Launchterm/Sources/Launchterm/main.swift: -------------------------------------------------------------------------------- 1 | import AppKit 2 | import HotKey 3 | 4 | func main() { 5 | let hotKey = HotKey(key: .space, modifiers: [.option]) 6 | hotKey.keyDownHandler = { 7 | NSWorkspace.shared.launchApplication("Alacritty") 8 | } 9 | 10 | NSApplication.shared.run() 11 | } 12 | 13 | main() 14 | -------------------------------------------------------------------------------- /run/lib/Launchterm/install: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | AGENT_DIR="$HOME/Library/LaunchAgents" 5 | DOMAIN="org.mksanders.Launchterm" 6 | SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 7 | TARGET="Launchterm" 8 | USER="$(whoami)" 9 | 10 | PLIST="$AGENT_DIR/$DOMAIN.plist" 11 | SUPPORT_DIR="$HOME/Library/Application Support/$TARGET" 12 | 13 | main() ( 14 | mkdir -p "$SUPPORT_DIR" 15 | mkdir -p "$AGENT_DIR" 16 | 17 | cd "$SCRIPT_DIR" 18 | echo "Building Launchterm..." 19 | swift build -c release -Xswiftc -Osize 20 | cp .build/release/Launchterm "$SUPPORT_DIR/$TARGET" 21 | strip "$SUPPORT_DIR/$TARGET" 22 | sed -e "s/{USER}/$USER/" "$SCRIPT_DIR/$DOMAIN.template.plist" > "$PLIST" 23 | 24 | if launchctl list | grep -Fq "$DOMAIN"; then 25 | launchctl unload "$PLIST" 2>/dev/null 26 | fi 27 | 28 | launchctl load -w "$PLIST" 29 | echo "Installed $TARGET." 30 | ) 31 | 32 | main 33 | -------------------------------------------------------------------------------- /run/lib/Launchterm/org.mksanders.Launchterm.template.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | OnDemand 6 | 7 | KeepAlive 8 | 9 | RunAtLoad 10 | 11 | Label 12 | org.mksanders.Launchterm 13 | Program 14 | /Users/{USER}/Library/Application Support/Launchterm/Launchterm 15 | 16 | 17 | -------------------------------------------------------------------------------- /run/lib/assets/Alacritty.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/msanders/setup/a76a3a33b9cfda78242bd2aeda9086fdf82a0ce1/run/lib/assets/Alacritty.icns -------------------------------------------------------------------------------- /run/lib/assets/Emacs.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/msanders/setup/a76a3a33b9cfda78242bd2aeda9086fdf82a0ce1/run/lib/assets/Emacs.icns -------------------------------------------------------------------------------- /run/lib/assets/LICENSE.md: -------------------------------------------------------------------------------- 1 | # Resource Licenses 2 | 3 | [Alacritty.icns](Alacritty.icns) is taken under the UNLICENSE from 4 | [jasonlong/iterm2-icons](https://github.com/jasonlong/iterm2-icons). 5 | 6 | [Emacs.icns](Emacs.icns) is taken under a free for non-commercial use license 7 | from [Icon 8 | Archive](http://www.iconarchive.com/show/button-ui-requests-6-icons-by-blackvariant/Emacs-icon.html). 9 | 10 | [Zenburn.terminal](Zenburn.terminal) is a slightly customized version of 11 | [bdesham/zenburn-terminal](https://github.com/bdesham/zenburn-terminal) 12 | released into the public domain under the UNLICENSE. 13 | 14 | [San Jose.xccolortheme](San%20Jose.xccolortheme) is taken under the MIT license 15 | from [patmurraydev/San-Jose](https://github.com/patmurraydev/San-Jose). It is 16 | identical to the original theme except the font has been increased to 14pt. 17 | -------------------------------------------------------------------------------- /run/lib/assets/San Jose.xccolortheme: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | DVTConsoleDebuggerInputTextColor 6 | 1 1 1 1 7 | DVTConsoleDebuggerInputTextFont 8 | SFMono-Bold - 11.0 9 | DVTConsoleDebuggerOutputTextColor 10 | 1 1 1 1 11 | DVTConsoleDebuggerOutputTextFont 12 | SFMono-Regular - 11.0 13 | DVTConsoleDebuggerPromptTextColor 14 | 0.490196 0.752941 0.603922 1 15 | DVTConsoleDebuggerPromptTextFont 16 | SFMono-Bold - 11.0 17 | DVTConsoleExectuableInputTextColor 18 | 1 1 1 1 19 | DVTConsoleExectuableInputTextFont 20 | SFMono-Regular - 11.0 21 | DVTConsoleExectuableOutputTextColor 22 | 1 1 1 1 23 | DVTConsoleExectuableOutputTextFont 24 | SFMono-Bold - 11.0 25 | DVTConsoleTextBackgroundColor 26 | 0.223529 0.25098 0.270588 1 27 | DVTConsoleTextInsertionPointColor 28 | 1 1 1 1 29 | DVTConsoleTextSelectionColor 30 | 0.397 0.397 0.302 1 31 | DVTDebuggerInstructionPointerColor 32 | 0.12 0.31 0.34 1 33 | DVTFontAndColorVersion 34 | 1 35 | DVTLineSpacing 36 | 1.1000000238418579 37 | DVTMarkupTextBackgroundColor 38 | 0.18856 0.195 0.22444 1 39 | DVTMarkupTextBorderColor 40 | 0.253475 0.2594 0.286485 1 41 | DVTMarkupTextCodeFont 42 | SFMono-Regular - 10.0 43 | DVTMarkupTextEmphasisColor 44 | 1 1 1 1 45 | DVTMarkupTextEmphasisFont 46 | .AppleSystemUIFontItalic - 10.0 47 | DVTMarkupTextInlineCodeColor 48 | 1 1 1 0.7 49 | DVTMarkupTextLinkColor 50 | 0.33 0.247124 0.894195 1 51 | DVTMarkupTextLinkFont 52 | .AppleSystemUIFont - 10.0 53 | DVTMarkupTextNormalColor 54 | 1 1 1 1 55 | DVTMarkupTextNormalFont 56 | .AppleSystemUIFont - 10.0 57 | DVTMarkupTextOtherHeadingColor 58 | 1 1 1 0.5 59 | DVTMarkupTextOtherHeadingFont 60 | .AppleSystemUIFont - 14.0 61 | DVTMarkupTextPrimaryHeadingColor 62 | 1 1 1 1 63 | DVTMarkupTextPrimaryHeadingFont 64 | .AppleSystemUIFont - 24.0 65 | DVTMarkupTextSecondaryHeadingColor 66 | 1 1 1 1 67 | DVTMarkupTextSecondaryHeadingFont 68 | .AppleSystemUIFont - 18.0 69 | DVTMarkupTextStrongColor 70 | 1 1 1 1 71 | DVTMarkupTextStrongFont 72 | .AppleSystemUIFontBold - 10.0 73 | DVTScrollbarMarkerAnalyzerColor 74 | 0.403922 0.372549 1 1 75 | DVTScrollbarMarkerBreakpointColor 76 | 0.290196 0.290196 0.968627 1 77 | DVTScrollbarMarkerDiffColor 78 | 0.556863 0.556863 0.556863 1 79 | DVTScrollbarMarkerDiffConflictColor 80 | 0.968627 0.290196 0.290196 1 81 | DVTScrollbarMarkerErrorColor 82 | 0.968627 0.290196 0.290196 1 83 | DVTScrollbarMarkerRuntimeIssueColor 84 | 0.643137 0.509804 1 1 85 | DVTScrollbarMarkerWarningColor 86 | 0.937255 0.717647 0.34902 1 87 | DVTSourceTextBackground 88 | 0 0 0 1 89 | DVTSourceTextBlockDimBackgroundColor 90 | 0.5 0.5 0.5 1 91 | DVTSourceTextCurrentLineHighlightColor 92 | 0.223529 0.25098 0.270588 1 93 | DVTSourceTextInsertionPointColor 94 | 1 1 1 1 95 | DVTSourceTextInvisiblesColor 96 | 0.5 0.5 0.5 1 97 | DVTSourceTextSelectionColor 98 | 0.111319 0.296269 0.339113 1 99 | DVTSourceTextSyntaxColors 100 | 101 | xcode.syntax.attribute 102 | 0.756863 0.517647 0.364706 1 103 | xcode.syntax.character 104 | 0.627451 0.588235 0.784314 1 105 | xcode.syntax.comment 106 | 0.741176 0.741176 0.741176 1 107 | xcode.syntax.comment.doc 108 | 0.741176 0.741176 0.741176 1 109 | xcode.syntax.comment.doc.keyword 110 | 0.741176 0.741176 0.741176 1 111 | xcode.syntax.declaration.other 112 | 0.254902 0.631373 0.752941 1 113 | xcode.syntax.declaration.type 114 | 0.362946 0.846428 0.998966 1 115 | xcode.syntax.identifier.class 116 | 0.490196 0.752941 0.603922 1 117 | xcode.syntax.identifier.class.system 118 | 0.521569 0.701961 0.8 1 119 | xcode.syntax.identifier.constant 120 | 0.490196 0.752941 0.603922 1 121 | xcode.syntax.identifier.constant.system 122 | 0.521569 0.701961 0.8 1 123 | xcode.syntax.identifier.function 124 | 0.490196 0.752941 0.603922 1 125 | xcode.syntax.identifier.function.system 126 | 0.521569 0.701961 0.8 1 127 | xcode.syntax.identifier.macro 128 | 0.803922 0.588235 0.439216 1 129 | xcode.syntax.identifier.macro.system 130 | 0.803922 0.588235 0.439216 1 131 | xcode.syntax.identifier.type 132 | 0.490196 0.752941 0.603922 1 133 | xcode.syntax.identifier.type.system 134 | 0.521569 0.701961 0.8 1 135 | xcode.syntax.identifier.variable 136 | 0.490196 0.752941 0.603922 1 137 | xcode.syntax.identifier.variable.system 138 | 0.521569 0.701961 0.8 1 139 | xcode.syntax.keyword 140 | 0.992157 0.823529 0.521569 1 141 | xcode.syntax.mark 142 | 0.572549 0.631373 0.694118 1 143 | xcode.syntax.markup.code 144 | 0.665 0.052 0.569 1 145 | xcode.syntax.number 146 | 0.627451 0.588235 0.784314 1 147 | xcode.syntax.plain 148 | 1 1 1 1 149 | xcode.syntax.preprocessor 150 | 0.803922 0.588235 0.439216 1 151 | xcode.syntax.string 152 | 0.964706 0.592157 0.403922 1 153 | xcode.syntax.url 154 | 0.239216 0.701961 0.807843 1 155 | 156 | DVTSourceTextSyntaxFonts 157 | 158 | xcode.syntax.attribute 159 | SFMono-Regular - 14.0 160 | xcode.syntax.character 161 | SFMono-Regular - 14.0 162 | xcode.syntax.comment 163 | SFMono-Regular - 14.0 164 | xcode.syntax.comment.doc 165 | SFMono-Regular - 14.0 166 | xcode.syntax.comment.doc.keyword 167 | SFMono-Regular - 14.0 168 | xcode.syntax.declaration.other 169 | SFMono-Regular - 14.0 170 | xcode.syntax.declaration.type 171 | SFMono-Regular - 14.0 172 | xcode.syntax.identifier.class 173 | SFMono-Regular - 14.0 174 | xcode.syntax.identifier.class.system 175 | SFMono-Regular - 14.0 176 | xcode.syntax.identifier.constant 177 | SFMono-Regular - 14.0 178 | xcode.syntax.identifier.constant.system 179 | SFMono-Regular - 14.0 180 | xcode.syntax.identifier.function 181 | SFMono-Regular - 14.0 182 | xcode.syntax.identifier.function.system 183 | SFMono-Regular - 14.0 184 | xcode.syntax.identifier.macro 185 | SFMono-Regular - 14.0 186 | xcode.syntax.identifier.macro.system 187 | SFMono-Regular - 14.0 188 | xcode.syntax.identifier.type 189 | SFMono-Regular - 14.0 190 | xcode.syntax.identifier.type.system 191 | SFMono-Regular - 14.0 192 | xcode.syntax.identifier.variable 193 | SFMono-Regular - 14.0 194 | xcode.syntax.identifier.variable.system 195 | SFMono-Regular - 14.0 196 | xcode.syntax.keyword 197 | SFMono-Regular - 14.0 198 | xcode.syntax.mark 199 | SFMono-Regular - 14.0 200 | xcode.syntax.markup.code 201 | SFMono-Medium - 11.0 202 | xcode.syntax.number 203 | SFMono-Regular - 14.0 204 | xcode.syntax.plain 205 | SFMono-Regular - 14.0 206 | xcode.syntax.preprocessor 207 | SFMono-Regular - 14.0 208 | xcode.syntax.string 209 | SFMono-Regular - 14.0 210 | xcode.syntax.url 211 | SFMono-Regular - 14.0 212 | 213 | 214 | 215 | -------------------------------------------------------------------------------- /run/lib/assets/Zenburn.terminal: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ANSIBlackColor 6 | 7 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 8 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 9 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjEwNjA2ODg3 10 | MTkgMC4xMTM2MzEzNzUxIDAuMTE3NjQ4MTAyMyAxTxAqMC4wODA1NTcwNjMyMiAwLjA4 11 | Njk4OTEwNDc1IDAuMDg5ODQxNDc3NTcAEAGAAoAG0xQNFRYXGFVOU0lDQ1lOU1NwYWNl 12 | SUSAA4AFEAzSGg0bHFdOUy5kYXRhTxECJAAAAiRhcHBsBAAAAG1udHJSR0IgWFlaIAfh 13 | AAcABwANABYAIGFjc3BBUFBMAAAAAEFQUEwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAA 14 | ANMtYXBwbMoalYIlfxBNOJkT1dHqFYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 15 | AAAACmRlc2MAAAD8AAAAZWNwcnQAAAFkAAAAI3d0cHQAAAGIAAAAFHJYWVoAAAGcAAAA 16 | FGdYWVoAAAGwAAAAFGJYWVoAAAHEAAAAFHJUUkMAAAHYAAAAIGNoYWQAAAH4AAAALGJU 17 | UkMAAAHYAAAAIGdUUkMAAAHYAAAAIGRlc2MAAAAAAAAAC0Rpc3BsYXkgUDMAAAAAAAAA 18 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 19 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5j 20 | LiwgMjAxNwAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAg98AAD2/////u1hZ 21 | WiAAAAAAAABKvwAAsTcAAAq5WFlaIAAAAAAAACg4AAARCwAAyLlwYXJhAAAAAAADAAAA 22 | AmZmAADypwAADVkAABPQAAAKW3NmMzIAAAAAAAEMQgAABd7///MmAAAHkwAA/ZD///ui 23 | ///9owAAA9wAAMBugATSHh8gIVokY2xhc3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURh 24 | dGGjICIjVk5TRGF0YVhOU09iamVjdNIeHyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9y 25 | U3BhY2XSHh8pKldOU0NvbG9yoikjXxAPTlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAI 26 | ABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBwAIUAjAC3AOQA5gDoAOoA8QD3AQEBAwEFAQcB 27 | DAEUAzwDPgNDA04DVwNlA2kDcAN5A34DiwOOA5sDoAOoA6sDvQPAA8UAAAAAAAACAQAA 28 | AAAAAAAvAAAAAAAAAAAAAAAAAAADxw== 29 | 30 | ANSIBlueColor 31 | 32 | YnBsaXN0MDDUAQIDBAUGIiNYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 33 | AAGGoKYHCBMXGB9VJG51bGzVCQoLDA0ODxARElxOU0NvbXBvbmVudHNVTlNSR0JcTlND 34 | b2xvclNwYWNlXxASTlNDdXN0b21Db2xvclNwYWNlViRjbGFzc08QJzAuMjk0MjIyMTE2 35 | NSAwLjI5NzI2NjcyMTcgMC43NDA0NDk5NjUgMU8QJzAuMjI4ODQ3ODAxNyAwLjIwMjMz 36 | ODA2OTcgMC42ODQ2NjE1NjcyABABgAKABdIUDRUWVU5TSUNDgAOABE8RC3AAAAtwYXBw 37 | bAIQAABtbnRyUkdCIFhZWiAH3gABABAADQAxACBhY3NwQVBQTAAAAAAAAAAAAAAAAAAA 38 | AAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 39 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAHFkc2NtAAABxAAAAEhjcHJ0 40 | AAACDAAAACN3dHB0AAACMAAAABRyWFlaAAACRAAAABRnWFlaAAACWAAAABRiWFlaAAAC 41 | bAAAABRyVFJDAAACgAAACAxhYXJnAAAKjAAAACB2Y2d0AAAKrAAAADBuZGluAAAK3AAA 42 | AD5jaGFkAAALHAAAACxtbW9kAAALSAAAAChiVFJDAAACgAAACAxnVFJDAAACgAAACAxh 43 | YWJnAAAKjAAAACBhYWdnAAAKjAAAACBkZXNjAAAAAAAAABdERUxMIFUyNDEyTSBDYWxp 44 | YnJhdGVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 45 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAAQAA 46 | AAxlblVTAAAALAAAABwARABFAEwATAAgAFUAMgA0ADEAMgBNACAAQwBhAGwAaQBiAHIA 47 | YQB0AGUAZHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTQAAFhZWiAAAAAA 48 | AADz2AABAAAAARYIWFlaIAAAAAAAAHAWAAA5RAAAA6NYWVogAAAAAAAAYhoAALdjAAAZ 49 | CVhZWiAAAAAAAAAkpwAAD1gAALaAY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAo 50 | AC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKMA 51 | qACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy 52 | ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB 53 | 8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLg 54 | AusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYE 55 | EwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 56 | BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkH 57 | Kwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQ 58 | CSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkL 59 | UQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3D 60 | Dd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4Q 61 | mxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOk 62 | E8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoX 63 | HRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrF 64 | GuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e 65 | 6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4 66 | I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo 67 | DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0M 68 | LUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMy 69 | mzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQ 70 | OIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+ 71 | oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUS 72 | RVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JM 73 | KkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1Nf 74 | U6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVb 75 | RVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GND 76 | Y5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr 77 | /2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTM 78 | dSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+ 79 | Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gE 80 | iGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGS 81 | epLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3 82 | nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+Co 83 | UqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOu 84 | tCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/ 85 | 9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1 86 | zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ 87 | bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW 88 | 5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0 89 | wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAAD 90 | AAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QAAAAAAAAAAQABHHQAAAAAAAEAAAABHHQA 91 | AAAAAAEAAAABHHQAAAAAAAEAAG5kaW4AAAAAAAAANgAAo8AAAFSAAABMwAAAmYAAACaA 92 | AAAPQAAAUEAAAFRAAAH63QAB+t0AAfrdAAAAAAAAAABzZjMyAAAAAAABC7cAAAWW///z 93 | VwAABykAAP3X///7t////aYAAAPaAADA9m1tb2QAAAAAAAAQrAAAoHoyVEVTzp3lgAAA 94 | AAAAAAAAAAAAAAAAAADSGRobHFokY2xhc3NuYW1lWCRjbGFzc2VzXE5TQ29sb3JTcGFj 95 | ZaIdHlxOU0NvbG9yU3BhY2VYTlNPYmplY3TSGRogIVdOU0NvbG9yoiAeXxAPTlNLZXll 96 | ZEFyY2hpdmVy0SQlVHJvb3SAAQAIABEAGgAjAC0AMgA3AD4ARABPAFwAYgBvAIQAiwC1 97 | AN8A4QDjAOUA6gDwAPIA9AxoDG0MeAyBDI4MkQyeDKcMrAy0DLcMyQzMDNEAAAAAAAAC 98 | AQAAAAAAAAAmAAAAAAAAAAAAAAAAAAAM0w== 99 | 100 | ANSIBrightBlackColor 101 | 102 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 103 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 104 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjI2OTI3NjE1 105 | MjQgMC4yNjgwNzkzNjk1IDAuMjcwNDcyOTM1MyAxTxAmMC4yMDc2MDM4NDIgMC4yMDYy 106 | ODM5ODY2IDAuMjA4NTk4MzE1NwAQAYACgAbTFA0VFhcYVU5TSUNDWU5TU3BhY2VJRIAD 107 | gAUQDNIaDRscV05TLmRhdGFPEQIkAAACJGFwcGwEAAAAbW50clJHQiBYWVogB+EABwAH 108 | AA0AFgAgYWNzcEFQUEwAAAAAQVBQTAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1h 109 | cHBsyhqVgiV/EE04mRPV0eoVggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK 110 | ZGVzYwAAAPwAAABlY3BydAAAAWQAAAAjd3RwdAAAAYgAAAAUclhZWgAAAZwAAAAUZ1hZ 111 | WgAAAbAAAAAUYlhZWgAAAcQAAAAUclRSQwAAAdgAAAAgY2hhZAAAAfgAAAAsYlRSQwAA 112 | AdgAAAAgZ1RSQwAAAdgAAAAgZGVzYwAAAAAAAAALRGlzcGxheSBQMwAAAAAAAAAAAAAA 113 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 114 | AAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAy 115 | MDE3AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAACD3wAAPb////+7WFlaIAAA 116 | AAAAAEq/AACxNwAACrlYWVogAAAAAAAAKDgAABELAADIuXBhcmEAAAAAAAMAAAACZmYA 117 | APKnAAANWQAAE9AAAApbc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeTAAD9kP//+6L///2j 118 | AAAD3AAAwG6ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMg 119 | IiNWTlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFj 120 | ZdIeHykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAa 121 | ACMALQAyADcAPwBFAFAAXQBjAHAAhQCMALcA4ADiAOQA5gDtAPMA/QD/AQEBAwEIARAD 122 | OAM6Az8DSgNTA2EDZQNsA3UDegOHA4oDlwOcA6QDpwO5A7wDwQAAAAAAAAIBAAAAAAAA 123 | AC8AAAAAAAAAAAAAAAAAAAPD 124 | 125 | ANSIBrightBlueColor 126 | 127 | YnBsaXN0MDDUAQIDBAUGIiNYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 128 | AAGGoKYHCBMXGB9VJG51bGzVCQoLDA0ODxARElxOU0NvbXBvbmVudHNVTlNSR0JcTlND 129 | b2xvclNwYWNlXxASTlNDdXN0b21Db2xvclNwYWNlViRjbGFzc08QKDAuNDE5OTE1NDM3 130 | NyAwLjQyMjQ2MDM0NzQgMC44NjA0ODU0OTQxIDFPECcwLjM0NDg2Nzg4NTEgMC4zMjA3 131 | MDA0OTY0IDAuODI1OTEzOTA2MQAQAYACgAXSFA0VFlVOU0lDQ4ADgARPEQtwAAALcGFw 132 | cGwCEAAAbW50clJHQiBYWVogB94AAQAQAA0AMQAgYWNzcEFQUEwAAAAAAAAAAAAAAAAA 133 | AAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 134 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARZGVzYwAAAVAAAABxZHNjbQAAAcQAAABIY3By 135 | dAAAAgwAAAAjd3RwdAAAAjAAAAAUclhZWgAAAkQAAAAUZ1hZWgAAAlgAAAAUYlhZWgAA 136 | AmwAAAAUclRSQwAAAoAAAAgMYWFyZwAACowAAAAgdmNndAAACqwAAAAwbmRpbgAACtwA 137 | AAA+Y2hhZAAACxwAAAAsbW1vZAAAC0gAAAAoYlRSQwAAAoAAAAgMZ1RSQwAAAoAAAAgM 138 | YWFiZwAACowAAAAgYWFnZwAACowAAAAgZGVzYwAAAAAAAAAXREVMTCBVMjQxMk0gQ2Fs 139 | aWJyYXRlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 140 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEA 141 | AAAMZW5VUwAAACwAAAAcAEQARQBMAEwAIABVADIANAAxADIATQAgAEMAYQBsAGkAYgBy 142 | AGEAdABlAGR0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDE0AABYWVogAAAA 143 | AAAA89gAAQAAAAEWCFhZWiAAAAAAAABwFgAAOUQAAAOjWFlaIAAAAAAAAGIaAAC3YwAA 144 | GQlYWVogAAAAAAAAJKcAAA9YAAC2gGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMA 145 | KAAtADIANgA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCj 146 | AKgArQCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsB 147 | MgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp 148 | AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC 149 | 4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQG 150 | BBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcF 151 | dwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZ 152 | BysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJ 153 | EAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5 154 | C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakN 155 | ww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+ 156 | EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MT 157 | pBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6 158 | Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4a 159 | xRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+ 160 | HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwoj 161 | OCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfc 162 | KA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNct 163 | DC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJj 164 | Mpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4 165 | UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5g 166 | PqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5F 167 | EkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi 168 | TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNT 169 | X1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1 170 | W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBj 171 | Q2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2un 172 | a/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0 173 | zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4B 174 | fmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+I 175 | BIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIR 176 | knqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc 177 | 951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfg 178 | qFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCsziz 179 | rrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796 180 | v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bM 181 | Ncy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo 182 | 2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3m 183 | lucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q0 184 | 9ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAA 185 | AwAAAAJmZgAA8qcAAA1ZAAAT0AAACg52Y2d0AAAAAAAAAAEAARx0AAAAAAABAAAAARx0 186 | AAAAAAABAAAAARx0AAAAAAABAABuZGluAAAAAAAAADYAAKPAAABUgAAATMAAAJmAAAAm 187 | gAAAD0AAAFBAAABUQAAB+t0AAfrdAAH63QAAAAAAAAAAc2YzMgAAAAAAAQu3AAAFlv// 188 | 81cAAAcpAAD91///+7f///2mAAAD2gAAwPZtbW9kAAAAAAAAEKwAAKB6MlRFU86d5YAA 189 | AAAAAAAAAAAAAAAAAAAA0hkaGxxaJGNsYXNzbmFtZVgkY2xhc3Nlc1xOU0NvbG9yU3Bh 190 | Y2WiHR5cTlNDb2xvclNwYWNlWE5TT2JqZWN00hkaICFXTlNDb2xvcqIgHl8QD05TS2V5 191 | ZWRBcmNoaXZlctEkJVRyb290gAEACAARABoAIwAtADIANwA+AEQATwBcAGIAbwCEAIsA 192 | tgDgAOIA5ADmAOsA8QDzAPUMaQxuDHkMggyPDJIMnwyoDK0MtQy4DMoMzQzSAAAAAAAA 193 | AgEAAAAAAAAAJgAAAAAAAAAAAAAAAAAADNQ= 194 | 195 | ANSIBrightCyanColor 196 | 197 | YnBsaXN0MDDUAQIDBAUGIiNYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 198 | AAGGoKYHCBMXGB9VJG51bGzVCQoLDA0ODxARElxOU0NvbXBvbmVudHNVTlNSR0JcTlND 199 | b2xvclNwYWNlXxASTlNDdXN0b21Db2xvclNwYWNlViRjbGFzc08QJjAuNTY4ODk1MzQg 200 | MC44NDU0OTkzOTYzIDAuODYwMTgzMDYwMiAxTxAnMC41MDQ3MjUyMTc4IDAuODE0MTc2 201 | NDQwMiAwLjgyNjU5OTEyMTEAEAGAAoAF0hQNFRZVTlNJQ0OAA4AETxELcAAAC3BhcHBs 202 | AhAAAG1udHJSR0IgWFlaIAfeAAEAEAANADEAIGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAA 203 | AAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 204 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAcWRzY20AAAHEAAAASGNwcnQA 205 | AAIMAAAAI3d0cHQAAAIwAAAAFHJYWVoAAAJEAAAAFGdYWVoAAAJYAAAAFGJYWVoAAAJs 206 | AAAAFHJUUkMAAAKAAAAIDGFhcmcAAAqMAAAAIHZjZ3QAAAqsAAAAMG5kaW4AAArcAAAA 207 | PmNoYWQAAAscAAAALG1tb2QAAAtIAAAAKGJUUkMAAAKAAAAIDGdUUkMAAAKAAAAIDGFh 208 | YmcAAAqMAAAAIGFhZ2cAAAqMAAAAIGRlc2MAAAAAAAAAF0RFTEwgVTI0MTJNIENhbGli 209 | cmF0ZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 210 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAABAAAA 211 | DGVuVVMAAAAsAAAAHABEAEUATABMACAAVQAyADQAMQAyAE0AIABDAGEAbABpAGIAcgBh 212 | AHQAZQBkdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNAAAWFlaIAAAAAAA 213 | APPYAAEAAAABFghYWVogAAAAAAAAcBYAADlEAAADo1hZWiAAAAAAAABiGgAAt2MAABkJ 214 | WFlaIAAAAAAAACSnAAAPWAAAtoBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgA 215 | LQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCo 216 | AK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIB 217 | OAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHy 218 | AfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC 219 | 6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQT 220 | BCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcF 221 | hgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcr 222 | Bz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJ 223 | JQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR 224 | C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN 225 | 3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCb 226 | ELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT 227 | xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcd 228 | F0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa 229 | 7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7p 230 | HxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgj 231 | ZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgN 232 | KD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwt 233 | QS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKb 234 | MtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4 235 | jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6g 236 | PuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJF 237 | VUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwq 238 | THJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19T 239 | qlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtF 240 | W5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Nj 241 | l2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/ 242 | bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1 243 | KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i 244 | fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASI 245 | aYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6 246 | kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPed 247 | ZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhS 248 | qMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660 249 | JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1 250 | wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXM 251 | tc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls 252 | 2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbn 253 | H+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC 254 | 9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMA 255 | AAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAAAAABAAEcdAAAAAAAAQAAAAEcdAAA 256 | AAAAAQAAAAEcdAAAAAAAAQAAbmRpbgAAAAAAAAA2AACjwAAAVIAAAEzAAACZgAAAJoAA 257 | AA9AAABQQAAAVEAAAfrdAAH63QAB+t0AAAAAAAAAAHNmMzIAAAAAAAELtwAABZb///NX 258 | AAAHKQAA/df///u3///9pgAAA9oAAMD2bW1vZAAAAAAAABCsAACgejJURVPOneWAAAAA 259 | AAAAAAAAAAAAAAAAANIZGhscWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNl 260 | oh0eXE5TQ29sb3JTcGFjZVhOU09iamVjdNIZGiAhV05TQ29sb3KiIB5fEA9OU0tleWVk 261 | QXJjaGl2ZXLRJCVUcm9vdIABAAgAEQAaACMALQAyADcAPgBEAE8AXABiAG8AhACLALQA 262 | 3gDgAOIA5ADpAO8A8QDzDGcMbAx3DIAMjQyQDJ0MpgyrDLMMtgzIDMsM0AAAAAAAAAIB 263 | AAAAAAAAACYAAAAAAAAAAAAAAAAAAAzS 264 | 265 | ANSIBrightGreenColor 266 | 267 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 268 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 269 | LjU0OTAxOTYzNDcgMC43MzcyNTQ5MTc2IDAuNTQ5MDE5NjM0NwAQAoAC0hAREhNaJGNs 270 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 271 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 272 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 273 | 274 | ANSIBrightMagentaColor 275 | 276 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 277 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 278 | Ljc0NDU0MzY1MDggMC41MzYwNzE0Mjg2IDAuNjgxOTgyNjY2OAAQAoAC0hAREhNaJGNs 279 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 280 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 281 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 282 | 283 | ANSIBrightRedColor 284 | 285 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 286 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 287 | Ljg2Mjc0NTE2NTggMC40MjM1Mjk0NDYxIDAuNDIzNTI5NDQ2MQAQAoAC0hAREhNaJGNs 288 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 289 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 290 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 291 | 292 | ANSICyanColor 293 | 294 | YnBsaXN0MDDUAQIDBAUGIiNYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 295 | AAGGoKYHCBMXGB9VJG51bGzVCQoLDA0ODxARElxOU0NvbXBvbmVudHNVTlNSR0JcTlND 296 | b2xvclNwYWNlXxASTlNDdXN0b21Db2xvclNwYWNlViRjbGFzc08QKDAuMjk4ODA3Njgw 297 | NiAwLjcxNzk2NjEzOTMgMC43NDAxOTAwMjkxIDFPECUwLjI0ODA3MzMwOTcgMC42NjU2 298 | MzgyMDg0IDAuNjg1MTMzMDQAEAGAAoAF0hQNFRZVTlNJQ0OAA4AETxELcAAAC3BhcHBs 299 | AhAAAG1udHJSR0IgWFlaIAfeAAEAEAANADEAIGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAA 300 | AAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 301 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAcWRzY20AAAHEAAAASGNwcnQA 302 | AAIMAAAAI3d0cHQAAAIwAAAAFHJYWVoAAAJEAAAAFGdYWVoAAAJYAAAAFGJYWVoAAAJs 303 | AAAAFHJUUkMAAAKAAAAIDGFhcmcAAAqMAAAAIHZjZ3QAAAqsAAAAMG5kaW4AAArcAAAA 304 | PmNoYWQAAAscAAAALG1tb2QAAAtIAAAAKGJUUkMAAAKAAAAIDGdUUkMAAAKAAAAIDGFh 305 | YmcAAAqMAAAAIGFhZ2cAAAqMAAAAIGRlc2MAAAAAAAAAF0RFTEwgVTI0MTJNIENhbGli 306 | cmF0ZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 307 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAABAAAA 308 | DGVuVVMAAAAsAAAAHABEAEUATABMACAAVQAyADQAMQAyAE0AIABDAGEAbABpAGIAcgBh 309 | AHQAZQBkdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNAAAWFlaIAAAAAAA 310 | APPYAAEAAAABFghYWVogAAAAAAAAcBYAADlEAAADo1hZWiAAAAAAAABiGgAAt2MAABkJ 311 | WFlaIAAAAAAAACSnAAAPWAAAtoBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgA 312 | LQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCo 313 | AK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIB 314 | OAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHy 315 | AfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC 316 | 6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQT 317 | BCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcF 318 | hgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcr 319 | Bz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJ 320 | JQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR 321 | C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN 322 | 3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCb 323 | ELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT 324 | xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcd 325 | F0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa 326 | 7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7p 327 | HxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgj 328 | ZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgN 329 | KD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwt 330 | QS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKb 331 | MtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4 332 | jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6g 333 | PuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJF 334 | VUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwq 335 | THJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19T 336 | qlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtF 337 | W5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Nj 338 | l2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/ 339 | bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1 340 | KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i 341 | fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASI 342 | aYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6 343 | kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPed 344 | ZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhS 345 | qMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660 346 | JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1 347 | wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXM 348 | tc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls 349 | 2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbn 350 | H+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC 351 | 9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMA 352 | AAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAAAAABAAEcdAAAAAAAAQAAAAEcdAAA 353 | AAAAAQAAAAEcdAAAAAAAAQAAbmRpbgAAAAAAAAA2AACjwAAAVIAAAEzAAACZgAAAJoAA 354 | AA9AAABQQAAAVEAAAfrdAAH63QAB+t0AAAAAAAAAAHNmMzIAAAAAAAELtwAABZb///NX 355 | AAAHKQAA/df///u3///9pgAAA9oAAMD2bW1vZAAAAAAAABCsAACgejJURVPOneWAAAAA 356 | AAAAAAAAAAAAAAAAANIZGhscWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNl 357 | oh0eXE5TQ29sb3JTcGFjZVhOU09iamVjdNIZGiAhV05TQ29sb3KiIB5fEA9OU0tleWVk 358 | QXJjaGl2ZXLRJCVUcm9vdIABAAgAEQAaACMALQAyADcAPgBEAE8AXABiAG8AhACLALYA 359 | 3gDgAOIA5ADpAO8A8QDzDGcMbAx3DIAMjQyQDJ0MpgyrDLMMtgzIDMsM0AAAAAAAAAIB 360 | AAAAAAAAACYAAAAAAAAAAAAAAAAAAAzS 361 | 362 | ANSIGreenColor 363 | 364 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 365 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw 366 | LjQyMzUyOTQ0NjEgMC42MTE3NjQ3MjkgMC40MjM1Mjk0NDYxABACgALSEBESE1okY2xh 367 | c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 368 | ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA 369 | ABkAAAAAAAAAAAAAAAAAAADY 370 | 371 | ANSIMagentaColor 372 | 373 | YnBsaXN0MDDUAQIDBAUGIiNYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 374 | AAGGoKYHCBMXGB9VJG51bGzVCQoLDA0ODxARElxOU0NvbXBvbmVudHNVTlNSR0JcTlND 375 | b2xvclNwYWNlXxASTlNDdXN0b21Db2xvclNwYWNlViRjbGFzc08QKDAuNzM4OTEwMjU3 376 | OCAwLjQyMTkzMzI5MzMgMC42NDQ3NzAwODU4IDFPECcwLjY3ODU2NTUwMjIgMC4zMjcx 377 | MTc1MDI3IDAuNTc4MDkxMjYzOAAQAYACgAXSFA0VFlVOU0lDQ4ADgARPEQtwAAALcGFw 378 | cGwCEAAAbW50clJHQiBYWVogB94AAQAQAA0AMQAgYWNzcEFQUEwAAAAAAAAAAAAAAAAA 379 | AAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 380 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARZGVzYwAAAVAAAABxZHNjbQAAAcQAAABIY3By 381 | dAAAAgwAAAAjd3RwdAAAAjAAAAAUclhZWgAAAkQAAAAUZ1hZWgAAAlgAAAAUYlhZWgAA 382 | AmwAAAAUclRSQwAAAoAAAAgMYWFyZwAACowAAAAgdmNndAAACqwAAAAwbmRpbgAACtwA 383 | AAA+Y2hhZAAACxwAAAAsbW1vZAAAC0gAAAAoYlRSQwAAAoAAAAgMZ1RSQwAAAoAAAAgM 384 | YWFiZwAACowAAAAgYWFnZwAACowAAAAgZGVzYwAAAAAAAAAXREVMTCBVMjQxMk0gQ2Fs 385 | aWJyYXRlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 386 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEA 387 | AAAMZW5VUwAAACwAAAAcAEQARQBMAEwAIABVADIANAAxADIATQAgAEMAYQBsAGkAYgBy 388 | AGEAdABlAGR0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDE0AABYWVogAAAA 389 | AAAA89gAAQAAAAEWCFhZWiAAAAAAAABwFgAAOUQAAAOjWFlaIAAAAAAAAGIaAAC3YwAA 390 | GQlYWVogAAAAAAAAJKcAAA9YAAC2gGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMA 391 | KAAtADIANgA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCj 392 | AKgArQCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsB 393 | MgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp 394 | AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC 395 | 4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQG 396 | BBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcF 397 | dwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZ 398 | BysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJ 399 | EAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5 400 | C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakN 401 | ww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+ 402 | EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MT 403 | pBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6 404 | Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4a 405 | xRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+ 406 | HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwoj 407 | OCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfc 408 | KA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNct 409 | DC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJj 410 | Mpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4 411 | UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5g 412 | PqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5F 413 | EkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi 414 | TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNT 415 | X1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1 416 | W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBj 417 | Q2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2un 418 | a/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0 419 | zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4B 420 | fmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+I 421 | BIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIR 422 | knqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc 423 | 951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfg 424 | qFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCsziz 425 | rrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796 426 | v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bM 427 | Ncy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo 428 | 2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3m 429 | lucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q0 430 | 9ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAA 431 | AwAAAAJmZgAA8qcAAA1ZAAAT0AAACg52Y2d0AAAAAAAAAAEAARx0AAAAAAABAAAAARx0 432 | AAAAAAABAAAAARx0AAAAAAABAABuZGluAAAAAAAAADYAAKPAAABUgAAATMAAAJmAAAAm 433 | gAAAD0AAAFBAAABUQAAB+t0AAfrdAAH63QAAAAAAAAAAc2YzMgAAAAAAAQu3AAAFlv// 434 | 81cAAAcpAAD91///+7f///2mAAAD2gAAwPZtbW9kAAAAAAAAEKwAAKB6MlRFU86d5YAA 435 | AAAAAAAAAAAAAAAAAAAA0hkaGxxaJGNsYXNzbmFtZVgkY2xhc3Nlc1xOU0NvbG9yU3Bh 436 | Y2WiHR5cTlNDb2xvclNwYWNlWE5TT2JqZWN00hkaICFXTlNDb2xvcqIgHl8QD05TS2V5 437 | ZWRBcmNoaXZlctEkJVRyb290gAEACAARABoAIwAtADIANwA+AEQATwBcAGIAbwCEAIsA 438 | tgDgAOIA5ADmAOsA8QDzAPUMaQxuDHkMggyPDJIMnwyoDK0MtQy4DMoMzQzSAAAAAAAA 439 | AgEAAAAAAAAAJgAAAAAAAAAAAAAAAAAADNQ= 440 | 441 | ANSIRedColor 442 | 443 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 444 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 445 | LjczNzI1NDkxNzYgMC4yOTgwMzkyMjc3IDAuMjk4MDM5MjI3NwAQAoAC0hAREhNaJGNs 446 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 447 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 448 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 449 | 450 | ANSIYellowColor 451 | 452 | YnBsaXN0MDDUAQIDBAUGIiNYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 453 | AAGGoKYHCBMXGB9VJG51bGzVCQoLDA0ODxARElxOU0NvbXBvbmVudHNVTlNSR0JcTlND 454 | b2xvclNwYWNlXxASTlNDdXN0b21Db2xvclNwYWNlViRjbGFzc08QJzAuODQ3MjExNzc4 455 | MiAwLjg0NjAyMzc5OCAwLjMzNzM2MjE0MDQgMU8QJzAuODExNzMyNzA5NCAwLjgyNDA5 456 | NDIzNTkgMC4yNzE2MjAxMjQ2ABABgAKABdIUDRUWVU5TSUNDgAOABE8RC3AAAAtwYXBw 457 | bAIQAABtbnRyUkdCIFhZWiAH3gABABAADQAxACBhY3NwQVBQTAAAAAAAAAAAAAAAAAAA 458 | AAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 459 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAHFkc2NtAAABxAAAAEhjcHJ0 460 | AAACDAAAACN3dHB0AAACMAAAABRyWFlaAAACRAAAABRnWFlaAAACWAAAABRiWFlaAAAC 461 | bAAAABRyVFJDAAACgAAACAxhYXJnAAAKjAAAACB2Y2d0AAAKrAAAADBuZGluAAAK3AAA 462 | AD5jaGFkAAALHAAAACxtbW9kAAALSAAAAChiVFJDAAACgAAACAxnVFJDAAACgAAACAxh 463 | YWJnAAAKjAAAACBhYWdnAAAKjAAAACBkZXNjAAAAAAAAABdERUxMIFUyNDEyTSBDYWxp 464 | YnJhdGVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 465 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAAQAA 466 | AAxlblVTAAAALAAAABwARABFAEwATAAgAFUAMgA0ADEAMgBNACAAQwBhAGwAaQBiAHIA 467 | YQB0AGUAZHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTQAAFhZWiAAAAAA 468 | AADz2AABAAAAARYIWFlaIAAAAAAAAHAWAAA5RAAAA6NYWVogAAAAAAAAYhoAALdjAAAZ 469 | CVhZWiAAAAAAAAAkpwAAD1gAALaAY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAo 470 | AC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKMA 471 | qACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy 472 | ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB 473 | 8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLg 474 | AusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYE 475 | EwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 476 | BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkH 477 | Kwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQ 478 | CSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkL 479 | UQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3D 480 | Dd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4Q 481 | mxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOk 482 | E8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoX 483 | HRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrF 484 | GuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e 485 | 6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4 486 | I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo 487 | DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0M 488 | LUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMy 489 | mzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQ 490 | OIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+ 491 | oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUS 492 | RVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JM 493 | KkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1Nf 494 | U6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVb 495 | RVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GND 496 | Y5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr 497 | /2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTM 498 | dSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+ 499 | Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gE 500 | iGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGS 501 | epLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3 502 | nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+Co 503 | UqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOu 504 | tCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/ 505 | 9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1 506 | zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ 507 | bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW 508 | 5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0 509 | wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAAD 510 | AAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QAAAAAAAAAAQABHHQAAAAAAAEAAAABHHQA 511 | AAAAAAEAAAABHHQAAAAAAAEAAG5kaW4AAAAAAAAANgAAo8AAAFSAAABMwAAAmYAAACaA 512 | AAAPQAAAUEAAAFRAAAH63QAB+t0AAfrdAAAAAAAAAABzZjMyAAAAAAABC7cAAAWW///z 513 | VwAABykAAP3X///7t////aYAAAPaAADA9m1tb2QAAAAAAAAQrAAAoHoyVEVTzp3lgAAA 514 | AAAAAAAAAAAAAAAAAADSGRobHFokY2xhc3NuYW1lWCRjbGFzc2VzXE5TQ29sb3JTcGFj 515 | ZaIdHlxOU0NvbG9yU3BhY2VYTlNPYmplY3TSGRogIVdOU0NvbG9yoiAeXxAPTlNLZXll 516 | ZEFyY2hpdmVy0SQlVHJvb3SAAQAIABEAGgAjAC0AMgA3AD4ARABPAFwAYgBvAIQAiwC1 517 | AN8A4QDjAOUA6gDwAPIA9AxoDG0MeAyBDI4MkQyeDKcMrAy0DLcMyQzMDNEAAAAAAAAC 518 | AQAAAAAAAAAmAAAAAAAAAAAAAAAAAAAM0w== 519 | 520 | BackgroundBlur 521 | 0.2909817557803468 522 | BackgroundColor 523 | 524 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 525 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 526 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjExMzczMDE5 527 | OTYgMC4xMTM3MjA3Mzc0IDAuMTEzNzI1NzI5MyAxTxAqMC4wODY4MDQ4Mjk1NCAwLjA4 528 | NjgxMjc3OTMxIDAuMDg2Nzk2Njg2MDUAEAGAAoAG0xQNFRYXGFVOU0lDQ1lOU1NwYWNl 529 | SUSAA4AFEAzSGg0bHFdOUy5kYXRhTxECJAAAAiRhcHBsBAAAAG1udHJSR0IgWFlaIAfh 530 | AAcABwANABYAIGFjc3BBUFBMAAAAAEFQUEwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAA 531 | ANMtYXBwbMoalYIlfxBNOJkT1dHqFYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 532 | AAAACmRlc2MAAAD8AAAAZWNwcnQAAAFkAAAAI3d0cHQAAAGIAAAAFHJYWVoAAAGcAAAA 533 | FGdYWVoAAAGwAAAAFGJYWVoAAAHEAAAAFHJUUkMAAAHYAAAAIGNoYWQAAAH4AAAALGJU 534 | UkMAAAHYAAAAIGdUUkMAAAHYAAAAIGRlc2MAAAAAAAAAC0Rpc3BsYXkgUDMAAAAAAAAA 535 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 536 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5j 537 | LiwgMjAxNwAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAg98AAD2/////u1hZ 538 | WiAAAAAAAABKvwAAsTcAAAq5WFlaIAAAAAAAACg4AAARCwAAyLlwYXJhAAAAAAADAAAA 539 | AmZmAADypwAADVkAABPQAAAKW3NmMzIAAAAAAAEMQgAABd7///MmAAAHkwAA/ZD///ui 540 | ///9owAAA9wAAMBugATSHh8gIVokY2xhc3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURh 541 | dGGjICIjVk5TRGF0YVhOU09iamVjdNIeHyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9y 542 | U3BhY2XSHh8pKldOU0NvbG9yoikjXxAPTlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAI 543 | ABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBwAIUAjAC3AOQA5gDoAOoA8QD3AQEBAwEFAQcB 544 | DAEUAzwDPgNDA04DVwNlA2kDcAN5A34DiwOOA5sDoAOoA6sDvQPAA8UAAAAAAAACAQAA 545 | AAAAAAAvAAAAAAAAAAAAAAAAAAADxw== 546 | 547 | CursorColor 548 | 549 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 550 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 551 | LjQ5ODAzOTI0NTYgMC42MjM1Mjk0MzQyIDAuNDk4MDM5MjQ1NgAQAoAC0hAREhNaJGNs 552 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 553 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 554 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 555 | 556 | Font 557 | 558 | YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 559 | AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs 560 | YXNzI0AwAAAAAAAAEBCAAoADXxAcRmlyYU1vbm9Gb3JQb3dlcmxpbmUtUmVndWxhctIT 561 | FBUWWiRjbGFzc25hbWVYJGNsYXNzZXNWTlNGb250ohUXWE5TT2JqZWN0XxAPTlNLZXll 562 | ZEFyY2hpdmVy0RobVHJvb3SAAQgRGiMtMjc8QktSW2JpcnR2eJecp7C3usPV2N0AAAAA 563 | AAABAQAAAAAAAAAcAAAAAAAAAAAAAAAAAAAA3w== 564 | 565 | FontAntialias 566 | 567 | FontWidthSpacing 568 | 1.004032258064516 569 | ProfileCurrentVersion 570 | 2.0600000000000001 571 | SelectionColor 572 | 573 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 574 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 575 | LjgwMDAwMDA3MTUgMC41NzY0NzA2MTM1IDAuNTc2NDcwNjEzNQAQAoAC0hAREhNaJGNs 576 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 577 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 578 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 579 | 580 | ShowDimensionsInTitle 581 | 582 | TextBoldColor 583 | 584 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 585 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEBcw 586 | Ljg4IDAuODggMC42MzU1OTE5MzEyABACgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2Vz 587 | V05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEa 588 | Iy0yNztBSE5bYnx+gIWQmaGkrb/CxwAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAA 589 | AADJ 590 | 591 | TextColor 592 | 593 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 594 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 595 | Ljg2Mjc0NTE2NTggMC44NjI3NDUxNjU4IDAuODAwMDAwMDcxNQAQAoAC0hAREhNaJGNs 596 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 597 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 598 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 599 | 600 | columnCount 601 | 100 602 | name 603 | Zenburn 604 | shellExitAction 605 | 1 606 | type 607 | Window Settings 608 | useOptionAsMetaKey 609 | 610 | 611 | 612 | -------------------------------------------------------------------------------- /run/lib/set-icon: -------------------------------------------------------------------------------- 1 | #!/usr/bin/swift 2 | import AppKit 3 | import Darwin 4 | 5 | extension NSWorkspace { 6 | func setIcon(fileURL: URL, iconURL: URL?) throws -> Bool { 7 | let icon = iconURL.map(NSImage.init) 8 | _ = try fileURL.checkResourceIsReachable() 9 | _ = try iconURL?.checkResourceIsReachable() 10 | return setIcon(icon, forFile: fileURL.relativePath, options: []) 11 | } 12 | } 13 | 14 | func main() { 15 | if CommandLine.argc != 3 { 16 | fputs("Error: Invalid number of arguments.\n", stderr) 17 | exit(1) 18 | } 19 | 20 | let iconURL: URL? = URL(fileURLWithPath: CommandLine.arguments[1]) 21 | let fileURL: URL = URL(fileURLWithPath: CommandLine.arguments[2]) 22 | do { 23 | guard try NSWorkspace.shared.setIcon(fileURL: fileURL, iconURL: iconURL) else { 24 | fputs("Error: Could not set icon for \(fileURL.relativePath)\n", stderr) 25 | exit(1) 26 | } 27 | 28 | print("Successfully set icon for \(fileURL.relativePath).") 29 | } catch { 30 | var statusCode: Int = 1 31 | let nsError: NSError = error as NSError 32 | if nsError.domain == NSPOSIXErrorDomain { 33 | statusCode = nsError.code 34 | } else if let underlyingError = nsError.userInfo[NSUnderlyingErrorKey] as? NSError, 35 | underlyingError.domain == NSPOSIXErrorDomain { 36 | statusCode = underlyingError.code 37 | } 38 | fputs("Error: Could not set icon for \(fileURL.relativePath). " + 39 | "\(error.localizedDescription)\n", stderr) 40 | exit(Int32(statusCode)) 41 | } 42 | } 43 | 44 | main() 45 | -------------------------------------------------------------------------------- /symlinks/alacritty/.config/alacritty/alacritty.yml: -------------------------------------------------------------------------------- 1 | # Configuration for Alacritty, the GPU enhanced terminal emulator. 2 | 3 | # Any items in the `env` entry below will be added as 4 | # environment variables. Some entries may override variables 5 | # set by alacritty itself. 6 | env: 7 | # TERM variable 8 | # 9 | # This value is used to set the `$TERM` environment variable for 10 | # each instance of Alacritty. If it is not present, alacritty will 11 | # check the local terminfo database and use `alacritty` if it is 12 | # available, otherwise `xterm-256color` is used. 13 | TERM: xterm-256color 14 | 15 | window: 16 | # Window dimensions (changes require restart) 17 | # 18 | # Specified in number of columns/lines, not pixels. 19 | # If both are `0`, this setting is ignored. 20 | dimensions: 21 | columns: 100 22 | lines: 24 23 | 24 | decorations: full 25 | 26 | # Startup Mode (changes require restart) 27 | # 28 | # Values for `startup_mode`: 29 | # - Windowed 30 | # - Maximized 31 | # - Fullscreen 32 | # 33 | # Values for `startup_mode` (macOS only): 34 | # - SimpleFullscreen 35 | # startup_mode: SimpleFullscreen 36 | 37 | # Font configuration 38 | font: 39 | # Normal (roman) font face 40 | normal: 41 | # Font family 42 | # 43 | # Default: 44 | # - (macOS) Menlo 45 | # - (Linux/BSD) monospace 46 | # - (Windows) Consolas 47 | family: "Fira Mono for Powerline" 48 | 49 | # The `style` can be specified to pick a specific face. 50 | style: Regular 51 | 52 | # Point size 53 | size: 16.0 54 | 55 | # Thin stroke font rendering (macOS only) 56 | # 57 | # Thin strokes are suitable for retina displays, but for non-retina screens 58 | # it is recommended to set `use_thin_strokes` to `false` 59 | # 60 | # macOS >= 10.14.x: 61 | # 62 | # If the font quality on non-retina display looks bad then set 63 | # `use_thin_strokes` to `true` and enable font smoothing by running the 64 | # following command: 65 | # `defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO` 66 | # 67 | # This is a global setting and will require a log out or restart to take 68 | # effect. 69 | # use_thin_strokes: true 70 | 71 | # Base16 Zenburn 256 - alacritty color config 72 | # elnawe 73 | colors: 74 | # Default colors 75 | primary: 76 | background: '0x1d1d1d' 77 | foreground: '0xdcdccc' 78 | 79 | # Colors the cursor will use if `custom_cursor_colors` is true 80 | cursor: 81 | text: '0x383838' 82 | cursor: '0x7f9f7f' 83 | 84 | # Normal colors 85 | normal: 86 | black: '0x383838' 87 | red: '0xdca3a3' 88 | green: '0x5f7f5f' 89 | yellow: '0xe0cf9f' 90 | blue: '0x7cb8bb' 91 | magenta: '0xdc8cc3' 92 | cyan: '0x93e0e3' 93 | white: '0xdcdccc' 94 | 95 | # Bright colors 96 | bright: 97 | black: '0x6f6f6f' 98 | red: '0xdca3a3' 99 | green: '0x5f7f5f' 100 | yellow: '0xe0cf9f' 101 | blue: '0x7cb8bb' 102 | magenta: '0xdc8cc3' 103 | cyan: '0x93e0e3' 104 | white: '0xffffff' 105 | 106 | indexed_colors: 107 | - { index: 16, color: '0xdfaf8f' } 108 | - { index: 17, color: '0x000000' } 109 | - { index: 18, color: '0x404040' } 110 | - { index: 19, color: '0x606060' } 111 | - { index: 20, color: '0x808080' } 112 | - { index: 21, color: '0xc0c0c0' } 113 | 114 | # Shell 115 | # 116 | # You can set `shell.program` to the path of your favorite shell, e.g. `/bin/fish`. 117 | # Entries in `shell.args` are passed unmodified as arguments to the shell. 118 | # 119 | # Default: 120 | # - (macOS) /bin/bash --login 121 | # - (Linux/BSD) user login shell 122 | # - (Windows) powershell 123 | shell: 124 | program: /usr/local/bin/fish 125 | args: 126 | - --login 127 | - --interactive 128 | - --command 129 | - 'tmux attach 2>/dev/null || tmux -f ~/.config/tmux/tmux.conf' 130 | 131 | debug: 132 | # Display the time it takes to redraw each frame. 133 | #render_timer: false 134 | 135 | # Keep the log file after quitting Alacritty. 136 | persistent_logging: true 137 | 138 | # Log level 139 | # 140 | # Values for `log_level`: 141 | # - None 142 | # - Error 143 | # - Warn 144 | # - Info 145 | # - Debug 146 | # - Trace 147 | log_level: Debug 148 | 149 | # Print all received window events. 150 | #print_events: false 151 | 152 | # Record all characters and escape sequences as test data. 153 | #ref_test: false 154 | 155 | #selection: 156 | # #semantic_escape_chars: ",│`|:\"' ()[]{}<>\t" 157 | 158 | # Key bindings 159 | # 160 | # Key bindings are specified as a list of objects. For example, this is the 161 | # default paste binding: 162 | # 163 | # `- { key: V, mods: Control|Shift, action: Paste }` 164 | # 165 | # Each key binding will specify a: 166 | # 167 | # - `key`: Identifier of the key pressed 168 | # 169 | # - A-Z 170 | # - F1-F24 171 | # - Key0-Key9 172 | # 173 | # A full list with available key codes can be found here: 174 | # https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants 175 | # 176 | # Instead of using the name of the keys, the `key` field also supports using 177 | # the scancode of the desired key. Scancodes have to be ntspecified as a 178 | # decimal number. This command will allow you to display the hex scancodes 179 | # for certain keys: 180 | # 181 | # `showkey --scancodes`. 182 | # 183 | # Then exactly one of: 184 | # 185 | # - `chars`: Send a byte sequence to the running application 186 | # 187 | # The `chars` field writes the specified string to the terminal. This makes 188 | # it possible to pass escape sequences. To find escape codes for bindings 189 | # like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside 190 | # of tmux. Note that applications use terminfo to map escape sequences back 191 | # to keys. It is therefore required to update the terminfo when changing an 192 | # escape sequence. 193 | # 194 | # - `action`: Execute a predefined action 195 | # 196 | # - Copy 197 | # - Paste 198 | # - PasteSelection 199 | # - IncreaseFontSize 200 | # - DecreaseFontSize 201 | # - ResetFontSize 202 | # - ScrollPageUp 203 | # - ScrollPageDown 204 | # - ScrollLineUp 205 | # - ScrollLineDown 206 | # - ScrollToTop 207 | # - ScrollToBottom 208 | # - ClearHistory 209 | # - Hide 210 | # - Minimize 211 | # - Quit 212 | # - ToggleFullscreen 213 | # - SpawnNewInstance 214 | # - ClearLogNotice 215 | # - ReceiveChar 216 | # - None 217 | # 218 | # (macOS only): 219 | # - ToggleSimpleFullscreen: Enters fullscreen without occupying another space 220 | # 221 | # - `command`: Fork and execute a specified command plus arguments 222 | # 223 | # The `command` field must be a map containing a `program` string and an 224 | # `args` array of command line parameter strings. For example: 225 | # `{ program: "alacritty", args: ["-e", "vttest"] }` 226 | # 227 | # And optionally: 228 | # 229 | # - `mods`: Key modifiers to filter binding actions 230 | # 231 | # - Command 232 | # - Control 233 | # - Option 234 | # - Super 235 | # - Shift 236 | # - Alt 237 | # 238 | # Multiple `mods` can be combined using `|` like this: 239 | # `mods: Control|Shift`. 240 | # Whitespace and capitalization are relevant and must match the example. 241 | # 242 | # - `mode`: Indicate a binding for only specific terminal reported modes 243 | # 244 | # This is mainly used to send applications the correct escape sequences 245 | # when in different modes. 246 | # 247 | # - AppCursor 248 | # - AppKeypad 249 | # - Alt 250 | # 251 | # A `~` operator can be used before a mode to apply the binding whenever 252 | # the mode is *not* active, e.g. `~Alt`. 253 | # 254 | # Bindings are always filled by default, but will be replaced when a new 255 | # binding with the same triggers is defined. To unset a default binding, it can 256 | # be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for 257 | # a no-op if you do not wish to receive input characters for that binding. 258 | key_bindings: 259 | # (Windows, Linux, and BSD only) 260 | # - { key: V, mods: Control|Shift, action: Paste } 261 | # - { key: C, mods: Control|Shift, action: Copy } 262 | # - { key: Insert, mods: Shift, action: PasteSelection } 263 | # - { key: Key0, mods: Control, action: ResetFontSize } 264 | # - { key: Equals, mods: Control, action: IncreaseFontSize } 265 | # - { key: Add, mods: Control, action: IncreaseFontSize } 266 | # - { key: Subtract, mods: Control, action: DecreaseFontSize } 267 | # - { key: Minus, mods: Control, action: DecreaseFontSize } 268 | 269 | # (Windows only) 270 | #- { key: Return, mods: Alt, action: ToggleFullscreen } 271 | - { key: Return, mods: Command, action: ToggleSimpleFullscreen } 272 | 273 | # (macOS only) 274 | - { key: Key0, mods: Command, action: ResetFontSize } 275 | - { key: Equals, mods: Command, action: IncreaseFontSize } 276 | - { key: Plus, mods: Command, action: IncreaseFontSize } 277 | - { key: Minus, mods: Command, action: DecreaseFontSize } 278 | - { key: K, mods: Command, action: ClearHistory } 279 | - { key: K, mods: Command, chars: "\x0c" } 280 | - { key: V, mods: Command, action: Paste } 281 | - { key: C, mods: Command, action: Copy } 282 | - { key: H, mods: Command, action: Hide } 283 | - { key: M, mods: Command, action: Minimize } 284 | - { key: Q, mods: Command, action: Quit } 285 | - { key: F, mods: Command|Control, action: ToggleFullscreen } 286 | 287 | - { key: Paste, action: Paste } 288 | - { key: Copy, action: Copy } 289 | - { key: L, mods: Control, action: ClearLogNotice } 290 | - { key: L, mods: Control, chars: "\x0c" } 291 | - { key: PageUp, mods: Shift, action: ScrollPageUp, mode: ~Alt } 292 | - { key: PageDown, mods: Shift, action: ScrollPageDown, mode: ~Alt } 293 | - { key: Home, mods: Shift, action: ScrollToTop, mode: ~Alt } 294 | - { key: End, mods: Shift, action: ScrollToBottom, mode: ~Alt } 295 | 296 | # One-off fix for missing option-as-meta setting. 297 | # See https://github.com/alacritty/alacritty/issues/62 298 | - { key: Period, mods: Alt, chars: "\x1b\x2e" } 299 | - { key: Semicolon, mods: Alt | Shift, chars: "\x1b\x3a" } 300 | - { key: E, mods: Alt, chars: "\x1b\x65" } 301 | 302 | # 303 | # macOS bindings for tmux. 304 | # 305 | # Taken from `xxd -psd` command as shown here: 306 | # https://posts.mksanders.org/simulating-macos-terminal-bindings-in-alacritty 307 | # 308 | 309 | # New tab. 310 | - { key: T, mods: Command, chars: "\x01\x63" } 311 | 312 | # Close tab. 313 | - { key: W, mods: Command, chars: "\x01\x64" } 314 | 315 | # Move one tab right. 316 | - { key: RBracket, mods: Command|Shift, chars: "\x01\x6e" } 317 | 318 | # Move one tab left. 319 | - { key: LBracket, mods: Command|Shift, chars: "\x01\x70" } 320 | 321 | # Move to tab x. 322 | - { key: Key1, mods: Command, chars: "\x01\x31" } 323 | - { key: Key2, mods: Command, chars: "\x01\x32" } 324 | - { key: Key3, mods: Command, chars: "\x01\x33" } 325 | - { key: Key4, mods: Command, chars: "\x01\x34" } 326 | - { key: Key5, mods: Command, chars: "\x01\x35" } 327 | - { key: Key6, mods: Command, chars: "\x01\x36" } 328 | - { key: Key7, mods: Command, chars: "\x01\x37" } 329 | - { key: Key8, mods: Command, chars: "\x01\x38" } 330 | - { key: Key9, mods: Command, chars: "\x01\x39" } 331 | 332 | # Enter copy mode. 333 | - { key: Up, mods: Command, chars: "\x01\x5b" } 334 | -------------------------------------------------------------------------------- /symlinks/bash/.bashrc: -------------------------------------------------------------------------------- 1 | # Load aliases. 2 | if [ -f "$HOME/.aliases" ]; then 3 | # shellcheck source=/dev/null 4 | source "$HOME/.aliases" 5 | fi 6 | 7 | # Colors 8 | export CLICOLOR=1 9 | 10 | # Prompt 11 | PS1='\u:\W $ ' 12 | 13 | # History 14 | HISTCONTROL=ignoreboth 15 | HISTSIZE=1024 16 | HISTTIMEFORMAT="%F %T " 17 | 18 | # Store history immediately rather than at end of session. 19 | PROMPT_COMMAND="history -a" 20 | 21 | # Append to history on shell exit rather than overwrite. 22 | shopt -s histappend 23 | 24 | # Adjust saved commands to fit on one line. 25 | shopt -s cmdhist 26 | -------------------------------------------------------------------------------- /symlinks/bin/bin/em: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # This is a convenience wrapper to launch or reuse a GUI Emacs instance to open 4 | # a given file. It doesn't wait for it to exit, so can't be used as an $EDITOR. 5 | set -o errexit -o nounset 6 | 7 | abspath() { 8 | python -c "import os, sys; print(os.path.abspath(sys.argv[1]))" "$1" 9 | } 10 | 11 | # The --args flag doesn't work when Emacs is already running, so first try 12 | # using emacsclient. 13 | if emacsclient --suppress-output --eval nil 2>/dev/null; then 14 | emacsclient --no-wait --quiet "$@" 15 | 16 | # Ensure Emacs becomes active even when prompts are shown. 17 | # 18 | # env -i is used to avoid polluting $PATH and other environment variables 19 | # passed to Emacs, which can cause warnings in extensions such as 20 | # exec-path-from-shell. 21 | env -i open -a Emacs 22 | elif [ $# -gt 0 ]; then 23 | env -i open -a Emacs --args "$(abspath "$1")" 24 | else 25 | env -i open -a Emacs 26 | fi 27 | 28 | -------------------------------------------------------------------------------- /symlinks/bin/bin/emc: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # This is a direct wrapper around emacsclient that can be used as a value for 4 | # $EDITOR. It does not use the GUI, and instead always creates a new frame on 5 | # the CLI. 6 | set -o errexit -o nounset 7 | 8 | emacsclient --alternate-editor "" \ 9 | --socket-name=cli \ 10 | --tty \ 11 | --quiet "$@" 2>/dev/null 12 | -------------------------------------------------------------------------------- /symlinks/bin/bin/quit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o errexit -o nounset 3 | 4 | for var in "$@"; do 5 | osascript -e "quit \"$var\"" 6 | done 7 | -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/banners/LICENSE.md: -------------------------------------------------------------------------------- 1 | Stock Emacs splash image by Luis Fernandes is taken [from Wikimedia Commons][1] 2 | under the license of GPLv2 or later. 3 | 4 | [1]: https://commons.wikimedia.org/wiki/File:Emacs-logo.svg 5 | -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/banners/emacs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/msanders/setup/a76a3a33b9cfda78242bd2aeda9086fdf82a0ce1/symlinks/emacs/.config/doom/banners/emacs.png -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/banners/emacs@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/msanders/setup/a76a3a33b9cfda78242bd2aeda9086fdf82a0ce1/symlinks/emacs/.config/doom/banners/emacs@2x.png -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/config.org: -------------------------------------------------------------------------------- 1 | #+TITLE: Doom Emacs Configuration 2 | #+AUTHOR: Michael Sanders 3 | #+EMAIL: michael.sanders@fastmail.com 4 | #+PROPERTY: :results silent :comments link 5 | 6 | This file contains my [[github:hlissner/doom-emacs][Doom Emacs]] configuration written in literate programming 7 | style with org mode. So far I've been impressed with Doom. It's fast, both in 8 | terms of startup speed and general use, polished, well maintained, and very 9 | enjoyable to use. The defaults are opinionated, but most have been exactly what 10 | I needed so there surprisingly isn't much to add here. 11 | 12 | * Preamble 13 | 14 | Enable lexical binding [[https://github.com/hlissner/doom-emacs/blob/develop/docs/faq.org#use-lexical-binding-everywhere][by default]]. 15 | 16 | #+BEGIN_SRC emacs-lisp 17 | ;;; -*- lexical-binding: t; -*- 18 | #+END_SRC 19 | 20 | Start benchmark for user config load time. 21 | 22 | #+BEGIN_SRC emacs-lisp 23 | (setq user-config-start-time (current-time)) 24 | #+END_SRC 25 | 26 | * Autoloads 27 | 28 | These are exported separately to =$DOOMDIR/autoload.el=. 29 | 30 | #+BEGIN_SRC emacs-lisp :tangle autoload.el 31 | ;;; autoload.el -*- lexical-binding: t; -*- 32 | 33 | ;;;###autoload 34 | (defun mac-toggle-option-as-meta () 35 | "Toggle option-as-meta setting on macOS." 36 | (interactive) 37 | (if (eq mac-option-modifier 'none) 38 | (progn 39 | (setq mac-option-modifier 'meta) 40 | (message "macOS option-as-meta behavior enabled.")) 41 | (setq mac-option-modifier 'none) 42 | (message "macOS option-as-meta behavior disabled."))) 43 | 44 | ;;;###autoload 45 | (defun fill-comment-or-paragraph (&optional justify) 46 | "Fill paragraph or comment at or after point. 47 | 48 | Attempts to fill the current paragraph using 49 | `fill-comment-paragraph' and a `fill-column' value of 50 | `comment-fill-column', or falls back to `fill-paragraph' if that 51 | returns nil." 52 | (interactive) 53 | (or (let ((fill-column (or comment-fill-column fill-column))) 54 | (fill-comment-paragraph justify)) 55 | (fill-paragraph justify))) 56 | 57 | ;;;###autoload 58 | (defun org-insert-custom-link (&optional complete-file description) 59 | "Insert custom link into org document." 60 | (interactive) 61 | (org-insert-link complete-file 62 | (read-string "Link: ") 63 | (or description (read-string "Description: ")))) 64 | 65 | ;;;###autoload 66 | (defun geiser-eval-last-buffer-sexp () 67 | "Eval current buffer in the Geiser REPL and print the result." 68 | (interactive) 69 | (let ((ret (save-excursion (geiser-eval-buffer nil t nil)))) 70 | (geiser-eval--retort-result-str ret nil))) 71 | 72 | ;;;###autoload 73 | (defun mks--gtags-env-patch (orig &rest args) 74 | "Hook to automatically configure GTAGSROOT and GTAGSDBPATH 75 | environment variables before invoking gtags functions." 76 | (if-let* ((project-root (file-truename (locate-dominating-file "." ".git"))) 77 | (git-dir (expand-file-name ".git" project-root)) 78 | (process-environment (append 79 | (list (format "GTAGSROOT=%s" project-root) 80 | (format "GTAGSDBPATH=%s" git-dir)) 81 | process-environment))) 82 | (apply orig args) 83 | (apply orig args))) 84 | #+END_SRC 85 | 86 | * General 87 | 88 | Enable jump to source for built-in Elisp functions. 89 | 90 | #+BEGIN_SRC emacs-lisp 91 | (setq find-function-C-source-directory "~/src/etc/emacs/src") 92 | #+END_SRC 93 | 94 | Allow listing projects via Magit. 95 | 96 | #+BEGIN_SRC emacs-lisp 97 | (setq magit-repository-directories '(("~/src/personal" . 1))) 98 | #+END_SRC 99 | 100 | Set full path to git for Magit to improve performance. 101 | 102 | #+BEGIN_SRC emacs-lisp 103 | (setq magit-git-executable "/usr/local/bin/git") 104 | #+END_SRC 105 | 106 | Use Fish for shell mode. 107 | 108 | #+BEGIN_SRC emacs-lisp 109 | (setq explicit-shell-file-name "/usr/local/bin/fish") 110 | #+END_SRC 111 | 112 | Treat underscores as [[https://evil.readthedocs.io/en/latest/faq.html#underscore-is-not-a-word-character][word characters]] for use with evil. 113 | 114 | #+BEGIN_SRC emacs-lisp 115 | (modify-syntax-entry ?_ "w") 116 | #+END_SRC 117 | 118 | Enable Avy across all visible windows. 119 | 120 | #+BEGIN_SRC emacs-lisp 121 | (setq avy-all-windows t) 122 | #+END_SRC 123 | 124 | Reduce delay for showing list of available keybindings after typing a prefix 125 | key. 126 | 127 | #+BEGIN_SRC emacs-lisp 128 | (setq which-key-idle-delay 0.5) 129 | #+END_SRC 130 | 131 | * Theme 132 | 133 | ** Font 134 | 135 | #+BEGIN_SRC emacs-lisp 136 | (setq doom-font (font-spec :family "Fira Mono" :size 16) 137 | doom-theme 'doom-Iosvkem 138 | doom-themes-enable-bold nil) 139 | #+END_SRC 140 | 141 | ** Dashboard 142 | 143 | Prefer the stock [[file:banners/emacs.png][Emacs splash image]]. 144 | 145 | #+BEGIN_SRC emacs-lisp 146 | (setq +doom-dashboard-banner-file 147 | (expand-file-name "emacs.png" 148 | (expand-file-name "banners" doom-private-dir))) 149 | #+END_SRC 150 | 151 | Disable dashboard when in daemon session. 152 | 153 | #+BEGIN_SRC emacs-lisp 154 | (when (daemonp) 155 | (remove-hook 'find-file-hook #'+vc-gutter-init-maybe-h) 156 | (remove-hook 'doom-init-ui-hook #'+doom-dashboard-init-h) 157 | (setq inhibit-startup-buffer-menu t)) 158 | #+END_SRC 159 | 160 | ** Line numbers 161 | 162 | Disable line numbers, which are often slow and not very useful. 163 | 164 | #+BEGIN_SRC emacs-lisp 165 | (setq display-line-numbers-type nil) 166 | #+END_SRC 167 | 168 | ** Frame 169 | 170 | Use a more generic frame title. 171 | 172 | #+BEGIN_SRC emacs-lisp 173 | (setq frame-title-format '("%b – Emacs") 174 | icon-title-format frame-title-format) 175 | #+END_SRC 176 | 177 | Start out in non-native full-screen. 178 | 179 | #+BEGIN_SRC emacs-lisp 180 | (setq initial-frame-alist '((fullscreen . fullboth))) 181 | #+END_SRC 182 | 183 | ** Modeline 184 | 185 | #+BEGIN_SRC emacs-lisp 186 | (use-package nyan-mode :when (display-graphic-p)) 187 | 188 | (let* ((main-modeline (alist-get :main +modeline-format-alist)) 189 | (mks-modeline 190 | (if (display-graphic-p) 191 | (cons 192 | (append (butlast (car main-modeline)) 193 | '(" " (:eval (list (nyan-create))))) 194 | (append '((" %l:%C ")) 195 | (cdr main-modeline))) 196 | (cons (butlast (car main-modeline)) 197 | '((" %l:%C ") mode-line-misc-info +modeline-modes))))) 198 | (def-modeline! :mks (car mks-modeline) (cdr mks-modeline))) 199 | 200 | (set-modeline! :mks 'default) 201 | #+END_SRC 202 | 203 | * Input 204 | 205 | Use =fd= to escape from insert mode, as in Spacemacs. 206 | 207 | #+BEGIN_SRC emacs-lisp 208 | (setq evil-escape-key-sequence "fd") 209 | #+END_SRC 210 | 211 | Allow using the right option key on macOS to input special characters. By 212 | default, Doom sets this to ='meta=. 213 | 214 | #+BEGIN_SRC emacs-lisp 215 | (setq mac-right-option-modifier 'none) 216 | #+END_SRC 217 | 218 | ** Column Limits 219 | 220 | Set appropriate values for =fill-column=. Note that by default it's 221 | buffer-local, so =setq-default= is required. 222 | 223 | #+BEGIN_SRC emacs-lisp 224 | (setq-default fill-column 79) 225 | (setq-hook! (fish-mode rustic-mode swift-mode) 226 | comment-fill-column 79 227 | fill-column 100) 228 | (setq-hook! emacs-lisp-mode 229 | comment-fill-column 70) 230 | (add-hook! (prog-mode text-mode) #'display-fill-column-indicator-mode) 231 | #+END_SRC 232 | 233 | ** Key Bindings 234 | #+BEGIN_SRC emacs-lisp 235 | (map! 236 | ;; Use F2 to toggle option-as-meta behavior. 237 | :gn [f2] #'mac-toggle-option-as-meta 238 | 239 | ;; Use `Command-Return' to toggle non-native fullscreen. 240 | :gn [s-return] #'toggle-frame-fullscreen 241 | 242 | ;; Use `Command-{' and `Command-}' to switch between tabs. 243 | :gn "s-{" #'+workspace/switch-left 244 | :gn "s-}" #'+workspace/switch-right 245 | 246 | ;; Automatically save sessions when quitting via `Command-Q'. 247 | ;; :gn "s-q" "SPC q Q" 248 | 249 | ;; Override the default `fill-paragraph' binding. 250 | :gn "M-q" #'fill-comment-or-paragraph 251 | 252 | ;; Bring back the default of `C-k' to kill line in insert mode. 253 | :i "C-k" #'kill-line 254 | 255 | ;; Use `M-/ to expand snippets. 256 | :i "M-/" #'yas-expand 257 | 258 | ;; Allow using ; to enter command mode. 259 | :nv ";" #'evil-ex 260 | 261 | ;; Use \ for previous ; command. 262 | :nv "\\" #'evil-snipe-repeat 263 | 264 | ;; Use | for previous \ command. 265 | :nv "|" #'evil-execute-in-emacs-state 266 | 267 | ;; Add two new key bindings, `gp' and `gP' in normal/visual mode to 268 | ;; paste yanked (as opposed to recently deleted) text. By default, 269 | ;; `p' uses the unnamed register which becomes polluted when 270 | ;; modifying existing text. 271 | :nv "gp" "\"0p" 272 | :nv "gP" "\"0P" 273 | 274 | ;; Use +/- for incrementing/decrementing numbers. 275 | :nv "+" #'evil-numbers/inc-at-pt 276 | :nv "-" #'evil-numbers/dec-at-pt 277 | 278 | ;; Prefer `C-k' to be used for `kill-line' when using 279 | ;; `eval-expression' and `ex' rather than Doom's default of 280 | ;; `previous-line'. 281 | :map evil-ex-completion-map "C-k" #'kill-line 282 | :map read-expression-map 283 | "C-k" #'kill-line 284 | "C-n" #'next-line-or-history-element 285 | "C-p" #'previous-line-or-history-element 286 | 287 | ;; Use `M-n'/`M-p' to jump fields to avoid conflicting with e.g. 288 | ;; company mode auto completions. 289 | :map yas-keymap "M-n" #'yas-next-field 290 | :map yas-keymap "M-p" #'yas-prev-field 291 | 292 | ;; Prefer double-space to invoke `M-x' as in Spacemacs. 293 | :leader 294 | :desc "Call a command" "SPC" #'counsel-M-x 295 | 296 | ;; Use `SPC-fa' to toggle between header/source files. 297 | (:prefix "f" 298 | :desc "Find header or source file" "a" #'ff-find-other-file) 299 | 300 | (:prefix "w" 301 | ;; Prefer Spacemacs variants for window bindings. 302 | "/" #'evil-window-vsplit 303 | "m" #'doom/window-maximize-buffer 304 | 305 | ;; Use `SPC w g' to toggle golden ratio sizing. 306 | "g" #'golden-ratio) 307 | 308 | :map org-mode-map 309 | :localleader 310 | (:prefix ("l" . "link") 311 | "h" #'org-insert-custom-link) 312 | 313 | :map geiser-mode-map 314 | :localleader 315 | (:prefix ("e" . "+eval") 316 | "E" #'geiser-eval-last-buffer-sexp)) 317 | #+END_SRC 318 | 319 | * Completion 320 | ** Company 321 | 322 | Decrease idle delay for faster completions. Note: setting this all the way down 323 | to 0 can cause infinite loops to get spun off during garbage collection in 324 | completion, so 0.1 is used instead. 325 | 326 | #+BEGIN_SRC emacs-lisp 327 | (setq company-idle-delay 0.1) 328 | #+END_SRC 329 | 330 | Allow selecting match using tab. 331 | 332 | #+BEGIN_SRC emacs-lisp 333 | (after! company 334 | (define-key! company-active-map 335 | "TAB" #'company-complete-selection 336 | [tab] #'company-complete-selection)) 337 | #+END_SRC 338 | 339 | ** LSP 340 | 341 | Decrease idle delay to be nearly instantaneous. 342 | 343 | #+BEGIN_SRC emacs-lisp 344 | (setq company-idle-delay 0.1) 345 | #+END_SRC 346 | 347 | ** Ivy 348 | 349 | #+BEGIN_SRC emacs-lisp 350 | (after! ivy 351 | (define-key! ivy-minibuffer-map 352 | ;; Enable fish-style forward completion. 353 | "C-f" #'ivy-alt-done 354 | 355 | ;; Use RET for continuing completion on a directory, as in ido. 356 | "RET" #'ivy-alt-done) 357 | 358 | (setq 359 | ;; Allow using / to auto-complete. 360 | ivy-magic-slash-non-match-action 'ivy-magic-slash-non-match-cd-selected 361 | 362 | ;; Require full ~/ to navigate home. 363 | ivy-magic-tilde nil 364 | 365 | ;; Enable recent files in switch-buffer. 366 | ivy-use-virtual-buffers t 367 | 368 | ;; Abbreviate buffer list by default. 369 | ivy-rich-path-style 'relative 370 | ivy-virtual-abbreviate 'abbreviate)) 371 | #+END_SRC 372 | 373 | * Gtags 374 | 375 | Configure gtags to look in git repo for [[https://posts.mksanders.org/automatic-gtags-integration-emacs-git/][automatically generated index]]. 376 | 377 | #+BEGIN_SRC emacs-lisp 378 | (after! counsel-gtags 379 | (advice-add #'counsel-gtags-find-reference :around #'mks--gtags-env-patch) 380 | (advice-add #'counsel-gtags-find-symbol :around #'mks--gtags-env-patch) 381 | (advice-add #'counsel-gtags-find-definition :around #'mks--gtags-env-patch) 382 | (advice-add #'counsel-gtags-dwim :around #'mks--gtags-env-patch)) 383 | #+END_SRC 384 | 385 | * Org Mode 386 | 387 | Prefer =counsel-org-capture= for Doom's =org-capture= CLI command, which has a 388 | slightly prettier UI. 389 | 390 | By default, it allows substring matching across item descriptions, which can 391 | prevent using the aliases shown in the left-hand column. This is worked around 392 | below by giving =ivy-read= an initial input of =^=. 393 | 394 | #+BEGIN_SRC emacs-lisp 395 | (setq +org-capture-fn 396 | (λ! () 397 | (cl-letf* ((ivy-read-orig 398 | (symbol-function #'ivy-read)) 399 | ((symbol-function #'ivy-read) 400 | (doom-rpartial ivy-read-orig :initial-input "^"))) 401 | (counsel-org-capture)))) 402 | #+END_SRC 403 | 404 | Allow cancelling =org-capture= frame via =C-g=. 405 | 406 | #+BEGIN_SRC emacs-lisp 407 | (defadvice! mks--org-capture-open-frame-remap-a (orig-fn &rest args) 408 | :around #'+org-capture/open-frame 409 | (require 'ivy) 410 | (let* ((ivy-minibuffer-map-orig ivy-minibuffer-map) 411 | (ivy-minibuffer-map (copy-tree ivy-minibuffer-map-orig))) 412 | (define-key ivy-minibuffer-map (kbd "C-g") 413 | (λ! () 414 | (delete-frame) 415 | (minibuffer-keyboard-quit))) 416 | (apply orig-fn args))) 417 | #+END_SRC 418 | 419 | Adjust the =org-capture= frame slightly to hide banner and increase column 420 | width. 421 | 422 | #+BEGIN_SRC emacs-lisp 423 | (add-to-list '+org-capture-frame-parameters '(width . 100)) 424 | (add-to-list '+org-capture-frame-parameters '(height . 20)) 425 | #+END_SRC 426 | 427 | Make =org-mode= bullets prettier. 428 | 429 | #+BEGIN_SRC emacs-lisp 430 | (setq org-ellipsis " ▼ " 431 | org-superstar-headline-bullets-list '("☯" "☰" "☱" "☲" "☳" "☴" "☵" "☶" "☷" 432 | "☷" "☷") 433 | org-todo-keywords '((sequence "☛ TODO(t)" "|" "✔ DONE(d)") 434 | (sequence "⚑ WAITING(w)" "|") 435 | (sequence "|" "✘ CANCELED(c)"))) 436 | #+END_SRC 437 | 438 | Set a default directory for org files. 439 | 440 | #+BEGIN_SRC emacs-lisp 441 | (setq org-directory "~/Dropbox/Org/") 442 | #+END_SRC 443 | 444 | * Additional Packages 445 | 446 | Quit helpful after pushing a navigate to definition button. 447 | 448 | #+BEGIN_SRC emacs-lisp 449 | (defadvice! mks--helpful-navigate-quit-a (&rest _) 450 | :after #'helpful--navigate 451 | (helpful-kill-buffers)) 452 | #+END_SRC 453 | 454 | Automatically start background REPL when using Geiser. 455 | 456 | #+BEGIN_SRC emacs-lisp 457 | (after! geiser-mode 458 | (setq geiser-mode-start-repl-p t)) 459 | #+END_SRC 460 | 461 | Fix issues formatting code in swift-mode. 462 | 463 | #+BEGIN_SRC emacs-lisp 464 | (after! swift-mode 465 | (setq swift-mode:parenthesized-expression-offset 4)) 466 | (after! smartparens 467 | (sp-local-pair 'swift-mode "\\(" ")" :when '(sp-in-string-p))) 468 | #+END_SRC 469 | 470 | Autoload additional packages. 471 | 472 | #+BEGIN_SRC emacs-lisp 473 | (use-package elcord :defer t) 474 | (use-package golden-ratio :defer t) 475 | (use-package fish-mode 476 | :defer t 477 | :config 478 | (set-company-backend! 'fish-mode #'company-fish-shell)) 479 | (use-package swift-playground-mode 480 | :defer t 481 | :init 482 | (autoload 'swift-playground-global-mode "swift-playground-mode" nil t) 483 | (add-hook 'swift-mode-hook #'swift-playground-global-mode)) 484 | #+END_SRC 485 | 486 | Declare packages to be installed via ~doom sync~ in =$DOOMDIR/packages.el=. 487 | 488 | #+BEGIN_SRC emacs-lisp :tangle packages.el 489 | ;; -*- no-byte-compile: t; -*- 490 | ;;; packages.el 491 | 492 | (package! counsel-gtags) 493 | (package! elcord) 494 | (package! fish-mode) 495 | (package! golden-ratio) 496 | (package! nyan-mode) 497 | (package! swift-playground-mode) 498 | #+END_SRC 499 | 500 | * Epilogue 501 | 502 | Load secrets. 503 | 504 | #+BEGIN_SRC emacs-lisp 505 | (load! "secrets.el" doom-emacs-dir t) 506 | #+END_SRC 507 | 508 | End user config load time benchmark. 509 | 510 | #+BEGIN_SRC emacs-lisp 511 | (setq user-config-end-time (float-time (time-subtract 512 | (current-time) 513 | user-config-start-time))) 514 | 515 | (add-hook 'window-setup-hook 516 | (lambda () 517 | (message "User config loaded in %.03fs" user-config-end-time) 518 | (message "")) 'append) 519 | #+END_SRC 520 | -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/init.el: -------------------------------------------------------------------------------- 1 | ;;; init.el -*- lexical-binding: t; -*- 2 | 3 | ;; This file controls what Doom modules are enabled and what order 4 | ;; they load in. Remember to run 'doom sync' after modifying it! 5 | 6 | ;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access 7 | ;; Doom's documentation. There you'll find information about all 8 | ;; of Doom's modules and what flags they support. 9 | 10 | ;; NOTE Move your cursor over a module's name (or its flags) and press 11 | ;; 'K' (or 'C-c g k' for non-vim users) to view its 12 | ;; documentation. This works on flags as well (those symbols that 13 | ;; start with a plus). 14 | ;; 15 | ;; Alternatively, press 'gd' (or 'C-c g d') on a module to browse 16 | ;; its directory (for easy access to its source code). 17 | 18 | (doom! :input 19 | ;;chinese 20 | ;;japanese 21 | 22 | :completion 23 | company ; the ultimate code completion backend 24 | ;;helm ; the *other* search engine for love and life 25 | ;;ido ; the other *other* search engine... 26 | ivy ; a search engine for love and life 27 | 28 | :ui 29 | ;;deft ; notational velocity for Emacs 30 | doom ; what makes DOOM look the way it does 31 | doom-dashboard ; a nifty splash screen for Emacs 32 | doom-quit ; DOOM quit-message prompts when you quit Emacs 33 | ;; fill-column ; a `fill-column' indicator 34 | hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW 35 | ;;hydra 36 | ;;indent-guides ; highlighted indent columns 37 | (modeline +light) ; snazzy, Atom-inspired modeline, plus API 38 | nav-flash ; blink the current line after jumping 39 | ;;neotree ; a project drawer, like NERDTree for vim 40 | ophints ; highlight the region an operation acts on 41 | (popup +defaults) ; tame sudden yet inevitable temporary windows 42 | ;;pretty-code ; replace bits of code with pretty symbols 43 | ;;tabs ; an tab bar for Emacs 44 | treemacs ; a project drawer, like neotree but cooler 45 | ;;unicode ; extended unicode support for various languages 46 | vc-gutter ; vcs diff in the fringe 47 | vi-tilde-fringe ; fringe tildes to mark beyond EOB 48 | window-select ; visually switch windows 49 | ;; workspaces ; tab emulation, persistence & separate workspaces 50 | zen ; distraction-free coding or writing 51 | 52 | :editor 53 | (evil +everywhere); come to the dark side, we have cookies 54 | ;;file-templates ; auto-snippets for empty files 55 | ;;fold ; (nigh) universal code folding 56 | format ; automated prettiness 57 | ;;god ; run Emacs commands without modifier keys 58 | ;;lispy ; vim for lisp, for people who don't like vim 59 | multiple-cursors ; editing in many places at once 60 | ;;objed ; text object editing for the innocent 61 | parinfer ; turn lisp into python, sort of 62 | ;;rotate-text ; cycle region at point between text candidates 63 | snippets ; my elves. They type so I don't have to 64 | word-wrap ; soft wrapping with language-aware indent 65 | 66 | :emacs 67 | (dired +icons) ; making dired pretty [functional] 68 | electric ; smarter, keyword-based electric-indent 69 | ;;ibuffer ; interactive buffer management 70 | vc ; version-control and Emacs, sitting in a tree 71 | 72 | :term 73 | ;;eshell ; a consistent, cross-platform shell (WIP) 74 | shell ; a terminal REPL for Emacs 75 | ;;term ; terminals in Emacs 76 | ;;vterm ; another terminals in Emacs 77 | 78 | :checkers 79 | syntax ; tasing you for every semicolon you forget 80 | ;;spell ; tasing you for misspelling mispelling 81 | ;;grammar ; tasing grammar mistake every you make 82 | 83 | :tools 84 | ;;ansible 85 | ;;debugger ; FIXME stepping through code, to help you add bugs 86 | ;;direnv 87 | ;;docker 88 | editorconfig ; let someone else argue about tabs vs spaces 89 | ;;ein ; tame Jupyter notebooks with emacs 90 | ;; (eval +overlay) ; run code, run (also, repls) 91 | ;;gist ; interacting with github gists 92 | (lookup ; helps you navigate your code and documentation 93 | +docsets) ; ...or in Dash docsets locally 94 | (lsp +eglot) 95 | ;;macos ; MacOS-specific commands 96 | magit ; a git porcelain for Emacs 97 | make ; run make tasks from Emacs 98 | ;;pass ; password manager for nerds 99 | ;;pdf ; pdf enhancements 100 | ;;prodigy ; FIXME managing external services & code builders 101 | ;;rgb ; creating color strings 102 | ;;terraform ; infrastructure as code 103 | ;;tmux ; an API for interacting with tmux 104 | ;;upload ; map local to remote projects via ssh/ftp 105 | 106 | :lang 107 | ;;agda ; types of types of types of types... 108 | ;;assembly ; assembly for fun or debugging 109 | (cc +lsp) ; C/C++/Obj-C madness 110 | ;;clojure ; java with a lisp 111 | ;;common-lisp ; if you've seen one lisp, you've seen them all 112 | ;;coq ; proofs-as-programs 113 | ;;crystal ; ruby at the speed of c 114 | ;;csharp ; unity, .NET, and mono shenanigans 115 | data ; config/data formats 116 | ;;elixir ; erlang done right 117 | ;;elm ; care for a cup of TEA? 118 | emacs-lisp ; drown in parentheses 119 | ;;erlang ; an elegant language for a more civilized age 120 | ;;ess ; emacs speaks statistics 121 | ;;faust ; dsp, but you get to keep your soul 122 | ;;fsharp ; ML stands for Microsoft's Language 123 | ;;fstar ; (dependent) types and (monadic) effects and Z3 124 | ;;go ; the hipster dialect 125 | (haskell +lsp +intero) ; a language that's lazier than I am 126 | ;;hy ; readability of scheme w/ speed of python 127 | ;;idris ; 128 | ;;(java +meghanada) ; the poster child for carpal tunnel syndrome 129 | (javascript +lsp) ; all(hope(abandon(ye(who(enter(here)))))) 130 | ;;julia ; a better, faster MATLAB 131 | ;;kotlin ; a better, slicker Java(Script) 132 | ;;latex ; writing papers in Emacs has never been so fun 133 | ;;lean 134 | ;;factor 135 | ledger ; an accounting system in Emacs 136 | ;;lua ; one-based indices? one-based indices 137 | markdown ; writing docs for people to ignore 138 | ;;nim ; python + lisp at the speed of c 139 | ;;nix ; I hereby declare "nix geht mehr!" 140 | ;;ocaml ; an objective camel 141 | (org ; organize your plain life in plain text 142 | ;; +dragndrop ; drag & drop files/images into org buffers 143 | ;;+hugo ; use Emacs for hugo blogging 144 | ;;+jupyter ; ipython/jupyter support for babel 145 | +pandoc ; export-with-pandoc support 146 | ;;+pomodoro ; be fruitful with the tomato technique 147 | +present) ; using org-mode for presentations 148 | ;;perl ; write code no one else can comprehend 149 | ;;php ; perl's insecure younger brother 150 | ;;plantuml ; diagrams for confusing people more 151 | ;;purescript ; javascript, but functional 152 | (python +lsp) ; beautiful is better than ugly 153 | ;;qt ; the 'cutest' gui framework ever 154 | ;;racket ; a DSL for DSLs 155 | ;;rest ; Emacs as a REST client 156 | ;;rst ; ReST in peace 157 | ruby ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} 158 | (rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap() 159 | ;;scala ; java, but good 160 | scheme ; a fully conniving family of lisps 161 | sh ; she sells {ba,z,fi}sh shells on the C xor 162 | ;;solidity ; do you need a blockchain? No. 163 | swift ; who asked for emoji variables? 164 | ;;terra ; Earth and Moon in alignment for performance. 165 | ;;web ; the tubes 166 | yaml ; JSON, but readable 167 | 168 | :email 169 | ;;(mu4e +gmail) 170 | ;;notmuch 171 | ;;(wanderlust +gmail) 172 | 173 | :app 174 | ;;calendar 175 | ;;irc ; how neckbeards socialize 176 | ;;(rss +org) ; emacs as an RSS reader 177 | ;;twitter ; twitter client https://twitter.com/vnought 178 | 179 | :config 180 | literate 181 | (default +bindings +smartparens)) 182 | -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/snippets/ledger-mode/.yas-compiled-snippets.el: -------------------------------------------------------------------------------- 1 | ;;; Compiled snippets and support files for `ledger-mode' 2 | ;;; Snippet definitions: 3 | ;;; 4 | (yas-define-snippets 'ledger-mode 5 | '(("t" "${1:`(format-time-string \"%Y\")`}-${2:`(format-time-string \"%m\")`}-${3:`(format-time-string \"%d\")`} ${4:Name}\n ${5:Account} \\$${6:0.00}\n ${7:Fund}\n" "Transaction" nil nil 6 | ((yas-indent-line 'fixed)) 7 | "/Users/mks/.config/doom/snippets/ledger-mode/transaction" nil nil) 8 | ("p" "${1:`(format-time-string \"%Y\")`}-${2:`(format-time-string \"%m\")`}-${3:`(format-time-string \"%d\")`} ${4:Name}\n Liabilities:$5 \\$${6:0.00}\n Assets:$7\n" "Payment" nil nil 9 | ((yas-indent-line 'fixed)) 10 | "/Users/mks/.config/doom/snippets/ledger-mode/payment" nil nil) 11 | ("i" "${1:`(format-time-string \"%Y\")`}-${2:`(format-time-string \"%m\")`}-${3:`(format-time-string \"%d\")`} ${4:Name}\n Assets:$5 \\$${6:0.00}\n Income:$7\n" "Income" nil nil 12 | ((yas-indent-line 'fixed)) 13 | "/Users/mks/.config/doom/snippets/ledger-mode/income" nil nil) 14 | ("e" "${1:`(format-time-string \"%Y\")`}-${2:`(format-time-string \"%m\")`}-${3:`(format-time-string \"%d\")`} ${4:Name}\n Expenses:$5 \\$${6:0.00}\n Assets:$7\n" "Expense" nil nil 15 | ((yas-indent-line 'fixed)) 16 | "/Users/mks/.config/doom/snippets/ledger-mode/expense" nil nil))) 17 | 18 | 19 | ;;; Do not edit! File generated at Sat Mar 7 10:21:01 2020 20 | -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/snippets/ledger-mode/expense: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: Expense 3 | # key: e 4 | # expand-env: ((yas-indent-line 'fixed)) 5 | # -- 6 | 7 | ${1:`(format-time-string "%Y")`}-${2:`(format-time-string "%m")`}-${3:`(format-time-string "%d")`} ${4:Name} 8 | Expenses:$5 \$${6:0.00} 9 | ${7:Assets:Checking} 10 | -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/snippets/ledger-mode/income: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: Income 3 | # key: i 4 | # expand-env: ((yas-indent-line 'fixed)) 5 | # -- 6 | 7 | ${1:`(format-time-string "%Y")`}-${2:`(format-time-string "%m")`}-${3:`(format-time-string "%d")`} ${4:Name} 8 | Assets:${5:Checking} \$${6:0.00} 9 | Income:$7 10 | -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/snippets/ledger-mode/payment: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: Payment 3 | # key: p 4 | # expand-env: ((yas-indent-line 'fixed)) 5 | # -- 6 | 7 | ${1:`(format-time-string "%Y")`}-${2:`(format-time-string "%m")`}-${3:`(format-time-string "%d")`} ${4:Name} 8 | Liabilities:$5 \$${6:0.00} 9 | ${7:Assets:Checking} 10 | -------------------------------------------------------------------------------- /symlinks/emacs/.config/doom/snippets/ledger-mode/transaction: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: Transaction 3 | # key: t 4 | # expand-env: ((yas-indent-line 'fixed)) 5 | # -- 6 | ${1:`(format-time-string "%Y")`}-${2:`(format-time-string "%m")`}-${3:`(format-time-string "%d")`} ${4:Name} 7 | ${5:Account} \$${6:0.00} 8 | ${7:Fund} 9 | -------------------------------------------------------------------------------- /symlinks/fish/.config/fish/config.fish: -------------------------------------------------------------------------------- 1 | # Checking for login status here allows for faster start times when using tmux. 2 | # See: 3 | # - https://posts.mksanders.org/instant-pyenv-rbenv-startup-times-with-tmux 4 | # - https://posts.mksanders.org/faster-fish-startup-times 5 | if status is-login 6 | # pyenv 7 | if command -v pyenv >/dev/null 8 | pyenv init - --no-rehash fish | source 9 | and funcsave pyenv 10 | and sh -c 'pyenv rehash 2>/dev/null &' 11 | end 12 | 13 | # rbenv 14 | if command -v rbenv >/dev/null 15 | rbenv init - --no-rehash fish | source 16 | and funcsave rbenv 17 | and sh -c 'rbenv rehash 2>/dev/null &' 18 | end 19 | 20 | set --export DEVELOPER_DIR "/Applications/Xcode.app/Contents/Developer" 21 | set --export EDITOR "emc" 22 | set --export GTAGSLABEL "pygments" 23 | set --export HOMEBREW_AUTO_UPDATE_SECS 86400 24 | set --export LANG en_US.UTF-8 25 | set --export LANGUAGE en_US.UTF-8 26 | set --export LC_ALL en_US.UTF-8 27 | set --export MANPAGER "sh -c 'col -bx | bat -l man -p'" 28 | set --export PATH "$HOME/bin" "$HOME/.local/bin" "$HOME/.cargo/bin" "$HOME/.cask/bin" \ 29 | "$HOME/.emacs.d/bin" "/usr/local/opt/emacs-mac/bin" $PATH 30 | set --export PYENV_ROOT "$HOME/.pyenv" 31 | set --export SHELLCHECK_OPTS "--external-sources" 32 | 33 | if status is-interactive 34 | if test -f $HOME/.aliases 35 | source $HOME/.aliases 36 | 37 | # Export aliases for lazy-loading in child shells. 38 | for alias in (rg -o "^alias \b\w+\b" $HOME/.aliases | cut -c 7-) 39 | funcsave $alias 40 | end 41 | end 42 | 43 | if test -f $HOME/.functions.fish 44 | source $HOME/.functions.fish 45 | 46 | # Export functions for lazy-loading in child shells. 47 | for func in (rg -o "function \b\w+\b" $HOME/.functions.fish | cut -c 10-) 48 | funcsave $func 49 | end 50 | end 51 | 52 | # Enable hybrid vi/emacs bindings. 53 | if ! test "$fish_key_bindings" = "fish_hybrid_key_bindings" 54 | fish_hybrid_key_bindings 55 | end 56 | end 57 | end 58 | 59 | if status is-interactive 60 | # Disable greeting. 61 | set --export fish_greeting 62 | function fish_greeting; end 63 | 64 | # Use fd to leave insert mode. 65 | function fish_user_key_bindings 66 | bind -M insert -m default fd backward-char force-repaint 67 | end 68 | 69 | # Disable dated history in bobthefish prompt. 70 | set -g theme_display_date no 71 | 72 | # Apply theme. 73 | set --export theme_color_scheme zenburn 74 | set fish_color_normal normal 75 | set fish_color_command ffd700 76 | set fish_color_quote normal 77 | set fish_color_redirection normal 78 | set fish_color_end ffffff 79 | set fish_color_error ff5f5f --bold 80 | set fish_color_param ffff5f 81 | set fish_color_comment 87ffff 82 | set fish_color_match cyan 83 | set fish_color_search_match ffffff --background=005f00 84 | set fish_color_operator cyan 85 | set fish_color_escape cyan 86 | set fish_color_cwd green 87 | end 88 | -------------------------------------------------------------------------------- /symlinks/fish/.functions.fish: -------------------------------------------------------------------------------- 1 | function notify --description "Write message to system notification" 2 | set --local message 3 | if [ $argv ]; set message $argv; else; set message "Done running task"; end 4 | terminal-notifier -title "✅ Done" -message $message -timeout 5 5 | end 6 | 7 | function md --description "Make directory and switch to it" 8 | mkdir -p $argv && cd $argv 9 | end 10 | 11 | function gd --description "Clone a git repository and switch to it" --argument repo 12 | assert "$repo" 13 | or echo "Missing required argument ." >&2 && return 1 14 | 15 | set --local url (/usr/bin/python -c " 16 | import sys 17 | if sys.argv[1].startswith('http') or sys.argv[1].startswith('git@'): 18 | print(sys.argv[1]) 19 | else: 20 | print('https://github.com/{}'.format(sys.argv[1]))" $repo) 21 | or return 1 22 | 23 | set --local dir (/usr/bin/python -c " 24 | import os 25 | import sys 26 | from urlparse import urlparse 27 | if sys.argv[1].startswith('http') or sys.argv[1].startswith('git@'): 28 | print(os.path.splitext(os.path.split(urlparse(sys.argv[1]).path)[-1])[0]) 29 | else: 30 | print(os.path.basename(sys.argv[1]))" $repo) 31 | or return 1 32 | 33 | git clone $url && cd $dir 34 | end 35 | 36 | # From https://stackoverflow.com/a/39891882 37 | function read_confirm --description "Ask user for a confirmation" --argument prompt 38 | if test -z "$prompt" 39 | set prompt "Continue?" 40 | end 41 | 42 | while true 43 | read -P "$prompt [y/N]: " -l confirm 44 | switch $confirm 45 | case Y y 46 | return 0 47 | case '' N n 48 | return 1 49 | end 50 | end 51 | end 52 | 53 | 54 | function rm_ds_store --description "Remove .DS_Store files recursively from a directory" \ 55 | --argument dir 56 | set --local files (fd --hidden '^\.DS_Store$' --no-ignore $dir) 57 | if test -n "$files" 58 | echo "Found $files" 59 | if read_confirm "Remove files?" 60 | rm $files 61 | end 62 | else 63 | echo "No .DS_Store files found." 64 | end 65 | end 66 | -------------------------------------------------------------------------------- /symlinks/git/.git_template/hooks/gtags: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Generate gtags for repo and place in `.git` directory. 4 | # See: https://posts.mksanders.org/automatic-gtags-integration-emacs-git 5 | set -o errexit -o nounset 6 | 7 | PATH="/usr/local/bin:$PATH" 8 | 9 | main() ( 10 | root_dir="$(git rev-parse --show-toplevel)" 11 | git_dir="$(git rev-parse --git-dir)" 12 | 13 | cd "$root_dir" 14 | trap 'rm -f GPATH GRTAGS GTAGS gtags.files' EXIT 15 | 16 | # Match non-empty text files, excluding submodules. 17 | git grep -I --cached --files-with-matches "" > gtags.files 18 | 19 | gtags --gtagslabel=pygments 20 | rm gtags.files 21 | mv GPATH GRTAGS GTAGS "$git_dir/" 22 | 23 | echo "gtags index created at $git_dir/GTAGS" 24 | ) 25 | 26 | main 27 | -------------------------------------------------------------------------------- /symlinks/git/.git_template/hooks/post-checkout: -------------------------------------------------------------------------------- 1 | post-gtags-hook -------------------------------------------------------------------------------- /symlinks/git/.git_template/hooks/post-commit: -------------------------------------------------------------------------------- 1 | ./post-gtags-hook -------------------------------------------------------------------------------- /symlinks/git/.git_template/hooks/post-gtags-hook: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | .git/hooks/gtags >/dev/null 2>&1 & 3 | -------------------------------------------------------------------------------- /symlinks/git/.git_template/hooks/post-merge: -------------------------------------------------------------------------------- 1 | post-gtags-hook -------------------------------------------------------------------------------- /symlinks/git/.git_template/hooks/post-rewrite: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | case "$1" in 3 | rebase) exec .git/hooks/post-merge ;; 4 | esac 5 | -------------------------------------------------------------------------------- /symlinks/git/.gitconfig: -------------------------------------------------------------------------------- 1 | [user] 2 | name = Michael Sanders 3 | email = michael.sanders@fastmail.com 4 | [commit] 5 | gpgsign = true 6 | [core] 7 | excludesfile = ~/.gitignore 8 | pager = delta 9 | whitespace = trailing-space,space-before-tab 10 | [credential] 11 | helper = osxkeychain 12 | [delta] 13 | syntax-theme = zenburn 14 | [init] 15 | templatedir = ~/.git_template 16 | [interactive] 17 | difffilter = delta --color-only 18 | [difftool] 19 | prompt = false 20 | [merge] 21 | tool = opendiff 22 | [mergetool] 23 | keepBackup = false 24 | prompt = false 25 | [alias] 26 | eeny = add --patch 27 | graph = log --oneline --decorate --graph 28 | gtags = !.git/hooks/gtags 29 | lastsha = !git rev-parse HEAD | cut -c1-7 30 | pushd = push -u origin HEAD 31 | redate = rebase --committer-date-is-author-date 32 | restart = switch --force-create 33 | revise = commit --amend --date=now 34 | smuggle = "!CDATE=$(git show -s --date=iso --format=%cd @); GIT_COMMITTER_DATE=$CDATE GIT_AUTHOR_DATE=$CDATE git commit --amend --reset-author" 35 | staged = diff --staged 36 | start = switch --create 37 | unpushed = log --oneline --decorate --graph @{upstream}.. 38 | unstage = reset HEAD 39 | unstaged = diff 40 | [web] 41 | browser = open 42 | [rebase] 43 | autoStash = true 44 | -------------------------------------------------------------------------------- /symlinks/git/dot-gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | Carthage/Build 3 | -------------------------------------------------------------------------------- /symlinks/lldb/.lldbinit: -------------------------------------------------------------------------------- 1 | command alias uikit expr @import UIKit 2 | command alias foundation expr @import Foundation 3 | 4 | command script import "~/Library/Application Support/Realm/rlm_lldb.py" --allow-reload 5 | 6 | ### Reveal LLDB commands support - DO NOT MODIFY 7 | command script import /Applications/Reveal.app/Contents/SharedSupport/Scripts/RevealServerCommands.py 8 | ### 9 | 10 | command script import /usr/local/opt/chisel/libexec/fblldb.py 11 | -------------------------------------------------------------------------------- /symlinks/sh/.aliases: -------------------------------------------------------------------------------- 1 | # -*- mode: sh -*- vim:ft=sh 2 | 3 | # Format bash script. 4 | alias bashfmt="shfmt -s -i=4 -ci -ln=bash" 5 | 6 | # Shorthand to use syntax highlighted diff output. 7 | alias cdiff="sh -c 'diff -u \"\$0\" \"\$1\" | delta'" 8 | 9 | # Prefer bat over cat. 10 | alias cat="bat" 11 | 12 | # Change to path shown in Finder. 13 | alias cdfinder='fish -c "cd (finderpath)"' 14 | 15 | # Print path currently shown in Finder. 16 | alias finderpath="osascript -e 'tell app \"Finder\" to POSIX path of (insertion location as alias)'" 17 | 18 | # Hide a file from Finder on macOS. 19 | alias hide="chflags hidden" 20 | 21 | # Format HTML file. 22 | alias htmlfmt="tidy -ashtml --indent auto --indent-spaces 4 --tidy-mark no -utf8 --wrap 0" 23 | 24 | # Lock file on macOS. 25 | alias lock="sudo chflags uchg" 26 | 27 | # Open repo in Magit. 28 | alias magit='emacsclient --eval "(magit-status)" --suppress-output && open -a Emacs' 29 | 30 | # Format POSIX shell script. 31 | alias pshfmt="shfmt -s -i=4 -ci -ln=posix" 32 | 33 | # Restart Wi-Fi on macOS. 34 | alias restartwifi="sudo ifconfig en0 down; sudo ifconfig en0 up" 35 | 36 | # fd is set to escape into normal mode on my shell with modal editing enabled. 37 | alias rf="fd" 38 | 39 | # Print human-readable size of file or directory. 40 | alias sizeof="du -sh" 41 | 42 | # Safely edit a file as root. 43 | alias sudoedit="sudo --edit" 44 | 45 | # Immediately set display to sleep. 46 | alias snooze="pmset displaysleepnow" 47 | 48 | # Shorthand to fully format a Swift file / directory. 49 | alias swiftfmt="sh -c 'swiftlint autocorrect \"\$0\" && swiftformat \"\$0\"'" 50 | 51 | # Unhide a file from Finder on macOS. 52 | alias unhide="chflags nohidden" 53 | 54 | # Unlock a file on macOS. 55 | alias unlock="sudo chflags nouchg" 56 | 57 | # Confirm machine is connected to Internet (Google). 58 | alias up="ping 8.8.8.8" 59 | 60 | # Prefer Neovim over Vim. 61 | alias vim="nvim" 62 | 63 | # Print current IP address. 64 | alias whatismyip="dig +short myip.opendns.com @resolver1.opendns.com" 65 | -------------------------------------------------------------------------------- /symlinks/sh/.hushlogin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/msanders/setup/a76a3a33b9cfda78242bd2aeda9086fdf82a0ce1/symlinks/sh/.hushlogin -------------------------------------------------------------------------------- /symlinks/sh/.inputrc: -------------------------------------------------------------------------------- 1 | "": history-search-backward 2 | "": history-search-forward 3 | " ": menu-complete 4 | "": reverse-menu-complete 5 | -------------------------------------------------------------------------------- /symlinks/sh/.shellcheckrc: -------------------------------------------------------------------------------- 1 | source-path=SCRIPTDIR 2 | -------------------------------------------------------------------------------- /symlinks/tags/.ctags: -------------------------------------------------------------------------------- 1 | --exclude=.git 2 | --exclude=*.xcodeproj 3 | --exclude=*.xcplayground 4 | --exclude=*.xcworkspace 5 | --tag-relative 6 | 7 | --langdef=objc 8 | --langmap=objc:.m..mm..h 9 | --regex-objc=/\@interface[[:space:]]+([[:alnum:]_]+)/\1/i,interface/ 10 | --regex-objc=/\@implementation[[:space:]]+([[:alnum:]_]+)/\1/I,implementation/ 11 | --regex-objc=/\@protocol[[:space:]]+([[:alnum:]_]+)/\1/P,protocol/ 12 | --regex-objc=/\@property[[:space:]]+\([[:alnum:],[:space:]]+\)[[:space:]]+[[:alnum:]_]+[[:space:]]+\*?([[:alnum:]_]+)/\1/p,property/ 13 | --regex-objc=/([-+])[[:space:]]*\([[:alpha:]_][^)]*\)[[:space:]]*([[:alpha:]_:][^;{]+).*/\1\2/M,method definition/ 14 | --regex-objc=/^[^#@[:space:]][^=]*[[:space:]]([[:alpha:]_][[:alnum:]_]*)[[:space:]]*=/\1/c,constant/ 15 | --regex-objc=/^[[:space:]]*typedef[[:space:]][^;]+[[:space:]]([[:alpha:]_][[:alnum:]]*)[[:space:]]*;/\1/t,typedef/ 16 | --regex-objc=/^[[:space:]]*NS_ENUM\([[:alnum:]]+[[:space:]]*,[[:space:]]([[:alnum:]]+)\)/\1/e,enum/ 17 | --regex-objc=/^#pragma[[:space:]]+mark[[:space:]]+-?[[:space:]]+([[:alnum:][:space:]]+)/\1/g,pragma/ 18 | 19 | --langdef=swift 20 | --langmap=swift:.swift 21 | --regex-swift=/[[:<:]]class[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/c,class/ 22 | --regex-swift=/[[:<:]]enum[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/e,enum/ 23 | --regex-swift=/[[:<:]]func[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/f,function/ 24 | --regex-swift=/[[:<:]]protocol[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/P,protocol/ 25 | --regex-swift=/[[:<:]]struct[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/s,struct/ 26 | --regex-swift=/[[:<:]]typealias[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/t,typealias/ 27 | -------------------------------------------------------------------------------- /symlinks/tags/.globalrc: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2010, 2011, 2013, 3 | # 2015, 2016, 2017 4 | # Tama Communications Corporation 5 | # 6 | # This file is part of GNU GLOBAL. 7 | # 8 | # This file is free software; as a special exception the author gives 9 | # unlimited permission to copy and/or distribute it, with or without 10 | # modifications, as long as this notice is preserved. 11 | # 12 | # This program is distributed in the hope that it will be useful, but 13 | # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the 14 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 15 | # 16 | # * 17 | # Configuration file for GNU GLOBAL source code tagging system. 18 | # 19 | # Basically, GLOBAL doesn't need this configuration file ('gtags.conf'), 20 | # because it has default values in itself. If you have this file as 21 | # '/etc/gtags.conf' or "$HOME/.globalrc" then GLOBAL overwrite the default 22 | # values with values in the file. 23 | # Configuration file is also necessary to use plug-in parsers. 24 | # 25 | # The format is similar to termcap(5). You can specify a target with 26 | # GTAGSLABEL environment variable. Default target is 'default'. 27 | # 28 | # If you want to have default values for yourself, it is recommended to 29 | # use the following method: 30 | # 31 | # default:\ 32 | # :tc=default@~/.globalrc:\ <= includes default values from ~/.globalrc. 33 | # :tc=native: 34 | # 35 | # Please refer to gtags.conf(5) for details. 36 | # 37 | 38 | default:\ 39 | :tc=default@/usr/local/etc/gtags.conf: 40 | ctags:\ 41 | :tc=ctags@/usr/local/etc/gtags.conf: 42 | new-ctags:\ 43 | :tc=new-ctags@/usr/local/etc/gtags.conf: 44 | pygments:\ 45 | :tc=pygments@/usr/local/etc/gtags.conf:\ 46 | :tc=user-custom-pygments-parser: 47 | 48 | user-custom-pygments-parser|Pygments plug-in parser:\ 49 | :tc=common@/usr/local/etc/gtags.conf:\ 50 | :langmap=Swift\:.swift:\ 51 | :gtags_parser=Swift\:$pygmentslib:\ 52 | :pygmentslib=$libdir/gtags/pygments-parser.la: 53 | :skip=*.xcodeproj,*.xcplayground,*.xcworkspace: 54 | -------------------------------------------------------------------------------- /symlinks/tmux/.config/tmux/sh/smart-kill-pane: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Smart confirm-before kill-pane command. Only asks for confirmation when 4 | # killing a child process. 5 | # 6 | # See: 7 | # https://posts.mksanders.org/simulating-macos-terminal-bindings-in-alacritty 8 | set -o errexit -o nounset 9 | 10 | tmux_run() ( 11 | pane_pid="$(tmux list-panes -F "#{pane_active}:#{pane_pid}" | 12 | grep '^1:' | 13 | cut -c 3-)" 14 | escaped_cmd="$(echo "$*" | sed 's/;/\\\;/g')" 15 | if pgrep -P "$pane_pid" >/dev/null; then 16 | tmux confirm-before -p "kill-pane #P? (y/n)" "run 'tmux $escaped_cmd'" 17 | else 18 | tmux "$@" 19 | fi 20 | ) 21 | 22 | main() ( 23 | window_list="$(tmux list-windows -F '#{window_active}:#{window_panes}')" 24 | window_count="$(tmux display-message -p '#{session_windows}')" 25 | pane_count="$(echo "$window_list" | 26 | grep '^1:' | 27 | cut -c 3-)" 28 | 29 | # Mimic Terminal.app's behavior of always moving one tab to the right 30 | # unless at the end. 31 | if [ ! "$pane_count" = 1 ] || [ "$window_count" = 1 ]; then 32 | tmux_run kill-pane 33 | elif [ "$(echo "$window_list" | tail -n1 | cut -c1)" = 1 ]; then 34 | tmux_run previous-window\; next-window\; kill-pane 35 | else 36 | tmux_run next-window\; previous-window\; kill-pane 37 | fi 38 | ) 39 | 40 | main 41 | -------------------------------------------------------------------------------- /symlinks/tmux/.config/tmux/tmux.conf: -------------------------------------------------------------------------------- 1 | # Prefer C-a binding over C-b. 2 | set-option -g prefix C-a 3 | 4 | # Allow use of native C-a via C-a a. 5 | bind-key a send-prefix 6 | 7 | # Use fish as interactive shell. 8 | set-option -g default-command "/usr/local/bin/fish" 9 | set-option -g default-shell "/bin/sh" 10 | 11 | # Decrease escape timeout. 12 | # 13 | # See: 14 | # https://github.com/neovim/neovim/wiki/FAQ#esc-in-tmux-or-gnu-screen-is-delayed 15 | set -sg escape-time 10 16 | 17 | # Set correct $TERM value. 18 | # NB: tmux-256color is not included in terminfo on macOS by default, so 19 | # screen-256color is used instead. 20 | # 21 | # See: 22 | # https://github.com/neovim/neovim/wiki/FAQ#colors-arent-displayed-correctly 23 | set -g default-terminal "screen-256color" 24 | 25 | # Set RGB compatibility per advice given by Neovim's `:checkhealth` command. 26 | set -sa terminal-overrides ',xterm-256color:RGB' 27 | 28 | # Pass through window titles to terminal. 29 | set -g set-titles on 30 | set -g set-titles-string '#W' 31 | 32 | # Start numbering at 1 and automatically name. 33 | set -g allow-rename off 34 | set -g base-index 1 35 | set -g renumber-windows on 36 | setw -g automatic-rename on 37 | 38 | # Enable mouse support. 39 | set -g mouse on 40 | 41 | # Enable vi mode. 42 | set-window-option -g mode-keys vi 43 | 44 | # Add support for selecting & copying in vi mode. 45 | bind-key -T copy-mode-vi 'v' send -X begin-selection 46 | bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel 47 | 48 | # Spacemacs-flavored bindings for splits & windows. 49 | bind-key / split-window -h 50 | bind-key s split-window -v 51 | bind-key h select-pane -L 52 | bind-key j select-pane -D 53 | bind-key k select-pane -U 54 | bind-key l select-pane -R 55 | bind-key d run-shell "~/.config/tmux/sh/smart-kill-pane" 56 | 57 | # Use C-a o to jump panes. 58 | bind-key o display-panes 59 | 60 | # Use C-a z to suspend 61 | bind-key z detach 62 | 63 | # Use C-a ` to switch to last active window. 64 | bind-key ` last-window 65 | 66 | # 67 | # Fix mouse selection behavior. Taken from 68 | # https://github.com/tmux/tmux/issues/140#issuecomment-474341833. 69 | # 70 | 71 | # Disable clearing selection on mouse up. 72 | unbind-key -T copy-mode-vi MouseDragEnd1Pane 73 | 74 | # Clicking again clears selection. 75 | bind-key -T copy-mode-vi MouseDown1Pane select-pane\; send-keys -X clear-selection 76 | 77 | # Scrolling clears collection. 78 | bind -n MouseDrag1Pane if -Ft= '#{mouse_any_flag}' \ 79 | 'if -Ft= \"#{pane_in_mode}\" \"copy-mode -eM\" \ 80 | \"send-keys -M\"' \ 81 | 'copy-mode -eM' 82 | 83 | set -g status-justify left 84 | set -g status-interval 2 85 | set -g status-position bottom 86 | set -g status-style bg=black 87 | set -g status-left '#{prefix_highlight}' 88 | set -g status-right "" 89 | 90 | setw -g window-status-format ' #T – #W ' 91 | setw -g window-status-current-format ' #T – #W ' 92 | setw -g window-status-current-style fg=white,bold,bg=colour63 93 | setw -g window-status-style fg=colour63,bg=black,bold 94 | setw -g window-status-bell-style bold,fg=colour255,bg=colour1 95 | 96 | set -g pane-border-style fg=black,bg=colour235 97 | set -g pane-active-border-style bg=colour236,fg=colour51 98 | 99 | # Required workaround when launching tmux via -f option. 100 | # See https://github.com/tmux-plugins/tpm/blob/master/docs/tpm_not_working.md 101 | set -g @tpm_plugins ' \ 102 | tmux-plugins/tpm \ 103 | tmux-plugins/tmux-open \ 104 | tmux-plugins/tmux-pain-control \ 105 | tmux-plugins/tmux-prefix-highlight \ 106 | tmux-plugins/tmux-sensible \ 107 | tmux-plugins/tmux-sessionist \ 108 | laktak/extrakto \ 109 | ' 110 | 111 | run -b '~/.config/tmux/plugins/tpm/tpm' 112 | -------------------------------------------------------------------------------- /symlinks/vim/.config/nvim/init.vim: -------------------------------------------------------------------------------- 1 | set runtimepath^=~/.vim runtimepath+=~/.vim/after 2 | let &packpath=&runtimepath 3 | source ~/.vimrc 4 | -------------------------------------------------------------------------------- /symlinks/vim/.vimrc: -------------------------------------------------------------------------------- 1 | " # 2 | " # A minimal .vimrc with saner defaults and some basic Spacemacs bindings. 3 | " # 4 | 5 | " Vim plugins expect a POSIX-compliant shell. 6 | set shell=/bin/sh 7 | 8 | " Disable netrw. 9 | let g:loaded_netrwPlugin = 1 10 | let g:loaded_netrw = 1 11 | 12 | " Workaround for slow performance when loading Python files in Neovim. 13 | if has('mac') 14 | let g:python_host_prog='/usr/bin/python' 15 | let g:python3_host_prog='/Applications/Xcode.app/Contents/Developer/usr/bin/python3' 16 | end 17 | 18 | call plug#begin() 19 | 20 | " ## 21 | " ## Languages 22 | " ## 23 | Plug 'ElmCast/elm-vim' 24 | Plug 'dag/vim-fish' 25 | Plug 'editorconfig/editorconfig-vim' 26 | Plug 'keith/swift.vim' 27 | Plug 'leafgarland/typescript-vim' 28 | Plug 'rust-lang/rust.vim' 29 | Plug 'vim-syntastic/syntastic' 30 | 31 | " ### Spacemacs 32 | Plug 'jimmay5469/vim-spacemacs' 33 | Plug 'szw/vim-maximizer' 34 | Plug 'thirtythreeforty/lessspace.vim' 35 | Plug 'easymotion/vim-easymotion' 36 | 37 | " ### Theme 38 | Plug 'jnurmine/Zenburn' 39 | 40 | " ### tpope 41 | Plug 'tpope/vim-commentary' 42 | Plug 'tpope/vim-fugitive' 43 | Plug 'tpope/vim-repeat' 44 | Plug 'tpope/vim-rsi' 45 | Plug 'tpope/vim-sensible' 46 | Plug 'tpope/vim-surround' 47 | Plug 'tpope/vim-unimpaired' 48 | 49 | call plug#end() 50 | 51 | " ## 52 | " ## Options 53 | " ## 54 | 55 | " ## Autocompletion 56 | set wildignore+=*.o,*.obj,*.pyc,*.DS_Store,*.db,*.git 57 | set wildmode=longest,list 58 | 59 | if exists('+wildignorecase') 60 | set wildignorecase 61 | endif 62 | 63 | " ### Backup 64 | set noswapfile 65 | set nobackup 66 | set undofile 67 | 68 | if has('nvim') 69 | " Turn on live search & replace. 70 | set inccommand=nosplit 71 | else 72 | " Neovim has a better default undo directory, so prefer that. 73 | if exists('$XDG_DATA_DIR') 74 | set undodir=$XDG_DATA_DIR/vim/undo 75 | else 76 | set undodir=$HOME/.local/share/vim/undo 77 | endif 78 | if !isdirectory(&undodir) 79 | call mkdir(&undodir, 'p') 80 | end 81 | end 82 | 83 | " ### Buffers 84 | set hidden 85 | 86 | " ### Display 87 | set cursorline 88 | set rulerformat=%l:%c 89 | set shortmess=aI 90 | set showcmd 91 | set titlestring=%f title 92 | 93 | " ### Editing 94 | set mouse=a 95 | set nofoldenable 96 | set pastetoggle= 97 | 98 | " Expand tabs to 4 spaces by default. 99 | set expandtab 100 | set shiftwidth=4 101 | set softtabstop=4 102 | set tabstop=4 103 | 104 | " Default text wrap / column indicator. 105 | set textwidth=79 106 | set colorcolumn=80 107 | 108 | " Automatically use system keyboard. 109 | if has('clipboard') 110 | set clipboard^=unnamed,unnamedplus 111 | endif 112 | 113 | " ### Search 114 | set gdefault 115 | set hlsearch 116 | set ignorecase 117 | set smartcase 118 | 119 | " ### Syntax 120 | silent! colorscheme zenburn 121 | 122 | " Increase contrast. 123 | highlight Normal ctermbg=235 124 | highlight ColorColumn ctermbg=238 125 | highlight CursorLine cterm=none ctermbg=238 126 | highlight Visual cterm=none ctermbg=241 127 | highlight VisualNOC cterm=none ctermbg=241 128 | 129 | " ### Plugin Options 130 | 131 | " Disable default EasyMotion mappings. 132 | let g:EasyMotion_do_mapping = 0 133 | 134 | " Narrow down supported Spacemacs plugins. 135 | let g:spacemacs#plugins = [ 136 | \ 'easymotion/vim-easymotion', 137 | \ 'szw/vim-maximizer', 138 | \ 'tpope/vim-commentary', 139 | \ 'tpope/vim-fugitive', 140 | \ ] 141 | 142 | " Syntastic is quite slow for Rust, so turn it off. 143 | let g:syntastic_rust_checkers = [] 144 | 145 | " ## 146 | " ## Macros 147 | " ## 148 | 149 | " Typos. 150 | iabbrev !+ != 151 | iabbrev ~? ~/ 152 | 153 | " Escape with fd. 154 | cnoremap fd 155 | inoremap fd 156 | vnoremap fd 157 | 158 | " Enter cmdline mode with ; 159 | noremap ; : 160 | noremap \ ; 161 | 162 | " Paste yanked (as opposed to recently deleted) text. 163 | noremap gp "0p 164 | noremap gP "0P 165 | 166 | " Make Y to y as D is to d and C is to c. 167 | nmap Y y$ 168 | 169 | let mapleader = "\" 170 | 171 | " Navigate within wrapped lines by default. 172 | nnoremap j gj 173 | nnoremap k gk 174 | 175 | let g:EasyMotion_do_mapping = 0 " Disable default mappings 176 | 177 | " Shortcut for switching to/from header files. 178 | function! s:AlternateFile(...) 179 | for extension in a:000 180 | let path = printf('%s.%s', expand('%:p:r'), extension) 181 | if filereadable(path) || bufexists(path) 182 | execute 'e'.fnameescape(path) 183 | return 184 | endif 185 | endfor 186 | 187 | echohl ErrorMsg 188 | let ext = (a:0 > 1) ? printf('{%s}', join(a:000, ',')) : a:1 189 | echo printf('%s.%s not found.', expand('%:p:r'), ext) 190 | echohl None 191 | endfunction 192 | 193 | " Bail out when editing a directory. 194 | function! s:DirectoryBailout() 195 | for file in argv() 196 | if isdirectory(file) 197 | try 198 | " Vim automatically warns about the directory before this is 199 | " invoked, so just prompt to exit. 200 | redraw 201 | call confirm('Exit?', '&OK') 202 | finally 203 | " CTRL-C interrupts are caught via try/finally block. 204 | exit 1 205 | endtry 206 | endif 207 | endfor 208 | endfunction 209 | 210 | " Shortcut for mimicking from Emacs. 211 | function! s:KillLine() 212 | let text = getline(line('.')) 213 | let before = (col('.') > 1) ? text[: col('.') - 2] : '' 214 | let after = text[col('.') - 1 :] 215 | if len(after) == 0 216 | normal! J 217 | else 218 | call setline(line('.'), before) 219 | endif 220 | return '' 221 | endfunction 222 | 223 | " * and ## should search for selected text when used in visual mode. 224 | function! s:VisualSearch() 225 | let old = @" 226 | normal! gvy 227 | let @/ = '\V'.substitute(escape(@", '\'), '\n', '\\n', 'g') 228 | let @" = old 229 | endfunction 230 | 231 | " Map * and # in visual mode. 232 | xnoremap * :callVisualSearch()/ 233 | xnoremap # :callVisualSearch()? 234 | 235 | " Use +/- for incrementing/decrementing numbers. 236 | noremap + 237 | noremap - 238 | 239 | " ### Emacs bindings 240 | cnoremap 241 | cnoremap estrpart(getcmdline(), 0, getcmdpos()-1) 242 | inoremap :callKillLine() 243 | inoremap pumvisible() ? '' : 'j' 244 | inoremap pumvisible() ? '' : 'k' 245 | nnoremap : 246 | nnoremap ff :lcd %:p:h:e 247 | noremap 248 | noremap 249 | 250 | " Doom 251 | nnoremap bl 252 | nnoremap ` 253 | 254 | " ### Visual mode 255 | xnoremap v 256 | xmap s S 257 | 258 | " ## 259 | " ## Autocommands 260 | " ## 261 | augroup rccommands 262 | autocmd! 263 | 264 | autocmd BufRead,BufNewFile *.h nnoremap fa :callAlternateFile('c', 'm', 'cpp', 'cc') 265 | autocmd BufRead,BufNewFile *.h,*.m set filetype=objc 266 | autocmd BufRead,BufNewFile *.{c,m,mm,cpp,cc} nnoremap fa :callAlternateFile('h') 267 | autocmd BufRead,BufNewFile Brewfile,Brewfile.* setlocal filetype=ruby 268 | autocmd FileType fish,javascript,rust,swift,typescript setlocal textwidth=100 colorcolumn=101 269 | autocmd FileType gitconfig,make setlocal noexpandtab 270 | autocmd FileType html setlocal textwidth=0 271 | autocmd FileType ruby,yaml setlocal tabstop=2 shiftwidth=2 272 | autocmd VimEnter * call s:DirectoryBailout() 273 | 274 | augroup END 275 | -------------------------------------------------------------------------------- /symlinks/zsh/.zshrc: -------------------------------------------------------------------------------- 1 | # Load aliases. 2 | if [ -f "$HOME/.aliases" ]; then 3 | source "$HOME/.aliases" 4 | fi 5 | 6 | # Colors 7 | export CLICOLOR=1 8 | 9 | # Prompt 10 | PS1="%n:%1~ $ " 11 | 12 | # History 13 | HISTFILE="$HOME/.zsh_history" 14 | HISTSIZE=1024 15 | SAVEHIST=1024 16 | HISTTIMEFORMAT="%F %T " 17 | 18 | # Don't log commands beginning with a space. 19 | setopt HIST_IGNORE_SPACE 20 | 21 | # Ignore duplicates in history. 22 | setopt HIST_SAVE_NO_DUPS 23 | 24 | # Append to history on shell exit rather than overwrite. 25 | setopt APPENDHISTORY 26 | 27 | # Store history immediately rather than at end of session. 28 | setopt INC_APPEND_HISTORY 29 | 30 | # Allow comments like this in shell. 31 | setopt INTERACTIVECOMMENTS 32 | 33 | # Don't beep when auto-completing. 34 | unsetopt LIST_BEEP 35 | 36 | # Search history using C-p and C-n. 37 | bindkey "" history-beginning-search-backward 38 | bindkey "" history-beginning-search-forward 39 | --------------------------------------------------------------------------------