Использование локальных переменных emacs для указания пути, который будет использоваться в команде

Я использую emacs+AucTeX для записи файлов LaTeX. Внизу файла .tex есть несколько локальных переменных:

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "master-file"
%%% End: 

Они добавляются AucTeX при создании файла.

Что я хотел бы сделать, так это написать функцию lisp, которая будет делать следующее:

  1. Проверьте, существует ли конкретная локальная переменная (назовите ее pdf-copy-path)
  2. Если эта переменная существует, проверьте, является ли это правильно сформированным (unix) путем к каталогу.
  3. Если это так, скопируйте выходной PDF-файл в эту папку.

Выходной PDF-файл имеет то же имя, что и текущий файл .tex, но с расширением .pdf.

Мой lisp-fu не подходит для этого, и я не знаю, как заставить функцию проверять текущий файл на наличие локальной переменной. Любые указатели приветствуются.

Я выбрал SO для этого вопроса, а не SU, потому что это, похоже, вопрос больше о программировании на lisp, чем о чем-либо еще.


person Seamus    schedule 14.02.2011    source источник


Ответы (1)


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

  • Переменная file-local-variables-alist содержит значения, которые вы ищете. Вы хотите использовать одну из функций assoc, чтобы получить значение pdf-copy-path из списка.

  • Вы можете проверить, существует ли файл с помощью функции file-exists-p, и является ли он каталогом с помощью file-attributes (первый элемент).

  • Затем используйте copy-file.

(FWIW, я думаю, что выходной PDF-файл будет соответствовать TeX-master, а не текущему файлу.)

[Отредактировано 24 марта 2011 г. - укажите код]

это должно работать с файлами TeX с блоком локальных переменных, например

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "master"
%%% pdf-copy-path: "/pdf/copy/path"
%%% End: 

Обратите внимание на двойные кавычки вокруг значения TeX-master и значения pdf-copy-path. TeX-master также может быть t

(defun copy-master-pdf ()
  "Copies the TeX master pdf file into the path defined by the
file-local variable `pdf-copy-path', given that both exist."
  (interactive)
  ;; make sure we have local variables, and the right ones
  (when (and (boundp 'file-local-variables-alist)
             (assoc 'pdf-copy-path file-local-variables-alist)
             (assoc 'TeX-master file-local-variables-alist))
    (let* ((path (cdr (assoc 'pdf-copy-path file-local-variables-alist)))
           (master (cdr (assoc 'TeX-master file-local-variables-alist)))
           (pdf (cond ((stringp master)
                      ;; When master is a string, it should name another file.
                       (concat (file-name-sans-extension master) ".pdf"))
                      ((and master (buffer-file-name))
                      ;; When master is t, the current file is the master.
                       (concat (file-name-sans-extension buffer-file-name) ".pdf"))
                      (t ""))))
      (when (and (file-exists-p pdf)
                 (file-directory-p path))
        ;; The 1 tells copy-file to ask before clobbering
        (copy-file pdf path 1)))))
person Kirk Kelsey    schedule 14.02.2011
comment
Ах. Хорошо замечено насчет TeX-master. Спасибо. - person Seamus; 14.02.2011
comment
Я действительно новичок в lisp. Итак, я хочу использовать какую-то функцию assoc для file-local... для извлечения значения правильной переменной, если она есть. И если он есть, передать его в качестве аргумента copy-file правильно? assoc дает вам пару, а не cdr? Что мне действительно нужно, так это хороший lisp для учебника по emacs в первую очередь... - person Seamus; 23.03.2011
comment
Я не претендую на звание опытного программиста на Лиспе, но обновленное решение должно помочь вам в этом. - person Kirk Kelsey; 25.03.2011
comment
Отлично спасибо! Это прекрасно работает. Одна вещь: возможно, стоит обновить ваш ответ с помощью варианта использования: мне потребовалась пара попыток, чтобы понять, что я хочу, чтобы путь был в "double/quotes/" - person Seamus; 25.03.2011