From 7189656854b87b062e7c6d36681fef2c9fbffbde Mon Sep 17 00:00:00 2001 From: David Lee Date: Fri, 31 Aug 2018 09:32:07 -0400 Subject: [PATCH] [PATCH] Add grep_shortcuts Closes #125, Thanks David Lee! --- git.scmbrc.example | 9 ++++---- lib/git/aliases.sh | 1 + lib/git/grep_shortcuts.rb | 47 +++++++++++++++++++++++++++++++++++++++ lib/git/grep_shortcuts.sh | 24 ++++++++++++++++++++ scm_breeze.sh | 1 + 5 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 lib/git/grep_shortcuts.rb create mode 100644 lib/git/grep_shortcuts.sh diff --git a/git.scmbrc.example b/git.scmbrc.example index 2728b5a..2637baa 100644 --- a/git.scmbrc.example +++ b/git.scmbrc.example @@ -34,10 +34,10 @@ git_alias="g" # 1. 'SCM Breeze' functions git_status_shortcuts_alias="gs" git_add_shortcuts_alias="ga" -git_add_patch_alias="gap" -git_add_updated_alias="gau" -git_show_files_alias="gsf" exec_scmb_expand_args_alias="ge" +git_show_files_alias="gsf" +git_commit_all_alias="gca" +git_grep_shortcuts_alias="gtrep" # 2. Commands that handle paths (with shortcut args expanded) git_checkout_alias="gco" git_checkout_branch_alias="gcb" @@ -68,7 +68,8 @@ git_status_short_alias="gss" git_clean_alias="gce" git_clean_force_alias="gcef" git_add_all_alias="gaa" -git_commit_all_alias="gca" +git_add_patch_alias="gap" +git_add_updated_alias="gau" git_commit_amend_alias="gcm" git_commit_amend_no_msg_alias="gcmh" git_commit_no_msg_alias="gch" diff --git a/lib/git/aliases.sh b/lib/git/aliases.sh index 9632c79..28b0e31 100644 --- a/lib/git/aliases.sh +++ b/lib/git/aliases.sh @@ -89,6 +89,7 @@ _alias "$git_add_shortcuts_alias" 'git_add_shortcuts' _alias "$exec_scmb_expand_args_alias" 'exec_scmb_expand_args' _alias "$git_show_files_alias" 'git_show_affected_files' _alias "$git_commit_all_alias" 'git_commit_all' +_alias "$git_grep_shortcuts_alias" 'git_grep_shortcuts' # Git Index alias _alias "$git_index_alias" 'git_index' diff --git a/lib/git/grep_shortcuts.rb b/lib/git/grep_shortcuts.rb new file mode 100644 index 0000000..9f5ecc4 --- /dev/null +++ b/lib/git/grep_shortcuts.rb @@ -0,0 +1,47 @@ +#!/usr/bin/env ruby +# encoding: UTF-8 + +PROJECT_ROOT = File.exist?(".git") ? Dir.pwd : `\git rev-parse --show-toplevel 2> /dev/null`.strip + +COLORS = { + :rst => "\033[0m", + :del => "\033[0;31m", + :mod => "\033[0;32m", + :new => "\033[0;33m", + :ren => "\033[0;34m", + :cpy => "\033[0;33m", + :typ => "\033[0;35m", + :unt => "\033[0;36m", + :dark => "\033[2;37m", + :branch => "\033[1m", + :header => "\033[0m" +} + +COLOR_MATCH = /\e\[[0-9;]*[mK]/ + +output_files = [] + +stdin = STDIN.set_encoding(Encoding::ASCII_8BIT) + +while stdin.gets + if $. > 1000 + puts "Only showing first 1000 results. Please refine your search." + break + end + print "#{COLORS[:dark]}[#{COLORS[:rst]}#{$.}#{COLORS[:dark]}]#{COLORS[:rst]} " + matches = $_.match(/(^.+?)#{COLOR_MATCH}?:#{COLOR_MATCH}?(\d+)?/) + file = matches[1] + line = matches[2] + output_files << "#{file}#{line ? ":#{line}" : ""}" + puts $_ +end + +print "@@filelist@@::" + +output_files.each_with_index {|f,i| + # If file starts with a '~', treat it as a relative path. + # This is important when dealing with symlinks + print "|" unless i == 0 + print f.start_with?("~") ? f.sub(/~/, '') : File.join(PROJECT_ROOT, f) +} +puts diff --git a/lib/git/grep_shortcuts.sh b/lib/git/grep_shortcuts.sh new file mode 100644 index 0000000..d7024ea --- /dev/null +++ b/lib/git/grep_shortcuts.sh @@ -0,0 +1,24 @@ +git_grep_shortcuts() { + fail_if_not_git_repo || return 1 + git_clear_vars + # Run ruby script, store output + tmp_grep_results="$(git rev-parse --git-dir)/tmp_grep_results_$$" + git grep -n --color=always "$@" | + /usr/bin/env ruby "$scmbDir/lib/git/grep_shortcuts.rb" >"$tmp_grep_results" + + # Fetch list of files from last line of script output + files="$(tail -1 "$tmp_grep_results" | sed 's%@@filelist@@::%%g')" + + # Export numbered env variables for each file + IFS="|" + local e=1 + for file in ${=files}; do + export $git_env_char$e="$file" + let e++ + done + IFS=$' \t\n' + + # Print status + cat "$tmp_grep_results" | sed '$d' | less -SfRMXFi + rm -f "$tmp_grep_results" +} diff --git a/scm_breeze.sh b/scm_breeze.sh index 98957d5..4d83349 100644 --- a/scm_breeze.sh +++ b/scm_breeze.sh @@ -22,6 +22,7 @@ if [[ -s "$HOME/.git.scmbrc" ]]; then source "$scmbDir/lib/git/keybindings.sh" source "$scmbDir/lib/git/status_shortcuts.sh" source "$scmbDir/lib/git/branch_shortcuts.sh" + source "$scmbDir/lib/git/grep_shortcuts.sh" source "$scmbDir/lib/git/shell_shortcuts.sh" source "$scmbDir/lib/git/repo_index.sh" source "$scmbDir/lib/git/tools.sh"