-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path.zshrc
377 lines (313 loc) · 10.2 KB
/
.zshrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
# Use a REAL regex engine
zmodload zsh/pcre
# Virtualenv support
function _virtual_env_prompt () {
# Try to read the prompt name form pyvenv.cfg
if [[ -f "$VIRTUAL_ENV/pyvenv.cfg" ]]; then
# Matches lines with following syntax
# prompt = 'cool prompt'
# prompt = "cool prompt"
# prompt = cool
# prompt=cool prompt
# heredoc is used here so that I don't have to
# manually escape the regex 🤮
local prompt_re
read -r prompt_re <<-'EOF'
^prompt\s*=\s*['"]?(.+?)['"]?$
EOF
# -m turns on multiline support, this makes ^ and $ anchor work in multiline string
pcre_compile -m ${prompt_re}
# And now its supper easy to get the value
if pcre_match -- "$(<$VIRTUAL_ENV/pyvenv.cfg)"
then
REPLY="(${match[1]}) "
fi
fi
# fall back to using venv folder name as prompt name
if [[ -z "${REPLY}" ]]; then
REPLY=${VIRTUAL_ENV+(${VIRTUAL_ENV:t}) }
fi
}
grml_theme_add_token virtual-env -f _virtual_env_prompt '%F{magenta}' '%f'
function _config_env_prompt () {
REPLY=${CONFIG_ENV+(${CONFIG_ENV:t}) }
}
grml_theme_add_token config-env -f _config_env_prompt
zstyle ':prompt:grml:left:setup' items rc config-env virtual-env change-root user at host path vcs percent
# Disable right side sad smiley, works nicer with resized terminal
zstyle ':prompt:grml:right:setup' use-rprompt false
# disable PROMPT_EOL_MARK or also known as % on end of line
# https://unix.stackexchange.com/a/302710
#set +o prompt_cr +o prompt_sp
# Tell to the terminal about our current working directory
# NB: turns out that alacritty snopps that info from /proc/PID/cwd
xsource ~/.config/zsh/functions/osc7-pwd.zsh
# enable OSC 133 shell prompt start/end reporting
# so that the terminal can scroll jump between prompts
xsource ~/.config/zsh/functions/semantic-prompt.zsh
# Git based dotfiles setup start
function _config_activate {
export GIT_DIR=$HOME/.cfg/
export GIT_WORK_TREE=$HOME
CONFIG_ENV="config"
}
function _config_deactivate {
unset GIT_DIR GIT_WORK_TREE CONFIG_ENV
}
function config_status {
# Borrowed from https://mitxela.com/projects/dotfiles_management
(
_config_activate
for i in $(git ls-files); do
echo -n "$(git -c color.status=always status $i -s | sed "s#$i##")"
echo -e "¬/$i¬\e[0;33m$(git -c color.ui=always log -1 --format="%s" -- $i)\e[0m"
done
) | column -t --separator=¬ -T2
}
function config {
if [[ -n "$1" ]]; then
_config_activate
git $@
_config_deactivate
return
elif [[ -z "${CONFIG_ENV}" ]]; then
_config_activate
else
_config_deactivate
fi
}
# git based dotfiles setup end
# GRML profiles
zstyle ':chpwd:profiles:/home/arti/code/messente(|/|/*)' profile messente
function chpwd_profile_messente() {
[[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
export GIT_AUTHOR_EMAIL="[email protected]"
export GIT_COMMITTER_EMAIL="[email protected]"
}
function chpwd_leave_profile_messente() {
[[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
unset GIT_AUTHOR_EMAIL \
GIT_COMMITTER_EMAIL
}
chpwd_profiles
# for some reason zsh does not pick up git-subrepo custom command
# I have to add it manually to git completion
zstyle ':completion:*:*:git:*' user-commands subrepo:'perform git-subrepo operations'
# First clear grml-zsh-config provided directory hashes
hash -d -r
# shorten dir name in prompt
hash -d messente=~/code/messente
function hash_projects() {
# hash everything under messente projects
local project_folder
for project_folder in ~/code/messente/*; do
hash -d "${project_folder:t}"="${project_folder}"
done
unset project_folder
}
hash_projects
# remove need to add ~ in front of hashed dirs
setopt cdable_vars
# Enable or disable python virtual env
function chpwd_auto_python_venv() {
local venv_activation_script=((../)#(.|)(v|)env/bin/activate(#qN.omY1:a))
# dont check for (current_venv != found_venv) here because
# we want to support swtiching between venvs
if [[ -n "${venv_activation_script}" && -z "${VIRTUAL_ENV}" ]]; then
# we found venv dir that is not yet activated or is different from currently active one
source "${venv_activation_script}"
elif [[ -z "${venv_activation_script}" && -n "${VIRTUAL_ENV}" ]]; then
# we have activated virtual env but we cant find venv folder anymore
deactivate
fi
}
chpwd_functions+=(chpwd_auto_python_venv)
chpwd_auto_python_venv # Try to enter venv on shell startup
# https://github.com/Tarrasch/zsh-autoenv
xsource ~/.config/zsh/zsh-autoenv/autoenv.zsh
# gitflow-zshcompletion-avh
xsource /usr/share/zsh/site-functions/git-flow-completion.zsh
# pkg not found
xsource /usr/share/doc/pkgfile/command-not-found.zsh
# default is 40%, and that is too much, limit to less lines
FZF_TMUX_HEIGHT=6
# other shortcuts already use reverse, except history search for some reason..
FZF_CTRL_R_OPTS="--reverse"
# Arch Linux
xsource /usr/share/fzf/key-bindings.zsh
xsource /usr/share/fzf/completion.zsh
# Debian
xsource /usr/share/doc/fzf/examples/key-bindings.zsh
# fzf history search with support for Ctrl+E history edit like with zaw widget before
if typeset -f fzf-history-widget > /dev/null; then
# Copied form key-bindings.zsh
# CTRL-R - Paste the selected command from history into the command line
fzf-history-widget() {
local selected num
setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null
selected=( $(fc -rl 1 | perl -ne 'print if !$seen{(/^\s*[0-9]+\**\s+(.*)/, $1)}++' |
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort --expect=ctrl-e $FZF_CTRL_R_OPTS --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) )
local ret=$?
if [ -n "$selected" ]; then
local accept=0
if [[ $selected[1] == ctrl-e ]]; then
accept=1
shift selected
fi
num=$selected[1]
if [ -n "$num" ]; then
zle vi-fetch-history -n $num
[[ $accept = 0 ]] && zle accept-line
fi
fi
zle reset-prompt
return $ret
}
zle -N fzf-history-widget
bindkey '^R' fzf-history-widget
fi
# Paste handling
autoload -Uz bracketed-paste-magic
zle -N bracketed-paste bracketed-paste-magic
autoload -Uz bracketed-paste-url-magic
zle -N bracketed-paste bracketed-paste-url-magic
# Reverse `cd -<TAB>` history menu
setopt pushdminus
#
# Utility functions
function new-scratch {
local cur_dir="$HOME/scratch"
local new_dir="$HOME/tmp/scratch-`date +'%s'`"
mkdir -p $new_dir
ln -nfs $new_dir $cur_dir
cd $cur_dir
echo "New scratch dir ready for grinding ;>"
}
histsearch() { fc -lim "*$@*" 1 }
alias pacman="sudo pacman"
alias py="python"
alias py2="python2"
alias ll="ls -lh"
alias la="ls -a"
alias dmesg="dmesg -L"
alias disapprove="firefox 'data:text/html;base64,PGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjU1dm1pbiI+JiMzMjMyO18mIzMyMzI7PC9kaXY+Cg=='"
alias ipy="ipython"
alias htop="htop -d 10"
alias ip="ip -color=auto"
alias cp="cp --reflink=auto"
alias gitg="LANG=en_US.UTF-8 gitg"
export EDITOR=nvim
export VISUAL=nvim
MAILCHECK=0
MAIL=~/Mail
# iostat colors
export S_COLORS=auto
if command -v ruby > /dev/null; then
ruby_gem_user_dir="$(ruby -e 'print Gem.user_dir')/bin"
else
ruby_gem_user_dir=''
fi
# kubectl plugin manager Krew
export KREW_ROOT="~/.config/krew"
if [[ -d "${KREW_ROOT}/bin" ]]; then
krew_bin_path="${KREW_ROOT}/bin"
else
krew_bin_path=''
fi
# ZSH allows $PATH to be used as an array
path=(
~/.bin
~/.local/bin
${ruby_gem_user_dir}
${krew_bin_path}
/usr/bin/site_perl
/usr/bin/vendor_perl
/usr/bin/core_perl
$path
)
HISTSIZE=100000
SAVEHIST=100000
unsetopt share_history
setopt INC_APPEND_HISTORY_TIME
# by default show 3 months of calendar with week number
# but also allow to override it
function cal {
local CALENDAR=$(which -p cal)
if [[ $# -eq 0 ]]; then
$CALENDAR -m -w3
else
$CALENDAR -m "$@"
fi
}
# this fixes gedit python plugins that otherwise are broken under venv
function gedit {
local REAL_PATH=$PATH;
if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
REAL_PATH=$_OLD_VIRTUAL_PATH;
fi
PATH=$REAL_PATH env -u VIRTUAL_ENV /usr/bin/gedit $@;
}
# NodeJS people really love to erase the terminal scrollback buffer
# running npm through cat usually solves it
# https://nodejs.org/api/tty.html#tty
# https://github.com/facebook/create-react-app/issues/2495
function npm {
(
export COLOR=1
export REACT_APP_NO_CLEAR_CONSOLE=1
exec /usr/bin/npm $@ | cat
)
}
function ssh {
(
if [[ "$TERM" == "foot" ]]; then
export TERM=xterm-256color
fi
exec /usr/bin/ssh $@
)
}
# i don't like that systemd by default uses a pager
export SYSTEMD_PAGER=''
# set man max width
export MANWIDTH=80
# make npm gyp faster
export JOBS=8
# under tmux less needs this to support scrolling
if [[ "$TERM" == "" ]]; then
export LESS='--mouse --wheel-lines=3'
fi
# https://neovim.io/doc/user/various.html#less
function vless {
/usr/share/nvim/runtime/macros/less.sh $@
}
# If running under windows with pageagent then use it
# https://github.com/benpye/wsl-ssh-pageant
if [[ -e /mnt/c/wsl-ssh-pageant/ssh-agent.sock ]]; then
export SSH_AUTH_SOCK=/mnt/c/wsl-ssh-pageant/ssh-agent.sock
fi
# We are running under WSL
if [[ -e /dev/lxss ]]; then
# Create pretty serial device names
reg.exe query HKLM\\HARDWARE\\DEVICEMAP\\SERIALCOMM | awk '/Device/ {gsub("\r","",$3); print "/dev/ttyS" substr($3,4), "/dev/tty" substr($1,9)}' | sudo xargs -n2 ln -sf
fi
function nitroid {
# Switch Nitrokey Start Identity
# https://github.com/Nitrokey/pynitrokey/tree/70398d9d87d002c14402591dfa6e4fe9e7182351#switching-id
local ID=$1
if ! [[ "$ID" =~ [0-2] ]]; then
echo "Usage: $0 ID"
echo "Where identity ID is in range 0-2"
return 1
fi
if gpg-connect-agent --hex "scd apdu 00 85 00 0$ID" /bye | grep -q ERR; then
sleep 1
gpg-connect-agent --decode "scd serialno" /bye
else
echo "already set"
fi
}
compdef 'compadd -X "Identity" 0 1 2' nitroid
function cpr {
rsync --archive -hh --partial --info=stats1,progress2 "$@"
}