Repository: mhinz/dotfiles Branch: master Commit: 4f868c1f9c00 Files: 110 Total size: 225.9 KB Directory structure: gitextract_0vxcr2cu/ ├── .Xdefaults ├── .Xmodmap ├── .bash_profile ├── .bashrc ├── .config/ │ ├── git/ │ │ ├── config │ │ ├── config.colors.dark │ │ ├── config.colors.light │ │ └── template/ │ │ └── hooks/ │ │ ├── post-applypatch │ │ ├── post-checkout │ │ ├── post-commit │ │ ├── post-merge │ │ ├── post-rewrite │ │ └── pre-commit │ ├── karabiner/ │ │ └── assets/ │ │ └── complex_modifications/ │ │ ├── any.json │ │ └── keychron-k6.json │ └── rg/ │ └── rgrc ├── .ctags ├── .emacs.d/ │ ├── configs/ │ │ ├── erlang.el │ │ └── haskell.el │ └── init.el ├── .gemrc ├── .gitignore ├── .gnupg/ │ ├── gpg-agent.conf │ └── gpg.conf ├── .hgrc ├── .iex.exs ├── .inputrc ├── .irbrc ├── .lldbinit ├── .macos ├── .misc/ │ ├── YellowLight.itermcolors │ └── neovim-local.mk ├── .profile ├── .pryrc ├── .psqlrc ├── .pypirc ├── .rtorrent.rc ├── .shrc ├── .tmux.conf ├── .travis.yml ├── .vim/ │ ├── autoload/ │ │ └── mhi.vim │ ├── colors/ │ │ └── fnord.vim │ ├── lua/ │ │ └── config.lua │ └── vimrc ├── .weechat/ │ └── weechat.conf ├── .xinitrc ├── .yarnrc ├── .zsh/ │ ├── .zlogout │ ├── .zprofile │ ├── .zshrc │ ├── completion/ │ │ └── _mix │ ├── dircolors.dark │ └── dircolors.light ├── .zshenv ├── README.md ├── bin/ │ ├── battery │ ├── book │ ├── book.erl │ ├── book.go │ ├── bootstrap-homebrew │ ├── bootstrap-host │ ├── bootstrap-ruby │ ├── bootstrap-vim │ ├── build-angband │ ├── build-elixir │ ├── build-erlang │ ├── build-git │ ├── build-go │ ├── build-htop │ ├── build-tmux │ ├── build-vim │ ├── build-zsh │ ├── busy │ ├── c_rocks │ ├── dotfiles │ ├── ec │ ├── english │ ├── english-notification │ ├── fix-term │ ├── gem-info │ ├── git-ctags │ ├── git-neck │ ├── git-standup │ ├── git-to │ ├── git-trail │ ├── git-whereami │ ├── itb │ ├── man │ ├── markov │ ├── mhi │ ├── mhi-fix │ ├── mhi-net │ ├── numsys │ ├── s3cp │ ├── s3ls │ ├── s3rm │ ├── s3screenshot │ ├── shell_function_missing │ ├── svn-clean │ ├── svn-stats │ ├── task │ ├── tips │ ├── twump │ ├── unbook │ ├── unixsniff │ ├── vm │ ├── weasel │ ├── wlan │ └── zproc └── english.yaml ================================================ FILE CONTENTS ================================================ ================================================ FILE: .Xdefaults ================================================ !!! MISC !!! Xcursor.theme: redglass Xcursor.size: 28 Eclipse*fontList: -*-terminus-*-*-*-*-*-*-*-*-*-*-*-* gitk*font: -*-terminus-medium-*-*-*-12-*-*-*-*-*-*-* xpdf*background: #eeeeec xpdf*fontList: -*-terminus-medium-*-*-*-12-*-*-*-*-*-*-* xpdf*foreground: #2e3436 xpdf*initialZoom: width xpdf*shadowThickness: 1 urxvt*foreground: #bebebe urxvt*background: #202020 !urxvt*background: #412e21 urxvt*boldMode: false urxvt*meta8: false !urxvt*letterSpace: +1 !urxvt*font: xft:Inconsolata:pixelsize=12:dpi=96 !urxvt*font: -xos4-terminus-medium-r-normal--14-*-*-*-*-*-iso10646-* urxvt*font: xft:DejaVu Sans Mono:pixelsize=12 !urxvt*font: xft:Ubuntu Mono:style=Regular:pixelsize=14 !urxvt*font: xft:Droid Sans Mono:style=Regular:pixelsize=13 !!! URXVT !!! urxvt*cursorColor: #ffaa77 urxvt*matcher.button: 1 urxvt*matcher.pattern.1: \\bwww\\.[\\w-]+\\.[\\w./?&@#-=]*[\\w/-] urxvt*matcher.pattern.2: \\bhttps?:\/\/[\\w-.]*\/[\\w./?&@#-=]*.(jpg|jpeg|png) urxvt*matcher.launcher.2: feh $0 urxvt*perl-lib: .urxvt urxvt*perl-ext-common: default,matcher,font-size urxvt*urlLauncher: firefox urxvt*pointerColor: yellow urxvt*saveLines: 10000 urxvt*scrollBar: false urxvt*termName: rxvt-256color urxvt*tripleclickwords: true urxvt*underlineColor: #CC6666 urxvt.keysym.C-Up: perl:font-size:increase urxvt.keysym.C-Down: perl:font-size:decrease !urxvt*fading: 20 !urxvt*shading: 5 !urxvt*transparent: true ! black urxvt*color0: #000000 urxvt*color8: #505050 ! red urxvt*color1: #ff669d urxvt*color9: #d04c63 ! green urxvt*color2: #B3D38C urxvt*color10: #93D6A9 ! yellow urxvt*color3: #efaf7f urxvt*color11: #f4a45f ! blue urxvt*color4: #344863 urxvt*color12: #80c0d9 ! magenta urxvt*color5: #CCA3B3 urxvt*color13: #AA66AA ! cyan urxvt*color6: #0b94a0 urxvt*color14: #96cccc ! white urxvt*color7: white urxvt*color15: darkgray ! black urxvt2*color0: #000000 urxvt2*color8: #505050 ! red urxvt2*color1: #ff669d urxvt2*color9: #d04c63 ! green urxvt2*color2: #B3D38C urxvt2*color10: #93D6A9 ! yellow urxvt2*color3: #efaf7f urxvt2*color11: #f4a45f ! blue urxvt2*color4: #344863 urxvt2*color12: #80c0d9 ! magenta urxvt2*color5: #CCA3B3 urxvt2*color13: #AA66AA ! cyan urxvt2*color6: #0b94a0 urxvt2*color14: #96cccc ! white urxvt2*color7: white urxvt2*color15: darkgray ! Pnevma 2 !urxvt*color0: #2F2E2D !urxvt*color8: #4A4845 !urxvt*color1: #A36666 !urxvt*color9: #D78787 !urxvt*color2: #8FA57E !urxvt*color10: #A9BA9C !urxvt*color3: #D7AF87 !urxvt*color11: #E4C9AF !urxvt*color4: #7FA5BD !urxvt*color12: #A1BDCE !urxvt*color5: #C79EC4 !urxvt*color13: #D7BEDA !urxvt*color6: #8ADBB4 !urxvt*color14: #B1E7DD !urxvt*color7: #D0D0D0 !urxvt*color15: #EFEFEF !urxvt2*font: -xos4-terminus-medium-r-normal--18-140-72-72-c-80-iso10646-1 !urxvt2*font: -*-terminus-medium-r-*-*-24-*-*-*-*-*-*-* urxvt2*foreground: #222 !urxvt2*background: #f5f5f0 urxvt2*background: #ccc !urxvt2*font: xft:DejaVu Sans Mono:pixelsize=16:style=bold urxvt2*font: xft:DejaVu Sans Mono:pixelsize=12 !urxvt2*font: xft:DejaVu Sans Mono:pixelsize=16 !urxvt2*foreground: #000 !urxvt2*background: #eee !urxvt2*cursorColor: #000 urxvt2*cursorColor: #2069ff urxvt2*boldMode: true urxvt2*matcher.button: 1 urxvt2*matcher.launcher.2: feh $0 urxvt2*matcher.pattern.1: \\bwww\\.[\\w-]+\\.[\\w./?&@#-]*[\\w/-] urxvt2*matcher.pattern.2: \\bhttps?:\/\/[\\w-.]*\/[\\w./?&@#=-]*.(jpg|jpeg|png) urxvt2*perl-ext-common: default,matcher urxvt2*pointerColor: yellow urxvt2*saveLines: 10000 urxvt2*scrollBar: false urxvt2*termName: rxvt-256color urxvt2*tripleclickwords: true urxvt2*underlineColor: #CC6666 urxvt2*urlLauncher: iceweasel !!! XTERM !!! xterm*allowWindowOps: true !xterm*background: #eee xterm*boldMode: true xterm*colorMode: true xterm*cursorColor: #f77 xterm*dynamicColors: true xterm*eightBitInput: false !xterm*faceName: DejaVu Sans Mono:pixelsize=12:style=bold !xterm*foreground: #000 xterm*printAtrributes: 2 xterm*utf8: true xterm*foreground: #bebebe xterm*background: #202020 xft*dpi: 96 xft*antialias: true xft*rgba: rgb xft*hinting: true !black !*color0: #1B1D1E !*color8: #505354 !*color0: #262729 !*color8: #554444 !red !*color1: #F92672 !*color9: #FF669D !green !*color2: #A6E22E !*color10: #BEED5F !yellow !*color3: #FD971F !*color11: #E6DB74 !blue !*color4: #66D9EF !*color12: #66D9EF !magenta !*color5: #9E6FFE !*color13: #9E6FFE !cyan !*color6: #5E7175 !*color14: #A3BABF !white !*color7: #CCCCC6 !*color15: #F8F8F2 ================================================ FILE: .Xmodmap ================================================ remove Lock = Caps_Lock keysym Caps_Lock = Control_L add Control = Control_L keycode 94 = parenleft parenright bar brokenbar bar brokenbar keycode 92 = Multi_key ================================================ FILE: .bash_profile ================================================ if [[ -r ~/.profile ]]; then . $HOME/.profile else echo 'No ~/.profile found.' fi # bashrc doesn't get sourced for login shells; do it here. if [[ $- == *i* ]]; then if [[ -r ~/.bashrc ]]; then . $HOME/.bashrc else echo 'No ~/.bashrc found.' fi fi ================================================ FILE: .bashrc ================================================ if [[ -r $HOME/.shrc ]]; then . $HOME/.shrc else echo 'No .shrc found.' fi shopt -s globstar stty werase undef bind '\C-w:unix-filename-rubout' PROMPT_COMMAND=_prompt [[ -n $KITTY_WINDOW_ID ]] && trap 'printf "\033]0;%s\007" "${BASH_COMMAND/_prompt/bash}"' DEBUG ================================================ FILE: .config/git/config ================================================ ; Config {{{1 [user] name = Marco Hinz email = mh.codebro@gmail.com signingKey = D56EA60F557FD8B6 [core] editor = nvr --remote-wait-silent excludesfile = ~/.config/git/ignore autocrlf = false filemode = false [init] templatedir = ~/.config/git/template defaultBranch = main [commit] gpgsign = true [fetch] prune = true writeCommitGraph = true [pull] ff = only [push] default = current followTags = true [rebase] autosquash = true autostash = true [tag] sort = version:refname [rerere] enabled = true [advice] detachedHead = no statusHints = no [pack] writeReverseIndex = true [diff] tool = nvr algorithm = patience mnemonicPrefix = true compactionHeuristic = true [difftool "nvr"] cmd = nvr -sd $LOCAL $REMOTE [merge] tool = nvr conflictstyle = diff3 [mergetool] keepBackup = false [mergetool "nvr"] cmd = nvr -sd $LOCAL $BASE $REMOTE $MERGED -c 'winc J | winc =' trustExitCode = true ; Aliases {{{1 [alias] a = add b = branch bi = bisect bl = blame c = commit ca = commit --amend caa = commit --amend --no-edit cf = commit --fixup cl = clone co = checkout codate = "!f() { git checkout `git rev-list -n1 --before \"$@\" HEAD`; }; f" cp = cherry-pick d = diff --color --no-ext-diff dc = !git d --cached dcs = !git d --cached --stat des = describe --contains ds = !git d --stat dt = difftool dw = !git d --word-diff=color f = fetch g = grep h = help lfp = !git l --first-parent ln = !git l @{1}.. ls = "!f() { git ls-files | grep "${@:-''}"; }; f" lso = ls-files --others --exclude-standard lsr = ls-remote m = merge ma = merge --abort mt = mergetool n = name-rev --name-only p = push pl = pull --ff-only plr = pull --rebase origin master r = reset ra = rebase --abort rc = rebase --continue re = rebase rem = remote ri = rebase -i --keep-empty rs = rebase --skip ru = remote update s = status --short --branch --untracked-files=no sh = show shs = show --stat st = stash stl = stash list sts = stash show -p t = tag tr = trail unmerged = branch --no-merged master wt = worktree rehook = "!f() { cd \"$(git rev-parse --show-toplevel)\"; rm -r .git/hooks; git init; }; f" description = !git config --get "branch.$(git rev-parse --abbrev-ref HEAD).description" snapshot = !git stash push "snapshot: $(date)" && git stash apply "stash@{0}" ours = !git checkout --ours $@ && git add $@ theirs = !git checkout --theirs $@ && git add $@ rank = shortlog -sn --no-merges authors = "!f() { git log --no-merges --pretty='format:%<(26)%an <%ae>' --author \"$*\" | sort | uniq; }; f" by = "!f() { IFS=$'\n'; select a in `git authors \"$*\"`; do git l --no-merges --author \"${a%% *<*}\"; break; done; }; f" upstream = !git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD) upstream-remote = !git upstream | sed -e 's/\\/.*$//g' ; Colors {{{1 [color] branch = auto diff = auto interactive = auto status = auto ui = auto [include] path = config.colors ================================================ FILE: .config/git/config.colors.dark ================================================ [alias] l = log --graph --pretty='%C(242)%h %C(156)%s %C(248)%an%C(242), %C(248)%ar%C(222)%d' --decorate --date=relative [color "diff"] frag = 104 func = 74 meta = 137 bold new = 114 old = 167 plain = 240 whitespace = 24 24 [color "status"] header = 240 branch = yellow ================================================ FILE: .config/git/config.colors.light ================================================ [alias] l = log --graph --pretty='%C(245)%h %C(16)%s %C(reset)%C(ul 245)%an%C(reset), %C(248)%ar%C(124)%d' --decorate --date=relative [color "diff"] new = 28 old = 124 context = 248 commit = 16 bold frag = 16 func = 16 meta = 16 bold whitespace = 27 27 [color "status"] header = 240 branch = yellow ================================================ FILE: .config/git/template/hooks/post-applypatch ================================================ #!/usr/bin/env bash if [[ "$(uname -s)" = Darwin ]]; then osascript </dev/null & ================================================ FILE: .config/git/template/hooks/post-checkout ================================================ #!/usr/bin/env bash if [[ "$(uname -s)" = Darwin ]]; then osascript </dev/null & if [[ $1 != 0000000000000000000000000000000000000000 ]] \ && [[ $3 -eq 1 ]] \ && git diff --name-only $1 $2 | egrep -q '^Gemfile|\.gemspec$' \ && command -v bundle &>/dev/null then exec bundle fi ================================================ FILE: .config/git/template/hooks/post-commit ================================================ #!/usr/bin/env bash if [[ "$(uname -s)" = Darwin ]]; then osascript </dev/null & ================================================ FILE: .config/git/template/hooks/post-merge ================================================ #!/usr/bin/env bash if [[ "$(uname -s)" = Darwin ]]; then osascript </dev/null & ================================================ FILE: .config/git/template/hooks/post-rewrite ================================================ #!/usr/bin/env bash case "$1" in rebase) if [[ "$(uname -s)" = Darwin ]]; then osascript </dev/null & ;; esac ================================================ FILE: .config/git/template/hooks/pre-commit ================================================ #!/usr/bin/env bash if git rev-parse --verify HEAD &>/dev/null; then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi exec git diff-index --check --cached $against -- ================================================ FILE: .config/karabiner/assets/complex_modifications/any.json ================================================ { "title": "Any", "rules": [ { "manipulators": [ { "description": "(Any) caps_lock > left_control, caps_lock alone > escape", "from": { "key_code": "caps_lock" }, "to": [ { "key_code": "left_control", "lazy": true } ], "to_if_alone": [ { "key_code": "escape" } ], "type": "basic" } ] } ] } ================================================ FILE: .config/karabiner/assets/complex_modifications/keychron-k6.json ================================================ { "title": "Keychron K6", "rules": [ { "description": "(Keychron K6) left_shift alone > `", "manipulators": [ { "conditions": [ { "type": "device_if", "identifiers": [ { "product_id": 591, "vendor_id": 1452 } ] } ], "from": { "key_code": "left_shift" }, "to": [ { "key_code": "left_shift" } ], "to_if_alone": [ { "key_code": "grave_accent_and_tilde" } ], "type": "basic" } ] }, { "description": "(Keychron K6) right_shift alone > ~", "manipulators": [ { "conditions": [ { "type": "device_if", "identifiers": [ { "product_id": 591, "vendor_id": 1452 } ] } ], "from": { "key_code": "right_shift" }, "to": [ { "key_code": "right_shift" } ], "to_if_alone": [ { "key_code": "grave_accent_and_tilde", "modifiers": [ "left_shift" ] } ], "type": "basic" } ] } ] } ================================================ FILE: .config/rg/rgrc ================================================ --hidden --no-ignore --smart-case ================================================ FILE: .ctags ================================================ --regex-ruby=/(^|[:;])[ \t]*([A-Z][[:alnum:]_]+) *=/\2/c,class,constant/ --regex-ruby=/^[ \t]*attr_(reader|writer|accessor) (:[a-z0-9_]+, )*:([a-z0-9_]+)/\3/A,attr/ --langdef=elixir --langmap=elixir:.ex.exs --regex-elixir=/^[ \t]*def(p?)[ \t]+([a-z_][a-zA-Z0-9_?!]*)/\2/f,functions,functions (def ...)/ --regex-elixir=/^[ \t]*defcallback[ \t]+([a-z_][a-zA-Z0-9_?!]*)/\1/c,callbacks,callbacks (defcallback ...)/ --regex-elixir=/^[ \t]*defdelegate[ \t]+([a-z_][a-zA-Z0-9_?!]*)/\1/d,delegates,delegates (defdelegate ...)/ --regex-elixir=/^[ \t]*defexception[ \t]+([A-Z][a-zA-Z0-9_]*\.)*([A-Z][a-zA-Z0-9_?!]*)/\2/e,exceptions,exceptions (defexception ...)/ --regex-elixir=/^[ \t]*defimpl[ \t]+([A-Z][a-zA-Z0-9_]*\.)*([A-Z][a-zA-Z0-9_?!]*)/\2/i,implementations,implementations (defimpl ...)/ --regex-elixir=/^[ \t]*defmacro(p?)[ \t]+([a-z_][a-zA-Z0-9_?!]*)\(/\2/a,macros,macros (defmacro ...)/ --regex-elixir=/^[ \t]*defmacro(p?)[ \t]+([a-zA-Z0-9_?!]+)?[ \t]+([^ \tA-Za-z0-9_]+)[ \t]*[a-zA-Z0-9_!?!]/\3/o,operators,operators (e.g. "defmacro a <<< b")/ --regex-elixir=/^[ \t]*defmodule[ \t]+([A-Z][a-zA-Z0-9_]*\.)*([A-Z][a-zA-Z0-9_?!]*)/\2/m,modules,modules (defmodule ...)/ --regex-elixir=/^[ \t]*defprotocol[ \t]+([A-Z][a-zA-Z0-9_]*\.)*([A-Z][a-zA-Z0-9_?!]*)/\2/p,protocols,protocols (defprotocol...)/ --regex-elixir=/^[ \t]*Record\.defrecord[ \t]+:([a-zA-Z0-9_]+)/\1/r,records,records (defrecord...)/ ================================================ FILE: .emacs.d/configs/erlang.el ================================================ (setq erlang-root-dir "~/local/erlang/lib/erlang/erts-6.3.1") (setq exec-path (cons "~/local/erlang/lib/erlang/erts-6.3.1/bin" exec-path)) (require 'erlang-start) ================================================ FILE: .emacs.d/configs/haskell.el ================================================ (require 'haskell-mode-autoloads) (custom-set-variables '(haskell-process-auto-import-loaded-modules t) '(haskell-process-log t) '(haskell-process-suggest-remove-import-lines t) '(haskell-process-type (quote cabal-repl)) '(haskell-tags-on-save t)) (add-to-list 'Info-default-directory-list "~/.emacs.d/packages/haskell-mode") (eval-after-load 'haskell-mode '(progn (interactive-haskell-mode) (define-key haskell-mode-map [f8] 'haskell-navigate-imports) (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-or-reload) (define-key haskell-mode-map (kbd "C-c C-z") 'haskell-interactive-switch) (define-key haskell-mode-map (kbd "C-c C-n C-t") 'haskell-process-do-type) (define-key haskell-mode-map (kbd "C-c C-n C-i") 'haskell-process-do-info) (define-key haskell-mode-map (kbd "C-c C-n C-c") 'haskell-process-cabal-build) (define-key haskell-mode-map (kbd "C-c C-n c") 'haskell-process-cabal) (define-key haskell-mode-map (kbd "C-c SPC") 'haskell-mode-contextual-space))) (let ((my-cabal-path (expand-file-name "~/.cabal/bin"))) (setenv "PATH" (concat my-cabal-path ":" (getenv "PATH"))) (add-to-list 'exec-path my-cabal-path)) (eval-after-load 'haskell-cabal '(progn (define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build) (define-key haskell-cabal-mode-map (kbd "C-c c") 'haskell-process-cabal) (define-key haskell-cabal-mode-map (kbd "C-c C-k") 'haskell-interactive-mode-clear))) ;; (define-key haskell-cabal-mode-map (bkd "C-c C-z") 'haskell-interactive-switch))) ================================================ FILE: .emacs.d/init.el ================================================ (when (< emacs-major-version 24) (princ "Install at least Emacs 24.\n" #'external-debugging-output) (kill-emacs)) (when (member "Source Code Pro" (font-family-list)) (set-default-font "Source Code Pro-13")) (if (fboundp 'tool-bar-mode) (tool-bar-mode 0)) (if (fboundp 'toggle-scroll-bar) (toggle-scroll-bar 0)) (menu-bar-mode 0) (setq ring-bell-function 'ignore) (setq inhibit-splash-screen t) (setq inhibit-startup-message t) (setq custom-file "~/.emacs.d/custom.el") (require 'package) (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t) (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t) (package-initialize) (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) (eval-and-compile (defvar use-package-verbose t) (require 'cl) (require 'use-package) (require 'bind-key) (setq use-package-always-ensure t)) (defalias 'yes-or-no-p 'y-or-n-p) (setq backup-directory-alist `((".*" . ,temporary-file-directory))) (setq auto-save-file-name-transforms `((".*" ,temporary-file-directory t))) (let ((week (* 60 60 24 7)) (current (float-time (current-time)))) (dolist (file (directory-files temporary-file-directory t)) (when (and (backup-file-name-p file) (> (- current (float-time (fifth (file-attributes file)))) week)) (message "%s" file) (delete-file file)))) (delete-selection-mode +1) (setq-default tab-width 2) (setq-default indent-tabs-mode nil) (when (display-graphic-p) (use-package subatomic-theme) (toggle-frame-maximized)) (use-package ace-window :bind (("M-q" . ace-window))) (use-package git-gutter :config (global-git-gutter-mode 1)) (use-package avy :bind* ("C-," . avy-goto-char-2)) (use-package slime :init (setq inferior-lisp-program "sbcl") (setq slime-contribs '(slime-fancy))) (unless (and (fboundp 'server-running-p) (server-running-p)) (server-start)) (if (file-readable-p custom-file) (load custom-file)) ================================================ FILE: .gemrc ================================================ :update_sources: true :bulk_threshold: 1000 :verbose: true :benchmark: false :backtrace: false gem: --no-document ================================================ FILE: .gitignore ================================================ /*/ !/bin/ !.* /.git/ ================================================ FILE: .gnupg/gpg-agent.conf ================================================ pinentry-program /usr/local/bin/pinentry-mac default-cache-ttl 7200 ================================================ FILE: .gnupg/gpg.conf ================================================ personal-digest-preferences SHA256 cert-digest-algo SHA256 default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed keyid-format long keyserver hkps://hkps.pool.sks-keyservers.net keyserver-options no-honor-keyserver-url ================================================ FILE: .hgrc ================================================ [ui] username = Marco Hinz color = always [pager] pager = LESS='FRX' less [alias] a = add b = branch bi = bisect bm = bookmark c = commit cl = clone co = checkout d = diff g = grep h = help l = !hg log -G | LESS=FRX less m = merge p = push pl = pull r = revert rank = !hg churn -t '{author}' -c | less -FRX s = status u = update [extensions] color = pager = churn = [color] diff.trailingwhitespace = bold red_background ================================================ FILE: .iex.exs ================================================ IEx.configure [ colors: [ eval_info: [:yellow, :bright], eval_error: [:red], eval_interrupt: [:red], stack_info: [:blue], doc_code: [:blue], doc_inline_code: [:blue], doc_headings: [:red, :bright], ], width: 100, default_prompt: [ "\e[G", :blue, :bright, "%prefix(%counter)>", ] |> IO.ANSI.format |> IO.chardata_to_string ] defmodule Mex do defp expand_all(n, env) do Macro.prewalk(n, &Macro.expand(&1, env)) end defmacro mex(do: block) do block |> expand_all(__CALLER__) |> Macro.to_string |> IO.puts quote do: :ok end end ================================================ FILE: .inputrc ================================================ set show-all-if-ambiguous on Control-p: history-search-backward Control-k: history-search-backward Control-n: history-search-forward ================================================ FILE: .irbrc ================================================ begin require 'pry' Pry.start exit rescue LoadError require 'irb/completion' IRB.conf[:PROMPT_MODE] = :SIMPLE warn 'not installed: pry' end ================================================ FILE: .lldbinit ================================================ command alias ptype target modules lookup -t %1 command alias reload command source -s 1 ~/.lldbinit settings set target.x86-disassembly-flavor intel settings set frame-format "frame #${frame.index}: ${frame.pc}{ \x1b\x5b36m${module.file.basename}\x1b\x5b39m{` \x1b\x5b32m${function.name-with-args} \x1b\x5b39m${function.pc-offset}}}{ at \x1b\x5b31m${line.file.basename}\x1b\x5b0m ${line.number}}\n" ================================================ FILE: .macos ================================================ #!/usr/bin/env bash sudo -v # Cron {{{1 # This needs full disk access enabled for the calling terminal emulator. # E.g. Security & Privacy -> Full Disk Access -> iTerm.app # Reference: https://gitlab.com/gnachman/iterm2/wikis/fulldiskaccess if crontab -l 2>&1 | grep -qv english; then { crontab -l 2>/dev/null; echo "*/30 * * * * ~/bin/english-notification"; } | crontab - fi # Defaults {{{1 defaults write ApplePressAndHoldEnabled -bool true defaults write NSGlobalDomain InitialKeyRepeat -int 20 defaults write NSGlobalDomain KeyRepeat -int 1 defaults write NSRequiresAquaSystemAppearance -bool true defaults write com.apple.finder AppleShowAllFiles -boolean true defaults write com.google.Keystone.Agent checkInterval 172800 # Defaults (need disabled SIP) {{{1 if [[ "$(csrutil status)" =~ enabled ]]; then echo 'Disable System Integrity Protection (rootless mode):' echo ' * restart' echo ' * hold cmd+R to boot into Recovery System' echo ' * Utilities -> Terminal' echo ' * $ csrutil disable' echo ' * restart' else defaults write /System/Library/LaunchAgents/com.apple.mdworker.single LowPriorityBackgroundIO -int 1 defaults write /System/Library/LaunchAgents/com.apple.mdworker.shared LowPriorityBackgroundIO -int 1 fi # vim: et sts=2 sw=2 ================================================ FILE: .misc/YellowLight.itermcolors ================================================ Ansi 0 Color Alpha Component 1 Blue Component 0.0 Color Space sRGB Green Component 0.0 Red Component 0.0 Ansi 1 Color Alpha Component 1 Blue Component 0.0 Color Space sRGB Green Component 0.10676553100347519 Red Component 0.789775550365448 Ansi 10 Color Alpha Component 1 Blue Component 0.40609359741210938 Color Space sRGB Green Component 0.98006147146224976 Red Component 0.37424531579017639 Ansi 11 Color Alpha Component 1 Blue Component 0.40395939350128174 Color Space sRGB Green Component 0.98757272958755493 Red Component 0.99950331449508667 Ansi 12 Color Alpha Component 1 Blue Component 1 Color Space sRGB Green Component 0.44485551118850708 Red Component 0.40937519073486328 Ansi 13 Color Alpha Component 1 Blue Component 1 Color Space sRGB Green Component 0.46518981456756592 Red Component 1 Ansi 14 Color Alpha Component 1 Blue Component 1 Color Space sRGB Green Component 0.99263292551040649 Red Component 0.37597531080245972 Ansi 15 Color Alpha Component 1 Blue Component 1 Color Space sRGB Green Component 1 Red Component 0.99999600648880005 Ansi 2 Color Alpha Component 1 Blue Component 0.0 Color Space sRGB Green Component 0.76266151666641235 Red Component 0.0 Ansi 3 Color Alpha Component 1 Blue Component 0.0 Color Space sRGB Green Component 0.76959484815597534 Red Component 0.78058648109436035 Ansi 4 Color Alpha Component 1 Blue Component 0.78216177225112915 Color Space sRGB Green Component 0.14576995372772217 Red Component 0.0096152340993285179 Ansi 5 Color Alpha Component 1 Blue Component 0.78154844045639038 Color Space sRGB Green Component 0.18891248106956482 Red Component 0.79022186994552612 Ansi 6 Color Alpha Component 1 Blue Component 0.78166204690933228 Color Space sRGB Green Component 0.77425903081893921 Red Component 0.0 Ansi 7 Color Alpha Component 1 Blue Component 0.78104829788208008 Color Space sRGB Green Component 0.78105825185775757 Red Component 0.7810397744178772 Ansi 8 Color Alpha Component 1 Blue Component 0.4078223705291748 Color Space sRGB Green Component 0.40782788395881653 Red Component 0.40781760215759277 Ansi 9 Color Alpha Component 1 Blue Component 0.40569943189620972 Color Space sRGB Green Component 0.43035173416137695 Red Component 1 Background Color Alpha Component 1 Blue Component 0.918487548828125 Color Space sRGB Green Component 0.99384576082229614 Red Component 1 Badge Color Alpha Component 0.5 Blue Component 0.0 Color Space sRGB Green Component 0.1491314172744751 Red Component 1 Bold Color Alpha Component 1 Blue Component 1 Color Space sRGB Green Component 1 Red Component 0.99999600648880005 Cursor Color Alpha Component 1 Blue Component 0.78104829788208008 Color Space sRGB Green Component 0.78105825185775757 Red Component 0.7810397744178772 Cursor Guide Color Alpha Component 0.25 Blue Component 1 Color Space sRGB Green Component 0.9268307089805603 Red Component 0.70213186740875244 Cursor Text Color Alpha Component 1 Blue Component 1 Color Space sRGB Green Component 1 Red Component 0.99999600648880005 Foreground Color Alpha Component 1 Blue Component 0.0 Color Space sRGB Green Component 0.0 Red Component 0.0 Link Color Alpha Component 1 Blue Component 0.73423302173614502 Color Space sRGB Green Component 0.35916060209274292 Red Component 0.0 Selected Text Color Alpha Component 1 Blue Component 0.0 Color Space sRGB Green Component 0.0 Red Component 0.0 Selection Color Alpha Component 1 Blue Component 1 Color Space sRGB Green Component 0.86970102787017822 Red Component 0.75813239812850952 ================================================ FILE: .misc/neovim-local.mk ================================================ CMAKE_BUILD_TYPE := Debug CMAKE_EXTRA_FLAGS := -DCMAKE_INSTALL_PREFIX=${HOME}/local/nvim USE_BUNDLED := ON # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_GETTEXT=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_GPERF=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LIBICONV=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LIBTERMKEY=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUA=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_MSGPACK=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UNIBILIUM=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LIBUV=ON # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_BUSTED=ON # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAJIT=ON # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAROCKS=ON # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LIBVTERM=ON # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUV=ON .PHONY: all default: all .PHONY: info info: @awk -F = '/BUILD_TYPE:/ { print "BUILD_TYPE:", $$2 }' build/CMakeCache.txt @awk -F = '/C_COMPILER:/ { print "C_COMPILER:", $$2 }' build/CMakeCache.txt .PHONY: release release: $(MAKE) CMAKE_BUILD_TYPE=RelWithDebInfo rebuild-%: rm -f .deps/build/src/$*-stamp/$*-build DEBUG=1 $(MAKE) deps .PHONY: cl cl: rm -f errors.json wget https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint/errors.json $(eval FILES = $(shell git diff-tree --name-only --no-commit-id -r master..)) src/clint.py --suppress-errors=errors.json ${FILES} ================================================ FILE: .profile ================================================ # This file gets sourced by every login shell. # PATH {{{1 newpath=( # homebrew (keg-only) /usr/local/sbin /usr/local/opt/coreutils/libexec/gnubin /usr/local/opt/ncurses/bin /usr/local/opt/ruby/bin /usr/local/lib/ruby/gems/*/bin /usr/local/opt/llvm/bin ~/data/go/bin # $GOPATH ~/.npm/bin ~/.asdf/bin ~/.asdf/shims ~/.cargo/bin ~/local/*/bin ~/bin ) # Apple's path_helper gets called from /etc/profile and # /etc/zprofile and mangles $PATH. Work around it. if [[ -x /usr/libexec/path_helper ]]; then PATH= eval "$(/usr/libexec/path_helper -s)" fi # Only unique elements, please. for dir in "${newpath[@]}"; do case $PATH in *:"$dir":*) ;; *) [[ -d $dir ]] && PATH="$dir:$PATH" ;; esac done export PATH unset newpath dir # }}} export ME=$HOME/data export LANG=en_US.UTF-8 export FZF_DEFAULT_COMMAND="rg --files --hidden --glob '!.git'" export FZF_DEFAULT_OPTS='--inline-info --color=light' export RIPGREP_CONFIG_PATH="$HOME/.config/rg/rgrc" export ELIXIR_EDITOR='ec +__LINE__ __FILE__' export GOPATH=$ME/go export GOARCH=amd64 export GOOS="$(uname -s | tr '[:upper:]' '[:lower:]')" export PGDATA=/usr/local/var/postgres if command -v nvim 1>/dev/null; then export EDITOR='nvim' elif command -v vim 1>/dev/null; then export EDITOR='vim' elif command -v vi 1>/dev/null; then export EDITOR='vi' elif command -v emacs 1>/dev/null; then export EDITOR='emacs -nw' elif command -v nano 1>/dev/null; then export EDITOR='nano' else echo 'Install a proper editor.' fi export MANPATH=/usr/local/opt/coreutils/libexec/gnuman:"$MANPATH" export MANPATH=/usr/local/opt/erlang/lib/erlang/man:"$MANPATH" export MANPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/share/man:"$MANPATH" export MANWIDTH=82 case "$EDITOR" in nvim) export MANPAGER="nvim +'set ft=man' -" ;; vim) export MANPAGER="/bin/sh -c \"col -b | vim -c 'set ft=man ro nomod nolist' -\"" ;; *) export MANPAGER='less' ;; esac ================================================ FILE: .pryrc ================================================ def line(obj, depth, indent=true) print indent ? obj.rjust(depth.to_i + obj.length) : obj end def ppp(obj, depth=0, indent=true) if obj.is_a? Array line "[\n", depth, indent obj.each { |v| ppp v, depth+2 } line "],\n", depth elsif obj.is_a? Hash line "{\n", depth, indent obj.each do |k,v| line "#{k} => ", depth+2 ppp v, depth+2, false end line "},\n", depth else line "#{':' if obj.is_a? Symbol}#{obj},\n", depth, indent end end # vim: ft=ruby ================================================ FILE: .psqlrc ================================================ \set PROMPT1 '%[%033[0;34m%]%/%R%x%#%[%033[0m%] ' \set PROMPT2 '%[%033[0;33m%]%R%x →%[%033[0m%] ' \x auto ================================================ FILE: .pypirc ================================================ [distutils] index-servers = pypi [pypi] username:mhinz ================================================ FILE: .rtorrent.rc ================================================ directory = /data/torrent/download session = /data/torrent/session schedule = low_diskspace,5,60,close_low_diskspace=50M encryption = allow_incoming,try_outgoing,enable_retry,prefer_plaintext ip = 127.0.0.1 port_range = 32537-32537 port_random = yes dht = disable peer_exchange = false ================================================ FILE: .shrc ================================================ # This file gets sourced by .bashrc and .zshrc. os="$(uname -s)" stty discard undef if [[ -z $THEME ]]; then if [[ -n $ITERM_PROFILE ]]; then export THEME=$ITERM_PROFILE elif [[ -n $KITTY_WINDOW_ID ]]; then export THEME=Light else export THEME=Dark fi fi if [[ $THEME = Dark ]]; then eval $(dircolors ~/.zsh/dircolors.dark) ln -fs \ ~/.config/git/config.colors.dark \ ~/.config/git/config.colors else eval $(dircolors ~/.zsh/dircolors.light) ln -fs \ ~/.config/git/config.colors.light \ ~/.config/git/config.colors fi # Prompt {{{1 if [[ -n ${ZSH_VERSION-} ]]; then _p_pink='%F{161}' _p_red='%F{9}' _p_green='%F{46}' # 77 _p_blue='%F{67}' _p_clear='%f%k%b%u' _p_bold='%B' _p_underline='%U' _p_user='%F{19}' _p_host='%F{32}' else _p_pink='\[\e[38;5;161m\]' _p_red='\[\e[38;5;9m\]' _p_green='\[\e[38;5;46m\]' _p_blue='\[\e[38;5;67m\]' _p_clear='\[\e[0m\]' _p_bold='\[\e[1m\]' _p_underline='\[\e[4m\]' _p_user='\[\e[38;5;19m\]' _p_host='\[\e[38;5;32m\]' fi [[ $THEME = Dark ]] && _p_main=$_p_green || _p_main=$_p_pink _prompt() { local exitval=$? local jobs="$(jobs | wc -l | tr -d '\n')" local gittop="$(git rev-parse --show-toplevel 2>/dev/null)" local pwd="$(pwd -P)" local p # this directory might be below a git repo but not part of it [[ -n $gittop && -z $(git ls-files) ]] && gittop= # root! [[ $UID -eq 0 ]] && p+="${_p_red}${_p_underline}ROOT${_p_clear} " # show user and host on remote systems if [[ -n $SSH_CONNECTION ]]; then [[ $UID -ne 0 ]] && p+="${_p_user}${USER}${_p_clear} " p+="${_p_host}$(hostname) " fi p+=$_p_main if [[ -z $gittop ]]; then p+="$pwd " else local parentdir="${gittop%/*}" local front="${parentdir/#${HOME}/~}" local middle="${_p_underline}${_p_bold}${gittop##*/}${_p_clear}" local back="${_p_main}${pwd#${gittop}}" p+="${front}/${middle}${back}${_p_clear} " # branch name or short SHA if detached local branch=$(git symbolic-ref --short -q HEAD || git rev-parse --short HEAD) [[ -n $branch ]] && p+="${_p_bold}${branch}" # dirty working tree git diff --no-ext-diff --quiet 2>/dev/null || p+="$_p_bold *" # staged changes git diff-index --cached --quiet HEAD 2>/dev/null || p+="$_p_bold ✓" local gitdir="${gittop}/.git" [[ -f "${gitdir}/refs/stash" ]] && p+=' [stash]' if [[ -f "${gitdir}/MERGE_HEAD" ]]; then p+=' [merge]' elif [[ -f "${gitdir}/CHERRY_PICK_HEAD" ]]; then p+=' [cherry]' elif [[ -f "${gitdir}/REVERT_HEAD" ]]; then p+=' [revert]' elif [[ -f "${gitdir}/rebase-merge/interactive" ]]; then p+=' [rebase-i]' elif [[ -d "${gitdir}/rebase-apply" ]]; then p+=' [rebase]' fi fi p+="${_p_clear}"$'\n' (( $jobs )) && p+="[${_p_blue}${_p_bold}${jobs}${_p_clear}]" (( $exitval )) && p+="[${_p_red}${_p_bold}${exitval}${_p_clear}]" PS1="${p}❯ " } # Aliases {{{1 alias d='docker' alias dc='docker-compose' alias g='git' alias m='mhi' alias t='task' alias tf='task -f' alias tn='task | head -n 1' alias pip3up="pip3 list --outdated | sed -e '1,2d; s/ .*//' | xargs pip3 --no-cache-dir install -U" alias gemup="gem update --system && gem update && gem cleanup" alias npmup="npm install npm@latest -g && npm -g update" if [[ $os = Darwin ]]; then alias brewup='brew update && brew upgrade && brew upgrade --cask --greedy && brew cleanup --prune 1' alias allup="pip3up; gemup; npmup; brewup" elif [[ $os = Linux ]]; then alias aptup='sudo apt update && sudo apt upgrade && sudo apt autoremove' alias allup="pip3up; gemup; npmup; aptup" fi alias stripcolors='sed -r "s/\x1b\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"' alias mirror='wget --mirror --no-parent --continue' alias myip='dig +short myip.opendns.com @resolver1.opendns.com' alias val='valgrind -v --leak-check=full --show-reachable=yes' alias yt2mp3='youtube-dl -x --audio-format mp3 --audio-quality 0 -o "%(title)s.%(ext)s"' alias yt2mp3-chapters='yt-dlp -x --audio-format mp3 --audio-quality 0 --split-chapters -o "%(title)s - %(chapter_number)s. %(chapter)s.%(ext)s"' alias yt2mp3-playlist='yt-dlp -x --audio-format mp3 --audio-quality 0 --yes-playlist -o "%(title)s - %(playlist_index)s. %(playlist)s.%(ext)s"' if [[ $os = FreeBSD ]]; then alias ls='gnuls --color=auto -N' else alias ls='ls --color=auto -Nv' fi alias l='ls -1h --group-directories-first' alias ll='ls -lh --group-directories-first' alias la='ll -A' alias grep='grep --color=auto' alias 1='fg %1' alias 2='fg %2' alias 3='fg %3' alias 11='bg %1' alias 22='bg %2' alias 33='bg %3' if [[ $os = Darwin ]]; then alias chrome='open -a Google\ Chrome' alias preview='open -a Preview' alias vlc='open -a VLC' alias xcode='open -a Xcode' if [[ -x /Applications/LuLu.app/Contents/Resources/Netiquette.app/Contents/MacOS/Netiquette ]]; then alias objsee-netiquette='/Applications/LuLu.app/Contents/Resources/Netiquette.app/Contents/MacOS/Netiquette -list' fi if [[ -x /Applications/FileMonitor.app/Contents/MacOS/FileMonitor ]]; then alias objsee-filemonitor='sudo /Applications/FileMonitor.app/Contents/MacOS/FileMonitor' fi if [[ -x /Applications/ProcessMonitor.app/Contents/MacOS/ProcessMonitor ]]; then alias objsee-processmonitor='sudo /Applications/ProcessMonitor.app/Contents/MacOS/ProcessMonitor' fi fi # Functions {{{1 dsf() { git diff --no-index --color "$@" | diff-so-fancy | less -RFXx2 } s() { if (( $# )); then ps -eo pid,ppid,user,%cpu,%mem,state,command | grep -i "$@" | grep -v "grep.*$@" | grep "$@" else ps -eo pid,ppid,user,%cpu,%mem,state,command fi } r() { exec $SHELL } md() { command mkdir -p $1 && builtin cd $1 } rd() { dir=$PWD builtin cd .. if command rmdir "$dir" 2>/dev/null; then echo 'Removed empty directory:' $dir else builtin cd "$dir" echo 'Directory is not empty:' ls -A fi unset dir } lookup() { open "https://sks-keyservers.net/pks/lookup?search=${*}" } oman() { open "https://man.openbsd.org/${*}" } camusedby() { echo 'Recent camera uses:' local usedby=$(lsof | grep -w "AppleCamera\|USBVDC\|iSight" | awk '{printf $2"\n"}' | xargs ps) echo $usedby } fix-perm() { [[ $1 = -h ]] && { echo 'usage: fix-perm [dirs:700] [files:600]' return 1 } 1>&2 find . -type d -exec chmod ${1-700} {} + find . -type f -exec chmod ${2-600} {} + } angband() { save_stty="$(stty --save)" # Disable flow control and delayed suspend, since we need ^S and ^Y. stty -ixon dsusp undef command angband stty "$save_stty" } _() { for file in "$@"; do if [[ ${file:0:1} = _ ]]; then mv -nv "$file" "${file:1}" else mv -nv "$file" _"$file" fi done } fsed() { [[ $# -lt 2 ]] && { echo 'usage: fsed ' 2>&1; return 1; } for file in "${@:2}"; do mv -nv "$file" "$(sed "$1" <<< "$file")"; done } asn() { (( !$# )) && { echo 'usage: asn ' 2>&1; return 1; } local ip="$1" grep ':' 1>/dev/null <<< "$ip" && ip="$(dig -x "$ip" +short)" # IPv6 to domain grep '[g-z]' 1>/dev/null <<< "$ip" && ip="$(dig "$ip" A +short)" # domain to IPv4 local rr="$(printf '%s' "$ip." | tac -s.)"origin.asn.cymru.com dig "$rr" TXT +short whois -h whois.cymru.com -- "$ip" } hex() { { echo 'obase=16'; seq "$1" "$2"; } | bc | paste -s -d ' ' } mount() { command mount | sed -e 's/^\(.*\) on \([^ ]*\)/\1\t\2\t/' | sort -t$'\t' -k2 -f | column -s$'\t' -t } # }}} # Chrome {{{1 ch() { export CONF_COLS=$[ COLUMNS/2 ] export CONF_SEP='{::}' cp -f ~/Library/Application\ Support/Google/Chrome/Default/History /tmp/h sqlite3 -separator $CONF_SEP /tmp/h 'select title, url from urls order by last_visit_time desc' \ | ruby -ne ' cols = ENV["CONF_COLS"].to_i title, url = $_.split(ENV["CONF_SEP"]) puts "\x1b[33m#{title.ljust(cols)}\x1b[0m #{url}"' \ | fzf --ansi --multi --no-hscroll --tiebreak=index \ | grep --color=never -o 'https\?://.*' \ | xargs open unset CONF_COLS CONF_SEP } # FZF {{{1 url() { tmux capture-pane -pJS - \ | grep -oE '\b(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]*[-A-Za-z0-9+&@#/%=~_|]' \ | fzf-tmux --multi --tac --exit-0 \ | while read url; do open "$url"; done } f() { local file="$(fzf-tmux -1 --tac --tiebreak=index)" [[ -n $file ]] && cd "$(dirname "$file")" } p() { local dirs=( $ME/github/* $HOME/.vim/bundle ) local dir="$(find "${dirs[@]}" -type d -mindepth 1 -maxdepth 1 | fzf-tmux -1 --tac)" [[ -n $dir ]] && cd "$dir" && clear } c() { local configs=( ~/.bash_profile ~/.bashrc ~/.config/git/config ~/.profile ~/.shrc ~/.tmux.conf ~/.vim/autoload/mhi.vim ~/.vim/lua/config.lua ~/.vim/magic.vim ~/.vim/vimrc ~/.zsh/.zprofile ~/.zsh/.zshrc ~/.zshenv ) local IFS=$'\n' local files=($(echo "${configs[*]}" | fzf-tmux -m -1 --tac --tiebreak=index)) [[ -n $files ]] && v "${files[@]}" } book() { local book="$(rg --files $ME/books | fzf -1 --tac)" [[ -z $book ]] && return 1 cd "${book%/*}" clear ls -1 --group-directories-first } # Git {{{1 pr() { local origin pr if [[ $# -eq 0 ]]; then echo "usage: pr [remote] " return 1 elif [[ $# -eq 1 ]]; then origin=$(git config branch.master.remote || echo origin) pr=$1 else origin=$1 pr=$2 fi git fetch $origin refs/pull/${pr}/head || return git checkout -q FETCH_HEAD } prpush() { local pr=$1 local local_branch=$(git rev-parse --abbrev-ref HEAD) [[ $local_branch == pr[[:digit:]]* ]] && pr=${local_branch#??} local url=$(git config remote.$(git config branch.master.remote).url) local slug=${${url#*github.com?}%.git} local repo="${slug#*/}" local url=https://api.github.com/repos/${slug}/pulls/${pr} local label=$(curl -s "$url" | jq -r '.head.label') local author=${label%%:*} local remote_branch=${label#*:} local cmd="git push -f git@github.com:${author}/${repo} ${local_branch}:${remote_branch}" echo "$cmd" eval "$cmd" } changed() { local files=$(git diff -U0 --no-prefix --relative "$@" 2>/dev/null | quickfix_diff_to_hunk) [[ -z $files ]] && { echo '¯\_(ツ)_/¯'; return 1; } v -q <(echo $files) } quickfix_diff_to_hunk() { ruby -ne ' (file = $1; next) if $_ =~ /^\+\+\+ (.*)/; next if file.nil?; (linenr = $1; next) if $_ =~ /^@@ .*\+(\d+)/; next if linenr.nil?; puts "#{file}:#{linenr}: #{$1}" if $_ =~ /^[+-](.*)/; linenr = nil ' } b() { git checkout $(git branch -a | fzf -1 | cut -c3-) } gho() { local prefix prefix=$(git rev-parse --show-prefix) (( $? )) && return 1 local branch=$(git symbolic-ref -q --short HEAD) local remote=$(git config branch.master.remote || echo origin) local url=$(git config remote.${remote}.url) url=${url/git\@github\.com:/https:\/\/github.com/} url=${url%\.git} open ${url}/tree/${branch}/${prefix}${1:-} } gl() { nvim +'Gclog' } # iTerm2 {{{1 proftoggle() { if [[ -z $ITERM_PROFILE ]]; then print "Not in iTerm" 1>&2 return fi tmup if [[ $ITERM_PROFILE == Light ]]; then export ITERM_PROFILE=Dark eval $(dircolors ~/.zsh/dircolors.dark) ln -fs \ ~/.config/git/config.colors.dark \ ~/.config/git/config.colors else export ITERM_PROFILE=Light eval $(dircolors ~/.zsh/dircolors.light) ln -fs \ ~/.config/git/config.colors.light \ ~/.config/git/config.colors fi local seq="\e]1337;SetProfile=${ITERM_PROFILE}\x7" if [[ -n $TMUX ]]; then seq="\ePtmux;\e${seq}\e\\" tmux setenv -g ITERM_PROFILE $ITERM_PROFILE fi printf $seq clear } # Tmux {{{1 tm() { if (( $# )); then tmux has-session -t "$*" && tmux attach -t "$*" || tmux new-session -s "$*" else tmux attach || tmux new-session -s default fi } tmup() { [[ -n $TMUX ]] && export "$(tmux showenv -s)" } # Vim {{{1 v() { if [[ -x $ME/github/neovim/neovim/build/bin/nvim ]]; then VIMRUNTIME=$ME/github/neovim/neovim/runtime $ME/github/neovim/neovim/build/bin/nvim "$@" else $EDITOR "$@" fi } vd() { VIMRUNTIME=$ME/github/neovim/neovim/runtime lldb -- $ME/github/neovim/neovim/build/bin/nvim "$@" } all() { git rev-parse --is-inside-work-tree &>/dev/null && tool=git || tool=ag nvim +"Grepper -tool $tool -highlight -jump -open -noswitch -query $1" } va() { nvim -q <(ag --vimgrep "$@") } vg() { nvim -q <(git grep -nI "$@") } test -r ~/.shenv && . ~/.shenv # vim: ft=sh fdm=marker ================================================ FILE: .tmux.conf ================================================ # tmux.conf # bindings {{{1 bind-key a send-prefix bind-key r source-file ~/.tmux.conf \; display-message 'Reloaded ~/tmux.conf' bind-key G set status bind-key T run-shell 'for i in {1..$(tmux list-windows | wc -l)}; do tmux next-window; done' bind-key , command-prompt "rename-window '%%'" bind-key s command-prompt -p 'Send pane to:' 'join-pane -ht "%%"' bind-key j command-prompt -p 'Join pane from:' 'join-pane -hs "%%"' bind-key B break-pane bind-key c new-window bind-key C new-window -c "#{pane_current_path}" bind-key | split-window -h -c "#{pane_current_path}" bind-key - split-window -v -c "#{pane_current_path}" bind-key -r n next-window bind-key -r p previous-window bind-key -r o last-window bind-key -r Left swap-window -t {previous} bind-key -r Right swap-window -t {next} bind-key h select-pane -L bind-key j select-pane -D bind-key k select-pane -U bind-key l select-pane -R bind-key -n M-h if-shell '[[ #{pane_current_command} =~ vim ]]' 'send-keys M-h' 'select-pane -L' bind-key -n M-j if-shell '[[ #{pane_current_command} =~ vim ]]' 'send-keys M-j' 'select-pane -D' bind-key -n M-k if-shell '[[ #{pane_current_command} =~ vim ]]' 'send-keys M-k' 'select-pane -U' bind-key -n M-l if-shell '[[ #{pane_current_command} =~ vim ]]' 'send-keys M-l' 'select-pane -R' bind-key -r C-h resize-pane -L 3 bind-key -r C-j resize-pane -D 3 bind-key -r C-k resize-pane -U 3 bind-key -r C-l resize-pane -R 3 bind-key + choose-buffer "delete-buffer -b '%%'" bind-key > save-buffer ~/.tmux-exchange \; display-message 'tmux: buffer saved' bind-key < load-buffer ~/.tmux-exchange \; display-message 'tmux: buffer loaded' bind-key v copy-mode bind-key -r P paste-buffer bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel pbcopy bind-key -T copy-mode-vi v send -X begin-selection bind-key -T copy-mode-vi C-v send -X rectangle-toggle # options {{{1 set-option -g prefix C-a set-option -g default-terminal 'tmux-256color' set-option -ga update-environment ' ITERM_PROFILE' set-option -ga terminal-overrides ',xterm-256color:Tc' set-option -ga terminal-overrides ',*:Setulc=\E[58::2::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m' # underscore colors in kitty set-option -g mode-keys vi set-option -g mouse on set-option -gs escape-time 1 set-option -g repeat-time 1000 set-option -g base-index 1 set-option -g focus-events on set-option -g history-limit 1000 set-option -g status-position top set-option -g monitor-activity off set-option -g renumber-windows on set-option -g set-titles on set-option -g visual-activity off # statusline {{{1 set-option -g status-justify centre set-option -g status-interval 60 set-option -g window-status-current-format ' #W ' set-option -g window-status-format ' #W ' set-option -g status-left '' set-option -g status-right '#{?window_zoomed_flag, #[fg=colour16]#[bg=colour214] ZOOM ,}#[default] ' set-option -ga status-right '#[fg=colour15]#[bg=colour245] ' # set-option -ga status-right '#(cat ~/todo)' set-option -ga status-right "#(pmset -g batt | awk 'NR==2 { gsub(/;/, \"\"); print $3 }') #[default]" set-option -ga status-right ' #[bg=colour245] %H:%M ' # colors {{{1 set-option -g status-style fg=colour15,bg=default set-option -g window-status-current-style fg=colour15,bg=colour161 set-option -g window-status-style fg=colour15,bg=colour24 set-option -g pane-border-style fg=colour240 set-option -g pane-active-border-style fg=colour240 set-option -g window-status-activity-style fg=colour111 set-option -g message-style fg=colour15,bg=colour161 set-option -g message-command-style fg=colour15,bg=colour24 ================================================ FILE: .travis.yml ================================================ sudo: false dist: trusty addons: apt: packages: shellcheck script: shellcheck bin/mhi* bin/build* bin/bootstrap* ================================================ FILE: .vim/autoload/mhi.vim ================================================ " " Show the commit that touched the current line last. " function! mhi#git_blame_current_line() abort let gitdir = finddir('.git', expand('%:p').';') if empty(gitdir) echo 'no git' return endif let sha = matchstr(systemlist(printf('git blame --porcelain -lL%d,+1 %s', \ line('.'), expand('%')))[0], '\x\+') new execute 'silent file fugitive://'.gitdir.'//'.sha edit silent! %foldopen set bufhidden=wipe nnoremap q :quit endfunction " " Show evolution of current line " function mhi#git_log_evolution(startline, endline, file) abort let cmd = printf('git log -L %s,%s:%s', a:startline, a:endline, a:file) enew set buftype=nofile setfiletype git let &l:statusline = cmd nnoremap q :bd execute 'silent! %!' cmd endfunction " " Close nearest open bracket. " function! mhi#close_bracket() abort highlight BracketRange cterm=underline let pos = [0, 0] let pairs = {} for [open, close] in map(split(&matchpairs, ','), 'split(v:val, ":")') let pairs[open] = close let m = searchpairpos(escape(open, '['), '', close, 'bnW') if m[0] > pos[0] let pos = m elseif m[1] > pos[1] && m[0] == pos[0] let pos[1] = m[1] endif endfor if pos != [0, 0] let cur = getcurpos()[1:2] call clearmatches() call matchadd('BracketRange', \ '\%'.pos[0].'l\%'.pos[1].'c.*\_.\+\%'.cur[0].'l\%'.cur[1].'c') call timer_start(&matchtime * 100, {-> clearmatches()}) return pairs[matchstr(getline(pos[0]), '.', pos[1]-1)] endif return '' endfunction " " GitHub " function! mhi#github_open_issue() abort if !exists('b:git_dir') return endif let issue = matchstr(expand(''), '\d\+') if empty(issue) return endif let remote = systemlist('git config branch.master.remote || echo origin')[0] let url = systemlist(printf('git config remote.%s.url', remote))[0] let slug = substitute(matchstr(url, '\v[/:]\zs.*'), '\.git', '', '') let url = 'https://github.com/'. slug .'/issues/'. issue silent execute '!open -a Google\ Chrome' url endfunction function! mhi#github_open_slug() abort let old_isk = &iskeyword let &iskeyword = 'a-z,A-z,48-57,-,_,/,.' let slug = expand('') let &iskeyword = old_isk call system('open https://github.com/'. slug) endfunction " " Tmux " function! mhi#tmux_navigate(direction) abort let oldwin = winnr() execute 'wincmd' a:direction if !empty($TMUX) && winnr() == oldwin let sock = split($TMUX, ',')[0] let direction = tr(a:direction, 'hjkl', 'LDUR') silent execute printf('!tmux -S %s select-pane -%s', sock, direction) endif endfunction " " Smarter jumping. " function! mhi#jump() if (&filetype ==# 'vim' && &buftype ==# 'nofile') || &buftype ==# 'quickfix' execute "normal! \" elseif &filetype ==# 'vim' call lookup#lookup() elseif &filetype ==# 'man' execute "normal \" elseif has_key(get(g:, 'ls#servers', {}), &filetype) call ls#feature#definition() else let word = expand('') if empty(word) return endif try execute 'tag' word catch echoerr substitute(v:exception, '.\{-}:', '', '') return endtry call halo#run() endif " normal! zvzt endfunction " " Showing [+1 -2 ~3] in statusline. " function! mhi#sy_stats_wrapper() let symbols = ['+', '-', '~'] let [added, modified, removed] = sy#repo#get_stats() let stats = [added, removed, modified] " reorder let hunkline = '' for i in range(3) if stats[i] > 0 let hunkline .= printf('%s%s ', symbols[i], stats[i]) endif endfor if !empty(hunkline) let hunkline = '%3*[%5*'. hunkline[:-2] .'%3*]%*' endif return hunkline endfunction " " Verbatim matching for *. " function! mhi#search() abort let regsave = @@ normal! gvy let @/ = '\V' . substitute(escape(@@, '\'), '\n', '\\n', 'g') let @@ = regsave endfunction " " Jump forward/backward to next match and highlight it. " function! mhi#search_highlight_next_match(cmd) abort silent! call matchdelete(s:match) try execute 'normal!' a:cmd.'zvzz' catch /E486/ " pattern not found echohl ErrorMsg | echo substitute(v:exception, '^.\{-}:', '', '') | echohl NONE endtry let line = line('.') let col = col('.') call search(@/, 'zce', line, 100) let len = col('.') - col + 1 call cursor(line, col) let s:match = matchaddpos('IncSearch', [[line, col, len]]) endfunction " " For 'foldtext'. " function! mhi#foldy() let linelen = &tw ? &tw : 80 let marker = strpart(&fmr, 0, stridx(&fmr, ',')) . '\d*' let range = foldclosedend(v:foldstart) - foldclosed(v:foldstart) + 1 let left = substitute(getline(v:foldstart), marker, '', '') let leftlen = len(left) let right = range . ' [' . v:foldlevel . ']' let rightlen = len(right) let tmp = strpart(left, 0, linelen - rightlen) let tmplen = len(tmp) if leftlen > len(tmp) let left = strpart(tmp, 0, tmplen - 4) . '... ' let leftlen = tmplen endif let fill = repeat(' ', linelen - (leftlen + rightlen)) return left . fill . right . repeat(' ', 100) endfunction " " Switch to VCS root, if there is one. " function! mhi#cd() abort if &buftype =~# '\v(nofile|terminal)' || expand('%') =~# '^fugitive' return endif if !exists('s:cache') let s:cache = {} endif let dirs = [ '.git', '.hg', '.svn' ] let curdir = mhi#normalize(resolve(expand('%:p:h'))) if !isdirectory(curdir) echohl WarningMsg | echo 'No such directory: '. curdir | echohl NONE return endif if has_key(s:cache, curdir) execute 'lcd' fnameescape(s:cache[curdir]) return endif for dir in dirs let founddir = finddir(dir, curdir .';') if !empty(founddir) break endif endfor let dir = empty(founddir) ? curdir : mhi#normalize(resolve(fnamemodify(founddir, ':p:h:h'))) let s:cache[curdir] = dir execute 'lcd' fnameescape(dir) endfunction " " Capture output of any command in a new window. " function! mhi#scratch(cmd) abort let more = &more set nomore try let lines = 1 redir => lines silent execute a:cmd finally redir END let &more = more endtry noautocmd new setlocal buftype=nofile bufhidden=hide noswapfile silent put =lines 1 nnoremap q :q endfunction " " Make a little bit more useful. Stolen from junegunn. " function! s:can_complete(func, prefix) if empty(a:func) || a:func(1, '') < 0 return 0 endif let result = a:func(0, matchstr(a:prefix, '\k\+$')) return !empty(type(result) == type([]) ? result : result.words) endfunction function! mhi#tab_yeah() if pumvisible() return "\" endif let line = getline('.') let col = col('.') - 2 if empty(line) || line[col] !~ '\k\|[/~.]' || line[col + 1] =~ '\k' return "\" endif let prefix = expand(matchstr(line[0:col], '\S*$')) if prefix =~ '^[~/.]' return "\\" endif if !empty(&completefunc) && s:can_complete(function(&completefunc), prefix) return "\\" endif if !empty(&omnifunc) && s:can_complete(function(&omnifunc), prefix) return "\\" endif return "\" endfunction " " Get syntax group information. Stolen from jamessan. " function! s:synnames() let syn = {} let [lnum, cnum] = [line('.'), col('.')] let [effective, visual] = [synID(lnum, cnum, 0), synID(lnum, cnum, 1)] let syn.effective = synIDattr(effective, 'name') let syn.effective_link = synIDattr(synIDtrans(effective), 'name') let syn.visual = synIDattr(visual, 'name') let syn.visual_link = synIDattr(synIDtrans(visual), 'name') return syn endfunction function! mhi#syninfo() let syn = s:synnames() let info = '' if syn.visual != '' let info .= printf('visual: %s', syn.visual) if syn.visual != syn.visual_link let info .= printf(' (as %s)', syn.visual_link) endif endif if syn.effective != syn.visual if syn.visual != '' let info .= ', ' endif let info .= printf('effective: %s', syn.effective) if syn.effective != syn.effective_link let info .= printf(' (as %s)', syn.effective_link) endif endif return info endfunction " " Run Exercism tests " function! mhi#run_exercism_tests() abort if expand('%:e') == 'vim' let testfile = printf('%s/%s.vader', expand('%:p:h'), \ tr(expand('%:p:h:t'), '-', '_')) if !filereadable(testfile) echoerr 'File does not exist: '. testfile return endif source % execute 'Vader' testfile else let sourcefile = printf('%s/%s.vim', expand('%:p:h'), \ tr(expand('%:p:h:t'), '-', '_')) if !filereadable(sourcefile) echoerr 'File does not exist: '. sourcefile return endif execute 'source' sourcefile Vader endif endfunction " " Find and source project-specific Vim configs " function! mhi#source_project_config() abort let projectfile = findfile('.project.vim', expand('%:p').';') if filereadable(projectfile) execute 'source' projectfile endif endfunction " " Cycle through completion functions. " function! mhi#next_completion() abort let compls = [ 'emoji#complete', 'tmuxcomplete#complete' ] let &cfu = compls[(index(compls, &cfu) + 1) % len(compls)] echomsg 'Using '. &cfu endfunction " " Wrapper for :terminal " function! mhi#terminal(bang, mods, cmd) abort let terms = filter(map(tabpagebuflist(), 'getbufvar(v:val, ''terminal_job_id'')'), '!empty(v:val)') if empty(terms) execute a:mods 'new' let g:terminal = termopen($SHELL) $ if a:bang | wincmd p | endif endif call chansend(g:terminal, a:cmd."\n") endfunction " " Switch buffer. Skip buffers already shown in another window. " function! mhi#switch_buffer(cmd) abort try execute a:cmd catch /E85/ " There is no listed buffer return endtry let bufs = tabpagebuflist() while !empty(bufs) let buf = bufnr('') if count(bufs, buf) == 1 | break | endif execute a:cmd call filter(bufs, 'v:val != '.buf) endwhile stopinsert call halo#run() endfunction " " :cd chokes on UNC paths with two backslashes. Use one backslash instead. " " Bad: :cd z:\\share " Good: :cd z:\share " function! mhi#normalize(path) abort return has('win32') && &shellslash == 0 \ ? substitute(a:path, '\v^(\w):\\\\', '\1:\\', '') \ : a:path endfunction " " Highlight the '123' in 'ctermfg=123' according to its number. " function! mhi#vim_highlight_groups() for c in range(256) execute 'syntax match CtermFg'.c '/\<\%(ctermfg=\)\@<='.c.'\>/ display containedin=vimHiNmbr' execute 'syntax match CtermBg'.c '/\<\%(ctermbg=\)\@<='.c.'\>/ display containedin=vimHiNmbr' execute 'highlight CtermFg'.c 'ctermfg='.c 'cterm=NONE' execute 'highlight CtermBg'.c 'ctermfg='.c 'cterm=NONE' endfor endfunction " vim: fdm=syntax ================================================ FILE: .vim/colors/fnord.vim ================================================ let g:colors_name = 'fnord' if !has('gui_running') || &termguicolors == 0 if exists('+termguicolors') let &termguicolors = 1 else echohl Error echomsg "vim-fnord requires a Vim supporting the 'termguicolors' option." echohl NONE finish endif endif " highlight clear " syntax reset function! s:hi(group, fg, bg, gui, guisp) let config = a:group if !empty(a:fg) | let config .= ' guifg='.a:fg | endif if !empty(a:bg) | let config .= ' guibg='.a:bg | endif if !empty(a:gui) | let config .= ' gui=' .a:gui . ' cterm='.a:gui | endif if !empty(a:guisp) | let config .= ' guisp='.a:guisp | endif execute 'highlight' config endfunction let s:blue0 = '#35d4d9' let s:blue1 = '#25909c' let s:blue2 = '#013969' let s:blue3 = '#05224a' let s:blue4 = '#68b3da' let s:blue5 = '#00c2f4' let s:blue6 = '#5879bd' let s:blue7 = '#124a7b' let s:gray0 = '#afb8c4' let s:gray1 = '#eeeeee' let s:gray2 = '#555588' let s:yellow0 = '#e5e568' let s:purple = '#5e50ba' let s:orange = '#d69a66' let s:orange2 = '#e3c08e' let s:orange3 = '#d2a500' " let s:red = '#772d26' let s:green = '#97dd7b' let s:green2 = '#103850' let s:red = '#d2554f' let s:red2 = '#d42a60' let s:red3 = '#fb6c89' let s:pink = '#d371e3' call s:hi('Normal', s:gray0, s:blue2, 'NONE', '') call s:hi('NormalFloat', '', s:blue3, 'NONE', '') call s:hi('FloatBorder', s:red3, s:blue3, 'NONE', '') " call s:hi('StatusLine', 'black', s:blue0, 'NONE', '') call s:hi('StatusLine', s:gray0, s:blue7, 'bold', '') call s:hi('StatusLineNC', s:gray0, s:blue7, 'NONE', '') call s:hi('User1', '#6acdef', s:blue7, 'bold', '') " main/master branch call s:hi('User2', s:yellow0, s:blue7, 'bold', '') " other branch call s:hi('User3', s:blue7, s:blue7, '', '') " hunkline brackets call s:hi('User4', s:green, s:blue7, 'bold', '') " filename call s:hi('User5', '#ef8a55', s:blue7, '', '') " hunkline call s:hi('User6', s:blue6, s:blue7, '', '') " separators call s:hi('TabLineSel', 'black', s:blue5, 'NONE', '') call s:hi('TabLine', s:gray0, s:blue7, 'NONE', '') call s:hi('TabLineFill', s:gray1, s:blue2, 'NONE', '') call s:hi('Visual', s:blue2, s:green, 'NONE', 'NONE') call s:hi('CursorLine', '', s:blue7, 'NONE', 'NONE') call s:hi('Special', s:gray0, '', 'NONE', '') call s:hi('Statement' , s:pink, '' , 'NONE', '') call s:hi('Function', s:yellow0, '', 'NONE', '') call s:hi('Identifier', s:blue0, '', 'NONE', '') call s:hi('PreProc', s:blue0, '', 'NONE', '') call s:hi('String', s:green, '', 'NONE', '') call s:hi('Type', s:blue0, '', 'bold', '') call s:hi('VertSplit', '', s:blue7, 'NONE', '') call s:hi('Comment', s:blue4, '', 'NONE', '') call s:hi('Folded', s:gray1, s:blue1, 'NONE', '') call s:hi('EndOfBuffer', s:blue4, '', 'NONE', '') call s:hi('Constant', s:orange, '', 'NONE', '') call s:hi('NonText', s:blue6, '', 'NONE', '') call s:hi('LineNr', s:blue6, s:blue2, 'NONE', '') call s:hi('CursorLineNr', s:yellow0, s:blue2, 'NONE', '') call s:hi('SignColumn', s:orange, s:blue2, 'NONE', '') call s:hi('DiffAdd', s:green, s:blue2, 'NONE', '') call s:hi('DiffChange', s:orange, s:blue2, 'NONE', '') call s:hi('DiffDelete', s:red3, s:blue2, 'NONE', '') call s:hi('Pmenu', s:blue4, s:blue3, 'NONE', '') call s:hi('PmenuSel', 'black', s:orange, 'NONE', '') call s:hi('PmenuSbar', 'black', s:blue3, 'NONE', '') call s:hi('PmenuThumb', 'black', s:blue2, 'NONE', '') call s:hi('RFCType', s:blue6, '', 'NONE', '') call s:hi('RFCID', s:blue4, '', 'NONE', '') call s:hi('RFCDelim', s:blue6, '', 'NONE', '') call s:hi('ErrorMsg', s:red3, s:blue2, 'bold', '') call s:hi('Todo', s:yellow0, s:blue2, 'bold', '') call s:hi('Question', s:pink, s:blue2, 'bold', '') call s:hi('QuickFixLine', s:orange2, '', 'bold', '') call s:hi('Search', 'black', s:yellow0, 'NONE', '') call s:hi('IncSearch', 'black', s:red3, 'NONE', '') highlight default link diffAdded DiffAdd highlight default link diffRemoved DiffDelete highlight default link diffFile Comment highlight default link diffNewFile Comment highlight default link diffLine Comment highlight default link diffIndexLine Comment highlight default link diffSubname Comment ================================================ FILE: .vim/lua/config.lua ================================================ local mapopts = { noremap = true, silent = true } -- lsp {{{1 local function default_lsp_settings(_client, _bufnr) vim.api.nvim_buf_set_keymap(0, 'n', '', 'lua vim.lsp.buf.definition()', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', 'gd', 'lua vim.lsp.buf.declaration()', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', 'K', 'lua vim.lsp.buf.hover()', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', 'jc', 'lua vim.lsp.buf.code_action()', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', 'jn', 'lua vim.lsp.buf.rename()', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', 'jr', 'lua vim.lsp.buf.references()', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', 'jt', 'lua vim.lsp.buf.type_definition()', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', 'js', 'lua vim.lsp.buf.signature_help()', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', 'jd', 'lua vim.lsp.diagnostic.show_line_diagnostics({show_header = false, border = "single"})', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', mapopts) vim.api.nvim_buf_set_keymap(0, 'n', ']d', 'lua vim.lsp.diagnostic.goto_next()', mapopts) vim.api.nvim_buf_set_option(0, 'omnifunc', 'v:lua.vim.lsp.omnifunc') -- if client.resolved_capabilities.document_formatting then -- buf_set_keymap("n", "f", "lua vim.lsp.buf.formatting()", opts) -- end -- if client.resolved_capabilities.document_range_formatting then -- buf_set_keymap("v", "f", "lua vim.lsp.buf.range_formatting()", opts) -- end end vim.fn.sign_define('LspDiagnosticsSignError', {text = '', texthl = 'LspDiagnosticsSignError'}) vim.fn.sign_define('LspDiagnosticsSignWarning', {text = '', texthl = 'LspDiagnosticsSignWarning'}) vim.fn.sign_define('LspDiagnosticsSignHint', {text = '', texthl = 'LspDiagnosticsSignHint'}) vim.fn.sign_define('LspDiagnosticsSignInformation', {text = '', texthl = 'LspDiagnosticsSignInformation'}) vim.cmd('highlight! link FloatBorder NormalFloat') vim.cmd('command! LspLog :lua vim.cmd("edit" .. vim.lsp.get_log_path())') -- https://en.wikipedia.org/wiki/Box-drawing_character vim.lsp.handlers['textDocument/hover'] = vim.lsp.with( vim.lsp.handlers.hover, { -- border = 'double' border = { {"╭", "NormalFloat"}, {"─", "NormalFloat"}, {"╮", "NormalFloat"}, {"│", "NormalFloat"}, {"╯", "NormalFloat"}, {"─", "NormalFloat"}, {"╰", "NormalFloat"}, {"│", "NormalFloat"}, } } ) vim.lsp.handlers['textDocument/publishDiagnostics'] = vim.lsp.with( vim.lsp.diagnostic.on_publish_diagnostics, { signs = { priority = 11 }, underline = true, virtual_text = true, update_in_insert = false, } ) local lspconfig = require('lspconfig') lspconfig.util.default_config = vim.tbl_extend('force', lspconfig.util.default_config, { autostart = false, on_attach = default_lsp_settings, }) for _, v in pairs({'gopls', 'pyright', 'rust_analyzer'}) do lspconfig[v].setup({}) end lspconfig.clangd.setup({ cmd = {'/Library/Developer/CommandLineTools/usr/bin/clangd', '--background-index'}, autostart = true, }) local sumneko_root_path = '/Users/mhi/data/lua/lua-language-server' local sumneko_bin = '/bin/macos/lua-language-server' lspconfig.sumneko_lua.setup({ cmd = {sumneko_root_path .. sumneko_bin, '-E', sumneko_root_path .. '/main.lua'}, settings = { Lua = { runtime = { version = 'LuaJIT', -- path = vim.split(package.path, ';'), }, workspace = { library = { -- ['/Users/mhi/data/github/neovim/neovim/runtime/lua'] = true, -- ['/Users/mhi/data/github/neovim/neovim/runtime/lua/vim/lsp'] = true, -- ['/Users/mhi/data/github/neovim/neovim/.deps/usr/share/lua/busted'] = true, }, -- preloadFileSize = 50; -- ignoreDir = { 'data' } }, diagnostics = { globals = {'vim', 'describe', 'it', 'before_each', 'after_each', 'pending', 'teardown'}, -- disable = {'lowercase-global', 'unused-function'}, }, -- completion = { -- keywordSnippet = "Disable", -- }, }, }, }) -- treesitter {{{1 require('nvim-treesitter.configs').setup({ highlight = { enable = {'c', 'lua', 'javascript', 'typescript'} }, textobjects = { select = { enable = true } } }) -- telescope {{{1 -- require('telescope').load_extension('spotlight') vim.api.nvim_set_keymap('n', 'ff', 'Telescope find_files', mapopts) vim.api.nvim_set_keymap('n', 'fg', 'Telescope live_grep', mapopts) vim.api.nvim_set_keymap('n', 'fb', 'Telescope buffers', mapopts) vim.api.nvim_set_keymap('n', 'fh', 'Telescope help_tags', mapopts) -- hop {{{1 require('hop').setup({ teasing = false }) vim.api.nvim_set_keymap('n', '', 'HopChar2', mapopts) vim.api.nvim_set_keymap('n', '', 'HopWord', mapopts) -- colorizer {{{1 if vim.o.termguicolors then require('colorizer').setup({'vim'}) end -- vim: nowrap ================================================ FILE: .vim/vimrc ================================================ " " ███████████████████████████ " ███████▀▀▀░░░░░░░▀▀▀███████ " ████▀░░░░░░░░░░░░░░░░░▀████ " ███│░░░░░░░░░░░░░░░░░░░│███ " ██▌│░░░░░░░░░░░░░░░░░░░│▐██ " ██░└┐░░░░░░░░░░░░░░░░░┌┘░██ " ██░░└┐░░░░░░░░░░░░░░░┌┘░░██ " ██░░┌┘▄▄▄▄▄░░░░░▄▄▄▄▄└┐░░██ " ██▌░│██████▌░░░▐██████│░▐██ " ███░│▐███▀▀░░▄░░▀▀███▌│░███ " ██▀─┘░░░░░░░▐█▌░░░░░░░└─▀██ " ██▄░░░▄▄▄▓░░▀█▀░░▓▄▄▄░░░▄██ " ████▄─┘██▌░░░░░░░▐██└─▄████ " █████░░▐█─┬┬┬┬┬┬┬─█▌░░█████ " ████▌░░░▀┬┼┼┼┼┼┼┼┬▀░░░▐████ " █████▄░░░└┴┴┴┴┴┴┴┘░░░▄█████ " ███████▄░░░░░░░░░░░▄███████ " ██████████▄▄▄▄▄▄▄██████████ " ███████████████████████████ " " You are about to experience a potent dosage of Vim. Watch your steps. " " ╔══════════════════════════════════════════╗ " ║ ⎋ HERE BE VIMPIRES ⎋ ║ " ╚══════════════════════════════════════════╝ let s:is_win = has('win32') let $v = $HOME.(s:is_win ? '\vimfiles' : '/.vim') if s:is_win set shell=cmd.exe set shellcmdflag=/c set encoding=utf-8 endif " Plug {{{1 let s:bundle_dir = $v.'/bundle' let g:plug_shallow = 0 let g:plug_window = 'enew' let g:plug_pwindow = 'vertical rightbelow new' call plug#begin(s:bundle_dir) Plug 'jonathanfilip/vim-lucius' Plug 'arcticicestudio/nord-vim' Plug 'mhartington/oceanic-next' Plug 'joshdick/onedark.vim' Plug 'AndrewRadev/splitjoin.vim' Plug 'chrisbra/unicode.vim', {'on': ['UnicodeName', 'UnicodeTable']} Plug 'godlygeek/csapprox', {'for': 'fugitiveblame' } Plug 'junegunn/fzf', has('win32') ? {} : {'on': 'FZF', 'dir': '~/local/fzf', 'do': './install --bin'} Plug 'junegunn/vim-easy-align', {'on': '(LiveEasyAlign)'} Plug 'junegunn/vim-plug' Plug 'tpope/vim-commentary' Plug 'tpope/vim-endwise' Plug 'tpope/vim-fugitive' Plug 'tpope/vim-repeat' Plug 'tpope/vim-rhubarb' Plug 'tpope/vim-rsi' Plug 'tpope/vim-scriptease' Plug 'tpope/vim-surround' if has('nvim-0.5') Plug 'neovim/nvim-lspconfig' Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} Plug 'nvim-treesitter/nvim-treesitter-refactor' Plug 'nvim-treesitter/nvim-treesitter-textobjects' Plug 'nvim-treesitter/playground' Plug 'norcalli/nvim-colorizer.lua' Plug 'nvim-lua/plenary.nvim' Plug 'nvim-telescope/telescope.nvim' Plug 'mhinz/telescope-spotlight.nvim' Plug 'bfredl/luarefvim' Plug 'phaazon/hop.nvim' endif let g:plug_url_format = 'git@github.com:%s.git' Plug 'mhinz/vim-crates' Plug 'mhinz/vim-grepper' Plug 'mhinz/vim-halo' Plug 'mhinz/vim-janah' Plug 'mhinz/vim-lookup' Plug 'mhinz/vim-mix-format' Plug 'mhinz/vim-rfc' Plug 'mhinz/vim-sayonara', {'on': 'Sayonara'} Plug 'mhinz/vim-signify' Plug 'mhinz/vim-startify' Plug 'mhinz/vim-tree' unlet! g:plug_url_format call plug#end() if has('nvim-0.5') lua require 'config' lua require 'tree' endif " Init {{{1 if has('nvim') let $GIT_EDITOR = 'nvr -cc split --remote-wait' let $ELIXIR_EDITOR = 'nvr -l +__LINE__ __FILE__' if v:progpath =~# 'build/bin/nvim$' " for build/runtime/syntax/vim/generated.vim let &runtimepath .= ','.$VIM.'/build/runtime' endif else filetype plugin indent on syntax on packadd! matchit endif let g:vimsyn_embed = 'l' let g:vimsyn_folding = 'f' let g:is_bash = 1 let g:lisp_rainbow = 1 let g:markdown_fenced_languages = ['vim'] let g:loaded_2html_plugin = 1 let g:loaded_getscriptPlugin = 1 let g:loaded_gzip = 1 let g:loaded_logipat = 1 " let g:loaded_matchit = 1 " let g:loaded_matchparen = 1 let g:loaded_rrhelper = 1 let g:loaded_spellfile_plugin = 1 let g:loaded_tarPlugin = 1 let g:loaded_vimballPlugin = 1 let g:loaded_zipPlugin = 1 augroup vimrc autocmd! augroup END " Option {{{1 " indent settings set autoindent set cinoptions =l1,p0,)50,*50,t0 set expandtab set smarttab set softtabstop =2 set shiftwidth =2 set shiftround " backup/swap/info/undo settings set nobackup set nowritebackup set undofile set swapfile if has('nvim') set backupdir -=. set shada ='100 else set backupdir =$v/files/backup set directory =$v/files/swap// set undodir =$v/files/undo set viewdir =$v/files/view set viminfo ='100,n$v/files/info/viminfo endif " better navigation set cursorline set foldmethod =marker set foldopen -=hor set foldopen +=jump set foldtext =mhi#foldy() set hlsearch set incsearch set mouse =a set scrolloff =4 set sidescroll =5 set ignorecase set smartcase set tagcase =match " misc settings set autoread set backspace =indent,eol,start set clipboard =unnamed set complete -=i set completeopt +=noselect set diffopt +=vertical,foldcolumn:0,indent-heuristic,algorithm:patience set fileformats =unix,dos,mac set hidden set history =1000 set lazyredraw set more set mousemodel =popup set noautowrite set noautowriteall set noequalalways set noerrorbells set nofsync set nojoinspaces set wrapscan set nrformats =hex set pastetoggle = set norelativenumber set report =0 set sessionoptions-=options set sessionoptions+=localoptions set showfulltag set showtabline =1 set splitbelow set splitright set switchbuf = set synmaxcol =200 set tags ^=./.git/tags; set timeout set timeoutlen =1000 set titlestring =VIM:\ %f set ttimeout set ttimeoutlen =10 set ttyfast set virtualedit =onemore,block set whichwrap =h,l " wild stuff set suffixes +=.a,.1,.class set wildignore +=*.o,*.so,*.zip,*.png set wildmenu set wildoptions =tagfile if has('nvim') set wildoptions+=pum else set wildmode=list:longest,full endif " display settings set display +=lastline set laststatus =2 set list set modeline set modelines =1 set nostartofline set numberwidth =1 set ruler set shortmess =aoOTI set showcmd set showmatch set showmode " spelling set spellfile =~/.vim/spell/en.utf-8.add,~/.vim/spell/de.utf-8.add set spelllang =en,de " breaking set wrap set nolinebreak set breakindent set breakindentopt=min:40 "set highlight +=@:SpecialKey set cpoptions =aABcefFqsZ set formatoptions =tcrqnj if has('multi_byte') && &encoding ==# 'utf-8' let &listchars = 'tab:▸ ,extends:❯,precedes:❮,nbsp:±,trail:⣿' let &fillchars = 'vert: ,diff: ' " ▚ let &showbreak = '↪ ' highlight VertSplit ctermfg=242 " augroup vimrc " autocmd InsertEnter * set listchars-=trail:⣿ " autocmd InsertLeave * set listchars+=trail:⣿ " augroup END else let &listchars = 'tab:> ,extends:>,precedes:<,nbsp:.' let &fillchars = 'vert: ,stlnc:#' let &showbreak = '-> ' augroup vimrc autocmd InsertEnter * set listchars-=trail:. autocmd InsertLeave * set listchars+=trail:. augroup END endif if has('nvim') set signcolumn=auto:2 endif " Mapping {{{1 let mapleader = ';' nnoremap \ ; inoremap jf nnoremap gh :call mhi#github_open_issue() nnoremap gH :call mhi#github_open_slug() inoremap mhi#tab_yeah() inoremap mhi#close_bracket() nnoremap w:call halo#run() nnoremap :call mhi#switch_buffer('bprevious') nnoremap :call mhi#switch_buffer('bnext') nnoremap [b :call mhi#switch_buffer('bprevious') nnoremap ]b :call mhi#switch_buffer('bnext') nnoremap [q :cpreviouscall halo#run() nnoremap ]q :cnextcall halo#run() nnoremap [l :lpreviouscall halo#run() nnoremap ]l :lnextcall halo#run() nnoremap [t :tabpreviouscall halo#run() nnoremap ]t :tabnextcall halo#run() nnoremap [ :put! =repeat(nr2char(10), v:count1)'[ nnoremap ] :put =repeat(nr2char(10), v:count1) nnoremap [e :execute 'move -1-'. v:count1 nnoremap ]e :execute 'move +'. v:count1 " switch comma-separated arguments nnoremap [w :normal F,h]w2w nnoremap ]w :let s=&isk \| setl isk+=\",' \| exe "norm diwmmebgPdw'mP" \| let &isk=s nnoremap } }zz nnoremap { {zz nnoremap ]] ]]zz nnoremap [[ [[zz nnoremap [] []zz nnoremap ][ ][zz nnoremap g; g;zvzz nnoremap g, g,zvzz nnoremap > nnoremap < nnoremap - nnoremap + nnoremap :call mhi#tmux_navigate('h') nnoremap :call mhi#tmux_navigate('j') nnoremap :call mhi#tmux_navigate('k') nnoremap :call mhi#tmux_navigate('l') xnoremap < >gv onoremap gv :normal! gv nnoremap Q gqap nnoremap ev :edit $MYVIMRC nnoremap em :edit ~/.vim/autoload/mhi.vim nnoremap si :echo mhi#syninfo() nnoremap ss :echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') nnoremap m :Messages nnoremap M :='let @'. v:register .' = '. string(getreg(v:register)) " nnoremap o :!echo `git url`/blob/`git rev-parse --abbrev-ref HEAD`/%\#L=line('.') \| xargs open nnoremap o :silent !open =fnameescape('') nnoremap w :update nnoremap x :xit nnoremap l :nohdiffupdatecall clearmatches()syntax sync fromstart nnoremap v :Runtime nnoremap t :Tree nnoremap d :Dirview " nnoremap d :exe 'sil !open' fnameescape(printf('https://devdocs.io/#q=%s%%20%s', &ft, expand(''))) nnoremap b :call mhi#git_blame_current_line() nnoremap ' ` nnoremap ` ' nnoremap nnoremap :call mhi#jump() cnoremap wildmenumode() ? "\" : "\" cnoremap wildmenumode() ? "\" : "\" cnoremap r $VIMRUNTIME/ cnoremap ft ~/.vim/after/ftplugin/ nnoremap n :call mhi#search_highlight_next_match('Nn'[v:searchforward]) nnoremap N :call mhi#search_highlight_next_match('nN'[v:searchforward]) xnoremap * :call mhi#search()// xnoremap # :call mhi#search()?? if has('nvim') nnoremap T :vsplit +terminal tnoremap tnoremap :call mhi#tmux_navigate('h') tnoremap :call mhi#tmux_navigate('j') tnoremap :call mhi#tmux_navigate('k') tnoremap :call mhi#tmux_navigate('l') endif if !has('nvim') if empty($TMUX) let &t_SI = "\]50;CursorShape=1\x7" let &t_EI = "\]50;CursorShape=0\x7" let &t_SR = "\]50;CursorShape=2\x7" else let &t_SI = "\Ptmux;\\]50;CursorShape=1\x7\\\" let &t_EI = "\Ptmux;\\]50;CursorShape=0\x7\\\" let &t_SR = "\Ptmux;\\]50;CursorShape=2\x7\\\" endif endif " Autocmd {{{1 augroup vimrc " foldopen=hor sucks autocmd BufWinEnter * normal! zvzz if has('nvim') autocmd TermOpen,BufEnter term://* startinsert endif autocmd BufReadPost * \ if line("'\"") > 1 && line("'\"") <= line("$") | \ execute 'normal! g`"' | \ endif autocmd WinEnter * set cursorline autocmd WinLeave * set nocursorline autocmd InsertEnter * set nocursorline autocmd InsertLeave * set cursorline autocmd FocusGained * call halo#run() autocmd CompleteDone * pclose augroup END " Command {{{1 command! -nargs=1 -complete=command Scratch call mhi#scratch() command! CleanSpell runtime! spell/cleanadd.vim command! Cd call mhi#cd() command! -range Evo call mhi#git_log_evolution(, , expand('%')) command! Changed exe 'args' join(map(systemlist('git diff --name-only --relative "$@" 2>/dev/null'), 'fnameescape(v:val)')) command! -nargs=1 -bang T call mhi#terminal(0, , ) command! Signs PP sign_getplaced('.', {'lnum': line('.'), 'group': '*'}) if has('nvim') command! LuaG lua print(vim.inspect(_G)) command! LspClients lua print(vim.inspect(vim.lsp.buf_get_clients())) endif " Color {{{1 function! s:colors_default() abort " highlight Comment cterm=italic highlight link User1 StatusLine " master branch highlight link User2 StatusLine " other branch highlight link User3 StatusLine " separators highlight link User4 StatusLine " filename at beginning highlight link User5 StatusLine " ~changes " highlight SignifySignAdd ctermfg=151 ctermbg=NONE cterm=NONE " highlight SignifySignDelete ctermfg=181 ctermbg=NONE cterm=NONE " highlight SignifySignChange ctermfg=187 ctermbg=NONE cterm=NONE " highlight Halo guifg=white guibg=#F92672 ctermfg=white ctermbg=197 endfunction function! s:colors_fnord() abort highlight link StartifyPath Identifier highlight link StartifyFile Directory endfunction function! s:colors_janah() abort highlight User1 ctermfg=192 ctermbg=237 cterm=NONE highlight User2 ctermfg=167 ctermbg=237 cterm=NONE highlight User3 ctermfg=245 ctermbg=237 cterm=NONE highlight User4 ctermfg=215 ctermbg=237 cterm=NONE highlight User5 ctermfg=111 ctermbg=237 cterm=NONE endfunction function! s:colors_lucius() abort if &background ==# 'light' highlight Normal ctermbg=NONE guibg=NONE highlight CursorLine ctermbg=255 highlight User1 ctermfg=84 ctermbg=237 cterm=NONE highlight User2 ctermfg=222 ctermbg=237 cterm=NONE highlight User3 ctermfg=237 ctermbg=237 cterm=NONE highlight User4 ctermfg=255 ctermbg=237 cterm=NONE highlight User5 ctermfg=255 ctermbg=237 cterm=NONE highlight StatusLine ctermbg=237 cterm=NONE highlight SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE highlight Question ctermfg=24 ctermbg=255 cterm=NONE highlight Search ctermfg=fg ctermbg=222 cterm=NONE highlight Folded ctermbg=253 cterm=NONE " highlight NormalFloat ctermfg=231 ctermbg=240 cterm=NONE highlight NormalFloat ctermfg=0 ctermbg=223 cterm=NONE highlight DirviewArchive ctermfg=31 highlight DirviewDirectory ctermfg=88 highlight DirviewImage ctermfg=29 highlight DirviewVideo ctermfg=115 endif endfunction augroup vimrc autocmd ColorScheme * call s:colors_default() autocmd ColorScheme janah call s:colors_janah() autocmd ColorScheme lucius call s:colors_lucius() autocmd ColorScheme fnord call s:colors_fnord() augroup END if has('gui_running') set background=light colorscheme lucius set guioptions=a set mousehide if s:is_win autocmd GUIEnter * simalt ~x let &guifont = 'Consolas:h10:b' elseif has('gui_macvim') set macmeta let &guifont = 'Source Code Pro:h13' endif command! Bigger let &guifont = substitute(&guifont, '\d\+', '\=submatch(0)+1', '') command! Smaller let &guifont = substitute(&guifont, '\d\+', '\=submatch(0)-1', '') else set termguicolors if !has('nvim') let &t_8f = "\[38:2:%lu:%lu:%lum" let &t_8b = "\[48:2:%lu:%lu:%lum" endif if $TERM =~ 'alacritty' set background=dark color janah highlight Normal ctermbg=236 elseif $ITERM_PROFILE == 'Light' set background=light colorscheme lucius else set background=dark colorscheme fnord endif endif " Statusline {{{1 command! -bar ToggleStatusline let b:stl_location = !get(b:, 'stl_location') command! -bar ToggleHighlight let b:stl_highlight = !get(b:, 'stl_highlight') nnoremap :ToggleStatusline nnoremap :ToggleHighlight set statusline=%!SetStatusline() function! SetStatusline() let stl = ' %4*%<%f%*' if exists('b:git_dir') let stl .= '%3*:%*' let branch = fugitive#head(8) let stl .= ((branch =~# 'master\|main') ? '%1*' : '%2*'). branch .'%*' let stl .= mhi#sy_stats_wrapper() endif let stl .= '%m%r%h%w ' " right side let stl .= \ '%= ' \ . '%#ErrorMsg#%{&paste ? " paste " : ""}%*' \ . '%#WarningMsg#%{&ff != "unix" ? " ".&ff." ":""}%* ' \ . '%#warningmsg#%{&fenc != "utf-8" && &fenc != "" ? " ".&fenc." " :""}%* ' if get(b:, 'stl_highlight') let id = synID(line('.'), col('.'), 1) let stl .= \ '%#WarningMsg#[' \ . '%{synIDattr('.id.',"name")} as ' \ . '%{synIDattr(synIDtrans('.id.'),"name")}' \ . ']%* ' endif if get(b:, 'stl_location') let stl .= \ '%3*[%*%v%3*,%*%l%3*/%*%L%3*]%* ' \ . '%p%3*%%%* ' endif return stl endfunction " }}}1 " Plugin {{{1 " Plugin: fzf {{{2 set runtimepath+=~/local/fzf let g:fzf_layout = {'down': '40%'} nnoremap :Buffers nnoremap C :Colorschemes nnoremap P :Plugins nnoremap S :Scriptnames nnoremap f :FZF function! s:buflist() return map(filter(range(1, bufnr('$')), \ 'bufloaded(v:val)'), 'printf("%s: %s", v:val, bufname(v:val))') endfunction function! s:bufopen(lines) if len(a:lines) < 2 | return | endif let cmd = get({ \ 'ctrl-s': 'split', \ 'ctrl-v': 'vsplit', \ 'ctrl-t': 'tabedit' \ }, a:lines[0], 'edit') execute cmd '+b'.matchstr(a:lines[1], '^\d\+') endfunction function! s:plugopen(entry) execute 'Dirvish' expand(s:bundle_dir) .'/'. a:entry execute 'lcd' expand('%') endfunction command! Buffers let bl = reverse(s:buflist()) | call fzf#run({ \ 'source': bl, \ 'sink*': function('bufopen'), \ 'options': '+m --expect=ctrl-s,ctrl-v,ctrl-t', \ 'down': len(bl) + 2, \ }) | unlet bl command! Plugins call fzf#run({ \ 'source': reverse(sort(map(globpath(s:bundle_dir, '*', 0, 1), 'fnamemodify(v:val, ":t")'))), \ 'sink': function('plugopen'), \ 'options': '+m', \ 'left': 30 \ }) command! Colorschemes call fzf#run({ \ 'source': reverse(sort(map(globpath(&rtp, 'colors/*.vim', 0, 1), 'fnamemodify(v:val, ":t:r")'))), \ 'sink': 'colorscheme', \ 'options': '+m', \ 'left': 30 \ }) " Plugin: netrw {{{2 " let g:loaded_netrwPlugin = 1 let g:netrw_banner = 0 let g:netrw_bufsettings = 'relativenumber' let g:netrw_keepdir = 0 let g:netrw_liststyle = 1 let g:netrw_sort_options = 'i' " Plugin: surround {{{2 let g:surround_indent = 1 let g:surround_{char2nr('k')} = "\r" " Plugin: tagbar {{{2 nnoremap :TagbarToggle let g:tagbar_width = 40 let g:tagbar_autoclose = 0 let g:tagbar_autofocus = 1 let g:tagbar_compact = 1 " Plugin: vim-easy-align {{{2 xmap (LiveEasyAlign) " Plugin: vim-grepper {{{2 nnoremap g :Grepper nmap gs (GrepperOperator) xmap gs (GrepperOperator) highlight GrepperSideFile ctermfg=161 cterm=reverse highlight Conceal ctermfg=NONE ctermbg=250 let g:grepper = {} let g:grepper.dir = 'repo,filecwd' let g:grepper.tools = ['git', 'rg', 'rubocop'] let g:grepper.rubocop = { \ 'grepprg': 'rubocop -femacs', \ 'grepformat': '%f:%l:%c: %t: %m' } command! Todo Grepper -noprompt -tool rg -query '(TODO|FIX|FIXME|XXX|NOTE|HACK|OPTIMIZE):' " Plugin: vim-sayonara {{{2 nnoremap q :Sayonara nnoremap Q :Sayonara! let g:sayonara_confirm_quit = 0 " Plugin: vim-startify {{{2 nnoremap st :Startify let g:startify_change_to_dir = 0 " let g:startify_custom_header = 'startify#pad(startify#fortune#boxed())' let g:startify_enable_special = 0 let g:startify_fortune_use_unicode = 1 let g:startify_update_oldfiles = 1 let g:startify_use_env = 1 " Filetype {{{1 augroup vimrc " Filetype: Assembly {{{2 let g:asmsyntax = 'nasm' " vim-commentary uses 'commentstring', not 'comments' autocmd FileType nasm let &commentstring = '; %s' " Filetype: C {{{2 autocmd FileType c,cpp setl com=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/ autocmd BufLeave *.{c,cpp} mark C autocmd BufLeave *.h mark H " Filetype: cmake {{{2 autocmd FileType cmake setlocal commentstring=#\ %s " Filetype: crontab {{{2 autocmd FileType crontab setlocal nobackup nowritebackup " Filetype: Erlang {{{2 autocmd FileType erlang setl com-=:% " Filetype: Go {{{2 let g:go_bin_path = $v.'/vendor/go' let g:go_fmt_command = 'goimports' let g:gofmt_on_save = 0 autocmd FileType go setlocal noet sts& sw& com-=:// isk-=. lcs+=tab:\ \ " Filetype: Help {{{2 autocmd FileType help \ setl noet \| execute 'silent wincmd' 'TL'[winnr('$') == 2] " Filetype: HTML {{{2 autocmd FileType html setl et sts=2 sw=2 " Filetype: Lua {{{2 autocmd FileType lua setl com-=:# sts=2 sw=2 " Filetype: Perl {{{2 let perl_include_pod = 1 autocmd FileType perl \ setlocal com-=:# kp=perldoc\ -f \| compiler perl autocmd BufRead,BufNewFile *.html.ep{,l} set ft=html.epl " Filetype: Python {{{2 let python_highlight_all = 1 autocmd FileType python \ setlocal kp=pydoc mp=./% \| compiler pyunit " Filetype: Ruby {{{2 let g:ruby_operators = 1 let g:ruby_space_errors = 1 let g:rubycomplete_buffer_loading = 1 let g:rubycomplete_classes_in_global = 1 let g:rubycomplete_rails = 1 function! s:ruby() command! -buffer -bang Rubocop exe 'Grepper -tool rubocop -noprompt' ['-buffer',''][0] command! -buffer -nargs=* -bang Rspec exe ' T clear; bundle exec rspec ' expand('%:p').['', ':'.line('.')][0] nnoremap rs :vertical Rspec! endfunction autocmd BufNewFile *.rb call append(0, ['#!/usr/bin/env ruby', '']) autocmd FileType ruby call s:ruby() " -> after/ftplugin/ruby.vim " Filetype: Rust {{{2 if has('nvim') autocmd BufRead Cargo.toml call crates#toggle() endif " Filetype: Sh, Zsh {{{2 au FileType zsh,sh setl com-=:# sts=4 sw=4 \| com! -buffer Lint Grepper -noprompt -buffer -grepprg shellcheck -fgcc " Filetype: Text, Mail, Markdown {{{2 let g:instant_markdown_autostart = 0 let g:instant_markdown_slow = 1 autocmd FileType mail setl tw=72 wrap lbr autocmd FileType markdown setl tw=80 mp=gomali\ % autocmd FileType text setl tw=80 fo+=t " Filetype: VCS {{{2 autocmd FileType git,gitcommit setl tw=80 fo+=t " fugitive autocmd BufReadPost fugitive:// setlocal bufhidden=delete autocmd FileType fugitiveblame nmap q gq autocmd User fugitive \ if get(b:, 'fugitive_type', '') =~# '\v^%(tree|blob)$' \| nnoremap .. :edit %:h \| endif " signify let g:signify_sign_show_text = 1 let g:signify_sign_add = '▊' let g:signify_sign_change = '▊' let g:signify_sign_delete = '▊' omap ic (signify-motion-inner-pending) xmap ic (signify-motion-inner-visual) omap ac (signify-motion-outer-pending) xmap ac (signify-motion-outer-visual) nnoremap p :SignifyHunkDiff nnoremap u :SignifyHunkUndo autocmd User SignifyAutocmds autocmd! signify CursorHold,CursorHoldI " Filetype: Vim, Vader {{{2 autocmd FileType vim nnoremap :call lookup#pop()call halo#run() autocmd FileType vim setl sts=2 sw=2 isk-=# " }}}2 augroup END " }}}1 if filereadable($v.'/magic.vim') source $v/magic.vim endif " vim: sw=2 sts=2 tw=0 fdm=marker ================================================ FILE: .weechat/weechat.conf ================================================ # # weechat -- weechat.conf # # WARNING: It is NOT recommended to edit this file by hand, # especially if WeeChat is running. # # Use /set or similar command to change settings in WeeChat. # # For more info, see: https://weechat.org/doc/quickstart # [debug] [startup] command_after_plugins = "" command_before_plugins = "" display_logo = on display_version = on sys_rlimit = "" [look] align_end_of_lines = message align_multiline_words = on bar_more_down = "++" bar_more_left = "<<" bar_more_right = ">>" bar_more_up = "--" bare_display_exit_on_input = on bare_display_time_format = "%H:%M" buffer_auto_renumber = on buffer_notify_default = all buffer_position = end buffer_search_case_sensitive = off buffer_search_force_default = off buffer_search_regex = off buffer_search_where = prefix_message buffer_time_format = "%H:%M" color_basic_force_bold = off color_inactive_buffer = on color_inactive_message = on color_inactive_prefix = on color_inactive_prefix_buffer = on color_inactive_time = off color_inactive_window = on color_nick_offline = off color_pairs_auto_reset = 5 color_real_white = off command_chars = "" command_incomplete = off confirm_quit = off confirm_upgrade = off day_change = on day_change_message_1date = "-- %a, %d %b %Y --" day_change_message_2dates = "-- %%a, %%d %%b %%Y (%a, %d %b %Y) --" eat_newline_glitch = off emphasized_attributes = "" highlight = "" highlight_regex = "" highlight_tags = "" hotlist_add_conditions = "${away} || ${buffer.num_displayed} == 0" hotlist_buffer_separator = ", " hotlist_count_max = 2 hotlist_count_min_msg = 2 hotlist_names_count = 3 hotlist_names_length = 0 hotlist_names_level = 12 hotlist_names_merged_buffers = off hotlist_prefix = "H: " hotlist_remove = merged hotlist_short_names = on hotlist_sort = group_time_asc hotlist_suffix = "" hotlist_unique_numbers = on input_cursor_scroll = 20 input_share = none input_share_overwrite = off input_undo_max = 32 item_away_message = on item_buffer_filter = "*" item_buffer_zoom = "!" item_mouse_status = "M" item_time_format = "%H:%M" jump_current_to_previous_buffer = on jump_previous_buffer_when_closing = on jump_smart_back_to_buffer = on key_bind_safe = on key_grab_delay = 800 mouse = on mouse_timer_delay = 100 nick_color_force = "" nick_color_hash = djb2 nick_color_stop_chars = "_|[" nick_prefix = "" nick_suffix = "" paste_auto_add_newline = on paste_bracketed = on paste_bracketed_timer_delay = 10 paste_max_lines = 1 prefix_action = " *" prefix_align = right prefix_align_max = 0 prefix_align_min = 0 prefix_align_more = "+" prefix_align_more_after = on prefix_buffer_align = right prefix_buffer_align_max = 0 prefix_buffer_align_more = "+" prefix_buffer_align_more_after = on prefix_error = "=!=" prefix_join = "-->" prefix_network = "--" prefix_quit = "<--" prefix_same_nick = "" prefix_suffix = "|" quote_nick_prefix = "<" quote_nick_suffix = ">" quote_time_format = "%H:%M:%S" read_marker = line read_marker_always_show = off read_marker_string = "-" save_config_on_exit = on save_config_with_fsync = off save_layout_on_exit = none scroll_amount = 3 scroll_bottom_after_switch = off scroll_page_percent = 100 search_text_not_found_alert = on separator_horizontal = "-" separator_vertical = "" tab_width = 1 time_format = "%a, %d %b %Y %T" window_auto_zoom = off window_separator_horizontal = on window_separator_vertical = on window_title = "WeeChat ${info:version}" word_chars_highlight = "!\u00A0,-,_,|,alnum" word_chars_input = "!\u00A0,-,_,|,alnum" [palette] [color] bar_more = lightmagenta chat = default chat_bg = default chat_buffer = white chat_channel = red chat_day_change = cyan chat_delimiters = 245 chat_highlight = 231 chat_highlight_bg = 167 chat_host = cyan chat_inactive_buffer = default chat_inactive_window = default chat_nick = lightcyan chat_nick_colors = "27,39,41,71,94,103,111,131,143,181" chat_nick_offline = default chat_nick_offline_highlight = default chat_nick_offline_highlight_bg = blue chat_nick_other = cyan chat_nick_prefix = green chat_nick_self = 63 chat_nick_suffix = green chat_prefix_action = white chat_prefix_buffer = brown chat_prefix_buffer_inactive_buffer = default chat_prefix_error = yellow chat_prefix_join = lightgreen chat_prefix_more = lightmagenta chat_prefix_network = magenta chat_prefix_quit = lightred chat_prefix_suffix = 245 chat_read_marker = 245 chat_read_marker_bg = default chat_server = brown chat_tags = red chat_text_found = yellow chat_text_found_bg = lightmagenta chat_time = 245 chat_time_delimiters = 252 chat_value = cyan chat_value_null = blue emphasized = yellow emphasized_bg = magenta input_actions = lightgreen input_text_not_found = red item_away = yellow nicklist_away = cyan nicklist_group = green separator = 245 status_count_highlight = magenta status_count_msg = brown status_count_other = 245 status_count_private = green status_data_highlight = lightmagenta status_data_msg = yellow status_data_other = 245 status_data_private = lightgreen status_filter = green status_more = yellow status_mouse = green status_name = white status_name_ssl = lightgreen status_nicklist_count = 245 status_number = yellow status_time = 245 [completion] base_word_until_cursor = on command_inline = on default_template = "%(nicks)|%(irc_channels)" nick_add_space = on nick_case_sensitive = off nick_completer = ":" nick_first_only = off nick_ignore_chars = "[]`_-^" partial_completion_alert = on partial_completion_command = off partial_completion_command_arg = off partial_completion_count = on partial_completion_other = off partial_completion_templates = "config_options" [history] display_default = 5 max_buffer_lines_minutes = 0 max_buffer_lines_number = 4096 max_commands = 100 max_visited_buffers = 50 [proxy] [network] connection_timeout = 60 gnutls_ca_file = "/etc/ssl/certs/ca-certificates.crt" gnutls_handshake_timeout = 30 proxy_curl = "" [plugin] autoload = "*,!xfer,!perl,!ruby,!python,!aspell" debug = off extension = ".so,.dll" path = "%h/plugins" save_config_on_unload = on [bar] buflist.color_bg = default buflist.color_delim = default buflist.color_fg = default buflist.conditions = "" buflist.filling_left_right = vertical buflist.filling_top_bottom = columns_vertical buflist.hidden = off buflist.items = "buflist" buflist.position = left buflist.priority = 0 buflist.separator = on buflist.size = 0 buflist.size_max = 0 buflist.type = root fset.color_bg = default fset.color_delim = cyan fset.color_fg = default fset.conditions = "${buffer.full_name} == fset.fset" fset.filling_left_right = vertical fset.filling_top_bottom = horizontal fset.hidden = off fset.items = "fset" fset.position = top fset.priority = 0 fset.separator = on fset.size = 3 fset.size_max = 3 fset.type = window input.color_bg = default input.color_delim = 245 input.color_fg = default input.conditions = "" input.filling_left_right = vertical input.filling_top_bottom = horizontal input.hidden = off input.items = "[input_prompt]+(away),[input_search],[input_paste],input_text" input.position = bottom input.priority = 1000 input.separator = off input.size = 1 input.size_max = 0 input.type = window nicklist.color_bg = default nicklist.color_delim = cyan nicklist.color_fg = 245 nicklist.conditions = "${nicklist}" nicklist.filling_left_right = vertical nicklist.filling_top_bottom = columns_vertical nicklist.hidden = on nicklist.items = "buffer_nicklist" nicklist.position = right nicklist.priority = 200 nicklist.separator = on nicklist.size = 0 nicklist.size_max = 0 nicklist.type = window status.color_bg = black status.color_delim = 241 status.color_fg = 231 status.conditions = "" status.filling_left_right = vertical status.filling_top_bottom = horizontal status.hidden = off status.items = "buffer_plugin> +buffer_name +buffer_modes +buffer_zoom,scroll,[lag],completion" status.position = bottom status.priority = 500 status.separator = off status.size = 1 status.size_max = 0 status.type = window title.color_bg = black title.color_delim = cyan title.color_fg = 231 title.conditions = "" title.filling_left_right = vertical title.filling_top_bottom = horizontal title.hidden = off title.items = "buffer_title" title.position = top title.priority = 500 title.separator = off title.size = 1 title.size_max = 0 title.type = window [layout] [notify] [filter] irc_smart = on;*;irc_smart_filter;* [key] ctrl-? = "/input delete_previous_char" ctrl-A = "/input move_beginning_of_line" ctrl-B = "/input move_previous_char" ctrl-C_ = "/input insert \x1F" ctrl-Cb = "/input insert \x02" ctrl-Cc = "/input insert \x03" ctrl-Ci = "/input insert \x1D" ctrl-Co = "/input insert \x0F" ctrl-Cv = "/input insert \x16" ctrl-D = "/input delete_next_char" ctrl-E = "/input move_end_of_line" ctrl-F = "/input move_next_char" ctrl-H = "/input delete_previous_char" ctrl-I = "/input complete_next" ctrl-J = "/input return" ctrl-K = "/input delete_end_of_line" ctrl-L = "/window refresh" ctrl-M = "/input return" ctrl-N = "/buffer +1" ctrl-P = "/buffer -1" ctrl-R = "/input search_text_here" ctrl-Sctrl-U = "/input set_unread" ctrl-T = "/input transpose_chars" ctrl-U = "/input delete_beginning_of_line" ctrl-W = "/input delete_previous_word" ctrl-X = "/input switch_active_buffer" ctrl-Y = "/input clipboard_paste" meta-meta-OP = "/bar scroll buflist * b" meta-meta-OQ = "/bar scroll buflist * e" meta-meta2-11~ = "/bar scroll buflist * b" meta-meta2-12~ = "/bar scroll buflist * e" meta-meta2-1~ = "/window scroll_top" meta-meta2-23~ = "/bar scroll nicklist * b" meta-meta2-24~ = "/bar scroll nicklist * e" meta-meta2-4~ = "/window scroll_bottom" meta-meta2-5~ = "/window scroll_up" meta-meta2-6~ = "/window scroll_down" meta-meta2-7~ = "/window scroll_top" meta-meta2-8~ = "/window scroll_bottom" meta-meta2-A = "/buffer -1" meta-meta2-B = "/buffer +1" meta-meta2-C = "/buffer +1" meta-meta2-D = "/buffer -1" meta-- = "/filter toggle @" meta-/ = "/input jump_last_buffer_displayed" meta-0 = "/buffer *10" meta-1 = "/buffer *1" meta-2 = "/buffer *2" meta-3 = "/buffer *3" meta-4 = "/buffer *4" meta-5 = "/buffer *5" meta-6 = "/buffer *6" meta-7 = "/buffer *7" meta-8 = "/buffer *8" meta-9 = "/buffer *9" meta-< = "/input jump_previously_visited_buffer" meta-= = "/filter toggle" meta-> = "/input jump_next_visited_buffer" meta-OA = "/input history_global_previous" meta-OB = "/input history_global_next" meta-OC = "/input move_next_word" meta-OD = "/input move_previous_word" meta-OF = "/input move_end_of_line" meta-OH = "/input move_beginning_of_line" meta-OP = "/bar scroll buflist * -100%" meta-OQ = "/bar scroll buflist * +100%" meta-Oa = "/input history_global_previous" meta-Ob = "/input history_global_next" meta-Oc = "/input move_next_word" meta-Od = "/input move_previous_word" meta2-11^ = "/bar scroll buflist * -100%" meta2-11~ = "/bar scroll buflist * -100%" meta2-12^ = "/bar scroll buflist * +100%" meta2-12~ = "/bar scroll buflist * +100%" meta2-15~ = "/buffer -1" meta2-17~ = "/buffer +1" meta2-18~ = "/window -1" meta2-19~ = "/window +1" meta2-1;3A = "/buffer -1" meta2-1;3B = "/buffer +1" meta2-1;3C = "/buffer +1" meta2-1;3D = "/buffer -1" meta2-1;3F = "/window scroll_bottom" meta2-1;3H = "/window scroll_top" meta2-1;3P = "/bar scroll buflist * b" meta2-1;3Q = "/bar scroll buflist * e" meta2-1;5A = "/input history_global_previous" meta2-1;5B = "/input history_global_next" meta2-1;5C = "/input move_next_word" meta2-1;5D = "/input move_previous_word" meta2-1;5P = "/bar scroll buflist * -100%" meta2-1;5Q = "/bar scroll buflist * +100%" meta2-1~ = "/input move_beginning_of_line" meta2-200~ = "/input paste_start" meta2-201~ = "/input paste_stop" meta2-20~ = "/bar scroll title * -30%" meta2-21~ = "/bar scroll title * +30%" meta2-23;3~ = "/bar scroll nicklist * b" meta2-23~ = "/bar scroll nicklist * -100%" meta2-24;3~ = "/bar scroll nicklist * e" meta2-24~ = "/bar scroll nicklist * +100%" meta2-3~ = "/input delete_next_char" meta2-4~ = "/input move_end_of_line" meta2-5;3~ = "/window scroll_up" meta2-5~ = "/window page_up" meta2-6;3~ = "/window scroll_down" meta2-6~ = "/window page_down" meta2-7~ = "/input move_beginning_of_line" meta2-8~ = "/input move_end_of_line" meta2-A = "/input history_previous" meta2-B = "/input history_next" meta2-C = "/input move_next_char" meta2-D = "/input move_previous_char" meta2-F = "/input move_end_of_line" meta2-G = "/window page_down" meta2-H = "/input move_beginning_of_line" meta2-I = "/window page_up" meta2-Z = "/input complete_previous" meta2-[E = "/buffer -1" meta-_ = "/input redo" meta-a = "/input jump_smart" meta-b = "/input move_previous_word" meta-d = "/input delete_next_word" meta-f = "/input move_next_word" meta-h = "/input hotlist_clear" meta-jmeta-f = "/buffer -" meta-jmeta-l = "/buffer +" meta-jmeta-r = "/server raw" meta-jmeta-s = "/server jump" meta-j01 = "/buffer *1" meta-j02 = "/buffer *2" meta-j03 = "/buffer *3" meta-j04 = "/buffer *4" meta-j05 = "/buffer *5" meta-j06 = "/buffer *6" meta-j07 = "/buffer *7" meta-j08 = "/buffer *8" meta-j09 = "/buffer *9" meta-j10 = "/buffer *10" meta-j11 = "/buffer *11" meta-j12 = "/buffer *12" meta-j13 = "/buffer *13" meta-j14 = "/buffer *14" meta-j15 = "/buffer *15" meta-j16 = "/buffer *16" meta-j17 = "/buffer *17" meta-j18 = "/buffer *18" meta-j19 = "/buffer *19" meta-j20 = "/buffer *20" meta-j21 = "/buffer *21" meta-j22 = "/buffer *22" meta-j23 = "/buffer *23" meta-j24 = "/buffer *24" meta-j25 = "/buffer *25" meta-j26 = "/buffer *26" meta-j27 = "/buffer *27" meta-j28 = "/buffer *28" meta-j29 = "/buffer *29" meta-j30 = "/buffer *30" meta-j31 = "/buffer *31" meta-j32 = "/buffer *32" meta-j33 = "/buffer *33" meta-j34 = "/buffer *34" meta-j35 = "/buffer *35" meta-j36 = "/buffer *36" meta-j37 = "/buffer *37" meta-j38 = "/buffer *38" meta-j39 = "/buffer *39" meta-j40 = "/buffer *40" meta-j41 = "/buffer *41" meta-j42 = "/buffer *42" meta-j43 = "/buffer *43" meta-j44 = "/buffer *44" meta-j45 = "/buffer *45" meta-j46 = "/buffer *46" meta-j47 = "/buffer *47" meta-j48 = "/buffer *48" meta-j49 = "/buffer *49" meta-j50 = "/buffer *50" meta-j51 = "/buffer *51" meta-j52 = "/buffer *52" meta-j53 = "/buffer *53" meta-j54 = "/buffer *54" meta-j55 = "/buffer *55" meta-j56 = "/buffer *56" meta-j57 = "/buffer *57" meta-j58 = "/buffer *58" meta-j59 = "/buffer *59" meta-j60 = "/buffer *60" meta-j61 = "/buffer *61" meta-j62 = "/buffer *62" meta-j63 = "/buffer *63" meta-j64 = "/buffer *64" meta-j65 = "/buffer *65" meta-j66 = "/buffer *66" meta-j67 = "/buffer *67" meta-j68 = "/buffer *68" meta-j69 = "/buffer *69" meta-j70 = "/buffer *70" meta-j71 = "/buffer *71" meta-j72 = "/buffer *72" meta-j73 = "/buffer *73" meta-j74 = "/buffer *74" meta-j75 = "/buffer *75" meta-j76 = "/buffer *76" meta-j77 = "/buffer *77" meta-j78 = "/buffer *78" meta-j79 = "/buffer *79" meta-j80 = "/buffer *80" meta-j81 = "/buffer *81" meta-j82 = "/buffer *82" meta-j83 = "/buffer *83" meta-j84 = "/buffer *84" meta-j85 = "/buffer *85" meta-j86 = "/buffer *86" meta-j87 = "/buffer *87" meta-j88 = "/buffer *88" meta-j89 = "/buffer *89" meta-j90 = "/buffer *90" meta-j91 = "/buffer *91" meta-j92 = "/buffer *92" meta-j93 = "/buffer *93" meta-j94 = "/buffer *94" meta-j95 = "/buffer *95" meta-j96 = "/buffer *96" meta-j97 = "/buffer *97" meta-j98 = "/buffer *98" meta-j99 = "/buffer *99" meta-k = "/input grab_key_command" meta-l = "/window bare" meta-m = "/mute mouse toggle" meta-n = "/window scroll_next_highlight" meta-p = "/window scroll_previous_highlight" meta-r = "/input delete_line" meta-s = "/mute aspell toggle" meta-u = "/window scroll_unread" meta-wmeta-meta2-A = "/window up" meta-wmeta-meta2-B = "/window down" meta-wmeta-meta2-C = "/window right" meta-wmeta-meta2-D = "/window left" meta-wmeta2-1;3A = "/window up" meta-wmeta2-1;3B = "/window down" meta-wmeta2-1;3C = "/window right" meta-wmeta2-1;3D = "/window left" meta-wmeta-b = "/window balance" meta-wmeta-s = "/window swap" meta-x = "/input zoom_merged_buffer" meta-z = "/window zoom" ctrl-_ = "/input undo" [key_search] ctrl-I = "/input search_switch_where" ctrl-J = "/input search_stop_here" ctrl-M = "/input search_stop_here" ctrl-Q = "/input search_stop" ctrl-R = "/input search_switch_regex" meta2-A = "/input search_previous" meta2-B = "/input search_next" meta-c = "/input search_switch_case" [key_cursor] ctrl-J = "/cursor stop" ctrl-M = "/cursor stop" meta-meta2-A = "/cursor move area_up" meta-meta2-B = "/cursor move area_down" meta-meta2-C = "/cursor move area_right" meta-meta2-D = "/cursor move area_left" meta2-1;3A = "/cursor move area_up" meta2-1;3B = "/cursor move area_down" meta2-1;3C = "/cursor move area_right" meta2-1;3D = "/cursor move area_left" meta2-A = "/cursor move up" meta2-B = "/cursor move down" meta2-C = "/cursor move right" meta2-D = "/cursor move left" @item(buffer_nicklist):K = "/window ${_window_number};/kickban ${nick}" @item(buffer_nicklist):b = "/window ${_window_number};/ban ${nick}" @item(buffer_nicklist):k = "/window ${_window_number};/kick ${nick}" @item(buffer_nicklist):q = "/window ${_window_number};/query ${nick};/cursor stop" @item(buffer_nicklist):w = "/window ${_window_number};/whois ${nick}" @chat:Q = "hsignal:chat_quote_time_prefix_message;/cursor stop" @chat:m = "hsignal:chat_quote_message;/cursor stop" @chat:q = "hsignal:chat_quote_prefix_message;/cursor stop" [key_mouse] @bar(buflist):ctrl-wheeldown = "hsignal:buflist_mouse" @bar(buflist):ctrl-wheelup = "hsignal:buflist_mouse" @bar(input):button2 = "/input grab_mouse_area" @bar(nicklist):button1-gesture-down = "/bar scroll nicklist ${_window_number} +100%" @bar(nicklist):button1-gesture-down-long = "/bar scroll nicklist ${_window_number} e" @bar(nicklist):button1-gesture-up = "/bar scroll nicklist ${_window_number} -100%" @bar(nicklist):button1-gesture-up-long = "/bar scroll nicklist ${_window_number} b" @chat(fset.fset):button1 = "/window ${_window_number};/fset -go ${_chat_line_y}" @chat(fset.fset):button2* = "hsignal:fset_mouse" @chat(fset.fset):wheeldown = "/fset -down 5" @chat(fset.fset):wheelup = "/fset -up 5" @chat(script.scripts):button1 = "/window ${_window_number};/script go ${_chat_line_y}" @chat(script.scripts):button2 = "/window ${_window_number};/script go ${_chat_line_y};/script installremove -q ${script_name_with_extension}" @chat(script.scripts):wheeldown = "/script down 5" @chat(script.scripts):wheelup = "/script up 5" @item(buffer_nicklist):button1 = "/window ${_window_number};/query ${nick}" @item(buffer_nicklist):button1-gesture-left = "/window ${_window_number};/kick ${nick}" @item(buffer_nicklist):button1-gesture-left-long = "/window ${_window_number};/kickban ${nick}" @item(buffer_nicklist):button2 = "/window ${_window_number};/whois ${nick}" @item(buffer_nicklist):button2-gesture-left = "/window ${_window_number};/ban ${nick}" @item(buflist):button1* = "hsignal:buflist_mouse" @item(buflist):button2* = "hsignal:buflist_mouse" @item(buflist2):button1* = "hsignal:buflist_mouse" @item(buflist2):button2* = "hsignal:buflist_mouse" @item(buflist3):button1* = "hsignal:buflist_mouse" @item(buflist3):button2* = "hsignal:buflist_mouse" @bar:wheeldown = "/bar scroll ${_bar_name} ${_window_number} +20%" @bar:wheelup = "/bar scroll ${_bar_name} ${_window_number} -20%" @chat:button1 = "/window ${_window_number}" @chat:button1-gesture-left = "/window ${_window_number};/buffer -1" @chat:button1-gesture-left-long = "/window ${_window_number};/buffer 1" @chat:button1-gesture-right = "/window ${_window_number};/buffer +1" @chat:button1-gesture-right-long = "/window ${_window_number};/input jump_last_buffer" @chat:ctrl-wheeldown = "/window scroll_horiz -window ${_window_number} +10%" @chat:ctrl-wheelup = "/window scroll_horiz -window ${_window_number} -10%" @chat:wheeldown = "/window scroll_down -window ${_window_number}" @chat:wheelup = "/window scroll_up -window ${_window_number}" @*:button3 = "/cursor go ${_x},${_y}" ================================================ FILE: .xinitrc ================================================ #!/bin/sh failsafe="xterm -ls -T failsafe -geometry 80x24-0-0" trap "exec $failsafe" EXIT SIGHUP SIGINT SIGPIPE SIGTERM SIGIO test -r ~/.Xdefaults && xrdb ~/.Xdefaults test -r ~/.Xresources && xrdb ~/.Xresources test -r ~/.Xmodmap && xmodmap ~/.Xmodmap xset b off xset m 2 5 #feh --bg-max /data/pics/wallpapers/github/octowhite.png #feh --bg-max /data/pics/wallpapers/trigonometry.jpg #feh --bg-max /data/pics/wallpapers/fp_is_the_right_way.jpg #feh --bg-max /data/pics/wallpapers/steampunk2.jpg feh --bg-fill /data/pics/wallpapers/haskell.png pgrep urxvtd || urxvtd -f -q -o pgrep ssh-agent || eval $(ssh-agent) && SSH_ASKPASS=ssh-askpass ssh-add < /dev/null autocutsel -selection CLIPBOARD -fork & autocutsel -selection PRIMRARY -fork & # Java Swing fix wmname LG3D while true; do xsetroot -name "$(date +'%d %b %R')" sleep 1m done & exec dwm #xmonad ================================================ FILE: .yarnrc ================================================ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 cache-folder "/Users/mhi/.yarn/cache" disable-self-update-check true global-folder "/Users/mhi/.yarn/global" prefix "/Users/mhi/.yarn" ================================================ FILE: .zsh/.zlogout ================================================ #!/usr/bin/zsh which sudo &>/dev/null && sudo -k clear [[ -n $SSH_CONNECTION ]] && echo -n "Connection closed: "; date ================================================ FILE: .zsh/.zprofile ================================================ # Opposed to Bash, Zsh doesn't source ~/.profile on its own. if [[ -r ~/.profile ]]; then emulate sh -c 'source ~/.profile' else echo 'No ~/.profile found.' fi ================================================ FILE: .zsh/.zshrc ================================================ #!/usr/bin/env zsh if [[ -r ~/.shrc ]]; then source ~/.shrc else echo 'No .shrc found.' fi [[ -d $ZDOTDIR/completion ]] && fpath=($ZDOTDIR/completion $fpath) zmodload -i zsh/complist autoload -Uz compinit && compinit autoload -Uz edit-command-line autoload -Uz run-help bindkey -e umask 077 watch=all logcheck=60 WATCHFMT="%n from %M has %a tty%l at %T %W" alias -g G='| grep -i' alias -g L='| less -r' alias -g N='>/dev/null' alias -g E='2>/dev/null' alias j='ls -lhd -- *(D-/)' alias k='ls -lhX -- *(D-^/)' alias n='ls -lhS -- *(DOL[1,5]^/)' # options {{{1 setopt cdablevars setopt checkjobs setopt completeinword setopt correct setopt globcomplete setopt interactivecomments setopt listpacked setopt longlistjobs setopt menucomplete setopt no_autocd setopt no_beep setopt no_hist_beep setopt no_listrowsfirst setopt no_nomatch setopt no_print_exit_value setopt no_rm_star_silent setopt nohup setopt nolistambiguous setopt nolog setopt notify setopt numericglobsort setopt promptsubst # setopt extendedglob # history {{{1 HISTFILE=~/.zsh/history HISTSIZE=2048 SAVEHIST=2048 setopt append_history setopt bang_hist setopt hist_ignore_all_dups setopt hist_ignore_space setopt hist_reduce_blanks setopt hist_verify setopt inc_append_history # add commands as they're typed setopt share_history # share history between sessions # prompt {{{1 autoload -U colors && colors precmd() { _prompt } SPROMPT="%R -> %r:%f " PROMPT2="+%f " PROMPT3="Select:%f " # bindings {{{1 _zle_backward_kill_word() { LBUFFER="$({ sed -E 's#[^ _/\-]+[ _/\-]+$##' | sed -E 's#[^ _/\-]+$##' } <<< $LBUFFER)" } _zle_ctrl_z() { if [[ $#BUFFER -eq 0 ]]; then BUFFER=fg zle accept-line else zle push-input zle clear-screen fi } _zle_fancy_dot() { local -a split split=( ${=LBUFFER} ) local dir=$split[-1] case $LBUFFER in .) LBUFFER='cd ../' RBUFFER=' && l' [[ -d $dir ]] && zle -M $dir(:a:h) ;; *.) zle self-insert LBUFFER+=/ [[ -d $dir ]] && zle -M $dir(:a:h) ;; *../) zle self-insert zle self-insert LBUFFER+=/ [[ -d $dir ]] && zle -M $dir(:a:h) ;; *) zle self-insert esac } _zle_insert_last_typed_word() { zle insert-last-word -- 0 -1 } _zle_jump_after_first_word() { CURSOR=$#BUFFER[(w)1] } _zle_sudo() { LBUFFER="sudo $LBUFFER" } zle -N _zle_backward_kill_word zle -N _zle_ctrl_z zle -N _zle_fancy_dot zle -N _zle_insert_last_typed_word zle -N _zle_jump_after_first_word zle -N _zle_sudo zle -N edit-command-line bindkey '' up-line-or-search bindkey ' ' up-line-or-search bindkey '' down-line-or-search bindkey '' _zle_backward_kill_word bindkey 'e' edit-command-line bindkey 'm' expand-word bindkey 'n' list-expand bindkey '' _zle_ctrl_z bindkey '.' _zle_fancy_dot bindkey ';f' _zle_jump_after_first_word bindkey ';g' _zle_insert_last_typed_word bindkey ';s' _zle_sudo bindkey -M menuselect 'h' backward-char bindkey -M menuselect 'i' accept-and-menu-complete bindkey -M menuselect 'j' down-line-or-history bindkey -M menuselect 'k' up-line-or-history bindkey -M menuselect 'l' forward-char # completion {{{1 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z} r:|[-_.+,]=** r:|=*' zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} 'ma=01;38;05;255;48;05;161' zstyle ':completion:*:descriptions' format '→ %B%d%b%' zstyle ':completion:*:approximate:*' max-errors '(( reply=($#PREFIX+$#SUFFIX)/3 ))' zstyle ':completion::complete:*' use-cache true zstyle ':completion:*' cache-path ~/.zsh/cache zstyle ':completion:*' verbose true zstyle ':completion:*' menu select=2 zstyle ':completion:*' special-dirs .. zstyle ':completion:*' group-name '' # zstyle ':completion:*:kill:*' command 'ps f -u $USER -wo pid,ppid,state,%cpu,%mem,tty,cmd' # zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' compctl -g '*.class' java compctl -g '*.(c|o|a)': cc gcc compctl -g '*.el' erl erlc compctl -g '*.(hs|hls)' hugs ghci compctl -g '*.java' javac compctl -g '*.pl' perl compctl -g '*.py' python compctl -g '*.rb' ruby compctl -g '*.pdf' acrorad xpdf zathura z compctl -g '*.chm' chmsee c compctl -g '*.djvu' djview compctl -g '*.lyx' lyx compctl -g '*.ps' gs ghostview ps2pdf ps2ascii compctl -g '*.tex' tex latex slitex pdflatex compctl -g '*.dvi' dvips dvipdf xdvi dviselect dvitype compctl -g '*.(bz2|tbz2)' tar bzip2 bunzip2 compctl -g '*.(gz|tgz)' tar gzip gunzip compctl -g '*.pax' pax compctl -g '*.rar' rar unrar compctl -g '*.zip' zip unzip compctl -g '*.(htm|html|php)' firefox iceweasel opera lynx w3m link2 dillo uzbl surf compctl -fg '*.(avi|mp*g|mp4|wmv|ogm|mkv|xvid|divx)' mplayer gmplayer vlc compctl -g '*.(jp*g|gif|xpm|png|bmp)' display gimp feh geeqie fbsetbg compctl -g '*.(mp3|m4a|ogg|au|wav)' cmus cmus-remote xmms cr compctl -g '*.(rar|zip)' unbook _completion_tmux_sessions() { local -a sessions=( ${(f)"$(command tmux list-sessions)"} ) _describe -t sessions '' sessions "$@" } compdef _completion_tmux_sessions tm # }}} command_not_found_handler() { ~/bin/shell_function_missing $* } # http://mika.l3ib.org/code/zsh-functions/backdoor backdoor() { if [[ $1 == -f ]]; then shift local fifo exec {fifo}<>$1 backdoor -i $fifo elif [[ $1 == -i ]]; then shift zle -F $1 backdoor elif [[ $1 == <-> ]]; then local line # can get DoSed by someone writing data without a newline, # but obviously that's the least of your problems if the # other end is not trusted if ! IFS= read -r line <&$1; then zle -F $1 return 1 fi eval $line else echo >&2 "Usage: backdoor -f [fifo]" echo >&2 " backdoor -i [fd]" echo >&2 echo >&2 "Will read lines from given fifo and eval them in the zle -F context" echo >&2 "You can also attach it to an fd yourself with backdoor -i fd, and" echo >&2 "it will run all lines read from FD." fi } # vim: fdm=marker ================================================ FILE: .zsh/completion/_mix ================================================ #compdef mix _arguments \ '1:task names:->tasks' \ '*:task arguments:->arguments' local candidates case $state in tasks) candidates=(${(f)"$(mix help | tail -n+2 | grep '^mix ' | cut -b5-)"}) candidates=(${candidates/ *\# /:}) _describe 'tasks' candidates return esac case $words[2] in archive.install) case $words[3] in hex) if [[ -z $words[4] ]]; then _message 'enter query for searching remote hex packges' else candidates=(${(f)"$(mix hex.search $words[4] | tail -n+2 | sed 's/ http.*$//')"}) candidates=(${candidates/[[:space:]]##/:}) _describe 'remote hex archives' candidates fi ;; esac ;; archive.uninstall) candidates=(${(f)"$(mix archive | grep '^* ' | cut -b3-)"}) _describe 'local archives' candidates ;; help) candidates=(${(f)"$(mix help | tail -n+2 | grep '^mix ' | cut -b5-)"}) candidates=(${candidates/ *\# /:}) _describe 'tasks' candidates ;; *) _files ;; esac ================================================ FILE: .zsh/dircolors.dark ================================================ # Thanks, https://github.com/trapd00r/LS_COLORS/blob/master/LS_COLORS # core {{{1 BLK 38;5;68 CAPABILITY 38;5;17 CHR 38;5;113;1 DIR 38;5;117;1 DOOR 38;5;127 EXEC 38;5;208;1 FIFO 38;5;126 FILE 0 LINK target MULTIHARDLINK 38;5;222;1 # "NORMAL don't reset the bold attribute - # https://github.com/trapd00r/LS_COLORS/issues/11 #NORMAL 38;5;254 NORMAL 0 ORPHAN 48;5;196;38;5;232;1 OTHER_WRITABLE 38;5;220;1 SETGID 48;5;3;38;5;0 SETUID 38;5;220;1;3;100;1 SOCK 38;5;197 STICKY 38;5;86;48;5;234 STICKY_OTHER_WRITABLE 48;5;235;38;5;139;3 *LS_COLORS 48;5;89;38;5;197;1;3;4;7 # :-) # }}} # documents {{{1 *README 38;5;220;1 *README.rst 38;5;220;1 *README.md 38;5;220;1 *LICENSE 38;5;220;1 *COPYING 38;5;220;1 *INSTALL 38;5;220;1 *COPYRIGHT 38;5;220;1 *AUTHORS 38;5;220;1 *HISTORY 38;5;220;1 *CONTRIBUTORS 38;5;220;1 *PATENTS 38;5;220;1 *VERSION 38;5;220;1 *NOTICE 38;5;220;1 *CHANGES 38;5;220;1 .log 38;5;190 # plain-text {{{2 .txt 38;5;253 # markup {{{2 .adoc 38;5;184 .asciidoc 38;5;184 .etx 38;5;184 .info 38;5;184 .markdown 38;5;184 .md 38;5;184 .mkd 38;5;184 .nfo 38;5;184 .pod 38;5;184 .rst 38;5;184 .tex 38;5;184 .textile 38;5;184 # key-value, non-relational data {{{2 .bib 38;5;178 .json 38;5;178 .jsonl 38;5;178 .jsonnet 38;5;178 .libsonnet 38;5;142 .ndjson 38;5;178 .msg 38;5;178 .pgn 38;5;178 .rss 38;5;178 .xml 38;5;178 .fxml 38;5;178 .toml 38;5;178 .yaml 38;5;178 .yml 38;5;178 .RData 38;5;178 .rdata 38;5;178 .xsd 38;5;178 .dtd 38;5;178 .sgml 38;5;178 .rng 38;5;178 .rnc 38;5;178 # }}} # binary {{{2 .cbr 38;5;141 .cbz 38;5;141 .chm 38;5;141 .djvu 38;5;141 .pdf 38;5;141 .PDF 38;5;141 .mobi 38;5;141 .epub 38;5;141 # words {{{3 .docm 38;5;111;4 .doc 38;5;111 .docx 38;5;111 .odb 38;5;111 .odt 38;5;111 .rtf 38;5;111 # presentation {{{3 .odp 38;5;166 .pps 38;5;166 .ppt 38;5;166 .pptx 38;5;166 # Powerpoint show .ppts 38;5;166 # Powerpoint with enabled macros .pptxm 38;5;166;4 # Powerpoint show with enabled macros .pptsm 38;5;166;4 # spreadsheet {{{3 .csv 38;5;78 .tsv 38;5;78 # Open document spreadsheet .ods 38;5;112 .xla 38;5;76 # Excel spreadsheet .xls 38;5;112 .xlsx 38;5;112 # Excel spreadsheet with macros .xlsxm 38;5;112;4 # Excel module .xltm 38;5;73;4 .xltx 38;5;73 # macOS office suite {{{3 .pages 38;5;111 .numbers 38;5;112 .key 38;5;166 # }}} # }}} # configs {{{2 *config 1 *cfg 1 *conf 1 *rc 1 *authorized_keys 1 *known_hosts 1 .ini 1 .plist 1 # vim .viminfo 1 # cisco VPN client configuration .pcf 1 # adobe photoshop proof settings file .psf 1 # Sublime Text config .hidden-color-scheme 1 .hidden-tmTheme 1 .last-run 1 .merged-ca-bundle 1 .sublime-build 1 .sublime-commands 1 .sublime-keymap 1 .sublime-settings 1 .sublime-snippet 1 .sublime-project 1 .sublime-workspace 1 .tmTheme 1 .user-ca-bundle 1 # eclipse .epf 1 # }}} # }}} # code {{{1 # version control {{{2 .git 38;5;197 .gitignore 38;5;240 .gitattributes 38;5;240 .gitmodules 38;5;240 # shell {{{2 .awk 38;5;172 .bash 38;5;172 .bat 38;5;172 .BAT 38;5;172 .sed 38;5;172 .sh 38;5;172 .zsh 38;5;172 .vim 38;5;172 .kak 38;5;172 # interpreted {{{2 .ahk 38;5;41 # python .py 38;5;41 .ipynb 38;5;41 # ruby .rb 38;5;41 .gemspec 38;5;41 # perl .pl 38;5;208 .PL 38;5;160 .t 38;5;114 # sql .msql 38;5;222 .mysql 38;5;222 .pgsql 38;5;222 .sql 38;5;222 # Tool Command Language .tcl 38;5;64;1 # R language .r 38;5;49 .R 38;5;49 # GrADS script .gs 38;5;81 # Clojure .clj 38;5;41 .cljs 38;5;41 .cljc 38;5;41 # Clojure gorilla REPL worksheet .cljw 38;5;41 # Scala .scala 38;5;41 .sc 38;5;41 # Dart .dart 38;5;51 # compiled {{{2 # # assembly language .asm 38;5;81 # LISP .cl 38;5;81 .lisp 38;5;81 .rkt 38;5;81 # lua .lua 38;5;81 # Moonscript .moon 38;5;81 # C .c 38;5;81 .C 38;5;81 .h 38;5;110 .H 38;5;110 .tcc 38;5;110 # C++ .c++ 38;5;81 .h++ 38;5;110 .hpp 38;5;110 .hxx 38;5;110 .ii 38;5;110 # method file for Objective C .M 38;5;110 .m 38;5;110 # Csharp .cc 38;5;81 .cs 38;5;81 .cp 38;5;81 .cpp 38;5;81 .cxx 38;5;81 # Crystal .cr 38;5;81 # Google golang .go 38;5;81 # fortran .f 38;5;81 .F 38;5;81 .for 38;5;81 .ftn 38;5;81 .f90 38;5;81 .F90 38;5;81 .f95 38;5;81 .F95 38;5;81 .f03 38;5;81 .F03 38;5;81 .f08 38;5;81 .F08 38;5;81 # Nim .nim 38;5;81 .nimble 38;5;81 # pascal .s 38;5;110 .S 38;5;110 # Rust .rs 38;5;81 # AppleScript .scpt 38;5;219 # Swift .swift 38;5;219 # ? .sx 38;5;81 # Vala .vala 38;5;81 .vapi 38;5;81 # interface file in GHC - https://github.com/trapd00r/LS_COLORS/pull/9 .hi 38;5;110 # haskell .hs 38;5;81 .lhs 38;5;81 # agda .agda 38;5;81 .lagda 38;5;81 .lagda.tex 38;5;81 .lagda.rst 38;5;81 .lagda.md 38;5;81 .agdai 38;5;110 # Zig .zig 38;5;81 # V .v 38;5;81 # binaries {{{2 # compiled apps for interpreted languages .pyc 38;5;240 # }}} # orchestration {{{2 .tf 38;5;168 .tfstate 38;5;168 .tfvars 38;5;168 # orchestration 2}}} # html {{{2 .css 38;5;125;1 .less 38;5;125;1 .sass 38;5;125;1 .scss 38;5;125;1 .htm 38;5;125;1 .html 38;5;125;1 .jhtm 38;5;125;1 .mht 38;5;125;1 .eml 38;5;125;1 .mustache 38;5;125;1 # }}} # java {{{2 .coffee 38;5;074;1 .java 38;5;074;1 .js 38;5;074;1 .mjs 38;5;074;1 .jsm 38;5;074;1 .jsp 38;5;074;1 # }}} # php {{{2 .php 38;5;81 # CakePHP view scripts and helpers .ctp 38;5;81 # Twig template engine .twig 38;5;81 # }}} # vb/a {{{2 .vb 38;5;81 .vba 38;5;81 .vbs 38;5;81 # 2}}} # Build stuff {{{2 *Dockerfile 38;5;155 .dockerignore 38;5;240 *Makefile 38;5;155 *MANIFEST 38;5;243 *pm_to_blib 38;5;240 # Functional Configuration .nix 38;5;155 .dhall 38;5;178 # ruby rake .rake 38;5;155 # automake .am 38;5;242 .in 38;5;242 .hin 38;5;242 .scan 38;5;242 .m4 38;5;242 .old 38;5;242 .out 38;5;242 .SKIP 38;5;244 # }}} # patch files {{{2 .diff 48;5;197;38;5;232 .patch 48;5;197;38;5;232;1 #}}} # graphics {{{1 .bmp 38;5;97 .dicom 38;5;97 .tiff 38;5;97 .tif 38;5;97 .TIFF 38;5;97 .cdr 38;5;97 .flif 38;5;97 .gif 38;5;97 .icns 38;5;97 .ico 38;5;97 .jpeg 38;5;97 .JPG 38;5;97 .jpg 38;5;97 .nth 38;5;97 .png 38;5;97 .psd 38;5;97 .pxd 38;5;97 .pxm 38;5;97 .xpm 38;5;97 .webp 38;5;97 # }}} # vector {{{1 .ai 38;5;99 .eps 38;5;99 .epsf 38;5;99 .drw 38;5;99 .ps 38;5;99 .svg 38;5;99 # }}} # video {{{1 .avi 38;5;114 .divx 38;5;114 .IFO 38;5;114 .m2v 38;5;114 .m4v 38;5;114 .mkv 38;5;114 .MOV 38;5;114 .mov 38;5;114 .mp4 38;5;114 .mpeg 38;5;114 .mpg 38;5;114 .ogm 38;5;114 .rmvb 38;5;114 .sample 38;5;114 .wmv 38;5;114 # mobile/streaming {{{2 .3g2 38;5;115 .3gp 38;5;115 .gp3 38;5;115 .webm 38;5;115 .gp4 38;5;115 .asf 38;5;115 .flv 38;5;115 .ts 38;5;115 .ogv 38;5;115 .f4v 38;5;115 # }}} # lossless {{{2 .VOB 38;5;115;1 .vob 38;5;115;1 # }}} # subtitles {{{1 .ass 38;5;117 .srt 38;5;117 .ssa 38;5;117 .sub 38;5;117 .sup 38;5;117 # bitmap image track .vtt 38;5;117 #}}} # audio {{{1 .3ga 38;5;137;1 .S3M 38;5;137;1 .aac 38;5;137;1 .amr 38;5;137;1 .au 38;5;137;1 .caf 38;5;137;1 .dat 38;5;137;1 .dts 38;5;137;1 .fcm 38;5;137;1 .m4a 38;5;137;1 .mod 38;5;137;1 .mp3 38;5;137;1 .mp4a 38;5;137;1 .oga 38;5;137;1 .ogg 38;5;137;1 .opus 38;5;137;1 .s3m 38;5;137;1 .sid 38;5;137;1 .wma 38;5;137;1 # lossless .ape 38;5;136;1 .aiff 38;5;136;1 .cda 38;5;136;1 .flac 38;5;136;1 .alac 38;5;136;1 .mid 38;5;136;1 .midi 38;5;136;1 .pcm 38;5;136;1 .wav 38;5;136;1 .wv 38;5;136;1 .wvc 38;5;136;1 # }}} # fonts {{{1 .afm 38;5;66 .fon 38;5;66 .fnt 38;5;66 .pfb 38;5;66 .pfm 38;5;66 .ttf 38;5;66 .otf 38;5;66 # Web Open Font Format .woff 38;5;66 .woff2 38;5;66 # postscript fonts .PFA 38;5;66 .pfa 38;5;66 # }}} # archives {{{1 .7z 38;5;40 .a 38;5;40 .arj 38;5;40 .bz2 38;5;40 .cpio 38;5;40 .gz 38;5;40 .lrz 38;5;40 .lz 38;5;40 .lzma 38;5;40 .lzo 38;5;40 .rar 38;5;40 .s7z 38;5;40 .sz 38;5;40 .tar 38;5;40 .tgz 38;5;40 .warc 38;5;40 .WARC 38;5;40 .xz 38;5;40 .z 38;5;40 .zip 38;5;40 .zipx 38;5;40 .zoo 38;5;40 .zpaq 38;5;40 .zst 38;5;40 .zstd 38;5;40 .zz 38;5;40 # packaged apps {{{2 .apk 38;5;215 .ipa 38;5;215 .deb 38;5;215 .rpm 38;5;215 .jad 38;5;215 .jar 38;5;215 .cab 38;5;215 .pak 38;5;215 .pk3 38;5;215 .vdf 38;5;215 .vpk 38;5;215 .bsp 38;5;215 .dmg 38;5;215 .crx 38;5;215 # Google Chrome extension .xpi 38;5;215 # Mozilla Firefox extension # }}} # segments from 0 to three digits after first extension letter {{{2 .r[0-9]{0,2} 38;5;239 .zx[0-9]{0,2} 38;5;239 .z[0-9]{0,2} 38;5;239 # partial files .part 38;5;239 # }}} # partition images {{{2 .iso 38;5;124 .bin 38;5;124 .nrg 38;5;124 .qcow 38;5;124 .sparseimage 38;5;124 .toast 38;5;124 .vcd 38;5;124 .vmdk 38;5;124 # }}} # databases {{{2 .accdb 38;5;60 .accde 38;5;60 .accdr 38;5;60 .accdt 38;5;60 .db 38;5;60 .fmp12 38;5;60 .fp7 38;5;60 .localstorage 38;5;60 .mdb 38;5;60 .mde 38;5;60 .sqlite 38;5;60 .typelib 38;5;60 # NetCDF database .nc 38;5;60 # }}} # tempfiles {{{1 # undo files .pacnew 38;5;33 .un~ 38;5;241 .orig 38;5;241 # backups .BUP 38;5;241 .bak 38;5;241 .o 38;5;241 # *nix Object file (shared libraries, core dumps etc) *core 38;5;241 # Linux user core dump file (from /proc/sys/kernel/core_pattern) .mdump 38;5;241 # Mini DuMP crash report .rlib 38;5;241 # Static rust library .dll 38;5;241 # dynamic linked library # temporary files .swp 38;5;244 .swo 38;5;244 .tmp 38;5;244 .sassc 38;5;244 # state files .pid 38;5;248 .state 38;5;248 *lockfile 38;5;248 *lock 38;5;248 # error logs .err 38;5;160;1 .error 38;5;160;1 .stderr 38;5;160;1 # state dumps .aria2 38;5;241 .dump 38;5;241 .stackdump 38;5;241 .zcompdump 38;5;241 .zwc 38;5;241 # tcpdump, network traffic capture .pcap 38;5;29 .cap 38;5;29 .dmp 38;5;29 # macOS .DS_Store 38;5;239 .localized 38;5;239 .CFUserTextEncoding 38;5;239 # }}} # hosts {{{1 # /etc/hosts.{deny,allow} .allow 38;5;112 .deny 38;5;196 # }}} # systemd {{{1 # http://www.freedesktop.org/software/systemd/man/systemd.unit.html .service 38;5;45 *@.service 38;5;45 .socket 38;5;45 .swap 38;5;45 .device 38;5;45 .mount 38;5;45 .automount 38;5;45 .target 38;5;45 .path 38;5;45 .timer 38;5;45 .snapshot 38;5;45 # }}} # metadata {{{1 .application 38;5;116 .cue 38;5;116 .description 38;5;116 .directory 38;5;116 .m3u 38;5;116 .m3u8 38;5;116 .md5 38;5;116 .properties 38;5;116 .sfv 38;5;116 .theme 38;5;116 .torrent 38;5;116 .urlview 38;5;116 .webloc 38;5;116 .lnk 38;5;39 # }}} # macOS files {{{1 *CodeResources 38;5;239 # code signing apps *PkgInfo 38;5;239 # app bundle id .nib 38;5;57 # UI .car 38;5;57 # asset catalog .dylib 38;5;241 # shared lib # Xcode files {{{2 .entitlements 1 .pbxproj 1 .strings 1 .storyboard 38;5;196 .xcconfig 1 .xcsettings 1 .xcuserstate 1 .xcworkspacedata 1 .xib 38;5;208 # }}} # }}} # encrypted data {{{1 .asc 38;5;192;3 .bfe 38;5;192;3 .enc 38;5;192;3 .gpg 38;5;192;3 .signature 38;5;192;3 .sig 38;5;192;3 .p12 38;5;192;3 .pem 38;5;192;3 .pgp 38;5;192;3 .p7s 38;5;192;3 *id_dsa 38;5;192;3 *id_rsa 38;5;192;3 *id_ecdsa 38;5;192;3 *id_ed25519 38;5;192;3 # 1}}} # emulators {{{1 .32x 38;5;213 .cdi 38;5;213 .fm2 38;5;213 .rom 38;5;213 .sav 38;5;213 .st 38;5;213 # atari .a00 38;5;213 .a52 38;5;213 .A64 38;5;213 .a64 38;5;213 .a78 38;5;213 .adf 38;5;213 .atr 38;5;213 # nintendo .gb 38;5;213 .gba 38;5;213 .gbc 38;5;213 .gel 38;5;213 .gg 38;5;213 .ggl 38;5;213 .ipk 38;5;213 # Nintendo (DS Packed Images) .j64 38;5;213 .nds 38;5;213 .nes 38;5;213 # Sega .sms 38;5;213 # }}} # Texas Instruments Calculator files {{{1 # for more see http://tibasicdev.wikidot.com/file-extensions .8xp 38;5;121 .8eu 38;5;121 .82p 38;5;121 .83p 38;5;121 .8xe 38;5;121 # }}} # 3D printing {{{1 .stl 38;5;216 .dwg 38;5;216 .ply 38;5;216 .wrl 38;5;216 # }}} # unsorted {{{1 # # Portable Object Translation for GNU Gettext .pot 38;5;7 # CAD files for printed circuit boards .pcb 38;5;7 # groff (rendering app for texinfo) .mm 38;5;7 # GIMP files .gbr 38;5;7 .scm 38;5;7 .xcf 38;5;7 # printer spool file .spl 38;5;7 # RStudio project file .Rproj 38;5;11 # Nokia Symbian OS files .sis 38;5;7 .1p 38;5;7 .3p 38;5;7 .cnc 38;5;7 .def 38;5;7 .ex 38;5;7 .example 38;5;7 .feature 38;5;7 .ger 38;5;7 .ics 38;5;7 # calendar information .map 38;5;7 .mf 38;5;7 .mfasl 38;5;7 .mi 38;5;7 .mtx 38;5;7 .pc 38;5;7 .pi 38;5;7 .plt 38;5;7 .pm 38;5;7 .rdf 38;5;7 .ru 38;5;7 .sch 38;5;7 .sty 38;5;7 .sug 38;5;7 .tdy 38;5;7 .tfm 38;5;7 .tfnt 38;5;7 .tg 38;5;7 .vcard 38;5;7 .vcf 38;5;7 #contact information .xln 38;5;7 # AppCode files .iml 38;5;166 # }}} # termcap {{{1 TERM ansi TERM color-xterm TERM con132x25 TERM con132x30 TERM con132x43 TERM con132x60 TERM con80x25 TERM con80x28 TERM con80x30 TERM con80x43 TERM con80x50 TERM con80x60 TERM cons25 TERM console TERM cygwin TERM dtterm TERM Eterm TERM eterm-color TERM gnome TERM gnome-256color TERM jfbterm TERM konsole TERM kterm TERM linux TERM linux-c TERM mach-color TERM mlterm TERM putty TERM rxvt TERM rxvt-256color TERM rxvt-cygwin TERM rxvt-cygwin-native TERM rxvt-unicode TERM rxvt-unicode-256color TERM rxvt-unicode256 TERM screen TERM screen-256color TERM screen-256color-bce TERM screen-bce TERM screen-w TERM screen.linux TERM screen.rxvt TERM terminator TERM vt100 TERM xterm TERM xterm-16color TERM xterm-256color TERM xterm-88color TERM xterm-color TERM xterm-debian TERM xterm-kitty # }}} # vim: ft=dircolors fdm=marker ================================================ FILE: .zsh/dircolors.light ================================================ # Configuration file for dircolors, a utility to help you set the # LS_COLORS environment variable used by GNU ls with the --color option. # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Copying and distribution of this file, with or without modification, # are permitted provided the copyright notice and this notice are preserved. # The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the # slackware version of dircolors) are recognized but ignored. # Below, there should be one TERM entry for each termtype that is colorizable TERM Eterm TERM ansi TERM color-xterm TERM con132x25 TERM con132x30 TERM con132x43 TERM con132x60 TERM con80x25 TERM con80x28 TERM con80x30 TERM con80x43 TERM con80x50 TERM con80x60 TERM cons25 TERM console TERM cygwin TERM dtterm TERM eterm-color TERM gnome TERM gnome-256color TERM hurd TERM jfbterm TERM konsole TERM kterm TERM linux TERM linux-c TERM mach-color TERM mach-gnu-color TERM mlterm TERM putty TERM putty-256color TERM rxvt TERM rxvt-256color TERM rxvt-cygwin TERM rxvt-cygwin-native TERM rxvt-unicode TERM rxvt-unicode-256color TERM rxvt-unicode256 TERM screen TERM screen-256color TERM screen-256color-bce TERM screen-bce TERM screen-w TERM screen.Eterm TERM screen.rxvt TERM screen.linux TERM st TERM st-256color TERM terminator TERM tmux-256color TERM vt100 TERM xterm TERM xterm-16color TERM xterm-256color TERM xterm-88color TERM xterm-color TERM xterm-debian # Below are the color init strings for the basic file types. A color init # string consists of one or more of the following numeric codes: # Attribute codes: # 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed # Text color codes: # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white # Background color codes: # 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white #NORMAL 00 # no color code at all #FILE 00 # regular file: use no color at all RESET 0 # reset to "normal" color # DIR 38;5;150 # directory DIR 38;5;31;1 # directory # LINK 38;5;174 # symbolic link. (If you set this to 'target' instead of a LINK 38;5;24 # symbolic link. (If you set this to 'target' instead of a # ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ORPHAN 7 # symlink to nonexistent file, or non-stat'able file MULTIHARDLINK 41;38;5;15 # regular file with more than one link FIFO 01;38;5;161 # pipe SOCK 01;38;5;161 # socket DOOR 01;35 # door BLK 01;38;5;161 # block device driver CHR 01;38;5;161 # character device driver SETUID 38;5;7;48;5;160 # file that is setuid (u+s) SETGID 38;5;7;48;5;160 # file that is setgid (g+s) CAPABILITY 38;5;7;26 # file with capability STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w) OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable # This is for files with execute permission: EXEC 4;38;5;16 # List any file extensions like '.gz' or '.tar' that you would like ls # to colorize below. Put the extension, a space, and the color init string. # (and any comments you want to add after a '#') # If you use DOS-style suffixes, you may want to uncomment the following: #.cmd 01;32 # executables (bright green) #.exe 01;32 #.com 01;32 #.btm 01;32 #.bat 01;32 # Or if you want to colorize scripts even if they do not have the # executable bit actually set. #.sh 01;32 #.csh 01;32 # archives or compressed (bright red) .tar 01;31 .tgz 01;31 .arc 01;31 .arj 01;31 .taz 01;31 .lha 01;31 .lz4 01;31 .lzh 01;31 .lzma 01;31 .tlz 01;31 .txz 01;31 .tzo 01;31 .t7z 01;31 .zip 01;31 .z 01;31 .Z 01;31 .dz 01;31 .gz 01;31 .lrz 01;31 .lz 01;31 .lzo 01;31 .xz 01;31 .bz2 01;31 .bz 01;31 .tbz 01;31 .tbz2 01;31 .tz 01;31 .deb 01;31 .rpm 01;31 .jar 01;31 .war 01;31 .ear 01;31 .sar 01;31 .rar 38;05;164 .alz 01;31 .ace 01;31 .zoo 01;31 .cpio 01;31 .7z 01;31 .rz 01;31 .cab 01;31 # image formats .jpg 38;5;29 .jpeg 38;5;29 .gif 38;5;29 .bmp 38;5;29 .pbm 38;5;29 .pgm 38;5;29 .ppm 38;5;29 .tga 38;5;29 .xbm 38;5;29 .xpm 38;5;29 .tif 38;5;29 .tiff 38;5;29 .png 38;5;29 .svg 38;5;29 .svgz 38;5;115 .mng 38;5;115 .pcx 38;5;115 .mov 38;5;115 .mpg 38;5;115 .mpeg 38;5;115 .m2v 38;5;115 .mkv 38;5;115 .webm 38;5;115 .ogm 38;5;115 .mp4 38;5;115 .m4v 38;5;115 .mp4v 38;5;115 .vob 38;5;115 .qt 38;5;115 .nuv 38;5;115 .wmv 38;5;115 .asf 38;5;115 .rm 38;5;115 .rmvb 38;5;115 .flc 38;5;115 .avi 38;5;115 .fli 38;5;115 .flv 38;5;115 .gl 38;5;115 .dl 38;5;115 .xcf 38;5;115 .xwd 38;5;115 .yuv 38;5;115 .cgm 38;5;115 .emf 38;5;115 # http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions .axv 38;5;115 .anx 38;5;115 .ogv 38;5;115 .ogx 38;5;115 # audio formats .aac 00;36 .au 00;36 .flac 00;36 .m4a 00;36 .mid 00;36 .midi 00;36 .mka 00;36 .mp3 00;36 .mpc 00;36 .ogg 00;36 .ra 00;36 .wav 00;36 # http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions .axa 00;36 .oga 00;36 .spx 00;36 .xspf 00;36 # misc .conf 38;05;161 .log 38;05;161 ================================================ FILE: .zshenv ================================================ #!/usr/bin/env zsh # Always sourced first. export ZDOTDIR=~/.zsh ================================================ FILE: README.md ================================================ [![Build Status](https://travis-ci.org/mhinz/dotfiles.svg?branch=master)](https://travis-ci.org/mhinz/dotfiles) A few years ago I switched from Linux to macOS, but my workflow didn't change a lot. I just need a browser and a terminal emulator. The majority of my work is done in a shell with a handful of tools. Everyday, I use [Nvim](.vim/vimrc), [git](.config/git/config), [tmux](.tmux.conf), and [zsh](.zsh/.zshrc) ([profile](.profile), [shrc](.shrc)) and thus these config files are the most customized. Have fun reading them and steal what you need. _Disclaimer: No Reddit users were hurt during the creation of these configuration files._ ![Screenshot](https://raw.githubusercontent.com/mhinz/dotfiles/master/.github/screenshot.png) ================================================ FILE: bin/battery ================================================ #!/bin/sh os="$(uname -o)" if [ "$os" = Darwin ]; then pmset -g batt | awk 'NR==2 { gsub(/;/, ""); print $3 }' exit 0 fi exit 1 ================================================ FILE: bin/book ================================================ #!/usr/bin/env ruby require 'find' module Find def populate(*paths) matched = {} find(*paths) do |path| if File.file?(path) && yield(path) matched[File.basename(path, File.extname(path))] = path end end matched end module_function :populate end class Books def initialize(path, term = '') @books = find(path, term) if @books.empty? puts "No matches." return end select end def find(path, term) Find.populate(path) do |p| p =~ /#{term}/i end.sort end def select @books.each_with_index do |book, i| puts "\e[32m %-4d \e[33m%s" % [ i, book.flatten.first ] end print "\e[31m Select:\e[0m " begin choice = STDIN.gets rescue Interrupt # Catch CTRL-C. end return if choice.nil? choice = choice.chomp.to_i open @books[choice].flatten.last end def open(path) exec 'open', path end end Books.new('/data/books', ARGV.join(' ')) ================================================ FILE: bin/book.erl ================================================ #!/usr/bin/env escript -define(BOOKPATH, '/data/books'). list_files(RegExp) -> filelib:fold_files(?BOOKPATH, "((?i)" ++ RegExp ++ ")", true, fun(File, Acc) -> [File|Acc] end, []). % Returns [{Index, {File, Path}}] process_paths(Paths) -> Sorted = lists:sort(fun({A,_}, {B,_}) -> A < B end, [{filename:basename(P), P} || P <- Paths]), lists:zip(lists:seq(1, length(Sorted)), Sorted). main(Args) -> Paths = process_paths(case length(Args) of 0 -> list_files(""); _ -> list_files(hd(Args)) end), case length(Paths) of 0 -> io:format("Nothing found!~n"); _ -> [io:format("\e[32m~3w \e[33m~s\n", [Index, File]) || {Index, {File, _}} <- Paths], {ok, [Choice|_]} = io:fread("\e[32mOpen>\e[0m ", "~d"), {_, {_, Path}} = lists:nth(Choice, Paths), open_port({spawn_executable, "/usr/bin/open"}, [{args, [Path]}]) end. ================================================ FILE: bin/book.go ================================================ //usr/bin/env go run $0 $@; exit package main import ( "fmt" "log" "os" "os/exec" "path/filepath" "regexp" "sort" ) type byBase []string // Implement sort.Interface {{{1 func (b byBase) Len() int { return len(b) } func (b byBase) Less(i, j int) bool { return filepath.Base(b[i]) < filepath.Base(b[j]) } func (b byBase) Swap(i, j int) { b[i], b[j] = b[j], b[i] } // scanDir() {{{1 func scanDir(fnames *[]string, arg string) { dir, err := os.Open(arg) if err != nil { log.Fatal(err) } defer dir.Close() fis, err := dir.Readdir(-1) if err != nil { log.Fatal(err) } r, err := regexp.Compile("(?i)" + os.Args[1]) if err != nil { log.Fatal(err) } for _, fi := range fis { fname := fi.Name() if !fi.IsDir() && r.MatchString(fname) { *fnames = append(*fnames, arg+"/"+fname) } else if fi.IsDir() { scanDir(fnames, arg+"/"+fname) } } } // run() {{{1 func run(prog, bookpath string) { cmd := exec.Command(prog, bookpath) err := cmd.Start() if err != nil { log.Fatal(err) } } // main() {{{1 func main() { if len(os.Args) < 2 { fmt.Printf("usage: %s \n", os.Args[0]) os.Exit(0) } var fnames []string scanDir(&fnames, "/data/books") if len(fnames) == 0 { fmt.Println("\033[31mNothing found!") return } sort.Sort(byBase(fnames)) for i, v := range fnames { fmt.Printf(" \033[32m%-5d \033[33m%s\n", i, filepath.Base(v)) } var input int fmt.Print("\033[32mSelect>\033[0m ") _, err := fmt.Scanf("%d", &input) if err != nil { log.Fatal(err) } run("open", fnames[input]) // switch filepath.Ext(fnames[input]) { // case ".pdf": // run("zathura", fnames[input]) // case ".chm": // run("xchm", fnames[input]) // case ".djvu": // run("djview", fnames[input]) // default: // fmt.Println("\033[31mI can't handle that file!") // } } ================================================ FILE: bin/bootstrap-homebrew ================================================ #!/usr/bin/env bash xcode-select --install if ! command -v brew &>/dev/null; then ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" fi brew analytics off formulae=( asdf automake bash cmake coreutils curl-openssl git gnupg go jq libtool ncdu neovim netcat ninja nmap node openssl pinentry-mac pkg-config postgresql python ripgrep shellcheck socat sqlite ssh-copy-id tmux tree unbound wget youtube-dl zsh ) brew install "${formulae[@]}" brew install --HEAD universal-ctags/universal-ctags/universal-ctags brew tap caskroom/cask brew tap homebrew/services brew tap homebrew/cask-fonts brew tap homebrew/cask-versions formulae=( brave-browser calibre dbeaver-community docker-edge flux font-dejavu font-fira-code font-juliamono gifox gimp iterm2 karabiner-elements kitty magicavoxel rar tor-browser vienna virtualbox virtualbox-extension-pack vlc wireshark blockblock lulu ) brew install --cask "${formulae[@]}" ================================================ FILE: bin/bootstrap-host ================================================ #!/bin/sh list_ssh_hosts() { awk '$1 == "HostName" { print $2 }' ~/.ssh/config | \ cut -d. -f1 | \ sort } bootstrap() { cd || exit 1 if [ ! -d .git ]; then git init git remote add -f origin https://github.com/mhinz/dotfiles fi # shellcheck disable=SC2006 if sh=`grep '\' /etc/shells` && [ "$SHELL" != "$sh" ]; then chsh -s "$sh" fi } bootstrap_to_host() { ssh -T "$1" 'bash -s' < ~/bin/bootstrap-host . } if ! command -v git 1>/dev/null; then echo 'Install git.' exit 1 fi if [ $# -eq 0 ]; then list_ssh_hosts else if [ "$1" = . ]; then bootstrap elif list_ssh_hosts | grep -q "\\<$1\\>"; then bootstrap_to_host "$1" else list_ssh_hosts fi fi ================================================ FILE: bin/bootstrap-ruby ================================================ #!/usr/bin/env bash gem install rbenv gem-ctags gem ctags mkdir -p ~/.rbenv/plugins git clone https://github.com/tpope/rbenv-ctags.git ~/.rbenv/plugins/rbenv-ctags git clone https://github.com/ianheggie/rbenv-binstubs ~/.rbenv/plugins/rbenv-binstubs rbenv ctags ================================================ FILE: bin/bootstrap-vim ================================================ #!/usr/bin/env bash set -ex mkdir -p ~/.vim/files/{backup,info,swap,undo} mkdir -p ~/.vim/bundle mkdir -p ~/.config git clone https://github.com/junegunn/vim-plug.git ~/.vim/bundle/vim-plug || true ln -sf ~/.vim/bundle/vim-plug/plug.vim ~/.vim/autoload vim +PlugInstall +qall ln -sf ~/.vim ~/.config/nvim cd ~/.vim && ln -sf vimrc init.vim ================================================ FILE: bin/build-angband ================================================ #!/usr/bin/env bash repo='https://github.com/angband/angband' dir="${ME}/repo/angband" cd "$dir" 2>/dev/null || { cd "${dir%/*}" || exit 1 git clone "$repo" cd "${repo##*/}" || exit 1 } echo '[*] Cleaning directory..' make distclean &>/dev/null if [[ $1 = '-f' ]]; then echo '[!] Force building..' else echo '[*] Pulling changes..' if git pull | grep 'Already up[ -]to[ -]date.' &>/dev/null; then echo '[!] No changes found.' exit 1 fi fi export NCURSES_CONFIG=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/bin/ncurses5.4-config ./autogen.sh ./configure \ --prefix="${HOME}/local/angband" \ --bindir="${HOME}/local/angband/bin" \ --with-ncurses-prefix=/usr/lib \ --disable-ncursestest \ --disable-x11 make make install ================================================ FILE: bin/build-elixir ================================================ #!/usr/bin/env bash set -e dir="${ME}/github/elixir-lang/elixir" if [[ ! -d $dir ]]; then mkdir -p "${ME}/github/elixir-lang" git clone https://github.com/elixir-lang/elixir "$dir" fi cd "$dir" if [[ $1 != -f ]]; then git pull | grep 'Already up[ -]to[ -]date.' && exit 1 fi make clean make ================================================ FILE: bin/build-erlang ================================================ #!/usr/bin/env bash set -e dir="${ME}/github/erlang/otp" prefix="${HOME}/local/erlang" flags=( "--prefix=${prefix}" '--with-ssl=/usr/local/opt/openssl' '--without-javac' ) cd "$dir" if [[ $1 != -f ]]; then git pull | grep 'Already up[ -]to[ -]date.' && exit 1 fi export LANG=C if [[ ! -f ./configure ]]; then ./otp_build autoconf ./configure "${flags[@]}" fi make install ================================================ FILE: bin/build-git ================================================ #!/usr/bin/env bash set -e set -x dir="${ME}/repo/git" prefix="${HOME}/local/git" # avoid "Document //git/Documentation/git-add.xml does not validate" errors export XML_CATALOG_FILES=/usr/local/etc/xml/catalog export CPPFLAGS=-I/usr/local/opt/openssl/include export LDFLAGS=-L/usr/local/opt/openssl/lib cd "$dir" || exit if [[ $1 != -f ]]; then git pull | grep 'Already up[ -]to[ -]date.' && exit 1 fi make distclean 1>/dev/null make configure 1>/dev/null ./configure --prefix="${prefix}" make install install-man cd contrib/subtree make install ================================================ FILE: bin/build-go ================================================ #!/usr/bin/env bash set -e set -x [[ -z ${GOROOT:+nope} ]] && { echo "Export \$GOROOT first."; exit 1; } [[ -z ${GOARCH:+nope} ]] && { echo "Export \$GOARCH first."; exit 1; } [[ -z ${GOOS:+nope} ]] && { echo "Export \$GOOS first."; exit 1; } if ! cd "${GOROOT}/src"; then mkdir -p "${GOROOT}/.." git clone https://github.com/golang/go.git "$GOROOT" cd "${GOROOT}/src" else if [[ $1 != -f ]]; then git pull | grep 'Already up[ -]to[ -]date.' && exit 1 fi fi # shellcheck disable=SC2155 export GOROOT_BOOTSTRAP=$(mktemp -dt go-bootstrap-XXX) if [[ -x $GOROOT/bin/go ]]; then rsync -a "$GOROOT"/ "$GOROOT_BOOTSTRAP" --exclude .git else echo '[*] No go binary found. Downloading Go 1.7.3..' curl -#L "https://storage.googleapis.com/golang/go1.7.3.${GOOS}-${GOARCH}.tar.gz" \ | tar -C "$GOROOT_BOOTSTRAP" --strip-components=1 -x fi if [[ -z ${GOROOT_BOOTSTRAP+nope} ]]; then echo '[*] Building master..' else echo "[*] Building master using bootstrap: $GOROOT_BOOTSTRAP" fi ./make.bash ================================================ FILE: bin/build-htop ================================================ #!/usr/bin/env bash dir="${ME}/repo/htop" prefix="${HOME}/local/htop" cd "$dir" || exit if [[ $1 != -f ]]; then git pull | grep 'Already up[ -]to[ -]date.' && exit 1 fi sh autogen.sh ./configure --prefix="${prefix}" make install ================================================ FILE: bin/build-tmux ================================================ #!/usr/bin/env bash cd "${ME}/repo/tmux" || exit if git pull | grep 'Already up[ -]to[ -]date.' && [ "$1" != -f ]; then exit 0 fi sh autogen.sh ./configure --prefix="${HOME}/local/tmux" make install ================================================ FILE: bin/build-vim ================================================ #!/usr/bin/env bash dir="${ME}/github/vim/vim" prefix="${HOME}/local/vim" # python3-config --configdir flags=( "--prefix=${prefix}" '--with-compiledby=mhi' '--enable-rubyinterp=dynamic' '--enable-python3interp' '--with-python3-config-dir=/usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/config-3.9-darwin' ) [[ $(uname) == Linux ]] && flags+=('--with-x') current_vim_version() { local version patchlevel version=$(vim --version | head -1 | cut -d' ' -f5) patchlevel=$(vim --version | head -3 | tail -1 | cut -d'-' -f2) echo "${version}.${patchlevel}" } cd "$dir" || exit 1 if [[ $1 != -f ]]; then git pull | grep 'Already up[ -]to[ -]date.' && exit 1 fi old_version=$(current_vim_version) echo "Build log: ${dir}/build.log" echo 'Cleaning...' make distclean 1>/dev/null echo 'Configure...' ./configure "${flags[@]}" >build.log echo 'Compile...' make >>build.log echo 'Install...' make install >>build.log echo "New version: $old_version => $(current_vim_version)" ================================================ FILE: bin/build-zsh ================================================ #!/usr/bin/env bash dir="${ME}/repo/zsh" prefix="${HOME}/local/zsh" cd "$dir" || exit echo '[*] Cleaning directory..' make distclean &>/dev/null if [[ $1 = '-f' ]]; then echo '[!] Force building..' else echo '[*] Pulling changes..' if git pull | grep 'Already up[ -]to[ -]date.' &>/dev/null; then echo '[!] No changes found.' exit 1 fi fi echo "[*] Build log: ${dir}/build.log" echo '[*] Run preconfig..' ./Util/preconfig >build.log echo '[*] Configure..' ./configure --prefix="${prefix}" >>build.log echo '[*] Compile sources..' make >>build.log echo '[*] Install..' make install >>build.log ================================================ FILE: bin/busy ================================================ #!/usr/bin/env bash # Just a hack to keep macOS from sleeping without having to fiddle with the # energy saver settings or using apps like caffeine and amphetamine. [[ $(uname -s) == Darwin ]] || exit 1 declare -A map=( [Apple_Terminal]=Terminal [iTerm.app]=iTerm ) term=${map[$TERM_PROGRAM]} [[ -z $term ]] && exit 2 time osascript <&1 exit 1 fi # # set trap handlers # trap 'tput cnorm; tput clear' EXIT trap 'exit 1' INT TERM # # calculate header position # while getopts ':x:y:' opt; do [[ $opt =~ [\?:] ]] && continue case $opt in x) cols=$OPTARG ;; y) rows=$OPTARG ;; *) echo "usage: $0 [-t] [-x \$cols] [-y \$rows]" 2>&1 exit 1 esac done # # if no cols or rows were set: # - try to determine them # - set default values otherwise # [[ -z $cols ]] && { cols=$(tput cols) || cols=80; } [[ -z $rows ]] && { rows=$(tput lines) || rows=24; } # # get width and height of the header # header_width=${#header[0]} header_height=${#header[@]} # # check if header is bigger than the actual terminal size; truncate otherwise # [[ $cols -lt $header_width ]] && { off_x=0; header_width=$cols; } || off_x=$[ (cols - header_width) / 2 ] [[ $rows -lt $header_height ]] && { off_y=0; header_height=$rows; } || off_y=$[ (rows - header_height) / 2 ] # # prepare screen # tput civis clear # # main loop # while :; do for c in {136..166}; do tput setaf $c for ((x = 0; x < $header_width; x++)); do for ((y = 0; y < $header_height; y++)); do draw_char $x $y done done done done ================================================ FILE: bin/dotfiles ================================================ #!/bin/sh red="\033[31m" green="\033[32m" yellow="\033[33m" blue="\033[34m" reset="\033[0m" check_file() { if ! which "$1" >/dev/null; then echo " ${yellow}${1}${reset} % ${red}is not available${reset}" elif [ -e "$2" ]; then if [ -L "$2" ]; then echo " ${yellow}${2}${reset} % ${blue}is already symlinked${reset}" else echo " ${yellow}${2}${reset} % ${red}is no symlink${reset}" fi else ln -s "$3" "$2" echo " ${yellow}${2}${reset} % ${green}-> ${3}${reset}" fi } { check_file bochs ~/.bochsrc .dotfiles/bochs/bochsrc check_file cmus ~/.cmus/kuku.theme ~/.dotfiles/cmus/kuku.theme check_file conky ~/.conkyrc .dotfiles/conky/conkyrc check_file emacs ~/.emacs.d .dotfiles/emacs.d check_file firefox ~/.mozilla .dotfiles/mozilla check_file gdb ~/.gdbinit .dotfiles/gdb/gdbinit check_file gem ~/.gemrc .dotfiles/gem/gemrc check_file getmail ~/.getmail .dotfiles/getmail check_file git ~/.git .dotfiles/git check_file git ~/.gitconfig .dotfiles/git/gitconfig check_file gitk ~/.gitk .dotfiles/git/gitk check_file gpg ~/.gnupg .dotfiles/gnupg check_file hg ~/.hgrc .dotfiles/hg/hgrc check_file irssi ~/.irssi .dotfiles/irssi check_file liferea ~/.liferea_1.8 .dotfiles/liferea/liferea_1.8 check_file liferea ~/feedlist.opml .dotfiles/liferea/feedlist.opml check_file msmtp ~/.msmtprc .dotfiles/msmtp/msmtprc check_file mutt ~/.muttrc .dotfiles/mutt/muttrc check_file procmail ~/.procmailrc .dotfiles/procmail/procmailrc check_file rtorrent ~/.rtorrent.rc .dotfiles/rtorrent/rtorrent.rc check_file skype ~/.Skype .dotfiles/skype check_file slrn ~/.slrn .dotfiles/slrn check_file slrn ~/.slrnrc .dotfiles/slrn/slrnrc check_file ssh ~/.ssh .dotfiles/ssh check_file startx ~/.Xdefaults .dotfiles/x/Xdefaults check_file startx ~/.Xmodmap .dotfiles/x/Xmodmap check_file startx ~/.config/fontconfig/fonts.conf .dotfiles/fonts/fonts.conf check_file startx ~/.fonts .dotfiles/fonts/fonts check_file startx ~/.icons .dotfiles/icons check_file startx ~/.xinitrc .dotfiles/x/xinitrc check_file tmux ~/.tmux.conf .dotfiles/tmux/tmux.conf check_file true ~/.pentadactyl .dotfiles/pentadactyl check_file true ~/.pentadactylrc .dotfiles/pentadactyl/pentadactylrc check_file true ~/.terminfo .dotfiles/terminfo check_file true ~/bin .dotfiles/bin check_file true ~/mail /data/mail check_file vim ~/.vim .dotfiles/vim check_file xmonad ~/.xmonad .dotfiles/xmonad check_file zsh ~/.zsh .dotfiles/zsh check_file zsh ~/.zshenv .dotfiles/zsh/.zshenv } | column -t -s % ================================================ FILE: bin/ec ================================================ #!/usr/bin/env bash if emacsclient --eval t &>/dev/null; then if [[ -z $@ ]]; then emacsclient --eval "(dired \"${PWD}\")" else emacsclient --no-wait "$@" fi else if [[ -z $@ ]]; then emacs --chdir "$PWD" --eval "(dired \"${PWD}\")" & else emacs --chdir "$PWD" "$@" & fi fi ================================================ FILE: bin/english ================================================ #!/usr/bin/env ruby require 'yaml' words = YAML.load_file(File.expand_path('~/english.yaml')) while words.any? word = words.keys.sample print "\n\x1b[1;36m#{word}\x1b[0m " begin gets rescue Interrupt exit end puts words[word] words.delete(word) end ================================================ FILE: bin/english-notification ================================================ #!/usr/bin/env ruby require 'YAML' words = YAML.load_file(File.expand_path('~/english.yaml')) english = words.keys.sample german = words[english].gsub('"', '\"').gsub("'", "''\\'''") %x{ osascript <<< 'display notification "#{german}" with title "#{english}"' } ================================================ FILE: bin/fix-term ================================================ #!/bin/sh # kbs backspace key # sitm/ritm italic # smso/rmso standout # smxx/rmxx strikethrough # Smulx undercurl (https://sw.kovidgoyal.net/kitty/protocol-extensions.html#colored-and-styled-underlines) os="$(uname -s)" tinfo="$(mktemp)" if [ "$os" = Darwin ]; then export TERMINFO=/usr/share/terminfo fi cat > "$tinfo" < "$tcap" cap_mkdb -f ~/.termcap "$tcap" else rm -rf ~/.terminfo tic -xo ~/.terminfo "$tinfo" fi # vim: nowrap ================================================ FILE: bin/gem-info ================================================ #!/bin/sh curl -s https://rubygems.org/api/v1/gems/"${1}".json | jq ================================================ FILE: bin/git-ctags ================================================ #!/usr/bin/env bash set -e blacklist=(~ /usr/local/Homebrew) for dir in "${blacklist[@]}"; do if [[ $PWD = $dir ]]; then echo 'nö' 1>&2 exit 1 fi done cd "$(git rev-parse --show-toplevel)" echo 'Creating tags...' git ls-files | ctags -L - --tag-relative=yes --fields=+S -f .git/tags.$$ mv .git/tags.$$ .git/tags ================================================ FILE: bin/git-neck ================================================ #!/bin/sh -e # git neck [-r] [COMMIT] - show commits until first branching point # # Stolen from http://chneukirchen.org/blog/archive/2013/01/a-grab-bag-of-git-tricks.html [ "$1" = -r ] && shift && R=-r COMMIT=$(git rev-parse --no-flags --default HEAD "$@") # skip first elements of trail TORSO=$(git trail $R $COMMIT | cut -d' ' -f2 | uniq | sed -n 2p) # fall back to initial commit on empty trail : ${TORSO:=$(git rev-list --max-parents=0 HEAD)} git log --oneline $(git rev-parse --no-revs "$@") $COMMIT...$TORSO ================================================ FILE: bin/git-standup ================================================ #!/usr/bin/env bash standup() { dir=$1 shift if git -C "$dir" rev-parse --git-dir &>/dev/null; then changes="$(git -C "$dir" log --all --author='Marco Hinz' --since='6am yesterday' --format=%s "$@")" if [[ -n $changes ]]; then echo -e "\e[31;3m⇒ ${dir}\e[0m" echo "$changes" fi fi } if git rev-parse --git-dir &>/dev/null; then standup "$PWD" "$@" else for dir in *; do standup "$dir" "$@" done fi ================================================ FILE: bin/git-to ================================================ #!/usr/bin/env bash # # usage: git to [ref] # # The number of commits between a given ref and HEAD. If no ref is given, the # last tag (lightweight or annotated) is used. # # This works in both directions (the ref can appear before or after HEAD), # hence "to" and not "since". last_tag() { git describe --tags --exact-match "$(git rev-list --tags --max-count=1)" } number_of_commits_relative_to() { git log --oneline --no-merges ..."$1" | wc -l } ref="${1:-"$(last_tag)"}" echo "$(number_of_commits_relative_to "$ref") commits to $ref" ================================================ FILE: bin/git-trail ================================================ #!/bin/sh -e # git trail [-r] [-t] [COMMIT] - show all branching points in Git history # # Stolen from http://chneukirchen.org/blog/archive/2013/01/a-grab-bag-of-git-tricks.html [ "$1" = -r ] && shift || REMOTES="-e refs/remotes/" [ "$1" = -t ] && shift || TAGS="-e refs/tags/" COMMIT=$(git rev-parse --no-flags --default HEAD "$@") { git for-each-ref | grep -v -e '^$' $TAGS $REMOTES git log --date=short --format="%cd %h %H" "$@" } | awk ' $2 == "commit" || $2 == "tag" { "git merge-base '$COMMIT' " $1 | getline mb merge[mb] = merge[mb] " " $3 } { if ($3 in merge) { split(merge[$3], mbs, " ") for (i in mbs) { "git name-rev --name-only --refs=\"" mbs[i] "\" " $3 | getline nr if (nr != "undefined") print $1, $2, nr # skip unreachable commits } } }' | git -p column # paginate output ================================================ FILE: bin/git-whereami ================================================ #!/usr/bin/env ruby # # frozen_string_literal: true # usage: git whereami [HEAD] # # Show next and previous tags from ref and their distance. ref = !ARGV.empty? ? ARGV[0] : 'HEAD' def out(title, tag, distance) printf("%-20s %-20s %d commits away\n", title, tag, distance) end def distance(tag) `git log --oneline --no-merges ...#{tag}`.lines.count end exact = `git describe --abbrev=0 --exact-match #{ref} 2>/dev/null`.rstrip case $?.exitstatus when 0 prev_anno = `git describe --abbrev=0 #{ref}^ 2>/dev/null`.rstrip prev_light = `git describe --abbrev=0 --tags #{ref}^ 2>/dev/null`.rstrip out('exact', exact, 0) out('prev annotated', prev_anno, distance(prev_anno)) unless prev_anno.empty? out('prev lightweight', prev_light, distance(prev_light)) unless prev_light.empty? else next_light = `git describe --contains #{ref} 2>/dev/null`.rstrip prev_anno = `git describe --abbrev=0 #{ref} 2>/dev/null`.rstrip prev_light = `git describe --abbrev=0 --tags #{ref} 2>/dev/null`.rstrip out('next', *next_light.split('~')) unless next_light.empty? out('prev annotated', prev_anno, distance(prev_anno)) unless prev_anno.empty? out('prev lightweight', prev_light, distance(prev_light)) unless prev_light.empty? end ================================================ FILE: bin/itb ================================================ #!/usr/bin/env ruby class ITBooks def initialize(args) menu(lookup(args)) end private def lookup(args) require 'net/http' require 'json' books = [] page = 1 query = URI.encode(args.join(' ')) loop do response = Net::HTTP.get(URI("http://it-ebooks-api.info/v1/search/#{query}/page/#{page}")) # Fix unescaped double quotes in JSON response. response.gsub!(/([^,:{])"([^,:}])/, '\1\"\2') response = JSON.parse(response, {symbolize_names: true}) break if response[:Total].to_i == 0 books += response[:Books] page += 1 end if books.empty? puts 'No matches.' exit 1 end books.sort! { |a,b| a[:Title] <=> b[:Title] } end def menu(books) loop do books.each_with_index do |book, i| puts "\e[32m %-4d \e[33m%s" % [ i, book[:Title] ] end print "\e[31m Select:\e[0m " begin choice = STDIN.gets.chomp.to_i rescue Interrupt break end show(books[choice][:ID]) print "\e[31m Select another? [Yn]\e[0m " begin choice = STDIN.gets.chomp rescue Interrupt break end break if choice == 'n' end end def show(book_id) book = Net::HTTP.get(URI("http://it-ebooks-api.info/v1/book/#{book_id}")) book.gsub!(/([^,:{])"([^,:}])/, '\1\"\2') book = JSON.parse(book, {symbolize_names: true}) begin require 'lisbn' isbn = Lisbn.new(book[:ISBN]).isbn10 rescue LoadError isbn = nil end puts "\e[32m %-14s\e[0m%s" % ['Title', book[:Title] ] puts "\e[32m %-14s\e[0m%s" % ['Subtitle', book[:SubTitle] ] puts "\e[32m %-14s\e[0m%s" % ['Author', book[:Author] ] puts "\e[32m %-14s\e[0m%s" % ['Year', book[:Year] ] puts "\e[32m %-14s\e[0m%s" % ['Publisher', book[:Publisher] ] puts "\e[32m %-14s\e[0m%s" % ['ISBN', book[:ISBN] ] puts "\e[32m %-14s\e[0m%s" % ['Amazon', "http://www.amazon.de/gp/product/#{isbn}" ] if isbn puts "\e[32m %-14s\e[0m%s" % ['Download', book[:Download] ] puts "\e[32m %-14s\e[0m%s" % ['Description', book[:Description]] end end if ARGV.empty? $stderr.puts "usage: #{File.basename($0)} " exit 1 end ITBooks.new(ARGV) ================================================ FILE: bin/man ================================================ #!/usr/bin/env bash # On :Man, Nvim uses `MANWIDTH=999 man` for the purpose of soft wrapping the # resulting long lines afterwards. This works for all window sizes and supports # resizing. But my eyes are too used to the manpager always giving me 80 # columns, so this wrapper forces $MANWIDTH to be set again. MANWIDTH=80 exec /usr/bin/man "$@" ================================================ FILE: bin/markov ================================================ #!/usr/bin/env python import sys import fileinput import random class Markov: def __init__(self): self.suffixes = {} self.build_table() def read_input(self): lines = [] for line in fileinput.input(): lines.append(line) return ''.join(lines).split() def build_table(self): prefix1 = '\n' prefix2 = '\n' for suffix in self.read_input(): self.suffixes.setdefault((prefix1, prefix2), []).append(suffix) prefix1, prefix2 = prefix2, suffix self.suffixes.setdefault((prefix1, prefix2), []).append('\n') def generate_output(self, maxwords=500): prefix1 = '\n' prefix2 = '\n' for i in xrange(maxwords): new = random.choice(self.suffixes[prefix1, prefix2]) if new == '\n': sys.exit() sys.stdout.write(new + ' ') prefix1, prefix2 = prefix2, new if __name__ == '__main__': m = Markov() m.generate_output() ================================================ FILE: bin/mhi ================================================ #!/usr/bin/env bash # Configuration {{{1 mhi="$(readlink "$0")" mhi=${mhi:=$0} mhi="${mhi%/*}" # Helpers {{{1 list_files() { local path="$1" for file in "$path"/*; do file="${file##*/}" # basename echo "${file%.*}" # strip ext done } case $1 in colors) # {{{1 for i in {0..255}; do tput setab $i && echo -n " $i " done tput sgr0 echo ;; conf|c) # {{{1 arg=$2 declare -A configs=( [g]=~/.config/git/config [l]=~/.vim/lua/mhi.lua [m]=~/.vim/magic.vim [t]=~/.tmux.conf [v]=~/.vim/vimrc [ze]=~/.zsh/.zshenv [zp]=~/.zsh/.zprofile [zr]=~/.zsh/.zshrc ) if [[ -n $arg && -n ${configs[$arg]} ]]; then exec "$EDITOR" "${configs[$arg]}" else for conf in "${!configs[@]}"; do printf '%-6s %s\n' "$conf" "${configs[$conf]}" done | sort fi ;; fix) # {{{1 shift exec "${mhi}/mhi-fix" "$@" ;; net|n) # {{{1 shift exec "${mhi}/mhi-net" "$@" ;; path|p) # {{{1 IFS=: if (( $# == 1 )); then # shellcheck disable=SC2086 printf '%s\n' $PATH else shift # shellcheck disable=SC2086 find $PATH -iname "$@" -exec ls -hl --time-style=long-iso {} + 2>/dev/null fi ;; *) # {{{1 cat </dev/null || exit 1 brew linkapps find /Applications -type l -maxdepth 1 | while read -r file; do [[ -f "${HOME}${file}" ]] || osascript -e 'on run {f} set dir to path to applications folder from user domain tell application "Finder" to make alias at dir to f as POSIX file end' "$file" done ;; *) # {{{1 cat <" exit 1 end end # validate_input {{{1 def validate_input(arg) case arg when /^([01]+)(?:b)?$/ then { sys: 'bin', val: $1 } when /^(\d+)(?:d)?$/ then { sys: 'dec', val: $1 } when /^(?:0x)?([0-9a-fA-F]+)(?:h)?$/ then { sys: 'hex', val: $1 } else $stderr.puts "Wait, what? What is '#{arg}' supposed to mean?" nil end end # converting {{{1 def c2to16(val) lookup = { '0000' => :'0', '0001' => :'1', '0010' => :'2', '0011' => :'3', '0100' => :'4', '0101' => :'5', '0110' => :'6', '0111' => :'7', '1000' => :'8', '1001' => :'9', '1010' => :'a', '1011' => :'b', '1100' => :'c', '1101' => :'d', '1110' => :'e', '1111' => :'f', } ret = [] val = val.scan(/./) ret.unshift(lookup[val.pop(4).join.rjust(4, '0')]) while not val.empty? ret.join end def c16to2(val) lookup = { :'0' => 0, :'1' => 1, :'2' => 10, :'3' => 11, :'4' => 100, :'5' => 101, :'6' => 110, :'7' => 111, :'8' => 1000, :'9' => 1001, :'a' => 1010, :'b' => 1011, :'c' => 1100, :'d' => 1101, :'e' => 1110, :'f' => 1111, } ret = '' val.downcase.each_char do |char| ret << '%.4d' % lookup[char.to_sym] end ret end def c10to16(val) new = val queue = [] while val != 0 new = (val / 16).floor rem = val % 16 queue.unshift('%x' % rem) val = new end queue.join end def c2to10(val) i = 0 ret = 0 val.reverse.each_char do |char| ret += (1 << i) if char.to_i == 1 i += 1 end ret.to_s end # pretty_print {{{1 def pretty_print(results) results.each do |res| res.each_key do |sys| res[sys].gsub!(/^0+/, '') res[sys] = '0' if res[sys].empty? end printf "%-24s | 0x%-12s | %s\n", res[:bin], res[:hex], res[:dec] end end # handle_base {{{1 def handle_base_02(bin) hex = c2to16(bin) dec = c2to10(bin) { bin: bin, dec: dec, hex: hex } end def handle_base_10(dec) hex = c10to16(dec.to_i) bin = c16to2(hex) { bin: bin, dec: dec, hex: hex } end def handle_base_16(hex) bin = c16to2(hex) dec = c2to10(bin) { bin: bin, dec: dec, hex: hex } end # run {{{1 def run @Input.each do |arg| tmp = validate_input(arg) results = [] if tmp case tmp[:sys] when 'bin' then results << handle_base_02(tmp[:val]) when 'dec' then results << handle_base_10(tmp[:val]) when 'hex' then results << handle_base_16(tmp[:val]) end end pretty_print results end end end # }}} NumSys.new(ARGV).run ================================================ FILE: bin/s3cp ================================================ #!/usr/bin/env bash if [[ $# -lt 1 ]]; then echo "usage: s3cp [s3 path] [options]" echo "See 'aws s3 cp help' for available options." exit 1 fi target="${2:-"$(basename $1)"}" aws s3 cp "$1" "s3://foobarquux/${target}" --acl public-read "${@:3}" echo "https://s3.eu-west-2.amazonaws.com/foobarquux/${target}" | tee >(pbcopy) ================================================ FILE: bin/s3ls ================================================ #!/usr/bin/env bash aws s3 ls foobarquux --recursive ================================================ FILE: bin/s3rm ================================================ #!/usr/bin/env bash if [[ $# -lt 1 ]]; then echo "usage: s3rm [options]" echo "See 'aws s3 rm help' for available options." exit 1 fi aws s3 rm "s3://foobarquux/$1" "${@:2}" ================================================ FILE: bin/s3screenshot ================================================ #!/usr/bin/env bash if [[ $# -lt 1 ]]; then echo "usage: s3screenshot " echo "Use to toggle between window selection and interactive selection." exit 1 fi target="${1%.png}.png" # -W start in window selection mode # -o no shadow if screencapture -Wo "/tmp/${target}"; then aws s3 cp "/tmp/${target}" "s3://foobarquux/screenshots/${target}" --acl public-read echo -n "Copied to pasteboard: " echo "https://s3.eu-west-2.amazonaws.com/foobarquux/screenshots/${target}" | tee >(pbcopy) fi ================================================ FILE: bin/shell_function_missing ================================================ #!/usr/bin/env ruby command = ARGV # Prints and runs a command. # # @param [String, Array] cmd Command to run. # Automatically joins Arrays with &&. def run(*cmd) $stderr.puts "Running '#{cmd.join(' ')}' instead" system(*cmd) end def echo(message) $stderr.puts("\n" + message) end case command.join(' ') when /^git(@|:\/\/).*\.git$/ # Clone any full git repo URL. # @example # git://github.com/crafterm/jd.git # # TODO: Doesn't work with zsh. It never gets called. # TODO: Take a second argument for the destination name. run("git", "clone", command) when /^(.*) (.*)\.git$/ # Clone a user and project from GitHub. # Does the right thing when cloning your own projects. # # @example # bjeanes dot-files.git git_project_user = $1 git_project_name = $2 destination_directory = "" git_url = "" if git_project_user == ENV['USER'] destination_directory = git_project_name git_url = "git@github.com:#{git_project_user}/#{git_project_name}.git" else destination_directory = [git_project_user, git_project_name].join('-') git_url = "git://github.com/#{git_project_user}/#{git_project_name}.git" end # TODO: Would be nice to cd to the project directory afterwards run "git", "clone", git_url, destination_directory echo "Cloned as \'#{destination_directory}\'" when /^(?:ftp|https?):\/\/.+\.t(?:ar\.)?gz$/ # Download and unzip a URL run "curl #{command} | tar xzv" when /^[a-z0-9_\-\/]+\.feature$/ run "cucumber", command when /^[A-Za-z0-9_\-\/]+\.gem$/ # Install a gem # @example # haml.gem gem_to_install = command.first.gsub(/\.gem$/, '') run "sudo", "gem", "install", gem_to_install else #abort "Error: No matching action defined in #{__FILE__.inspect}" puts "I never heard of such a command, you crazy fool." exit 1 #ENV['PATH'].split(':').each do |val| #val #end end # Other Ideas: # * Open URL in browser # * cd to a path # * Run a spec by name # * Run a rake task by name ================================================ FILE: bin/svn-clean ================================================ #!/bin/zsh # Before svn 1.9 there was no: # svn cleanup --remove-unversioned svn status | awk '/^\?/ {print $2}' | xargs rm -r -- ================================================ FILE: bin/svn-stats ================================================ #!/usr/bin/perl use warnings; use strict; use Term::ANSIColor qw( :constants ); use List::MoreUtils qw( uniq ); my %seen; my @log = `svn log --quiet --xml` or die 'svn log failed!'; # count number of revisions by author my @sorted = sort grep { /(.*)<\/author>/ && $seen{$1}++ } @log; # print revision ranking foreach my $author (sort { $seen{$a} <=> $seen{$b} } keys %seen) { printf "%20s %s\n", GREEN.$seen{$author}, YELLOW.$author; } printf "\n%20s %s\n", GREEN.scalar @sorted, YELLOW."Number of revisions"; printf "%20s %s\n", GREEN.scalar (uniq @sorted), YELLOW."Number of authors"; ================================================ FILE: bin/task ================================================ #!/usr/bin/env bash # # Simple todo list manager. # # Tasks will be written to ~/tasks. # Finished tasks, plus a timestamp, will be written to ~/tasks.log. usage() { cat << 'EOF' task ... add task task show task #1 task -a show all tasks task -e edit tasks using $EDITOR task -f finish task #1 task -f 3 finish task #3 task 3 finish task #3 task -fa finish all tasks EOF } task_exists() { if [[ -s ~/tasks ]]; then if [[ "$(uname -s)" == Linux ]]; then shaprog=sha1sum else shaprog='shasum -a 1' fi newline_sha="$($shaprog <<< "$*" | cut -d' ' -f1)" while read -r line; do line_sha="$($shaprog <<< "$line" | cut -d' ' -f1)" if [ "$line_sha" = "$newline_sha" ]; then return 0 fi done < ~/tasks fi return 1 } list_tasks() { if [[ -s ~/tasks ]]; then if (( $# == 0 )); then nl -w2 -s' ' ~/tasks else sed -n "${1}p" < ~/tasks fi else echo -e "\e[1mLAZY TIME\e[0m" fi } add_task() { if [[ "$*" =~ ^[0-9]+$ ]]; then remove_task "$@" elif task_exists "$@"; then echo "Task exists already." else echo "$@" >> ~/tasks fi } remove_task() { if (( $# == 0 )); then read -rp "Really? [yN] " answer [[ "$answer" != y ]] && return fi line="$(2>/dev/null sed -i '' -e "${1}w /dev/stdout" -e "${1}d" ~/tasks)" if [[ -n $line ]]; then while IFS= read -r task; do echo "$(date +'%F %R') $task" >> ~/tasks.log echo "Finished: $task" printf 'Next: ' list_tasks 1 done <<< "$line" fi } task() { if (( $# )); then add_task "$@" else list_tasks 1 fi } case "$1" in -a) list_tasks ;; -e) $EDITOR ~/tasks ;; -f) shift if (( $# == 0 )); then remove_task 1 else remove_task "$1" fi ;; -fa) remove_task ;; -h) usage ;; *) task "$@" ;; esac ================================================ FILE: bin/tips ================================================ #!/usr/bin/env ruby tips = [ "I would rather die of passion than of boredom. — Vincent Van Gogh", "If a system is to serve the creative spirit, it must be entirely comprehensible to a single individual.", "I think a lot of new programmers like to use advanced data structures and advanced language features as a way of demonstrating their ability. I call it the lion-tamer syndrome. Such demonstrations are impressive, but unless they actually translate into real wins for the project, avoid them. — Glyn Williams", "The computing scientist’s main challenge is not to get confused by the complexities of his own making. — E. W. Dijkstra", "Progress in a fixed context is almost always a form of optimization. Creative acts generally don't stay in the context that they are in. — Alan Kay", "The essence of XML is this: the problem it solves is not hard, and it does not solve the problem well. — Phil Wadler", "A good programmer is someone who always looks both ways before crossing a one-way street. — Doug Linder", "Patterns mean \"I have run out of language.\" — Rich Hickey", "Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live. — John Woods", "Unix was not designed to stop its users from doing stupid things, as that would also stop them from doing clever things.", "Contrary to popular belief, Unix is user friendly. It just happens to be very selective about who it decides to make friends with.", "Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away. — Antoine de Saint-Exupéry", "There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. — C.A.R. Hoare", "Gott existiert, weil die Mathematik widerspruchsfrei ist, und der Teufel existiert, weil wir das nicht beweisen können. — Andre Weil", "If you don't make mistakes, you're not working on hard enough problems. — Frank Wilczek", "If you don't start with a spec, every piece of code you write is a patch. — Leslie Lamport", "Caches are bugs waiting to happen. — Rob Pike", "Abstraction is not about vagueness, it is about being precise at a new semantic level. — Dijkstra", "dd is horrible on purpose. It's a joke about OS/360 JCL. But today it's an internationally standardized joke. I guess that says it all. — Rob Pike", "All loops are infinite ones for faulty RAM modules. — graphitemaster", "All idioms must be learned. Good idioms only need to be learned once. — Alan Cooper", "For a successful technology, reality must take precedence over public relations, for Nature cannot be fooled. — Richard Feynman", "If programmers were electricians, parallel programmers would be bomb disposal experts. Both cut wires. — Bartosz Milewski", "Computers are harder to maintain at high altitude. Thinner air means less cushion between disk heads and platters. Also more radiation.", "Almost every programming language is overrated by its practitioners. — Larry Wall", "Fancy algorithms are slow when n is small, and n is usually small. — Rob Pike", "If C++ and Java are about type hierarchies and the taxonomy of types, Go is about composition. — Rob Pike", "Methods are just functions with a special first argument. — Andrew Gerrand", "Care About Your Craft\n\nWhy spend your life developing software unless you care about doing it well?", "Provide Options, Don’t Make Lame Excuses\n\nInstead of excuses, provide options. Don’t say it can’t be done; explain what can be done.", "Be a Catalyst for Change\n\nYou can’t force change on people. Instead, show them how the future might be and help them participate in creating it.", "Make Quality a Requirements Issue\n\nInvolve your users in determining the project’s real quality requirements.", "Critically Analyze What You Read and Hear\n\nDon’t be swayed by vendors, media hype, or dogma. Analyze information in terms of you and your project.", "DRY—Don’t Repeat Yourself\n\nEvery piece of knowledge must have a single, unambiguous, authoritative representation within a system.", "Eliminate Effects Between Unrelated Things\n\nDesign components that are self-contained, independent, and have a single, well-defined purpose.", "Use Tracer Bullets to Find the Target\n\nTracer bullets let you home in on your target by trying things and seeing how close they land.", "Program Close to the Problem Domain\n\nDesign and code in your user’s language.", "Iterate the Schedule with the Code\n\nUse experience you gain as you implement to refine the project time scales.", "Use the Power of Command Shells\n\nUse the shell when graphical user interfaces don’t cut it.", "Always Use Source Code Control\n\nSource code control is a time machine for your work—you can go back.", "Don’t Panic When Debugging\n\nTake a deep breath and THINK! about what could be causing the bug.", "Don’t Assume It—Prove It\n\nProve your assumptions in the actual environment—with real data and boundary conditions.", "Write Code That Writes Code\n\nCode generators increase your productivity and help avoid duplication.", "Design with Contracts\n\nUse contracts to document and verify that code does no more and no less than it claims to do.", "Use Assertions to Prevent the Impossible\n\nAssertions validate your assumptions. Use them to protect your code from an uncertain world.", "Finish What You Start\n\nWhere possible, the routine or object that allocates a resource should be responsible for deallocating it.", "Configure, Don’t Integrate\n\nImplement technology choices for an application as configuration options, not through integration or engineering.", "Analyze Workflow to Improve Concurrency\n\nExploit concurrency in your user’s workflow.", "Always Design for Concurrency\n\nAllow for concurrency, and you’ll design cleaner interfaces with fewer assumptions.", "Use Blackboards to Coordinate Workflow\n\nUse blackboards to coordinate disparate facts and agents, while maintaining independence and isolation among participants.", "Estimate the Order of Your Algorithms\n\nGet a feel for how long things are likely to take before you write code.", "Refactor Early, Refactor Often\n\nJust as you might weed and rearrange a garden, rewrite, rework, and re-architect code when it needs it. Fix the root of the problem.", "Test Your Software, or Your Users Will\n\nTest ruthlessly. Don’t make your users find bugs for you.", "Don’t Gather Requirements—Dig for Them\n\nRequirements rarely lie on the surface. They’re buried deep beneath layers of assumptions, misconceptions, and politics.", "Abstractions Live Longer than Details\n\nInvest in the abstraction, not the implementation. Abstractions can survive the barrage of changes from different implementations and new technologies.", "Don’t Think Outside the Box—Find the Box\n\nWhen faced with an impossible problem, identify the real constraints. Ask yourself: \"Does it have to be done this way? Does it have to be done at all?\"", "Some Things Are Better Done than Described\n\nDon’t fall into the specification spiral—at some point you need to start coding.", "Costly Tools Don’t Produce Better Designs\n\nBeware of vendor hype, industry dogma, and the aura of the price tag. Judge tools on their merits.", "Don’t Use Manual Procedures\n\nA shell script or batch file will execute the same instructions, in the same order, time after time.", "Coding Ain’t Done ‘Til All the Tests Run\n\n‘Nuff said.", "Test State Coverage, Not Code Coverage\n\nIdentify and test significant program states. Just testing lines of code isn’t enough.", "English is Just a Programming Language\n\nWrite documents as you would write code: honor the DRY principle, use metadata, MVC, automatic generation, and so on.", "Gently Exceed Your Users’ Expectations\n\nCome to understand your users’ expectations, then deliver just that little bit more.", "Think! About Your Work\n\nTurn off the autopilot and take control. Constantly critique and appraise your work.", "Don’t Live with Broken Windows\n\nFix bad designs, wrong decisions, and poor code when you see them.", "Remember the Big Picture\n\nDon’t get so engrossed in the details that you forget to check what’s happening around you.", "Invest Regularly in Your Knowledge Portfolio\n\nMake learning a habit.", "It’s Both What You Say and the Way You Say It\n\nThere’s no point in having great ideas if you don’t communicate them effectively.", "Make It Easy to Reuse\n\nIf it’s easy to reuse, people will. Create an environment that supports reuse.", "There Are No Final Decisions\n\nNo decision is cast in stone. Instead, consider each as being written in the sand at the beach, and plan for change.", "Prototype to Learn\n\nPrototyping is a learning experience. Its value lies not in the code you produce, but in the lessons you learn.", "Estimate to Avoid Surprises\n\nEstimate before you start. You’ll spot potential problems up front.", "Keep Knowledge in Plain Text\n\nPlain text won’t become obsolete. It helps leverage your work and simplifies debugging and testing.", "Use a Single Editor Well\n\nThe editor should be an extension of your hand; make sure your editor is configurable, extensible, and programmable.", "Fix the Problem, Not the Blame\n\nIt doesn’t really matter whether the bug is your fault or someone else’s—it is still your problem, and it still needs to be fixed.", "“select” Isn’t Broken\n\nIt is rare to find a bug in the OS or the compiler, or even a third-party product or library. The bug is most likely in the application.", "Learn a Text Manipulation Language\n\nYou spend a large part of each day working with text. Why not have the computer do some of it for you?", "You Can’t Write Perfect Software\n\nSoftware can’t be perfect. Protect your code and users from the inevitable errors.", "Crash Early\n\nA dead program normally does a lot less damage than a crippled one.", "Use Exceptions for Exceptional Problems\n\nExceptions can suffer from all the readability and maintainability problems of classic spaghetti code. Reserve exceptions for exceptional things.", "Minimize Coupling Between Modules\n\nAvoid coupling by writing “shy” code and applying the Law of Demeter.", "Put Abstractions in Code, Details in Metadata\n\nProgram for the general case, and put the specifics outside the compiled code base.", "Design Using Services\n\nDesign in terms of services—independent, concurrent objects behind well-defined, consistent interfaces.", "Separate Views from Models\n\nGain flexibility at low cost by designing your application in terms of models and views.", "Don’t Program by Coincidence\n\nRely only on reliable things. Beware of accidental complexity, and don’t confuse a happy coincidence with a purposeful plan.", "Test Your Estimates\n\nMathematical analysis of algorithms doesn’t tell you everything. Try timing your code in its target environment.", "Design to Test\n\nStart thinking about testing before you write a line of code.", "Don’t Use Wizard Code You Don’t Understand\n\nWizards can generate reams of code. Make sure you understand all of it before you incorporate it into your project.", "Work with a User to Think Like a User\n\nIt’s the best way to gain insight into how the system will really be used.", "Use a Project Glossary\n\nCreate and maintain a single source of all the specific terms and vocabulary for a project.", "Start When You’re Ready\n\nYou’ve been building experience all your life. Don’t ignore niggling doubts.", "Don’t Be a Slave to Formal Methods\n\nDon’t blindly adopt any technique without putting it into the context of your development practices and capabilities.", "Organize Teams Around Functionality\n\nDon’t separate designers from coders, testers from data modelers. Build teams the way you build code.", "Test Early. Test Often. Test Automatically.\n\nTests that run with every build are much more effective than test plans that sit on a shelf.", "Use Saboteurs to Test Your Testing\n\nIntroduce bugs on purpose in a separate copy of the source to verify that testing will catch them.", "Find Bugs Once\n\nOnce a human tester finds a bug, it should be the last time a human tester finds that bug. Automatic tests should check for it from then on.", "Build Documentation In, Don’t Bolt It On\n\nDocumentation created separately from code is less likely to be correct and up to date.", "Sign Your Work\n\nCraftsmen of an earlier age were proud to sign their work. You should be, too." ] puts ARGV[0] ? tips[ARGV[0].to_i] : tips.sample ================================================ FILE: bin/twump ================================================ #!/usr/bin/env ruby # Quick'n'dirty way to dump a tweet and its replies. Great for dumping wisdom # dropped in a thread. # # The name stands for "tweet dump". It's no pun on a misogynic, homophobic, # criminal, orange US president. require 'open-uri' require 'nokogiri' if ARGV.length < 1 puts "usage: #{$0[/[^\/]*$/]} " exit 1 end doc = Nokogiri::HTML(open(ARGV[0])) puts doc.css('p.tweet-text').map { |node| "#{node.content}\n\n" } ================================================ FILE: bin/unbook ================================================ #!/usr/bin/env bash if [[ -d __unbook ]]; then echo 'Directory "__unbook" exists. Remove it manually.' 1>&2 exit 1 fi if [[ $# -eq 0 ]]; then echo "usage: $0 <.rar/.zip>" 1>&2 exit 1 fi mkdir __unbook && cd __unbook mv ../"$1" . ext="${1##*.}" if [[ $ext = rar ]]; then unrar x "$1" elif [[ $ext = zip ]]; then unzip "$1" fi dir="$(find . -type d | tail -n1)" books="$(find "$dir" -type f \( -name '*.epub' -o -name '*.pdf' \))" book="$(grep '\.epub$' <<< "$books")" [[ -z $book ]] && book="$(grep '\.pdf$' <<< "$books")" if [[ -z $book ]]; then echo 'No boook found!' 1>&2 exit 1 fi if command -v rlwrap 1>/dev/null; then new_name="$(rlwrap -pYellow -S 'New name> ' -P "${book##*/}" -o cat)" mv "$book" ../"${new_name}" echo "→ ${new_name}" else mv "$book" .. echo "→ ${book##*/}" fi cd .. read -r -n 1 -p 'Remove __unbook? [y/n] ' choice [[ $choice == [yY] ]] && rm -r __unbook ================================================ FILE: bin/unixsniff ================================================ #!/usr/bin/env bash # This only works for stream sockets. # For datagram sockets use UNIX-RECVFROM/UNIX-RECV. if [[ $# -lt 1 ]]; then printf "usage: %s [socat flags] \n" "$(basename "$0")" 1>&2 exit 1 fi flags="${*: 1:$#-1}" socket="${*: -1}" mv "$socket" "$socket".tmp socat ${flags:--v} UNIX-LISTEN:"$socket",fork UNIX-CONNECT:"$socket.tmp" mv "$socket".tmp "$socket" ================================================ FILE: bin/vm ================================================ #!/usr/bin/env bash cmds=( dhcp info list save ssh start stop ) usage() { printf 'vm %s\n' "${cmds[@]}" exit 0 } list_vms() { declare -A vms while read -r line; do if [[ $line =~ ^\"(.*)\" ]]; then vms[${BASH_REMATCH[1]}]= fi done < <(VBoxManage list vms) while read -r line; do if [[ $line =~ ^\"(.*)\" ]]; then vms[${BASH_REMATCH[1]}]='[running]' fi done < <(VBoxManage list runningvms) for vm in "${!vms[@]}"; do if [[ ${vms[$vm]} =~ running ]]; then echo -e " -> \e[1m$vm ${vms[$vm]}\e[0m" else echo " -> $vm ${vms[$vm]}" fi done | sort } case "$1" in dhcp) VBoxManage list dhcpservers ;; info) if (( $# < 2 )); then echo 'vm info ' list_vms exit 0 fi VBoxManage showvminfo "$2" ;; l*) list_vms ;; save) if (( $# < 2 )); then echo 'vm save ' list_vms exit 0 fi VBoxManage controlvm "$2" savestate ;; ssh) shift # work around SSH banner timeout # ConnectionAttempts/ConnectTimeout won't help here while ! nc localhost 3022 ' list_vms exit 0 fi # VBoxManage modifyvm "$2" --nic1 bridged VBoxManage modifyvm "$2" --nic1 nat VBoxManage modifyvm "$2" --natpf1 'ssh,tcp,,3022,,22' 2>/dev/null VBoxHeadless --startvm "$2" & vm ssh ;; stop) if (( $# < 2 )); then vm="$(VBoxManage list runningvms | head -n1 | cut -d'"' -f2)" [[ -z $vm ]] && exit 1 else vm="$2" fi VBoxManage controlvm "$vm" poweroff ;; *) usage esac ================================================ FILE: bin/weasel ================================================ #!/bin/bash set -eu weasels=( clearly completely exceedingly excellent extremely fairly few huge interestingly largely many mostly quite relatively remarkably several significantly substantially surprisingly tiny various vast very ) if [ -z "${1:-}" ]; then echo "usage: `basename $0` ..." >&2 exit 1 fi IFS='|' if egrep -inH --color "\\b(${weasels[*]})\\b" "$@"; then echo echo "ERROR: weasel words detected in source text." exit 1 fi ================================================ FILE: bin/wlan ================================================ #!/bin/bash function connect() { echo "[*] Setting up wlan0.." sudo ifconfig wlan0 up echo "[*] Connect to router.." sudo wpa_supplicant -B -i wlan0 -D wext -c /etc/wpa_supplicant/wpa_supplicant.conf -f /etc/wpa_supplicant/wlan.log echo "[*] Getting local IP address.." sudo dhclient -q wlan0 echo "[*] Connected to WLAN!" | osd_cat -c yellow -d 2 -p middle -A center -f -*-terminus-*-r-*-*-32-*-*-*-*-*-iso10646-* & } function disconnect() { echo "[-] Terminating wpa_supplicant.." sudo killall -q -2 wpa_supplicant echo "[-] Terminating dhclient.." sudo killall -q -2 dhclient echo "[-] Shutting down wlan interface.." sudo ifconfig wlan0 down echo "[-] Disconnected from WLAN!" | osd_cat -d 2 -p middle -A center -f -*-terminus-*-r-*-*-32-*-*-*-*-*-iso10646-* & } function reconnect() { disconnect connect } while getopts "cdr" opt; do case "$opt" in c) connect;; d) disconnect;; r) reconnect;; esac done echo "[*] ./${0##*/} executed!" ================================================ FILE: bin/zproc ================================================ #!/bin/zsh # # Author: Marco Hinz # URL: http://github.com/mhinz # Desc: This script outputs information about processes taken from /proc. # Input: Either a PID or (part of) a process name. Several arguments possible. # typeset -A stat zmodload -ab zsh/stat stat if [[ $terminfo[colors] -eq 256 ]] { red=$(echoti setaf 167) yellow=$(echoti setaf 215) } else { red=$(echoti setaf 1) yellow=$(echoti setaf 3) } green=$(echoti setaf 2) reset=$(echoti sgr0) get_info() { builtin stat -H link +link exe cd /proc/$1 2>/dev/null || return comm=$(< comm) cmdline=(${(0)"$(< cmdline)"}) echo "${yellow}${comm} ($1)${reset}" echo " ${red}* Status:${reset}" printf " ${green}%-10s${reset} %s\n" "Bin:" $link[link] printf " ${green}%-10s${reset} %s" "Flags:" "${cmdline[2,-1]:-(none)}" # The perl code here does exactly the same # as the following while and for loop. #perl -ne 'use Term::ANSIColor; /^(State|Pid|PPid|Threads):\s+(.+)/ && #printf "\n %-19s %s ", colored("$1:", 'green'), $2' status while { read k v } { stat[$k]=$v } < status for i (State: Pid: PPid: Threads:) { printf "\n ${green}%-10s${reset} %s" $i "$stat[$i]" } echo " (" task/*(N:t) ")" echo " ${red}* Descriptors:${reset}" for i (fd/*(nN)) { builtin stat -H link +link "$i" printf " ${green}%-10s${reset} %s\n" "$i:" "$link" } } main() { for i ($@) { [[ $i == <-> ]] && get_info $i && continue main $(pgrep $i) } } main $@ ================================================ FILE: english.yaml ================================================ abberation: Abweichung, Anomalie accomodation: Unterkunft accretion: Wertsteigerung, Zuwachs acrimoniously: bitter, verbittert adamant: hartnäckig admonition: Ermahnung, Mahnung affect sb.: jmd. betreffen affectionate: liebevoll affidavit: Versicherung (Beteuerung), eidesstattliche Erklärung affliction: Krankheit, Gebrechen agitable: erregbar agitated: erregt (disturbed, upset) ailment: Krankheit, Leiden albeit: obgleich, wenngleich, allerdings, jedoch ambigigous: zwei- oder mehrdeutig anointing: Salbung, Ölung anticipation: Vorfreude, Erwartung apoplectic: rasend (vor Wut) appreciation: Dankbarkeit, Wertschätzung aptitude: Begabung arid: trocken, wasserarm askance: misstrauisch aspersion: Verleumdung, abfällige Bemerkung, besprühen mit Weihwasser (reli.) astonishing: erstaunlich attenuation: Dämpfung, Abschwächung attire: Kleidung, Anzug, Tracht attrition: Zermürbung, Abnutzung, Verschleiß audacity: Dreistigkeit avid: begeistert awe: Ehrfurcht bad-tempered: schlecht gelaunt baffled: erstaunt beguiling: betörend ("beguilingly convenient") belligerently: streitlustig benign: harmlos, gutartig (med.) bland: fade blanket: pauschal, generell blazing: leuchtend, lodernd blunder: Patzer, Schnitzer blunderbuss: Tollpatsch, Donnerbüchse (hist. Schusswaffe) blurt smth. out: mit etw. herausplatzen bodacious: toll, großartig, aufregend bountiful: reichlich, reich by heart: auswendig capricious: launisch, unberechenbar charge: Anklage chastened: gedrückt, gedämpft (Stimmung), geläutert (zur Einsicht gelangt) clandestine: geheim, heimlich clumsy: holprig, plump, ungeschickt combustible: brennbar, entflammbar compartmentalized: unterteilt complacency: Selbstgefälligkeit, Selbstzufriedenheit compulsive: zwanghaft, triebhaft compulsory: vorgeschrieben, verpflichtend, zwingend, verbindlich conceivably: denkbar condescendingly: herablassend, von oben herab contagious: ansteckend contemplating: betrachted, erwägend contiguous: zusammenhängend, angrenzend conversely: umgekehrt, im Gegenzug cosy: gemütlich crooked: krumm, schief crucial: entscheidend declension: Deklination defiant: trotzig delight me: begeistere mich delightful: entzückend, köstlich, erfreulich demeanor: Auftreten, Benehmen demonize smth.: etw. verteufeln derogatory: abwertend, abfällig designated: dafür bestimmt, vorgesehen deterioration: Verschlechterung, Verfall, Abnutzung deterrence: Abschreckung detrimental: schädlich, nachteilig devoted: treu ergeben dichotomy: Zweiteilung, Gegensätzlichkeit diminutive: verkleinernd discernment: Urteilsvermögen dismal: düster, trostlos disparaging: abschätzig dissolve: (sich) auflösen distortion: Verfälschung distress: Not, Elend, Bedrängnis, Notlage domestically: im Inland drought: Dürre(periode) duly: ordnungsgemäß, ordentlich, formgerecht edible: essbar eerie: unheimlich, gruselig effigy: Nachbildung, oft Puppe oder bildhafte Darstellung einer verhassten Person effusive: überschwänglich egregious: ungeheuerlich emaciated: abgemagert endearment: Zärtlichkeit endowment: Schenkung (law) ephemeral: vergänglich, kurzlebig eponymous: gleichnamig equitable: gerecht escrow: Treuhand, Hinterlegung, Übertragungsurkunde etymology: Wortherkunft evitable: vermeidbar exaltation: Begeisterung expat: kurz fuer= expatriate, im Ausland lebende/arbeitende Person expulsion: Ausschluss, Vertreibung exsanguinated: ausgeblutet extensively: ausführlich factual: sachlich faltering: stockend, halbherzig, zögernd, schwankend (faltering economy -> stagnierende Wirtschaft) fatuous: töricht, albern, einfältig fool around: herumalbern foothold: Standbein fraudulent: betrügerisch furtive: heimlich, verstohlen fuss: Wirbel, Aufregung garbled: verstümmelt garrulous: geschwätzig gathering: Zusammenkunft genuine: echt, authentisch, unverfälscht, aufrichtig (sincere) get across: rüberbringen get back on track: wieder auf die Beine kommen glumly: bedrückt, niedergeschlagen gnarly: krass (ugs.), knochig go to (greath) lengths: sich große Mühe geben gorge: Schlucht grant: Zuschuss greasy: fettig grid: Raster grieving: trauernd grim: düster grouch: Muffel, Griesgram guts: Mut haphazardly: zufällig, willkürlich hawkishness: Angriffslust heinous: abscheulich, schrecklich, verabscheuungswürdig heretofore: bisher, bislang high-pitched: schrill hitherto: bisher humble: bescheiden, einfach hurdle: Hindernis, Hürde hushed: gedämpft i.e.: d.h. idiosyncrasy: Eigenart ignitable: entflammbar imminent: bevorstehend, drohend (Gewitter, Gefahr, etc.) implication: Folge, Auswirkung impunity: Straffreiheit in a fit of pique: in plötzlicher Gereiztheit in office: im Amt in perpetuity: auf Dauer, auf Ewig in vain: vergebens, umsonst incapacitated: arbeitsunfähig incessant: unaufhörlich, unablässig incessantly: unaufhörlich, ständig incidentally: übrigens incumbent: amtierend, vorherrschend indefatigable: unermüdlich indomitable: unbeugsam, unbezwingbar inept: unfähig, untauglich inextricably: untrennbar miteinander verbunden infatuating: betörend ingenuity: Einfallsreichtum innocuous: harmlos insipid: fade, geschmacklos (lacking flavour) interlocking: ineinandergreifend intransigence: Unnachgiebigkeit intrepid: kühn, unerschrocken invasive: angreifend, eindringend, in die Privatsphäre eingreifend invigorated by: gestärkt/belebt durch invincible: unbesiegbar irritated: genervt, gereizt, reizbar judiciously: vernünftig, umsichtig keen to do smth.: etw. unbedingt tun wollen laconic: lakonisch, prägnant, kurz und bündig landed gentry: Landadel laurels: Lorbeeren leaping: hevorspringend let it marinate for now: etwas sacken lassen (ugs.) levy: Abgabe, Steuer, Gebühr, Erhebung literally: wörtlich litigation: Rechtsstreit, Prozess littering: Vermüllen livestock: Viehbestand, Nutztiere lollygagging: Trödeln (Am.) loquacious: magnanimous: großherzig, großzügig, generious or forgiving (esp. towards a rival or less powerful person) marvellous: wunderbar, fabelhaft, wundervoll, herrlich measure: Maßnahme memorable: unvergesslich mental imagery: Kopfkino mind-numbingly: öde, todlangweilig miniscule: unbedeutend, winzig moniker: Spitzname moot: irrelevant, strittig, fraglich moribund: todgeweiht, sterbend mustard: Senf nascent: im Entstehen begriffen nasty: übel, unangenehm neatly: sauber, ordentlich nebulous: nebelig, unklar nefarious: schändlich, ruchlos, verachtenswert newfangled: neumodisch nothing out of the ordinary: nicht ungewöhnlich old hand: alter Hase outraged: empört outrageous: abscheulich, empörend pageantry: Prunk palpable: greifbar, fühlbar pastry: Gebäck penultimate: vorletzter peremptoriness: Endgültigkeit pernicious: schädlich petrichor: Regengeruch pile of straw: Strohballen pilfering: stibitzend, geringfügiger Diebstahl (law) plaintiff: Kläger polling booth: Wahlkabine precarious: unsicher, heikel precocious: altklug, frühreif preposterous: absurd, lächerlich, grotesk prized: geschätzt, wertvoll procurement: Beschaffung profit margin: Profitspanne profound: tiefgreifend, tiefgründig promiscuous: leichtfertig, wahllos pros and cons: Vor- und Nachteile pugnacious: kampflustig, streitsüchtig putrescent: verfaulend rambunctious: ungestüm, wild (tobend) rap sb. on the knuckles: jmd. auf die Finger klopfen rapport: Übereinstimmung, enge Beziehung ("eye contact with the audience helps building rapport") ravenously: ausgehungert ravine: Schlucht, Klamm rebuttal: Gegenbeweis, Widerlegung reckoning: Abrechnung resuscitate: wiederbeleben, reanimieren retailer: Einzelhändler retaliate: kontern reverberating: nachhallen, widerhallen rumpled: zerknittert sardonic: hämisch, sarkastisch savage: wild, brutal, unzivilisiert savory: schmackhaft, herzhaft scant: knapp, gering (improvement, success) seabed: Meeresboden see eye to eye: einer Meinung sein serenity: Gelassenheit servile: unterwürfig, sklavish shelled: gepult, geschält shortcoming: Unzulänglichkeit shrewd: schlau, gerissen (ugs.) signatory: Unterzeichner, Vertragsstaat skittishness: sprunghaftigkeit sleight: Geschicklichkeit, List smth. has to give: etwas muss weichen so as to: so dass, um...zu ("Put it into a fund, so as to get interested on it"), [alternativ= in order to] sordid: schäbig, heruntergekommen (ugs.) squeamish: zimperlich stark: krass stilt: Pfeiler, Pfahl stringent: streng, strikt stringing together: aneinanderreihen stunned: benommen subordinate clause: Nebensatz subpoena: Zwangsvorladung subsidy: Subvention succinct: prägnant, knapp, kurz, lapidar sumptuous: üppig (Ausstattung, Essen) supremacy: Vorherrschaft, Obergewalt surface car: Straßenbahn surreptitiously: heimlich sustainability: Nachhaltigkeit tacit: stillschweigend tantalizing: verlockend, verführerisch teal: petrol, blaugrün temerity: Frechheit, Dreistigkeit (excessive boldness) tenacious: hartnäckig, beharrlich tenacity: Zähigkeit, Beharrlichkeit, Hartnäckigkeit tentatively: zögernd to abound: reichlich vorhanden sein ("a business in which opportunities abound", "life abounded in mysteries") to acquire: erwerben, bekommen to assess: beurteilen, bewerten to bang shut: zuschlagen ("the door banged shut") to bargain: (ver)handeln to barge in: sich einmischen to be a goner: erledigt sein to be in a pique with sb: gegen jmd. einen Groll hegen to boast: angeben, prahlen to bother: sich bemühen to buttress: untermauern to commemorate sb./sth.: jmd./etw. gedenken ("in commemoration of") to confine: beschränken, einsperren, einengen, limitieren to convey: übermitteln, übertragen to croak: krächzen, abkratzen (coll.) to dazzle: blenden to demote: zurückstufen, herabsetzen to devise: entwickeln, ausarbeiten to digress: abschweifen (vom Thema) to disdain: verachten, geringschätzen to evoke: heraufbeschwören to feast: schlemmen, feiern to fix: festlegen, festmontieren, binden (Preis), Drogen spritzen to flash: aufblitzen lassen to foil sb.: jmd. einen Strich durch die Rechnung machen to foil smth.: vereiteln to gasp: keuchen, nach Luft ringen to giggle: kichern to grouch: nörgeln, schimpfen to grovel: kriechen (to behave in a servile manner) to hinder: hindern, aufhalten to hiss: zischen to hum and haw: herumdrucksen to hush: beschwichtigen, verstummen, still sein, zum Schweigen bringen to incinerate smth.: etw. verbrennen to incinerate: verbrennen, einäschern to levy: erheben (tax, fine) to litter: zumüllen to lollygag: Zeit verplempern (Am.) to look askance at sb.: jmd. missbilligend/misstrauisch ansehen to mime: pantomimisch darstellen to plead: bitten (mit Nachdruck) to put aside: beiseitelegen to reconcile: schlichten to reimpose: wiederauferlegen to root for sb.: jmd. anfeuern to roster sb.: jmd. eintragen (in eine Liste schreiben) to scourge sb.: jmd. auspeitschen, geißeln to snort: schnauben, prusten to spur: anstacheln, vorantreiben to stack: stapeln to stamp: stampfen to surmise: vermuten to thrive: gedeihen, florieren to tinker with: an etw. tüfteln to underpin: untermauern to usurp sb.: jmd. verdrängen to usurp smth.: sich etw. bemächtigen ("the white man usurped more and more of the natives' land") to utter: äußern, aussprechen, in Umlauf bringen (z.B. Geld) to wade: waten to wind down: entspannen tortuous: gewunden, verworren translucent: lichtdurchlässig trench: Graben typified: versinnbildlicht, verkörpert unfazed: unbeeindruckt unfettered: uneingeschränkt unprecedented: beispiellos unruffled: unerschüttert unsolicited: unaufgefordert unswerving: unerschütterlich up in the air: noch offen, in der Schwebe (idiom) utter: äußerst vacuous: nichtssagend vendor: Verkäufer, Lieferant vernacular: örtlich, volkssprachlich, mundartlich vested interest: Eigeninteresse vestigal: rudimentär, spärlich vigilance: Wachsamkeit, Umsicht vile: abscheulich (schändlich, verwerflich), ekelhaft vindication: Geltendmachung visceral: tief sitzend volatile: flüchtig, unbeständig voracious: unersättlich ward: Abteilung whiff: Hauch wistfully: wehmütig withdrawal: Rückzug worthy: angemessen, würdig, lobenswert