- update 1: add a FAQ section
- update 2: benchmark chart and feature comparison table
- update 3:
- improve the table with missing features for antigen
- new
zplg times
result
The main purpose is to determine whether a command exists in PATH
.
Some of the following methods also support determine the existence
of function
s. The comparison focuses on speed, not support coverage.
❯ export TIMEFMT=$'%U user %S system %P cpu %*E total'
❯ time (for i ({1..100}) if (($+commands[tree])); then echo 1 &>/dev/null; fi)
# A background process started within a loop may compete with | |
# the loop for stdin, which causes the `while read` loop stop | |
# after the 1st round. | |
cat << EOF >| tasklist.txt | |
1 | |
2 | |
3 | |
EOF | |
# catch empty strings into an array using `read` | |
# normal array assignment isn't able to catch emptry string. | |
unset k 2>/dev/null | |
while IFS=$'\n' read -r item; do k+=("$item"); done < <(printf "\n\n\n") | |
echo ${#k[@]} | |
[[ -z ${k[0]} ]] && echo "empty string is catched" | |
f() { |
_env_init() {
# init version manager without rehash on startup
local SHELL_NAME="zsh"
local init_args=(- --no-rehash zsh)
local zshrc="$HOME/.zshrc"
# For security on Linux
[[ -n $XDG_RUNTIME_DIR ]] && local TMPDIR="$XDG_RUNTIME_DIR"
d_weechat:
cmpignore:
- '*/weechat_fifo'
- '*/script/plugins.xml.gz'
- '*/logs'
dst: ~/.config/weechat
src: .config/weechat
trans: gpg-single "sec.conf"
trans_write: gpg-single "sec.conf"
Default umaks on macOS is 0077
, which is different with most Linux distributions.
There're pros and cons about this very decision made by Apple. For the good
part, temporary files generate under /tmp
, $TMPDIR
are accessible
by the user himself only. These locations could be alternatives to $XDG_RUNTIME_DIR
.
While, the problem is that since the new files are accessible by yourself only, it's inconvenient to share files with other users.
It's easy to change umask globally with a LauchAgent, or change it for shells
The post was created for the question [How to share config between vim and Neovim][question].
In this solution, we try to symlink ~/.config/nvim
to ~/.vim
, and make the conf compatible with vim
.
# nvim conf dir: ~/.config/nvim
# vim conf dir: ~/.vim
# link the 1st as the 2nd with relative links
By default, ZSH hook chpwd
is not triggered on shell startup. The tutorial here provides some ideas to fix this.
We can use a trick to define a function run only once on precmd
and destruct itself automatically.
function _self_destruct_hook {
local f
for f in ${chpwd_functions}; do
"$f"
There's not a complete hook system designed in Bash when compared with other modern shells. PROMPT_COMMAND
variable is used as a hook in Bash, which is equivalent to precmd
hook in ZSH, fish_prompt
in Fish. For the time being, ZSH is the only shell I've known that has a chpwd
hook builtin.
PROMPT_COMMAND
If set, the value is interpreted as a command to execute before the printing of each primary prompt ($PS1).
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables