быстрая замена в тексте

и другие vi-подобные редакторы

Модератор: /dev/random

Ответить
malphunction
Сообщения: 3
ОС: Gentoo Linux

быстрая замена в тексте

Сообщение malphunction »

Подскажите, а как можно осуществить замену текста на другой в vim?

Например, вот у меня есть код:

var = somefunc(x + y * z);
doSomethingWithVar(2 + var);

И я хочу подставить присваиваимое var значение ( somefunc(x+y*z) ) на место использования, чтобы был такой код:

doSomethingWithVar(2 + somefunc(x + y * z));

Чую, есть простой способ, но я не смог найти. Пока приходится переходить к выражению, копировать его, переходить к var, вставлять буфер, удалять var
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: быстрая замена в тексте

Сообщение Luinnar »

malphunction писал(а):
25.11.2008 08:32
Подскажите, а как можно осуществить замену текста на другой в vim?

Например, вот у меня есть код:

var = somefunc(x + y * z);
doSomethingWithVar(2 + var);

И я хочу подставить присваиваимое var значение ( somefunc(x+y*z) ) на место использования, чтобы был такой код:

doSomethingWithVar(2 + somefunc(x + y * z));

Чую, есть простой способ, но я не смог найти. Пока приходится переходить к выражению, копировать его, переходить к var, вставлять буфер, удалять var

Например так можно во всем документе заменить var на вызов функции:
:%s/\<var\>/somefunc(x\ +\ y\ \*\ z)/g

Впринципе можно и без слэшей:
:%s/\<var\>/somefunc(x + y * z)/g
Спасибо сказали:
malphunction
Сообщения: 3
ОС: Gentoo Linux

Re: быстрая замена в тексте

Сообщение malphunction »

Luinnar писал(а):
25.11.2008 13:58
malphunction писал(а):
25.11.2008 08:32

Подскажите, а как можно осуществить замену текста на другой в vim?

Например так можно во всем документе заменить var на вызов функции:
:%s/\<var\>/somefunc(x\ +\ y\ \*\ z)/g

Впринципе можно и без слэшей:
:%s/\<var\>/somefunc(x + y * z)/g


Спасибо, но это не совсем то.

Во-первых, как в командный режим поместить somefunc(x + y * z) -- только разве что набрать всю эту строку? Или есть какой-то способ выделение в команду поместить? Я могу только вручную...

Во-вторых, мне нужно эта замена локально, буквально для пары строк и двух-трех вхождений var.

Например, в том же виндовом нотепаде можно так:
1. выделить (Shift + Ctrl + <стрелка влево>) и скопировать somefunc... в буфер (Ctrl+Ins)
2. перейти к var (ещё 3-4 нажатия)
3. выделить var (Shift+Ctrl+<стрелка влево>)
4. вставить с заменой: Shift+Ins -- при этом выделение заменится на содержимое буфера.

То есть мне нужно именно вот эта возможность из 4-го пункта: замена выделения на содержимое буфера.

Я порылся ещё раз в справке (:h registers), оказывается, можно так сделать:
1-ый вариант: удалить заменяемый фрагмент: dw, вставить ранее скопированное: "0P, при этом удаленный фрагмент будет в ""
2-ой вариант: удалить заменяемый фрагмент без порчи регистров: "_dw, вставить ранее выделенное: P. Замененное будет потеряно.

Но, может, есть непосредственный способ?

Хотя, может, есть более простой способ замены?
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: быстрая замена в тексте

Сообщение Luinnar »

Если заменять нужно в нескольких местах, я бы всё равно воспользовался командной заменой. Для того, чтобы замена происходила не во всём документе нужно выделить тот блок, в котором вы хотите производить замену (либо мышкой, либо используя клавишу v).
Итак все действия по порядку:
1. Копируем в буфер вторую строчку, т.к. она длиннее первой и набирать её дольше: somefunc(x + y * z).
2. Выделяем фрагмент текста в котором нужно выполнить замену.
3. Не снимая выделения нажимаем двоеточие.
4. Вводим команду замены:
s/\<var\>/somefunc(x + y * z)/g
В последнем пункте вместо набора "somefunc(x + y * z)" вручную нужно вставить эту строку из буфера.
Спасибо сказали:
malphunction
Сообщения: 3
ОС: Gentoo Linux

Re: быстрая замена в тексте

Сообщение malphunction »

А, ну так, пожалуй, быстрее. Единственно, что я хотел узнать (но уже узнал из ":h :" ;) ), это как буфер вставлять. Оказалось, вот так: Ctrl+R ". Т.е., чтобы сделать 4-ый шаг, нужно написать: :s/\<var\>/ Ctrl+R " / g . Тогда да, быстро получается. Аналогично, можно и var, если она длинная, вставить.
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: быстрая замена в тексте

Сообщение Luinnar »

malphunction писал(а):
26.11.2008 11:33
А, ну так, пожалуй, быстрее. Единственно, что я хотел узнать (но уже узнал из ":h :" ;) ), это как буфер вставлять. Оказалось, вот так: Ctrl+R ". Т.е., чтобы сделать 4-ый шаг, нужно написать: :s/\<var\>/ Ctrl+R " / g . Тогда да, быстро получается. Аналогично, можно и var, если она длинная, вставить.

А ещё, если интересно, то вот несколько строк из моего .vimrc для упрощения работы с буфером:

Код: Выделить всё

set clipboard=unnamed
map <S-Insert>  p
imap <S-Insert> <Esc>pa
cmap <S-Insert> <MiddleMouse>
vmap <C-Insert> y


С этими настройками можно копировать клавишей y, вставлять клавишей p, причем используется для этого общий системный буфер, а не чисто vim'овский (за это отвечает set clipboard=unnamed).
А всё остальное, как, наверное, и так понятно, - это <Ctrl>+<Insert>, <Shift>+<Insert> ну и средняя кнопка мышки. :)
Спасибо сказали:
Ответить