git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 2/8] Do not use VISUAL editor on dumb terminals

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Oct 31, 2009, 07:46 UTC
Message-ID
<20091031074624.GA635@progeny.tock>
In-Reply-To
<20091031013039.GC5160@progeny.tock>
Jonathan Nieder wrote:
> Refuse to use $VISUAL and fall back to $EDITOR if TERM is unset
> or set to "dumb".  Traditionally, VISUAL is set to a screen
> editor and EDITOR to a line-based editor, which should be more
> useful in that situation.

I was too lazy to wait for tests to finish on this one, and lo and behold, they did not pass.

These additional changes seem to help, and they also add a test to explain the change in editor behavior. The patch with these changes squashed is also included in this message, below the scissors mark.

In the controlled environment used for tests, TERM is set to dumb and ever since commit 02b3566 (test-lib.sh: Add a test_set_editor function to safely set $VISUAL, 2008-05-04), most tests set VISUAL when they want to set an editor for git to use. With this patch, they should be using EDITOR instead.

--- a/t/t7005-editor.sh
+++ b/t/t7005-editor.sh
@@ -42,6 +42,16 @@ test_expect_success 'dumb should error out when falling back on vi' '
 	fi
 '
 
+test_expect_success 'dumb should prefer EDITOR to VISUAL' '
+
+	EDITOR=./e-EDITOR.sh &&
+	VISUAL=./e-VISUAL.sh &&
+	export EDITOR VISUAL &&
+	git commit --amend &&
+	test "$(git show -s --format=%s)" = "Edited by EDITOR"
+
+'
+
 TERM=vt100
 export TERM
 for i in vi EDITOR VISUAL core_editor GIT_EDITOR
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -86,7 +86,7 @@ chmod 755 editor
 
 test_expect_success \
 	"amend commit" \
-	"VISUAL=./editor git commit --amend"
+	"EDITOR=./editor git commit --amend"
 
 test_expect_success \
 	"passing -m and -F" \
@@ -107,7 +107,7 @@ chmod 755 editor
 test_expect_success \
 	"editing message from other commit" \
 	"echo 'hula hula' >file && \
-	 VISUAL=./editor git commit -c HEAD^ -a"
+	 EDITOR=./editor git commit -c HEAD^ -a"
 
 test_expect_success \
 	"message from stdin" \
@@ -141,10 +141,10 @@ EOF
 test_expect_success \
 	'editor not invoked if -F is given' '
 	 echo "moo" >file &&
-	 VISUAL=./editor git commit -a -F msg &&
+	 EDITOR=./editor git commit -a -F msg &&
 	 git show -s --pretty=format:"%s" | grep -q good &&
 	 echo "quack" >file &&
-	 echo "Another good message." | VISUAL=./editor git commit -a -F - &&
+	 echo "Another good message." | EDITOR=./editor git commit -a -F - &&
 	 git show -s --pretty=format:"%s" | grep -q good
 	 '
 # We could just check the head sha1, but checking each commit makes it
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -30,7 +30,7 @@ TZ=UTC
 TERM=dumb
 export LANG LC_ALL PAGER TERM TZ
 EDITOR=:
-VISUAL=:
+unset VISUAL
 unset GIT_EDITOR
 unset AUTHOR_DATE
 unset AUTHOR_EMAIL
@@ -58,7 +58,7 @@ GIT_MERGE_VERBOSITY=5
 export GIT_MERGE_VERBOSITY
 export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
 export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
-export EDITOR VISUAL
+export EDITOR
 GIT_TEST_CMP=${GIT_TEST_CMP:-diff -u}
 
 # Protect ourselves from common misconfiguration to export
