aboutsummaryrefslogtreecommitdiffstats
path: root/zsh/zshrc.org
blob: 141b7808158f7b3c4993e82ff2fa97ea7417da14 (plain)
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
#+TITLE: ZSH
#+STARTUP: showall

Autoload any ZSH function from =$HOME/.zsh/functions=.

#+BEGIN_SRC sh
  fpath=($HOME/.zsh/functions $fpath)
  autoload -U $HOME/.zsh/functions/*(:t)
#+END_SRC

* Aliases

  Use rlwrap on some less-than-pleasant REPLs that don't have GNU
  Readline-like features themselves.

  #+BEGIN_SRC sh
    alias csi="rlwrap csi"
    alias scsh="rlwrap scsh"
    alias sbcl="rlwrap sbcl"
  #+END_SRC

  This alias is useful for when I'm trying something new with
  herbstluftwm.

  #+BEGIN_SRC sh
    alias hc=herbstclient
  #+END_SRC

  Systemd supports user-level services, it's easy to manage them with this
  simple alias.

  #+begin_src sh
    alias myctl="systemctl --user"
  #+end_src

  By default scrot will take a screenshot in whatever the current working
  directory is, but I prefer having it all in the same location.

  #+begin_src sh
    alias scrot="/usr/bin/scrot -e 'mv \$f ~/pictures/screenshots/'"
  #+end_src

* History

  Store ZSH history in a non-intrusive place.

  #+BEGIN_SRC sh
    HISTFILE=$HOME/.zsh/histfile
  #+END_SRC

  Keep at most 1000 previous commands in memory.

  #+BEGIN_SRC sh
    HISTSIZE=1000
  #+END_SRC

  Save at most 1000 previous commands to disk.

  #+BEGIN_SRC sh
    SAVEHIST=1000
  #+END_SRC

  Allow multiple shell instances to share the same history.

  #+BEGIN_SRC sh
    setopt SHARE_HISTORY
  #+END_SRC

  Don't remember duplicated commands.

  #+BEGIN_SRC sh
    setopt HIST_IGNORE_ALL_DUPS
  #+END_SRC

* Plug-ins

  Load zplug, a next generation zsh plugin manager.

  #+BEGIN_SRC sh
    source /usr/share/zsh/scripts/zplug/init.zsh
  #+END_SRC

  Add zsh-syntax-highlighting.

  #+BEGIN_SRC sh
    zplug "zsh-users/zsh-syntax-highlighting", defer:3
  #+END_SRC

  Add zsh-autosuggestions.

  #+BEGIN_SRC sh
    zplug "zsh-users/zsh-autosuggestions"
  #+END_SRC

  Add bgnotify from oh-my-zsh to show when long-running commands finish.

  #+BEGIN_SRC sh
    zplug "plugins/bgnotify", from:oh-my-zsh
  #+END_SRC

  Make sure all plugins are installed.

  #+BEGIN_SRC sh
    if ! zplug check --verbose; then
        printf "Install? [y/N]: "
        if read -q; then
            echo; zplug install
        fi
    fi
  #+END_SRC

  Load all plugins.

  #+BEGIN_SRC sh
    zplug load --verbose
  #+END_SRC

* X Interaction

  Make some widgets for interacting with the clipboard.

  #+BEGIN_SRC sh
    zle -N x-copy-region-as-kill
    zle -N x-kill-region
    zle -N x-yank
  #+END_SRC

  Bind them to keyboard shortcuts.

  #+BEGIN_SRC sh
    bindkey -e '^[w' x-copy-region-as-kill
    bindkey -e '^W' x-kill-region
    bindkey -e '^Y' x-yank
  #+END_SRC

* Completion

  Initialize completion. This triggers loading of
  zsh-syntax-highlighting as well.

  #+BEGIN_SRC sh
    autoload -Uz compinit
    compinit
  #+END_SRC

* Less

  I use a terminal that's always 80 columns wide. This means that a
  lot of output doesn't fit on a single line. I use the less command a
  lot to look at output that's too big and wide to view in my
  terminal. The default doesn't make this any better though, so I use
  these switches. Most of these I originally got from what git uses.

  #+BEGIN_SRC sh
    export LESS="FXRSi"
  #+END_SRC

  This causes less to immediately quit if there is no need to use a
  pager (everything fits in a single screen) (=-F=). Doesn't clear the
  screen when less is closed (=-X=). Handles ANSI colors (=-R=). Stops
  long lines from wraping (=-S=). And makes searches case-insensitive
  (=-i=).

* Prompt

  First off, do some setup. Allow the use of functions inside the prompt,
  initialize colors and load the ~add-zsh-hook~ function.

  #+begin_src sh
    setopt PROMPT_SUBST

    autoload -U colors
    autoload -Uz add-zsh-hook
    autoload -Uz vcs_info

    colors
  #+end_src

  Setup VCS info.

  #+begin_src sh
    add-zsh-hook precmd vcs_info

    zstyle ':vcs_info:*' actionformats '%u%c%B%F{1}%a%f%%b %F{3}%s%f:%F{5}%r%f:%F{4}%b%f'
    zstyle ':vcs_info:*' enable bzr git hg svn
    zstyle ':vcs_info:*' formats '%u%c%F{3}%s%f:%F{5}%r%f:%F{4}%b%f'
    zstyle ':vcs_info:*' nvcsformats ''
    zstyle ':vcs_info:bzr:*' branchformat '%b'
    zstyle ':vcs_info:git:*' check-for-changes 1
    zstyle ':vcs_info:*' stagedstr '%F{2}Δ%f'
    zstyle ':vcs_info:*' unstagedstr '%F{1}Δ%f'
  #+end_src

  Set the actual prompts.

  #+begin_src sh
    PROMPT='%T %2~ %B%(?.%F{2}.%F{1})→%b '
    RPROMPT='${vcs_info_msg_0_}'
  #+end_src