aboutsummaryrefslogtreecommitdiff
path: root/dot_zshrc.tmpl
blob: 62fef86449d8e874ab0374765912dac7f598a0b7 (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
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
#
# ~/.zshrc
# Z shell configuration file.
#                                                                        CREDITS
# File was first taken from the following location:
#
#   http://www.tomaw.net/configs/zshrc
#
# Some additions were made by me, Jonathan Patrick Davies <jpds@ubuntu.com>.
# Among these are the Launchpad, Debian, Wikipedia/Wikitravel, BBC search,
# Demonoid, Lonely Planet, Urbandictionary and other various functions. I also
# implemented a few "if" statements to stop zsh complaining about any missing
# objects and placed the dircolors support.
#
# The forkex() function is thanks to Siegfried-Angel Gevatter Pujals
#   <rainct@ubuntu.com>.
#
# Some of this file is thanks to <slarti@gentoo.org>, some is take from
# spider's <spider@gentoo.org> zshrc, and some from the zshwiki.org.
# Some bash functions are nicked from ciaranm's <ciaranm@gentoo.org>
# bashrc.
#
# READ ME
#
# • Remember to change the stuff specific to me! It's all at the top of
#   this file.
#
# • You can obviously only get the most out of this file if you take the
#   time to read through the comments. Of course, you can still experience
#   zsh's superiority by simply plugging this file in and using it.
#

# BEGIN LOCAL

export TIME_STYLE=long-iso              # make ls -l use YYYY-MM-DD in dired
export TZ="America/Toronto"             # Force our time zone this location.
export EDITOR="vim"                     # Long live vim (as our editor).
export NAME="Ryan Kavanagh"             # Our name.
export EMAIL="rak@rak.ac"               # Our email address.
export GPGKEY="4E469519ED677734268FBD958F7BF8FC4A11C97A"                # Our GnuPG key ID.
export DEBFULLNAME=$NAME                # These are used by Debian packaging...
export DEBEMAIL="rak@debian.org"        # ...programs.
export DEBSIGN_KEYID=$GPGKEY            # Key ID for signing Debian packages.
export BZR_EMAIL="$NAME <$EMAIL>"       # Override email for Bazaar.
export GIT_AUTHOR_NAME=$NAME
export DARCS_EMAIL="$NAME <$EMAIL>"
export QUILT_PATCHES=debian/patches
export MANWIDTH=80
export MANOPT="-L en"
export PAGER=less
export LESS=-FQXR
export PDFVIEWER=evince
export BROWSER=firefox
export TEXMFHOME=${HOME}/.texmf
export KRB5CCNAME=DIR:${HOME}/.cache/krb5cc # kerberos credentials cache
export GOPATH=${HOME}/.go

for common in ${HOME}/.config/sh/*; do
    [ -f "${common}" ] && . "${common}"
done

export PATH=/usr/sbin:/sbin:${PATH}
case `uname` in
    Linux)
        ;;
    Darwin)
        export PATH=/opt/local/bin:/opt/local/sbin:/usr/sbin:/sbin:$PATH
        export MANPATH=/opt/local/share/man:${MANPATH}
        ;;
    OpenBSD)
        export PATH=/usr/games:${PATH}
        ;;
    *)
esac
export PATH=${HOME}/bin:${PATH}

# END LOCAL

. ${HOME}/.opam/opam-init/init.zsh > /dev/null 2> /dev/null || true

# Ensure that we possess a ~/.zsh/ directory. This is required for the
# ~/.zsh/history file.
if [ ! -d $HOME/.zsh/ ]; then
    mkdir -p $HOME/.zsh/
fi

# We use powerline10k for our prompt
for f in $HOME/.zsh/p10k.zsh $HOME/.zsh/powerlevel10k/powerlevel10k.zsh-theme; do
    [[ ! -f $f ]] || source $f
done
if [[ -f $HOME/.zsh/powerlevel10k/gitstatus/gitstatusd-$(uname) ]]; then
    GITSTATUS_DAEMON=$HOME/.zsh/powerlevel10k/gitstatus/gitstatusd-$(uname);
elif [[ ! -f $HOME/.zsh/powerlevel10k/gitstatus/gitstatusd ]]; then
    POWERLEVEL9K_DISABLE_GITSTATUS=true
fi

# Colours.
autoload -U colors; colors

# Change word boundary characters. Nabbed from
# http://zshwiki.org/KeyBindings.

# By default: export WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>'
# We remove the slash, period, angle brackets, dash here.
export WORDCHARS='*?_-[]~=&;!#$%^(){}'

# Follow GNU LS_COLORS for completion menus
zmodload -i zsh/complist

# Should dircolors exist. Fetch LS_COLORS from it.
if [ "`which dircolors`" != 'dircolors not found' ]; then
    eval "$(dircolors -b)"
fi

zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
zstyle ':completion:*:*:kill:*' list-colors '=%*=01;31'

# Load the completion system
autoload -U compinit; compinit

compdef _quilt dquilt=quilt  # Quilt tab completion for dquilt

## Key bindings
# You may use:
# % autoload -U zkbd
# % zkbd
# to discover your keys.


typeset -U fpath

# Actually, stick with emacs for the moment. The vi keymap just doesn't
# seem to be as complete (even if it's nicer for editing, there's no
# execute-named-cmd bound, for example).
bindkey -e             # Emacs keybindings.

# pattern history search
bindkey '^R' history-incremental-pattern-search-backward

# Very powerful version of mv implemented in zsh. The main feature I
# know of it that seperates it from the standard mv is that it saves you
# time by being able to use patterns which are expanded into positional
# parameters. So:
#
# slarti@pohl % zmv (*)foo ${1}bar
#
# On a series of files like onefoo, twofoo, threefoo, fivefoo would be
# renamed to onebar twobar threebar fourbar.
#
# Although that's nifty enough, I suspect there are other features I
# don't know about yet...
#
# Read $fpath/zmv for some more basic examples of usage, and also use
# run-help on it :)
autoload -U zmv

# Like xargs, but instead of reading lines of arguments from standard input,
# it takes them from the command line. This is possible/useful because,
# especially with recursive glob operators, zsh often can construct a command
# line for a shell function that is longer than can be accepted by an external
# command. This is what's often referred to as the "shitty Linux exec limit" ;)
# The limitation is on the number of characters or arguments.
#
# slarti@pohl % echo {1..30000}
# zsh: argument list too long: /bin/echo
# zsh: exit 127   /bin/echo {1..30000}
autoload -U zargs

# Makes it easy to type URLs as command line arguments. As you type, the
# input character is analyzed and, if it mayn eed quoting, the current
# word is checked for a URI scheme. If one is found and the current word
# is not already quoted, a blackslash is inserted before the input
# caracter.
autoload -U url-quote-magic
zle -N self-insert url-quote-magic

# zed is a tiny command-line editor in pure ZSH; no other shell could do
# this.  zed itself is simple as anything, but it's killer feature for
# me is that it can edit functions on the go with zed -f <funcname> (or
# fned <funcname>. This is useful for me when I'm using and defining
# functions interactively, for example, when I'm working through the
# Portage tree in CVS. It allows me to edit a function on the fly,
# without having to call the last definition back up from the history
# and re-edit that in ZLE. It also indents the function, even if it was
# defined on all one line in the line editor, making it easy as anything
# to edit.
#
# ^X^W to save, ^C to abort.
autoload -U zed

# Incremental completion of a word. After starting this, a list of
# completion choices can be shown after every character you type, which
# can deleted with ^H or delete. Return will accept the current
# completion. Hit tab for normal completion, ^G to get back where you
# came from and ^D to list matches.
autoload -U incremental-complete-word
zle -N incremental-complete-word
bindkey "^Xi" incremental-complete-word

# This function allows you type a file pattern, and see the results of
# the expansion at each step.  When you hit return, they will be
# inserted into the command line.
autoload -U insert-files
zle -N insert-files
bindkey "^Xf" insert-files

# This set of functions implements a sort of magic history searching.
# After predict-on, typing characters causes the editor to look backward
# in the history for the first line beginning with what you have typed so
# far.  After predict-off, editing returns to normal for the line found.
# In fact, you often don't even need to use predict-off, because if the
# line doesn't match something in the history, adding a key performs
# standard completion - though editing in the middle is liable to delete
# the rest of the line.
autoload -U predict-on
zle -N predict-on
zle -N predict-off
bindkey "^X^Z" predict-on
bindkey "^Z" predict-off

# run-help is a help finder, bound in ZLE to M-h.  It doesn't need to be
# autoloaded to work - the non-autoloaded version just looks up a man
# page for the command under the cursor, then when that process is
# finished it pulls your old command line back up from the buffer stack.
# However, with the autoloaded function and:
#
# mkdir ~/zsh-help; cd ~/zsh-help MANPAGER="less" man zshbuiltins | \
# colcrt | perl /usr/share/zsh/4.2.1/Util/helpfiles
#
# It'll work for zsh builtins too. By the way, I've assumed some things
# in that command. ~/zsh-help can be wherever you like, MANPAGER needs
# to be any standard pager (less, pg, more, just not the MANPAGER I have
# defined in this file), colcrt can be col -bx, and the path to
# helpfiles may be different for you (Util may not even be installed
# with your distribution; fair enough, make install doesn't install it.
# Dig up a source tarball and everything is in there).

# Load the new one
autoload -U run-help

# Press Alt-H to show help for command we are currently on.
bindkey '[[A' run-help

# https://zsh.sourceforge.io/Doc/Release/Options.html#History
# History file name and maximum size.
HISTFILE="$HOME/.zsh/history"
SAVEHIST=500000
HISTSIZE=600000 # should be > SAVEHIST

# Save each command’s beginning timestamp (in seconds since the epoch) and the
# duration (in seconds) to the history file.
setopt EXTENDED_HISTORY

# If the internal history needs to be trimmed to add the current command line,
# setting this option will cause the oldest history event that has a duplicate
# to be lost before losing a unique event from the list.
setopt HIST_EXPIRE_DUPS_FIRST

# Better locking to avoid corruption
setopt HIST_FCNTL_LOCK

# When searching for history entries in the line editor, do not display
# duplicates of a line previously found, even if the duplicates are not
# contiguous.
setopt HIST_FIND_NO_DUPS

# Don't story commands in history if they start with a space
setopt HIST_IGNORE_SPACE

# Don't store history/fc -l in the history list when invoked
setopt HIST_NO_STORE

# Remove superfluous blanks from each command line being added to the history
# list.
setopt HIST_REDUCE_BLANKS

# This option works like APPEND_HISTORY except that new history lines are added
# to the $HISTFILE incrementally (as soon as they are entered), rather than
# waiting until the shell exits. The file will still be periodically re-written
# to trim it when the number of lines grows 20% beyond the value specified by
# $SAVEHIST (see also the HIST_SAVE_BY_COPY option).
setopt INC_APPEND_HISTORY

# Push History from previous sessions. IF $HISTFILE exists.
if [ -f $HISTFILE ]; then
    fc -RI $HISTFILE
fi



# This function sets the window tile to user@host:/workingdir before each
# prompt. If you're using screen, it sets the window title (works
# wonderfully for 'hardstatus' lines.
precmd() {
#    [[ -t 1 ]] || return
    case $TERM in
        *xterm*|rxvt*) print -Pn "\e]2;%n@%m:%~\a"
        ;;
        screen*) print -Pn "\ek%n@%m:%~\e\\"
        ;;
    esac
}

# This sets the window title to the last run command.
preexec() {
#    [[ -t 1 ]] || return
    case $TERM in
        *xterm*|rxvt*) print -Pn "\e]2;$1\a"
        ;;
        screen*) print -Pn "\ek$1\e\\"
        ;;
    esac
}

# Custom commands.

loop() {
    while [ 1 -eq 1 ]; do
        $@
    done
}

# CTAN downloader

ctand() {
    wget http://mirror.ctan.org/macros/latex/contrib/$1.zip && unzip $1.zip
}

# For formating text files for a printer
fmtpr() {
    fmt --width=62 $@ | LC_ALL=C LANG=C pr -o 10 -W 62 -J -F -l 62
}

# Russian
#

verb.rus() {
    curl -s "http://en.wiktionary.org/w/index.php?title=$1&action=edit" | grep 'ru-conj-'
    firefox "http://en.wiktionary.org/w/index.php?title=$1"
}

#
# Debian.
#
debian.bugs.number() {
    # Debian Bug Tracker - by number.
    w3m "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=$1"
}

debian.bugs.package() {
    # Debian Bug Tracker - by package.
    w3m "http://bugs.debian.org/cgi-bin/pkgreport.cgi?src=$1"
}

debian.packages() {
    # Debian Packages.
    # Add 'src:' in front of the package name to search for source packages.
    w3m "http://packages.debian.org/$1"
}

debian.qa.maintainer() {
    # Debian QA Maintainer search by email address.
    w3m "http://qa.debian.org/developer.php?login=$1"
}

debian.qa.package() {
    # Debian QA Maintainer search by package name.
    w3m "http://qa.debian.org/developer.php?package=$1"
}

debian.qa.pts() {
    # Debian Package Tracking system - developers.
    w3m "http://packages.qa.debian.org/$1"
}

debian.qa.task() {
    # Debian QA - search for task.
    w3m "http://qa.debian.org/developer.php?task=$1"
}

debian.wiki() {
    # Search the Debian Wiki.
    w3m "http://wiki.debian.org/?action=fullsearch&value=$@"
}

#
# Others.
#

wttr() {
    local request="wttr.in/${1-Montreal}"
    [ "$(tput cols)" -lt 125 ] && request+='?n'
    curl -H "Accept-Language: ${LANG%_*}" --compressed "$request"
}

google() {
    # Google search.
    w3m "http://www.google.com/search?q=$@"
}

wikipedia() {
    # Wikipedia search. English section.
    w3m "http://en.wikipedia.org/wiki/Special:Search?search=$@"
}

wiktionary() {
    # Search Wiktionary for a term.
    w3m "http://en.wiktionary.org/wiki/Special:Search?search=$@"
}

forkex() {
    # Fork program $@ from console.
    nohup "$@" >/dev/null 2>&1 <&1 & disown %%
}

gbp-snap() {
    if [[ -e $@ ]]; then
        git-dch -aSN $1
    else
        git-dch -aS
    fi
    gpg-mounter
    gibuild --git-ignore-new
    DSC=`head -n1 debian/changelog | sed -e 's/\(.*\) (\(.*\)).*/\1_\2.dsc/g'`
    DIST=`head -n1 debian/changelog | sed -e 's/.* \(.*\);.*/\1/g'`
    cd ..
    sbuild -d $DIST $DSC
}

