Повторно вставьте / отложите вертикальный блок в VIM

1496
G Gordon Worley III

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

user00 password0 personal_info0 имя пользователя1 пароль1 личная_информация1 ... username9 password9 personal_info9 

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

1

1 ответ на вопрос

3
Chris Johnsen

Если новый столбец будет иметь одно и то же значение в каждой строке (т. Е. Ваш начальный янк был в одной строке), то, вероятно, проще просто визуально заблокировать, выбрать пробел между столбцом имени пользователя и пароля и набрать A(или I), чтобы начать добавление (вставка). Когда вы вернетесь в обычный режим ( Esc), Vim добавит текст и к остальному исходному выделению.

Если вам действительно нужно сделать повторяющийся шаблон, то вы можете использовать функцию и отображение следующим образом:

:function! PutRegFilledToRange() range : let l:fill = '' : let l:lines = getreg() : let l:lineStart = 0 : let l:linesLen = strlen(l:lines) : let l:lineIndex = 0 : let l:linesNeeded = a:lastline - a:firstline + 1 : while l:lineIndex < l:linesNeeded  : let l:lineEnd = matchend(l:lines, "\n\\|$", l:lineStart) : let l:line = strpart(l:lines, l:lineStart, l:lineEnd - l:lineStart) : if l:lines[l:lineEnd - 1] != "\n"  : let l:line = l:line . "\n" : endif : let l:fill = l:fill . l:line : let l:lineStart = l:lineEnd < l:linesLen ? l:lineEnd : 0 : let l:lineIndex = l:lineIndex + 1 : endwhile : : normal gv : " This probably does not make much sense in any mode : " other than block modes, but we will try to cope. : if mode() == "\<C-V>" || mode() == "\<C-S>" : let l:newMode = "\<C-V>" : elseif mode() == 'v' || mode() == 's' : let l:newMode = 'v' : else : let l:newMode = 'V' : endif : let l:origReg = getreg('') : let l:origRegType = getregtype('') : try : call setreg('', l:fill, l:newMode) : execute 'normal ' . v:count1 . 'p' : finally : call setreg('', l:origReg, l:origRegType) : endtry :endfunction :vmap _f :call PutRegFilledToRange()<CR> 

Вставьте ваш .vimrc или какой-нибудь другой файл (и запустите: source / path / to / file). Или вставьте его прямо в сеанс Vim.

Чтобы использовать это:

  • C-Vy: визуально заблокировать выделение и восстановить текст, который вы хотите использовать для многократного ввода
  • C-V: выберите блок, который хотите заменить
  • _f: заполнить выделенный блок повторяющимися строками текущего регистра ( "a_fзаполняет блок строками из регистра a)
Удивительно. Делает именно то, что мне было нужно. Спасибо!!! G Gordon Worley III 14 лет назад 0