Skip to content

Commit

Permalink
feat: ability to alter keybindings
Browse files Browse the repository at this point in the history
  • Loading branch information
LangLangBart committed Jul 3, 2024
1 parent 44257df commit ecf459a
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 40 deletions.
78 changes: 49 additions & 29 deletions gh-find-code
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,36 @@ set -o allexport -o errexit -o errtrace -o nounset -o pipefail
# TODO: lookout for Github adding regex support to the REST or GraphQL API
# TODO: add tests - https://github.com/dodie/testing-in-bash
# TODO: replace python with a more typical bash solution
# TODO: Use the new '--info-command' from fzf 0.54.0 for the history and apply 'ctrl-t' to search
# for context, similar to 'zdharma-continuum/history-search-multi-word'

###############################################################################
# Debugging and Error Handling Configuration
# Environment Variables
###############################################################################

GHFC_DEBUG_MODE=${GHFC_DEBUG_MODE:-0}
# Sets default values for environment variables using the ':' command, which evaluates the
# expressions without executing them.
: "${BAT_THEME:=Monokai Extended}"
: "${EDITOR:=vim}"
: "${PAGER:=less}"
: "${GHFC_DEBUG_MODE:=0}"
: "${GHFC_HISTORY_FILE:=${BASH_SOURCE%/*}/gh_find_code_history.txt}"
: "${GHFC_HISTORY_LIMIT:=500}"

# Customizable keys
: "${GHFC_OPEN_BROWSER_KEY:=ctrl-b}"
: "${GHFC_OPEN_EDITOR_KEY:=ctrl-o}"
: "${GHFC_FILTER_BY_REPO_KEY:=ctrl-p}"
: "${GHFC_RELOAD_KEY:=ctrl-r}"
: "${GHFC_TOGGLE_HISTORY_KEY:=ctrl-space}"
: "${GHFC_TOGGLE_FUZZY_SEARCH_KEY:=ctrl-t}"
: "${GHFC_OPEN_BROWSER_QUERY_KEY:=ctrl-x}"
: "${GHFC_VIEW_CONTENTS_KEY:=enter}"
: "${GHFC_TOGGLE_PREVIEW_KEY:=tab}"

###############################################################################
# Debugging and Error Handling Configuration
###############################################################################

die() {
echo ERROR: "$*" >&2
Expand Down Expand Up @@ -50,7 +74,6 @@ if ((GHFC_DEBUG_MODE)); then
execution_shell="$(which bash) -o xtrace -o nounset -o pipefail -c"
fi

BAT_THEME=${BAT_THEME:-Monokai Extended}
bat_executable=""
# Check for 'bat' early, as it is needed for the error_handler function.
for value in bat batcat; do
Expand Down Expand Up @@ -102,8 +125,6 @@ WHITE_BOLD='\033[1;97m'
DARK_GRAY='\033[0;90m'

FZF_API_KEY=$(command head -c 32 /dev/urandom | command base64)
GHFC_HISTORY_LIMIT=${GHFC_HISTORY_LIMIT:-500}
GHFC_HISTORY_FILE=${GHFC_HISTORY_FILE:-${BASH_SOURCE%/*}/gh_find_code_history.txt}

open_in_editor=false
# Note: Using prompts of the same character length helps maintain user focus by avoiding shifts in
Expand Down Expand Up @@ -312,16 +333,16 @@ ${WHITE_BOLD}Flags${COLOR_RESET}
${GREEN_NORMAL}-h${COLOR_RESET} help
${WHITE_BOLD}Hotkeys${COLOR_RESET}
${GREEN_NORMAL}? ${COLOR_RESET} help
${GREEN_NORMAL}ctrl-b ${COLOR_RESET} open the file in the browser
${GREEN_NORMAL}ctrl-o ${COLOR_RESET} open the file content in the editor
${GREEN_NORMAL}ctrl-p ${COLOR_RESET} replace query with "repo:owner/name"
${GREEN_NORMAL}ctrl-r ${COLOR_RESET} reload with up to 100 results
${GREEN_NORMAL}ctrl-space${COLOR_RESET} display the history commands
${GREEN_NORMAL}ctrl-t ${COLOR_RESET} toggle between Code and Fuzzy search
${GREEN_NORMAL}ctrl-x ${COLOR_RESET} open the search query in the browser
${GREEN_NORMAL}enter ${COLOR_RESET} open the file in the pager
${GREEN_NORMAL}tab ${COLOR_RESET} toggle the file preview
${GREEN_NORMAL}? ${COLOR_RESET} toggle help
${GREEN_NORMAL}${GHFC_OPEN_BROWSER_KEY} ${COLOR_RESET} open the file in the browser
${GREEN_NORMAL}${GHFC_OPEN_EDITOR_KEY} ${COLOR_RESET} open the file content in the editor
${GREEN_NORMAL}${GHFC_FILTER_BY_REPO_KEY} ${COLOR_RESET} replace query with "repo:owner/name"
${GREEN_NORMAL}${GHFC_RELOAD_KEY} ${COLOR_RESET} reload with up to 100 results
${GREEN_NORMAL}${GHFC_TOGGLE_HISTORY_KEY}${COLOR_RESET} toggle command history
${GREEN_NORMAL}${GHFC_TOGGLE_FUZZY_SEARCH_KEY} ${COLOR_RESET} toggle between Code and Fuzzy search
${GREEN_NORMAL}${GHFC_OPEN_BROWSER_QUERY_KEY} ${COLOR_RESET} open the search query in the browser
${GREEN_NORMAL}${GHFC_VIEW_CONTENTS_KEY} ${COLOR_RESET} open the file in the pager
${GREEN_NORMAL}${GHFC_TOGGLE_PREVIEW_KEY} ${COLOR_RESET} toggle the file preview
${GREEN_NORMAL}esc ${COLOR_RESET} quit
${WHITE_BOLD}Search query examples${COLOR_RESET}
Expand Down Expand Up @@ -837,8 +858,7 @@ view_history_commands() {
--bind "start:reload:$history_command" \
--bind "ctrl-c:become:curl_custom 'abort'" \
--bind "ctrl-d:reload:remove_history {2..}; $history_command" \
--bind "ctrl-r:reload:$history_command" \
--bind 'ctrl-space:abort' \
--bind "${GHFC_TOGGLE_HISTORY_KEY}:abort" \
--bind 'enter:accept' \
--bind 'esc:abort' \
--color "header:${header_color:--1}" \
Expand Down Expand Up @@ -903,23 +923,23 @@ main() {
--bind "change:first+reload:command sleep 0.5; gh_query" \
--bind "resize:transform:preview_transformer" \
--bind "start:reload:gh_query" \
--bind 'ctrl-b:execute-silent:command gh browse --repo {4} {5}:{1}' \
--bind "ctrl-o:transform:[[ \$FZF_MATCH_COUNT -ge 1 && \${EDITOR##*/} =~ ^(code|codium)$ ]] &&
--bind "?:transform:[[ ! \$FZF_PROMPT =~ \"$fzf_prompt_helpABC\" ]] &&
echo 'change-prompt($fzf_prompt_helpABC)+change-preview-window(~0:+1)+change-preview:print_help_text' ||
echo 'change-prompt($default_fzf_prompt)+change-preview-window(+\{1}+3/3)+change-preview:\view_contents \{}'" \
--bind "${GHFC_OPEN_BROWSER_KEY}:execute-silent:command gh browse --repo {4} {5}:{1}" \
--bind "${GHFC_OPEN_EDITOR_KEY}:transform:[[ \$FZF_MATCH_COUNT -ge 1 && \${EDITOR##*/} =~ ^(code|codium)$ ]] &&
echo 'execute-silent:open_in_editor=true \view_contents \{}' ||
echo 'execute:open_in_editor=true \view_contents \{}'" \
--bind "ctrl-p:transform-query:echo repo:{4}" \
--bind 'ctrl-r:reload:gh_user_limit=100 gh_query' \
--bind 'ctrl-space:execute:view_history_commands' \
--bind "ctrl-t:transform:[[ ! \$FZF_PROMPT == \"$fzf_prompt_fuzzyAB\" ]] &&
--bind "${GHFC_FILTER_BY_REPO_KEY}:transform-query:echo repo:{4}" \
--bind "${GHFC_RELOAD_KEY}:reload:gh_user_limit=100 gh_query" \
--bind "${GHFC_TOGGLE_HISTORY_KEY}:execute:view_history_commands" \
--bind "${GHFC_TOGGLE_FUZZY_SEARCH_KEY}:transform:[[ ! \$FZF_PROMPT == \"$fzf_prompt_fuzzyAB\" ]] &&
echo 'unbind(change)+change-prompt($fzf_prompt_fuzzyAB)+enable-search+transform-query:echo \{q} > $store_search_string; command cat $store_fuzzy_search_string' ||
echo 'rebind(change)+change-prompt($default_fzf_prompt)+disable-search+transform-query:echo \{q} > $store_fuzzy_search_string; command cat $store_search_string'" \
--bind 'ctrl-x:execute-silent:open_query_in_browser {q}' \
--bind $'enter:execute:[[ $FZF_MATCH_COUNT -ge 1 ]] && view_contents {}' \
--bind "${GHFC_OPEN_BROWSER_QUERY_KEY}:execute-silent:open_query_in_browser {q}" \
--bind "${GHFC_VIEW_CONTENTS_KEY}:execute:[[ \$FZF_MATCH_COUNT -ge 1 ]] && view_contents {}" \
--bind "${GHFC_TOGGLE_PREVIEW_KEY}:change-prompt($default_fzf_prompt)+change-preview(view_contents {})+change-preview-window:hidden:hidden|+{1}+3/3" \
--bind 'esc:become:' \
--bind "tab:change-prompt($default_fzf_prompt)+change-preview(view_contents {})+change-preview-window:hidden:hidden|+{1}+3/3" \
--bind "?:transform:[[ ! \$FZF_PROMPT =~ \"$fzf_prompt_helpABC\" ]] &&
echo 'change-prompt($fzf_prompt_helpABC)+change-preview-window(~0:+1)+change-preview:print_help_text' ||
echo 'change-prompt($default_fzf_prompt)+change-preview-window(+\{1}+3/3)+change-preview:\view_contents \{}'" \
--delimiter '\t|\s\s+' \
--disabled \
--listen \
Expand Down
45 changes: 34 additions & 11 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ gh find-code [Flags] [Search query]

| Key Bindings fzf | Description |
| ------------------------------- | ------------------------------------ |
| <kbd>?</kbd> | help |
| <kbd>?</kbd> | toggle help |
| <kbd>ctrl</kbd><kbd>b</kbd> | open the file in the browser |
| <kbd>ctrl</kbd><kbd>o</kbd> | open the file content in the editor |
| <kbd>ctrl</kbd><kbd>p</kbd> | replace query with "repo:owner/name" |
| <kbd>ctrl</kbd><kbd>r</kbd> | reload with up to 100 results |
| <kbd>ctrl</kbd><kbd>space</kbd> | display the history commands |
| <kbd>ctrl</kbd><kbd>space</kbd> | toggle command history |
| <kbd>ctrl</kbd><kbd>t</kbd> | toggle between Code and Fuzzy search |
| <kbd>ctrl</kbd><kbd>x</kbd> | open the search query in the browser |
| <kbd>enter</kbd> | open the file in the pager |
Expand Down Expand Up @@ -88,11 +88,11 @@ gh ext remove LangLangBart/gh-find-code

**Table 1: Environment Variables Utilized**

| Variable | Purpose | Default |
| ------------------ | -------------------------------------- | ------------------ |
| `BAT_THEME` | Preview theme for syntax highlighting. | `Monokai Extended` |
| `EDITOR` | Editor to open selected files. | System-specific |
| `PAGER` | Pager for file viewing. | System-specific |
| Variable | Purpose | Default |
| ----------- | -------------------------------------- | ------------------ |
| `BAT_THEME` | Preview theme for syntax highlighting. | `Monokai Extended` |
| `EDITOR` | Editor to open selected files. | `vim` |
| `PAGER` | Pager for file viewing. | `less` |

**Table 2: Environment Variables Defined and Utilized**

Expand All @@ -102,6 +102,33 @@ gh ext remove LangLangBart/gh-find-code
| `GHFC_HISTORY_FILE` | Custom location | `${BASH_SOURCE%/*}/gh_find_code_history.txt` |
| `GHFC_HISTORY_LIMIT` | Max number of stored commands | `500` |


To avoid interfering with a user's typical keybinds, you can overwrite the following keybinds to
another key. For example, change `ctrl-p` to `alt-u`.

```sh
# .bashrc/.zshrc
export GHFC_FILTER_BY_REPO_KEY="alt-u"
```

> [!NOTE]
> The assigned key must be a valid key listed under `AVAILABLE KEYS` in the `fzf` man page.
> ```sh
> man fzf | less --pattern "AVAILABLE KEYS"
> ```
| Variable | Purpose | Default |
| ------------------------------ | ------------------------------------ | ------------ |
| `GHFC_OPEN_BROWSER_KEY` | open the file in the browser | `ctrl-b` |
| `GHFC_OPEN_EDITOR_KEY` | open the file content in the editor | `ctrl-o` |
| `GHFC_FILTER_BY_REPO_KEY` | replace query with "repo:owner/name" | `ctrl-p` |
| `GHFC_RELOAD_KEY` | reload with up to 100 results | `ctrl-r` |
| `GHFC_TOGGLE_HISTORY_KEY` | toggle command history | `ctrl-space` |
| `GHFC_TOGGLE_FUZZY_SEARCH_KEY` | toggle between Code and Fuzzy search | `ctrl-t` |
| `GHFC_OPEN_BROWSER_QUERY_KEY` | open the search query in the browser | `ctrl-x` |
| `GHFC_VIEW_CONTENTS_KEY` | open the file in the pager | `enter` |
| `GHFC_TOGGLE_PREVIEW_KEY` | toggle the file preview | `tab` |
---
## 💁 TIPS
Expand Down Expand Up @@ -165,10 +192,6 @@ GHFC_HISTORY_FILE="/custom/location/history.txt" gh find-code
GHFC_HISTORY_LIMIT="1000" gh find-code
```

### Pager
- If the `PAGER` environment variable is set to `less` or `bat`, when opening
the destination file, it will automatically scroll to the matching line found.

---

## 💪 Contributing
Expand Down

0 comments on commit ecf459a

Please sign in to comment.