Как я могу разделить страницы с Vim? - PullRequest
2 голосов
/ 26 января 2010

У меня есть требование разделить документ ASCII на страницы максимальной длины 58 строк на страницу. Внизу каждой страницы есть нижний колонтитул из 3 строк. Я не знаю каких-либо способностей нумерации страниц в Vim, которые могли бы достичь этого.

Есть ли хороший способ сделать это с Vim? Возможно выделение каждой 58-й строки или что-то в этом роде.

N.B. Я вижу ответы, связанные с использованием отдельного инструмента для этого; о котором я думал. Меня интересует решение Vim.

Спасибо.

Ответы [ 6 ]

3 голосов
/ 26 января 2010

Правильный инструмент, который вы ищете, скорее всего, a2ps.

a2ps --lines-per-page 58 --footer=footer_text document.txt
2 голосов
/ 26 января 2010

Наиболее эффективные способы сделать это в vim - это скрипт (как уже предлагал Джефф Риди) и подстановка (как :%s@\%(.*\n\)\{58}@\0---\rfooter\r---\r@). Макрос (как предлагается в комментарии к этому вопросу) - самый медленный, а скрипт - самый быстрый. Подстановка выполняется медленнее, чем сценарий, но намного быстрее, чем макрос.

Так что, вероятно, замена - лучшее решение только для Vim, если его производительность неприемлема. В этом случае стоит написать скрипт.

2 голосов
/ 26 января 2010

Это возможно в vim как скрипт. Поместите в файл следующее и :source, пока файл для изменения открыт. Список s: footer - это строки для вставки после каждого выполнения 58 строк.

let s:footer = ["","Footer",""]
let s:line = 0

while s:line <= line("$") - 58
  let s:line = s:line + 58
  call append(s:line, s:footer)
  let s:line = s:line + len(s:footer)
endwhile
2 голосов
/ 26 января 2010

Почему важно использовать vim? Вы можете использовать split и cat более эффективно.

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

$ split -l 58 file file_parts
$ for i in file_parts*; do cat $i footer > $i.footered; done
$ cat file_parts*.footered > file.footered

file.footered будет содержать исходный файл с содержимым footer, вставленным в каждую 58-ю строку.

Предполагается, что вы хотите вернуть все обратно в исходный файл. Если вы этого не сделаете, то результирующие файлы file_parts * .footered будут уже разделенными страницами, поэтому вы можете пропустить последний шаг.

1 голос
/ 26 января 2010

Рекурсивный макрос может работать. Поэкспериментируйте со следующим (поместите курсор на первый символ первой строки и переключитесь в обычный режим):

qqq
qq
57j
:read footer.txt
3j
@q
q

Обратите внимание, что регистр, в который вы записываете макрос, должен быть очищен (qqq) и что вы не должны использовать табуляцию при чтении файла нижнего колонтитула (:read footer.txt).

Затем вы можете использовать макрос (обычный режим):

@q
1 голос
/ 26 января 2010

Возможно, вы пытаетесь использовать не тот инструмент для этого. Вы можете сделать это намного проще программно, например, с помощью этого простого Perl oneliner:

perl -pe'print "your\nfooter\nhere\n" unless $. % 58' inputfilename > outputfilename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...