LINUX.ORG.RU

Деревенского рефакторинга тред

 ,


1

4

Сап, бибиканы.

В общем нужен рекурсивный поиск и замена с подтверждением по определенной директории. И чтобы все результаты были как-то видны заранее. Т.е. аналог :%s/penis/vagina/gc, но по всем файлам в директории. И чтобы оно как-то заранее все результаты показывало. Гугл что-то там разное предлагает, но я не сильно разбираюсь в птичьем языке вима, поэтому пока не пойму что мне надо. Основное требование — удобство использования. Крайне желательно без дополнительных плагинов.

Вообще, было бы прикольно, если бы пользователи вима поделились рецептом, что они делают, если надо переименовать функцию/метод/еще_что-нибудь во множестве файлов.

Как я это вижу? Что-то вроде

%ds/genitals_dir/penis/vagina/gc

Экран делится на две части, в одной из которых результаты, по которым можно скакать n/N и каждое переименование надо подтверждать y/n.

Deleted

Твой рефакторинг сломается, когда у тебя будут два метода с одинаковым именем и разным набором параметров, а переименовать надо один из них. Или два одинаковых метода в разных классах.

vurdalak ★★★★★
()
Ответ на: комментарий от Deleted

Ну покажет тебе в одном месте method(a, b, c) и в другом месте method(d, e, f). А где-то 50 строками выше b = Class1, а e=Class2. Как ты на экране подтверждения увидишь, что куда передаётся?

vurdalak ★★★★★
()

рекурсивный поиск и замена с подтверждением по определенной директории

vim

В emacs есть такая штука.

no-such-file ★★★★★
()

Я полуавтоматом делаю: нахожу через ack все интересующие совпадения, и вывожу их в отдельный буфер.

Потом по очереди открываю каждый файл в горизонтальном сплите (<C-w>+f, по-моему), и прогоняю предварительно записанный макрос на изменение (иногда вешаю два макроса qq, qw)

После изменения 15-20 файлов иду отдохнуть. :) При необходимости процесс повторяется.

noomorph
()
Ответ на: комментарий от kawaii_neko

Если ты делаешь рефакторинг для сишки или крестов

Я пока намекаю на аналог %s/a/b/gc для директорий, скажем, без привязки к ЯП, пусть это будет просто текст.

Deleted
()

Крайне желательно без дополнительных плагинов.

смешно.

// кажется, видел такой плугин, если вспомню отпишу. Же live предпросмотр :%s есть в vim-over.

vim
()

Через cscope/lvimgrep находишь все места для замены. Дальше, если мест много можно записать макрос который переключает на следующее место (:lnext) и делает необходимые действия.

amaora ★★
()

Самое близкое, что пришло на ум:

:arg **/*.c | argdo %s/from/to/gce

Сам по сочетанию ищу слово под курсором рекурсивно с помощью :vimgrep, а потом хожу по списку и заменяю. Если совсем просто, то можно и автоматически заменить, потом с помощью git diff всё равно проверю, иначе руками с правкой форматирования и/или комментариев.

xaizek ★★★★★
()
Ответ на: комментарий от Deleted

А если их там будет сотня? Или тысяча?

vim - это не *подставить название любой ide на java*, откроет даже не запнется

Dantix ★★
()
Ответ на: комментарий от Dantix

vim - это не *подставить название любой ide на java*, откроет даже не запнется

После этого надо будет как-то жить работать, их придется закрыть для этого :3

Deleted
()
Ответ на: комментарий от Deleted

1,999bd :)

Я просто сессию переоткрываю, лишние буферы улетают

Dantix ★★
()
Последнее исправление: Dantix (всего исправлений: 1)
Ответ на: комментарий от Deleted

Делайте свой транзишен в другом экземпляре vim, ну или:

:tabdo windo argd % | argdo bd

salsa
()
Ответ на: комментарий от vurdalak

Оно потом нескомпилируется или не пройдет тесты. И пользователь сделает роллбек к предыдущему коммиту гита? Ведь у не же есть тесты или статическая типизация, у него же есть гит, ведь так?

vertexua ★★★★★
()
Ответ на: комментарий от MyTrooName

file -exec

$ file -exec
Usage: file [-bcEhikLlNnprsvz0] [--apple] [--mime-encoding] [--mime-type]
            [-e testname] [-F separator] [-f namefile] [-m magicfiles] file ...
       file -C [-m magicfiles]
       file [--help]

find штоле?

shdown
()
Ответ на: комментарий от vertexua

в теории, может скомпилироваться и пройти тесты, если


class A{
...
};
class B:A{
...
};

method(A* a, A* b, A* c);
method(B* a, B* b, B* c);

next_time ★★★★★
()
Ответ на: комментарий от shdown

ну там sh -c надо поставить после -exec, а остальное в кавычки. и вообще, прекрати, я придуриваюсь, а ты докапываешься. а то ведь я ещё и на перле могу, у тебя глаза вытекут.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от no-such-file

В emacs есть такая штука.

И как?

Deleted
()
Ответ на: комментарий от noomorph
:help vimgrep

это не то что хочет тс, но то что делаешь ты, как раз проще делается так :)

pon4ik ★★★★★
()
Ответ на: комментарий от vertexua

Оно потом нескомпилируется или не пройдет тесты.

Да, но это не отменяет ненужности подобного рефакторинга. Всё равно придётся вручную ходить по изменениям и проверять, то ли ты наменял.

vurdalak ★★★★★
()
Ответ на: комментарий от vurdalak

Да, но это не отменяет ненужности подобного рефакторинга. Всё равно придётся вручную ходить по изменениям и проверять, то ли ты наменял.

Ну, как и везде, тащемта. Для этого и нужно подтверждение и контекст предполагаемого изменения. А вы, собственно, что предлагаете в качестве альтернативы? :3

Deleted
()
Ответ на: комментарий от Deleted

Проблема в том, что он откроет все эти файлы в виме.

проблема будет если он их попытается открыть НЕ в виме

q11q11 ★★★★★
()
Ответ на: комментарий от Deleted

У меня ни разу не было с этим проблем, поэтому я не вижу смысла вручную ходить и перепроверять. Конечно, я просматриваю свои изменения перед коммитом. Поэтому если проблема внезапно появится, я её замечу. Плюс юниттесты.

vurdalak ★★★★★
()
Ответ на: комментарий от Deleted

sage

Qt Creator например, перед тем как менять, вываливает список замен с контекстом в отдельное окно, где их можно просмотреть и разотметить мышкой ненужное, но это, очевидно, недостаточно чирижжопно, поэтому предлагать не буду.

d_a ★★★★★
()
Ответ на: sage от d_a

Qt Creator например, перед тем как менять, вываливает список замен с контекстом в отдельное окно, где их можно просмотреть и разотметить мышкой ненужное

Если бы ты не страдал дислексией, то понял бы, что именно это ТС и надо. В виме.

Deleted
()
Ответ на: комментарий от xaizek

:arg **/*.c | argdo %s/from/to/gce

N. B. Здесь нет команды сохранения, т. е. неявно подразумевается, что установлена опция 'autowriteall'.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

неявно подразумевается, что установлена опция 'autowriteall'

Не обязательно, можно и :wa потом выполнить. Просто замена заменой, а сохранение это отдельный процесс, совмещать может не всегда стоит.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.