Картування з рухом


12

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

nmap /c c{here we pending for a motion}/<C-r>"<CR>

На карті слід зробити наступне:

  1. Активуйте cоператора і прослухайте наступний рух;
  2. Наприклад, я можу тут набрати, t,щоб змінити все перед наступною комою;
  3. Перейдіть, щоб вставити режим, видаляючи все між курсором і комою;
  4. Видалений текст автоматично шукається як візерунок

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

ОНОВЛЕННЯ

Відповіді - це майже те, що я хочу. Але! Коли я натискаю /cw, введіть щось замість слова, а потім натисніть <Esc>. Після того як я розраховую зробити те саме з наступними подіями. Але після натискання n(перейти до наступного появи) та .(повторити останню команду) він просто додає текст останнього тексту, замість нього. Основна мета картографування - це використовувати його за допомогою n/Nта .повторити. Я щось пропустив?

Відповіді:


9

vim підтримує відображення оператора :h map-operator.

Що вам потрібно - це operatorfuncі картографування. для ваших потреб працюють наступні коди. Ну це лише приклад, ви вдосконалюєте далі.

nmap  <silent> /c :set opfunc=SpecialChange<CR>g@
function! SpecialChange(type)
    silent exec 'normal! `[v`]d'    
    silent exec 'let @/=@"' 
    startinsert
endfunction

Зауважте, що exec 'let @/=@"'лише для виділення кодів у буфері. Якщо ви не хочете побачити виділення відразу, ви можете простоlet @/=@"


Я оновив своє запитання. Здається, ваша відповідь є найбільш близькою до моїх потреб, але це не те саме відбувається з наступним явищем, тому я пояснив цей момент у питанні.
Тимур Файзрахманов

У вас є два оператори (the /cі i) vim, .просто повторює останній. Якщо ви хочете розширити його, перевірте repeatплагін. @TimurFayzrakhmanov також є :gі :sкоманди, можуть теж допомогти вам.
Кент

Чи немає "у вашому коді непарних 'let @/=@""'? Я думав, що це можливо, наприклад silent exec 'normal! [v ]c', тому що cоператор робить те, що я очікую, за винятком того, що він не додає змінений текст до шаблону пошуку.
Тимур Файзрахманов

1
@TimurFayzrakhmanov "" був помилковим друком .. виправити .. Я теж придумав c, проте він додав пробіл, тому що є зміна режиму, n-i-n-iя думаю ... зробіть тест, який ви побачите.
Кент

@TimurFayzrakhmanov ви можете зробити це неповторним без яких - або плагін, змінивши dдо yі startinsertдо call feedkeys("cgn", 'n')(див моєї відповіді нижче)
Джером Dalbert

4

Простіше реалізувати (і документувати) складні відображення за допомогою функцій:

function! DoMagic()
   execute "normal! d".input("enter motion: ")
   let @/=@"
   startinsert
endfunction

Тоді зробіть свій картографічний дзвінок такою функцією:

nmap /c :call DoMagic()<CR>

Редагувати:

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

function! DoMagic2()
   normal! gv"ay
   return @a
endfunction

vmap /c :<c-w>%s/<C-r>=DoMagic2()<CR>//gc<left><left><left>

1
це навіть із "приємним" інтерфейсом, який працює на потреби ОП, і може бути "більше", ніж очікувалося, залежить від того, що ви ввели. Наприклад, коли хтось бачить enter motion:, він дав: t,ggVGJZZ ^ _ ^ Це поширена проблема конкатенації команд
Кент

Це майже те, що я хочу. Напр .: Я натискаю, /cwпотім замість слова введіть щось, потім натисніть <Esc>. Після я хочу зробити те ж саме з наступними явищами. Але після натискання n(перейти до наступного появи) та .(повторити останню команду) він просто додає текст останнього тексту, замість нього. Основна мета картографування - це використовувати його за допомогою n/Nта .повторити. Я щось пропустив?
Тимур Файзрахманов

1
Ця функція полягає у з'ясуванні ідеї використання функцій, коли у вас виникають проблеми зі складними відображеннями. Ви повинні змінити це відповідно до своїх потреб; спробуйте дотримуватися порад Кента, щоб .повторити свою команду.
mMontu

Дякую за відповідь. Це теж корисно, але я приймаю той, хто @Kent, тому що він робить рух відразу після того, як я їх надам (без очікування <CR>від input()).
Тимур Файзрахманов

1
@TimurFayzrakhmanov ви також можете спробувати замінник, як пояснено в оновленнях.
mMontu

1

Це рішення працює з "повторити останню команду" (ака .):

nmap <silent> /c :set opfunc=ChangeOccurence<CR>g@

function! ChangeOccurence(type)
  exec 'normal! `[v`]y'
  let @/ = @"
  call feedkeys('cgn', 'n')
endfunction

При повторенні вам навіть не потрібно користуватися n, ви можете просто скористатися, .щоб безпосередньо отримати та замінити наступне виникнення, якщо хочете пройти швидше.

За бажанням, якщо вам подобаються виділення відповідних слів, ви можете замінити 'cgn'їх 'n``cgn'.

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