LINUX.ORG.RU
решено ФорумTalks

Удобный copy-paste в vim

 , ,


1

4

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

Например Times->Delay. Я в четвёртой строке написал Delay вместо Times и мне понравилось. Я хочу сделать так во всех остальных местах. Выделяю Delay, жму y. Как мне теперь заменить текст в других местах. Ведь, если я удалю что-то, то это затрёт скопированную строку. Шаманство с указанием регистров не предлагать. Это долго, а меня уверяли, что вим это быстро. Я не собираюсь махать руками как пианист, чтобы провести замену слова.

FRandomStream Stream((int32)FPlatformTime::Cycles());
for (int32 Index = 0; Index < NumSamples; Index++)
{
    Delay[Index] = Stream.GetFraction();
}
// ave = .5
for (int32 Cube = 0; Cube < 2; Cube++)
{
    for (int32 Index = 0; Index < NumSamples; Index++)
    {
        Times[Index] *= Stream.GetFraction();
    }
}
// ave = 1/8
for (int32 Index = 0; Index < NumSamples; Index++)
{
    Times[Index] *= 0.00001f;
}
// ave = 0.00000125s
for (int32 Zeros = 0; Zeros < NumSamples / 20; Zeros++)
{
    int32 Index = Stream.RandHelper(NumSamples);
    Times[Index] = 0.0f;
}

Пример кода синтетический и взят из репы UE4. В данном случае можно найти другой более простой способ сделать эти действия. Но мне нужен способ именно с копированием-вставкой. Макросы, набор вручную или глобальная замена не подходят. Если в этом примере это прокатит, то в других нет. Слова могут быть длиннее, а вставку нужно будет делать в середину слова и т.д.

★★★★★

Постоянно достают евангелисты вима со своими рассказами про удобство этого редактора.

А зачем вы их впускаете к себе в квартиру?

Так вот, нужно скопировать слово и заменить им в нескольких местах другое.

Обычно я делаю так: * на заменяемом слове, cw, TYPE_NEW_WORD, <esc>, n, ..

Если замену можно сделать без контроля и по всему буферу, то :%s/from/to/g.

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

:%s/Times/Delay/g

В данном случае да. Но ситуация может быть сложнее. И мне нужно будет заменять в конкретном участке, а не во всём файле. Поэтому я уточнил:

Макросы, набор вручную или глобальная замена не подходят.

ox55ff ★★★★★
() автор топика

Постоянно достают евангелисты вима

женитесь, барин. перестанут.

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

Обычно я делаю так: * на заменяемом слове, cw, TYPE_NEW_WORD, <esc>, n, ..

Ну вот, придётся изображать пианиста. В обычном редакторе у меня только ctrl+c и ctrl+v.

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

Через командную строку и на участке можно менять, если это основное требование. Плюс можно регулярками сокращать, если конструкция длинная. Если я правильно понял, ты хочешь что-то вроде n повторений последнего изменения (замены части строки), но vim повторяет в normal mode через символ . только последнюю команду, а такого рода замена, которую ты хочешь предполагает несколько последовательных команд (поиск слова/части строки и замена).
http://vim.wikia.com/wiki/Repeat_last_change

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

Я использую QtCreator, там есть fake-vim. Я его попробовал и в некоторых случаях удобно. Но вот копирование вставка убивает всё на корню. Вот и хочу узнать как вимеры с этим справляются. Пока не убедили.

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

Но ситуация может быть сложнее

да. может. поэтому, что за херню ты нам втираешь, ессинесикрет?

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

И мне нужно будет заменять в конкретном участке, а не во всём файле.

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

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

Кроме того, если ты хочешь быстро скопировать в command line участок строки для замены, можешь сделать так:

yf"символ_до_которого_копировать", :%s/<C-R>"
и получишь слово/часть строки/строку, вставленную после / в command line.

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

Ну вот, придётся изображать пианиста. В обычном редакторе у меня

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

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

А, ну я не дочитал портянку. Тогда ТСу только блокнот.

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

В виме как раз НЕ нужно быть пианистом

И приводите мне в пример длинные консольные команды. Вим мне рекламировали, как редактор, где всё делается нажатием одной, двух кнопок. А тут целое произведение.

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

В обычном редакторе у меня только ctrl+c и ctrl+v.

Так это и есть «изображать пианиста». В моем случае все сведется к нажатию n.

andreyu ★★★★★
()
" ------------------------------------------------------------------------------
" text paste motion

