В те безнадежно далекие времена, когда я еще сидел на винде и никогда не слышал обо всяких-там линуксах, мне попался на глаза диск журнала «Хакер», на котором я нашел один интересный текстовый редактор. Как редактор он был плох, но мой интерес вызвал вовсе не этим. Меня до глубины души поразила его цветовая тема. Она мне так понравилась, что я решил оставить её на будущее. Как следует заскриншотил, повыдирал цвета «пипеткой» и с тех пор эта тема кочевала вместе со мной с одного инструмента на другой — я использовал её в Visual Studio (это было, но когда? я уже не помню…), vim (первый курс педагогического (чур меня!) института — паскаль, дельфи и иже с ними). На втором курсе я узнал про Emacs, открыл для себя SICP, и благополучно покинул институт. Конечно же, я позаботился о переносе своей любимой темы в Emacs.

Я пользовался ею до тех пор, пока не набрел на Emacs Starter Kit. Теперь я использую тему эмакса по-умолчанию, другими словами, не использую никаких тем вообще. Причиной тому служит обычный пользовательский прагматизм: если что-то работает, то ну его наxyz — пускай себе работает и дальше. Мне просто перестало нравиться ковырять хоть какие бы то ни было настройки.

Но что делать с темой? Не пропадать же добру почём зря? Конечно! — подумал я. Весь этот пост подсвечен моей темой; если она вам понравилась, но вы не пользуетесь эмаксом — возьмите значения цветов из HTML-кода этой страницы.

Я назвал тему «dzhan» (dʒʌn), что в центрально-азиатских языках означает «душа в поисках счастья».

