aboutsummaryrefslogtreecommitdiffstats
path: root/zsh/zshrc.org
blob: fc53c1b8b3fd26c3642b095f2ad42615f2f77082 (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
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
#+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

Remove ~/~, ~-~ , and ~)~ from ZSH's characters considered to be part of a word. This means that something like =M-DEL= will stop at =/= characters.

#+begin_src sh
  WORDCHARS=${WORDCHARS/\/}
  WORDCHARS=${WORDCHARS/-}
  WORDCHARS=${WORDCHARS/)}
#+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

Show colors and an indicator of what type each file is when using ~ls~, like directory, pipe, link, etc.

#+begin_src sh
  alias ls="ls --color=always"
#+end_src

Always show color in pacman output.

#+begin_src sh
  alias pacman="pacman --color=always"
#+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

* COMMENT 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
#+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. The =formats= option supports two arguments, they are the format strings for the =vcs_info_message_0_= and =vcs_info_message_1_=. The latter is used to set the title for the current wezterm (or other terminal) tab.

#+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' '%r'
  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 $(spwd) %B%(?.%F{2}.%F{1}[%?])>%b%f '
  PROMPT='%{\e]133;P;k=i\a%}%T $(spwd) %B%(?.%F{2}.%F{1}[%?])>%b%f %{\e]133;B\a%}'
  PROMPT=$'%{\e]133;P;k=i\a%}%T $(spwd) %B%(?.%F{2}.%F{1}[%?])>%b%f %{\e]133;B\a%}'
  RPROMPT=$'%{\e]133;P;k=r\a%}${vcs_info_msg_0_}%{\e]133;B\a%}'
#+end_src

Execute this preexec function to mark the output field.

#+begin_src sh
  function mark_output()
  {
      printf "\\e]133;C\a"
  }

  add-zsh-hook preexec mark_output
#+end_src

Set the current tab's title (for wezterm at least), to the current project directory. This is set above with the =%r= specifier.

#+begin_src sh
  function set_vcs_title()
  {
      printf "\\e]0;${vcs_info_msg_1_:-$(basename $PWD)}\\a"
  }

  add-zsh-hook precmd set_vcs_title
#+end_src

* Other configurations

Other setups might also make ZSH files, these should all be loaded.

#+begin_src sh
  for f in ~/.config/zsh/conf.d/*.sh; do
      source $f
  done
#+end_src