Hacker News new | past | comments | ask | show | jobs | submit login

What does this line do?

    [ -v EDIT ] && unset EDIT && edit_function "${FUNCNAME[0]}" "$BASH_SOURCE" && return
Very cool script overall, thanks for sharing



Ah, forgot to include that! That's a way to edit any of my functions via "edit <functionname>" and it drops you right on the correct line in your $EDITOR of choice. Otherwise it defaults to passing it into your editor (ostensibly a path).

    needs() {
      [ -v EDIT ] && unset EDIT && edit_function "${FUNCNAME[0]}" "$BASH_SOURCE" && return;
      local bin="$1";
      shift;
      command -v "$bin" > /dev/null 2>&1 || {
        printf "%s is required but it's not installed or in PATH; %s\n" "$bin" "$*" 1>&2;
        return 1
      }
    }

    contains() {
      [ -v EDIT ] && unset EDIT && edit_function "${FUNCNAME[0]}" "$BASH_SOURCE" && return;
      local word;
      for word in $1;
      do
        if [[ "$word" == "$2" ]]; then
          return 0;
        fi;
      done;
      return 1
    }

    edit_function() {
      [ -v EDIT ] && unset EDIT && edit_function "${FUNCNAME[0]}" "$BASH_SOURCE" && return;
      needs rg "please install ripgrep!";
      local function_name="$1";
      local function_name="${function_name//\?/\\?}";
      local file="$2";
      local fl=$(rg -n -e "${function_name} *\(\) *\{" -e "function +${function_name}(?: *\(\))? *\{" "$file" | tail -n1 | cut -d: -f1);
      $EDITOR "$file":$fl
    }

    edit() {
      [ -v EDIT ] && unset EDIT && edit_function "${FUNCNAME[0]}" "$BASH_SOURCE" && return;
      if contains "$(functions)" $1; then
        EDIT=1 $1;
      else
        $EDITOR "$@";
      fi
    }
Once you have those set in your environment, and EDITOR points to whatever editor you prefer, you can simply add the following line to the top of any bash function you define and make it editable-in-place basically:

    [ -v EDIT ] && unset EDIT && edit_function "${FUNCNAME[0]}" "$BASH_SOURCE" && return;
I use the [ -v variablename ] pattern to detect whether it's set or not so that things like EDIT=1 and EDIT=true will work the same way, but I've also seen ((EDIT)) used, which for values of 1 gives a return code of 0 (making that expression true) otherwise returns a fail, but that only works if you use 1 or 0 to designate "true" and "false" for switches... and it's of course confusing that you need to reverse those in Bash logic which works off return codes and not actual values




Consider applying for YC's W25 batch! Applications are open till Nov 12.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: