#+TITLE: Emacs: многофункциональный комбайн
#+AUTHOR: Alex Ott
#+EMAIL: alexott@gmail.com
#+FILETAGS: :Writings:Talks:Emacs:
#+DESCRIPTION: Презентация для Scala.by
#+KEYWORDS: emacs, talk
#+LANGUAGE: ru
#+OPTIONS: H:3 num:t toc:t \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+INFOJS_OPT: view:nil toc:nil ltoc:nil mouse:underline buttons:0 path:http://orgmode.org/org-info.js
#+EXPORT_SELECT_TAGS: export
#+EXPORT_EXCLUDE_TAGS: noexport
#+LINK_UP:   
#+LINK_HOME: 
#+startup: beamer
#+LaTeX_CLASS: beamer
#+LaTeX_CLASS_OPTIONS: [bigger, russian, notes=hide]
#+LATEX_HEADER: \mode<presentation> {\usetheme{Madrid}\setbeamercovered{transparent}\usefonttheme[onlysmall]{structurebold}\setbeamertemplate{note page}[plain]}
#+LATEX_HEADER: \usepackage{mathtext}
#+LATEX_HEADER: \usepackage{ucs}
#+LATEX_HEADER: \usepackage{listings}
#+LATEX_HEADER: \usepackage[utf8x]{inputenc}
#+LATEX_HEADER: \usepackage[T2A]{fontenc}
#+LATEX_HEADER: \usepackage[russian,english]{babel}
#+LATEX_HEADER: \hypersetup{unicode,colorlinks=false,bookmarks}
#+LATEX_HEADER: \institute[\lstinline{alexott@gmail.com}]{\lstinline{alexott@gmail.com}}
#+BEAMER_FRAME_LEVEL: 2
#+BIND: org-beamer-outline-frame-title "О чем пойдет речь?"

* Notes                                                            :noexport:

Рабочее название "Emacs: многофункциональный комбайн, или 'Emacs как образ жизни'"

** DONE Сделать в OrgMode?
   CLOSED: [2011-12-05 Mon 19:25]

 - http://emacs-fu.blogspot.com/2009/10/writing-presentations-with-org-mode-and.html
 - http://www.youtube.com/watch?v=Ho6nMWGtepY&feature=player_embedded
 - http://orgmode.org/manual/Beamer-class-export.html#Beamer-class-export

 - [ ] выбрать тему...

* О чем пойдет речь?                                               :noexport:

** О чем пойдет речь?                                              :noexport:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** note                                                             :B_noteNH:

Я думаю, что про Emacs слышал хоть что-то каждый из вас

У Наутилус-Помпилиус есть песня "Буги с косой", в которой есть слова:  "буги-вуги - это
образ жизни,  буги-вуги - это образ мыслей".  То же самое можно сказать и про Emacs ;-)

Для меня (и многих людей) Emacs привлекателен своими возможностями по его расширению, а
также большим кол-вом имеющегося кода, который часто облегчает работу -- при
программировании, редактировании текста и т.д.  Ну и консистентность работы с текстом
нельзя оставлять в стороне...

Я несколько раз пытался использовать другие IDE, например, Eclipse & NetBeans для
программирования на Java, но всегда возвращался в Emacs, если мне надо было написать
больше 100 строк кода...

Однако до сих пор существуют мифы относительно Emacs, и я хотел бы уделить им немного
времени, с пояснениями....

* Распространенные мифы                                              :export:

** Мифы: Emacs тяжел в освоении                                      :export:

#+ATTR_LaTeX: width=\textwidth
[[./images/emacs_learn_curve.png]]

*** note                                                             :B_noteNH:

Да, освоение Emacs может показаться тяжелым, но это обычно в силу непривычности концепций
-- не стоит освоить его "с наскоку", лучше потратить немного времени на изучение базовых
вещей, и ваше время не будет потрачено зря.  В этом смысле можно провести аналогию с
изучением редактора vi -- когда он бикает и портит текст, если вы не знаете как с ним
работать :-)

** Мифы: Вам нужно знать все сочетания клавиш

#+ATTR_LaTeX: width=0.9\textwidth
[[./images/emacs_user_octopus.png]]

*** note                                                             :B_noteNH:

