hoe de `diff` uitvoer in de buffer correct te vangen (zonder eerst een bestand te openen)?

samenvatting

Als men diff uitvoert naar een bestandsnaam = *. Diff en dat bestand opent in een buffer, krijgt men een mooi opgemaakte modus = Diff . Hoe krijg je dat direct, zonder eerst een bestand op te nemen?

gegevens

Ik gebruik veel diff , niet alleen via ediff-buffers (waar ik van hou) maar ook voor meer obscure doeleinden, zoals diff ing outputs of processen. Ik gebruik Emacs al verschillende decennia, maar blijf nieuwe aspecten en gebruik leren. Dus ik was niet zozeer verrast als nieuwsgierig om dat te vinden, toen ik dat deed (uit de map/map van een lokale git repo)

$ git diff master origin/master > /tmp/foo__local_vs_remote.diff

en opende het bestand in een buffer, het werd weergegeven in een mooi/nuttig ingekleurde (à la ediff ) modus = Diff. Ik had het nooit eerder tegelijkertijd

  1. captured diff output to a file
  2. named the file *.diff
  3. opened the file in Emacs

Maar nu probeer ik de uitvoer van diff direct naar een buffer en te leiden, zoals de modus happy = Diff, en ik faal.

op zoek naar genericiteit

Note also that, since I use diff in lots of contexts, I'm looking for a solution to the general problem, and not, e.g., just to the git diff problem (which I suspect Magit etc have solved). op zoek naar genericiteit, I'll test 3 usecases: "normal" file-vs-file diff, git diff, and process-substitution diff.

platform

$ lsb_release -ds
LMDE 2 Betsy
$ cat /etc/debian_version
8.3
$ uname -rv
3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u4 (2016-02-29)
$ emacs --version
GNU Emacs 24.4.1

opties

shell-commando

Als ik het volgende doe (mogelijk na het navigeren naar een buffer met een geschikte werkdirectory)

  1. M-!
  2. C-x b *Shell Command Output* (where the output of M-!==M-x shell-commando goes by default)
  3. M-x diff-mode

... ik krijg de mooi opgemaakte uitvoer. voorts

  • dit werkt voor alle 3 testcases
  • als men M -! uitvoert met een ander diff commando, overschrijft de nieuwe uitvoer het oude, maar de buffer onderhoudt diff-modus zonder tussenkomst van de gebruiker
  • geen snelkoppelingswijzigingen (zoals bij de term-modus)

Gekozen antwoord

shell-modus

Als ik ook

  1. M-x shell, goto the correct dir/folder, and run git diff master origin/master
  2. am in a buffer on the correct dir/folder, and run M-& git diff master origin/master

Ik krijg de gevreesde WAARSCHUWING: terminal is niet volledig functioneel .

term-mode

Zoals Emacs User erop wijst , presteert Mx term beter voor deze usecase dan Mx shell : als ik Mx term , ga naar de juiste map/map en voer git diff master origin/master uit, krijg ik mooi ingekleurde uitvoer. Het is niet precies mode = Diff, maar het doet het werk. helaas

  • Dat werkt alleen voor git diff : ik krijg geen inkleuring voor procesvervanging of bestand diff .
  • Ik vind de wijzigingen in de sleutelbindende sleutelbode zeer irritant.
  • Ik vond term-modusnavigatie ook vreemd: tijdens het bewerken van de geschiedenis kaatste mijn cursor soms vreemd rond. opgelost).
2

2 antwoord

U kunt altijd een functie schrijven om alle herhaalde stappen voor u uit te voeren. Dit zou u op weg moeten helpen:

(defun diff-generic(command)
  (interactive "sDiff command:")
  (let ((buffer (generate-new-buffer "*diff-generic*")))
    (with-current-buffer buffer (diff-mode))
    (call-process-shell-command command nil buffer 0)
    (switch-to-buffer buffer)))

In general you can do M-x diff to get that diff output for two arbitrary files. More info on that here: (info "(emacs) Diff Mode")

Magit biedt diff-functionaliteit, maar houd er rekening mee dat het zijn eigen modus genaamd magit-diff-mode gebruikt, die verschilt van generieke emacs diff-mode .

Also emacs bundled package VC provides diff functionality for version control diffs. Unlike magit it works with backends other than git and uses diff-mode, also you can use ediff. Relevant manual: (info "(emacs) Old Revisions")

3
toegevoegd
Ik heb mijn antwoord bijgewerkt, dit moet wat je wilt.
toegevoegd de auteur John Fiala, de bron
zie sectie = 'zoeken naar genericiteit'. Hoe kan dit omgaan met bijvoorbeeld procesvervanging?
toegevoegd de auteur kraymer, de bron

Proberen

  1. M-!
  2. C-x b *Shell Command Output* (where the output of M-!==M-x shell-command goes by default)
  3. M-x diff-mode
2
toegevoegd
Degenen die dit antwoord lezen, moeten zich ervan bewust zijn dat de WAARSCHUWING: terminal niet volledig functioneel is niet wordt opgelost door deze geaccepteerde oplossing. Het kan werken voor dit beperkte diff-geval, maar als je zoekt naar genericiteit als het gewenste OP, gebruik je M-x-term als een complete oplossing. Raadpleeg de Emacs-documentatie om redenen.
toegevoegd de auteur Emacs User, de bron
zie redenen om sectie in kwestie te kiezen = shell-opdracht
toegevoegd de auteur kraymer, de bron