1

Мне нравится использовать функцию virtualedit = all в Vim, но мне также нравится возможность щелкать мышью после конца строки и переводить курсор прямо в конец строки (вместо того, чтобы перейти к той позиции, на которой я щелкнул). Есть ли плагин или что-то, что может сделать размещение курсора Vim после щелчка мышью более разумным? В идеале я хотел бы сделать одно из следующего:

  • Игнорировать предпочтение virtualedit при щелчке мышью: при щелчке мышью, если щелчок произошел после последнего символа в строке, Vim поместит курсор в конец строки независимо от того, включен ли virtualedit.
  • Зависимое от режима поведение щелчка мыши: в обычном режиме щелчок мыши после конца строки приводит к тому, что курсор переходит к последнему символу; в режиме вставки курсор находится под мышью.
  • Поведение в стиле MS-Word (предпочтительный): курсор переходит к концу строки одним щелчком мыши или в виртуальную позицию при двойном щелчке

Я знаю, что могу просто переключиться с virtualedit-all на virtualedit-block, но я предпочитаю virtualedit = all для всего, кроме поведения щелчка мышью. (На самом деле, мне даже нравится иметь возможность размещать курсор в середине символа табуляции с помощью щелчка мыши, так что на самом деле это просто поведение нажатия после последнего символа в строке.)

PS Пожалуйста, без комментариев или ответов, предлагающих мне просто научить себя не пользоваться мышью. Использование мыши - одна из причин, по которой я переключился с Vim на gVim, потому что, честно говоря, иногда это чрезвычайно удобно, даже если ваш основной метод перемещения в файле - только с клавиатуры.

РЕДАКТИРОВАТЬ: Добавлена идея, зависящая от режима.

1 ответ1

1

Щелчки мышью сопоставимы так же, как нажатия клавиш в Vim. Таким образом, вы можете переназначить щелчок мыши, чтобы установить virtualedit, как вам нравится, затем сделать щелчок мышью, а затем установить его обратно.

Режим вставки является более сложным, чем я хотел бы попробовать в данный момент, но обычный режим прост. Нечто подобное должно работать, хотя было бы даже лучше сохранить и восстановить virtualedit, чем устанавливать его явно:

nnoremap <silent> <LeftMouse> :set virtualedit=<CR><LeftMouse>:set virtualedit=all<CR>

Также возможно переназначить двойной щелчок аналогичным образом, используя <2-LeftMouse> вместо <LeftMouse> . Некоторые эксперименты показали, что в этом нет необходимости. Но так как двойной щелчок по умолчанию переводит вас в режим визуального выбора, вам может потребоваться такое отображение:

nnoremap <silent> <2-LeftMouse> <LeftMouse>

Однако я не мог заставить это работать. Я не мог понять, как заставить его оставаться вне визуального режима, даже с этим сопоставлением и несколькими подобными приложениями.


РЕДАКТИРОВАТЬ (по OP; я хочу опубликовать свое "окончательное" решение здесь, чтобы другие могли его увидеть, но я не хочу публиковать отдельный ответ, так как этот ответ действительно тот, который мне нужен):

Вот что я положил в свой .vimrc:

function! TempNonVirtual()
    let g:oldvirtualedit=&virtualedit
    set virtualedit=
endfunction
function! RestoreVirtual()
    let &virtualedit=g:oldvirtualedit
endfunction
set virtualedit=all
nnoremap <silent> <LeftMouse> :call TempNonVirtual()<CR><LeftMouse>:call RestoreVirtual()<CR> 

Я хотел бы объединить эти две функции в одну функцию под названием NonVirtualClick или что-то, что сохранит старый параметр virtualedit, сделает щелчок, а затем восстановит параметр, но <LeftMouse> не является командой, поэтому она не работает внутри функции. (Советы о том, как обойти это было бы желательно ...)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .