0

我们必须使用 BitKeeper,它需要在可编辑之前运行“bk edit”。使整个 repo 可编辑是不可能的,因为它太大了。寻求一种让 emacs 自动在 repo 中的文件上运行“bk edit”的方法。

4

2 回答 2

1

请提供一个用例。我相信应该有更好的方法来做到这一点。如果没有,我会更新我的答案。

我想在每个文件上运行钩子会很烦人。我可以在任何文件上运行命令C-x d !

使用此代码:

(require 'dired-x)
(global-set-key (kbd "C-x d") 'dired-jump)

C-x d不仅会打开当前目录dired,还会跳转到当前文件的行。这样!将在文件上运行命令。此命令可以自动完成,TAB这也优于您当前的解决方案。

UPD1

现在我看到您只想bk edit在存储库中的文件上运行。以下是您的操作方法:

(defvar bitkeeper-dirs '("/tmp/"))
(defun bitkeeper-p (file)
  (reduce (lambda (a b) (or a (string-match (expand-file-name b) file)))
          bitkeeper-dirs
          :initial-value nil))

(add-hook 'find-file-hook
          (lambda ()
            (let ((file (buffer-file-name)))
              (when (bitkeeper-p file)
                (read-only-mode -1)
                (shell-command (format "cat %s > /tmp/stuff" file))))))
  1. 您应该将您的 Bitkeeper 存储库列表放入bitkeeper-dirs. 当前谓词仅测试正在打开的文件是否在此目录之一中。
  2. 如果你愿意,你可以写一个更好的谓词。我不能,因为我不知道 Bitkeeper 是如何工作的。如果是 git,我可能会打电话git status 看看它返回什么。
  3. 您应该替换"cat %s > /tmp/stuff""bk edit %s". 当前字符串仅用于测试目的。

UPD2

作为回答

测试文件是否在 bk repo 中的最佳方法是运行“bk root file”,状态为 0 表示它在 repo 中。状态 1 表示不是。

这是新的谓词。我无法测试它,因为我没有 Bitkeeper。

(defun bitkeeper-p (file)
  (string= "0" (shell-command-to-string
                (format "bk root %s") file)))
于 2013-09-05T06:59:56.913 回答
0

怎么样find-file-noselect- 做你的东西,然后switch-to-buffer或使用(display-buffer (find-file-noselect . .) 这是我最近的一个线程,类似于在最终将文件显示在缓冲区中之前做一些事情:  如何在文件打开之前拦截文件并决定哪个帧

于 2013-09-05T01:36:18.570 回答