@@ -207,8 +207,8 @@ trap 'die' EXIT
 test_set_editor () {
 	FAKE_EDITOR="$1"
 	export FAKE_EDITOR
-	VISUAL='"$FAKE_EDITOR"'
-	export VISUAL
+	EDITOR='"$FAKE_EDITOR"'
+	export EDITOR
 }
 
 test_tick () {

-- %< --
Subject: [PATCH] Do not use VISUAL editor on dumb terminals

Refuse to use $VISUAL and fall back to $EDITOR if TERM is unset
or set to "dumb".  Traditionally, VISUAL is set to a screen
editor and EDITOR to a line-based editor, which should be more
useful in that situation.

vim, for example, is happy to assume a terminal supports ANSI
sequences even if TERM is dumb (e.g., when running from a text
editor like Acme).  git already refuses to fall back to vi on a
dumb terminal if GIT_EDITOR, core.editor, VISUAL, and EDITOR are
unset, but without this patch, that check is suppressed by
VISUAL=vi.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Jonathan Nieder <jrn@progeny.tock>
---

 editor.c          |   12 ++++++------
 t/t7005-editor.sh |   10 ++++++++++
 t/t7501-commit.sh |    8 ++++----
 t/test-lib.sh     |    8 ++++----
 4 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/editor.c b/editor.c
index 941c0b2..3f13751 100644
--- a/editor.c
+++ b/editor.c
@@ -4,19 +4,19 @@
 
 int launch_editor(const char *path, struct strbuf *buffer, const char *const *env)
 {
-	const char *editor, *terminal;
+	const char *editor = getenv("GIT_EDITOR");
+	const char *terminal = getenv("TERM");
+	int terminal_is_dumb = !terminal || !strcmp(terminal, "dumb");
 
-	editor = getenv("GIT_EDITOR");
 	if (!editor && editor_program)
 		editor = editor_program;
-	if (!editor)
+	if (!editor && !terminal_is_dumb)
 		editor = getenv("VISUAL");
 	if (!editor)
 		editor = getenv("EDITOR");
 
-	terminal = getenv("TERM");
-	if (!editor && (!terminal || !strcmp(terminal, "dumb")))
-		return error("Terminal is dumb but no VISUAL nor EDITOR defined.");
+	if (!editor && terminal_is_dumb)
+		return error("terminal is dumb, but EDITOR unset");
 
 	if (!editor)
 		editor = "vi";
diff --git a/t/t7005-editor.sh b/t/t7005-editor.sh
index b647957..a95fe19 100755
--- a/t/t7005-editor.sh
+++ b/t/t7005-editor.sh
@@ -42,6 +42,16 @@ test_expect_success 'dumb should error out when falling back on vi' '
 	fi
 '
 
+test_expect_success 'dumb should prefer EDITOR to VISUAL' '
+
+	EDITOR=./e-EDITOR.sh &&
+	VISUAL=./e-VISUAL.sh &&
+	export EDITOR VISUAL &&
+	git commit --amend &&
+	test "$(git show -s --format=%s)" = "Edited by EDITOR"
+
+'
+
 TERM=vt100
 export TERM
 for i in vi EDITOR VISUAL core_editor GIT_EDITOR
diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
index d2de576..a603f6d 100755
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -86,7 +86,7 @@ chmod 755 editor
 
 test_expect_success \
 	"amend commit" \
-	"VISUAL=./editor git commit --amend"
+	"EDITOR=./editor git commit --amend"
 
 test_expect_success \
 	"passing -m and -F" \
@@ -107,7 +107,7 @@ chmod 755 editor
 test_expect_success \
 	"editing message from other commit" \
 	"echo 'hula hula' >file && \
-	 VISUAL=./editor git commit -c HEAD^ -a"
+	 EDITOR=./editor git commit -c HEAD^ -a"
 
 test_expect_success \
 	"message from stdin" \
@@ -141,10 +141,10 @@ EOF
 test_expect_success \
 	'editor not invoked if -F is given' '
 	 echo "moo" >file &&
-	 VISUAL=./editor git commit -a -F msg &&
+	 EDITOR=./editor git commit -a -F msg &&
 	 git show -s --pretty=format:"%s" | grep -q good &&
 	 echo "quack" >file &&
-	 echo "Another good message." | VISUAL=./editor git commit -a -F - &&
+	 echo "Another good message." | EDITOR=./editor git commit -a -F - &&
 	 git show -s --pretty=format:"%s" | grep -q good
 	 '
 # We could just check the head sha1, but checking each commit makes it
diff --git a/t/test-lib.sh b/t/test-lib.sh
index f2ca536..ec3336a 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -30,7 +30,7 @@ TZ=UTC
 TERM=dumb
 export LANG LC_ALL PAGER TERM TZ
 EDITOR=:
-VISUAL=:
+unset VISUAL
 unset GIT_EDITOR
 unset AUTHOR_DATE
 unset AUTHOR_EMAIL
@@ -58,7 +58,7 @@ GIT_MERGE_VERBOSITY=5
 export GIT_MERGE_VERBOSITY
 export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
 export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
-export EDITOR VISUAL
+export EDITOR
 GIT_TEST_CMP=${GIT_TEST_CMP:-diff -u}
 
 # Protect ourselves from common misconfiguration to export
@@ -207,8 +207,8 @@ trap 'die' EXIT
 test_set_editor () {
 	FAKE_EDITOR="$1"
 	export FAKE_EDITOR
-	VISUAL='"$FAKE_EDITOR"'
-	export VISUAL
+	EDITOR='"$FAKE_EDITOR"'
+	export EDITOR
 }
 
 test_tick () {
-- 
1.6.5.2

> 
> vim, for example, is happy to assume a terminal supports ANSI
> sequences even if TERM is dumb (e.g., when running from a text
> editor like Acme).  git already refuses to fall back to vi on a
> dumb terminal if GIT_EDITOR, core.editor, VISUAL, and EDITOR are
> unset, but without this patch, that check is suppressed by
> VISUAL=vi.
> 
> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---
> This patch eases my discomfort about the error message a little.  It
> is not actually needed to support any ways of working I engage in.
> 
> If stdout is redirected, this is probably still making the wrong
> choice; isatty(STDOUT_FILENO) might be a more useful datum to use.
> But it does not seem worth complicating the logic further.
> 
>  editor.c |   12 ++++++------
>  1 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/editor.c b/editor.c
> index 941c0b2..3f13751 100644
> --- a/editor.c
> +++ b/editor.c
> @@ -4,19 +4,19 @@
>  
>  int launch_editor(const char *path, struct strbuf *buffer, const char *const *env)
>  {
> -	const char *editor, *terminal;
> +	const char *editor = getenv("GIT_EDITOR");
> +	const char *terminal = getenv("TERM");
> +	int terminal_is_dumb = !terminal || !strcmp(terminal, "dumb");
>  
> -	editor = getenv("GIT_EDITOR");
>  	if (!editor && editor_program)
>  		editor = editor_program;
> -	if (!editor)
> +	if (!editor && !terminal_is_dumb)
>  		editor = getenv("VISUAL");
>  	if (!editor)
>  		editor = getenv("EDITOR");
>  
> -	terminal = getenv("TERM");
> -	if (!editor && (!terminal || !strcmp(terminal, "dumb")))
> -		return error("Terminal is dumb but no VISUAL nor EDITOR defined.");
> +	if (!editor && terminal_is_dumb)
> +		return error("terminal is dumb, but EDITOR unset");
>  
>  	if (!editor)
>  		editor = "vi";
> -- 
> 1.6.5.2
> 
Previous: Jonathan NiederNext: Jonathan Nieder
Message 32 of 65 in “packaging vs default pager”
  1. Ben WaltonOct 28, 2009
  2. Junio C HamanoOct 28, 2009
  3. 0/2 Re: packaging vs default pagerJonathan Nieder, Oct 29, 2009
  4. 1/2 Provide a build time default-pager settingJonathan Nieder, Oct 29, 2009
  5. 2/2 Provide a build time default-editor settingJonathan Nieder, Oct 29, 2009
  6. David RoundyOct 29, 2009
  7. Johannes SixtOct 29, 2009
  8. Junio C HamanoOct 29, 2009
  9. Johannes SixtOct 29, 2009
  10. Junio C HamanoOct 29, 2009
  11. David RoundyOct 30, 2009
  12. Junio C HamanoOct 29, 2009
  13. 0/8 Default pager and editorJonathan Nieder, Oct 30, 2009
  14. 1/8 launch_editor: Longer error message when TERM=dumbJonathan Nieder, Oct 30, 2009
  15. 2/8 Handle more shell metacharacters in editor namesJonathan Nieder, Oct 30, 2009
  16. 3/8 Teach git var about GIT_EDITORJonathan Nieder, Oct 30, 2009
  17. Johannes SixtOct 30, 2009
  18. Jonathan NiederOct 30, 2009
  19. Junio C HamanoOct 30, 2009
  20. Jonathan NiederOct 31, 2009
  21. 4/8 Teach git var about GIT_PAGERJonathan Nieder, Oct 30, 2009
  22. 5/8 add -i, send-email, svn, p4, etc: use "git var GIT_EDITOR"Jonathan Nieder, Oct 30, 2009
  23. 6/8 am -i, git-svn: use "git var GIT_PAGER"Jonathan Nieder, Oct 30, 2009
  24. 7/8 Provide a build time default-editor settingJonathan Nieder, Oct 30, 2009
  25. Jonathan NiederOct 30, 2009
  26. 8/8 Provide a build time default-pager settingJonathan Nieder, Oct 30, 2009
  27. Junio C HamanoOct 30, 2009
  28. 9/8 Teach git var to run the editorJonathan Nieder, Oct 30, 2009
  29. 0/8 Default pager and editorJonathan Nieder, Oct 31, 2009
  30. 1/8 Handle more shell metacharacters in editor namesJonathan Nieder, Oct 31, 2009
  31. 2/8 Do not use VISUAL editor on dumb terminalsJonathan Nieder, Oct 31, 2009
  32. 2/8 Do not use VISUAL editor on dumb terminalsJonathan Nieder, Oct 31, 2009
  33. 3/8 Teach git var about GIT_EDITORJonathan Nieder, Oct 31, 2009
  34. Junio C HamanoOct 31, 2009
  35. Jonathan NiederOct 31, 2009
  36. Junio C HamanoOct 31, 2009
  37. Jonathan NiederOct 31, 2009
  38. Teach git var about GIT_EDITORJonathan Nieder, Oct 31, 2009
  39. Jonathan NiederOct 31, 2009
  40. Teach git var about GIT_EDITORJonathan Nieder, Oct 31, 2009
  41. Junio C HamanoNov 1, 2009
  42. Johannes SixtOct 31, 2009
  43. 4/8 Teach git var about GIT_PAGERJonathan Nieder, Oct 31, 2009
  44. 5/8 add -i, send-email, svn, p4, etc: use "git var GIT_EDITOR"Jonathan Nieder, Oct 31, 2009
  45. 6/8 am -i, git-svn: use "git var GIT_PAGER"Jonathan Nieder, Oct 31, 2009
  46. 7/8 Provide a build time default-editor settingJonathan Nieder, Oct 31, 2009
  47. Junio C HamanoOct 31, 2009
  48. Jonathan NiederOct 31, 2009
  49. Junio C HamanoOct 31, 2009
  50. Jonathan NiederOct 31, 2009
  51. Junio C HamanoNov 1, 2009
  52. 8/8 Provide a build time default-pager settingJonathan Nieder, Oct 31, 2009
  53. 0/9 Default pager and editorJonathan Nieder, Nov 11, 2009
  54. 1/9 Handle more shell metacharacters in editor namesJonathan Nieder, Nov 11, 2009
  55. 2/9 Do not use VISUAL editor on dumb terminalsJonathan Nieder, Nov 11, 2009
  56. 3/9 Suppress warnings from "git var -l"Jonathan Nieder, Nov 11, 2009
  57. 4/9 Teach git var about GIT_EDITORJonathan Nieder, Nov 12, 2009
  58. 5/9 Teach git var about GIT_PAGERJonathan Nieder, Nov 12, 2009
  59. 6/9 add -i, send-email, svn, p4, etc: use "git var GIT_EDITOR"Jonathan Nieder, Nov 12, 2009
  60. 7/9 am -i, git-svn: use "git var GIT_PAGER"Jonathan Nieder, Nov 12, 2009
  61. 8/9 Provide a build time default-editor settingJonathan Nieder, Nov 12, 2009
  62. 9/9 Provide a build time default-pager settingJonathan Nieder, Nov 12, 2009
  63. Junio C HamanoNov 15, 2009
  64. 0/2 Default Pager and Editor at build-timeBen Walton, Oct 29, 2009
  65. 1/2 Provide a build time default-pager settingBen Walton, Oct 29, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.