All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH] add -p: prompt for single characters
@ 2009-02-01 20:35 Thomas Rast
  2009-02-02  3:31 ` Suraj Kurapati
  2009-02-02 13:19 ` [RFC PATCH] add -p: prompt for single characters Jeff King
  0 siblings, 2 replies; 30+ messages in thread
From: Thomas Rast @ 2009-02-01 20:35 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Suraj N. Kurapati

Use Term::ReadKey, if available, to let the user answer add -p's
prompts by pressing a single key.  The 'g' command is the only one
that takes an argument, but can easily cope since it'll just offer a
choice of chunks.  We're not doing the same in the main 'add -i'
interface because file selection etc. may expect several characters.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
---

I wrote this on the train today, but it turns out a similar idea was
already around earlier:

  http://thread.gmane.org/gmane.comp.version-control.git/100146

I can't find the v4 promised there, so I assume Suraj dropped it.

It would indeed be nice if we could apply the same to the main 'add
-i' loop, and I played with the code to do so for a while.  Most of
the mechanisms required seem to be in place; it already computes
shortest unique prefixes for the inputs given, so we could just grab
the one-character prefixes from there.

However, what to do when the user entered a letter that is known to be
part of several prefixes?  If we offer to enter the rest of the line,
e.g., 'return $key.<STDIN>', the user can't backspace away the
"existing" input if he decides to do something else instead.  Perhaps
readline could prime the input line with the letter, but I can't find
any such feature in the Term::ReadLine docs.  Implementation ideas are
obviously very welcome.


 git-add--interactive.perl |   35 ++++++++++++++++++++++++++++++++---
 1 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index ca60356..0633eca 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -33,6 +33,14 @@ my ($diff_new_color) =
 
 my $normal_color = $repo->get_color("", "reset");
 
+my $use_readkey = 0;
+my %control_keys;
+eval {
+	use Term::ReadKey;
+	$use_readkey = 1;
+	%control_keys = GetControlChars;
+};
+
 sub colored {
 	my $color = shift;
 	my $string = join("", @_);
@@ -758,11 +766,32 @@ sub diff_applies {
 	return close $fh;
 }
 
+sub _restore_terminal_and_die {
+	ReadMode 'restore';
+	print "\n";
+	exit 1;
+}
+
+sub prompt_single_character {
+	if ($use_readkey) {
+		local $SIG{TERM} = \&_restore_terminal_and_die;
+		local $SIG{INT} = \&_restore_terminal_and_die;
+		ReadMode 'cbreak';
+		my $key = ReadKey 0;
+		ReadMode 'restore';
+		print "$key" if defined $key;
+		print "\n";
+		return $key;
+	} else {
+		return <STDIN>;
+	}
+}
+
 sub prompt_yesno {
 	my ($prompt) = @_;
 	while (1) {
 		print colored $prompt_color, $prompt;
-		my $line = <STDIN>;
+		my $line = prompt_single_character;
 		return 0 if $line =~ /^n/i;
 		return 1 if $line =~ /^y/i;
 	}
@@ -892,7 +921,7 @@ sub patch_update_file {
 			print @{$mode->{DISPLAY}};
 			print colored $prompt_color,
 				"Stage mode change [y/n/a/d/?]? ";
-			my $line = <STDIN>;
+			my $line = prompt_single_character;
 			if ($line =~ /^y/i) {
 				$mode->{USE} = 1;
 				last;
@@ -965,7 +994,7 @@ sub patch_update_file {
 			print;
 		}
 		print colored $prompt_color, "Stage this hunk [y/n/a/d$other/?]? ";
-		my $line = <STDIN>;
+		my $line = prompt_single_character;
 		if ($line) {
 			if ($line =~ /^y/i) {
 				$hunk[$ix]{USE} = 1;
-- 
tg: (a34a9db..) t/add-p-readkey (depends on: origin/master)

^ permalink raw reply related	[flat|nested] 30+ messages in thread

end of thread, other threads:[~2009-02-07  7:51 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-01 20:35 [RFC PATCH] add -p: prompt for single characters Thomas Rast
2009-02-02  3:31 ` Suraj Kurapati
2009-02-02  8:34   ` Thomas Rast
2009-02-02  8:50     ` Junio C Hamano
2009-02-02 21:46       ` [PATCH 0/4] add -p: Term::ReadKey and more Thomas Rast
2009-02-02 21:46       ` [PATCH 1/4] add -p: change prompt separator for 'g' Thomas Rast
2009-02-02 21:46       ` [PATCH 2/4] add -p: trap Ctrl-D in 'goto' mode Thomas Rast
2009-02-02 21:46       ` [PATCH 3/4] add -p: optionally prompt for single characters Thomas Rast
2009-02-03  6:24         ` Jeff King
2009-02-03  8:54           ` [Illustration PATCH] add -i: accept single-keypress input Thomas Rast
2009-02-03  9:05             ` Junio C Hamano
2009-02-03  9:35               ` Thomas Rast
2009-02-04  5:10                 ` Junio C Hamano
2009-02-04  8:51                   ` Thomas Rast
2009-02-04 19:42           ` [PATCH 3/4] add -p: optionally prompt for single characters Thomas Rast
2009-02-04 20:08             ` [PATCH v2 3/4] add -p: " Thomas Rast
2009-02-04 20:08             ` [PATCH v2 4/4] add -p: print errors in separate color Thomas Rast
2009-02-04 20:12             ` [PATCH v3 3/4] add -p: prompt for single characters Thomas Rast
2009-02-04 20:12             ` [PATCH v3 4/4] add -p: print errors in separate color Thomas Rast
2009-02-04 20:40             ` [PATCH 3/4] add -p: optionally prompt for single characters Junio C Hamano
2009-02-05  8:28               ` [PATCH v4 3/4] add -p: " Thomas Rast
2009-02-06 14:01                 ` Jeff King
2009-02-06 19:30                   ` [PATCH] add -p: import Term::ReadKey with 'require' Thomas Rast
2009-02-06 20:30                     ` Jeff King
2009-02-06 23:21                       ` Thomas Rast
2009-02-07  4:54                         ` Jeff King
2009-02-07  7:50                           ` Junio C Hamano
2009-02-05  8:28               ` [PATCH v4 4/4] add -p: print errors in separate color Thomas Rast
2009-02-02 21:46       ` [PATCH 4/4] add -p: print errors in help colors Thomas Rast
2009-02-02 13:19 ` [RFC PATCH] add -p: prompt for single characters Jeff King

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.