# Pretty menu!
zstyle ':completion:*' menu select=1
zstyle ':completion:*' select-prompt %SScroll active at %p%s.

# Completion options.
zstyle ':completion:*' completer _complete _prefix
zstyle ':completion::prefix-1:*' completer _complete
zstyle ':completion:incremental:*' completer _complete _correct
zstyle ':completion:predict:*' completer _complete

# Completion caching.
zstyle ':completion::complete:*' use-cache 1
zstyle ':completion::complete:*' cache-path ~/.zsh/cache/$HOST

# Expand partial paths.
zstyle ':completion:*' expand 'yes'
zstyle ':completion:*' squeeze-slashes 'yes'

# Include non-hidden directories in globbed file completions
# for certain commands.
zstyle ':completion::complete:*' '\'

# Use menuselection for PID completion.
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*' force-list always

#  tag-order 'globbed-files directories' all-files.
zstyle ':completion::complete:*:tar:directories' file-patterns '*~.*(-/)'

# Do not complete backup files as executables.
zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~'

# Separate matches into groups.
zstyle ':completion:*:matches' group 'yes'

# With commands like rm, it's annoying if you keep getting offered the same
# file multiple times. This fixes it. Also good for cp, et cetera..
zstyle ':completion:*:rm:*' ignore-line yes
zstyle ':completion:*:cp:*' ignore-line yes

