12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067 |
- local t = require('test.testutil')
- local n = require('test.functional.testnvim')()
- local tt = require('test.functional.testterm')
- local feed, clear = n.feed, n.clear
- local testprg, command = n.testprg, n.command
- local eq, eval = t.eq, n.eval
- local matches = t.matches
- local call = n.call
- local hide_cursor = tt.hide_cursor
- local show_cursor = tt.show_cursor
- local is_os = t.is_os
- local skip = t.skip
- describe(':terminal cursor', function()
- local screen
- local terminal_mode_idx ---@type number
- before_each(function()
- clear()
- screen = tt.setup_screen()
- if terminal_mode_idx == nil then
- for i, v in ipairs(screen._mode_info) do
- if v.name == 'terminal' then
- terminal_mode_idx = i
- end
- end
- assert(terminal_mode_idx)
- end
- end)
- it('moves the screen cursor when focused', function()
- tt.feed_data('testing cursor')
- screen:expect([[
- tty ready |
- testing cursor^ |
- |*4
- {3:-- TERMINAL --} |
- ]])
- end)
- it('is highlighted when not focused', function()
- feed('<c-\\><c-n>')
- screen:expect([[
- tty ready |
- ^ |
- |*5
- ]])
- end)
- describe('with number column', function()
- before_each(function()
- feed('<c-\\><c-n>:set number<cr>')
- end)
- it('is positioned correctly when unfocused', function()
- screen:expect([[
- {7: 1 }tty ready |
- {7: 2 }^rows: 6, cols: 46 |
- {7: 3 } |
- {7: 4 } |
- {7: 5 } |
- {7: 6 } |
- :set number |
- ]])
- end)
- it('is positioned correctly when focused', function()
- screen:expect([[
- {7: 1 }tty ready |
- {7: 2 }^rows: 6, cols: 46 |
- {7: 3 } |
- {7: 4 } |
- {7: 5 } |
- {7: 6 } |
- :set number |
- ]])
- feed('i')
- n.poke_eventloop()
- screen:expect([[
- {7: 1 }tty ready |
- {7: 2 }rows: 6, cols: 46 |
- {7: 3 }^ |
- {7: 4 } |
- {7: 5 } |
- {7: 6 } |
- {3:-- TERMINAL --} |
- ]])
- end)
- end)
- describe('when invisible', function()
- it('is not highlighted', function()
- skip(is_os('win'), '#31587')
- hide_cursor()
- screen:expect([[
- tty ready |
- |*5
- {3:-- TERMINAL --} |
- ]])
- show_cursor()
- screen:expect([[
- tty ready |
- ^ |
- |*4
- {3:-- TERMINAL --} |
- ]])
- -- same for when the terminal is unfocused
- feed('<c-\\><c-n>')
- hide_cursor()
- screen:expect({
- grid = [[
- tty ready |
- ^ |
- |*5
- ]],
- unchanged = true,
- })
- show_cursor()
- screen:expect({
- grid = [[
- tty ready |
- ^ |
- |*5
- ]],
- unchanged = true,
- })
- end)
- it('becomes visible when exiting Terminal mode', function()
- skip(is_os('win'), '#31587')
- hide_cursor()
- screen:expect([[
- tty ready |
- |*5
- {3:-- TERMINAL --} |
- ]])
- feed('<c-\\><c-n>')
- screen:expect([[
- tty ready |
- ^ |
- |*5
- ]])
- feed('i')
- screen:expect([[
- tty ready |
- |*5
- {3:-- TERMINAL --} |
- ]])
- end)
- end)
- it('can be modified by application #3681 #31685', function()
- skip(is_os('win'), '#31587')
- local states = {
- [1] = { blink = true, shape = 'block' },
- [2] = { blink = false, shape = 'block' },
- [3] = { blink = true, shape = 'horizontal' },
- [4] = { blink = false, shape = 'horizontal' },
- [5] = { blink = true, shape = 'vertical' },
- [6] = { blink = false, shape = 'vertical' },
- }
- for k, v in pairs(states) do
- tt.feed_csi(('%d q'):format(k))
- screen:expect({
- grid = [[
- tty ready |
- ^ |
- |*4
- {3:-- TERMINAL --} |
- ]],
- condition = function()
- if v.blink then
- eq(500, screen._mode_info[terminal_mode_idx].blinkon)
- eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
- else
- eq(0, screen._mode_info[terminal_mode_idx].blinkon)
- eq(0, screen._mode_info[terminal_mode_idx].blinkoff)
- end
- eq(v.shape, screen._mode_info[terminal_mode_idx].cursor_shape)
- -- Cell percentages are hard coded for each shape in terminal.c
- if v.shape == 'horizontal' then
- eq(20, screen._mode_info[terminal_mode_idx].cell_percentage)
- elseif v.shape == 'vertical' then
- eq(25, screen._mode_info[terminal_mode_idx].cell_percentage)
- end
- end,
- })
- end
- feed([[<C-\><C-N>]])
- screen:expect([[
- tty ready |
- ^ |
- |*5
- ]])
- -- Cursor returns to default on TermLeave
- eq(500, screen._mode_info[terminal_mode_idx].blinkon)
- eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
- eq('block', screen._mode_info[terminal_mode_idx].cursor_shape)
- end)
- it('can be modified per terminal', function()
- skip(is_os('win'), '#31587')
- -- Set cursor to vertical bar with blink
- tt.feed_csi('5 q')
- screen:expect({
- grid = [[
- tty ready |
- ^ |
- |*4
- {3:-- TERMINAL --} |
- ]],
- condition = function()
- eq(500, screen._mode_info[terminal_mode_idx].blinkon)
- eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
- eq('vertical', screen._mode_info[terminal_mode_idx].cursor_shape)
- end,
- })
- tt.hide_cursor()
- screen:expect({
- grid = [[
- tty ready |
- |
- |*4
- {3:-- TERMINAL --} |
- ]],
- condition = function()
- eq(500, screen._mode_info[terminal_mode_idx].blinkon)
- eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
- eq('vertical', screen._mode_info[terminal_mode_idx].cursor_shape)
- end,
- })
- -- Exit terminal mode to reset terminal cursor settings to default and
- -- create a new terminal window
- feed([[<C-\><C-N>]])
- command('set statusline=~~~')
- command('new')
- call('jobstart', { testprg('tty-test') }, { term = true })
- feed('i')
- screen:expect({
- grid = [[
- tty ready |
- ^ |
- {17:~~~ }|
- rows: 2, cols: 50 |
- |
- {18:~~~ }|
- {3:-- TERMINAL --} |
- ]],
- condition = function()
- -- New terminal, cursor resets to defaults
- eq(500, screen._mode_info[terminal_mode_idx].blinkon)
- eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
- eq('block', screen._mode_info[terminal_mode_idx].cursor_shape)
- end,
- })
- -- Set cursor to underline, no blink
- tt.feed_csi('4 q')
- screen:expect({
- grid = [[
- tty ready |
- ^ |
- {17:~~~ }|
- rows: 2, cols: 50 |
- |
- {18:~~~ }|
- {3:-- TERMINAL --} |
- ]],
- condition = function()
- eq(0, screen._mode_info[terminal_mode_idx].blinkon)
- eq(0, screen._mode_info[terminal_mode_idx].blinkoff)
- eq('horizontal', screen._mode_info[terminal_mode_idx].cursor_shape)
- end,
- })
- -- Switch back to first terminal, cursor should still be hidden
- command('wincmd p')
- screen:expect({
- grid = [[
- tty ready |
- |
- {18:~~~ }|
- rows: 2, cols: 50 |
- |
- {17:~~~ }|
- {3:-- TERMINAL --} |
- ]],
- condition = function()
- eq(500, screen._mode_info[terminal_mode_idx].blinkon)
- eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
- eq('vertical', screen._mode_info[terminal_mode_idx].cursor_shape)
- end,
- })
- end)
- it('can be positioned arbitrarily', function()
- clear()
- screen = tt.setup_child_nvim({
- '-u',
- 'NONE',
- '-i',
- 'NONE',
- '--cmd',
- n.nvim_set .. ' noshowmode',
- })
- screen:expect([[
- ^ |
- ~ |*4
- |
- {3:-- TERMINAL --} |
- ]])
- feed('i<Tab>')
- screen:expect([[
- ^ |
- ~ |*4
- |
- {3:-- TERMINAL --} |
- ]])
- end)
- it('preserves guicursor value on TermLeave #31612', function()
- eq(3, screen._mode_info[terminal_mode_idx].hl_id)
- -- Change 'guicursor' while terminal mode is active
- command('set guicursor+=t:Error')
- local error_hl_id = call('hlID', 'Error')
- screen:expect({
- condition = function()
- eq(error_hl_id, screen._mode_info[terminal_mode_idx].hl_id)
- end,
- })
- -- Exit terminal mode
- feed([[<C-\><C-N>]])
- screen:expect([[
- tty ready |
- ^ |
- |*5
- ]])
- eq(error_hl_id, screen._mode_info[terminal_mode_idx].hl_id)
- end)
- end)
- describe('buffer cursor position is correct in terminal without number column', function()
- local screen
- local function setup_ex_register(str)
- screen = tt.setup_child_nvim({
- '-u',
- 'NONE',
- '-i',
- 'NONE',
- '-E',
- '--cmd',
- string.format('let @r = "%s"', str),
- -- <Left> and <Right> don't always work
- '--cmd',
- 'cnoremap <C-X> <Left>',
- '--cmd',
- 'cnoremap <C-O> <Right>',
- '--cmd',
- 'set notermguicolors',
- }, {
- cols = 70,
- })
- -- Also check for real cursor position, as it is used for stuff like input methods
- screen._handle_busy_start = function() end
- screen._handle_busy_stop = function() end
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :^ |
- {3:-- TERMINAL --} |
- ]])
- end
- before_each(clear)
- describe('in a line with no multibyte chars or trailing spaces,', function()
- before_each(function()
- setup_ex_register('aaaaaaaa')
- end)
- it('at the end', function()
- feed('<C-R>r')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :aaaaaaaa^ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 9 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :aaaaaaa^a |
- |
- ]])
- eq({ 6, 8 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the end', function()
- feed('<C-R>r<C-X><C-X>')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :aaaaaa^aa |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 7 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :aaaaa^aaa |
- |
- ]])
- eq({ 6, 6 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the start', function()
- feed('<C-R>r<C-B><C-O>')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :a^aaaaaaa |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 2 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :^aaaaaaaa |
- |
- ]])
- eq({ 6, 1 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
- describe('in a line with single-cell multibyte chars and no trailing spaces,', function()
- before_each(function()
- setup_ex_register('µµµµµµµµ')
- end)
- it('at the end', function()
- feed('<C-R>r')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µµµµµµµµ^ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 17 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µµµµµµµ^µ |
- |
- ]])
- eq({ 6, 15 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the end', function()
- feed('<C-R>r<C-X><C-X>')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µµµµµµ^µµ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 13 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µµµµµ^µµµ |
- |
- ]])
- eq({ 6, 11 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the start', function()
- feed('<C-R>r<C-B><C-O>')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µ^µµµµµµµ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 3 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :^µµµµµµµµ |
- |
- ]])
- eq({ 6, 1 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
- describe('in a line with single-cell composed multibyte chars and no trailing spaces,', function()
- before_each(function()
- setup_ex_register('µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳')
- end)
- it('at the end', function()
- feed('<C-R>r')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳^ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 33 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µ̳µ̳µ̳µ̳µ̳µ̳µ̳^µ̳ |
- |
- ]])
- eq({ 6, 29 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the end', function()
- skip(is_os('win'))
- feed('<C-R>r<C-X><C-X>')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µ̳µ̳µ̳µ̳µ̳µ̳^µ̳µ̳ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 25 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µ̳µ̳µ̳µ̳µ̳^µ̳µ̳µ̳ |
- |
- ]])
- eq({ 6, 21 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the start', function()
- skip(is_os('win'))
- feed('<C-R>r<C-B><C-O>')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :µ̳^µ̳µ̳µ̳µ̳µ̳µ̳µ̳ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 5 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :^µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳ |
- |
- ]])
- eq({ 6, 1 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
- describe('in a line with double-cell multibyte chars and no trailing spaces,', function()
- before_each(function()
- setup_ex_register('哦哦哦哦哦哦哦哦')
- end)
- it('at the end', function()
- feed('<C-R>r')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :哦哦哦哦哦哦哦哦^ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 25 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :哦哦哦哦哦哦哦^哦 |
- |
- ]])
- eq({ 6, 22 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the end', function()
- feed('<C-R>r<C-X><C-X>')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :哦哦哦哦哦哦^哦哦 |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 19 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :哦哦哦哦哦^哦哦哦 |
- |
- ]])
- eq({ 6, 16 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the start', function()
- feed('<C-R>r<C-B><C-O>')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :哦^哦哦哦哦哦哦哦 |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 4 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :^哦哦哦哦哦哦哦哦 |
- |
- ]])
- eq({ 6, 1 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
- it('at the end of a line with trailing spaces #16234', function()
- setup_ex_register('aaaaaaaa ')
- feed('<C-R>r')
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :aaaaaaaa ^ |
- {3:-- TERMINAL --} |
- ]])
- matches('^:aaaaaaaa [ ]*$', eval('nvim_get_current_line()'))
- eq({ 6, 13 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- |*4
- Entering Ex mode. Type "visual" to go to Normal mode. |
- :aaaaaaaa ^ |
- |
- ]])
- eq({ 6, 12 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
- describe('buffer cursor position is correct in terminal with number column', function()
- local screen
- local function setup_ex_register(str)
- screen = tt.setup_child_nvim({
- '-u',
- 'NONE',
- '-i',
- 'NONE',
- '-E',
- '--cmd',
- string.format('let @r = "%s"', str),
- -- <Left> and <Right> don't always work
- '--cmd',
- 'cnoremap <C-X> <Left>',
- '--cmd',
- 'cnoremap <C-O> <Right>',
- '--cmd',
- 'set notermguicolors',
- }, {
- cols = 70,
- })
- -- Also check for real cursor position, as it is used for stuff like input methods
- screen._handle_busy_start = function() end
- screen._handle_busy_stop = function() end
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:^ |
- {3:-- TERMINAL --} |
- ]])
- end
- before_each(function()
- clear()
- command('au TermOpen * set number')
- end)
- describe('in a line with no multibyte chars or trailing spaces,', function()
- before_each(function()
- setup_ex_register('aaaaaaaa')
- end)
- it('at the end', function()
- feed('<C-R>r')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:aaaaaaaa^ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 9 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:aaaaaaa^a |
- |
- ]])
- eq({ 6, 8 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the end', function()
- feed('<C-R>r<C-X><C-X>')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:aaaaaa^aa |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 7 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:aaaaa^aaa |
- |
- ]])
- eq({ 6, 6 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the start', function()
- feed('<C-R>r<C-B><C-O>')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:a^aaaaaaa |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 2 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:^aaaaaaaa |
- |
- ]])
- eq({ 6, 1 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
- describe('in a line with single-cell multibyte chars and no trailing spaces,', function()
- before_each(function()
- setup_ex_register('µµµµµµµµ')
- end)
- it('at the end', function()
- feed('<C-R>r')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µµµµµµµµ^ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 17 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µµµµµµµ^µ |
- |
- ]])
- eq({ 6, 15 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the end', function()
- feed('<C-R>r<C-X><C-X>')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µµµµµµ^µµ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 13 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µµµµµ^µµµ |
- |
- ]])
- eq({ 6, 11 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the start', function()
- feed('<C-R>r<C-B><C-O>')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µ^µµµµµµµ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 3 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:^µµµµµµµµ |
- |
- ]])
- eq({ 6, 1 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
- describe('in a line with single-cell composed multibyte chars and no trailing spaces,', function()
- before_each(function()
- setup_ex_register('µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳')
- end)
- it('at the end', function()
- feed('<C-R>r')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳^ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 33 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µ̳µ̳µ̳µ̳µ̳µ̳µ̳^µ̳ |
- |
- ]])
- eq({ 6, 29 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the end', function()
- skip(is_os('win'))
- feed('<C-R>r<C-X><C-X>')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µ̳µ̳µ̳µ̳µ̳µ̳^µ̳µ̳ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 25 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µ̳µ̳µ̳µ̳µ̳^µ̳µ̳µ̳ |
- |
- ]])
- eq({ 6, 21 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the start', function()
- skip(is_os('win'))
- feed('<C-R>r<C-B><C-O>')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:µ̳^µ̳µ̳µ̳µ̳µ̳µ̳µ̳ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 5 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:^µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳ |
- |
- ]])
- eq({ 6, 1 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
- describe('in a line with double-cell multibyte chars and no trailing spaces,', function()
- before_each(function()
- setup_ex_register('哦哦哦哦哦哦哦哦')
- end)
- it('at the end', function()
- feed('<C-R>r')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:哦哦哦哦哦哦哦哦^ |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 25 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:哦哦哦哦哦哦哦^哦 |
- |
- ]])
- eq({ 6, 22 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the end', function()
- feed('<C-R>r<C-X><C-X>')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:哦哦哦哦哦哦^哦哦 |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 19 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:哦哦哦哦哦^哦哦哦 |
- |
- ]])
- eq({ 6, 16 }, eval('nvim_win_get_cursor(0)'))
- end)
- it('near the start', function()
- feed('<C-R>r<C-B><C-O>')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:哦^哦哦哦哦哦哦哦 |
- {3:-- TERMINAL --} |
- ]])
- eq({ 6, 4 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:^哦哦哦哦哦哦哦哦 |
- |
- ]])
- eq({ 6, 1 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
- it('at the end of a line with trailing spaces #16234', function()
- setup_ex_register('aaaaaaaa ')
- feed('<C-R>r')
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:aaaaaaaa ^ |
- {3:-- TERMINAL --} |
- ]])
- matches('^:aaaaaaaa [ ]*$', eval('nvim_get_current_line()'))
- eq({ 6, 13 }, eval('nvim_win_get_cursor(0)'))
- feed([[<C-\><C-N>]])
- screen:expect([[
- {7: 1 } |
- {7: 2 } |
- {7: 3 } |
- {7: 4 } |
- {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
- {7: 6 }:aaaaaaaa ^ |
- |
- ]])
- eq({ 6, 12 }, eval('nvim_win_get_cursor(0)'))
- end)
- end)
|