Move hooks to a dedicated module. This allows for greater flexibility and easier editing. TODO: Make hook handling neater (possibly through parsing the hook script to read an "hook-to" marker that allows for automated loading of properly formatted hook functions)
200 lines
6.5 KiB
Markdown
200 lines
6.5 KiB
Markdown
# My ZSH configuration
|
|
|
|
This repository has a fully loaded configuration for ZSH.
|
|
The configuration make opinionated choices based on my own desires for what
|
|
a shell should be like.
|
|
|
|
It's strongly advised that you write your own configuration instead of
|
|
just using this one. That way you can understand what you are doing and
|
|
maybe gain a better appreciation for the shell and its features.
|
|
|
|
The configuration is broken down into modules where possible, this
|
|
makes it easier to hack on.
|
|
|
|
## Usage
|
|
|
|
Clone this repository to `~/.config/zsh`
|
|
|
|
Inside of that directory run:
|
|
```sh
|
|
git submodule init
|
|
git submodule update
|
|
```
|
|
This will pull my plug-in manager `ZshPlug`.
|
|
|
|
And then add the following into `~/.zshenv`:
|
|
```sh
|
|
export ZDOTDIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh"
|
|
```
|
|
This tells ZSH where the ZSH dotfiles are.
|
|
|
|
### Important note
|
|
It is possible that your system might not be happy with this.
|
|
I have yet to fully work out the little issues that I have with making a
|
|
consistent environment across *all* of my user session.
|
|
|
|
This might result in a need to create a system of linked environment files
|
|
to ensure that everything can access the environment variables that are
|
|
meant to be set.
|
|
|
|
## Issues
|
|
This is a personal project and is unlikely to be maintained in a
|
|
professional manner.
|
|
If you do find any technical issues during your usage of this config then
|
|
feel free to open a GitHub issue.
|
|
Please remember that GitHub issues are not a forum nor a place for you to
|
|
ask questions not related to *technical issues*, and it is completely up to
|
|
my own discretion what issues I handle and which ones I close.
|
|
|
|
## General overview
|
|
The main goals for this configuration are look good, work good, and be
|
|
quick.
|
|
The less things getting in my way the better.
|
|
|
|
This is why I have made opinionated decisions about what options to enable
|
|
and how it works.
|
|
|
|
### Notable features
|
|
|
|
- Edit the command line in $EDITOR by pressing `C-x C-e`
|
|
- Fully configured completion
|
|
- Automatic typo repair
|
|
- vi mode enabled
|
|
- Automatic use of the directory stack `popd` to go back whence you came
|
|
- Smart history
|
|
- Plug-ins chosen for greatness
|
|
- Extended Globbing enabled.
|
|
- 10 second thinking time enforced for big deletes
|
|
- Expanded directories automatically have `/` appended
|
|
- Allow comments in interactive mode (this may be useful to mark history
|
|
items)
|
|
- Neaten paths like `../foo/..` to `..` (ChaseDots)
|
|
|
|
## Breakdown
|
|
The following sections break down what is in the repository and what
|
|
function it does.
|
|
|
|
### Modules
|
|
|
|
#### `./aliases`
|
|
This module features aliases that I find useful or ones that improve
|
|
existing tools.
|
|
Any alias that uses external tools uses the `has` function to disable it
|
|
when the tool isn't installed.
|
|
|
|
##### Current aliases:
|
|
- `ls` => `exa --icons --group-directories-first` (see: [Exa Website](https://the.exa.website/) )
|
|
- `xopen` => `xdg-open`
|
|
- `cls` => `clear; ls`
|
|
- `se` => `scriptedit` (wrapper script for fzf and nvim)
|
|
- `yt` => `youtube-dl`
|
|
- `yta` => `youtube-dl --ignore-config --add-metadata --ignore-errors --extract-audio --format "bestaudio/best"`
|
|
- `cp` => `cp --interactive --verbose`
|
|
- `mv` => `mv --interactive --verbose`
|
|
- `rm` => `rm --interactive=once --verbose`
|
|
- `mkd` => `mkdir --parents --verbose`
|
|
- `diff` => `diff --color=auto`
|
|
- `grep` => `grep --color=auto`
|
|
- `ip` => `ip --colour=auto`
|
|
- `vw` => `nvim -c VimwikiIndex`
|
|
- `ws` => `wineselect` (script to choose and set wine-prefix)
|
|
- `zero` => `dirs -c && clear`
|
|
|
|
##### File associations
|
|
This module is also responsible for in terminal file associations. Given a
|
|
file with a particular extension ZSH can open it with the appropriate
|
|
program.
|
|
`tex`, `html`, and `md` files are mapped to either `nvim`, `vim`, or `vi`
|
|
in that order of preference.
|
|
`pdf` files are mapped to `zathura` when it's installed.
|
|
|
|
#### `./completion`
|
|
This file configures the powerful completion engine of
|
|
ZSH.
|
|
Documenting this here would be a waste since the file has decent comments.
|
|
For more information on ZSH completion see `man zshcompsys`
|
|
|
|
#### `./dir_aliases`
|
|
This file uses `hash` to add entries into the named directory hash table.
|
|
(See: `man zshbuiltins`)
|
|
This gives the effect of these "aliases" that represent directories.
|
|
- `~dx` => `$HOME/Documents`
|
|
- `~dl` => `$HOME/Downloads`
|
|
- `~cn` => `${XDG_CONFIG_HOME:-$HOME/.config}`
|
|
- `~px` => `$HOME/Pictures`
|
|
- `~pr` => `$HOME/Projects`
|
|
|
|
#### `./greet`
|
|
This file gets executed at the end of `zshrc` to provide a little message
|
|
on startup.
|
|
|
|
#### `./history`
|
|
This file configures the ZSH history system.
|
|
|
|
This makes a few changes:
|
|
- Moves history to `${XDG_STATE_HOME/zsh/history}`
|
|
- Ignores duplicate entries
|
|
- Ignore entries starting with a space
|
|
- Compacts whitespace
|
|
- Never saves duplicates
|
|
- Ignores duplicates when searching history
|
|
- Requires you press enter after expanding `!!`
|
|
|
|
#### './hooks'
|
|
This file loads hook functions found in './hooks.d'
|
|
and makes it easier to assign hooks where necessary.
|
|
|
|
#### `./keyboard`
|
|
This file uses `zkbd`(see `man zshcontrib`) to get information about your
|
|
keyboard and how your terminal handles it. This can fix issues with keys
|
|
not being recognised in programs.
|
|
|
|
#### `./prompt`
|
|
This file configures the prompts, and yes there's two.
|
|
ZSH has both a left and right prompt and I use both of them.
|
|
|
|
##### Left prompt
|
|
The left prompt shows user, hostname, current directory, and the status of
|
|
the last command.
|
|
|
|
##### Right prompt
|
|
The right prompt shows the status of git repository information while
|
|
you're in one.
|
|
|
|
##### `precmd`
|
|
This file also sets the `precmd` hook to set the terminal title (for
|
|
terminals which support the escape codes that do this.)
|
|
|
|
#### `zshrc`
|
|
This is the true `zshrc` file with `.zshrc` a symbolic link to this
|
|
file.
|
|
This makes it a little easier to edit the file since you can actually see
|
|
it in `ls` and in editors.
|
|
|
|
This file draws together the modules and actually makes
|
|
settings apply.
|
|
|
|
### Functions
|
|
This configuration defines and loads some functions,
|
|
some of which are helper functions used in the configuration.
|
|
|
|
#### `CleanTmp`
|
|
Function called during exit to clean a local tmp directory (`~/tmp`).
|
|
|
|
#### `has`
|
|
Just a wrapper for calling `command -v $COMMAND`.
|
|
This function gets used to check for external tools.
|
|
|
|
#### `setTermTitle`
|
|
This function gets used in the prompt to set the terminal title.
|
|
It makes use of escape sequences to control the terminal and might have
|
|
issues on rare or unusual terminals.
|
|
|
|
#### `tempPersist`
|
|
This function controls if the local tmp directory (`~/tmp`) will persist across sessions or
|
|
not.
|
|
|
|
#### `_dotnet`
|
|
This completion function that tells the completion engine how to
|
|
complete `dotnet` commands.
|