Удалить и перенаправить строки в Vim в другой файл - PullRequest
4 голосов
/ 11 октября 2011

Я хочу удалить, скажем, последние 10 строк и переместить его в другой файл.

Что я сейчас делаю:

  • выберите последние 10 строк в визуальном режиме,
  • записать эти строки на :'<,'>w в другой файл,
  • , а затем удалить выбранные строки.

Есть ли более эффективный способ сделать это?

Ответы [ 4 ]

4 голосов
/ 02 сентября 2012

Вы можете удалить один шаг, выполнив это:

  • визуально выделите строки
  • :!> newfile.txt

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

Если вы хотите добавить файл вместо перезаписи, используйте >> вместо >.

4 голосов
/ 11 октября 2011

Вместо этого вы можете использовать ex команды. например,

:1,10w file.name Введите первый десять строк

:$-9,$w file.name Введите последнюю десять строк (знак доллара обозначает последнюю строку) <Ч /> С кодом ниже в вашем .vimrc вы можете использовать команду :MoveTo file.name

function! MoveLastLines(f)
  exe '$-9,$w ' . a:f    "write last ten lines to the passed filename
  $-9,$d                 "delete last ten lines
endfunction

command! -nargs=1 -range MoveTo :call MoveLastLines(<f-args>)

<ч /> В обычном режиме упомянутые вами шаги (GV9k:w file.name gvd) являются наиболее эффективными, на мой взгляд.

1 голос
/ 12 октября 2011

Пока вы используете визуальный режим для выбора строк, вы можете удалить только что записанные строки, нажав только три клавиши: d'> (см. :help '>).

1 голос
/ 11 октября 2011

Простой способ записи диапазона строк в файл и их удаления после этого запустить команду

:$-9,$w path | '[,']d

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

Ниже приведена функция MoveToFile(), реализующая команду с тем же название. Все это заключает в себе следующие два шага: написать ряд строк используя команду :write (см. :help :w_f, :help :w!, :help :w_a), затем удалить этот диапазон. 1

command! -nargs=* -complete=file -range=% -bang -bar MoveToFile
\   :<line1>,<line2>call MoveToFile(<q-args>, <bang>0)
function! MoveToFile(fname, overwrite) range
    let r = a:firstline . ',' . a:lastline
    exe r 'w' . ' !'[a:overwrite] . fnameescape(a:fname)
    exe r 'd'
endfunction

Теперь вы можете использовать приведенную выше команду для охвата всех частых случаев использования. За Например, чтобы переместить визуально выбранный диапазон строк в файл, используйте отображение

:vnoremap <leader>m :MoveToFile

Это отображение запускает полунаполненную команду, вызывающую :MoveToFile диапазон линий, выбранных в визуальном режиме ('<,'>). Вам нужно только набрать имя файла и нажмите Введите .

Если вы часто делаете это для последних десяти строк буфера, создайте аналогичный отображение только для этого случая:

:nnoremap <leader>m :$-9,$MoveToFile

1 Указанные строки удаляются в регистр по умолчанию перезаписывая его предыдущее содержимое. Удалить строки, не влияя регистры изменяют последнюю команду в MoveToFile() на

exe r 'd_'

В этом случае :delete использует регистр черной дыры (см. :help :d и :help "_) вместо регистра по умолчанию.

...