Неоднократно вставляйте/помещайте вниз вертикальный блок в энергии

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

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

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

1
задан 23.02.2010, 21:30

1 ответ

Если новый столбец будет иметь то же значение на каждой строке (т.е. Ваш начальный рывок был на одной строке), то вероятно, просто легче визуально заблокировать выбор пространство между столбцом имени пользователя и пароля и типом 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 или некоторый другой файл (и работайте: источник/path/to/file). Или вставьте его непосредственно в сессию Vim.

Использовать его:

  • C-V{motion}y: визуально блок выбирает и дергает текст, который Вы хотите использовать для повторного помещения
  • {motion}C-V{motion}: выберите блок, который Вы хотите заменить
  • _f: заполните выбранный блок повторными строками текущего регистра ("a_f блок заливок со строками от регистра a)
3
ответ дан 12.12.2019, 10:45

Теги

Похожие вопросы