Вот исходник темы, положите его в свой .emacs и включайте командой M-x color-theme-dzhan или вызывайте функцией (color-theme-dzhan).

 
#+begin_src emacs-lisp 
(require 'color-theme) 
 
(setq dzhan-fore-color    "#b0b0b0" 
      dzhan-back-color    "#303058" 
      dzhan-orange-color  "#f09a71" 
      dzhan-comment-color "#10a5b7") 
 
(defun color-theme-dzhan () 
  "Color theme by Roman Zaharov <zahardzhan@gmail.com>" 
  (Interactive) 
  (Color-theme-install
   `(color-theme-dzhan
     ((foreground-color . ,dzhan-fore-color) 
      (background-color . ,dzhan-back-color) 
      (mouse-color      . ,dzhan-fore-color) 
      (cursor-color     . ,dzhan-fore-color) 
      (border-color     . "#405088") 
      (background-mode  . dark)) 
 
     ((help-highlight-face . underline) 
      (list-matching-lines-face . bold) 
      (widget-mouse-face . highlight)) 
 
     (default ((t (:height normal :width normal
                           :background ,dzhan-back-color
                           :foreground ,dzhan-fore-color
                           :inverse-video nil :box nil :strike-through nil
                           :overline nil :stipple nil :underline nil
                           :slant normal :weight normal)))) 
 
     (bold ((t (:bold t :weight bold)))) 
     (bold-italic ((t (:italic t :bold t :slant italic :weight bold)))) 
     (border ((t (:background "#25254d")))) 
     (comint-highlight-input ((t (:bold t :weight bold)))) 
     (comint-highlight-prompt ((t (:foreground "cyan")))) 
     (cursor ((t (:foreground "#303058" :background "#b0b0b0")))) 
     
     (fixed-pitch ((t (:family "courier")))) 
 
     (font-lock-builtin-face ((t (:foreground "#899cff")))) 
     (font-lock-comment-face ((t (:foreground ,dzhan-comment-color)))) 
     (font-lock-constant-face ((t (:foreground "13c1d5")))) 
     (font-lock-doc-face ((t (:foreground ,dzhan-comment-color)))) 
     (font-lock-doc-string-face ((t (:foreground ,dzhan-comment-color)))) 
     (font-lock-function-name-face ((t (:foreground "#8dbafc")))) 
     (font-lock-keyword-face ((t (:foreground ,dzhan-orange-color)))) 
     (font-lock-preprocessor-face ((t (:foreground ,dzhan-orange-color)))) 
     (font-lock-reference-face ((t (:underline t)))) 
     (font-lock-string-face ((t (:foreground "#4aa5ff")))) 
     (font-lock-type-face ((t (:foreground ,dzhan-orange-color)))) 
     (font-lock-variable-name-face ((t (:foreground "#44c573")))) 
     (font-lock-warning-face ((t (:bold t :foreground "#d04d63" :weight bold)))) 
     
     (fringe ((t (:background "#222251" :foreground "#b0b0b0")))) 
     (header-line ((t (:box (:line-width -1 :style released-button) 
                       :background "grey20" :foreground "grey90" :box nil)))) 
     (highlight ((t (:background "#222251")))) 
     (horizontal-divider ((t (:background "gray16" :foreground "#00ff00")))) 
     
     (ido-first-match ((t (:foreground ,dzhan-orange-color)))) 
     (ido-only-match ((t (:foreground ,dzhan-orange-color :bold t)))) 
     (ido-subdir ((t (:foreground ,dzhan-orange-color)))) 
     
     (isearch ((t (:box (:line-width -1) :foreground ,dzhan-orange-color :background ,dzhan-back-color :underline nil)))) 
     (isearch-fail ((t (:background ,dzhan-back-color :foreground ,dzhan-orange-color :weight bold :inverse-video t)))) 
     (isearch-lazy-highlight-face ((t  (:background ,dzhan-back-color :foreground ,dzhan-orange-color :underline t)))) 
     
     (italic ((t (:italic t :slant italic)))) 
     (menu ((t (:background "gray16" :foreground "green")))) 
     
     (modeline ((t (:background "grey75" :foreground "grey15" :box (:line-width -1 :style flat))))) 
     (modeline-highlight ((t (:bold t)))) 
     (mode-line-inactive ((t (:background "grey60" :foreground "grey15" :box (:line-width -1 :style flat))))) 
     
     (minibuffer-prompt ((t (:foreground ,dzhan-orange-color)))) 
     
     (mouse ((t (:background "yellow")))) 
     (primary-selection ((t (:background "#4a4a67")))) 
     (region ((t (:background "#444478")))) 
     (scroll-bar ((t (:background "gray16" :foreground "#00ff00")))) 
     (secondary-selection ((t (:background "#00ff00" :foreground "black")))) 
 
     (show-paren-match    ((t (:foreground ,dzhan-orange-color :weight bold)))) 
     (show-paren-mismatch ((t (:foreground ,dzhan-orange-color :weight bold :inverse-video t
                                           :box (:line-width -1))))) 
 
     (slime-repl-inputed-output-face ((((class color) (background dark)) (:foreground "#4aa5ff")))) 
 
     (font-latex-verbatim-face ((t (:foreground ,dzhan-comment-color)))) 
 
     (speedbar-button-face ((t (:foreground "#00ff00")))) 
     (speedbar-directory-face ((t (:foreground ,dzhan-orange-color)))) 
     (speedbar-file-face ((t (:foreground ,dzhan-fore-color)))) 
     (speedbar-highlight-face ((t (:background "#4a4a67" :foreground "#eeeeee")))) 
     (speedbar-selected-face ((t (:foreground ,dzhan-orange-color :underline t)))) 
     (speedbar-tag-face ((t (:foreground "yellow")))) 
     (tool-bar ((t (:background "gray16" :foreground "green" :box (:line-width 1 :style released-button))))) 
     (tooltip ((t (:background "#303058" :foreground "#13c1d5")))) 
     (trailing-whitespace ((t (:background "red")))) 
     ;;(underline ((t (:underline t))))
     (variable-pitch ((t (:family "helv")))) 
     (vertical-divider ((t (:background "gray16" :foreground "#00ff00")))) 
     (widget-button-face ((t (:bold t :weight bold)))) 
     (widget-button-pressed-face ((t (:foreground "red")))) 
     (widget-documentation-face ((t (:foreground "lime green")))) 
     (widget-field-face ((t (:background "dim gray")))) 
     (widget-inactive-face ((t (:foreground "light gray")))) 
     (widget-single-line-field-face ((t (:background "dim gray")))) 
     (zmacs-region ((t (:background "steelblue" :foreground "white"))))))) 
 
(provide 'color-theme-dzhan)
#+end_src
 
Пример подсветки синтаксиса для C:
 
#+begin_src c 
#include <stdio.h> 
#include <stdlib.h> /* atoi() */ 
 
static unsigned int calls;
 
unsigned int naive_ackermann(unsigned int m, unsigned int n) {
    calls++;
    if (m == 0)
        return n + 1;
    else if (n == 0)
        return naive_ackermann(m - 1, 1);
    else 
        return naive_ackermann(m - 1, naive_ackermann(m, n - 1));
}
 
unsigned int iterative_ackermann(unsigned int m, unsigned int n) {
    calls++;
    while (m != 0) {
        if (n == 0) {
            n = 1;
        } else {
            n = iterative_ackermann(m, n - 1);
        }
        m--;
    }
    return n + 1;
}
 
unsigned int formula_ackermann(unsigned int m, unsigned int n) {
    calls++;
    while(1) {
        switch(m) {
        case 0:  return n + 1;
        case 1:  return n + 2;
        case 2:  return (n << 1) + 3;
        case 3:  return (1 << (n+3)) - 3;
        default:
            if (n == 0) {
                n = 1;
            } else {
                n = formula_ackermann(m, n - 1);
            }
            m--;
            break;
        }
    }
}
 
int main(int argc, char* argv[]) {
    unsigned int m, n, result;
    m = (unsigned)atoi(argv[1]);
    n = (unsigned)atoi(argv[2]);
 
    calls = 0;
    result = naive_ackermann(m, n);
    printf("Naive:     %u (%u calls)\n", result, calls);
 
    calls = 0;
    result = iterative_ackermann(m, n);
    printf("Iterative: %u (%u calls)\n", result, calls);
 
    calls = 0;
    result = formula_ackermann(m, n);
    printf("Formula:   %u (%u calls)\n", result, calls);
 
    return 0;
}
#+end_src

Footnotes:

1 FOOTNOTE DEFINITION NOT FOUND: 1

2 FOOTNOTE DEFINITION NOT FOUND: 2