与Emacs Ediff的冲突解决:如何对两个版本进行更改

与Emacs Ediff的冲突解决:如何对两个版本进行更改,emacs,emacs-ediff,Emacs,Emacs Ediff,(问题改编自) 我有一个带有合并冲突标记的文件。它看起来像这样: <<<<<<< HEAD 522ADC9C14B2FD9D00F56BAD /* close_test_button.png in Resources */, 522ADC9D14B2FD9D00F56BAD /* close_test_button@2x.png in Resources */, 522ADCA014

(问题改编自)

我有一个带有合并冲突标记的文件。它看起来像这样:

<<<<<<< HEAD
            522ADC9C14B2FD9D00F56BAD /* close_test_button.png in Resources */,
            522ADC9D14B2FD9D00F56BAD /* close_test_button@2x.png in Resources */,
            522ADCA014B2FDB100F56BAD /* test_failed.png in Resources */,
            522ADCA114B2FDB100F56BAD /* test_failed@2x.png in Resources */,
=======
            EC1633C014B2F3E3004B52E7 /* arrow.png in Resources */,
            EC1633C114B2F3E3004B52E7 /* arrow@2x.png in Resources */,
            EC1633C214B2F3E3004B52E7 /* groups.png in Resources */,
            EC1633C314B2F3E3004B52E7 /* groups@2x.png in Resources */,
>>>>>>> beta_2.8
>测试版2.8
我用M-x vc解决冲突开始。我可以通过敲击键盘上的A或B来选择变量A或B,但如何将这两个变量依次组合起来?

您可以切换到缓冲区“C”并对其进行编辑。如果已选择A或B恢复差异,请按+键

如果你想要的是按下一个键来自动移除差异标记,我只能说这似乎是个糟糕的主意

手动合并应由用户决定。删除每个差异区域来源的线索对我来说并不合适

您可以使用以下命令将标记自定义为空行:

M-:

(setq ediff组合模式'(“A”“B”祖先))
vc resolve conflicts的文档字符串表示它是smerge ediff的别名


如果这是我期待的工作,那么您的缓冲区应该在斯梅奇次要模式,应该有一个菜单斯梅奇。菜单上有你需要的一切。

是的,我完全想这样做!对于下面的代码块,您可以通过键入d-来获取这两个代码,这将从合并缓冲区中的buffer
A
和buffer
B
(按该顺序)获取代码

此代码中唯一真正的困难是
ediff
在一个地方使用宏,需要使用新宏重新评估函数的编译版本。无论如何,请尝试代码。使用Emacs 23.2进行测试

(需要“ediff init”);确保宏已定义,以便我们可以覆盖它
(将宏ediff char定义为buftype(arg)
`(cond((memq,arg'(?a?a))'a)
((memq,arg'(?b?b))'b)
((memq,arg'(?c?c))'c)
((memq,arg'(?d?d))'d)
))
(需要“ediff”)
;; 字面上是从ediff util复制的
;; 需要重新计算,因为它使用上面定义的宏
;; 编译后的版本需要使用新的定义重新编译
;; 为什么是宏????
(定义ediff diff diff到diff(参数和可选键)
“将缓冲区第X个差异区域复制到缓冲区Y\(X、Y是A、B或C\)。
如果是数字前缀参数,请复制参数中指定的差异。
否则,复制“ediff当前差异”给出的差异。
此命令假定它绑定到一个2字符的密钥序列,'ab','ba',
`ac’等,用于确定要用于
复制差异区域。序列中的第一个字符指定
源缓冲区和第二个缓冲区指定目标。
如果给出了第二个可选参数,即2个字符的字符串,请使用它
确定源缓冲区和目标缓冲区,而不是命令键。“
(交互式“P”)
(如果不是控制缓冲区,则为ediff barf)
(或键(setq键(此命令键)))
(如果(等式arg'-)(setq arg-1));将负arg转换为-1
(如果(数字参数)(ediff跳转到差异参数))
(让*((键1(aref键0))
(键2(aref键1))
(char1(ediff事件键1))
(char2(ediff事件键2))
ediff-verbose-p)
(ediff复制差异ediff当前差异
(ediff char到buftype char1)
(ediff字符到buftype字符2))
;重新居中并重新高亮显示,但不显示消息
(ediff重新居中)
(defun ediff-copy-D-to-C(arg)
“将ARGth差异区域从缓冲区A和B复制到C。
ARG是前缀参数。如果为nil,请复制当前差异区域。“
(交互式“P”)
(ediff差异至差异参数“dc”))
(从buf类型到buf类型的defun ediff副本差异(n)
&可选的批调用(要复制的注册表)
(let*((到buf(ediff获取缓冲区到buf类型))
;;;(从buf(如果(不注册复制)(ediff从buf类型获取缓冲区)))
(ctrl buf ediff控制缓冲区)
(已保存-p-t)
(三路ediff-3路作业)
混乱
ediff-verbose-p
reg删除reg删除beg reg删除结束)
(setq reg删除beg)
(ediff get diff posn到buf类型“beg n ctrl buf))
(setq reg删除结束
(ediff get diff posn到buf类型“end n ctrl buf))
(如果(来自buf类型'D的等式)
想要同时复制A和B吗
(如果需要复制)
(来自buf类型nil的setq)
(要复制的setq reg(concat(ediff获取区域内容不包含ctrl buf)
(ediff获取区域内容n'B ctrl-buf)))
正则代码
(如果需要复制)
(来自buf类型nil的setq)
(要复制的setq reg(ediff从buf类型ctrl buf获取区域内容n)))
(要删除的setq reg(ediff获取区域内容
n到buf类型ctrl buf
reg删除beg reg删除结束)
(如果(string=reg以删除要复制的reg)
(setq saved-p nil);不复制相同的缓冲区
似乎可以照搬
(如果(或批调用(ediff测试保存区域n到buf类型))
(条件)
(项目
(从当前缓冲区到buf的ediff
;如果缓冲区是可写的,则防止标志干扰
(let((禁止只读(空缓冲区只读)))
(转到字符注册表以删除结束)
(插入要复制的注册表)
(如果(>reg以删除end reg以删除beg)
(kill region reg删除beg reg删除end))
))
(或批调用)
(setq)
混乱
(ediff保存差异区域n到要删除的buf类型reg)))
(错误(消息“ediff复制差异:%s%s”
(汽车状况)
(mapconcat“prin1到字符串(cdr conds)”)
(嘟嘟声1)
(2)让用户看到错误消息
(setq已保存-p无)
)))
)
;调整情况3中的差异状态,并复制差异ok
(如果(和已保存的-p三向)
(ediff设置所有缓冲区中差异的状态n ctrl buf))
(如果批调用
(ediff明确的细微差别n)
如果差异3工作,我们应该重新计算精细差异,以便清除它们
;在重新插入标志之前(因此在ediff重新居中之前)。
(如果(和已保存)p三-
(defun ediff-copy-both-to-C ()
  (interactive)
  (ediff-copy-diff ediff-current-difference nil 'C nil
                   (concat
                    (ediff-get-region-contents ediff-current-difference 'A ediff-control-buffer)
                    (ediff-get-region-contents ediff-current-difference 'B ediff-control-buffer))))
(defun add-d-to-ediff-mode-map () (define-key ediff-mode-map "d" 'ediff-copy-both-to-C))
(add-hook 'ediff-keymap-setup-hook 'add-d-to-ediff-mode-map)