summaryrefslogtreecommitdiff
path: root/zsh/zshrc
blob: c480aac0ef25b8f76221472bfb9747fa546eae2e (plain) (blame)
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
source ~/.config/zsh/antigen.zsh

if command -v git >/dev/null && [ ! -d ~/.config/zsh/powerlevel10k ]; then
	echo "info: installing p10k"
	git clone --depth 1 --single-branch https://github.com/romkatv/powerlevel10k.git ~/.config/zsh/powerlevel10k
fi

if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
	source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi

source ~/.config/zsh/p10k/powerlevel10k.zsh-theme
source ~/.config/zsh/p10k.zsh

antigen bundle zsh-users/zsh-syntax-highlighting
antigen bundle zsh-users/zsh-history-substring-search
antigen bundle zsh-users/zsh-autosuggestions
antigen bundle zsh-users/zsh-completions
antigen bundle ael-code/zsh-colored-man-pages
antigen theme romkatv/powerlevel10k
antigen apply

# Exports

#export GOPROXY=https://proxy.neonxp.ru
export GOPRIVATE=devopar.hippoparking.ru,gitlab.sovcombank.group
export EDITOR="nvim"
#export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
export ANDROID_HOME=$HOME/projects/android/
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:~/.local/bin:~/go/bin:~/.cargo/bin
export GOBIN=~/go/bin
export GPG_TTY=$(tty)
export LS_OPTIONS='--color=auto'
eval "$(dircolors -b)"

fpath+="~/.config/zsh/comp"


# Aliases
alias ls='ls $LS_OPTIONS -F'
alias l='ls $LS_OPTIONS -F'
alias j="sudo journalctl"
alias s='sudo'
alias sctl="sudo systemctl"
alias ll="ls -AFhl"
alias cp="cp -i"
alias gitpush="git add . && git commit --amend --no-edit && git push -f"
alias yu="ssh-add -e /usr/lib/x86_64-linux-gnu/libykcs11.so; ssh-add -s /usr/lib/x86_64-linux-gnu/libykcs11.so"
alias n="nvim"
alias nv="nvim ."
alias cp="cp -i"
alias df="df -h"
alias free="free -m"
alias gitu='git add . && git commit && git push'
alias g=git
alias nsh='wl-paste | curl -d @- https://nixshare.ru/upload 2>/dev/null | wl-copy'
alias p=python3

[[ ! -f `which exa` ]] || alias ls="exa" && alias ll="exa -l"

# Functions
function tk() { mkdir -p $1; cd $1; }

## Options section
setopt correct				# Auto correct mistakes
setopt extendedglob			# Extended globbing. Allows using regular expressions with *
setopt nocaseglob			# Case insensitive globbing
setopt rcexpandparam		# Array expension with parameters
setopt nocheckjobs			# Don"t warn about running processes when exiting
setopt numericglobsort		# Sort filenames numerically when it makes sense
setopt nobeep				# No beep
setopt appendhistory		# Immediately append history instead of overwriting
setopt histignorealldups	# If a new command is a duplicate, remove the older one
setopt autocd				# if only directory path is entered, cd there.
setopt inc_append_history	# save commands are added to the history immediately, otherwise only when shell exits.
setopt histignorespace		# Don"t save commands that start with space

zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' # Case insensitive tab completion
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"	# Colored completion (different colors for dirs/files/etc)
zstyle ':completion:*' rehash true						# automatically find new executables in path
zstyle ':completion:*' menu select						# Highlight menu selection
# Speed up completions
zstyle ':completion:*' accept-exact '*(N)'
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path ~/.zsh/cache

zstyle ":completion:*:processes" command "ps -ax"
zstyle ":completion:*:*:kill:*:processes" list-colors "=(#b) #([0-9]#)*=0=01;32"
zstyle ":completion:*:*:kill:*" menu yes select
zstyle ":completion:*:kill:*"	 force-list always

zstyle ":completion:*:processes-names" command "ps -e -o comm="
zstyle ":completion:*:*:killall:*" menu yes select
zstyle ":completion:*:killall:*"	 force-list always

