Как обрабатывать пути к файлам в 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))
Другие вопросы по тегам