Come usare entrambe le varianti in Ediff?


17

L'interfaccia Ediff ha un +pulsante, ma non sembra fare nulla (il minibuffer mostra invariabilmente "zero" quando lo premo), ho pensato che questo pulsante fosse pensato per usare entrambe le varianti nel buffer dei risultati.

Ad ogni modo, la domanda originale è: come posso fare in modo che Ediff risolva un conflitto di unione inserendo il contenuto di entrambi i buffer A e B nel buffer C (so che posso solo modificare C, ma spero che questo possa essere fatto più facilmente).

Supponiamo che il file A sia questo:

Stessa linea

Linea diversa

Stessa linea

mentre il file B è:

Stessa linea

Un'altra linea

Stessa linea

Voglio che il file C , il risultato della fusione di A con B, assomigli a questo:

Stessa linea

Linea diversa

Un'altra linea

Stessa linea


Non sono sicuro di aver compreso appieno la domanda, ma questa sezione del manuale di Ediff sulla fusione e diff3può essere d'aiuto .
Tianxiang Xiong,

@TianxiangXiong Aggiungerò un esempio di cosa intendo. Non credo che la pagina del manuale collegata lo copra.
wvxvw,

Risposte:


7

Vedi questa risposta StackOverflow .

Da @ killdash9 :

Premendo d si copieranno A e B nel buffer C.

(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)

Poiché il duplicato si trova anche sulla rete StackExchange (e di conseguenza se le persone possono accedere a questo sito saranno in grado di accedere anche a quello), sono favorevole a non copiare il codice, ma a collegarmi semplicemente alla risposta ( come approccio generale alla gestione dei duplicati tra siti). In questo modo se la risposta originale viene migliorata, non ci sono copie obsolete che fluttuano su altri siti. Voto positivo, indipendentemente.
phils,

Ho avuto l'impressione che i siti StackExchange di solito preferiscano avere una risposta sul sito stesso, piuttosto che semplicemente un link. Ma forse è diverso se il collegamento è un altro sito StackExchange? / scrollata di spalle
Tianxiang Xiong

In realtà non so quale sia la politica ufficiale, ma certamente penso che i collegamenti all'interno della rete debbano essere trattati in modo diverso rispetto ai collegamenti fuori rete. Non utilizzare i collegamenti in generale significa che la risposta è accessibile anche se la fonte remota non è disponibile, ma penso che sarebbe altamente improbabile che solo una parte della rete StackExchange sia disponibile in un dato momento, quindi penso che tale argomento scompaia; a quel punto la domanda è se sia sensato dividere le risposte tra due diverse domande duplicate, e credo che non sia quasi mai utile. IMO, comunque.
phils il

3

Modifica: le domande e risposte duplicate su StackOverflow hanno le risposte a questa domanda (come sottolineato da Tianxiang Xiong nei commenti).

La mia risposta qui sotto è inutile, poiché evidentemente non è possibile ottenere il risultato desiderato in questo modo. Non sto solo eliminarlo perché le informazioni si fa dare è piuttosto rilevante, e potrebbe ancora rivelarsi interessanti informazioni a qualcuno.


Personalmente modifico direttamente il buffer di unione, ma puoi insegnare a Emacs cosa fare se hai un requisito standard.

+chiama ediff-combine-diffs:

Combina l'ennesima regione diff dei buffer A e B e posiziona la combinazione in C. N è un argomento prefisso. Se zero, combina le regioni di differenza correnti. La combinazione avviene secondo le specifiche in variabile ediff-combination-pattern.

che è:

Pattern da utilizzare per combinare le aree di differenza nei buffer A e B. Il valore deve essere un elenco del modulo in (STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) cui bufspec è il simbolo A, B o Ancestor. Ad esempio, se il valore è '(STRING1 A STRING2 Ancestor STRING3 B STRING4)quindi il testo combinato sarà simile al seguente:

STRING1
regione diff dalla variante A
STRING2
regione diff dall'antenato
STRING3
regione diff dalla variante B
STRING4

Nota che quando pensi che non stia facendo nulla, in realtà combina le varianti usando i normali marker di conflitto. cioè se hai già selezionato A o B, per impostazione predefinita +è un modo per ripristinare il conflitto originale.


La mia alterazione della ediff-combination-patternrimozione dei tradizionali segni di conflitto utilizzati per impostazione predefinita non sarebbe rimossa? Mi piacerebbe davvero mantenere il conflitto in quel modo fino a quando non lo risolverò usando qualsiasi combinazione di diff dai file uniti.
wvxvw,

Gli indicatori di conflitto hanno origine al di fuori di Emacs, quindi dubito che sia così, ma in realtà non lo so. Provalo?
phils,

Lo farò, ma più tardi oggi. Aggiornerò una volta che lo so.
wvxvw,

In effetti hai ragione: elabora i processi e converte tutte le aree di conflitto in base a quel modello prima di presentare i buffer. Tuttavia, è possibile aggiungere un'associazione personalizzata per un comando che si lega ediff-combination-patternal modello personalizzato e quindi chiama ediff-combine-diffs.
phils,

2
Questa soluzione sembra essere quello che vuoi.
Tianxiang Xiong,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.