# Describe each match group.
zstyle ':completion:*:descriptions' format "%B---- %d%b"

# Messages/warnings format.
zstyle ':completion:*:messages' format '%B%U---- %d%u%b'
zstyle ':completion:*:warnings' format '%B%U---- no match for: %d%u%b'

# Describe options in full.
zstyle ':completion:*:options' description 'yes'
zstyle ':completion:*:options' auto-description '%d'

# Simulate spider's old abbrev-expand 3.0.5 patch
#zstyle ':completion:*:history-words' stop verbose
#zstyle ':completion:*:history-words' remove-all-dups yes
#zstyle ':completion:*:history-words' list false

# From the zshwiki. Hide CVS files/directories from being completed.
zstyle ':completion:*:(all-|)files' ignored-patterns '(|*/)CVS'
zstyle ':completion:*:cd:*' ignored-patterns '(*/)#CVS'

# Also from the wiki. Hide uninteresting users from completion.
zstyle ':completion:*:*:*:users' ignored-patterns \
adm apache bin daemon games gdm halt ident junkbust lp mail mailnull \
named news nfsnobody nobody nscd ntp operator pcap postgres radvd \
rpc rpcuser rpm shutdown squid sshd sync uucp vcsa xfs backup  bind  \
dictd  gnats  identd  irc  man  messagebus  postfix  proxy  sys \
www-data alias amavis at clamav cmd5checkpw cron cyrus dhcp dnscache \
dnslog foldingathome guest haldaemon jabber ldap mailman mpd mysql \
nut p2p portage postmaster qmaild qmaill qmailp qmailq qmailr qmails \
smmsp tinydns vpopmail wasabi zope

