2009-11-02 4 views
0

J'ai créé un thème personnalisé emacs-23 en utilisant customize-create-theme. Cela fonctionne bien sous X (bureau GNOME Linux). Cependant, lorsque vous utilisez un tty (dans le terminal gnome), certaines couleurs sont fausses.custom-theme-set-faces compatible avec tty

Ce n'est pas la précision des couleurs qui pose un problème (bien que ce serait bien de les faire correspondre dans les deux cas), mais le fait que certaines soient tellement hors d'usage qu'elles soient impraticables. Par exemple, les noms de fonction apparaissant en vert sous X sont invisibles sous le tty, bien que les mots-clés apparaissant en or sous X apparaissent également en or (ou au moins une sorte de jaune) sous le tty.

Peut-être que les couleurs tty ne peuvent pas correspondre exactement et donc quelque chose de similaire est en train de se substituer? Si c'est le cas, cela ne semble pas fonctionner tout le temps.

Comment puis-je résoudre ce problème? Est-il possible de spécifier, soit dans l'interface graphique 'customize', soit dans le fichier ~/.emacs.d/my-theme.el, que certaines faces ne s'appliquent qu'aux frames affichés sur X et que d'autres ne sont que pour le tty, ou quelque chose similaire?

(Je suis intéressé à obtenir cela, le système intégré emacs thématisation travail plutôt que d'utiliser un système de thème de couleur externe.)

Répondre

0

Vous pouvez dire si oui ou non la trame courante est associée à une fenêtre graphique en examinant la variable window-system. Le lien a la documentation, mais il ressemble à:

window-system is a variable defined in `C source code'. 
Its value is nil 

Documentation: 
Name of window system through which the selected frame is displayed. 
The value is a symbol--for instance, `x' for X windows. 
The value is nil if the selected frame is on a text-only-terminal. 

Ainsi, vous pouvez envelopper le thème courant dans un

(if window-system 
    ;; current theme configuration 
) 

et puis quand dans un xterm, créez une nouvelle que vous aimez, et le mettre dans l'autre (ou une autre déclaration if ou unless et when)

1

Si une couleur est disponible sur un cadre, emacs devrait essayer de choisir quelque chose « proche », mais qui est souvent très mal sur les écrans de couleurs limitées. Vous devriez demander à emacs combien de couleurs il pense avoir dans gnome-terminal en utilisant M-x list-colors-display (pour voir les couleurs) ou lancer (display-color-cells) dans le tampon de travail. S'il est dit que vous n'en avez que 8, vous voudrez peut-être changer votre variable d'environnement TERM avant de commencer à utiliser emacs (bien que je ne sache pas si cela fonctionne réellement dans gnome-terminal, j'utilise xterm). Cela pourrait aider Emacs à trouver une couleur plus proche, mais si elle ne fonctionne toujours pas, vous voudrez faire quelque chose de plus radical, comme définir les couleurs en fonction du système de fenêtres.

Si vous n'êtes pas en utilisant le mode démon, vous pouvez utiliser quelque chose comme

(if window-system
    (set-face-foreground 'font-lock-function-name-face "LightSkyBlue"))

Si vous utilisez M-x describe-face, il demandera que face à vous voulez décrire, par défaut à celui qui est actuellement au point. Vous pouvez obtenir le nom (et généralement la couleur) à partir de là.

Si vous utilisez le mode démon, alors vous aurez envie de couleurs différentes pour chaque image, dans ce cas, vous aurez besoin de définir la couleur pour le cadre dans le nouveau crochet de cadre, quelque chose comme:

(defun set-new-frame-colors (frame)
   "Set colors based on frame type."
   (if (window-system frame)
       (set-face-forgeground 'font-lock-function-name-face "LightSkyBlue" frame)
       (set-face-forgeground 'font-lock-function-name-face "blue" frame)))
(add-hook 'after-make-frame-functions 'set-new-frame-colors)

Sinon, au lieu de vérifier (window-system frame), vous pouvez vérifier (length (defined-colors frame)) et la base sur le nombre de couleurs sont pris en charge par le système, de sorte que vous pouvez avoir des couleurs différentes pour les terminaux contre 256 couleurs 8 couleurs.

Questions connexes