如何在Emacs中处理文件路径?

时间:2014-05-30 17:18:06

标签: bash emacs save elisp

我想创建一个函数,它将使用buffer-file-name获取repo名称,并根据该名称scp到特定服务器。 (我不想使用流浪汉,因为它很慢,我更喜欢在本地工作和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"格式,但如何在没有root和文件名的情况下获取没有root和目录的文件?

1 个答案:

答案 0 :(得分:0)

我最终得到了这个:

(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))