В те безнадежно далекие времена, когда я еще сидел на винде и никогда не слышал обо всяких-там линуксах, мне попался на глаза диск журнала «Хакер», на котором я нашел один интересный текстовый редактор. Как редактор он был плох, но мой интерес вызвал вовсе не этим. Меня до глубины души поразила его цветовая тема. Она мне так понравилась, что я решил оставить её на будущее. Как следует заскриншотил, повыдирал цвета «пипеткой» и с тех пор эта тема кочевала вместе со мной с одного инструмента на другой — я использовал её в 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