# Approximate completion. From the wiki.
zstyle ':completion:*' completer _complete _match _approximate
zstyle ':completion:*:match:*' original only
zstyle ':completion:*:approximate:*' max-errors 1 numeric

zstyle ':completion:*:sudo:*' command-path /usr/sbin /usr/bin /sbin /bin \
                                           /usr/X11R6/bin

# Options
setopt			\
NO_all_export		\
   always_last_prompt	\
   always_to_end	\
   append_history	\
   auto_cd		\
   auto_list		\
   auto_menu		\
   auto_name_dirs	\
   auto_param_keys	\
   auto_param_slash	\
   auto_pushd		\
   auto_remove_slash	\
NO_auto_resume		\
   bad_pattern		\
   bang_hist		\
NO_beep			\
   brace_ccl		\
   correct_all		\
NO_bsd_echo		\
NO_cdable_vars		\
NO_chase_links		\
   clobber		\
   complete_aliases	\
   complete_in_word	\
   correct		\
NO_correct_all		\
   csh_junkie_history	\
NO_csh_junkie_loops	\
NO_csh_junkie_quotes	\
NO_csh_null_glob	\
   equals		\
   extended_glob	\
   extended_history	\
   function_argzero	\
   glob			\
NO_glob_assign		\
   glob_complete	\
