“如何让emacs运行”;bk编辑“;在文件被打开之前?

“如何让emacs运行”;bk编辑“;在文件被打开之前?,emacs,elisp,Emacs,Elisp,我们必须使用BitKeeper,这需要在可编辑之前运行“bk编辑”。使整个回购协议可编辑是不可能的,因为它太大了。询问一种让emacs在回购文件中自动运行“bk edit”的方法。类似于查找文件noselect的方法如何--完成您的工作,然后切换到buffer或使用(显示buffer(查找文件noselect…)这是我最近的一个帖子,类似于在最终将文件显示在缓冲区之前做一些事情:请给出一个用例。我相信应该有更好的方法来做。 如果没有,我会更新我的答案 我想在每个文件上运行钩子会非常烦人。 我可以

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

类似于
查找文件noselect
的方法如何--完成您的工作,然后
切换到buffer
或使用
(显示buffer(查找文件noselect…)
这是我最近的一个帖子,类似于在最终将文件显示在缓冲区之前做一些事情:

请给出一个用例。我相信应该有更好的方法来做。 如果没有,我会更新我的答案

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

使用此代码:

(require 'dired-x)
(global-set-key (kbd "C-x d") 'dired-jump)
C-x d不仅会用
目录
打开当前目录,而且 同时跳转到当前文件的行。使用此!将运行一个命令 此命令可以通过以下选项卡自动完成: 也优于您当前的解决方案

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目录中。
    当前谓词只是测试正在打开的文件是否位于以下位置之一:
    这个目录
  • 如果你愿意,你可以写一个更好的谓词。我不能,因为我没有 知道Bitkeeper是如何工作的。如果是git,我可能会调用
    git status
    看看它会有什么回报
  • 您应该将
    “cat%s>/tmp/stuff”
    替换为
    “bk edit%s”
    。 当前字符串仅用于测试目的
  • UPD2 回应

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

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

    (defun bitkeeper-p (file)
      (string= "0" (shell-command-to-string
                    (format "bk root %s") file)))
    

    事实上,这是因为我们使用的是BitKeeper,在文件被编辑之前,它需要在文件上运行“bk编辑”。我希望emacs在文件打开时自动在文件上运行bk编辑,额外的好处是如果emacs运行“bk编辑”只在BitKeeper repo文件上谢谢你提供的信息。你为什么要做某件事的问题可能比你想做什么更重要。问题的标题很好,但是如果你添加了关于
    bk edit
    的部分,并删除了不起作用的代码,那就太完美了。你好,abo abo,这很有效,但发生在emacs标记之后缓冲区受写保护。因此,在操作系统中,文件是可编辑的,但emacs仍然认为文件不可写。也许让它对文件进行还原可以工作?顺便说一句。测试文件是否处于bk repo中的最佳方法是运行“bk root file”状态为0意味着它在repo中。状态为1意味着它不是。不幸的是,我们的克隆可以无处不在,并且随时更改路径,硬编码它们是不实际的。目前我使用“/”匹配所有文件