| @ -0,0 +1,109 @@ | |||||
| #!/bin/bash | |||||
| set -o vi | |||||
| bind -m vi-insert "\C-l":clear-screen | |||||
| shopt -s extglob | |||||
| HISTSIZE= | |||||
| HISTFILESIZE= | |||||
| export EDITOR='nvim' | |||||
| export GIT_AUTHOR_NAME="Tovi Jaeschke-Rogers" | |||||
| export GIT_AUTHOR_EMAIL="tovi@tovijaeschke.xyz" | |||||
| export GIT_COMMITTER_NAME="Tovi Jaeschke-Rogers" | |||||
| export GIT_COMMITTER_EMAIL="tovi@tovijaeschke.xyz" | |||||
| export LESS='-R' | |||||
| export LESSOPEN='|~/.lessfilter %s' | |||||
| alias ls="ls --color=auto" \ | |||||
| vb='nvim ~/.bashrc && source ~/.bashrc' \ | |||||
| va='nvim ~/.config/aliasrc && source ~/.bashrc' | |||||
| if [[ $(uname) != "Linux" ]]; then | |||||
| test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash" || true | |||||
| export HOMEBREW_NO_INSTALL_CLEANUP=1 | |||||
| export GIT_AUTHOR_EMAIL="tovi.jaeschke-rogers@thirty4.com" | |||||
| export GIT_COMMITTER_EMAIL="tovi.jaeschke-rogers@thirty4.com" | |||||
| alias ls="ls -G" \ | |||||
| vb='nvim ~/.bash_profile && source ~/.bash_profile' \ | |||||
| va='nvim ~/.config/aliasrc && source ~/.bash_profile' | |||||
| mount-hdd() { | |||||
| if [ -z $1 ]; then | |||||
| sudo umount /dev/disk2s1 && sudo /usr/local/bin/ntfs-3g /dev/disk2s1 /Volumes/NTFS -olocal -oallow_other | |||||
| else | |||||
| sudo umount /dev/$1 && sudo /usr/local/bin/ntfs-3g /dev/$1 /Volumes/NTFS -olocal -oallow_other | |||||
| fi | |||||
| } | |||||
| fi | |||||
| # set PATH so it includes user's private bin if it exists | |||||
| if [ -d "$HOME/.local/bin" ] ; then | |||||
| PATH="$PATH:$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':')" | |||||
| fi | |||||
| source ~/.config/aliasrc | |||||
| parse_git_branch() { | |||||
| git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' | |||||
| } | |||||
| export PS1=" \[\033[0;36m\]\t \[\033[0;35m\]\u\[\033[0;32m\]@\[\033[0;34m\]\h \[\033[32m\]\W\[\033[33m\]\$(parse_git_branch)\[\033[31m\] \n$\[\033[00m\] " | |||||
| mkcd() { | |||||
| if [ ! -d "$1" ]; then | |||||
| mkdir -p "$1" && cd "$1" | |||||
| elif [ -d "$1" ]; then | |||||
| cd "$1" | |||||
| else | |||||
| echo "Error" | |||||
| fi | |||||
| } | |||||
| # Go up directory structures | |||||
| up() { | |||||
| cd $(printf "%0.0s../" $(seq 1 $1)); | |||||
| } | |||||
| git() { | |||||
| if [[ $@ == "mergetool" ]]; then | |||||
| command git mergetool --no-gui | |||||
| else | |||||
| command git $@ | |||||
| fi | |||||
| } | |||||
| # git branch -vv | grep 'gone\]' | awk ' { print $1 }' | xargs -p git branch -d | |||||
| git-prune() { | |||||
| if [[ $@ == "--apply" ]]; then | |||||
| command git branch --merged develop | grep -vEw "develop$|master$" | xargs git branch -d | |||||
| else | |||||
| echo "Run \"git prune --apply\" to delete the following branches:" | |||||
| command git branch --merged develop | grep -vEw "develop$|master$" | |||||
| fi | |||||
| } | |||||
| color-diff() { | |||||
| if [ -z ${1+x} ] || [ -z ${2+x} ]; then | |||||
| echo "Usage: color-diff dir1/ dir2/" | |||||
| return | |||||
| fi | |||||
| diff -bur $1 $2 | colordiff | less | |||||
| } | |||||
| export NVM_DIR="$HOME/.nvm" | |||||
| [ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh" # This loads nvm | |||||
| [ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm" | |||||
| [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion | |||||
| [[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh" | |||||
| @ -0,0 +1,26 @@ | |||||
| #!/bin/sh | |||||
| alias q='exit' \ | |||||
| dd='sudo dd status=progress' \ | |||||
| h="history | grep" \ | |||||
| back='cd -' \ | |||||
| b='cd -' \ | |||||
| py='python3' \ | |||||
| py2='python2' \ | |||||
| v='nvim' \ | |||||
| vim='nvim' \ | |||||
| ka='killall' \ | |||||
| grep='grep --color=auto' \ | |||||
| egrep='grep --color=auto -E' \ | |||||
| sshtj='ssh tovi@tovijaeschke.xyz' \ | |||||
| extip='curl -s www.icanhazip.com' \ | |||||
| ns='sudo nmap -p- -sV' \ | |||||
| cc='rm -rf cache/* && php symfony cc' \ | |||||
| pdu='php symfony propel:diff && php symfony propel:up' \ | |||||
| foursync='php symfony four:sync' \ | |||||
| ddate='date +%d-%m-%Y' \ | |||||
| gitup='git push origin $(git rev-parse --abbrev-ref HEAD)' \ | |||||
| gco='git checkout' \ | |||||
| vv='nvim ~/.config/nvim/init.vim' \ | |||||
| delorig='find . -name "*.orig" -exec rm {} \;' \ | |||||
| delbak='find . -name "*.bak" -exec rm {} \;' \ | |||||
| site-clone='wget --mirror --convert-links --adjust-extension --page-requisites --no-parent' | |||||
| @ -0,0 +1,204 @@ | |||||
| let mapleader ="," | |||||
| if ! filereadable(expand('~/.config/nvim/autoload/plug.vim')) | |||||
| echo "Downloading junegunn/vim-plug to manage plugins..." | |||||
| silent !mkdir -p ~/.config/nvim/autoload/ | |||||
| silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ~/.config/nvim/autoload/plug.vim | |||||
| autocmd VimEnter * PlugInstall | |||||
| endif | |||||
| call plug#begin('~/.config/nvim/plugged') | |||||
| Plug 'morhetz/gruvbox' | |||||
| Plug 'neoclide/coc.nvim', {'branch': 'release'} | |||||
| Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } | |||||
| Plug 'junegunn/fzf.vim' | |||||
| "Plug 'vim-scripts/jcommenter.vim' | |||||
| "Plug 'SirVer/ultisnips' | |||||
| "Plug 'phux/vim-snippets' | |||||
| "Plug 'tobyS/vmustache' | |||||
| "Plug 'tobyS/pdv' | |||||
| Plug 'Rican7/php-doc-modded' | |||||
| Plug 'jreybert/vimagit' | |||||
| Plug 'bling/vim-airline' | |||||
| Plug 'tpope/vim-commentary' | |||||
| Plug 'tpope/vim-fugitive' | |||||
| Plug 'rbong/vim-flog' | |||||
| Plug 'ap/vim-css-color' | |||||
| call plug#end() | |||||
| " Some basics: | |||||
| set go=a | |||||
| set mouse=a | |||||
| set nohlsearch | |||||
| set clipboard+=unnamedplus | |||||
| set incsearch | |||||
| set smartcase | |||||
| set noswapfile | |||||
| set nobackup | |||||
| set undodir=~/.config/nvim/undodir | |||||
| set undofile | |||||
| colorscheme gruvbox | |||||
| set background=dark | |||||
| nnoremap c "_c | |||||
| set nocompatible | |||||
| filetype plugin on | |||||
| syntax on | |||||
| set encoding=utf-8 | |||||
| set number relativenumber | |||||
| " Indent marks | |||||
| "set listchars=tab:\|_ | |||||
| "set list | |||||
| " Tab 2 spaces | |||||
| filetype plugin indent on | |||||
| set tabstop=2 softtabstop=2 expandtab shiftwidth=2 smarttab | |||||
| " Disables automatic commenting on newline: | |||||
| autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o | |||||
| " coc | |||||
| inoremap <silent><expr> <TAB> | |||||
| \ pumvisible() ? "\<C-n>" : | |||||
| \ <SID>check_back_space() ? "\<TAB>" : | |||||
| \ coc#refresh() | |||||
| inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>" | |||||
| function! s:check_back_space() abort | |||||
| let col = col('.') - 1 | |||||
| return !col || getline('.')[col - 1] =~# '\s' | |||||
| endfunction | |||||
| nmap <leader>gd <Plug>(coc-definition) | |||||
| nmap <leader>gr <Plug>(coc-references) | |||||
| inoremap <expr> <C-j> pumvisible() ? "\<Down>" : "\<C-j>" | |||||
| inoremap <expr> <C-k> pumvisible() ? "\<Up>" : "\<C-k>" | |||||
| " fzf remaps | |||||
| "nnoremap <C-p> :GFiles<CR> | |||||
| nnoremap <C-q> :GFiles<CR> | |||||
| nnoremap <C-a> :Files<CR> | |||||
| " php-doc-modded | |||||
| nnoremap <C-c> :call PhpDocSingle()<CR>i | |||||
| "nnoremap <C-P> :call PhpDocSingle()<CR> | |||||
| "vnoremap <C-P> :call PhpDocRange()<CR> | |||||
| let g:pdv_cfg_autoEndClass = 0 | |||||
| let g:pdv_cfg_autoEndFunction = 0 | |||||
| " Spell-check set to <leader>o, 'o' for 'orthography': | |||||
| map <leader>o :setlocal spell! spelllang=en_au<CR> | |||||
| " Splits open at the bottom and right, which is non-retarded, unlike vim defaults. | |||||
| set splitbelow splitright | |||||
| " Shortcutting split navigation, saving a keypress: | |||||
| " nnoremap <C-h> <C-w>h | |||||
| " nnoremap <C-j> <C-w>j | |||||
| " nnoremap <C-k> <C-w>k | |||||
| " nnoremap <C-l> <C-w>l | |||||
| " Check file in shellcheck: | |||||
| map <leader>s :!clear && shellcheck %<CR> | |||||
| " Replace all is aliased to S. | |||||
| nnoremap S :%s//g<Left><Left> | |||||
| " Ensure files are read as what I want: | |||||
| let g:vimwiki_ext2syntax = {'.Rmd': 'markdown', '.rmd': 'markdown','.md': 'markdown', '.markdown': 'markdown', '.mdown': 'markdown'} | |||||
| let g:vimwiki_list = [{'path': '~/vimwiki', 'syntax': 'markdown', 'ext': '.md'}] | |||||
| autocmd BufRead,BufNewFile *.ms,*.me,*.mom,*.man set filetype=groff | |||||
| autocmd BufRead,BufNewFile *.tex set filetype=tex | |||||
| " Automatically deletes all trailing whitespace on save. | |||||
| autocmd BufWritePre * %s/\s\+$//e | |||||
| " Rebind $ to <leader>d | |||||
| nnoremap <leader>d $ | |||||
| " Navigating with guides | |||||
| inoremap <leader><leader> <Esc>/<++><Enter>"_c4l | |||||
| vnoremap <leader><leader> <Esc>/<++><Enter>"_c4l | |||||
| map <leader><leader> <Esc>/<++><Enter>"_c4l | |||||
| " Remember last cursor position | |||||
| autocmd BufReadPost * if @% !~# '\.git[\/\\]COMMIT_EDITMSG$' && line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif | |||||
| " Update CHANGELOG message | |||||
| inoremap <leader>C Update CHANGELOG<esc>:wq<cr> | |||||
| """HTML | |||||
| autocmd FileType html inoremap <leader>b <b></b><Space><++><Esc>FbT>i | |||||
| autocmd FileType html inoremap <leader>it <em></em><Space><++><Esc>FeT>i | |||||
| autocmd FileType html inoremap <leader>1 <h1></h1><Enter><Enter><++><Esc>2kf<i | |||||
| autocmd FileType html inoremap <leader>2 <h2></h2><Enter><Enter><++><Esc>2kf<i | |||||
| autocmd FileType html inoremap <leader>3 <h3></h3><Enter><Enter><++><Esc>2kf<i | |||||
| autocmd FileType html inoremap <leader>p <p></p><Enter><Enter><++><Esc>02kf>a | |||||
| autocmd FileType html inoremap <leader>a <a<Space>href=""><++></a><Space><++><Esc>14hi | |||||
| autocmd FileType html inoremap <leader>e <a<Space>target="_blank"<Space>href=""><++></a><Space><++><Esc>14hi | |||||
| autocmd FileType html inoremap <leader>ul <ul><Enter><li></li><Enter></ul><Enter><Enter><++><Esc>03kf<i | |||||
| autocmd FileType html inoremap <leader>li <Esc>o<li></li><Esc>F>a | |||||
| autocmd FileType html inoremap <leader>ol <ol><Enter><li></li><Enter></ol><Enter><Enter><++><Esc>03kf<i | |||||
| autocmd FileType html inoremap <leader>im <img src="" alt="<++>"><++><esc>Fcf"a | |||||
| autocmd FileType html inoremap <leader>td <td></td><++><Esc>Fdcit | |||||
| autocmd FileType html inoremap <leader>tr <tr></tr><Enter><++><Esc>kf<i | |||||
| autocmd FileType html inoremap <leader>th <th></th><++><Esc>Fhcit | |||||
| autocmd FileType html inoremap <leader>tab <table><Enter></table><Esc>O | |||||
| autocmd FileType html inoremap <leader>gr <font color="green"></font><Esc>F>a | |||||
| autocmd FileType html inoremap <leader>rd <font color="red"></font><Esc>F>a | |||||
| autocmd FileType html inoremap <leader>yl <font color="yellow"></font><Esc>F>a | |||||
| autocmd FileType html inoremap <leader>dt <dt></dt><Enter><dd><++></dd><Enter><++><esc>2kcit | |||||
| autocmd FileType html inoremap <leader>dl <dl><Enter><Enter></dl><enter><enter><++><esc>3kcc | |||||
| autocmd FileType html inoremap &<space> &<space> | |||||
| autocmd FileType html inoremap á á | |||||
| autocmd FileType html inoremap é é | |||||
| autocmd FileType html inoremap í í | |||||
| autocmd FileType html inoremap ó ó | |||||
| autocmd FileType html inoremap ú ú | |||||
| autocmd FileType html inoremap ä ä | |||||
| autocmd FileType html inoremap ë ë | |||||
| autocmd FileType html inoremap ï ï | |||||
| autocmd FileType html inoremap ö ö | |||||
| autocmd FileType html inoremap ü ü | |||||
| autocmd FileType html inoremap ã ã | |||||
| autocmd FileType html inoremap ẽ &etilde; | |||||
| autocmd FileType html inoremap ĩ ĩ | |||||
| autocmd FileType html inoremap õ õ | |||||
| autocmd FileType html inoremap ũ ũ | |||||
| autocmd FileType html inoremap ñ ñ | |||||
| autocmd FileType html inoremap à à | |||||
| autocmd FileType html inoremap è è | |||||
| autocmd FileType html inoremap ì ì | |||||
| autocmd FileType html inoremap ò ò | |||||
| autocmd FileType html inoremap ù ù | |||||
| ""MARKDOWN | |||||
| " autocmd Filetype markdown,rmd map <leader>w yiWi[<esc>Ea](<esc>pa) | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>n ---<Enter><Enter> | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>b ****<++><Esc>F*hi | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>s ~~~~<++><Esc>F~hi | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>e **<++><Esc>F*i | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>h ====<Space><++><Esc>F=hi | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>i <++><Esc>F[a | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>a [](<++>)<++><Esc>F[a | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>1 #<Space><Enter><++><Esc>kA | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>2 ##<Space><Enter><++><Esc>kA | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>3 ###<Space><Enter><++><Esc>kA | |||||
| " autocmd Filetype markdown,rmd inoremap <leader>l --------<Enter> | |||||
| " autocmd Filetype rmd inoremap <leader>r ```{r}<CR>```<CR><CR><esc>2kO | |||||
| " autocmd Filetype rmd inoremap <leader>p ```{python}<CR>```<CR><CR><esc>2kO | |||||
| " autocmd Filetype rmd inoremap <leader>c ```<cr>```<cr><cr><esc>2kO | |||||
| """.php | |||||
| autocmd FileType php inoremap <leader>f public function <Enter>{<Enter><Tab><++><Enter>}<Esc>kkk$i | |||||
| autocmd FileType php inoremap <leader>t $this | |||||
| autocmd FileType php inoremap <leader>u use Thirty4\Theme\Form\\<++>;<Esc>5hi | |||||
| autocmd FileType php inoremap <leader>s 'url' => [ 'select', [ 'name' => '' ]],<Esc>4hi | |||||
| autocmd FileType php inoremap <leader>v var_dump();<CR>die();<Esc>k$hi | |||||
| @ -0,0 +1,6 @@ | |||||
| .idea | |||||
| lib/filter/base | |||||
| lib/form/base | |||||
| zz_release_ticket.php | |||||
| ZzDummyTask.class.php | |||||
| lib/task/ZzDummyTask.class.php | |||||
| @ -0,0 +1,608 @@ | |||||
| #!/bin/bash | |||||
| # The iTerm2 customizations fall under the following license: | |||||
| # | |||||
| # This program is free software; you can redistribute it and/or | |||||
| # modify it under the terms of the GNU General Public License | |||||
| # as published by the Free Software Foundation; either version 2 | |||||
| # of the License, or (at your option) any later version. | |||||
| # | |||||
| # This program is distributed in the hope that it will be useful, | |||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| # GNU General Public License for more details. | |||||
| # | |||||
| # You should have received a copy of the GNU General Public License | |||||
| # along with this program; if not, write to the Free Software | |||||
| # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
| # -- BEGIN ITERM2 CUSTOMIZATIONS -- | |||||
| if [[ "$ITERM_ENABLE_SHELL_INTEGRATION_WITH_TMUX""$TERM" != screen && "$ITERM_SHELL_INTEGRATION_INSTALLED" = "" && "$-" == *i* && "$TERM" != linux && "$TERM" != dumb ]]; then | |||||
| if shopt extdebug | grep on > /dev/null; then | |||||
| echo "iTerm2 Shell Integration not installed." | |||||
| echo "" | |||||
| echo "Your shell has 'extdebug' turned on." | |||||
| echo "This is incompatible with shell integration." | |||||
| echo "Find 'shopt -s extdebug' in bash's rc scripts and remove it." | |||||
| return 0 | |||||
| fi | |||||
| ITERM_SHELL_INTEGRATION_INSTALLED=Yes | |||||
| # Saved copy of your PS1. This is used to detect if the user changes PS1 | |||||
| # directly. ITERM_PREV_PS1 will hold the last value that this script set PS1 to | |||||
| # (including various custom escape sequences). | |||||
| ITERM_PREV_PS1="$PS1" | |||||
| # The following chunk of code, bash-preexec.sh, is licensed like this: | |||||
| # The MIT License | |||||
| # | |||||
| # Copyright (c) 2015 Ryan Caloras and contributors (see https://github.com/rcaloras/bash-preexec) | |||||
| # | |||||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
| # of this software and associated documentation files (the "Software"), to deal | |||||
| # in the Software without restriction, including without limitation the rights | |||||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
| # copies of the Software, and to permit persons to whom the Software is | |||||
| # furnished to do so, subject to the following conditions: | |||||
| # | |||||
| # The above copyright notice and this permission notice shall be included in | |||||
| # all copies or substantial portions of the Software. | |||||
| # | |||||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
| # THE SOFTWARE. | |||||
| # Wrap bash-preexec.sh in a function so that, if it exits early due to having | |||||
| # been sourced elsewhere, it doesn't exit our entire script. | |||||
| _install_bash_preexec () { | |||||
| # -- BEGIN BASH-PREEXEC.SH -- | |||||
| #!/bin/bash | |||||
| # | |||||
| # bash-preexec.sh -- Bash support for ZSH-like 'preexec' and 'precmd' functions. | |||||
| # https://github.com/rcaloras/bash-preexec | |||||
| # | |||||
| # | |||||
| # 'preexec' functions are executed before each interactive command is | |||||
| # executed, with the interactive command as its argument. The 'precmd' | |||||
| # function is executed before each prompt is displayed. | |||||
| # | |||||
| # Author: Ryan Caloras (ryan@bashhub.com) | |||||
| # Forked from Original Author: Glyph Lefkowitz | |||||
| # | |||||
| # V0.3.7 | |||||
| # | |||||
| # -- END ITERM2 CUSTOMIZATIONS -- | |||||
| # bash-preexec.sh -- Bash support for ZSH-like 'preexec' and 'precmd' functions. | |||||
| # https://github.com/rcaloras/bash-preexec | |||||
| # | |||||
| # | |||||
| # 'preexec' functions are executed before each interactive command is | |||||
| # executed, with the interactive command as its argument. The 'precmd' | |||||
| # function is executed before each prompt is displayed. | |||||
| # | |||||
| # Author: Ryan Caloras (ryan@bashhub.com) | |||||
| # Forked from Original Author: Glyph Lefkowitz | |||||
| # | |||||
| # V0.3.7 | |||||
| # | |||||
| # General Usage: | |||||
| # | |||||
| # 1. Source this file at the end of your bash profile so as not to interfere | |||||
| # with anything else that's using PROMPT_COMMAND. | |||||
| # | |||||
| # 2. Add any precmd or preexec functions by appending them to their arrays: | |||||
| # e.g. | |||||
| # precmd_functions+=(my_precmd_function) | |||||
| # precmd_functions+=(some_other_precmd_function) | |||||
| # | |||||
| # preexec_functions+=(my_preexec_function) | |||||
| # | |||||
| # 3. Consider changing anything using the DEBUG trap or PROMPT_COMMAND | |||||
| # to use preexec and precmd instead. Preexisting usages will be | |||||
| # preserved, but doing so manually may be less surprising. | |||||
| # | |||||
| # Note: This module requires two Bash features which you must not otherwise be | |||||
| # using: the "DEBUG" trap, and the "PROMPT_COMMAND" variable. If you override | |||||
| # either of these after bash-preexec has been installed it will most likely break. | |||||
| # Avoid duplicate inclusion | |||||
| if [[ "${__bp_imported:-}" == "defined" ]]; then | |||||
| return 0 | |||||
| fi | |||||
| __bp_imported="defined" | |||||
| # Should be available to each precmd and preexec | |||||
| # functions, should they want it. $? and $_ are available as $? and $_, but | |||||
| # $PIPESTATUS is available only in a copy, $BP_PIPESTATUS. | |||||
| # TODO: Figure out how to restore PIPESTATUS before each precmd or preexec | |||||
| # function. | |||||
| __bp_last_ret_value="$?" | |||||
| BP_PIPESTATUS=("${PIPESTATUS[@]}") | |||||
| __bp_last_argument_prev_command="$_" | |||||
| __bp_inside_precmd=0 | |||||
| __bp_inside_preexec=0 | |||||
| # Fails if any of the given variables are readonly | |||||
| # Reference https://stackoverflow.com/a/4441178 | |||||
| __bp_require_not_readonly() { | |||||
| local var | |||||
| for var; do | |||||
| if ! ( unset "$var" 2> /dev/null ); then | |||||
| echo "iTerm2 Shell Integration:bash-preexec requires write access to ${var}" >&2 | |||||
| return 1 | |||||
| fi | |||||
| done | |||||
| } | |||||
| # Remove ignorespace and or replace ignoreboth from HISTCONTROL | |||||
| # so we can accurately invoke preexec with a command from our | |||||
| # history even if it starts with a space. | |||||
| __bp_adjust_histcontrol() { | |||||
| local histcontrol | |||||
| histcontrol="${HISTCONTROL//ignorespace}" | |||||
| # Replace ignoreboth with ignoredups | |||||
| if [[ "$histcontrol" == *"ignoreboth"* ]]; then | |||||
| histcontrol="ignoredups:${histcontrol//ignoreboth}" | |||||
| fi; | |||||
| export HISTCONTROL="$histcontrol" | |||||
| } | |||||
| # This variable describes whether we are currently in "interactive mode"; | |||||
| # i.e. whether this shell has just executed a prompt and is waiting for user | |||||
| # input. It documents whether the current command invoked by the trace hook is | |||||
| # run interactively by the user; it's set immediately after the prompt hook, | |||||
| # and unset as soon as the trace hook is run. | |||||
| __bp_preexec_interactive_mode="" | |||||
| __bp_trim_whitespace() { | |||||
| local var=$@ | |||||
| var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters | |||||
| var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters | |||||
| echo -n "$var" | |||||
| } | |||||
| # This function is installed as part of the PROMPT_COMMAND; | |||||
| # It sets a variable to indicate that the prompt was just displayed, | |||||
| # to allow the DEBUG trap to know that the next command is likely interactive. | |||||
| __bp_interactive_mode() { | |||||
| __bp_preexec_interactive_mode="on"; | |||||
| } | |||||
| # This function is installed as part of the PROMPT_COMMAND. | |||||
| # It will invoke any functions defined in the precmd_functions array. | |||||
| __bp_precmd_invoke_cmd() { | |||||
| # Save the returned value from our last command, and from each process in | |||||
| # its pipeline. Note: this MUST be the first thing done in this function. | |||||
| __bp_last_ret_value="$?" BP_PIPESTATUS=("${PIPESTATUS[@]}") | |||||
| # Don't invoke precmds if we are inside an execution of an "original | |||||
| # prompt command" by another precmd execution loop. This avoids infinite | |||||
| # recursion. | |||||
| if (( __bp_inside_precmd > 0 )); then | |||||
| return | |||||
| fi | |||||
| local __bp_inside_precmd=1 | |||||
| # Invoke every function defined in our function array. | |||||
| local precmd_function | |||||
| for precmd_function in "${precmd_functions[@]}"; do | |||||
| # Only execute this function if it actually exists. | |||||
| # Test existence of functions with: declare -[Ff] | |||||
| if type -t "$precmd_function" 1>/dev/null; then | |||||
| __bp_set_ret_value "$__bp_last_ret_value" "$__bp_last_argument_prev_command" | |||||
| # Quote our function invocation to prevent issues with IFS | |||||
| "$precmd_function" | |||||
| fi | |||||
| done | |||||
| } | |||||
| # Sets a return value in $?. We may want to get access to the $? variable in our | |||||
| # precmd functions. This is available for instance in zsh. We can simulate it in bash | |||||
| # by setting the value here. | |||||
| __bp_set_ret_value() { | |||||
| return ${1:-} | |||||
| } | |||||
| __bp_in_prompt_command() { | |||||
| local prompt_command_array | |||||
| IFS=';' read -ra prompt_command_array <<< "$PROMPT_COMMAND" | |||||
| local trimmed_arg | |||||
| trimmed_arg=$(__bp_trim_whitespace "${1:-}") | |||||
| local command | |||||
| for command in "${prompt_command_array[@]:-}"; do | |||||
| local trimmed_command | |||||
| trimmed_command=$(__bp_trim_whitespace "$command") | |||||
| # Only execute each function if it actually exists. | |||||
| if [[ "$trimmed_command" == "$trimmed_arg" ]]; then | |||||
| return 0 | |||||
| fi | |||||
| done | |||||
| return 1 | |||||
| } | |||||
| # This function is installed as the DEBUG trap. It is invoked before each | |||||
| # interactive prompt display. Its purpose is to inspect the current | |||||
| # environment to attempt to detect if the current command is being invoked | |||||
| # interactively, and invoke 'preexec' if so. | |||||
| __bp_preexec_invoke_exec() { | |||||
| # Save the contents of $_ so that it can be restored later on. | |||||
| # https://stackoverflow.com/questions/40944532/bash-preserve-in-a-debug-trap#40944702 | |||||
| __bp_last_argument_prev_command="${1:-}" | |||||
| # Don't invoke preexecs if we are inside of another preexec. | |||||
| if (( __bp_inside_preexec > 0 )); then | |||||
| return | |||||
| fi | |||||
| local __bp_inside_preexec=1 | |||||
| # Checks if the file descriptor is not standard out (i.e. '1') | |||||
| # __bp_delay_install checks if we're in test. Needed for bats to run. | |||||
| # Prevents preexec from being invoked for functions in PS1 | |||||
| if [[ ! -t 1 && -z "${__bp_delay_install:-}" ]]; then | |||||
| return | |||||
| fi | |||||
| if [[ -n "${COMP_LINE:-}" ]]; then | |||||
| # We're in the middle of a completer. This obviously can't be | |||||
| # an interactively issued command. | |||||
| return | |||||
| fi | |||||
| if [[ -z "${__bp_preexec_interactive_mode:-}" ]]; then | |||||
| # We're doing something related to displaying the prompt. Let the | |||||
| # prompt set the title instead of me. | |||||
| return | |||||
| else | |||||
| # If we're in a subshell, then the prompt won't be re-displayed to put | |||||
| # us back into interactive mode, so let's not set the variable back. | |||||
| # In other words, if you have a subshell like | |||||
| # (sleep 1; sleep 2) | |||||
| # You want to see the 'sleep 2' as a set_command_title as well. | |||||
| if [[ 0 -eq "${BASH_SUBSHELL:-}" ]]; then | |||||
| __bp_preexec_interactive_mode="" | |||||
| fi | |||||
| fi | |||||
| if __bp_in_prompt_command "${BASH_COMMAND:-}"; then | |||||
| # If we're executing something inside our prompt_command then we don't | |||||
| # want to call preexec. Bash prior to 3.1 can't detect this at all :/ | |||||
| __bp_preexec_interactive_mode="" | |||||
| return | |||||
| fi | |||||
| local this_command | |||||
| this_command=$( | |||||
| export LC_ALL=C | |||||
| HISTTIMEFORMAT= builtin history 1 | sed '1 s/^ *[0-9][0-9]*[* ] //' | |||||
| ) | |||||
| # Sanity check to make sure we have something to invoke our function with. | |||||
| if [[ -z "$this_command" ]]; then | |||||
| return | |||||
| fi | |||||
| # If none of the previous checks have returned out of this function, then | |||||
| # the command is in fact interactive and we should invoke the user's | |||||
| # preexec functions. | |||||
| # Invoke every function defined in our function array. | |||||
| local preexec_function | |||||
| local preexec_function_ret_value | |||||
| local preexec_ret_value=0 | |||||
| for preexec_function in "${preexec_functions[@]:-}"; do | |||||
| # Only execute each function if it actually exists. | |||||
| # Test existence of function with: declare -[fF] | |||||
| if type -t "$preexec_function" 1>/dev/null; then | |||||
| __bp_set_ret_value ${__bp_last_ret_value:-} | |||||
| # Quote our function invocation to prevent issues with IFS | |||||
| "$preexec_function" "$this_command" | |||||
| preexec_function_ret_value="$?" | |||||
| if [[ "$preexec_function_ret_value" != 0 ]]; then | |||||
| preexec_ret_value="$preexec_function_ret_value" | |||||
| fi | |||||
| fi | |||||
| done | |||||
| # Restore the last argument of the last executed command, and set the return | |||||
| # value of the DEBUG trap to be the return code of the last preexec function | |||||
| # to return an error. | |||||
| # If `extdebug` is enabled a non-zero return value from any preexec function | |||||
| # will cause the user's command not to execute. | |||||
| # Run `shopt -s extdebug` to enable | |||||
| __bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command" | |||||
| } | |||||
| __bp_install() { | |||||
| # Exit if we already have this installed. | |||||
| if [[ "${PROMPT_COMMAND:-}" == *"__bp_precmd_invoke_cmd"* ]]; then | |||||
| return 1; | |||||
| fi | |||||
| trap '__bp_preexec_invoke_exec "$_"' DEBUG | |||||
| # Preserve any prior DEBUG trap as a preexec function | |||||
| local prior_trap=$(sed "s/[^']*'\(.*\)'[^']*/\1/" <<<"${__bp_trap_string:-}") | |||||
| unset __bp_trap_string | |||||
| if [[ -n "$prior_trap" ]]; then | |||||
| eval '__bp_original_debug_trap() { | |||||
| '"$prior_trap"' | |||||
| }' | |||||
| preexec_functions+=(__bp_original_debug_trap) | |||||
| fi | |||||
| # Adjust our HISTCONTROL Variable if needed. | |||||
| __bp_adjust_histcontrol | |||||
| # Issue #25. Setting debug trap for subshells causes sessions to exit for | |||||
| # backgrounded subshell commands (e.g. (pwd)& ). Believe this is a bug in Bash. | |||||
| # | |||||
| # Disabling this by default. It can be enabled by setting this variable. | |||||
| if [[ -n "${__bp_enable_subshells:-}" ]]; then | |||||
| # Set so debug trap will work be invoked in subshells. | |||||
| set -o functrace > /dev/null 2>&1 | |||||
| shopt -s extdebug > /dev/null 2>&1 | |||||
| fi; | |||||
| # Install our hooks in PROMPT_COMMAND to allow our trap to know when we've | |||||
| # actually entered something. | |||||
| PROMPT_COMMAND="__bp_precmd_invoke_cmd; __bp_interactive_mode" | |||||
| # Add two functions to our arrays for convenience | |||||
| # of definition. | |||||
| precmd_functions+=(precmd) | |||||
| preexec_functions+=(preexec) | |||||
| # Since this function is invoked via PROMPT_COMMAND, re-execute PC now that it's properly set | |||||
| eval "$PROMPT_COMMAND" | |||||
| } | |||||
| # Sets our trap and __bp_install as part of our PROMPT_COMMAND to install | |||||
| # after our session has started. This allows bash-preexec to be included | |||||
| # at any point in our bash profile. Ideally we could set our trap inside | |||||
| # __bp_install, but if a trap already exists it'll only set locally to | |||||
| # the function. | |||||
| __bp_install_after_session_init() { | |||||
| # Make sure this is bash that's running this and return otherwise. | |||||
| if [[ -z "${BASH_VERSION:-}" ]]; then | |||||
| return 1; | |||||
| fi | |||||
| # bash-preexec needs to modify these variables in order to work correctly | |||||
| # if it can't, just stop the installation | |||||
| __bp_require_not_readonly PROMPT_COMMAND HISTCONTROL HISTTIMEFORMAT || return | |||||
| # If there's an existing PROMPT_COMMAND capture it and convert it into a function | |||||
| # So it is preserved and invoked during precmd. | |||||
| if [[ -n "$PROMPT_COMMAND" ]]; then | |||||
| eval '__bp_original_prompt_command() { | |||||
| '"$PROMPT_COMMAND"' | |||||
| }' | |||||
| precmd_functions+=(__bp_original_prompt_command) | |||||
| fi | |||||
| # Installation is finalized in PROMPT_COMMAND, which allows us to override the DEBUG | |||||
| # trap. __bp_install sets PROMPT_COMMAND to its final value, so these are only | |||||
| # invoked once. | |||||
| # It's necessary to clear any existing DEBUG trap in order to set it from the install function. | |||||
| # Using \n as it's the most universal delimiter of bash commands | |||||
| PROMPT_COMMAND=$'\n__bp_trap_string="$(trap -p DEBUG)"\ntrap DEBUG\n__bp_install\n' | |||||
| } | |||||
| # Run our install so long as we're not delaying it. | |||||
| if [[ -z "$__bp_delay_install" ]]; then | |||||
| __bp_install_after_session_init | |||||
| fi; | |||||
| # -- END BASH-PREEXEC.SH -- | |||||
| } | |||||
| _install_bash_preexec | |||||
| unset -f _install_bash_preexec | |||||
| # -- BEGIN ITERM2 CUSTOMIZATIONS -- | |||||
| # We don't care about whitespace, but users care about not changing their histcontrol variables. | |||||
| # We overwrite the upstream __bp_adjust_histcontrol function whcih gets called from the next | |||||
| # PROMPT_COMMAND invocation. | |||||
| function __bp_adjust_histcontrol() { | |||||
| true | |||||
| } | |||||
| function iterm2_begin_osc { | |||||
| printf "\033]" | |||||
| } | |||||
| function iterm2_end_osc { | |||||
| printf "\007" | |||||
| } | |||||
| function iterm2_print_state_data() { | |||||
| iterm2_begin_osc | |||||
| printf "1337;RemoteHost=%s@%s" "$USER" "$iterm2_hostname" | |||||
| iterm2_end_osc | |||||
| iterm2_begin_osc | |||||
| printf "1337;CurrentDir=%s" "$PWD" | |||||
| iterm2_end_osc | |||||
| iterm2_print_user_vars | |||||
| } | |||||
| # Usage: iterm2_set_user_var key value | |||||
| function iterm2_set_user_var() { | |||||
| iterm2_begin_osc | |||||
| printf "1337;SetUserVar=%s=%s" "$1" $(printf "%s" "$2" | base64 | tr -d '\n') | |||||
| iterm2_end_osc | |||||
| } | |||||
| if [ -z "$(type -t iterm2_print_user_vars)" ] || [ "$(type -t iterm2_print_user_vars)" != function ]; then | |||||
| # iterm2_print_user_vars is not already defined. Provide a no-op default version. | |||||
| # | |||||
| # Users can write their own version of this function. It should call | |||||
| # iterm2_set_user_var but not produce any other output. | |||||
| function iterm2_print_user_vars() { | |||||
| true | |||||
| } | |||||
| fi | |||||
| function iterm2_prompt_prefix() { | |||||
| iterm2_begin_osc | |||||
| printf "133;D;\$?" | |||||
| iterm2_end_osc | |||||
| } | |||||
| function iterm2_prompt_mark() { | |||||
| iterm2_begin_osc | |||||
| printf "133;A" | |||||
| iterm2_end_osc | |||||
| } | |||||
| function iterm2_prompt_suffix() { | |||||
| iterm2_begin_osc | |||||
| printf "133;B" | |||||
| iterm2_end_osc | |||||
| } | |||||
| function iterm2_print_version_number() { | |||||
| iterm2_begin_osc | |||||
| printf "1337;ShellIntegrationVersion=14;shell=bash" | |||||
| iterm2_end_osc | |||||
| } | |||||
| # If hostname -f is slow on your system, set iterm2_hostname before sourcing this script. | |||||
| if [ -z "${iterm2_hostname:-}" ]; then | |||||
| iterm2_hostname=$(hostname -f 2>/dev/null) | |||||
| # some flavors of BSD (i.e. NetBSD and OpenBSD) don't have the -f option | |||||
| if [ $? -ne 0 ]; then | |||||
| iterm2_hostname=$(hostname) | |||||
| fi | |||||
| fi | |||||
| # Runs after interactively edited command but before execution | |||||
| __iterm2_preexec() { | |||||
| # Save the returned value from our last command | |||||
| __iterm2_last_ret_value="$?" | |||||
| iterm2_begin_osc | |||||
| printf "133;C;" | |||||
| iterm2_end_osc | |||||
| # If PS1 still has the value we set it to in iterm2_preexec_invoke_cmd then | |||||
| # restore it to its original value. It might have changed if you have | |||||
| # another PROMPT_COMMAND (like liquidprompt) that modifies PS1. | |||||
| if [ -n "${ITERM_ORIG_PS1+xxx}" -a "$PS1" = "$ITERM_PREV_PS1" ] | |||||
| then | |||||
| export PS1="$ITERM_ORIG_PS1" | |||||
| fi | |||||
| iterm2_ran_preexec="yes" | |||||
| __bp_set_ret_value "$__iterm2_last_ret_value" "$__bp_last_argument_prev_command" | |||||
| } | |||||
| function __iterm2_precmd () { | |||||
| __iterm2_last_ret_value="$?" | |||||
| # Work around a bug in CentOS 7.2 where preexec doesn't run if you press | |||||
| # ^C while entering a command. | |||||
| if [[ -z "${iterm2_ran_preexec:-}" ]] | |||||
| then | |||||
| __iterm2_preexec "" | |||||
| fi | |||||
| iterm2_ran_preexec="" | |||||
| # This is an iTerm2 addition to try to work around a problem in the | |||||
| # original preexec.bash. | |||||
| # When the PS1 has command substitutions, this gets invoked for each | |||||
| # substitution and each command that's run within the substitution, which | |||||
| # really adds up. It would be great if we could do something like this at | |||||
| # the end of this script: | |||||
| # PS1="$(iterm2_prompt_prefix)$PS1($iterm2_prompt_suffix)" | |||||
| # and have iterm2_prompt_prefix set a global variable that tells precmd not to | |||||
| # output anything and have iterm2_prompt_suffix reset that variable. | |||||
| # Unfortunately, command substitutions run in subshells and can't | |||||
| # communicate to the outside world. | |||||
| # Instead, we have this workaround. We save the original value of PS1 in | |||||
| # $ITERM_ORIG_PS1. Then each time this function is run (it's called from | |||||
| # PROMPT_COMMAND just before the prompt is shown) it will change PS1 to a | |||||
| # string without any command substitutions by doing eval on ITERM_ORIG_PS1. At | |||||
| # this point ITERM_PREEXEC_INTERACTIVE_MODE is still the empty string, so preexec | |||||
| # won't produce output for command substitutions. | |||||
| # The first time this is called ITERM_ORIG_PS1 is unset. This tests if the variable | |||||
| # is undefined (not just empty) and initializes it. We can't initialize this at the | |||||
| # top of the script because it breaks with liquidprompt. liquidprompt wants to | |||||
| # set PS1 from a PROMPT_COMMAND that runs just before us. Setting ITERM_ORIG_PS1 | |||||
| # at the top of the script will overwrite liquidprompt's PS1, whose value would | |||||
| # never make it into ITERM_ORIG_PS1. Issue 4532. It's important to check | |||||
| # if it's undefined before checking if it's empty because some users have | |||||
| # bash set to error out on referencing an undefined variable. | |||||
| if [ -z "${ITERM_ORIG_PS1+xxx}" ] | |||||
| then | |||||
| # ITERM_ORIG_PS1 always holds the last user-set value of PS1. | |||||
| # You only get here on the first time iterm2_preexec_invoke_cmd is called. | |||||
| export ITERM_ORIG_PS1="$PS1" | |||||
| fi | |||||
| # If you want to generate PS1 dynamically from PROMPT_COMMAND, the best way | |||||
| # to do it is to define a function named iterm2_generate_ps1 that sets PS1. | |||||
| # Issue 5964. Other shells don't have this issue because they don't need | |||||
| # such extremes to get precmd and preexec. | |||||
| if [ -n "$(type -t iterm2_generate_ps1)" ] && [ "$(type -t iterm2_generate_ps1)" = function ]; then | |||||
| iterm2_generate_ps1 | |||||
| fi | |||||
| if [[ "$PS1" != "$ITERM_PREV_PS1" ]] | |||||
| then | |||||
| export ITERM_ORIG_PS1="$PS1" | |||||
| fi | |||||
| # Get the value of the prompt prefix, which will change $? | |||||
| \local iterm2_prompt_prefix_value="$(iterm2_prompt_prefix)" | |||||
| # Add the mark unless the prompt includes '$(iterm2_prompt_mark)' as a substring. | |||||
| if [[ $ITERM_ORIG_PS1 != *'$(iterm2_prompt_mark)'* && x$ITERM2_SQUELCH_MARK = x ]] | |||||
| then | |||||
| iterm2_prompt_prefix_value="$iterm2_prompt_prefix_value$(iterm2_prompt_mark)" | |||||
| fi | |||||
| # Send escape sequences with current directory and hostname. | |||||
| iterm2_print_state_data | |||||
| # Reset $? to its saved value, which might be used in $ITERM_ORIG_PS1. | |||||
| __bp_set_ret_value "$__iterm2_last_ret_value" "$__bp_last_argument_prev_command" | |||||
| # Set PS1 to various escape sequences, the user's preferred prompt, and more escape sequences. | |||||
| export PS1="\[$iterm2_prompt_prefix_value\]$ITERM_ORIG_PS1\[$(iterm2_prompt_suffix)\]" | |||||
| # Save the value we just set PS1 to so if the user changes PS1 we'll know and we can update ITERM_ORIG_PS1. | |||||
| export ITERM_PREV_PS1="$PS1" | |||||
| __bp_set_ret_value "$__iterm2_last_ret_value" "$__bp_last_argument_prev_command" | |||||
| } | |||||
| # Install my functions | |||||
| preexec_functions+=(__iterm2_preexec) | |||||
| precmd_functions+=(__iterm2_precmd) | |||||
| iterm2_print_state_data | |||||
| iterm2_print_version_number | |||||
| fi | |||||
| # -- END ITERM2 CUSTOMIZATIONS -- | |||||
| @ -0,0 +1,5 @@ | |||||
| #!/bin/bash | |||||
| F=$(fzf) | |||||
| [ -z "$F" ] || nvim "$F" | |||||
| @ -0,0 +1,98 @@ | |||||
| #!/usr/bin/env bash | |||||
| # author: unknown | |||||
| # sentby: MoreChannelNoise (https://www.youtube.com/user/MoreChannelNoise) | |||||
| # editby: gotbletu (https://www.youtube.com/user/gotbletu) | |||||
| # demo: https://www.youtube.com/watch?v=kxJClZIXSnM | |||||
| # info: this is a script to launch other rofi scripts, | |||||
| # saves us the trouble of binding multiple hotkeys for each script, | |||||
| # when we can just use one hotkey for everything. | |||||
| declare -A LABELS | |||||
| declare -A COMMANDS | |||||
| ### | |||||
| # List of defined 'bangs' | |||||
| # launch programs | |||||
| COMMANDS["apps"]="dmenu_run -i -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee'" | |||||
| LABELS["apps"]="" | |||||
| # clipboard | |||||
| COMMANDS["clipboard"]="greenclip print | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'clipboard: ' | xclip -selection clipboard" | |||||
| LABELS["clipboard"]="" | |||||
| # search local files | |||||
| COMMANDS["emoji"]="~/.local/bin/dmenu-scripts/dmenu-emoji" | |||||
| LABELS["emoji"]="" | |||||
| # mount drives | |||||
| COMMANDS["mount"]="sudo ~/.local/bin/dmenu-scripts/dmenu-mount" | |||||
| LABELS["mount"]="" | |||||
| # umount drives | |||||
| COMMANDS["unmount"]="sudo ~/.local/bin/dmenu-scripts/dmenu-mount unmount" | |||||
| LABELS["unmount"]="" | |||||
| # shutdown | |||||
| COMMANDS["shutdown"]="sudo ~/.local/bin/dmenu-scripts/dmenu-shutdown" | |||||
| LABELS["shutdown"]="" | |||||
| # PDF man pages | |||||
| COMMANDS["man"]="~/.local/bin/dmenu-scripts/dmenu-man" | |||||
| LABELS["man"]="" | |||||
| # locate files | |||||
| COMMANDS["locate"]="~/.local/bin/dmenu-scripts/dmenu-locate" | |||||
| LABELS["locate"]="" | |||||
| ################################################################################ | |||||
| # do not edit below | |||||
| ################################################################################ | |||||
| ## | |||||
| # Generate menu | |||||
| ## | |||||
| function print_menu() | |||||
| { | |||||
| for key in ${!LABELS[@]} | |||||
| do | |||||
| echo "$key ${LABELS}" | |||||
| # echo "$key ${LABELS[$key]}" | |||||
| # my top version just shows the first field in labels row, not two words side by side | |||||
| done | |||||
| } | |||||
| ## | |||||
| # Show rofi. | |||||
| ## | |||||
| function start() | |||||
| { | |||||
| print_menu | sort | dmenu -i -m 0 -fn "Inconsolata:size=10" -nb "#222222" -nf "#bbbbbb" -sb "#005577" -sf "#eeeeee" -p "dmenu bangs: " | |||||
| } | |||||
| # Run it | |||||
| value="$(start)" | |||||
| # Split input. | |||||
| # grab upto first space. | |||||
| choice=${value%%\ *} | |||||
| # graph remainder, minus space. | |||||
| input=${value:$((${#choice}+1))} | |||||
| ## | |||||
| # Cancelled? bail out | |||||
| ## | |||||
| if test -z ${choice} | |||||
| then | |||||
| exit | |||||
| fi | |||||
| # check if choice exists | |||||
| if test ${COMMANDS[$choice]+isset} | |||||
| then | |||||
| # Execute the choice | |||||
| eval ${COMMANDS[$choice]} | |||||
| else | |||||
| eval $choice | dmenu | |||||
| fi | |||||
| @ -0,0 +1,15 @@ | |||||
| #!/bin/bash | |||||
| #cat ~/.emoji | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Emoji: ' | |||||
| chosen=$(grep -v "#" ~/.emoji | dmenu -i -l 20 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'emoji: ') | |||||
| [ "$chosen" != "" ] || exit | |||||
| c=$(echo "$chosen" | sed "s/ .*//") | |||||
| echo "$c" | tr -d '\n' | xclip -selection clipboard | |||||
| notify-send "'$c' copied to clipboard." & | |||||
| s=$(echo "$chosen" | sed "s/.*; //" | awk '{print $1}') | |||||
| echo "$s" | tr -d '\n' | xclip | |||||
| notify-send "'$s' copied to primary." & | |||||
| @ -0,0 +1,3 @@ | |||||
| #!/bin/bash | |||||
| xdg-open $(locate home media | dmenu -l 20 -i -m 0 -fn "Inconsolata:size=10" -nb "#000000" -nf "#bbbbbb" -sb "#0099cc" -sf "#000000" -p "Locate: ") | |||||
| @ -0,0 +1,3 @@ | |||||
| #!/bin/bash | |||||
| man -k . | dmenu -i -m 0 -fn "Inconsolata:size=10" -nb "#000000" -nf "#bbbbbb" -sb "#0099cc" -sf "#000000" -l 20 -p "Man: " | awk '{print $1}' | xargs -r man -Tpdf | zathura - | |||||
| @ -0,0 +1,28 @@ | |||||
| #!/bin/bash | |||||
| COLS="name,type,size,mountpoint" | |||||
| if [[ "$1" == "unmount" ]] | |||||
| then | |||||
| drives="$(lsblk -rpo "$COLS" | awk '$2=="part"&&$4!=""{printf "%s (%s)\n",$1,$3}')" | |||||
| [ -z "$drives" ] && exit 1 | |||||
| chosen="$(echo "$drives" | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Drive to unmount: ' | awk '{print $1}')" | |||||
| [ -z "$chosen" ] && exit 1 | |||||
| umount $chosen && notify-send "$chosen umounted" || notfiy-send "Error unmounting $chosen" | |||||
| else | |||||
| drives="$(lsblk -rpo "$COLS" | awk '$2=="part"&&$4==""{printf "%s (%s)\n",$1,$3}')" | |||||
| [ -z "$drives" ] && exit 1 | |||||
| chosen="$(echo "$drives" | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Drive to mount: ' | awk '{print $1}')" | |||||
| [ -z "$chosen" ] && exit 1 | |||||
| mount "$chosen" && exit 0 | |||||
| mp="$(find /mnt /media /mount /home -type d -maxdepth 1 2>/dev/null | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Mount point: ' | awk '{print $1}')" | |||||
| [ "$mp" = "" ] && exit 1 | |||||
| if [ ! -d "$mp" ]; then | |||||
| mkdiryn=$(printf "No\\nYes" | dmenu -i -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Mount point does not exist, create it?') | |||||
| [ "$mkdiryn" = "Yes" ] && sudo -A mkdir -p "$mp" | |||||
| fi | |||||
| echo $mp | |||||
| mount "$chosen" "$mp" && notify-send "$chosen mounted to $mp." || notify-send "Error mounting $chosen to $mp" | |||||
| fi | |||||
| @ -0,0 +1,24 @@ | |||||
| #!/bin/bash | |||||
| option=$(echo -e "Lock the screen\nReboot\nShutdown\nHibernate" | dmenu -i -m 0 -fn "Inconsolata:size=10" -nb "#000000" -nf "#bbbbbb" -sb "#0099cc" -sf "#000000" -p "Power menu: ") | |||||
| answer=$(echo -e "No\nYes" | dmenu -i -m 0 -fn "Inconsolata:size=10" -nb "#000000" -nf "#bbbbbb" -sb "#0099cc" -sf "#000000" -p "Would you like to ${option} now? ") | |||||
| if [[ ${answer} == "Yes" ]] | |||||
| then | |||||
| if [[ ${option} == "Lock the screen" ]] | |||||
| then | |||||
| slock | |||||
| elif [[ ${option} == "Reboot" ]] | |||||
| then | |||||
| systemctl reboot | |||||
| elif [[ ${option} == "Shutdown" ]] | |||||
| then | |||||
| systemctl poweroff | |||||
| elif [[ ${option} == "Hibernate" ]] | |||||
| then | |||||
| systemctl hibernate | |||||
| fi | |||||
| fi | |||||
| @ -0,0 +1,12 @@ | |||||
| #!/bin/sh | |||||
| read -p "Enter the name/url for repo: " url | |||||
| read -p "Enter the description for repo:" desc | |||||
| url_parsed=${url// /_} | |||||
| url_path="/var/www/git/${url_parsed}.git" | |||||
| ssh git@tovijaeschke.xyz "mkdir -p ${url_path} && git init --bare ${url_path} && echo -e \"\nrepo.url=${url_parsed}\nrepo.path=${url_path}\nrepo.desc=${desc}\n\" >> /etc/cgitrepos" | |||||
| git remote add origin git@git.tovijaeschke.xyz:${url_path} | |||||
| @ -0,0 +1,9 @@ | |||||
| #!/bin/bash | |||||
| F=$(ls ~/notes/ | fzf) | |||||
| if [ ${F: -4} == ".enc" ]; then | |||||
| fenc -e $(realpath ~/notes/${F}) | |||||
| else | |||||
| nvim $(realpath ~/notes/${F}) | |||||
| fi | |||||
| @ -0,0 +1,10 @@ | |||||
| #!/usr/bin/python3 | |||||
| import sys | |||||
| def a(one): | |||||
| if one[:2] == "0x": | |||||
| one = one[2:] | |||||
| print(bytearray.fromhex(one).decode()) | |||||
| a(sys.argv[1]) | |||||
| @ -0,0 +1,163 @@ | |||||
| #!/usr/bin/env python3 | |||||
| class Colours: | |||||
| HEADER = '\033[95m' | |||||
| OKBLUE = '\033[94m' | |||||
| OKGREEN = '\033[92m' | |||||
| WARNING = '\033[93m' | |||||
| FAIL = '\033[91m' | |||||
| ENDC = '\033[0m' | |||||
| BOLD = '\033[1m' | |||||
| UNDERLINE = '\033[4m' | |||||
| try: | |||||
| import os | |||||
| import re | |||||
| import sys | |||||
| import getopt | |||||
| import requests | |||||
| from clint.textui import progress | |||||
| from bs4 import BeautifulSoup | |||||
| except Exception as err: | |||||
| print(Colours.FAIL + "Error: {}".format(err) + Colours.ENDC) | |||||
| def Usage(): | |||||
| use_msg = ''' | |||||
| ---------- Usage ---------- | |||||
| leak-lookup [options] [search term] | |||||
| --------------------------- | |||||
| Options: | |||||
| -h: Prints this help message | |||||
| -p: Searches haveibeenpwned.com | |||||
| -d: Searches for leaked database | |||||
| --------------------------- | |||||
| ''' | |||||
| print(use_msg) | |||||
| def DownloadDatabase(url, name): | |||||
| try: | |||||
| r = requests.get(url, stream=True) | |||||
| with open(name, 'wb') as f: | |||||
| total_length = int(r.headers.get('content-length')) | |||||
| for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1): | |||||
| if chunk: | |||||
| f.write(chunk) | |||||
| f.flush() | |||||
| except (KeyboardInterrupt, SystemExit, EOFError): | |||||
| print(Colours.FAIL + "An error occurred, cleaning up" + Colours.ENDC) | |||||
| os.remove(name) | |||||
| def DatabaseQuery(database): | |||||
| r = requests.get("https://www.databases.today/search-nojs.php?for=" + database) | |||||
| if r.reason != "OK": | |||||
| print(Colours.FAIL + "Error code: {}".format(r.status_code) + Colours.ENDC) | |||||
| sys.exit(1) | |||||
| soup = BeautifulSoup(r.text, "html.parser") | |||||
| dbs = soup.find(id="myTable").find_all("tr") | |||||
| entries = [] | |||||
| for table in dbs: | |||||
| entry = table.find_all("td") | |||||
| if len(entry) != 0: | |||||
| entries.append([entry[0].text, entry[4].a.get("href")]) | |||||
| print("Which file would you like to download?") | |||||
| for index, dllink in enumerate(entries): | |||||
| print("{}) {}".format(index + 1, dllink[0])) | |||||
| print("a) All") | |||||
| print("q) Quit") | |||||
| download_choice = input(">> ") | |||||
| if download_choice == "q": | |||||
| sys.exit(0) | |||||
| elif download_choice == "a": | |||||
| for x in dllink: | |||||
| DownloadDatabase(x[1], x[0]) | |||||
| else: | |||||
| try: | |||||
| download_choice = int(download_choice) - 1 | |||||
| DownloadDatabase(dllink[1], dllink[0].split(" (")[0]) | |||||
| except: | |||||
| print(Colours.FAIL + "Error: Invalid selection" + Colours.ENDC) | |||||
| sys.exit(1) | |||||
| def QueryHaveIBeenPwned(email): | |||||
| r = requests.post("https://haveibeenpwned.com/", data={"Account": email}) | |||||
| if r.reason != "OK": | |||||
| print(Colours.FAIL + "Error code: {}".format(r.status_code) + Colours.ENDC) | |||||
| sys.exit(1) | |||||
| soup = BeautifulSoup(r.text, "html.parser") | |||||
| pwnCount = re.match("Pwned on \d+", soup.find(id="pwnCount").text) | |||||
| if pwnCount == None: | |||||
| print(Colours.OKGREEN + "{} has no public leaks".format(email) + Colours.ENDC) | |||||
| return | |||||
| print(Colours.FAIL + "{} has {} public leaks avalible".format(email, pwnCount.group().split(" ")[-1]) + Colours.ENDC) | |||||
| leaks = [] | |||||
| for leak in soup.find_all(class_="pwnedWebsite"): | |||||
| leak_name = None | |||||
| leak_status = None | |||||
| compromised_data = None | |||||
| leak_name_html = leak.find(class_="pwnedCompanyTitle") | |||||
| if leak_name_html: | |||||
| if "(" in leak_name_html.text: | |||||
| leak_name = leak_name_html.text.split(" (")[0] | |||||
| leak_status = leak_name_html.text.split(" (")[1][:-2] | |||||
| else: | |||||
| leak_name = leak_name_html.text[:-1] | |||||
| leak_status = None | |||||
| compromised_data_html = leak.find(class_="dataClasses") | |||||
| if compromised_data_html: | |||||
| compromised_data = compromised_data_html.text | |||||
| if leak_name: | |||||
| leaks.append([leak_name, leak_status, compromised_data]) | |||||
| print("\nDownload databases:") | |||||
| for index, leak in enumerate(leaks): | |||||
| if leak[1] == None: | |||||
| print("{}) {}: {}".format(index + 1, leak[0], leak[2])) | |||||
| else: | |||||
| print("{}) {} ({}): {}".format(index + 1, leak[0], leak[1], leak[2])) | |||||
| print("a) Download all") | |||||
| print("q) Quit") | |||||
| download_choice = input(">> ") | |||||
| if download_choice == "q": | |||||
| sys.exit(0) | |||||
| elif download_choice == "a": | |||||
| for leak in leaks: | |||||
| DatabaseQuery(leak[0]) | |||||
| try: | |||||
| download_choice = int(download_choice) - 1 | |||||
| DatabaseQuery(leaks[download_choice][0]) | |||||
| except: | |||||
| print(Colours.FAIL + "Error: Invalid selection" + Colours.ENDC) | |||||
| sys.exit(1) | |||||
| def main(): | |||||
| if len(sys.argv[1:]) == 0: | |||||
| Usage() | |||||
| sys.exit(1) | |||||
| try: | |||||
| options, remainder = getopt.getopt(sys.argv[1:],'hpd',['h', 'p','d',]) | |||||
| except getopt.GetoptError as err: | |||||
| print(Colours.FAIL + "Error: {}".format(err) + Colours.ENDC) | |||||
| sys.exit(1) | |||||
| for opt, arg in options: | |||||
| if opt == "-h": | |||||
| Usage() | |||||
| sys.exit(0) | |||||
| elif opt == "-p": | |||||
| if len(remainder) == 0: | |||||
| Usage() | |||||
| sys.exit(1) | |||||
| QueryHaveIBeenPwned(" ".join(remainder)) | |||||
| elif opt == "-d": | |||||
| if len(remainder) == 0: | |||||
| Usage() | |||||
| sys.exit(1) | |||||
| DatabaseQuery(" ".join(remainder)) | |||||
| if __name__ == "__main__": | |||||
| try: | |||||
| main() | |||||
| except (KeyboardInterrupt, SystemExit, EOFError): | |||||
| sys.exit(0) | |||||
| @ -0,0 +1,7 @@ | |||||
| #!/bin/bash | |||||
| for i in $(objdump -d $1 | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f]{2}$' ) | |||||
| do | |||||
| echo -n "\x$i" | |||||
| done | |||||
| echo -e "\n" | |||||
| @ -0,0 +1,26 @@ | |||||
| #!/bin/sh | |||||
| VAGRANT=`which vagrant` | |||||
| ### User vagrant global-status to get the global ID | |||||
| GLOBAL_ID='e2d06a8' | |||||
| GLOBAL_DIR='/opt/vhosts/tools-deployment' | |||||
| CWD=`pwd` | |||||
| pushd $GLOBAL_DIR | |||||
| if [[ $1 == "up" ]] | |||||
| then | |||||
| $VAGRANT up $GLOBAL_ID | |||||
| ntfy -l INFO -t 'VAGRANT' send 'VM has finished booting' | |||||
| elif [[ $1 == "halt" ]] | |||||
| then | |||||
| $VAGRANT halt $GLOBAL_ID | |||||
| ntfy -l INFO -t 'VAGRANT' send 'VM has halted' | |||||
| elif [[ $1 == "sup" ]] | |||||
| then | |||||
| $VAGRANT up $GLOBAL_ID | |||||
| ntfy -l INFO -t 'VAGRANT' send 'VM has started, ssh-ing into it' | |||||
| echo 'Shelling into machine...' | |||||
| $VAGRANT ssh | |||||
| else | |||||
| $VAGRANT "$@" | |||||
| fi | |||||
| popd | |||||
| @ -0,0 +1,28 @@ | |||||
| #!/bin/bash | |||||
| # Dependencies are xclip and xorg-xprop. | |||||
| # qrencode required for qrcode generation. | |||||
| # groff/zathura required for man pages. | |||||
| prim="$(xclip -o)"; [ -z "$prim" ] && exit | |||||
| PID=$(xprop -id "$(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}')" | grep -m 1 PID | cut -d " " -f 3) | |||||
| PID=$(echo "$(pstree -lpA "$PID" | tail -n 1)" | awk -F'---' '{print $NF}' | sed -re 's/[^0-9]//g') | |||||
| cd "$(readlink /proc/"$PID"/cwd)" | |||||
| [[ "${prim}" == *"~"* ]] && prim=$(echo "~/go/src/gitlab.com/tovijaeschke/website" | sed 's@~@'"$HOME"'@g') | |||||
| [ -f "$prim" ] && xdg-open "$prim" && exit | |||||
| [ -d "$prim" ] && st -c "$prim" && exit | |||||
| websearch() { "$BROWSER" "https://duckduckgo.com/?q=$@" ;} | |||||
| wikipedia() { "$BROWSER" "https://en.wikipedia.org/wiki/$@" ;} | |||||
| wiktionary() { "$BROWSER" "https://en.wiktionary.org/wiki/$@" ;} | |||||
| piratebay() { "$BROWSER" "https://piratebays.fi/s/?q=$@" ;} | |||||
| maps() { "$BROWSER" "https://www.openstreetmap.org/search?query=$@" ;} | |||||
| ebay() { "$BROWSER" "https://www.ebay.com/sch/$@" ;} | |||||
| echo "$prim" | grep "^.*\.[A-Za-z]\+.*" >/dev/null && gotourl() { "$BROWSER" "$@" ;} | |||||
| echo "$prim" | grep "^.*@.*\.[A-Za-z]\+$" >/dev/null && email() { xdg-email "$@" ;} | |||||
| command -v qrencode >/dev/null && qrcode() { qrencode "$@" -s 10 -o /tmp/qr.png && xdg-open /tmp/qr.png ;} | |||||
| man -k "^$prim$" >/dev/null && manual() { man -Tpdf "$prim" | zathura - ;} | |||||
| func="$(declare -F | awk '{print $3}' | dmenu -p "Plumb $prim to?" -i -l 15)" | |||||
| [ -z "$func" ] || "$func" "$prim" | |||||
| @ -0,0 +1,4 @@ | |||||
| #!/bin/bash | |||||
| notify-send "Changing wallpaper" | |||||
| feh --bg-fill ~/pix/cyberpunk/$(ls ~/pix/cyberpunk | shuf -n 1) | |||||
| @ -0,0 +1,8 @@ | |||||
| #!/bin/bash | |||||
| case "$1" in | |||||
| *.asm) nasm -f elf64 "$1" && ld "${1%.*}".o -o "${1%.*}"; rm "${1%.*}".o ;; | |||||
| *.c) gcc "$1" -o "${1%.*}" ;; | |||||
| *.go) go build "$1" ;; | |||||
| Makefile) make ;; | |||||
| esac | |||||
| @ -0,0 +1,9 @@ | |||||
| #!/bin/bash | |||||
| intern=LVDS-1 | |||||
| extern=VGA-1 | |||||
| if xrandr | grep "$extern connected"; then | |||||
| xrandr --output ${extern} --auto --right-of ${intern} | |||||
| else | |||||
| xrandr --output ${extern} --off --output ${intern} --auto | |||||
| fi | |||||
| @ -0,0 +1,25 @@ | |||||
| #!/bin/bash | |||||
| if [ -f $1 ] ; then | |||||
| # NAME=${1%.*} | |||||
| # mkdir $NAME && cd $NAME | |||||
| case $1 in | |||||
| *.tar.bz2) tar xvjf ../$1 ;; | |||||
| *.tar.gz) tar xvzf ../$1 ;; | |||||
| *.tar.xz) tar xvJf ../$1 ;; | |||||
| *.lzma) unlzma ../$1 ;; | |||||
| *.bz2) bunzip2 ../$1 ;; | |||||
| *.rar) unrar x -ad ../$1 ;; | |||||
| *.gz) gunzip ../$1 ;; | |||||
| *.tar) tar xvf ../$1 ;; | |||||
| *.tbz2) tar xvjf ../$1 ;; | |||||
| *.tgz) tar xvzf ../$1 ;; | |||||
| *.zip) unzip ../$1 ;; | |||||
| *.Z) uncompress ../$1 ;; | |||||
| *.7z) 7z x ../$1 ;; | |||||
| *.xz) unxz ../$1 ;; | |||||
| *.exe) cabextract ../$1 ;; | |||||
| *) echo "extract: '$1' - unknown archive method" ;; | |||||
| esac | |||||
| else | |||||
| echo "$1 - file does not exist" | |||||
| fi | |||||
| @ -0,0 +1,10 @@ | |||||
| #!/bin/bash | |||||
| if [ $(pgrep xautolock) ] | |||||
| then | |||||
| killall xautolock | |||||
| notify-send "🔓 Turning off xautolock" | |||||
| else | |||||
| xautolock -time 10 -locker slock & | |||||
| notify-send "🔒 Turning on xautolock" | |||||
| fi | |||||
| @ -0,0 +1,4 @@ | |||||
| #!/bin/bash | |||||
| pactl set-sink-volume @DEFAULT_SINK@ -5% | |||||
| vol=$(amixer sget Master | grep 'Right:' | awk -F'[][]' '{ print $2 }') | |||||
| notify-send -t 500 "Volume: ${vol}" | |||||
| @ -0,0 +1,4 @@ | |||||
| #!/bin/bash | |||||
| pactl set-sink-volume @DEFAULT_SINK@ +5% | |||||
| vol=$(amixer sget Master | grep 'Right:' | awk -F'[][]' '{ print $2 }') | |||||
| notify-send -t 500 "Volume: ${vol}" | |||||
| @ -0,0 +1,14 @@ | |||||
| #!/bin/bash | |||||
| listandReturn() { | |||||
| printf "Listing contents of %s.\\n" "$1" | |||||
| ls -rc "$1" | awk -F '/' '{print $NF}' | nl | |||||
| read -erp "Pick an entry by number to $2, or press ctrl-c to cancel. " number | |||||
| chosen="$(ls -rc "$1" | nl | grep -w "$number" | awk '{print $2}')" | |||||
| basefile="$(basename "$chosen")" && base="${basefile%.*}" | |||||
| } | |||||
| listandReturn ~/.openvpn/UDP\ 1194\ Normal/ | |||||
| sudo openvpn --config ~/.openvpn/UDP\ 1194\ Normal/${basefile} | |||||