Как записать последовательные именованные файлы в Vim? - PullRequest
3 голосов
/ 02 мая 2009

Я нуждался в этом несколько раз, и только теперь мне пришло в голову, что, возможно, Вим сможет сделать это для меня. Я часто сохраняю файлы, у которых много номеров и чьи имена не имеют значения (они все равно временные).

У меня есть каталог, полный файлов: file001.txt, file002.txt ... (на самом деле они не называются "filexxx.txt" - но ради обсуждения ...). Я часто сохраняю новый и называю его, например, file434.txt. Теперь, поскольку я часто этим занимаюсь, я бы хотел пропустить часть проверки имен.

Есть ли способ сделать скрипт vim, чтобы проверить последний файл xxxx.txt в каталоге и сохранить текущий буфер как filexxx + 1. Как мне написать что-то подобное? Кто-нибудь делал что-то подобное раньше?

Все советы приветствуются.

Ответы [ 3 ]

10 голосов
/ 02 мая 2009

Введите следующее в ~/.vim/plugin/nextunused.vim

" nextunused.vim

" find the next unused filename that matches the given pattern
" counting up from 0.  The pattern is used by printf(), so use %d for
" an integer and %03d for an integer left padded with zeroes of length 3.
function! GetNextUnused( pattern )
  let i = 0
  while filereadable(printf(a:pattern,i))
    let i += 1
  endwhile
  return printf(a:pattern,i)
endfunction

" edit the next unused filename that matches the given pattern
command! -nargs=1 EditNextUnused :execute ':e ' . GetNextUnused('<args>')
" write the current buffer to the next unused filename that matches the given pattern
command! -nargs=1 WriteNextUnused :execute ':w ' . GetNextUnused('<args>')

" To use, try 
"   :EditNextUnused temp%d.txt
"
" or
"
"   :WriteNextUnused path/to/file%03d.extension
"

Так что, если вы находитесь в каталоге, где temp0000.txt - temp0100.txt все уже используются и вы делаете :WriteNextUnused temp%04d.txt, он записывает текущий буфер в temp0101.txt.

1 голос
/ 02 мая 2009

Как насчет скрипта, который вы можете раскошелиться? Вот быстрый скрипт на python, который должен выполнить то, что вам нужно. Сохраните сценарий как «самый высокий.py» где-нибудь на вашем пути. Из VIM войдите в командный режим и введите

:! python high.py "file * .txt"

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

#!/usr/bin/python
#
# Finds the highest numbered file in a directory that matches a given pattern
# Patterns are specified with a *, where the * will be where the number will occur.
#

import os
import re
import sys

highest = "";
highestGroup = -1;

if (len(sys.argv) != 2):
        print "Usage: python high.py \"pattern*.txt\""
        exit()

pattern = sys.argv[1].replace('*', '(\d*)')

exp = re.compile(pattern)

dirList=os.listdir(".")

for fname in dirList:
        matched = re.match(exp, fname)
        if matched:
                if ((highest == "") or (int(matched.group(1)) > highestGroup)):
                        highest = fname
                        highestGroup = int(matched.group(1))

if (highest == ""):
        print "No files match the pattern: ", pattern
else:
        print highest
0 голосов
/ 02 мая 2009

Вы можете писать скрипты для vim на многих мощных языках (в зависимости от того, как компилируется ваш vim), таких как perl, python, ruby. Если вы можете использовать vim, скомпилированный с соответствующим интерпретатором для одного из этих языков, это, вероятно, будет самым простым способом для написания необходимого вами сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...