Покращити поведінку миші за допомогою віртуального редагування gVim


1

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

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

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

P.S. Будь ласка, будь-які коментарі та відповіді, які я пропоную, я просто навчаю себе не використовувати мишу. Використання миші - одна з причин, з якої я перейшов з Vim на gVim, тому що відверто іноді дуже зручно, навіть якщо ваш основний метод переміщення у файлі є тільки клавіатурою.

EDIT: Додано залежну від режиму ідею.

Відповіді:


1

Натискання миші відображаються так само, як натискання клавіш у Vim. Таким чином, ви можете перепризначити клацання миші, щоб встановити віртуальний, як вам подобається, потім зробіть мишу, а потім встановіть її назад.

Режим вставки є складнішим, ніж я намагаюся зараз, але звичайний режим простий. Щось на зразок цього має працювати, хоча краще зберігати і відновлювати віртуальний, а не явно:

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

Також можна перепризначити подвійне клацання подібним чином, використовуючи <2-LeftMouse> замість <LeftMouse>. Деякі експерименти показали, що це може не знадобитися. Але оскільки подвійне клацання за замовчуванням ставить вас у візуальний вибір, вам може знадобитися відображення, наприклад:

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

Я не міг насправді отримати цю роботу, однак. Я не міг зрозуміти, як змусити його залишитися поза зоровим режимом, навіть з тим картою та декількома подібними.


EDIT (по 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> це не команда, тому вона не працює всередині функції. (Рекомендації щодо того, як обійти це, буде бажаним ...)


Я також додав наступне відображення, яке, здається, працює для мене: nnoremap <silent> <2-LeftMouse> <LeftMouse>i. З якихось причин "подвійний клік для введення режиму вставки" мені здається логічним. В ідеалі я хотів би це зробити, лише якщо курсор проходить повз кінця рядка і зберігає стандартну поведінку інакше, що має бути досить простим col('$') і getpos, але поки я залишу його як є. Знову дякую!
Kyle Strand

Фактично, це відображення здається ... непослідовним. Іноді це ставить мене в режим VISUAL INSERT, іноді він ставить мене в режим VISUAL і виділяє великий шматок лінії ...
Kyle Strand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.