Як я можу зіставити d [count] d?


18

Примітка. Це не дублікат того, як працює команда "d3fg"? Будь ласка, прочитайте його перед голосуванням, щоб закрити!

Я трохи зіткнувся в моєму прагненні змусити невеликі видалення працювати як великі . Проблема, яку я маю, полягає в тому, що я не можу зрозуміти, як перевпорядкувати такі команди d3d. Насправді я навіть не можу зрозуміти, як вони працюють, в першу чергу, і не знайду жодної згадки про них у допомозі Віма. *

d3jпрямо: він застосовує dоператора до 3jруху,

3ddтакож прямо: він запускає ddкоманду з "count" 3.

d3d схоже, це має бути просто, він застосовує dоператора до… але що таке 3d? Це не рух. Якщо ви вводите 3dсамостійно, Vim сприймає це як кількість, за якою слідує оператор, і терпляче чекає подальшого введення.

І ви не можете застосувати операторів до інших операторів. ddне описано в довідці як послідовність двох операторів. Це окрема команда з двома клавішами. (пор. dc, що нічого не робить.)

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

То як це працює? Це лише особливий випадок із внутрішнього коду Vim? Чи можна створити d[count]dвідображення?

EDIT : Це текстовий об’єкт? :h text-objectsне включити його в список «текстових команд вибору об'єктів», але тоді він дійсно включає дд в списку вилучень «згрупованих від маленьких до великих об'єктів». І d2awвидаляє слово під курсором та наступне. З іншого боку, c2dнічого не робить.

* Я впевнений, що деякі згадки про них повинні існувати, але я не можу його знайти. Я читав :help deleting, :help motion.txtі пробував :helpgrep dNdдля всіх значень N від 1–9 .


2
Я думаю, що останні dвиступають як підтвердження; Так це те саме, що d3<CR>. y3yа c3cтакож працювати так само ... Я не можу знайти жодних документів з цього приводу, хоча і в Vim: help, vi (1), nvi (1), або в специфікації POSIX ... Він поводиться так само в viі nvibtw .
Мартін Турнойж

1
Певним чином, ddтотожна d_. _приводить курсор до першого непорожнього [count]ряду ( -1) -го рядка вниз, але він є лінійним, тому при парі з оператором він працює на цілі рядки. З цієї причини має сенс, що між двома ds може з’явитися підрахунок .
tommcdo

Відповіді:


28

Режим очікування від оператора

Між набравши оператора (наприклад d, cчи gU) і рух (наприклад w, i}чи /foo<CR>), Вім знаходиться в режимі оператора знаходиться на розгляді. Ви можете створити відображення для цього за допомогою :omapта :onoremap.

У моїх прикладах, я буду карта Оператор знаходиться на розгляд dв w. Це випадковий вибір, тому що я не знаю, для чого ви насправді хотіли ним скористатися.

Створіть omap

Створимо відображення dв режимі очікування оператора. Я припускаю, що ми пишемо тут VimScript (наприклад, у вашому .vimrc), тому я опущу провідні :s.

onoremap d w

Це змушує ddдіяти як dw. Це також змушує d[count]dдіяти як d[count]w. Але я думаю, що ви не хотіли впливати на поведінку dd(тобто не [count]надається).

Відображення відображень

Відображення виразів дозволяє оцінити вираз VimScript для отримання правої частини відображення. Вираз має оцінюватися до рядка. Відображення відображень позначається <expr>ключовим словом.

Vim також має деякі вбудовані змінні, які заповнюються в різний час і часто корисні під час відображення. Один з них - це v:count, який [count]подається оператору або руху.

Давайте складемо все це разом. Якщо не [count]надається, v:countбуде 0. Ми можемо сказати нашому картографуванню просто використовувати dв цьому випадку.

onoremap <expr> d v:count == 0 ? 'd' : 'w'

Тепер ddповодиться як за замовчуванням (видаляє рядок), але d[count]dповодиться як d[count]w. Класно!

Обмежте його після використання dоператора

Можливо, ви щось помітите. Зараз cdтакож поводиться так cw. Це може не бути проблемою, але для повноти давайте обмежимо це, щоб воно працювало лише після dоператора.

У Vim є ще одна змінна, v:operatorяка містить останній використовуваний оператор. Перевіримо і це, перш ніж робити щось особливе.

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : 'w'

ПРИМІТКА. Оскільки :mapкоманди можуть бути пов'язані між собою |, ми маємо уникати їх у цьому виразі. Так ||стає логічним оператором АБО \|\|.

Круто, так cdі c[count]dповертаються до нічого, як раніше. Це добре, щоб інші плагіни могли визначати cd.

Я не хочу просто видаляти якийсь інший рух

Якщо ви хотіли зіставити d[count]dщось зовсім інше, нічого спільного зі видаленням тексту, ми можемо зробити так, щоб це також працювало.

Коли ви вводите команди в звичайному режимі, і ви починаєте вводити команду помилково, ви можете натиснути, <Esc>щоб скасувати цю команду. Те саме стосується ваших відображень.

Давайте d[count]dзмінимо поточний рядок на те, що [count]є.

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : '<Esc>cc' . v:count . '<Esc>'

Остання частина відображення є виразом VimScript: <Esc>cc' . v:count . '<Esc>'. Це <Esc>скасувати dкоманду, що очікує на розгляд , потім ccзмінити поточний рядок, v:countнабрати значення [count](у режимі Вставка) та <Esc>повернутися до звичайного режиму. Зверніть увагу , що ми будуємо тут рядок з допомогою оператора конкатенації VimScript, ..


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

Щасливого Vimming!


Чудова відповідь! Отримано. Я посилався на моє використання (також на vi.SE) на початку запитання, але, мабуть, ви його пропустили. В основному мені потрібно :omap d d(!), Але, на жаль, очікуваний оператором режим фактично ніколи не досягається через моє відображення для d, яке встановлює функцію користувацького оператора. Сподіваємось, можна налаштувати речі, щоб зробити d3dроботу як слід. (Дайте мені знати, якщо у вас є якісь ідеї чи не соромтесь залишити повне рішення іншого питання, якщо ви хочете.) Якщо я не можу цього розібратися незабаром, я прийму це та опублікую інше, більш конкретне питання. Спасибі!
Багатий

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