Некоторые люди видят пользователей Emacs'а вот так :-)

Также, есть известная расшифровка названия редактора как Escape-Meta-Alt-Control-Shift :-)

На первый взгляд это может показаться правдой - зубодробительные сочетания клавиш, которые
кажется и не запомнить никогда.  Но часто используемые сокращения заучиваются практически
автоматически, иногда я их даже не помню - мне нужно смотреть на клавиатуру, чтобы сказать
людям, какое сочетание клавиш выполняет ту или иную команду.

На самом деле, эти сочетания организованы очень удобно -- некоторые клавиши, являются
"префиксами" для более длинных команд, позволяя группировать команды сходные по смыслу под
общим префиксом.  Плюс большинство основных команд применяется во всех режимах, так что
нет необходимости учить новые комбинации клавиш, по сравнению с тем, когда ты используешь
несколько разных продуктов для редактирования разного кода и т.п.

Имеются общепринятые соглашения о префиксах, например, =C-x= -- префикс для "system-wide"
команд, которые должны выполняться в любом буфере емакс, независимо от режима. Например,
=C-x C-f= -- для открытия файла, =C-x C-s= -- для сохранения файла, и т.д.

В то время как =C-c= -- префикс для команд, специфичных для определенного режима - они
обычно задаются в самих режимах и/или хуках.

Одной из полезных функциональностей является то, что во многих местах, где надо вводить
текст, вы можете воспользоваться дополнением имен (клавиша =TAB=), а также историей
(листается стрелками и другими клавишами).

** Еще мифы                                                  :export:B_frame:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** Emacs потребляет слишком много ресурсов                         

**** Eight Megabytes And Constantly Swapping
**** EMACS: EMACS Makes A Computer Slow

*** Emacs требует знания Emacs Lisp для конфигурации

**** Используйте =customize=
**** Emacs Lisp нужен в основном для хуков
**** Emacs Lisp -- простой язык

*** Emacs слишком долго стартует

*** note                                                             :B_noteNH:

Ну первый из этих мифов уже утратил свою актуальность для современного железа.  Реализация
Lisp'а требует некоторого кол-ва ресурсов, которые были сильно ограничены на старом
железе.  Сейчас этот вопрос уже не стоит так остро, и на моей машине емакс обычно не
входит в top10 самых прожорливых программ, хотя почти вся работа ведется в нем...

В отношении второго мифа -- это было справедливо много лет назад, но сейчас механизм
=customize= позволяет вам настроить большую часть Emacs используя обычный интерфейс
пользователя, включая checkbox'ы, выпадающие меню и т.д.  

Если вы не планируете писать на Emacs Lisp, то он будет вам нужен в основном для хуков, но
в них используется ограниченное количество функций и команд для установки переменных и
привязок клавиш. Но подробней про Emacs Lisp вам расскажет Дмитрий...

По поводу последнего -- имеется несколько рецептов. Один из них -- просто не закрывайте
Emacs :-) Кроме того, сейчас имеется возможность запуска Emacs в режиме демона, к которому
можно подключаться с помощью =emacsclient= -- в этом случае все будет происходит в одном
интсансе емакса.  Еще один совет -- не загружайте явно пакеты, а пользуйтесь =autoload=,
когда пакет загружается только когда он нужен.

* Работа с Emacs                                                     :export:

** Установка и настройка                                             :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** Бинарные пакеты

 - Linux
 - MS Windows
 - Mac OS X

