Який найкращий спосіб зробити плавну прокрутку у Vim?


78

Основні команди прокрутки у Vim:

  1. Ctrl- Bта Ctrl- F, а також PageUpі PageDownпрокрутіть на повну сторінку
  2. Ctrl- Uі Ctrl- Dпрокручуйте половину сторінки за замовчуванням
  3. Ctrl- Yі Ctrl- Eпрокрутити один рядок

Я втрачаю візуальний контекст кожного разу для перших двох, тому у мене склалася шкідлива звичка повторювати удари по останніх ( Ctrl- Yі Ctrl- E).

Оскільки в даний час не існує першої сторони підтримки плавного прокручування, які найменш неприємні обхідні шляхи / плагіни?

Я використовую і Vim, і GVim залежно від завдання, і я із задоволенням налаштовую їх окремо, якщо немає жодного справді хорошого хака, який би працював для обох. Колесо прокрутки миші чудово працює в GVim, але я шукаю рішення на основі клавіатури.


[Ctrl + U] не працював, [Ctrl + u] працює, яку версію vi (m) ви використовували?
AjayKumarBasuthkar

Відповіді:


38

Оновлення : Зараз я переніс цей код, дещо перероблений відповідно до керівних принципів :help write-plugin, до репозитарію Github .

Використання клавіатури

Ось що я маю в своєму .vimrc:

function SmoothScroll(up)
    if a:up
        let scrollaction="^Y"
    else
        let scrollaction="^E"
    endif
    exec "normal " . scrollaction
    redraw
    let counter=1
    while counter<&scroll
        let counter+=1
        sleep 10m
        redraw
        exec "normal " . scrollaction
    endwhile
endfunction

nnoremap <C-U> :call SmoothScroll(1)<Enter>
nnoremap <C-D> :call SmoothScroll(0)<Enter>
inoremap <C-U> <Esc>:call SmoothScroll(1)<Enter>i
inoremap <C-D> <Esc>:call SmoothScroll(0)<Enter>i

Особливості:

  • Прокрутіть на основі scrollопції Vim .
  • Настроювана швидкість прокрутки (налаштуйте аргумент часу sleepкоманди; я використовую десять мілісекунд). Примітка : так само, як уповільнення частоти кадрів на відео, якщо ви занадто сповільнюєте плавну прокрутку, це буде різка прокрутка, а не плавна прокрутка. Але все, що вам найкраще підходить.
  • Працює в звичайному режимі або режимі вставки.

Примітка : всі, хто копіює та вставляє, пам’ятайте, що ^символ позначає контрольний символ; copy-paste видасть недійсні результати, і їх потрібно вводити вручну!

  • ^Y- CTRL- Vтоді CTRL-Y
  • ^E- CTRL- Vтоді CTRL-E

Однак синтаксис <C-U>і та <Enter>стиль буквально вводяться як ці символи; команда map розумно перетворює їх на керування символами.

Використання миші

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

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

На основі цього питання , проте, здається, що деяким людям доводиться робити ще кілька налаштувань вручну, окрім простого ввімкнення миші (я просто використовую set mouse=n):


У моєму .vimrcє такі рядки

 set mouse=a
 map <ScrollWheelUp> <C-Y>
 map <ScrollWheelDown> <C-E>


Це чудово працює ... і не залежить від швидкості машини, як інша відповідь. На здоров’я!
Steve Vermeulen

1
Попередження: Я виявив, що не слід натискати <kbd> Ctrl </kbd> - <kbd> D </kbd> тощо, поки попередня прокрутка не закінчиться або поведінка не буде дивною. Я раніше не стикався з цією проблемою, тому не знаю, чи просто не помічав її, або вона специфічна для конфігурації Vim на поточній машині, яку я використовую. Якщо хтось знає, як боротися з багатопоточністю у Vim (!!), не соромтеся розмовляти.
Кіт Пінсон,

Можливим покращенням, яке мені спало на думку, було б застосувати таку ж плавну прокрутку до команд zz, z-, z <cr>
Стів Вермелен

Це хороша ідея. Ви можете переробити їх точно так само, я гадаю.
Кіт Пінсон,

3
Невеликий коментар до "пам’ятайте, що символ ^ позначає контрольний символ": ви можете замінити "let scrollaction =" ^ Y "'на" let scrollaction = "\ <Cy>"' таким, що вам не доведеться використовувати <Cv> <Cy> для створення сполучення клавіш І це робить можливим копіювання вставки :)
gospes

11

У vim tips.txt є простий рубаний переробку:

Smooth scrolling                    *scroll-smooth*

If you like the scrolling to go a bit smoother, you can use these mappings:

    :map <C-U> <C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y>
    :map <C-D> <C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E>

1
Чому це було б кращим, ніж використання параметра "прокрутка" (наприклад,: встановити прокрутку = 15)? Параметр прокрутки здається кращим, оскільки ви навіть можете створити команду au, яка автоматично змінює її при зміні висоти вікна. (Я думаю, ви могли б зробити щось подібне і за допомогою цього методу відображення, але опція прокрутки спрощує ситуацію.)
Герберт Сітц,

1
Насправді, автоматичне встановлення змінної прокрутки - один із варіантів, який я теж розглядав. Як ви вже згадували, він повинен відповідати розміру вікна. Змінна прокрутки за замовчуванням становить 1/2 висоти вікна, але, схоже, вона не дає способу змінити цю частку; Ви можете змінити його лише з точки зору кількості рядків. Можливо, вам також доведеться встановити менше значення для прокрутки, ніж якби у вас також була якась плавна прокрутка, оскільки ваші очі не матимуть проміжних прокручуваних станів для поліпшення стійкості зору.
Ендрю Вагнер,

