我们必须使用 BitKeeper,它需要在可编辑之前运行“bk edit”。使整个 repo 可编辑是不可能的,因为它太大了。寻求一种让 emacs 自动在 repo 中的文件上运行“bk edit”的方法。
问问题
108 次
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))))))
- 您应该将您的 Bitkeeper 存储库列表放入
bitkeeper-dirs
. 当前谓词仅测试正在打开的文件是否在此目录之一中。 - 如果你愿意,你可以写一个更好的谓词。我不能,因为我不知道 Bitkeeper 是如何工作的。如果是 git,我可能会打电话
git status
看看它返回什么。 - 您应该替换
"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 回答