diff --git a/src/screen.c b/src/screen.c
index a737dc0..2e8a6aa 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -94,20 +94,20 @@
     void
 conceal_check_cursor_line(int was_concealed)
 {
-    if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin) != was_concealed)
-    {
-	int wcol = curwin->w_wcol;
+    if (curwin->w_p_cole <= 0 || conceal_cursor_line(curwin) == was_concealed)
+	return;
 
-	need_cursor_line_redraw = TRUE;
-	// Need to recompute cursor column, e.g., when starting Visual mode
-	// without concealing.
-	curs_columns(TRUE);
+    int wcol = curwin->w_wcol;
 
-	// When concealing now w_wcol will be computed wrong, keep the previous
-	// value, it will be updated in win_line().
-	if (!was_concealed)
-	    curwin->w_wcol = wcol;
-    }
+    need_cursor_line_redraw = TRUE;
+    // Need to recompute cursor column, e.g., when starting Visual mode
+    // without concealing.
+    curs_columns(TRUE);
+
+    // When concealing now w_wcol will be computed wrong, keep the previous
+    // value, it will be updated in win_line().
+    if (!was_concealed)
+	curwin->w_wcol = wcol;
 }
 #endif
 
@@ -906,14 +906,14 @@
     int		hl;
     int		c;
 