1
Для уточнення, cd та cu прокручуватимуть те, що вибрано для параметра "прокрутка". За замовчуванням - 1/2 висоти вікна, але ви можете встановити його як завгодно. Якщо ви хочете, щоб нове значення залежало від висоти вікна, використовуйте функцію 'winheight ("%")', яка повертає кількість рядків у вікні. Так, наприклад, команда ': set scroll = winheight ("%") / 3' зробить прокрутку cu і cd 1/3 висоти вікна.
Герберт Сіц,

1
@Drew Wagner Це відображення має бути переписано як noremap <expr> <C-u> repeat("\<C-y>", 20)для читабельності.
ZyX

9
Або просто:map <C-U> 20<C-Y>
anishsane


7

Недавній плагін

Я розмістив тут щось подібне , але в основному є чудовий плагін, який ми можемо використовувати зараз для прокрутки, який називається terryma / vim-smooth-scroll . Це забезпечує дуже приємне та плавне прокручування.


Встановити досить просто:

1Я використовую Vundle, тому я просто додав це в .vimrc.bundles :

Bundle terryma/vim-smooth-scroll

В останній версії Vundle, доступній сьогодні, 29 квітня 2016 року, ви можете помістити це у свій .vimrc :

Plugin 'terryma/vim-smooth-scroll'

2Як зазначено в документі, ви можете встановити 3 аргументи: відстань , тривалість і швидкість .

Я використовую це у своєму файлі .vimrc :

noremap <silent> <c-b> :call smooth_scroll#up(&scroll*2, 10, 4)<CR>
noremap <silent> <c-f> :call smooth_scroll#down(&scroll*2, 10, 4)<CR>

1
На жаль, цей плагін також переміщує курсор замість того, що я хотів: просто прокручувати екран, як команди <C-E>та <C-Y>.
silviubogan

4

Що я роблю, це налаштовую повторення клавіатури на дуже швидке, приблизно 120 символів / секунду, а затримка невелика. Потім я перекладаю на 4j, а в 4k я переходжу вгору та вниз по вихідному коду, використовуючи j та k, які рухають курсор вгору та вниз красиво та швидко, досить плавно. Але ось хороша частина, і це працює на Linux, а не на Windows. Протягом ряду років введення клавіатури X11 працює таким чином, що при натисканні та утримуванні j, очевидно, починає видавати j символів. Але коли ви продовжуєте утримувати j, а потім також натискаєте клавішу ctrl, X11 починає видавати символи cj без необхідності повторного натискання клавіші j. Потім, коли ви відпускаєте клавішу ctrl і продовжуєте продовжувати натискати j, X11 продовжує вводити j знову. Отже, j змушує курсор починати рухатись приємно і плавно вниз, і ви можете періодично натискати клавішу ctrl, не відпускаючи j, щоб дати йому поштовх,

Крім того, я роблю те, що робить Девін, і встановлюю прокрутку на 5.

Нарешті, я поміняю місцями ctrl та cap lock. Положення клавіші ctrl за замовчуванням повністю відстале (не передбачається образа). Це змушує вас обертати ліву руку. Я майже ніколи не використовую caps lock, тому я їх міняю місцями. Тоді мій лівий рожевий палець може дістати клавішу ctrl без жодних рухів йоги.

Ці речі працювали у мене роками. Я використовую лише vim, ніколи не gvim.


3
+1 за нарікання на місце розташування ключа управління. ІМО командний ключ macbook не набагато кращий.
Триптих

3

Це не зовсім плавна прокрутка, але це те, як я обробляю не втрачаючи контекст під час переходу на сторінки.

встановити так = 7

'scrolloff' 'so' номер (за замовчуванням 0) глобальний
{не у Vi}
Мінімальна кількість рядків екрана, щоб триматися вище та нижче курсору. Це зробить деякий контекст видимим навколо того, де ви працюєте. Якщо ви встановите для нього дуже велике значення (999), рядок курсора завжди буде знаходитися в середині вікна (за винятком початку або кінця файлу або коли довгі рядки загортаються). Для горизонтальної прокрутки див. "Sidecrolloff". ПРИМІТКА: Цей параметр встановлений на 0, коли встановлено значення "сумісний".



1
N <CR-E>
N <CR-Y>

... де 'N' - кількість окремих рядків, які потрібно прокрутити.

Не гладко в буквальному сенсі, але ви зберігаєте клавіатуру.


0

Я тільки що знайшов цей плагін під назвою «прискорена гладка прокрутка» ( «Vim плагін для прискореної гладкою прокрутки (відображення на <C-D>/<C-U>, <C-F>/<C-B>)») , який може бути використано, наприклад , через Vundle, помістивши цей рядок в .vimrc:

Plugin 'yonchu/accelerated-smooth-scroll'

Потім перезапустіть Vim і запустіть :PluginInstallкоманду, а потім знову перезапустіть Vim і використовуйте команди <C-D>( Ctrl+D) та <C-O>( Ctrl+O) нормально.

На жаль, цей плагін також переміщує курсор замість того, що я хотів: просто прокручувати екран, як команди <C-E>та <C-Y>.


0

Це поєднує в собі багато з цих відповідей, і саме цим я користуюся.

noremap <expr> <C-u> repeat("\<C-y> :sleep 10m<CR>", winheight('%')/2)
noremap <expr> <C-d> repeat("\<C-e> :sleep 10m<CR>", winheight('%')/2)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.