Видалити до правого кінця поточного внутрішнього блоку


21

Скажімо, у мене такий код ( |представляє позицію курсору ):

func1(x|, func2(), y); 

Я хотів би отримати:

func1(x|);

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

Я знаю, що я можу піти з цим, dt).але мені цікаво, чи є спосіб змішати це з тим, що di)робить.


1
Мені цікаво дізнатись, чи існує простий спосіб "видалити ліву / праву половину внутрішнього / зовнішнього блоку", як ви просили. Але в якості побічної ноти я б, мабуть, робив саме C);в цьому випадку.
Шахбаз

1
Іноді %рух може робити те, що ви шукаєте (тобто d%).
alxndr

Відповіді:


29

Я б користувався

d])

що означає видалити ( d) до наступного незрівняного ')' ( ])).

Див :help ]).


5

Рухи йдуть лише в одному напрямку, а текстові - лише в двох напрямках.

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

У вашому прикладі текст, на який поширюється, i)досить легко уявити:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

але як би ви сказали Vim управляти курсором до кінця тексту? Потрібно створити власні оператори типу ( obi)та oei)напів випадкові приклади).

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>

4
Було б цікаво створити загальний рух, який повторно використовує всі вже визначені текстові об’єкти в поєднанні з поточною позицією курсору; наприклад, замість ib, imbвправо і iMbвліво, і так далі (автоматично).
VanLaser

3

У цьому конкретному випадку я б хотів dfy

Для загального випадку:

  • dT( видалити з курсору до початку блоку
  • vib виберіть решту внутрішнього блоку
  • p замініть внутрішній блок тим, що ви тільки що видалили

Ви можете перетворити його на карту.

 :map K dt(vibp

3

Інші відповіді залежать від визначення vim та виявлення блоку. Моя стратегія такого роду видалень полягає у використанні cкоманди в поєднанні з fрухом і власне символом, на якому зупиняються. Потім це фактично видалить символ зупинки, але оскільки він також був останньою клавішею, яку ви натиснули повторюючи її двічі, має поряд із нульовою вартістю, і вона знову вставить її після cзміни режиму вставки.


Пояснити на прикладах, для

func1(x|, func2(), y); 

команда c2f))дасть

func1(x)|;

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


Наприклад, с

<div| class="some-class">text</div>

команда cf>>дасть

<div>|text</div>

Або під час редагування таких файлів, як CSV

2016-11-29,question,vi|.stackexchange.com,10435

команда cf,,дасть

2016-11-29,question,vi,|10435

Часто я використовую це для видалення решти рядка з

printf("Hello world| - a boring example\n");

до

printf("Hello world\|n");

з cf\\

або з

print("Hello world| - a boring example");

до

print("Hello world"|);

з cf"".


Це змінює поточне положення на дещо інше місце, ніж просили, а також переходить у режим вставки. Але я хотів поділитися своїм рішенням щодо видалення решти всього.


1
Проблема cfрішення полягає в тому, що я повинен вказати символ, де я хочу припинити видалення. Питання , запитує , що робити , якщо ви не можете просто зробити , cf)тому що є ще )до того , як )ви на справді хочете досягти (наприклад якщо ви хочете , щоб зміни func(x|, g(x, x), x, x, g(x, x))в func(x)). В основному, я хотів знати, чи можу я уникнути натискання .після cf).
Матеуш Піотровський

Зауважте, що ви можете також використовувати tзамість того, fщоб видаляти до, але не включаючи заданий символ, тому для першого прикладу ( func1(x|, func2(), y);) ви можете просто використовувати d2t). Як зазначає @MateuszPiotrowski, це не загальне рішення і вимагає, щоб ви знали, до якого символу ви хочете видалити. Оскільки ви, як правило, знаєте, який символ закінчує блок, на якому ви знаходитесь, для даної мови, це не так вже й погано.
Хаегін

3

Можливо, ви шукаєте плагін vim-ninja-feet . З того, що я розумію, це робить d[і d]в «видалити від курсору до початку / закінчення текстового об'єкта», тому d]i)не повинно бути «видалити до кінця оточуючих дужок».

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