Skip to content

Instantly share code, notes, and snippets.

View laggardkernel's full-sized avatar

laggardkernel laggardkernel

View GitHub Profile
@laggardkernel
laggardkernel / startup-time-of-zsh.md
Last active April 12, 2024 13:24
Comparison of ZSH frameworks and plugin managers

Comparison of ZSH frameworks and plugin managers

Changelog

  • 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

TLDR

@laggardkernel
laggardkernel / whether-a-command-exists.md
Last active October 16, 2019 13:58
determine whether a command exists in zsh

Determine Whether a Command Exists in ZSH

The main purpose is to determine whether a command exists in PATH. Some of the following methods also support determine the existence of functions. 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)
@laggardkernel
laggardkernel / pitfall-of-while-read-in-bash.bash
Created June 18, 2019 05:31
pitfall of while read #bash
# 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
@laggardkernel
laggardkernel / catch-empty-string-into-array.bash
Created June 18, 2019 05:34
catch empty string into array #bash
# 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() {
@laggardkernel
laggardkernel / cache-first.md
Created July 4, 2019 04:42
Cash First #zsh
_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"
@laggardkernel
laggardkernel / gpg-wrapper.md
Last active July 12, 2019 13:54
gpg wrapper/helper used for dotfiles #bash
  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"
@laggardkernel
laggardkernel / dynamic-umask-based-on-cwd.md
Last active April 14, 2024 06:30
Change umask based on working directory #zsh #direnv

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

@laggardkernel
laggardkernel / link-nvim-conf-to-vim.md
Last active February 12, 2023 23:45
Share confs between vim and nvim #vim
@laggardkernel
laggardkernel / trigger-chpwd-hook-on-startup.md
Last active September 17, 2020 11:50
Trigger chpwd Hook on Startup #zsh #hook #direnv

By default, ZSH hook chpwd is not triggered on shell startup. The tutorial here provides some ideas to fix this.

Trigger all chpwd_functions on startup

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"
@laggardkernel
laggardkernel / chpwd-equivalent-in-bash.md
Last active April 7, 2024 11:03
Create chpwd Equivalent Hook in Bash #bash #hook #zsh

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

chpwd Hook in Bash