-    if (wp->w_vsep_width)
-    {
-	// draw the vertical separator right of this window
-	c = fillchar_vsep(&hl, wp);
-	screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + wp->w_height,
-		W_ENDCOL(wp), W_ENDCOL(wp) + 1,
-		c, ' ', hl);
-    }
+    if (!wp->w_vsep_width)
+	return;
+
+    // draw the vertical separator right of this window
+    c = fillchar_vsep(&hl, wp);
+    screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + wp->w_height,
+	    W_ENDCOL(wp), W_ENDCOL(wp) + 1,
+	    c, ' ', hl);
 }
 
 /*
@@ -960,36 +960,34 @@
     if (wp->w_buffer->b_p_iminsert != B_IMODE_LMAP)
 	return FALSE;
 
-    {
 #ifdef FEAT_EVAL
-	buf_T	*old_curbuf = curbuf;
-	win_T	*old_curwin = curwin;
-	char_u	*s;
+    buf_T	*old_curbuf = curbuf;
+    win_T	*old_curwin = curwin;
+    char_u	*s;
 
-	curbuf = wp->w_buffer;
-	curwin = wp;
-	STRCPY(buf, "b:keymap_name");	// must be writable
-	++emsg_skip;
-	s = p = eval_to_string(buf, FALSE, FALSE);
-	--emsg_skip;
-	curbuf = old_curbuf;
-	curwin = old_curwin;
-	if (p == NULL || *p == NUL)
+    curbuf = wp->w_buffer;
+    curwin = wp;
+    STRCPY(buf, "b:keymap_name");	// must be writable
+    ++emsg_skip;
+    s = p = eval_to_string(buf, FALSE, FALSE);
+    --emsg_skip;
+    curbuf = old_curbuf;
+    curwin = old_curwin;
+    if (p == NULL || *p == NUL)
 #endif
-	{
+    {
 #ifdef FEAT_KEYMAP
-	    if (wp->w_buffer->b_kmap_state & KEYMAP_LOADED)
-		p = wp->w_buffer->b_p_keymap;
-	    else
+	if (wp->w_buffer->b_kmap_state & KEYMAP_LOADED)
+	    p = wp->w_buffer->b_p_keymap;
+	else
 #endif
-		p = (char_u *)"lang";
-	}
-	if (vim_snprintf((char *)buf, len, (char *)fmt, p) > len - 1)
-	    buf[0] = NUL;
-#ifdef FEAT_EVAL
-	vim_free(s);
-#endif
+	    p = (char_u *)"lang";
     }
+    if (vim_snprintf((char *)buf, len, (char *)fmt, p) > len - 1)
+	buf[0] = NUL;
+#ifdef FEAT_EVAL
+    vim_free(s);
+#endif
     return buf[0] != NUL;
 }
 
@@ -1208,26 +1206,26 @@
     unsigned off;
 
     // safety check
-    if (ScreenLines != NULL && row < screen_Rows && col < screen_Columns)
-    {
-	off = LineOffset[row] + col;
-	*attrp = ScreenAttrs[off];
-	bytes[0] = ScreenLines[off];
-	bytes[1] = NUL;
+    if (ScreenLines == NULL || row >= screen_Rows || col >= screen_Columns)
+	return;
 
-	if (enc_utf8 && ScreenLinesUC[off] != 0)
-	    bytes[utfc_char2bytes(off, bytes)] = NUL;
-	else if (enc_dbcs == DBCS_JPNU && ScreenLines[off] == 0x8e)
-	{
-	    bytes[0] = ScreenLines[off];
-	    bytes[1] = ScreenLines2[off];
-	    bytes[2] = NUL;
-	}
-	else if (enc_dbcs && MB_BYTE2LEN(bytes[0]) > 1)
-	{
-	    bytes[1] = ScreenLines[off + 1];
-	    bytes[2] = NUL;
-	}
+    off = LineOffset[row] + col;
+    *attrp = ScreenAttrs[off];
+    bytes[0] = ScreenLines[off];
+    bytes[1] = NUL;
+
+    if (enc_utf8 && ScreenLinesUC[off] != 0)
+	bytes[utfc_char2bytes(off, bytes)] = NUL;
+    else if (enc_dbcs == DBCS_JPNU && ScreenLines[off] == 0x8e)
+    {
+	bytes[0] = ScreenLines[off];
+	bytes[1] = ScreenLines2[off];
+	bytes[2] = NUL;
+    }
+    else if (enc_dbcs && MB_BYTE2LEN(bytes[0]) > 1)
+    {
+	bytes[1] = ScreenLines[off + 1];
+	bytes[2] = NUL;
     }
 }
 
@@ -1538,12 +1536,12 @@
     void
 start_search_hl(void)
 {
-    if (p_hls && !no_hlsearch)
-    {
-	end_search_hl();  // just in case it wasn't called before
-	last_pat_prog(&screen_search_hl.rm);
-	screen_search_hl.attr = HL_ATTR(HLF_L);
-    }
+    if (!p_hls || no_hlsearch)
+	return;
+
+    end_search_hl();  // just in case it wasn't called before
+    last_pat_prog(&screen_search_hl.rm);
+    screen_search_hl.attr = HL_ATTR(HLF_L);
 }
 
 /*
@@ -1552,11 +1550,11 @@
     void
 end_search_hl(void)
 {
-    if (screen_search_hl.rm.regprog != NULL)
-    {
-	vim_regfree(screen_search_hl.rm.regprog);
-	screen_search_hl.rm.regprog = NULL;
-    }
+    if (screen_search_hl.rm.regprog == NULL)
+	return;
+
+    vim_regfree(screen_search_hl.rm.regprog);
+    screen_search_hl.rm.regprog = NULL;
 }
 #endif
 
@@ -1566,153 +1564,152 @@
     attrentry_T *aep = NULL;
 
     screen_attr = attr;
-    if (full_screen
+    if (!full_screen
 #ifdef MSWIN
-		    && termcap_active
+	    || !termcap_active
 #endif
-				       )
-    {
-#ifdef FEAT_GUI
-	if (gui.in_use)
-	{
-	    char	buf[20];
+       )
+	return;
 
-	    // The GUI handles this internally.
-	    sprintf(buf, "\033|%dh", attr);
-	    OUT_STR(buf);
+#ifdef FEAT_GUI
+    if (gui.in_use)
+    {
+	char	buf[20];
+
+	// The GUI handles this internally.
+	sprintf(buf, "\033|%dh", attr);
+	OUT_STR(buf);
+	return;
+    }
+#endif
+
+    if (attr > HL_ALL)				// special HL attr.
+    {
+	if (IS_CTERM)
+	    aep = syn_cterm_attr2entry(attr);
+	else
+	    aep = syn_term_attr2entry(attr);
+	if (aep == NULL)	    // did ":syntax clear"
+	    attr = 0;
+	else
+	    attr = aep->ae_attr;
+    }
+#if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS)
+    if (use_vtp())
+    {
+	guicolor_T  defguifg, defguibg;
+	int	    defctermfg, defctermbg;
+
+	// If FG and BG are unset, the color is undefined when
+	// BOLD+INVERSE. Use Normal as the default value.
+	get_default_console_color(&defctermfg, &defctermbg, &defguifg,
+		&defguibg);
+
+	if (p_tgc)
+	{
+	    if (aep == NULL || COLOR_INVALID(aep->ae_u.cterm.fg_rgb))
+		term_fg_rgb_color(defguifg);
+	    if (aep == NULL || COLOR_INVALID(aep->ae_u.cterm.bg_rgb))
+		term_bg_rgb_color(defguibg);
+	}
+	else if (t_colors >= 256)
+	{
+	    if (aep == NULL || aep->ae_u.cterm.fg_color == 0)
+		term_fg_color(defctermfg);
+	    if (aep == NULL || aep->ae_u.cterm.bg_color == 0)
+		term_bg_color(defctermbg);
+	}
+    }
+#endif
+    if ((attr & HL_BOLD) && *T_MD != NUL)	// bold
+	out_str(T_MD);
+    else if (aep != NULL && cterm_normal_fg_bold && (
+#ifdef FEAT_TERMGUICOLORS
+		p_tgc && aep->ae_u.cterm.fg_rgb != CTERMCOLOR
+		? aep->ae_u.cterm.fg_rgb != INVALCOLOR
+		:
+#endif
+		t_colors > 1 && aep->ae_u.cterm.fg_color))
+	// If the Normal FG color has BOLD attribute and the new HL
+	// has a FG color defined, clear BOLD.
+	out_str(T_ME);
+    if ((attr & HL_STANDOUT) && *T_SO != NUL)	// standout
+	out_str(T_SO);
+    if ((attr & HL_UNDERCURL) && *T_UCS != NUL) // undercurl
+	out_str(T_UCS);
+    if ((attr & HL_UNDERDOUBLE) && *T_USS != NUL) // double underline
+	out_str(T_USS);
+    if ((attr & HL_UNDERDOTTED) && *T_DS != NUL) // dotted underline
+	out_str(T_DS);
+    if ((attr & HL_UNDERDASHED) && *T_CDS != NUL) // dashed underline
+	out_str(T_CDS);
+    if (((attr & HL_UNDERLINE)	    // underline or undercurl, etc.
+		|| ((attr & HL_UNDERCURL) && *T_UCS == NUL)
+		|| ((attr & HL_UNDERDOUBLE) && *T_USS == NUL)
+		|| ((attr & HL_UNDERDOTTED) && *T_DS == NUL)
+		|| ((attr & HL_UNDERDASHED) && *T_CDS == NUL))
+	    && *T_US != NUL)
+	out_str(T_US);
+    if ((attr & HL_ITALIC) && *T_CZH != NUL)	// italic
+	out_str(T_CZH);
+    if ((attr & HL_INVERSE) && *T_MR != NUL)	// inverse (reverse)
+	out_str(T_MR);
+    if ((attr & HL_STRIKETHROUGH) && *T_STS != NUL)	// strike
+	out_str(T_STS);
+
+    /*
+     * Output the color or start string after bold etc., in case the
+     * bold etc. override the color setting.
+     */
+    if (aep != NULL)
+    {
+#ifdef FEAT_TERMGUICOLORS
+	// When 'termguicolors' is set but fg or bg is unset,
+	// fall back to the cterm colors.   This helps for SpellBad,
+	// where the GUI uses a red undercurl.
+	if (p_tgc && aep->ae_u.cterm.fg_rgb != CTERMCOLOR)
+	{
+	    if (aep->ae_u.cterm.fg_rgb != INVALCOLOR)
+		term_fg_rgb_color(aep->ae_u.cterm.fg_rgb);
 	}
 	else
 #endif
+	    if (t_colors > 1)
+	    {
+		if (aep->ae_u.cterm.fg_color)
+		    term_fg_color(aep->ae_u.cterm.fg_color - 1);
+	    }
+#ifdef FEAT_TERMGUICOLORS
+	if (p_tgc && aep->ae_u.cterm.bg_rgb != CTERMCOLOR)
 	{
-	    if (attr > HL_ALL)				// special HL attr.
+	    if (aep->ae_u.cterm.bg_rgb != INVALCOLOR)
+		term_bg_rgb_color(aep->ae_u.cterm.bg_rgb);
+	}
+	else
+#endif
+	    if (t_colors > 1)
 	    {
-		if (IS_CTERM)
-		    aep = syn_cterm_attr2entry(attr);
-		else
-		    aep = syn_term_attr2entry(attr);
-		if (aep == NULL)	    // did ":syntax clear"
-		    attr = 0;
-		else
-		    attr = aep->ae_attr;
+		if (aep->ae_u.cterm.bg_color)
+		    term_bg_color(aep->ae_u.cterm.bg_color - 1);
 	    }
-#if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS)
-	    if (use_vtp())
+#ifdef FEAT_TERMGUICOLORS
+	if (p_tgc && aep->ae_u.cterm.ul_rgb != CTERMCOLOR)
+	{
+	    if (aep->ae_u.cterm.ul_rgb != INVALCOLOR)
+		term_ul_rgb_color(aep->ae_u.cterm.ul_rgb);
+	}
+	else
+#endif
+	    if (t_colors > 1)
 	    {
-		guicolor_T  defguifg, defguibg;
-		int	    defctermfg, defctermbg;
-
-		// If FG and BG are unset, the color is undefined when
-		// BOLD+INVERSE. Use Normal as the default value.
-		get_default_console_color(&defctermfg, &defctermbg, &defguifg,
-								    &defguibg);
-
-		if (p_tgc)
-		{
-		    if (aep == NULL || COLOR_INVALID(aep->ae_u.cterm.fg_rgb))
-			term_fg_rgb_color(defguifg);
-		    if (aep == NULL || COLOR_INVALID(aep->ae_u.cterm.bg_rgb))
-			term_bg_rgb_color(defguibg);
-		}
-		else if (t_colors >= 256)
-		{
-		    if (aep == NULL || aep->ae_u.cterm.fg_color == 0)
-			term_fg_color(defctermfg);
-		    if (aep == NULL || aep->ae_u.cterm.bg_color == 0)
-			term_bg_color(defctermbg);
-		}
+		if (aep->ae_u.cterm.ul_color)
+		    term_ul_color(aep->ae_u.cterm.ul_color - 1);
 	    }
-#endif
-	    if ((attr & HL_BOLD) && *T_MD != NUL)	// bold
-		out_str(T_MD);
-	    else if (aep != NULL && cterm_normal_fg_bold && (
-#ifdef FEAT_TERMGUICOLORS
-			p_tgc && aep->ae_u.cterm.fg_rgb != CTERMCOLOR
-			  ? aep->ae_u.cterm.fg_rgb != INVALCOLOR
-			  :
-#endif
-			    t_colors > 1 && aep->ae_u.cterm.fg_color))
-		// If the Normal FG color has BOLD attribute and the new HL
-		// has a FG color defined, clear BOLD.
-		out_str(T_ME);
-	    if ((attr & HL_STANDOUT) && *T_SO != NUL)	// standout
-		out_str(T_SO);
-	    if ((attr & HL_UNDERCURL) && *T_UCS != NUL) // undercurl
-		out_str(T_UCS);
-	    if ((attr & HL_UNDERDOUBLE) && *T_USS != NUL) // double underline
-		out_str(T_USS);
-	    if ((attr & HL_UNDERDOTTED) && *T_DS != NUL) // dotted underline
-		out_str(T_DS);
-	    if ((attr & HL_UNDERDASHED) && *T_CDS != NUL) // dashed underline
-		out_str(T_CDS);
-	    if (((attr & HL_UNDERLINE)	    // underline or undercurl, etc.
-			|| ((attr & HL_UNDERCURL) && *T_UCS == NUL)
-			|| ((attr & HL_UNDERDOUBLE) && *T_USS == NUL)
-			|| ((attr & HL_UNDERDOTTED) && *T_DS == NUL)
-			|| ((attr & HL_UNDERDASHED) && *T_CDS == NUL))
-		    && *T_US != NUL)
-		out_str(T_US);
-	    if ((attr & HL_ITALIC) && *T_CZH != NUL)	// italic
-		out_str(T_CZH);
-	    if ((attr & HL_INVERSE) && *T_MR != NUL)	// inverse (reverse)
-		out_str(T_MR);
-	    if ((attr & HL_STRIKETHROUGH) && *T_STS != NUL)	// strike
-		out_str(T_STS);
 
-	    /*
-	     * Output the color or start string after bold etc., in case the
-	     * bold etc. override the color setting.
-	     */
-	    if (aep != NULL)
-	    {
-#ifdef FEAT_TERMGUICOLORS
-		// When 'termguicolors' is set but fg or bg is unset,
-		// fall back to the cterm colors.   This helps for SpellBad,
-		// where the GUI uses a red undercurl.
-		if (p_tgc && aep->ae_u.cterm.fg_rgb != CTERMCOLOR)
-		{
-		    if (aep->ae_u.cterm.fg_rgb != INVALCOLOR)
-			term_fg_rgb_color(aep->ae_u.cterm.fg_rgb);
-		}
-		else
-#endif
-		if (t_colors > 1)
-		{
-		    if (aep->ae_u.cterm.fg_color)
-			term_fg_color(aep->ae_u.cterm.fg_color - 1);
-		}
-#ifdef FEAT_TERMGUICOLORS
-		if (p_tgc && aep->ae_u.cterm.bg_rgb != CTERMCOLOR)
-		{
-		    if (aep->ae_u.cterm.bg_rgb != INVALCOLOR)
-			term_bg_rgb_color(aep->ae_u.cterm.bg_rgb);
-		}
-		else
-#endif
-		if (t_colors > 1)
-		{
-		    if (aep->ae_u.cterm.bg_color)
-			term_bg_color(aep->ae_u.cterm.bg_color - 1);
-		}
-#ifdef FEAT_TERMGUICOLORS
-		if (p_tgc && aep->ae_u.cterm.ul_rgb != CTERMCOLOR)
-		{
-		    if (aep->ae_u.cterm.ul_rgb != INVALCOLOR)
-			term_ul_rgb_color(aep->ae_u.cterm.ul_rgb);
-		}
-		else
-#endif
-		if (t_colors > 1)
-		{
-		    if (aep->ae_u.cterm.ul_color)
-			term_ul_color(aep->ae_u.cterm.ul_color - 1);
-		}
-
-		if (!IS_CTERM)
-		{
-		    if (aep->ae_u.term.start != NULL)
-			out_str(aep->ae_u.term.start);
-		}
-	    }
+	if (!IS_CTERM)
+	{
+	    if (aep->ae_u.term.start != NULL)
+		out_str(aep->ae_u.term.start);
 	}
     }
 }
@@ -1895,13 +1892,14 @@
     void
 reset_cterm_colors(void)
 {
-    if (IS_CTERM)
-    {
-	// set Normal cterm colors
+    if (!IS_CTERM)
+	return;
+
+    // set Normal cterm colors
 #ifdef FEAT_TERMGUICOLORS
-	if (p_tgc ? (cterm_normal_fg_gui_color != INVALCOLOR
-		 || cterm_normal_bg_gui_color != INVALCOLOR)
-		: (cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0))
+    if (p_tgc ? (cterm_normal_fg_gui_color != INVALCOLOR
+		|| cterm_normal_bg_gui_color != INVALCOLOR)
+	    : (cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0))
 #else
 	if (cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0)
 #endif
@@ -1909,11 +1907,10 @@
 	    out_str(T_OP);
 	    screen_attr = -1;
 	}
-	if (cterm_normal_fg_bold)
-	{
-	    out_str(T_ME);
-	    screen_attr = -1;
-	}
+    if (cterm_normal_fg_bold)
+    {
+	out_str(T_ME);
+	screen_attr = -1;
     }
 }
 
@@ -2954,223 +2951,223 @@
     // Can't use ScreenLines unless initialized
     if (ScreenLines == NULL)
 	return;
-    if (col != screen_cur_col || row != screen_cur_row)
-    {
-	// Check for valid position.
-	if (row < 0)	// window without text lines?
-	    row = 0;
-	if (row >= screen_Rows)
-	    row = screen_Rows - 1;
-	if (col >= screen_Columns)
-	    col = screen_Columns - 1;
+    if (col == screen_cur_col && row == screen_cur_row)
+	return;
 
-	// check if no cursor movement is allowed in highlight mode
-	if (screen_attr && *T_MS == NUL)
-	    noinvcurs = HIGHL_COST;
-	else
-	    noinvcurs = 0;
-	goto_cost = GOTO_COST + noinvcurs;
+    // Check for valid position.
+    if (row < 0)	// window without text lines?
+	row = 0;
+    if (row >= screen_Rows)
+	row = screen_Rows - 1;
+    if (col >= screen_Columns)
+	col = screen_Columns - 1;
+
+    // check if no cursor movement is allowed in highlight mode
+    if (screen_attr && *T_MS == NUL)
+	noinvcurs = HIGHL_COST;
+    else
+	noinvcurs = 0;
+    goto_cost = GOTO_COST + noinvcurs;
+
+    /*
+     * Plan how to do the positioning:
+     * 1. Use CR to move it to column 0, same row.
+     * 2. Use T_LE to move it a few columns to the left.
+     * 3. Use NL to move a few lines down, column 0.
+     * 4. Move a few columns to the right with T_ND or by writing chars.
+     *
+     * Don't do this if the cursor went beyond the last column, the cursor
+     * position is unknown then (some terminals wrap, some don't )
+     *
+     * First check if the highlighting attributes allow us to write
+     * characters to move the cursor to the right.
+     */
+    if (row >= screen_cur_row && screen_cur_col < Columns)
+    {
+	/*
+	 * If the cursor is in the same row, bigger col, we can use CR
+	 * or T_LE.
+	 */
+	bs = NULL;			    // init for GCC
+	attr = screen_attr;
+	if (row == screen_cur_row && col < screen_cur_col)
+	{
+	    // "le" is preferred over "bc", because "bc" is obsolete
+	    if (*T_LE)
+		bs = T_LE;		    // "cursor left"
+	    else
+		bs = T_BC;		    // "backspace character (old)
+	    if (*bs)
+		cost = (screen_cur_col - col) * (int)STRLEN(bs);
+	    else
+		cost = 999;
+	    if (col + 1 < cost)	    // using CR is less characters
+	    {
+		plan = PLAN_CR;
+		wouldbe_col = 0;
+		cost = 1;		    // CR is just one character
+	    }
+	    else
+	    {
+		plan = PLAN_LE;
+		wouldbe_col = col;
+	    }
+	    if (noinvcurs)		    // will stop highlighting
+	    {
+		cost += noinvcurs;
+		attr = 0;
+	    }
+	}
 
 	/*
-	 * Plan how to do the positioning:
-	 * 1. Use CR to move it to column 0, same row.
-	 * 2. Use T_LE to move it a few columns to the left.
-	 * 3. Use NL to move a few lines down, column 0.
-	 * 4. Move a few columns to the right with T_ND or by writing chars.
-	 *
-	 * Don't do this if the cursor went beyond the last column, the cursor
-	 * position is unknown then (some terminals wrap, some don't )
-	 *
-	 * First check if the highlighting attributes allow us to write
-	 * characters to move the cursor to the right.
+	 * If the cursor is above where we want to be, we can use CR LF.
 	 */
-	if (row >= screen_cur_row && screen_cur_col < Columns)
+	else if (row > screen_cur_row)
+	{
+	    plan = PLAN_NL;
+	    wouldbe_col = 0;
+	    cost = (row - screen_cur_row) * 2;  // CR LF
+	    if (noinvcurs)		    // will stop highlighting
+	    {
+		cost += noinvcurs;
+		attr = 0;
+	    }
+	}
+
+	/*
+	 * If the cursor is in the same row, smaller col, just use write.
+	 */
+	else
+	{
+	    plan = PLAN_WRITE;
+	    wouldbe_col = screen_cur_col;
+	    cost = 0;
+	}
+
+	/*
+	 * Check if any characters that need to be written have the
+	 * correct attributes.  Also avoid UTF-8 characters.
+	 */
+	i = col - wouldbe_col;
+	if (i > 0)
+	    cost += i;
+	if (cost < goto_cost && i > 0)
 	{
 	    /*
-	     * If the cursor is in the same row, bigger col, we can use CR
-	     * or T_LE.
+	     * Check if the attributes are correct without additionally
+	     * stopping highlighting.
 	     */
-	    bs = NULL;			    // init for GCC
-	    attr = screen_attr;
-	    if (row == screen_cur_row && col < screen_cur_col)
-	    {
-		// "le" is preferred over "bc", because "bc" is obsolete
-		if (*T_LE)
-		    bs = T_LE;		    // "cursor left"
-		else
-		    bs = T_BC;		    // "backspace character (old)
-		if (*bs)
-		    cost = (screen_cur_col - col) * (int)STRLEN(bs);
-		else
-		    cost = 999;
-		if (col + 1 < cost)	    // using CR is less characters
-		{
-		    plan = PLAN_CR;
-		    wouldbe_col = 0;
-		    cost = 1;		    // CR is just one character
-		}
-		else
-		{
-		    plan = PLAN_LE;
-		    wouldbe_col = col;
-		}
-		if (noinvcurs)		    // will stop highlighting
-		{
-		    cost += noinvcurs;
-		    attr = 0;
-		}
-	    }
-
-	    /*
-	     * If the cursor is above where we want to be, we can use CR LF.
-	     */
-	    else if (row > screen_cur_row)
-	    {
-		plan = PLAN_NL;
-		wouldbe_col = 0;
-		cost = (row - screen_cur_row) * 2;  // CR LF
-		if (noinvcurs)		    // will stop highlighting
-		{
-		    cost += noinvcurs;
-		    attr = 0;
-		}
-	    }
-
-	    /*
-	     * If the cursor is in the same row, smaller col, just use write.
-	     */
-	    else
-	    {
-		plan = PLAN_WRITE;
-		wouldbe_col = screen_cur_col;
-		cost = 0;
-	    }
-
-	    /*
-	     * Check if any characters that need to be written have the
-	     * correct attributes.  Also avoid UTF-8 characters.
-	     */
-	    i = col - wouldbe_col;
-	    if (i > 0)
-		cost += i;
-	    if (cost < goto_cost && i > 0)
+	    p = ScreenAttrs + LineOffset[row] + wouldbe_col;
+	    while (i && *p++ == attr)
+		--i;
+	    if (i != 0)
 	    {
 		/*
-		 * Check if the attributes are correct without additionally
-		 * stopping highlighting.
+		 * Try if it works when highlighting is stopped here.
 		 */
-		p = ScreenAttrs + LineOffset[row] + wouldbe_col;
-		while (i && *p++ == attr)
-		    --i;
+		if (*--p == 0)
+		{
+		    cost += noinvcurs;
+		    while (i && *p++ == 0)
+			--i;
+		}
 		if (i != 0)
-		{
-		    /*
-		     * Try if it works when highlighting is stopped here.
-		     */
-		    if (*--p == 0)
-		    {
-			cost += noinvcurs;
-			while (i && *p++ == 0)
-			    --i;
-		    }
-		    if (i != 0)
-			cost = 999;	// different attributes, don't do it
-		}
-		if (enc_utf8)
-		{
-		    // Don't use an UTF-8 char for positioning, it's slow.
-		    for (i = wouldbe_col; i < col; ++i)
-			if (ScreenLinesUC[LineOffset[row] + i] != 0)
-			{
-			    cost = 999;
-			    break;
-			}
-		}
+		    cost = 999;	// different attributes, don't do it
 	    }
-
-	    /*
-	     * We can do it without term_windgoto()!
-	     */
-	    if (cost < goto_cost)
+	    if (enc_utf8)
 	    {
-		if (plan == PLAN_LE)
-		{
-		    if (noinvcurs)
-			screen_stop_highlight();
-		    while (screen_cur_col > col)
+		// Don't use an UTF-8 char for positioning, it's slow.
+		for (i = wouldbe_col; i < col; ++i)
+		    if (ScreenLinesUC[LineOffset[row] + i] != 0)
 		    {
-			out_str(bs);
-			--screen_cur_col;
+			cost = 999;
+			break;
 		    }
-		}
-		else if (plan == PLAN_CR)
-		{
-		    if (noinvcurs)
-			screen_stop_highlight();
-		    out_char('\r');
-		    screen_cur_col = 0;
-		}
-		else if (plan == PLAN_NL)
-		{
-		    if (noinvcurs)
-			screen_stop_highlight();
-		    while (screen_cur_row < row)
-		    {
-			out_char('\n');
-			++screen_cur_row;
-		    }
-		    screen_cur_col = 0;
-		}
+	    }
+	}
 
-		i = col - screen_cur_col;
-		if (i > 0)
+	/*
+	 * We can do it without term_windgoto()!
+	 */
+	if (cost < goto_cost)
+	{
+	    if (plan == PLAN_LE)
+	    {
+		if (noinvcurs)
+		    screen_stop_highlight();
+		while (screen_cur_col > col)
 		{
-		    /*
-		     * Use cursor-right if it's one character only.  Avoids
-		     * removing a line of pixels from the last bold char, when
-		     * using the bold trick in the GUI.
-		     */
-		    if (T_ND[0] != NUL && T_ND[1] == NUL)
-		    {
-			while (i-- > 0)
-			    out_char(*T_ND);
-		    }
-		    else
-		    {
-			int	off;
+		    out_str(bs);
+		    --screen_cur_col;
+		}
+	    }
+	    else if (plan == PLAN_CR)
+	    {
+		if (noinvcurs)
+		    screen_stop_highlight();
+		out_char('\r');
+		screen_cur_col = 0;
+	    }
+	    else if (plan == PLAN_NL)
+	    {
+		if (noinvcurs)
+		    screen_stop_highlight();
+		while (screen_cur_row < row)
+		{
+		    out_char('\n');
+		    ++screen_cur_row;
+		}
+		screen_cur_col = 0;
+	    }
 
-			off = LineOffset[row] + screen_cur_col;
-			while (i-- > 0)
-			{
-			    if (ScreenAttrs[off] != screen_attr)
-				screen_stop_highlight();
-			    out_flush_check();
-			    out_char(ScreenLines[off]);
-			    if (enc_dbcs == DBCS_JPNU
-						  && ScreenLines[off] == 0x8e)
-				out_char(ScreenLines2[off]);
-			    ++off;
-			}
+	    i = col - screen_cur_col;
+	    if (i > 0)
+	    {
+		/*
+		 * Use cursor-right if it's one character only.  Avoids
+		 * removing a line of pixels from the last bold char, when
+		 * using the bold trick in the GUI.
+		 */
+		if (T_ND[0] != NUL && T_ND[1] == NUL)
+		{
+		    while (i-- > 0)
+			out_char(*T_ND);
+		}
+		else
+		{
+		    int	off;
+
+		    off = LineOffset[row] + screen_cur_col;
+		    while (i-- > 0)
+		    {
+			if (ScreenAttrs[off] != screen_attr)
+			    screen_stop_highlight();
+			out_flush_check();
+			out_char(ScreenLines[off]);
+			if (enc_dbcs == DBCS_JPNU
+				&& ScreenLines[off] == 0x8e)
+			    out_char(ScreenLines2[off]);
+			++off;
 		    }
 		}
 	    }
 	}
-	else
-	    cost = 999;
-
-	if (cost >= goto_cost)
-	{
-	    if (noinvcurs)
-		screen_stop_highlight();
-	    if (row == screen_cur_row && (col > screen_cur_col)
-							     && *T_CRI != NUL)
-		term_cursor_right(col - screen_cur_col);
-	    else
-		term_windgoto(row, col);
-	}
-	screen_cur_row = row;
-	screen_cur_col = col;
     }
+    else
+	cost = 999;
+
+    if (cost >= goto_cost)
+    {
+	if (noinvcurs)
+	    screen_stop_highlight();
+	if (row == screen_cur_row && (col > screen_cur_col)
+		&& *T_CRI != NUL)
+	    term_cursor_right(col - screen_cur_col);
+	else
+	    term_windgoto(row, col);
+    }
+    screen_cur_row = row;
+    screen_cur_col = col;
 }
 
 /*
@@ -4222,13 +4219,13 @@
 recording_mode(int attr)
 {
     msg_puts_attr(_("recording"), attr);
-    if (!shortmess(SHM_RECORDING))
-    {
-	char s[4];
+    if (shortmess(SHM_RECORDING))
+	return;
 
-	sprintf(s, " @%c", reg_recording);
-	msg_puts_attr(s, attr);
-    }
+    char s[4];
+
+    sprintf(s, " @%c", reg_recording);
+    msg_puts_attr(s, attr);
 }
 
 /*