*** Базовые конфигурации

 - [[https://github.com/technomancy/emacs-starter-kit][Emacs Starter Kit]]
 - [[https://github.com/bbatsov/emacs-prelude][Emacs Prelude]]

*** Дополнительная настройка

 - механизмы *customize*: =customize-variable=, =customize-face= и т.д.
 - hook'и

*** note                                                             :B_noteNH:

Установка Emacs'а проста -- возьмите бинарную сборку для Linux, MS Windows или Mac'а.
Текущей стабильной версией является версия 23, но сейчас идет тестирование беты версии 24,
которая имеет много новых возможностей, так что я рекомендую поставить ее.

Настройка Emacs с нуля может быть не совсем простым делом в силу непривычных
концепций. Поэтому вы можете взять готовые конфиги проекта Emacs Starter Kit и "подточить"
их под себя. А затем уже по мере работы, вы сможете устанавливать новые пакеты (через
=package.el= или [[https://github.com/dimitri/el-get][el-get]], добавлять свой код и т.д.

В начале работы с Emacs, вам будет достаточно базовых средств настройки, которые
реализованы механизмом *customize* - вы можете устанавливать значения переменных,
начертания шрифтов (faces) и т.д.

А затем, по мере освоения, вам может понадобиться написание небольших кусочков кода на
Elisp, в первое время это в основном будут hook'и, в которых в основном используется
ограниченное количество конструкций -- присвоение переменных, назначение клавиш и т.д. Но
про это вам подробней расскажет Дмитрий и я надеюсь, что в этом поможет небольшое
руководство которое вы получили...

** Начало работы                                                     :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** Пройдите встроенный учебник (=C-h t=)

*** Научитесь пользоваться справочной системой (=C-h i=)

*** Поиск и получение информации

 - =M-x apropos= (=C-h a=) -- поиск по регулярному выражению 
 - =M-x describe-variable= (=C-h v=) -- описание заданной переменной
 - =M-x describe-function= (=C-h f=) -- описание заданной функции 
 - =M-x describe-key= (=C-h k=) -- описание сочетания клавиш
 - =M-x describe-mode= (=C-h m=) -- описание режима для текущего буфера
 - =C-h ?= -- справка о справке 

*** note                                                             :B_noteNH:

В состав дистрибутива Emacs входит встроенный учебник, который переведен на многие языки,
в том числе и на русский.  Данный учебник даст познакомит вас с основными командами и
концепциями...

В составе Emacs также имеется и reference card (в том числе и русская), где на нескольких
страницах перечислены основные команды и клавиши.

Помимо учебника, в состав Emacs входят подробное руководство по Emacs, Введение в
программирование на Emacs Lisp, Справочник по Emacs Lisp, а также описания пакетов,
входящих в состав Emacs, но не описанных в руководстве по Emacs.  Все это вы можете
открыть в любой момент, нажав =C-h i=.  Все руководства поставляются в формате Info,
который также используется другими пакетами Emacs и программами (GCC, Glibc, Octave), так
что вы можете иметь доступ к разнообразной документации не покидая Emacs. 

Хотелось бы еще отметить, что вы можете также читать и справочные страницы Unix (man) не
покидая Emacs.  Для этого определена команда =man=, запускаемая через =M-x=, и вы можете
использовать дополнение имен для ввода названия нужной страницы.

В процессе работы вам может понадобиться найти определенную функцию или переменную, или
еще что-то.  Для этого вы можете воспользоваться командой =apropos=, которая получает на
вход регулярное выражение (или слово) и ищет по строкам описаний функций и переменных. Так
что если вы знаете примерное ключевое слово, то вы обычно сможете найти и функцию, которая
выполняет нужную задачу, или переменную, которая контролирует нужное поведение.

А вот после того, как вы узнали имя переменной или функции, например, читая код на elisp,
то можно воспользоваться другими командами для получения детального описания, включая, то,
какие клавиши запускают функцию, какие параметры и т.д.

Также крайне удобными являются команды =describe-key= & =describe-mode=. Первая описывает
команду, привязанную к нужной клавише, а вторая - достаточно подробно описывает текущий
основной режим (об этом ниже), а также все вспомогательные режимы.

** Режимы, пакеты, буфера и т.д.
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** Режимы
 - Основные (major)
 - Вспомогательные (minor)

*** Пакеты
 - встроенные пакеты -- поставляемые с Emacs
 - сторонние пакеты -- установленные пользователем (вручную, или через =package.el=,
   =el-get=, и т.д.)

*** Основные объекты Emacs
**** Буфер/Файл
**** Окно
**** Фрейм

*** note                                                             :B_noteNH:

Основные режимы -- это наборы функциональности, которые реализуют задачу работы с
определенным классом текстов -- программами на разных языках, текстом с различной
разметкой и т.д.  Обычно они реализуют подсветку синтаксиса, работу с синтаксическими
конструкциями, определяют классы символов (например, из чего может состоять имя переменной
или функции) и т.д.  Обычно в одном буфере в конкретный момент времени работает только
один основной режим (есть и исключения, типа MMM-mode, но они не так часты).  Обычно
основной режим выбирается по имени файла или другому признаку, например, если находится
XML-преамбула в файле, но вы можете и явно включить режим выполнив команду =M-x
name-mode=, например, =M-x clojure-mode=.

Вспомогательные режимы обычно реализуют какую-то дополнительную функциональность, не
обязательно привязанную к основному режиму.  Например, проверка проверку орфографии, или
компиляцию кода на лету, раскрытие шаблонов кода, и т.д.  

Пакет - набор кода на Elisp, который реализует некоторую функциональность, например,
основные и дополнительные режимы и т.д.

Буфер - единица редактирования текста -- данные из файла, или временный буфер.
работа с текстом происходит в конкретном буфере, и он имеет набор связанных переменных,
которые могут влиять на работу.  Также каждый буфер сохраняет текущую позицию, раскладку и
многие другие параметры.  Вы можете переключаться между буферами программно или вручную.

Окно -- это не окно операционной системы -- это область внутри фрейма, отображающая
конкретный буфер.  Emacs позволяет создавать сложные конфигурации окон, что иногда
используется, например в ECB, для одновременного отображения списков файлов,
редактируемого текста, списка классов/переменных и т.д.

Фрейм -- это окно операционной системы. Разные фреймы могут иметь разные конфигурации
окон, плюс независимые настройки шрифтов, цветов, размера и т.д.  В некоторых случаях это
используется для показа справки и т.п.

* Emacs для программистов

** Emacs для программистов: C/C++/Java/...                           :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** C/C++
 - CC-mode
   - основной режим для редактирования кода на C/C++/Obj-C/Java/...
   - подсветка синтаксиса
 - =gdb= -- работа с отладчиком прямо в Emacs
 - CTags/ETags/GNU Global/CScope
 - CEDET/Semantic
 - ECB

*** Java
 - JDEE
 - [[https://github.com/espenhw/malabar-mode][malabar-mode]]

*** note                                                           :B_noteNH:

JDEE -- хотя и не развивается в последнее время, все равно может использоваться для
разработки на Java.

В то же время существует более современный =malabar-mode=, который унаследован от
=java-mode=, который реализует подсветку синтаксиса и т.п., но при этом реализует
дополнительные функции как, тесная интеграция с  Maven, консоль Groovy для
прототипирования, интеграция с JUnit, и т.д.

** Emacs для программистов: Lisp-like языки                          :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** Режимы для редактирования кода
 - =lisp-mode=
 - =emacs-lisp-mode=
 - =scheme-mode= & Geiser
 - =clojure-mode=
 - =paredit=
*** Интерактивная работа
*** SLIME
 - поддержка разных Lisp'ов
 - интерактивная работа с кодом, в том числе и удаленная
 - дополнение имен
 - отладчик
 - доступ к документации (online & в коде)
 - навигация по коду
 - инспектор объектов

*** note                                                             :B_noteNH:

Поскольку Emacs и сам написан на разновидности Lisp, то не стоит удивляться хорошей его
поддержке :-)

Для каждого из диалектов имеются свои режимы для редактирования текстов на том или ином
языке, которые реализуют подсветку синтаксиса, навигацию по коду и т.п.  Также в той или
иной мере поддерживается интерактивная работа с соответствующими интерпретаторами.  Про
поддержку Scheme вы можете прочитать подробно у меня на странице.

Но существует один пакет, который делает из Emacs сверхмощную среду работы с Lisp -- это
пакет SLIME, de-facto стандарт при программировании на разных реализациях Common Lisp, и
других диалектах, включая некоторые варианты Scheme + Clojure.

Рассказ про SLIME заслуживает отдельной сессии, так что я не буду на нем надолго
задерживаться.  Те, кто заинтересован, могут найти в интернете видео, рассказывающие и
показывающие как работать со SLIME.

** Emacs для программистов: прочие языки                             :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** Haskell
 - =haskell-mode=
 - [[https://github.com/chrisdone/haskell-emacs][haskell-emacs]]
*** OCaml: =tuareg-mode=
*** Erlang
 - =erlang-mode=
 - Distel
*** Scala
 - =scala-mode=
 - Ensime
*** Python
 - =python-mode=
 - pymacs/rope/...
*** Ruby
*** и еще десятки...

*** note                                                             :B_noteNH:

[[https://github.com/aemoncannon/ensime][ensime]]: 
 - Подсветка ошибок и варнингов
 - показ типов
 - дополнение переменных/методов/и т.д.
 - навигация по коду
 - поддержка SBT, Maven, Ivy
 - REPL
 - Отладчик

** Emacs для программистов: IDE-related                              :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** CEDET
 - Semantic
 - EDE
 - SRecode
 - Speedbar
 - EIEIO
 - COGRE
 - интеграция с внешними утилитами
   - CTags
   - GNU Global
   - CScope

*** ECB

*** note                                                             :B_noteNH:

**** Semantic

Semantic -- наверное самый известный компонент CEDET.  В своей основе Semantic -- набор
утилит для разработки генераторов парсеров и лексических анализаторов.  Сюда также
добавляется возможность генерации и управления тэгами (кусочками синтаксической
информации, такими как имена функций, переменных классов, где они определены и т.п.).  

На этой основе строится остальная функциоанльность Semantic -- разбор кода, сохранение
информации между сессиями, навигация по тагам, свертка кода, подсветка кода в зависимости
от синтаксического класса (более правильное, чем использование regex'ов), а также
дополнение имен классов, переменных и т.д.

В настоящее время существуют парсеры для разных языков программирования, включая C & C++,
Java, Erlang, Python, Lisp, Scheme, JavaScript + несколько "неофициально" поддерживаемых
парсеров.  Стоит правда отметить, что не для всех языков имеется возможность генерации баз
данных тагов, так что дополнение имен может работать только для классов/функций,
определенных в текущем проекте.  В последнее время достаточно активно ведется работа над
Java backend, поскольку нашлись разработчики :-)

Поддержка C/C++ наверное самая развитая в проекте -- это связано с тем, что на этих языках
пишут основные разработчики проекта.  Имеется большое кол-во "ручек" с помощью которых
можно сделать настройку, включая пакет =semantic-gcc=, который выполняет автоматическую
настройку Semantic используя информацию, полученную от компилятора.

**** EDE

EDE предоставляет структуру для управления проектами, в настоящее время имеются реализации
для Make, Automake, ведется разработки поддержки CMake и т.д.  Проект хранит в себе
информацию о настройках, файлах, позволяет собирать код и т.п.

**** Прочее

SRecode (Semantic Recoder) -- шаблонизатор, который позволяет вставку и заполнение
шаблонов кода основываясь на информации о структуре программы, внутри определенного
контекста, например, вставку шаблонов getter/setter только внутри класса, и т.п.

Speedbar -- средство для отображения иерархичной информации, такой как списки функций,
классов, переменных, заголовков в документации и т.п.

Eieio -- реализация объектной системы CLOS на базе Emacs Lisp.  Это основной строительный
блок практически всех компонентов CEDET и некоторых других пакетов....

COGRE (COnnected GRaph Editor) -- библиотека для рисования простых соединенных графов.  На
его основе сделана утилита, которая позволяет нарисовать UML диаграмму для вашего кода,
используя данные Semantic.

Помимо информации от парсеров Semantic, CEDET умеет использовать и информацию из других
источников (ctags, gnu global (gtags), cscope) для навигации по коду, поиску точек вызова
функций и т.д.  Этот механизм расширяемый, так что вы можете добавлять свои утилиты, еще
не поддерживаемые в CEDET.

**** ECB

** Emacs для программистов: контроль версий                          :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

 - =VC= и =DVC= -- унифицированный интерфейс к системам контроля версий
 - =magit= -- удобная поддержка Git
 - =psvn= -- Subversion
 - =ahg= & =mercurial.el= -- Mercurial
 - Darcs
 - Perforce
 - ClearCase
 - PCL CVS
 - + всяческая экзотика...

*** note                                                             :B_noteNH:


** Emacs для программистов: разные утилиты                           :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** EDiff
*** Flymake
*** mk-project/eproject
*** Интеграция с отладчиками
*** yasnippet и другие шаблонизаторы
*** auto-complete & company-mode
*** ctags/etags/cscope/ebrowser
*** работа с SQL
*** EAssist
*** ElDoc

*** note                                                             :B_noteNH:


* Прочие применения

** Работа с текстом                                                  :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:
 
*** AUCTeX/LaTeX-preview/RefTeX/BibTeX
*** nxml-mode
*** nxhtml-mode ((X)HTML со вставками CSS & JavaScript)
*** Поддержка разных Wiki
*** FlySpell
*** Table-mode
*** ...

*** note                                                           :B_noteNH:


** Org-Mode                                                          :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** TODO-менеджер/планировщик задач/Wiki/GTD/...
*** Plain Text!
*** Поддерживает:
 - Таги
 - Даты начала и окончания
 - Приоритеты
 - Зависимости между задачами
 - многое другое...
*** Богатые возможности экспорта - HTML, LaTeX, etc.
*** Таблицы с формулами
*** Babel: literate programming + активный код
*** MobileOrg: iOS/Android

*** note                                                             :B_noteNH:

И эта презентация, кстати, сделана с помощью Org-mode (TODO: сделать слайд, который
покажет кусок исходника?)


** Communications/Messaging                                          :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** Email & News
 - Gnus
 - Wanderlust
 - MH-E
 - Mailcrypt/EasyPG
*** IRC
*** Jabber/GTalk
*** Twitter

*** note                                                             :B_noteNH:


Для IRC имеются очень удобные клиенты, с богатой функциональностью - разные кодировки для
разных каналов и серверов, скриптинг на elisp, автоматический логин, и т.п.


* Разное

** Полезные пакеты                                                   :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** tramp
*** anything
*** ido
*** dired
*** calc
*** ESS
*** Shell/EShell
*** Desktop
*** + сотни пакетов...

*** note                                                             :B_noteNH:


На эту тему даже имеется комикс XKCD :-)

** ...                                                               :export:

#+ATTR_LaTeX: width=\textwidth
[[./images/real-programmers.png]]

*** note                                                             :B_noteNH:



** Ложка дегтя...                                                    :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

*** Отсутствие threading/синхронность
*** Не особо хорошая поддержка смешанного кода
 - HTML/PHP
 - HTML/JavaScript
 - JSP
 - ...
*** Не всегда стабильная работа на MS Windows
*** Нет встроенного веб-браузера :-)

*** note                                                             :B_noteNH:

** Дополнительная информация                                         :export:
   :PROPERTIES:
   :BEAMER_env: frame
   :BEAMER_envargs: [t]
   :END:

 - Emacs Manual
 - Emacs Lisp Introduction/Reference
 - EmacsWiki: http://emacswiki.org/
 - StackOverflow: http://stackoverflow.com/questions/tagged/emacs
 - Planet Emacsen: http://planet.emacsen.org/
 - Русская планета Emacs: http://planet.emacsen.org/ru/
 - Списки рассылки
 - IRC канал #emacs на irc.freenode.net
 - EmacsRookie: http://emacsrookie.com/
 - EmacsRocks: http://emacsrocks.com/ (скринкасты)

*** note                                                           :B_noteNH:

 - more resources from http://batsov.com/articles/2011/11/30/the-ultimate-collection-of-emacs-resources/

Существует множество онлайн-ресурсов посвященных Emacs, на которых вы сможете найти нужную
вам информацию -- это форумы, сборники рецептов, видео, показывающее как работать с Emacs
и т.д.

* Демонстрация

TODO:
 - name completion in C++ with CEDET/Semantic
 - COGRE + UML graph?
 - SLIME with Clojure (take one simple project and evolve it into some program)
 - Org-Mode?

** Вопросы                                                           :export:

#+BEGIN_CENTER
#+ATTR_LaTeX: width=0.5\textwidth
[[./images/question2.png]]
#+END_CENTER

 - E-mail: alexott@gmail.com
 - Sites: http://alexott.net, http://gplus.to/alexott

*** note                                                             :B_noteNH:

Emacs - слишком большой топик, чтобы уложиться в такое короткое время. Я с большим
удовольствием отвечу на ваши вопросы сейчас, и позже - вы можете написать мне по
электронной почте или спросить в Jabber.


# LocalWords:  Emacs