" replace text captured by a {motion} with contents of a register
nnoremap <silent> cp :let g:changepaste_buffer = v:register \| set opfunc=SubstituteMotion<CR>g@
function! SubstituteMotion(type, ...)
    let l:reg = g:changepaste_buffer
    if a:0
        " visual mode, use '< and '> marks
        silent exe "normal! `<" . a:type . "`>\"_c\<c-r>" . l:reg . "\<esc>"
    elseif a:type == 'line'
        " linewise
        silent exe "normal! '[V']\"_c\<c-r>" . l:reg . "\<esc>"
    elseif a:type == 'block'
        " blockwise-visual
        silent exe "normal! `[\<C-V>`]\"_c\<c-r>" . l:reg . "\<esc>"
    else
        " characterwise
        silent exe "normal! `[v`]\"_c\<c-r>" . l:reg . "\<esc>"
    endif
endfunction
cpw — заменить часть до начала следующего слова содержимым буфера
cpf) — заменить часть до символа ) содержимым буфера
и т.д.
xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 2)
Ответ на: комментарий от ox55ff

:help mapping

Еще раз, не хочешь доки читать, сиди в блокноте. Там за тебя уже все продумали. Ctrl-C, Ctrl-v, большего блокнотофагу не требуется.

bread
()

Здравствуйте! Вы верите в vim? Давайте поговорим о vimе.

burato ★★★★★
()
ye "В дефолтном регистре Delays
/Times<CR> "Чисто, что бы быстро прыгнуть к первой записи
*
ce<ctrl-R>0<esc>
n.
n.
n. " до просветления...
pon4ik ★★★★★
()
Ответ на: комментарий от ox55ff

Выделяешь нужный участок в визуальном режиме, потом также через s///

DELIRIUM ☆☆☆☆☆
()

Постоянно достают евангелисты вима со своими рассказами про удобство этого редактора.

А ты просто пытаешься его использовать как Notepad.
vim - это не просто другие шорткаты на те же операции. Это другой подход к редактированию файла; намного более эффективный.
Если ты попытаешься переложить Ctrl+C/Ctrl+V, Ctrl+F и т. п. на vim - то намучаешься.

Например:

Выделяю Delay, жму y

Если ты уже на слове, то yiw . Сравни количество телодвижение по сравнению с «выделяю... жму».

По твоему вопросу - впринципе, уже всё сказали, но подытожу:

Самый правильный:
:%s/Times/Delay/g

Если нужно чтобы еще и спаршивало перед заменой:
:%s/Times/Delay/gc

% - значит по всему файлу. Если нужно для выделенного участка:
Выделяешь, потом
:'<,'>s/Times/Delay/gc
(притом '<,'> оно напишет само)

Аналогично можно от курсора вверх до начала файла, от курсора вниз до до конца файла, от строки X до строки Y, от букмарки а до строки содержащей XYZ и т. п.

Если ты уже скопировал Delay, то вставить в командную строку можно Ctrl+r". Это как p в normal mode, но работает везде в не-normal mode - при редактирования текста (insert mode), в командной строке, в поиске и т. п.

Если ты уже искал Times, то можно
:%s//Delay/g

Другой способ (предполагаю что заменяемое - одно слово):
Делаешь поиск по «Times» (если это слово, то можно навести на Times и нажать *), потом на найденном слове делаешь ciw (заменить слово) Delay (ну или Ctrl+r") Ctrl+[ (ну, или Esc - выход из insert mode). Потом n. (n - поиск следующего слова, . - повторение операции).

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

Кроме того, если ты хочешь быстро скопировать в command line участок строки для замены

Niroday
()

Ок. Спасибо за накиданные примеры. Попробую, когда доберусь до реального кода.

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

Ну у мну это jk просто, но не буду же я писать сначала как прибиндить jk а потом чего делать, автор распереживается, что сложно и вообще.

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

Куды убирать? Я ничего не убираю, просто мизинец оттягиваю. Для котиков с нерастопыриваемыми лапками есть ремап с капслоком и xcape.

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

Что, настолько вдумчиво, что таймаут между буквами успевает сработать? Может, ты ещё и кириллической раскладкой не владеешь? Тогда уж лучше на ЯВЕРТЪ перейти...

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

Настолько вдумчиво, что те 2.5 раза в год когда этим занимаюсь, проще esc жамкнуть чем о чём то задумываться.

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