HISTFILE=~/.zsh_history
HISTSIZE=100000
SAVEHIST=100000
WORDCHARS=${WORDCHARS//\/[&.;]}


autoload -U compinit colors zcalc
compinit -d

# Runs before showing the prompt
function mzc_termsupport_precmd {
	[[ "${DISABLE_AUTO_TITLE:-}" == true ]] && return
	title $ZSH_THEME_TERM_TAB_TITLE_IDLE $ZSH_THEME_TERM_TITLE_IDLE
}

# Runs before executing the command
function mzc_termsupport_preexec {
	[[ "${DISABLE_AUTO_TITLE:-}" == true ]] && return

	emulate -L zsh

	# split command into array of arguments
	local -a cmdargs
	cmdargs=("${(z)2}")
	# if running fg, extract the command from the job description
	if [[ "${cmdargs[1]}" = fg ]]; then
	 # get the job id from the first argument passed to the fg command
	 local job_id jobspec="${cmdargs[2]#%}"
	 # logic based on jobs arguments:
	 # http://zsh.sourceforge.net/Doc/Release/Jobs-_0026-Signals.html#Jobs
	 # https://www.zsh.org/mla/users/2007/msg00704.html
	 case "$jobspec" in
		 <->) # %number argument:
			 # use the same <number> passed as an argument
			 job_id=${jobspec} ;;
		 ""|%|+) # empty, %% or %+ argument:
			 # use the current job, which appears with a + in $jobstates:
			 # suspended:+:5071=suspended (tty output)
			 job_id=${(k)jobstates[(r)*:+:*]} ;;
		 -) # %- argument:
			 # use the previous job, which appears with a - in $jobstates:
			 # suspended:-:6493=suspended (signal)
			 job_id=${(k)jobstates[(r)*:-:*]} ;;
		 [?]*) # %?string argument:
			 # use $jobtexts to match for a job whose command *contains* <string>
			 job_id=${(k)jobtexts[(r)*${(Q)jobspec}*]} ;;
		 *) # %string argument:
			 # use $jobtexts to match for a job whose command *starts with* <string>
			 job_id=${(k)jobtexts[(r)${(Q)jobspec}*]} ;;
	 esac

	 # override preexec function arguments with job command
	 if [[ -n "${jobtexts[$job_id]}" ]]; then
		 1="${jobtexts[$job_id]}"
		 2="${jobtexts[$job_id]}"
	 fi
	fi

	# cmd name only, or if this is sudo or ssh, the next cmd
	local CMD=${1[(wr)^(*=*|sudo|ssh|mosh|rake|-*)]:gs/%/%%}
	local LINE="${2:gs/%/%%}"

	title '$CMD' '%100>...>$LINE%<<'
}

# Emits the control sequence to notify many terminal emulators
# of the cwd
#
# Identifies the directory using a file: URI scheme, including
# the host name to disambiguate local vs. remote paths.
function mzc_termsupport_cwd {
	# Percent-encode the host and path names.
	local URL_HOST URL_PATH
	URL_HOST="$(zsh_urlencode -P $HOST)" || return 1
	URL_PATH="$(zsh_urlencode -P $PWD)" || return 1

	# common control sequence (OSC 7) to set current host and path
	printf "\e]7;%s\a" "file://${URL_HOST}${URL_PATH}"
}

autoload -U add-zsh-hook
add-zsh-hook precmd mzc_termsupport_precmd
add-zsh-hook preexec mzc_termsupport_preexec
# Use a precmd hook instead of a chpwd hook to avoid contaminating output
# i.e. when a script or function changes directory without `cd -q`, chpwd
# will be called the output may be swallowed by the script or function.
add-zsh-hook precmd mzc_termsupport_cwd

source ~/.config/zsh/conf.d/*.zsh

colors


## Plugins section: Enable fish style features
# Use syntax highlighting
#source ${HOME}/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
# Use history substring search
#source ${HOME}/.zsh/plugins/zsh-history-substring-search/zsh-history-substring-search.zsh
# bind UP and DOWN arrow keys to history substring search
zmodload zsh/terminfo
bindkey "$terminfo[kcuu1]" history-substring-search-up
bindkey "$terminfo[kcud1]" history-substring-search-down
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

bindkey -e
bindkey "^[[7~" beginning-of-line															 # Home key
bindkey "^[[H" beginning-of-line																# Home key
if [[ "${terminfo[khome]}" != "" ]]; then
	bindkey "${terminfo[khome]}" beginning-of-line								# [Home] - Go to beginning of line
fi
bindkey "^[[8~" end-of-line																		 # End key
bindkey "^[[F" end-of-line																		 # End key
if [[ "${terminfo[kend]}" != "" ]]; then
	bindkey "${terminfo[kend]}" end-of-line											 # [End] - Go to end of line
fi
bindkey "^[[2~" overwrite-mode																	# Insert key
bindkey "^[[3~" delete-char																		 # Delete key
bindkey "^[[C"	forward-char																		# Right key
bindkey "^[[D"	backward-char																	 # Left key
bindkey "^[[5~" history-beginning-search-backward							 # Page up key
bindkey "^[[6~" history-beginning-search-forward								# Page down key

# Navigate words with ctrl+arrow keys
bindkey "^[Oc" forward-word																		 #
bindkey "^[Od" backward-word																		#
bindkey "^[[1;5D" backward-word																 #
bindkey "^[[1;5C" forward-word																	#
bindkey "^H" backward-kill-word																 # delete previous word with ctrl+backspace
bindkey "^[[Z" undo																						 # Shift+tab undo last action

# ctrl + space accept suggestion
bindkey "^ " autosuggest-accept

dotenv() {
	 if [ $# -eq 0 ]; then
			 [ -f .env.gpg ] && set -- .env.gpg "$@"
			 [ -f .env		 ] && set -- .env		 "$@"
	 fi

	 set -a
	 while [ $# -gt 0 ]; do
			 echo "dotenv: Loading $1"
			 case "$1" in
			 *.gpg)
					 eval "$(gpg --quiet --decrypt --yes "$1")"
					 ;;
			 */*)
					 . "$1"
					 ;;
			 *)
					 . "./$1"
			 esac
			 shift
	 done
	 set +a
}

