aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2019-01-04 01:53:13 +0100
committerGitHub <noreply@github.com>2019-01-04 01:53:13 +0100
commitc403a95a5297c7d31af5bf9d518d6c6a345b0297 (patch)
treef17d73b2ecd502a2c30f8140a2f344da5012b348
parent103e02191237ab697fa694c6905173daa7023865 (diff)
parent37a499148ffda85a089042b4879fa0182c116f9f (diff)
downloadrneovim-c403a95a5297c7d31af5bf9d518d6c6a345b0297.tar.gz
rneovim-c403a95a5297c7d31af5bf9d518d6c6a345b0297.tar.bz2
rneovim-c403a95a5297c7d31af5bf9d518d6c6a345b0297.zip
Merge #9446 'Visual: highlight char-at-cursor'
-rw-r--r--runtime/doc/vim_diff.txt3
-rw-r--r--src/nvim/cursor_shape.c10
-rw-r--r--src/nvim/mouse.c1
-rw-r--r--src/nvim/normal.c26
-rw-r--r--src/nvim/screen.c23
-rw-r--r--test/functional/ui/highlight_spec.lua34
6 files changed, 63 insertions, 34 deletions
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index 3915763eed..db856ceb65 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -357,6 +357,9 @@ TUI:
and has a 'ttybuiltin' setting to control how that combination works. Nvim
uses one or the other, it does not attempt to merge the two.
+UI/Display:
+ |Visual| selection highlights the character at cursor. |visual-use|
+
VimL (Vim script) compatibility:
`count` does not alias to |v:count|
`errmsg` does not alias to |v:errmsg|
diff --git a/src/nvim/cursor_shape.c b/src/nvim/cursor_shape.c
index cf79005a37..5551576c6d 100644
--- a/src/nvim/cursor_shape.c
+++ b/src/nvim/cursor_shape.c
@@ -254,6 +254,16 @@ char_u *parse_shape_opt(int what)
return NULL;
}
+/// Returns true if the cursor is non-blinking "block" shape during
+/// visual selection.
+///
+/// @param exclusive If 'selection' option is "exclusive".
+bool cursor_is_block_during_visual(bool exclusive)
+{
+ int mode_idx = exclusive ? SHAPE_IDX_VE : SHAPE_IDX_V;
+ return (SHAPE_BLOCK == shape_table[mode_idx].shape
+ && 0 == shape_table[mode_idx].blinkon);
+}
/// Map cursor mode from string to integer
///
diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c
index 3790886194..bf71e6a479 100644
--- a/src/nvim/mouse.c
+++ b/src/nvim/mouse.c
@@ -319,7 +319,6 @@ retnomove:
// Start Visual mode before coladvance(), for when 'sel' != "old"
if ((flags & MOUSE_MAY_VIS) && !VIsual_active) {
- check_visual_highlight();
VIsual = old_cursor;
VIsual_active = true;
VIsual_reselect = true;
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index a050c95224..462b476a35 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -2761,10 +2761,9 @@ do_mouse (
} else if ((mod_mask & MOD_MASK_MULTI_CLICK) && (State & (NORMAL | INSERT))
&& mouse_has(MOUSE_VISUAL)) {
if (is_click || !VIsual_active) {
- if (VIsual_active)
+ if (VIsual_active) {
orig_cursor = VIsual;
- else {
- check_visual_highlight();
+ } else {
VIsual = curwin->w_cursor;
orig_cursor = VIsual;
VIsual_active = true;
@@ -2935,22 +2934,6 @@ static int get_mouse_class(char_u *p)
}
/*
- * Check if highlighting for visual mode is possible, give a warning message
- * if not.
- */
-void check_visual_highlight(void)
-{
- static bool did_check = false;
-
- if (full_screen) {
- if (!did_check && HL_ATTR(HLF_V) == 0) {
- MSG(_("Warning: terminal cannot highlight"));
- }
- did_check = true;
- }
-}
-
-/*
* End Visual mode.
* This function should ALWAYS be called to end Visual mode, except from
* do_pending_operator().
@@ -6418,9 +6401,8 @@ static void nv_visual(cmdarg_T *cap)
VIsual_mode = cap->cmdchar;
showmode();
}
- redraw_curbuf_later(INVERTED); /* update the inversion */
- } else { /* start Visual mode */
- check_visual_highlight();
+ redraw_curbuf_later(INVERTED); // update the inversion
+ } else { // start Visual mode
if (cap->count0 > 0 && resel_VIsual_mode != NUL) {
/* use previously selected part */
VIsual = curwin->w_cursor;
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 1e07bbb5e3..5166bc2e42 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -73,6 +73,7 @@
#include "nvim/buffer.h"
#include "nvim/charset.h"
#include "nvim/cursor.h"
+#include "nvim/cursor_shape.h"
#include "nvim/diff.h"
#include "nvim/eval.h"
#include "nvim/ex_cmds.h"
@@ -678,11 +679,10 @@ static void win_update(win_T *wp)
static int recursive = FALSE; /* being called recursively */
int old_botline = wp->w_botline;
long fold_count;
- /* remember what happened to the previous line, to know if
- * check_visual_highlight() can be used */
-#define DID_NONE 1 /* didn't update a line */
-#define DID_LINE 2 /* updated a normal line */
-#define DID_FOLD 3 /* updated a folded line */
+ // Remember what happened to the previous line.
+#define DID_NONE 1 // didn't update a line
+#define DID_LINE 2 // updated a normal line
+#define DID_FOLD 3 // updated a folded line
int did_update = DID_NONE;
linenr_T syntax_last_parsed = 0; /* last parsed text line */
linenr_T mod_top = 0;
@@ -2181,10 +2181,10 @@ win_line (
int syntax_attr = 0; /* attributes desired by syntax */
int has_syntax = FALSE; /* this buffer has syntax highl. */
int save_did_emsg;
- int eol_hl_off = 0; /* 1 if highlighted char after EOL */
- int draw_color_col = FALSE; /* highlight colorcolumn */
- int *color_cols = NULL; /* pointer to according columns array */
- bool has_spell = false; /* this buffer has spell checking */
+ int eol_hl_off = 0; // 1 if highlighted char after EOL
+ int draw_color_col = false; // highlight colorcolumn
+ int *color_cols = NULL; // pointer to according columns array
+ bool has_spell = false; // this buffer has spell checking
# define SPWORDLEN 150
char_u nextline[SPWORDLEN * 2]; /* text with start of the next line */
int nextlinecol = 0; /* column where nextline[] starts */
@@ -2390,8 +2390,9 @@ win_line (
}
}
- // Check if the character under the cursor should not be inverted
- if (!highlight_match && lnum == curwin->w_cursor.lnum && wp == curwin) {
+ // Check if the char under the cursor should be inverted (highlighted).
+ if (!highlight_match && lnum == curwin->w_cursor.lnum && wp == curwin
+ && cursor_is_block_during_visual(*p_sel == 'e')) {
noinvcur = true;
}
diff --git a/test/functional/ui/highlight_spec.lua b/test/functional/ui/highlight_spec.lua
index 96f6b43320..39170337d7 100644
--- a/test/functional/ui/highlight_spec.lua
+++ b/test/functional/ui/highlight_spec.lua
@@ -322,6 +322,40 @@ describe('highlight', function()
screen:attach()
end)
+ it('visual', function()
+ screen:detach()
+ screen = Screen.new(20,4)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {background = Screen.colors.LightGrey},
+ [2] = {bold = true, foreground = Screen.colors.Blue1},
+ [3] = {bold = true},
+ })
+ insert([[
+ line1 foo bar
+ ]])
+
+ -- Non-blinking block cursor: does NOT highlight char-at-cursor.
+ command('set guicursor=a:block-blinkon0')
+ feed('gg$vhhh')
+ screen:expect([[
+ line1 foo^ {1:bar} |
+ |
+ {2:~ }|
+ {3:-- VISUAL --} |
+ ]])
+
+ -- Vertical cursor: highlights char-at-cursor. #8983
+ command('set guicursor=a:block-blinkon175')
+ feed('<esc>gg$vhhh')
+ screen:expect([[
+ line1 foo{1:^ bar} |
+ |
+ {2:~ }|
+ {3:-- VISUAL --} |
+ ]])
+ end)
+
it('cterm=standout gui=standout', function()
screen:detach()
screen = Screen.new(20,5)