Хочется этот процесс автоматизировать. Искать специализированные решения - несколько дико.
В качестве файлового менеджера я использую muCommander. Он реализует минимально необходимый набор функций файлового менеджера, не пытаясь стать системой по управлению ОС (аля TotalCommander), но и не столь аскетичен как dired (хотя, возможно, и менее гибок). Кроме того, cross-platform (java), распространяется под GPL. Настройка muCommander для того, чтобы emacs стал редактором по умолчанию, выглядит следующим образом:
В ~\.mucommander\preferences.xml указывается
<editor>
<use_custom>true</use_custom>
<custom_command>emacsclientw.exe -n "$f"</custom_command>
</editor>
Возвращаемся к CLASSPATH. Находясь в директории библиотеки, например C:\JavaLib\axis\ нажимаем (ключи я описал в стиле emacs, но все это, конечно, выполняется в muCommander):
C-a
M-S-c
Это приведет к тому, что пути к файлам будут скопированы в буфер обмена. Переходим в некоторый буфер emacs, например,temp. Вставляем содержимое буфера обмена (C-v или C-y в зависимости от настроек). Его содержимое принимает следующий вид, например:
C:\JavaLib\axis\axis-ant.jar
C:\JavaLib\axis\axis.jar
C:\JavaLib\axis\commons-discovery-0.2.jar
C:\JavaLib\axis\commons-logging-1.0.4.jar
C:\JavaLib\axis\jaxrpc.jar
C:\JavaLib\axis\log4j-1.2.8.jar
C:\JavaLib\axis\saaj.jar
C:\JavaLib\axis\wsdl4j-1.5.1.jar
Подобным образом дополняем список из библиотек других директорий.
Ниже предлагается ряд функций. Может, это и не очень существенная разработка :), но для меня частота их использования конкурирует разьве только что с к командами движения курсора.
;;=============================================================================
;; Join lines
;;=============================================================================
(defun circle-processing (arg function)
"Circle call 'function' 'arg' times, default - once"
(interactive)
(progn
(if arg
(setq times arg)
(setq times 1))
(let (counter)
(dotimes (counter times)
(apply function nil)))))
(defun join-next-line-space ()
"Joins next line with current with a space between them"
(interactive)
(progn
(end-of-line)
(next-line)
(join-line)))
(defun join-next-line ()
"Joins next line with current without space between them"
(interactive)
(progn
(join-next-line-space)
(delete-char 1)))
(defun join-next-line-semicolon ()
"Joins next line with current with semicolon between them"
(interactive)
(progn
(join-next-line)
(insert ";")))
(defun join-next-line-space-n (&optional arg)
"Joins number of next lines with current with a space between them"
(interactive "P")
(circle-processing arg 'join-next-line-space))
(global-set-key "\C-j" 'join-next-line-space-n)
(defun join-next-line-n (&optional arg)
"Joins number of next lines with current without space between them"
(interactive "P")
(circle-processing arg 'join-next-line))
(global-set-key "\C-cj" 'join-next-line-n)
(defun join-next-line-semicolon-n (&optional arg)
"Joins number of next lines with current with semicolon between them"
(interactive "P")
(circle-processing arg 'join-next-line-semicolon))
(global-set-key "\C-c\C-j" 'join-next-line-semicolon-n)
Так, точка в начале буфера.
M-<число строк> C-c C-j (join-next-line-semicolon-n).
CLASSPATH готов.
Обратная задача - преобразование из строки в список удобный для чтения. Вставив строку CLASSPATH в буфер набираем:
M-x replace-string ; <RET> ; C-q <RET> <RET>
К сожалению, перевод строки и/или возврат каретки будет представлен в буфере символом ^M вместо собственно начала новой строки. Но скопировав этот фрагмент из emacs, текст представляется в том виде, в котором изначально и ожидалось.
P.S. При поддержке emacs@conference.jabber.ru :)
P.P.S. Комментарии приветствуются, прежде всего, по стилю написания на elisp (можно ли что-то упростить, унифицировать, etc).