Git-like gestione di pager / editor

-1

Un po 'di confusione qui.

Sto tentando di riprodurre il comportamento di Git per i cercapersone e gli editori (perché penso che gli sviluppatori Git abbiano già fatto delle buone scelte di progettazione (forse le migliori) in questo ambito).

Durante il tentativo di scomposizione ho scoperto che Git usa il pager / editor impostato sulla variabile di ambiente $PAGER/$EDITOR . Tuttavia, anche se $PAGER/$EDITOR non è impostato, git apre ancora un cercapersone / editor.

Ad esempio, sul mio sistema quando corro.

$ PAGER=cat git log

Git funziona come previsto e utilizza cat per stampare i dati.

Ma io (ovviamente) non devo farlo. E anche se $PAGER non è impostato, che è il caso per impostazione predefinita sul mio sistema in base al seguente comando.

$ echo $PAGER

$

Git può ancora aprire un cercapersone bello, ben scelto ( less nel mio caso) per stampare correttamente i dati.

Questo sembra pulito! Questo è (in una certa misura) il comportamento che sto cercando.

Ma non sono in grado di scoprire come viene implementato. Il pager / editor predefinito viene scelto al momento della compilazione? In tal caso, come posso fare lo stesso, sapendo che sto usando autotools come mio sistema di compilazione. E da come intendo come dovrebbe essere l'opzione per scegliere il pager / editor di default? E c'è una specifica autoconf / automake macro (s) dedicata a questo.

Questa è una configurazione dinamica (può essere cambiata dopo la compilazione in un file di configurazione)? E se è così, vorrei dare un'occhiata a questo file di configurazione. Dove posso trovarlo?

Forse questo è più complicato di così e Git è in grado di indovinare e scegliere automaticamente il pager / editor da solo. E se questo è il caso, mi piacerebbe sapere come funziona.

Qualsiasi consiglio o suggerimento sarà utile. Non necessariamente su come Git sta implementando le cose. Pertanto vorrei sottolineare che il pacchetto che sto costruendo è destinato a essere multipiattaforma, facilmente compilabile / cross-compilabile su piattaforme non linux-like. Quale può o meno avere un comodo editor di riga di comando / cercapersone (come posso supportare gli editor della GUI?). un provider binario potrebbe dover includere l'editor / cercapersone nel pacchetto di distribuzione. Voglio rendere questo processo il più semplice possibile (il provider binario non dovrebbe guardare il codice).

Fondamentalmente voglio fare scelte di design nel miglior modo possibile. Con un piccolo impulso da voi ragazzi, posso fare ancora meglio.

Grazie.

    
posta Abdelhakim AKODADI 05.01.2017 - 11:31
fonte

2 risposte

0

Grazie alla risposta di @ janos e dando una rapida occhiata al codice sorgente di Git .

const char *git_pager(int stdout_is_tty)
{
  const char *pager;

  if (!stdout_is_tty)
      return NULL;

  pager = getenv("GIT_PAGER");
  if (!pager) {
      if (!pager_program)
          read_early_config(core_pager_config, NULL);
      pager = pager_program;
  }
  if (!pager)
      pager = getenv("PAGER");
  if (!pager)
      pager = DEFAULT_PAGER;
  if (!*pager || !strcmp(pager, "cat"))
      pager = NULL;

  return pager;
}

Sono riuscito a capire esattamente il comportamento di Git tra i pager / gli editori. Il che non è così ovvio come si potrebbe pensare .

Come primo passo Git verifica la variabile environnement $GIT_PAGER / $GIT_EDITOR . Se non è impostato, controlla il file di configurazione in ~/.gitconfig . Se non trova un cercapersone / editore lì. Esamina la variabile environnement $PAGER / $EDITOR . Se non è impostato usa il parametro definito (fallback) DEFAULT_PAGER / DEFAULT_EDITOR che a sua volta è impostato su "less" / "vi" a meno che non si pronunci in modo diverso al momento della compilazione specificando --with-pager / --with-editor allo script configure .

Nella maggior parte delle distribuzioni Linux il fallback è impostato su "pager" / "editor" in quanto contengono un collegamento simbolico a un binario di pager / editor definito in /usr/bin/pager / /usr/bin/editor . Nel mio caso:

$ readlink -e /usr/bin/editor 
/bin/nano
$ readlink -e /usr/bin/pager
/bin/less

La gestione dell'editor è un po 'più complicata di così (penso che ci siano alcuni problemi relativi ai terminali vecchi / di base). Ma penso che lo farà adesso. Verificherò in seguito l'editor di sottigliezze e modificherò se penso che sia utile.

    
risposta data 06.01.2017 - 23:58
fonte
0

In base alla documentazione (cerca "core.pager") , il pager predefinito è il comando less .

Quando crei Git dall'origine, puoi trovare le opzioni di configurazione supportate eseguendo ./configure --help e filtrare utilizzando un grep adatto, ad esempio:

./configure --help | grep -i pager

Questo produce:

  --with-pager=VALUE      Use VALUE as the fall-back pager instead of 'less'.
                          does not specify a pager to use through alternate
                          methods. eg: /usr/bin/pager
    
risposta data 05.01.2017 - 13:30
fonte

Leggi altre domande sui tag