emacs tramp模式不尊重远程目录中的.clang格式

时间:2018-02-08 05:34:57

标签: emacs clang-format tramp

我有一个包含.clang-formatsimple.c源代码的git仓库。在本地模式下,即编辑本地磁盘,它会尊重样式文件。但是如果我使用tramp模式编辑相同的repo,那么clang-format将使用一些默认样式文件格式化源代码(我不知道它在哪里被拾取),并且不会尊重存在于其中的样式文件远程目录。

Q1:我该如何解决这个问题?

Q2 :(也许这更容易)tramp-mode中的clang-format默认选择样式文件在哪里?

2 个答案:

答案 0 :(得分:3)

这是我能够解决此问题的方法:

  1. 我将.clang-format文件从远程位置复制到了我的主目录中。
  2. 我编写了以下包装器函数,将--assume-filename参数替换为指向主目录中具有相同名称的文件的路径:
  (defun my-clang-format-region ()
    (interactive)
    (let ((start (if (use-region-p) (region-beginning) (point)))
          (end (if (use-region-p) (region-end) (point)))
          (assumed-filename (if (file-remote-p buffer-file-name)
                                (concat (getenv "HOME") "/" (file-name-nondirectory buffer-file-name))
                               buffer-file-name)))
      (clang-format-region start end clang-format-style assumed-filename)))
  (global-set-key '[(control meta tab)] 'my-clang-format-region)

似乎--assume-filename可以指定一个不存在的文件的路径。 clang-format似乎只关心文件的扩展名和目录路径。它使用目录路径作为查找.clang-format文件的位置。如果找不到该文件,它将在该位置开始的每个祖先目录中查找。

这对我来说适用于clang-format可执行文件的9.0版和10.0版,以及melpa的clang-format.el版20190824.2216。

答案 1 :(得分:0)

如果您具有本地主机的root权限,则创建目录/ssh:host:并将.clang-format从远程主机复制到/ssh:host:/path/to/.clang-format将解决此问题。

这是因为Emacs的clang-format软件包将buffer-file-name传递给本地clang-format可执行文件,而远程文件buffer-file-nameTramp file name特别是Emacs制作的,但clang-format不知道。没有什么可以阻止您在本地主机上创建具有该确切名称的文件,之后clang-format将能够找到并读取相应的.clang-format配置文件。