Как обрабатывать пути к файлам в Emacs?
Я хочу создать функцию, которая будет принимать буферное имя файла, получить имя репо и на основе этого имени scp для конкретного сервера. (Я не хочу использовать tramp, потому что он медленный, я предпочитаю работать локально и scp)
Пока у меня есть это:
(setq save-project '(("~/projects/Repo/" .
(lambda ()
;; run bash command in background
(async-exec-command "???????")))))
(defun save-project-file ()
(interactive)
(let* ((path (vc-find-root buffer-file-name ".git"))
(pair (assoc path save-project)))
(if (not (null pair))
(funcall (cdr pair)))))
(add-hook 'after-save-hook 'save-project-file)
Но я не знаю, как создать строку:
scp <PATH without root> user@server:~/place/<PATH>
Я могу использовать формат с "scp %s user@server:~/place/%s"
но как я могу получить файл без рута и каталог без рута и имени файла?
1 ответ
Решение
Я закончил с этим:
(defun git-file-path (path)
(let* ((root (file-truename (vc-git-root path)))
(filename (file-name-nondirectory path))
(filename-length (length filename)))
(let ((chunk (file-relative-name path root)))
(substring chunk 0 (- (length chunk) filename-length)))))
и формат, который создает команду:
(format "scp %s user@server.com:~/path/%s" buffer-file-name
(git-file-path buffer-file-name))