mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
Merge pull request #23612 from zeertzjq/vim-9.0.0064
vim-patch:9.0.{0064,0218,0249,0490,0492,0598}: cmdwin fixes
This commit is contained in:
@@ -1528,8 +1528,9 @@ void edit_unputchar(void)
|
|||||||
|
|
||||||
// Called when p_dollar is set: display a '$' at the end of the changed text
|
// Called when p_dollar is set: display a '$' at the end of the changed text
|
||||||
// Only works when cursor is in the line that changes.
|
// Only works when cursor is in the line that changes.
|
||||||
void display_dollar(colnr_T col)
|
void display_dollar(colnr_T col_arg)
|
||||||
{
|
{
|
||||||
|
colnr_T col = col_arg < 0 ? 0 : col_arg;
|
||||||
colnr_T save_col;
|
colnr_T save_col;
|
||||||
|
|
||||||
if (!redrawing()) {
|
if (!redrawing()) {
|
||||||
|
@@ -127,6 +127,7 @@ typedef struct command_line_state {
|
|||||||
int break_ctrl_c;
|
int break_ctrl_c;
|
||||||
expand_T xpc;
|
expand_T xpc;
|
||||||
long *b_im_ptr;
|
long *b_im_ptr;
|
||||||
|
buf_T *b_im_ptr_buf; ///< buffer where b_im_ptr is valid
|
||||||
} CommandLineState;
|
} CommandLineState;
|
||||||
|
|
||||||
typedef struct cmdpreview_win_info {
|
typedef struct cmdpreview_win_info {
|
||||||
@@ -736,7 +737,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool clea
|
|||||||
} else {
|
} else {
|
||||||
s->b_im_ptr = &curbuf->b_p_imsearch;
|
s->b_im_ptr = &curbuf->b_p_imsearch;
|
||||||
}
|
}
|
||||||
|
s->b_im_ptr_buf = curbuf;
|
||||||
if (*s->b_im_ptr == B_IMODE_LMAP) {
|
if (*s->b_im_ptr == B_IMODE_LMAP) {
|
||||||
State |= MODE_LANGMAP;
|
State |= MODE_LANGMAP;
|
||||||
}
|
}
|
||||||
@@ -1538,20 +1539,21 @@ static int command_line_erase_chars(CommandLineState *s)
|
|||||||
/// language :lmap mappings and/or Input Method.
|
/// language :lmap mappings and/or Input Method.
|
||||||
static void command_line_toggle_langmap(CommandLineState *s)
|
static void command_line_toggle_langmap(CommandLineState *s)
|
||||||
{
|
{
|
||||||
|
long *b_im_ptr = buf_valid(s->b_im_ptr_buf) ? s->b_im_ptr : NULL;
|
||||||
if (map_to_exists_mode("", MODE_LANGMAP, false)) {
|
if (map_to_exists_mode("", MODE_LANGMAP, false)) {
|
||||||
// ":lmap" mappings exists, toggle use of mappings.
|
// ":lmap" mappings exists, toggle use of mappings.
|
||||||
State ^= MODE_LANGMAP;
|
State ^= MODE_LANGMAP;
|
||||||
if (s->b_im_ptr != NULL) {
|
if (b_im_ptr != NULL) {
|
||||||
if (State & MODE_LANGMAP) {
|
if (State & MODE_LANGMAP) {
|
||||||
*s->b_im_ptr = B_IMODE_LMAP;
|
*b_im_ptr = B_IMODE_LMAP;
|
||||||
} else {
|
} else {
|
||||||
*s->b_im_ptr = B_IMODE_NONE;
|
*b_im_ptr = B_IMODE_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->b_im_ptr != NULL) {
|
if (b_im_ptr != NULL) {
|
||||||
if (s->b_im_ptr == &curbuf->b_p_iminsert) {
|
if (b_im_ptr == &curbuf->b_p_iminsert) {
|
||||||
set_iminsert_global(curbuf);
|
set_iminsert_global(curbuf);
|
||||||
} else {
|
} else {
|
||||||
set_imsearch_global(curbuf);
|
set_imsearch_global(curbuf);
|
||||||
|
@@ -107,6 +107,8 @@ static int VIsual_mode_orig = NUL; // saved Visual mode
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char e_changelist_is_empty[] = N_("E664: Changelist is empty");
|
static const char e_changelist_is_empty[] = N_("E664: Changelist is empty");
|
||||||
|
static const char e_cmdline_window_already_open[]
|
||||||
|
= N_("E1292: Command-line window is already open");
|
||||||
|
|
||||||
static inline void normal_state_init(NormalState *s)
|
static inline void normal_state_init(NormalState *s)
|
||||||
{
|
{
|
||||||
@@ -6372,6 +6374,10 @@ static void nv_record(cmdarg_T *cap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cap->nchar == ':' || cap->nchar == '/' || cap->nchar == '?') {
|
if (cap->nchar == ':' || cap->nchar == '/' || cap->nchar == '?') {
|
||||||
|
if (cmdwin_type != 0) {
|
||||||
|
emsg(_(e_cmdline_window_already_open));
|
||||||
|
return;
|
||||||
|
}
|
||||||
stuffcharReadbuff(cap->nchar);
|
stuffcharReadbuff(cap->nchar);
|
||||||
stuffcharReadbuff(K_CMDWIN);
|
stuffcharReadbuff(K_CMDWIN);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -2304,6 +2304,9 @@ static void win_equal_rec(win_T *next_curwin, bool current, frame_T *topfr, int
|
|||||||
}
|
}
|
||||||
if (hnc) { // add next_curwin size
|
if (hnc) { // add next_curwin size
|
||||||
next_curwin_size -= (int)p_wiw - (m - n);
|
next_curwin_size -= (int)p_wiw - (m - n);
|
||||||
|
if (next_curwin_size < 0) {
|
||||||
|
next_curwin_size = 0;
|
||||||
|
}
|
||||||
new_size += next_curwin_size;
|
new_size += next_curwin_size;
|
||||||
room -= new_size - next_curwin_size;
|
room -= new_size - next_curwin_size;
|
||||||
} else {
|
} else {
|
||||||
@@ -6686,7 +6689,8 @@ static int win_border_width(win_T *wp)
|
|||||||
/// Set the width of a window.
|
/// Set the width of a window.
|
||||||
void win_new_width(win_T *wp, int width)
|
void win_new_width(win_T *wp, int width)
|
||||||
{
|
{
|
||||||
wp->w_width = width;
|
// Should we give an error if width < 0?
|
||||||
|
wp->w_width = width < 0 ? 0 : width;
|
||||||
wp->w_pos_changed = true;
|
wp->w_pos_changed = true;
|
||||||
win_set_inner_size(wp, true);
|
win_set_inner_size(wp, true);
|
||||||
}
|
}
|
||||||
|
67
test/old/testdir/test_cmdwin.vim
Normal file
67
test/old/testdir/test_cmdwin.vim
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
" Tests for editing the command line.
|
||||||
|
|
||||||
|
source check.vim
|
||||||
|
source screendump.vim
|
||||||
|
|
||||||
|
|
||||||
|
func Test_cant_open_cmdwin_in_cmdwin()
|
||||||
|
try
|
||||||
|
call feedkeys("q:q::q\<CR>", "x!")
|
||||||
|
catch
|
||||||
|
let caught = v:exception
|
||||||
|
endtry
|
||||||
|
call assert_match('E1292:', caught)
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_cmdwin_virtual_edit()
|
||||||
|
enew!
|
||||||
|
set ve=all cpo+=$
|
||||||
|
silent normal q/s
|
||||||
|
|
||||||
|
set ve= cpo-=$
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Check that a :normal command can be used to stop Visual mode without side
|
||||||
|
" effects.
|
||||||
|
func Test_normal_escape()
|
||||||
|
call feedkeys("q:i\" foo\<Esc>:normal! \<C-V>\<Esc>\<CR>:\" bar\<CR>", 'ntx')
|
||||||
|
call assert_equal('" bar', @:)
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" This was using a pointer to a freed buffer
|
||||||
|
func Test_cmdwin_freed_buffer_ptr()
|
||||||
|
" this does not work on MS-Windows because renaming an open file fails
|
||||||
|
CheckNotMSWindows
|
||||||
|
|
||||||
|
au BufEnter * next 0| file
|
||||||
|
edit 0
|
||||||
|
silent! norm q/
|
||||||
|
|
||||||
|
au! BufEnter
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" This was resulting in a window with negative width.
|
||||||
|
" The test doesn't reproduce the illegal memory access though...
|
||||||
|
func Test_cmdwin_split_often()
|
||||||
|
let lines = &lines
|
||||||
|
let columns = &columns
|
||||||
|
set t_WS=
|
||||||
|
|
||||||
|
try
|
||||||
|
" set encoding=iso8859
|
||||||
|
set ruler
|
||||||
|
winsize 0 0
|
||||||
|
noremap 0 H
|
||||||
|
sil norm 0000000q:
|
||||||
|
catch /E36:/
|
||||||
|
endtry
|
||||||
|
|
||||||
|
bwipe!
|
||||||
|
set encoding=utf8
|
||||||
|
let &lines = lines
|
||||||
|
let &columns = columns
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
|
" vim: shiftwidth=2 sts=2 expandtab
|
Reference in New Issue
Block a user