# Set terminal window and tab/icon title
#
# usage: title short_tab_title [long_window_title]
#
# See: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#ss3.1
# Fully supports screen and probably most modern xterm and rxvt
# (In screen, only short_tab_title is used)
function title {
	emulate -L zsh
	setopt prompt_subst

	[[ "$EMACS" == *term* ]] && return

	# if $2 is unset use $1 as default
	# if it is set and empty, leave it as is
	: ${2=$1}

	case "$TERM" in
	 xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|kitty|wezterm|st*)
		 print -Pn "\e]2;${2:q}\a" # set window name
		 print -Pn "\e]1;${1:q}\a" # set tab name
		 ;;
	 screen*|tmux*)
		 print -Pn "\ek${1:q}\e\\" # set screen hardstatus
		 ;;
	 *)
	 # Try to use terminfo to set the title
	 # If the feature is available set title
	 if [[ -n "$terminfo[fsl]" ]] && [[ -n "$terminfo[tsl]" ]]; then
		 echoti tsl
		 print -Pn "$1"
		 echoti fsl
	 fi
		 ;;
	esac
}

ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD
ZSH_THEME_TERM_TITLE_IDLE="%n@%m:%~"

# URL-encode a string
#
# Encodes a string using RFC 2396 URL-encoding (%-escaped).
# See: https://www.ietf.org/rfc/rfc2396.txt
#
# By default, reserved characters and unreserved "mark" characters are
# not escaped by this function. This allows the common usage of passing
# an entire URL in, and encoding just special characters in it, with
# the expectation that reserved and mark characters are used appropriately.
# The -r and -m options turn on escaping of the reserved and mark characters,
# respectively, which allows arbitrary strings to be fully escaped for
# embedding inside URLs, where reserved characters might be misinterpreted.
#
# Prints the encoded string on stdout.
# Returns nonzero if encoding failed.
#
# Usage:
#	zsh_urlencode [-r] [-m] [-P] <string> [<string> ...]
#
#		-r causes reserved characters (;/?:@&=+$,) to be escaped
#
#		-m causes "mark" characters (_.!~*''()-) to be escaped
#
#		-P causes spaces to be encoded as '%20' instead of '+'
function zsh_urlencode() {
	emulate -L zsh
	local -a opts
	zparseopts -D -E -a opts r m P

	local in_str="$@"
	local url_str=""
	local spaces_as_plus
	if [[ -z $opts[(r)-P] ]]; then spaces_as_plus=1; fi
	local str="$in_str"

	# URLs must use UTF-8 encoding; convert str to UTF-8 if required
	local encoding=$langinfo[CODESET]


	# Use LC_CTYPE=C to process text byte-by-byte
	local i byte ord LC_ALL=C
	export LC_ALL
	local reserved=';/?:@&=+$,'
	local mark='_.!~*''()-'
	local dont_escape="[A-Za-z0-9"
	if [[ -z $opts[(r)-r] ]]; then
	 dont_escape+=$reserved
	fi
	# $mark must be last because of the "-"
	if [[ -z $opts[(r)-m] ]]; then
	 dont_escape+=$mark
	fi
	dont_escape+="]"

	# Implemented to use a single printf call and avoid subshells in the loop,
	# for performance
	local url_str=""
	for (( i = 1; i <= ${#str}; ++i )); do
	 byte="$str[i]"
	 if [[ "$byte" =~ "$dont_escape" ]]; then
		 url_str+="$byte"
	 else
		 if [[ "$byte" == " " && -n $spaces_as_plus ]]; then
			 url_str+="+"
		 else
			 ord=$(( [##16] #byte ))
			 url_str+="%$ord"
		 fi
	 fi
	done
	echo -E "$url_str"
}

if [ -f env.sh ]; then
	source ./env.sh
fi

[[ ! -f ~/.zshrc.local ]] || source ~/.zshrc.local
[[ ! -f ~/.config/zsh/p10k.zsh ]] || source ~/.config/zsh/p10k.zsh

# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh