1

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

username0 password0 personal_info0
username1 password1 personal_info1
...
username9 password9 personal_info9

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

1 ответ1

3

Если новый столбец будет иметь одно и то же значение в каждой строке (т. Е. Ваш начальный янк был в одной строке), то, вероятно, проще просто визуально заблокировать, выбрав пространство между столбцом имени пользователя и пароля и введите 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-V{motion}y: визуально заблокировать выделение и восстановить текст, который вы хотите использовать для многократного ввода
  • {motion}C-V{motion}: выберите блок, который вы хотите заменить
  • _f: заполнить выделенный блок повторяющимися строками текущего регистра ("a_f заполняет блок строками из регистра a)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .