LINUX.ORG.RU

умеет ли Vim вставку с заменой таким образом?

 


1

2

Ранее никогда не задавался этим вопросом, но прочитав похожий на реддите, задумался, а умеет ли так Vim, например есть строка:

Bundle "itchyny/calendar.vim" trololo Bundle "int3/vim-extradite"
я хочу скопировать значение в кавычках второго бандла и сразу вставить его в первый, чтобы получилось:
Bundle "int3/vim-extradite" trololo Bundle "int3/vim-extradite"

что я делаю, находясь курсором на втором бандле (внутри кавычек):

  • yi" - копирую содержимое внутри кавычек (yank in ")
  • F. - перехожу обратным поиском к точке, внутрь кавычек первого бандла
  • vi"p - выделяю содержимое в кавычках и вставляю содержимое буфера (visual in " paste)

это наилучшая практика или существует вставка с удалением предыдущего значения - без выделения (v) или замены (с) с удалением (d)?

Т.к. если использовать c/d ( ci"/di" ), заменяемое/удаляемое попадает в буфер и ломает мне кайф - в буфер вставки попадает другое значение (да-да, я знаю про black hole register, но он здесь не поможет).

В общем, как сделать pi" ?

// сдается мне, что можно, но как?

/// если что, то у меня: set clipboard=unnamedplus,autoselect

★★☆

:%s/itchyny\/calendar.vim/int3\/vim-extradite/g

BMX, отвечаю на удаленный коммент: я могу еще дороже способ показать, но зачем :)

science ★★☆ ()

Может тебе пользоваться именнованным буфером:

"ayi"
F.
di"
h
"ap

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

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

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

Значит лучше не будет. Надо же как-то обозначить границы замены.

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

А visual mode не дороже обходится?

Если посчитать, то мой вариант дешевле на 2 экшона, куда дороже-то:

yi" + F. + vi"p VS "ayi" + F. + di" + h + "ap

3 VS 5, грубо говоря, ведь visual mode автоматически выбирает содержимое, я ничего курсором не делаю.

Значит лучше не будет. Надо же как-то обозначить границы замены.

я и обозначаю (хочу обозначить): pi" - вставить в кавычки.

science ★★☆ ()
Последнее исправление: science (всего исправлений: 2)
Ответ на: комментарий от science

pi"

p - односимвольная команда, сработает сразу.

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

Но я акцент делал на работу с именнованными регистрами, тогда стандартные удаления/замены не ломают содержимое нужного регистра, только дефолтный ""

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

можно попробовать не именованный, а нумерованный буфер

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

А можно так, чтобы не заморачиваться с регистрами (буферами)?

Ведь сам экшон объяснить довольно легко: вставить, удаляя предыдущее содержимое.

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

чтобы предыдущие шаги не запутывали - я хочу вставить содержимое моего регистра (любого), чтобы оно автоматически заменило то, что я меняю. Например, что нужно нажать, чтобы сделать с этого:

"первое"
вот это?
"второе"
только лишь вставкой, без v, c, d.

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

только лишь вставкой

нужно же обозначить зону, которую меняешь. команда p не принимает motion => нужно или заранее удалить ненужное, или использовать v

MyTrooName ★★★★★ ()
Ответ на: кто меньше? от MyTrooName

кто меньше?

я, см. мой текущий вариант в первом посте:

yi"
F. 
vi"p
итого: 9

// а мне нужно 7 или 8 :)

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

я об этом знаю, что касается чем обозначить - пожалуйста: i"
как избавиться от 'v', заменить его на 'p'?

Вот в чем заключается вопрос.

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

напиши функцию

т.е. ты считаешь, что из коробки так не умеет?

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

ну тогда подождем vim-мастодонтов, что скажут они.

// хотя одного вчера забанили.

science ★★☆ ()

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

Есть связанный вопрос. Как мне, находясь в строке, запустить поиск по файлу используя ее содержимое? Ввиду того, что настроена интеграция с ситстемным буфером обмена, юзаю пока что команду:

vi"<C-c>/<C-v>
, но как-то оно криво выглядит. Наверняка есть способ без контрол-ц.

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

https://github.com/bronson/vim-visual-star-search

сейчас его мейнтейнит nelstorm: https://github.com/nelstrom/vim-visual-star-search

noomorph, вообще можно было упростить до:

yi"/C-v
(у меня тоже настроена интеграция с буфером обмена: set clipboard=unnamedplus,autoselect ), но в таком случае ведь приходится экранировать символы типа слешей и прочего, так что плугин, конечно, удобнее:
vi"#

science ★★☆ ()

Т.к. если использовать c/d ( ci"/di" ), заменяемое/удаляемое попадает в буфер и ломает мне кайф

удаляй в другой буфер.

пс. я обычно делаю так, что первым пришло в голову. скорей всего в данном случае яб сначала di", потом yi", потом p. переходил бы между двумя строчками через метки либо "/`

vvviperrr ★★★★★ ()

Не помню уже, когда и откуда у меня .vimrc появилось следующее:

" Substitute {motion} text with content of current register.
nnoremap <silent> S :set opfunc=PasteReplace<CR>g@
function! PasteReplace(type, ...)
    if a:0  " Invoked from Visual mode, use '< and '> marks.
	silent exe "normal! `<" . a:type . "`>p"
    elseif a:type == 'line'
	silent exe "normal! '[V']p"
    elseif a:type == 'block'
	silent exe "normal! `[\<C-V>`]p"
    else
	silent exe "normal! `[v`]p"
    endif
endfunction
nmap SS S$

но делает оно именно то, что вы спросили, только вместо p будет Syi"F.Si"

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

но делает оно именно то, что вы спросили

Ну кайф вообще, именно то, что нужно, спасибо большое, золотой материал! Спасибо.

// таки удалось сэкономить один экшон! ведь, вместо vi"p делаем Si"

science ★★☆ ()
Последнее исправление: science (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.