NO_glob_dots		\
NO_glob_subst		\
NO_hash_cmds		\
NO_hash_dirs		\
   hash_list_all	\
   hist_allow_clobber	\
   hist_beep		\
   hist_ignore_dups	\
   hist_ignore_space	\
NO_hist_no_store	\
   hist_verify		\
NO_hup			\
NO_ignore_braces	\
NO_ignore_eof		\
   interactive_comments	\
   inc_append_history	\
NO_list_ambiguous	\
NO_list_beep		\
   list_types		\
   long_list_jobs	\
   magic_equal_subst	\
NO_mail_warning		\
NO_mark_dirs		\
   menu_complete	\
   multios		\
   nomatch		\
   notify		\
NO_null_glob		\
   numeric_glob_sort	\
NO_overstrike		\
   path_dirs		\
   posix_builtins	\
NO_print_exit_value 	\
NO_prompt_cr		\
   prompt_subst		\
   pushd_ignore_dups	\
NO_pushd_minus		\
   pushd_silent		\
   pushd_to_home	\
   rc_expand_param	\
NO_rc_quotes		\
NO_rm_star_silent	\
NO_sh_file_expansion	\
   sh_option_letters	\
   share_history        \
   short_loops		\
NO_sh_word_split	\
NO_single_line_zle	\
NO_sun_keyboard_hack	\
NO_verbose		\
   zle

# GPG / SSH AGENT

if command -v keychain > /dev/null && test -d ~/.ssh/keys/{{ .chezmoi.hostname }}; then
    ls ~/.ssh/keys/{{ .chezmoi.hostname }}/id_* | \
        grep -E -v '\.pub$' | \
        xargs keychain {{ if (eq .chezmoi.os "linux") -}} --systemd {{- end }}
    [ -z "$HOSTNAME" ] && HOSTNAME=`uname -n`
    [ -f $HOME/.keychain/$HOSTNAME-sh ] &&
           . $HOME/.keychain/$HOSTNAME-sh
    [ -f $HOME/.keychain/$HOSTNAME-sh-gpg ] &&
           . $HOME/.keychain/$HOSTNAME-sh-gpg
fi

# vim: set ft=zsh: