Як замінити більше одного символу без входу в режим вставки


12

У мене є файл із рядком, який виглядає приблизно так:

foofoo.xy.barbar

Я хочу , щоб змінити xyTo gh. Я намагався зробити 2r-> gh, але очевидно , що не працює, як він замінив xyз , ggа потім перемістив курсор на одне місце вліво.

Чи можна це зробити без введення режиму вставки або без використання набагато більше натискань клавіш (наприклад :s/xy/gh/)?


2
Rпереходить у режим заміни. :help replace-modeдля отримання додаткової інформації.
alxndr

Я спробував vt.rgh. Але результат був таким же, як і ваш, за винятком положення курсору.
Гонсало Рібейро,

2
Чому ви не хочете перейти в режим вставки? Щось подібне cwgh<esc>спрацювало б добре.
Doorknob

1
@ Durron597 Я не впевнений , якщо minimize-keystrokesце хороший тег, зазвичай це не зовсім те , що мова йде про , як такої. (Я відхилив запропоновані вами зміни) ... Можливо, вам варто обговорити в мета?
Мартін Турноїй

Відповіді:


19

Якщо новий текст такої ж довжини, як і старий текст, режим заміни Vim - це варіант. З нормального режиму R(це велика величина "r") переводить вас у режим заміни. Це схоже на "перезаписати" в деяких інших текстових редакторах: замість того, щоб вставляти нові символи, як у режимі вставки, введення замінить символ під курсором, а потім перейде до наступного курсору. (Думайте про це як про малі регістри r, але не більше одного символу одночасно.) Знайдіть документацію для режиму заміни на :help replace-mode.

У вашому випадку: за допомогою курсору між .і перейдіть xдо режиму заміни, натиснувши R. Тепер, коли ви вводите текст, gвін замінює "x" і переходить до наступного символу, тому ви можете ввести, hщоб замінити "y". Ваше редагування виконано зараз, Escapeщоб повернутися до звичайного режиму.

(Це працює, коли ваш текст заміни має ту саму довжину, що і старий текст, але якщо ваша заміна довша чи коротша, cможливо, буде все, що вам потрібно: він замінить 1 текст у русі текстом, який ви потім введете. Є багато способів зробити використання c, наприклад: з курсором між .і x, ct.ABCEscapeкажуть гр висить тексту (до ' т иль наступний .) з "ABC").


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


2
Це працює в цьому випадку. Що робити, якщо ви хотіли замінити ці 2 символи на 3 символи?
Gonçalo Ribeiro

1
Хороше питання; поправками, щоб включити спосіб обробки тексту різної довжини.
alxndr

Так, я знаю це. Але таким чином ви входите в режим Вставка, і мені було цікаво дізнатись, чи існує спосіб не використовувати режим Вставка в такому випадку. Не те, що я вважаю це дуже корисним (і все ж я можу помилитися).
Gonçalo Ribeiro

1
Префікс з цифрою nдля заміни до n-го виникнення цільового символу. Це корисно для заміни частин етикеток на формат w_x_y_zі a-b-c-d. Використовуйте fзамість, tщоб також видалити обмежуючий символ.
pkfm

5

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

TL; DR

fxcw<REPLACEMENT TEXT>

Пояснення

  • fxстрибає на х (див. help *f*)
  • cwкаже , щоб змінити слово (див :h *c*, :help *w*і :help cwдля отримання додаткової інформації), видаляючи «х» текст і введення в режимі вставки, дозволяючи вам покласти все , що ви хочете прямо там.
  • <ТЕКСТ ЗАМІНИ> - це все, що ви хочете замінити на - "gh" у вашому прикладі.

Однією з переваг такого підходу є те, що він використовує дуже часто використовувані команди маніпуляції текстом та навігаційні команди. Інша справа, що "xy" може бути будь-якої довжини, і це все одно спрацює.

У cwроботах , тому що ваш текстовий об'єкт оточені точками ( .), які виступають в якості кордону до слова.

Якщо ваш курсор вже є символом "y" (або будь-яким символом у тексті, який слід замінити), ви можете використовувати ciw<REPLACEMENT TEXT>. Це підказує vim змінити слово, в якому ви знаходитесь, навіть якщо ви не на початку цього слова. Додаткову :help text-objectsінформацію про ciwта текстові об'єкти див.


чи не помістить його у режим вставки?
еляшів

1
Ага - не вловив цю частину свого питання. У такому випадку так - R є найбільш підходящим рішенням.
опитування Коді

3

Режим заміни:

Rgh<Esc>

є найбільш очевидним рішенням, якщо заміна має таку ж довжину, що і оригінальна, але ви також можете зробити:

2sgh<Esc>

або:

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