11 ms·
ZSH Aliases
- rcthompson 6y agoIf you add a suffix alias, will zsh start offering to complete matching files as though they were executable?
- oefrha 6y ago> Use alias to edit and reload .zshrc > source $HOME/.zshrc .zshrc isn't the only startup file, if you place everything there you're likely doing it wrong and should split things like some environment settings to $ZDOTDIR/.zshenv. Better way to reload startup changes: alias reload='exec zsh -l'
- thorstenhans 6y agoGood point. Separation of different config aspects is in the pipe as dedicated article
- yNeolh 6y agoI tend to use: alias reload="exec -l $SHELL" Which I copied from somewhere, I don't know how specific it is but maybe it helps someone :)
- oefrha 6y agoUsing $SHELL is not great because it is not a reliable env var. It's only set for login shells, and if your login shell isn't zsh you'll get a different shell on this "reload". (A long time ago I had an account somewhere where my sysadmin didn't respond to chsh request for whatever reason, so my login shell remained /bin/bash while I actually used zsh day to day.) It can also be anything, really: export SHELL=/sbin/nologin # or /usr/sbin/nologin, or equivalent on your system exec -l $SHELL You want zsh, so just use zsh. As for -l, exec zsh -l and exec -l zsh both replace the current shell with a login zsh, so they are effectively the same.
- e_proxus 6y agoI have this reminder in every `~/.z*` file: # Load Order Interactive Interactive Script # Startup Only login Always # ------------- ----------- ----------- ------ # /etc/zshenv 1 1 1 # ~/.zshenv 2 2 2 # /etc/zprofile 3 # ~/.zprofile 4 # /etc/zshrc 5 3 # ~/.zshrc 6 4 # /etc/zlogin 7 # ~/.zlogin 8 # # Shutdown # ------------- ----------- ----------- ------ # ~/.zlogout 9 # /etc/zlogout 10 # # Note: ZSH seems to read ~/.profile as well, if ~/.zshrc is not present.
- masklinn 6y ago> ~/.zshenv Technically it's $ZDOTDIR/… Also note from the official documentation: > `.zprofile' is meant as an alternative to `.zlogin' for ksh fans; the two are not intended to be used together
- franciscop 6y agoOkay this is pretty cool, I can set up so `.js` files are opened automatically with Node.js: $ alias -s js=node $ echo "console.log('Hello world')" > demo.js $ demo.js Hello world
- thorstenhans 6y agoYes suffix aliases are super useful
- georgyo 6y agoThis seems like a good way to accidently run abitrary code downloaded from the internet. I can see opening up in an editor as useful shortcut. But actually executing code without an executable bit seems a bit more dangerous.
- franciscop 6y agoReally? Last time I downloaded a .js file by accident was never if my memory doesn't fail me (.html I remember a couple). Even if I did, I normally use the UI to manage my files. The only time I might try to do something with the CLI and a JS file is exactly to run `node file.js`, and this is just a convenience.
- trashburger 6y agoWorse, imagine if someone set their shell as the suffix alias for .sh, just to save time on their curl shell pipes... Oh the horror. Suffix aliases should come with a big caveat.
- Spivak 6y agoDon't worry. I got you. alias -s sh='_c(){ curl -sk $1 | sudo bash };_c' Wait. Improved. alias -s sh='_c(){ [[ -f $1 ]] && sudo bash $1 || curl -sk $1 | sudo bash };_c'
- sneak 6y agoYou can do something similar with a shebang and chmod +x.
- kbd 6y agoI feel a bit misled that two of the "five types of aliases" are functions and regular aliases a second time. Tldr: 1. aliases, 2. suffix aliases, 3. global aliases
- thorstenhans 6y agoWell, first I thought about publishing 4 types (I see functions as a valid kind of alias) However, the os-specific aliases became more and more important to me due to GitHub and VisualStudio Codespaces. Targeting different operating systems is quite important to me. But technically it's just a regular alias. (Which is also mentioned in the corresponding paragraph)
- asicsp 6y ago>This article will teach you how to create and use these four types of aliases >You have seen four different types of ZSH aliases that will boost your productivity `four` in these two lines is typo or intentional? Because the title says `5 Types Of ...`
- thorstenhans 6y agothanks for the feedback. I've updated the corresponding parts
- anamexis 6y agoThis caught my attention too. A cursory search of the zsh docs don't mention functions being a type of alias. In particular: > The registration of aliases with parameters looks pretty similar to a function definition in regular programming languages. Well that's because it is a function definition in this programming language, no? Furthermore, this breaks down when you, say, use `alias` to view all your aliases. It won't show the functions, because they are not aliases.
- mqus 6y agoi think one of the main advantages of zshs aliases (compared to bash aliases) is autocompletion, so I would not count regular functions as a kind of alias. But I can see the similarities.
- fenk85 6y agothe kgb and cia one for kubernetes always cracks me up :) btw kubens is great --- alias k="kubectl" alias kns="kubens" alias kgb="kubectl get pods" function kex () { kubectl exec -it $1 sh } function kf () { kubectl port-forward $1 $2:$3 } function cia () { kubectl delete pod $1 } function kl () { kubectl logs -f $1 } ---
- xmdx 6y agoIf you use oh-my-zsh, the kubectl and docker-compose plugin provide good aliases for every command.
- pvg 6y agoThe actual link for this submission is https://thorsten-hans.com/5-types-of-zsh-aliases https://thorsten-hans.com/5-types-of-zsh-aliases if your ad blocker is barfing on whatever bitly-based tracking doodad was submitted instead.
- smhmd 6y agoFor suffix aliases, you can bulk them alias -s {ape,avi,flv,m4a,mkv,mov,mp3,mp4,mpeg,mpg,ogg,ogm,wav,webm}=mpv as opposed to defining them one at a time.
- thorstenhans 6y agothanks for pointing me to this one. I've added a corresponding sample.
- chrisfinazzo 6y agoI can't believe I got all the way through @scriptingosx's book on Zsh and the suffix aliases just went right over my head. (Self, you idiot) cd'ing into a directory on the fly without even thinking about paths and just opening files by name is powerful juju Together With AUTOCD, this feels like it shouldn't be possible...but it is.
- matthewbauer 6y agoIs it possible to get zsh to just open all non executable files with xdg-open?
- xmdx 6y agoI wish I would chain things in the navigation alias. For example if I set the following alias: alias hello = '~/Docuemnts' It would be nice if I could then execute hello/world to take me to ~/Documents/world but it requires hardcoding. Guess I could play around with functions and arguments to solve this.
- fratajcz 6y agofish abbreviations kinda do this, for example if you define your alias above as an abbrev and you type hello<space>, it replaces hello by ~/Documents in your command line. You still have to press backspace to remove the space you just inserted, but it's better than nothing. Also, apparently you can add this to zsh with a plugin: https://github.com/momo-lab/zsh-abbrev-alias https://github.com/momo-lab/zsh-abbrev-alias
- lawry 6y agofish-shell abbreviations are really cool, I do miss that in zsh, I'll probably give that plugin a go. It also makes it for other people easier to see what's going on when looking at the previous commands.
- gpspake 6y agoI think I might be able to help with this one! Here's a little trick I learned from a friend. It's also tab completable. I keep all my code in ~/code $ c # cd to ~code $ c pr<tab> # tab complete to c projectname $ c projectname # cd to ~/code/projectname This is pretty simple in zsh # c to cd to ~/code c() { cd ${CODE_DIRECTORY}/$1; } # tab complete c against code _c() { _files -W ${CODE_DIRECTORY} -/; } compdef _c c (Note: CODE_DIRECTORY is just an env var for ~/code) I use this all the time and I use h to do the same for my home directory https://github.com/gpspake/dotfiles/blob/master/zsh/gpspake/gpspake.plugin.zsh#L40 https://github.com/gpspake/dotfiles/blob/master/zsh/gpspake/...
- fphilipe 6y agoNo need for an alias, a variable (I think that's what they're called) will do: hello=~/Documents Then: cd ~hello/world Or omitting `cd` (requires `setopt auto_cd`): ~hello/world And with `setopt cdable_vars`: hello/word This also works with tab completion: hello/<TAB>
- rgrau 6y agosuffix aliases do not even have to refer to a real existing file. They are an alias. That's what I use to clone git repos I copypaste: alias -s git="git clone"
- chrisweekly 6y agowat? doesn't this prevent you from doing anything else w git?
- chrisfinazzo 6y agoYeah... Overwriting a command-line tool with no other arguments seems like a bad idea.
- skoskie 6y agoNo, this really only addresses the situation where the URL ends with (suffix) “git”. The only time I use the full URL is the initial cloning, and the remote name thereafter. But if you use the full URL in another scenario, yes, this may interfere.
- deleted 6y ago[deleted]
- gizmo385 6y agoI don't believe so since I think suffix aliases are only affected by the "file extension" of the command you've added. The suffix alias in the OP is saying that if they paste something that ends with ".git", then clone that thing (i.e. if you paste the git url for a repo, it clones it). It doesn't overwrite the git command
- rgrau 6y agoAs others commented, this only acts when the first word in your commandline ends with '.git'. - "git", alone isn't going to be hooked. - you can do "cd .git". - even if you have 'autocd' option set, you can '.git' and it will do "cd .git". I'm not saying it's even a good practice, but I find it kinda cool, when using this feature in a way it's probably not intended for, you start thinking in 'what might happen inside'.
- stared 6y agoSpeaking of ZSH: it is the thing I miss the most in Windows (especially with ohmyzsh, and its plugins zsh-autosuggestions and zsh-syntax-highlighting). I know that there is oh-my-posh, but it lacks such plugins. Do you know any workaround?
- thorstenhans 6y agounfortunately not. Sorry
- deleted 6y ago[deleted]
- diarrhea 6y agoThis can get you a part of the way, extracted from my PowerShell profile: ## # PSReadLine, see https://github.com/PowerShell/PSReadLine ## ## behaviour of Tab key autocomplete Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete ## From docs: ## With these bindings, up arrow/down arrow will work like PowerShell/cmd if the ## current command line is blank. If you've entered some text though, it will ## search the history for commands that start with the currently entered text. ## ## Like zsh completion. Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward These will allow you to autocomplete previous commands from the tidpids you already types, so it no longer searches linearly through the history. I also use: Import-Module posh-git Import-Module oh-my-posh Set-Theme Agnoster
- PhilippGille 6y agoDo you happen to have your PowerShell profile in a GitHub Gist or so?
- diarrhea 6y agoNo, but mostly because it is not much longer than the above! Only got started using PowerShell more seriously (thanks to Windows Terminal and WSL) a couple of months ago. Here is the other content: # For Agnoster theme, "user@host" will be hidden if user==DefaultUser $DefaultUser = "<YOUR USERNAME>" function vim ($File){ bash -c "vim $File" } New-Alias pi ipython # git diff output uses less; it will be buggy without utf8 $env:LESSCHARSET='UTF-8' # console output, e.g, when writing git diff output to file using pipe: | Out-File [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
- williamdclt 6y agoI use global aliases a lot, especially for pipes I use often. my main ones: - alias -g G="| grep " (`cat test.txt G some_words`) - alias -g CC="| pbcopy " (`cat test.txt CC`) - alias -g "?"="| fzf " (`ls -l ?`) - alias -g X="| xargs " (`ls -l X rm`), probably my favorite (makes xargs kinda look like a pipe) - alias -g Y="| yank " They compose well, too. - Pick some file to delete from `git status`: `git status Y X rm`
- rgrau 6y agoI also love them global aliases! To push them even further (like the xargs one), I have those aliases to allow me to do quick iterations in 'streaming' fashion: alias -g FORI='| while read i ; do ' alias -g IROF='; done '
- joeraut 6y agoWhich "yank" package are you using? I came across one [0], which copies the file selected to the clipboard instead of outputting it to stdout. I managed to get it to print to stdout, though: alias -g Y="| yank -- cat " [0] https://github.com/mptre/yank https://github.com/mptre/yank
- williamdclt 6y agothat's the one, from the readme: "If stdout is not a terminal the selected field will be written to stdout and exit without invoking the yank command" Could be clearer, basically it means that if it's part of a pipe, it's going to print to stdout instead of copying to the clipboard
- inatreecrown2 6y agousing aliases is a beginners mistake. they will one day break. just type in the real thing. also, if you use aliases for commands that you use a lot, it is better to remember how to correctly type the command.
- cyberpip 6y agoimagine not typing out the full/basic git commands the rest of your life and all the time that'll save though
- inatreecrown2 6y agoimagine loosing your aliases. just learn to type and enjoy life.
- avindroth 6y agoOr you can spend less time typing and enjoy life
- inatreecrown2 6y agoyes, but with a crutch
- sylens 6y agoThe worst case scenario is that I lose my .zshrc file and have to google commands again
- tenantless 6y agoOr, keep your dot files in a public/private Git repo and don't worry about that either. Also makes setting up new machines/users a breeze.
- 6y ago
- asib 6y agoMy favourites: alias ls='exa -l' alias gits='git status'
- mkchoi212 6y agomy version of `gits` is `gs` :)
- skoskie 6y agoMay I humbly recommend just including the git status in your LS command. alias ls="exa --color auto --all --group-directories-first --long --group --header --modified --sort=name --git --time-style=long-iso --classify" That should give you a gorgeous directory list.
- Spivak 6y agoUse git aliases! # ~/.config/git/config [alias] s = status d = diff ds = diff --staged # ~/.zshrc alias g=git $ g s $ g ds I think I have an alias for every letter of the alphabet.
- anarchyrucks 6y agoalias rm=trash I have a habit of cleaning up the workspace in my machine. This alias saved me a 1000 times already.
- hiq 6y agoI prefer something like "alias sp=trash" (sp for suppress), and getting into the habit of using this alias (for instance by doing alias rm="echo nope"), so that if I use it on another machine by mistake, it just fails instead of using /bin/rm (and I can then resort to trash or double-check that my rm command is not faulty).
- CSSer 6y agoBrb. I’m going to add suffix aliases for all of my frequently used code file extensions. I had no idea those are a thing. Although I do wish I could pass a flag that didn’t open it, as sometimes I do want to append or overwrite a file without the fuss of an editor.
- drewp 6y agoI don't think you're going to have a problem. The alias only affects you trying to "run" the file. % foo.jpg # launches image viewer % cp foo.jpg bar.jpg # unaffected
- lawry 6y agoAlso worthwhile investing some time in the completion system if you are writing aliases to save time. I've done it for serverless invoke/deploy/logs and they've been so useful! What I'm talking about is typing 'sls logs <tab>' and having tab completion for the deployed functions when typed in the root of the repo containing the serverless.yml file. https://github.com/larrybolt/zsh-aliases/blob/master/serverless.zsh https://github.com/larrybolt/zsh-aliases/blob/master/serverl...
- wrboyce 6y agoThe `cd ...` aliases are an interesting choice; I find it more practical to use `autocd` in combination with named directories. setopt autocd hash -d dev=~/dev Now I can just use `~dev` to `cd ~/dev` but I can also do `~dev/foo/bar/baz` etc.
- jchook 6y agoI have fallen in love with `z` e.g. `z p` might take you to ~/projects if you've been there recently. https://github.com/skywind3000/z.lua https://github.com/skywind3000/z.lua
- wrboyce 6y agoGood point, I'm a huge fan of `fasd` which provides similar features. I feel lost in a shell without `z` now! https://github.com/clvv/fasd https://github.com/clvv/fasd
- chrisfinazzo 6y agoDoes this work backwards, too? For example if I'm in "/Documents/Dotfiles", but want to go to "/Documents/Blog". Doing the "../" dance is tedious as hell.
- sk5t 6y ago'z' should work well here - 'z D B'
- chrisfinazzo 6y agoSigh, again, I should have looked this up... % Documents/Dotfiles [~/Documents/Dotfiles] % ../Blog This does the trick.
- skoskie 6y agoSimilarly, project autocompletion for the directory where I do my web dev ... export SITES=$HOME/Sites # Plural to cd and list contents alias sites="cd $SITES; ll" # Singular to access a particular project site() { cd $SITES/$1; } # Autocomplete function _site() { _directories -W $SITES -/; } compdef _site site It works from within any directory, which is nice. site f[tab][enter] takes me to $SITES/foo/
- jchook 6y agoIf you "override" a command in your PATH with an alias, you can access the original command with a leading backslash. For example, I use: ``` alias open=xdg-open ``` To call the real open command, I can use \open.
- class4behavior 6y agoThat's a POSIX rule. Quoting any part of a word affects the entire word and thus preventing expansion. You can also write open''
- hiq 6y agoAbout suffix aliases, shouldn't one resort to file associations instead, and use the corresponding command (possibly with an alias)? It seems weird to have these settings stored in two places, and have inconsistent results when you open from the terminal and from another application (like a file browser). What's the benefit of suffix aliases compared with setting up the associations? You only save two keystrokes if you have a single-letter alias (for xdg-open on linux).
- cxam 6y agoIf you're working with Python projects and Virtualenv then this is a great alias to have (assuming you call it venv): alias venv=". venv/bin/activate" Just cd to a project root and venv :)
- maxioatic 6y agoI do something similar, although I use venv to create a new virtual environment and update pip and setuptools: alias venv='python3 -m venv venv && source venv/bin/activate && pip install --upgrade pip setuptools -q' And then ae and de to activate/deactivate a venv: alias ae='source venv/bin/activate' alias de='deactivate'
- Rairden 6y agoI use these suffix aliases to open programs occasionally. alias -g G='| grep' alias -g R='| rg' alias -g L='| less' alias -g V='| vim -' alias -g S='| subl' And if I want Zsh to auto-expand it out to type the full command (after pressing space), add this to end of your .zshrc: globalias() { if [[ $LBUFFER =~ '[A-Z0-9]+$' ]]; then zle _expand_alias zle expand-word fi zle self-insert } zle -N globalias bindkey " " globalias # space key to expand globalalias Identical examples: grep -rw --exclude-dir={test,build} 'throw' L grep -rw --exclude-dir={test,build} 'throw' | less
- thecupisblue 6y agoI love ZSH + Oh My ZSH. And I didn't even have a choice. At my first company, the onboarding script included switching to ZSH+OMZ. I knew it changed the shell, but thought it was just theming - not much. A year later, switched companies, didn't install it. Don't know how I lived without it. It is such an amazing productivity update to shell life I consider it a must on every machine.
- JoshTriplett 6y ago> I do a lot of conference speaking; if you are presenting at conferences or meetups too, you should start your presentation by quickly explaining the aliases you will use throughout the talk to onboard your audience. If you're giving a presentation, please give the actual commands people need to type, even if that's a little more typing for you. There are tools to help you auto-type each line of a demo, if needed. Reduce the amount of confusion and translation people need to go through to understand your presentation. Similarly, turn off any fonts that create symbolic ligatures, so people know what symbols to actually type. Avoid anything unnecessary that increases the distance needed for understanding between you and your audience.
- jabirali 6y agoI think Fish shell "abbreviations" [1] are more suitable for interactive demos than standard Bash/Zsh aliases. Basically, instead of e.g. `gc` meaning `git commit` (alias), `gc` can be expanded to `git commit` (abbr), so you can save typing but still show the actual command. Modern versions of Fish has both abbreviations and aliases. Personally, I prefer aliases for providing default arguments to commands (e.g. turning on colorized output), but prefer abbreviations for timesavers like the `gc` above. [1]: https://fishshell.com/docs/current/cmds/abbr.html https://fishshell.com/docs/current/cmds/abbr.html
- zuhsetaqi 6y agoIs there a way to get such expansion functionality for zsh? I would always use it, not only when demonstrating something but don’t want to switch to Fish only for that feature.
- roylez 6y agoMy personal favourite alias -g NF='./*(oc[1])' This points to the newest file/dir in my current dir, and it is very easy for me to untar a downloaded file and then cd into it without caring about the name of the file/dir. tar xf NF; cd NF
- drewp 6y ago'C-x m' pulls the newest file for me: mv ~/Downloads/[C-x m] /tmp or even within files that match what I've typed already: tail /logs/pho[C-x m]
- donatj 6y agoThe "navigation aliases" IMHO are better handled as ENV vars. The example alias dev="cd ~/dev/" alias personal="cd ~/dev/thorstenhans" alias business="cd ~/dev/thinktecture" Becomes export dev=~/dev export personal=~/dev/thorstenhans export business=~/dev/thinktecture And now thanks to the way ZSH handles directories, you can still simply change directory with $ ~dev $ ~personal $ ~business and it'll work as before but it also allows you to treat it as a fully qualified directory in other commands which I find exceedingly useful $ tree ~dev $ cat ~personal/index.html $ rm -rf ~business/secret-documents
- eikenberry 6y agoYou can directly create named directories with `hash -d`. Eg. hash -d dev=~/dev hash -d personal=~/dev/thorstenhans ... Nothing else is needed.
- donatj 6y agoI'd argue environmental variables have the strong advantage in that you can use them in cases that won't otherwise expand, namely programs that take a path parameter immediately following an equals, e.g. $ docker run --workdir=$dev foo in these cases `--workdir=~dev` is not expanded and fails as docker does not understand your alias.
- eikenberry 6y agoTrue and I often have both. I like my exported environment variables to be all caps and my directory aliases to be lowercase. This keeps their uses separate.
- m463 6y agoI'm too lazy to shift-tilde
- Bantros 6y agoAny benefits to switching to ZSH in Catalina? The prompt every time I open the command line is annoying me
- smhmd 6y agoYou can, also, add flags to your program: alias -s txt='less -rE'
- throwaway888abc 6y agoNice article, on ZSH too (oh-my-zsh). Real productivity. BTW. Anyone is really using the colorscheme like in article ? https://thorsten-hans.com/assets/images/posts/2020/zsh-aliases-1.png https://thorsten-hans.com/assets/images/posts/2020/zsh-alias...