Emacs@Habrahabr: Навигация в крупных проектах для Vim и Emacs


Из публикаций о Vim и Emacs складывается впечатление, что мало кто использует в них человеческую навигацию по коду. Или же используют вместо нее инструменты вроде ack и ag. А между тем для навигации в этих редакторах есть эффективные инструменты, которые существуют уже не одно десятилетие. Эти инструменты Ctags и Gnu global — они представлены во всех основных серверных Linux-дистрибутивах, так что навигация будет работать даже если разработка ведется на удаленном сервере.

Я буду писать большей частью про Emacs, потому что пользуюсь им, но буду давать ссылки на соответствующие плагины для Vim. Главное донести принцип работы и основные возможности инструментов и отговорить вас от неумеренного использования ack, ag и grep.

Читать дальше →
-1:-- Навигация в крупных проектах для Vim и Emacs (Post PerlPower)--L0--C0--August 28, 2015 11:29 AM

Emacs@Habrahabr: Редактор или IDE? Очередная попытка анализа


Хотелось бы в очередной раз поднять эту довольно спорную тему.

С тех пор, как я начал заниматься программированием, этот вопрос не даёт мне покоя, а многочисленные темы на форумах и хабре ясности не внесли. Плюс к этому, мне кажется, некоторые аргументы как за одну, так и за другую сторону не были приведены. А у тех, что приведены, неверно расставлены приоритеты и упущен контекст.

В статье я постараюсь исправить это упущение и расставить ещё немного точек над «ё».

Приглашаю всех поучавствовать в поисках идеального инструмента.
Читать дальше →
-1:-- Редактор или IDE? Очередная попытка анализа (Post n0dwis)--L0--C0--August 20, 2015 07:21 PM

Emacs LJ community: Двуязычная проверка орфографии в Emacs


(оригинал: ReanGDblog)
Я в последнее время почти полностью перешёл на Emacs, как универсальный редактор для всего, в связи с чем часто пишу там тексты. А поскольку уроки русского языка со школы уже основательно позабылись, то текст приходится часто копировать в LibreOffice для проверки орфографии, что надо признать жутко неудобно. Плюс ко всему я в текстах использую и английские слова, поэтому хотелось бы проверять сразу 2 языка. Найти готовую инструкцию по проверке орфографии в Emacs для такого случая не получилось. Поэтому пришлось разбираться со всем самостоятельно.


Итак, для начала выберем программу для проверки орфографии. Их довольно много, одной из самых хороших считается hunspell. Её используют OpenOffice, LibreOffice, Firefox и другие. К сожалению для выбранного мной плагина она работает немного не так, как нужно, поэтому я остановился на форке Hunspell - enchant, результаты, насколько я могу судить, она выдаёт такие же как и её родитель, отличия только в API. Словари для неё подходят те же, что и для Hunspell, тут я не специалист, выбрал те, что нашёл у себя в репозитории: русский и английский. Если постараться можно отыскать десятки других, в том числе например те, которые не считают использование "е" вместо "ё" ошибкой. Для archlinux поставить это можно вот так:

yaourt -S enchant hunspell-en hunspell-ru-aot

Что бы было понимание как все это работает, я покажу как использовать enchant из command line. Нам понадобятся 2 режима. В первом на вход будем подавать строку с текстом, который хотим проверить, а в ответ получим список слов, которые являются ошибочными:

$ echo "Привед, как у тибя дела? Helllo all right" | enchant -d ru_RU -l 
Привед
тибя
Helllo
all
right

Как ожидалось, русский словарь ничего про английский не знает, поэтому все английские слова пометил как ошибочные. Но мне то требуется двуязычная поддержка. Для решения этой проблемы предлагаются разные варианты, некоторые предлагают сливать 2 словаря в один, другие - вычленять из текста сначала русские слова и прогонять через русский словарь, потом английские - через английский. Оба варианта мне не нравятся, поэтому я просто написал скрипт, который результаты работы русского словаря прогоняет через английский, назвал его spell_check_text.sh, сделал его исполняемым и положил рядом с конфигом emacs:

#!/bin/bash
enchant -d ru_RU -l | enchant -d en_US -l

Протестируем работу:

$ echo "Привед, как у тибя дела? Helllo all right" | ./spell_check_text.sh
Привед
тибя
Helllo

Вуаля, теперь результаты правильные. Второй режим работы enchant о котором я говорил - позволяет получить варианты правильного написания слова по неправильному:

$ echo "Привед" | enchant -d ru_RU -a 
@(#) International Ispell Version 3.1.20 (but really Enchant 1.6.0)
& Привед 9 0: Приведи, Приведу, Приведя, Привод, Привад, Привес, Присед, Привет, Привей

Но поскольку нам опять же нужна проверка двух языков сразу я опять написал скрипт spell_check_word.sh и положил его рядом с spell_check_text.sh:

#!/bin/sh
read word;
echo $word | 
if [[ $word =~ [a-zA-Z] ]]
then
 enchant -d en_US -a
else
 enchant -d ru_RU -a
fi

Смысл думаю очевиден - если находим хоть один английский символ в слове - прогоняем его через английский словарь, иначе через русский.

Осталось прикрутить это все к emacs. Встроенные плагины показались мне очень медленными и мало настраиваемыми, хотя не исключаю, что я просто не умею их готовить. Поэтому я остановился на wcheck-mode, который позволяет настроить почти все что нужно, причём сделать это довольно просто. Плюс у него есть несколько оптимизаций по скорости работы - проверка выполняется в отдельном процессе, только для видимой части текста, только во время простоя, ну и ещё там несколько оптимизаций для увеличения скорости. Научим wcheck-mode правильно работать с enchant:

(defvar lcl-var:spelling-ignore nil)

(defun lcl:spelling-add-to-dictionary (marked-text)
  (let* ((word (downcase (aref marked-text 0)))
         (dict (if (string-match "[a-zA-Z]" word)
                   (message "en_US.dic")
                 (message "ru_RU.dic")))
         (file (concat "~/.config/enchant/" dict)))
    (when (and file (file-writable-p file))
      (with-temp-buffer
        (insert word) (newline)
        (append-to-file (point-min) (point-max) file)
        (message "Added word \"%s\" to the \"%s\" dictionary" word dict))
      (wcheck-mode 0)
      (wcheck-mode 1))))

(defun lcl:spelling-add-to-ignore (marked-text)
  (let ((word (aref marked-text 0)))
    (add-to-list 'lcl-var:spelling-ignore word)
    (message "Added word \"%s\" to the ignore list" word)
    (wcheck--hook-outline-view-change)))

(defun lcl:spelling-action-menu (marked-text)
  (append (wcheck-parser-ispell-suggestions)
          (list (cons "[Add to dictionary]" 'lcl:spelling-add-to-dictionary)
                (cons "[Ignore]" 'lcl:spelling-add-to-ignore))))

(defun lcl:delete-list (delete-list list)
  (dolist (el delete-list)
    (setq list (remove el list)))
  list)

(defun lcl:spelling-parser-lines (&rest ignored)
  (lcl:delete-list lcl-var:spelling-ignore
                   (delete-dups
                    (split-string
                     (buffer-substring-no-properties (point-min) (point-max))
                     "\n+" t))))

(defun cfg:spelling ()
  (require 'wcheck-mode)
  (defun wcheck--choose-action-minibuffer (actions)
    (cdr
     (assoc
      (ido-completing-read "Choose " (mapcar #'car actions))
      actions)))
  (setq-default
   wcheck-language "All"
   wcheck-language-data
   '(("All"
      (program . "~/.config/emacs/bin/spell_check_text.sh")
      (parser . lcl:spelling-parser-lines)
      (action-program . "~/.config/emacs/bin/spell_check_word.sh")
      (action-parser . lcl:spelling-action-menu)
      (read-or-skip-faces
       ((emacs-lisp-mode c-mode c++-mode python-mode)
        read font-lock-comment-face)
       (org-mode
        skip org-block-begin-line org-block-end-line org-meta-line org-link)
       (nil))
      ))))
(cfg:spelling)

Выглядит немного сложно, но я постараюсь объяснить что тут происходит. Вся настройка выполняется в функции "cfg:spelling", в ней, во-первых, переопределяется функция "wcheck–choose-action-minibuffer" из плагина, что бы список вариантов исправления выдавался через ido, можно конечно этого не делать и оставить оригинальную реализацию, но мне она не нравится. Дальше заполняется переменная "wcheck-language-data":

  • program

Какой script будем вызывать для нахождения всех ошибочных слов в тексте, тут я указал путь к описанному ранее spell_check_text.sh

  • parser

Это функция которая распарсит результаты работы скрипта из "program". Реализация lcl:spelling-parser-lines довольно очевидна, обращу лишь внимание на то, что я из результатов удаляю слова добавленные в "ignore" (про эту опция напишу ниже)

  • action-program

Тут указываем какой скрипт вызывать для того, что бы показать варианты правильного написания для слова для слова. Скрипт spell_check_word.sh - я тоже описывал ранее.

  • action-parser

Соответственно parser результатов вызова "action-program". Тут стоит обратить внимание, что помимо результатов я добавил вывод пунктов меню "Add to dictionary" и "Ignore". Если выбрать первый, то слово добавится в пользовательский русский или английский словарь enchant, которых находится тут: "~/.config/enchant/". Само добавление написано в "lcl:spelling-add-to-dictionary", принадлежность слова к определённому языку, опять же определяется по тому есть в нем английские символы или нет. А добавление слова в "Ignore" означает, что в текущей сессии работы с Emacs это слово не будет проверяться во всех буферах. Добавление происходит в "lcl:spelling-add-to-ignore" и фактически сводится к добавлению в переменную "lcl-var:spelling-ignore".

  • read-or-skip-faces

Интересная опция, в данной реализации она говорит, что в режимах "emacs-lisp-mode c-mode c++-mode python-mode" нужно проверять только тот текст, который имеет face "font-lock-comment-face", т.е. только в комментариях. А в режиме "org-mode" проверять весь текст кроме того, который имеет face один из: "org-block-begin-line org-block-end-line org-meta-line org-link", т.е. убираем проверку в служебных тегах и т.п. Если нужно, то вот функция которая поможет узнать текущий face под курсором:

(defun cfg:what-face (pos)
  (interactive "d")
  (let ((face (or (get-char-property (point) 'read-face-name)
                  (get-char-property (point) 'face))))
    (if face (message "Face: %s" face) (message "No face at %d" pos))))

Теперь осталось только по желанию навесить горячие клавиши на управление всем этим хозяйством:
wcheck-mode - функция включения\выключения режима проверки орфографии
wcheck-actions - показать варианты исправления для слова под курсором
wcheck-jump-forward - перейти к следующей ошибке
wcheck-jump-backward - перейти к предыдущей ошибке

В работе выглядит проверка вот так:
Получилось слегка затянуто, но я постарался подробно описать что и откуда берётся, что бы можно было при необходимости доработать под себя.

-1:-- Двуязычная проверка орфографии в Emacs (Post reangd)--L0--C0--June 20, 2015 10:47 PM

Emacs LJ community: Emacs как IDE для Rust

rust_logo.png(оригинал: ReanGDblog)
Многие слышали про такой язык программирования как Rust, это чрезвычайно, на мой взгляд, перспективный и интересный язык от Mozilla, про него сейчас часто пишут и говорят. Он пока еще очень молод (в данный момент доступна только beta версия), в связи с чем поддержки в модных и популярных IDE для него нет или она очень слабая, а попробовать и составить мнение о языке хочется. Как обычно, в таких случаях на помощь нам приходит emacs, в нем относительно легко можно настроить подсветку синтаксиса, компиляцию, автодополнение и т.п.

Сначало добавим подсветку синтаксиса, для этого воспользуемся пакетом rust-mode. Настройка там не мудреная:

(autoload 'rust-mode "rust-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode))


Настройка отступов, если нужно, делаем стандартно - в хуке rust-mode (я не люблю выравнивание табами, поэтому отключу их в примере):

(add-hook 'rust-mode-hook
  (lambda ()
    (setq indent-tabs-mode nil)
    (setq tab-width 4)
    (setq rust-indent-offset 4)))


Что бы продвинуться дальше - нам понадобиться собственно установить сам rust, пакетный менеджер для него cargo, библиотеку для автокомплита racer и исходники rust для автодополнения по ним. Тут стоит сделать замечание, что поскольку релиза rust все еще небыло, то синтаксис языка меняется, сейчас уже не сильно, но все же. И некоторые библиотеки, в частности racer, которую я использую для автодополнения, зачастую отказываются компилироваться на не последней версии. Поэтому я, пока не вышел релиз, использую последнюю ночную сборку rust. Иногда случается обратная ситуация, когда текущая версия racer не успевает за ночной сборкой rust - в этом случае стоит посмотреть на pull requests в репозитории racer, обычно там довольно оперативно появляются те, что чинят проблему.

Все вышеперечисленное - можно без проблем поставить руками по ссылкам выше или скомпилировать самому (замечу только, что компиляция rust из исходников занимает очень приличное время). Я предпочитаю везде где можно использовать пакеты, для archlinux все можно найти в AUR. Бинарники последней ночной версии rust + cargo ставятся пакетом rust-nightly-bin, racer - пакетом racer-git. Исходники можно скачать с сайта rust:

git clone --recursive https://github.com/rust-lang/rust.git ~/.local/share/rust_src


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

Что бы проверить, что все установлено правильно, можно в консоли попробовать вызвать racer (первой строкой, мы указываем racer, где ему искать исходники rust):

export RUST_SRC_PATH=~/.local/share/rust_src/src
racer complete std::io::B


В ответ racer должен выдать список вариантов для автодополнения.

Далее настроим автодополнение в самом emacs. В racer оно работает через жестко зашитый пакет company, который нужно будет установить в emacs, если его раньше не стояло. Потом добавим вот такие строки конфигурации:

(setq racer-rust-src-path "~/.local/share/rust_src/src")
(setq racer-cmd "/usr/bin/racer")
;; (add-to-list 'load-path "<path-to-racer>/editors")
(eval-after-load "rust-mode" '(require 'racer))


Где закоментированная строка - указывает локальный путь к папке editors, но если racer был установлен через пакет, этот путь скорее всего уже настроен в emacs.

После перезагрузки emacs должно заработать "go to the defenition" (по умолчанию по M-.) и автодополнение (по умолчанию по Tab), выглядит это вот так:
rust_autocomplete.gif

Поиск ошибок во время редактирования кода - можно сделать либо через пакет flymake-rust, либо при помощи flycheck-rust, я пользуюсь последним, при настроенном flycheck - достаточно добавить в конфиг:

(eval-after-load 'flycheck
  '(add-hook 'flycheck-mode-hook #'flycheck-rust-setup))


Дальше работаем, как обычно с flycheck, пример отображения ошибок:
rust_flycheck.gif

Следующий этап - компиляция и запуск. Я в данный момент только начинаю изучать rust, пишу небольшие консольные программы, поэтому мой обычный патерн использования - это скомпилировать, запустить и увидеть в emacs то, что вывела программа на консоль. Если кому-то нужно, то сделать себе только компиляцию без запуска, можно по аналогии.

Rust компилируется несколькими способами, если это отдельный файл, то вызываем:

rustc path-to-rs-file && ./rs-file-name


Rust скомпилирует и положит в текущую директорию бинарник с именем rs файла, следующей командой - запускаем получившийся бинарник.
Если у вас есть проект (фактически, если присутствует файл Cargo.toml), то достаточно в любом месте проекта вызвать:

cargo run


В результате скопилируется и запустится "src/main.rs"

Обучим этому emacs, для этого настроим стандартную команду "compile":


(defun lcl:rust-compile-hook ()
  (require 'compile)
  (set (make-local-variable 'compile-command)
       (if (locate-dominating-file (buffer-file-name) "Cargo.toml")
           "cargo run"
         (format "rustc %s && %s" (buffer-file-name)
                 (file-name-sans-extension (buffer-file-name))))))

(setq-default compilation-read-command nil)
(add-hook 'rust-mode-hook 'lcl:rust-compile-hook)


Теперь при вызове встроенной команды "compile", если emacs найдет файл "Cargo.toml" - то скомпилирует и запустит проект через "cargo run", в противном случае через "rustc". Интересная строчка выставляющая переменную "compilation-read-command" в nil, говорит emacs не показывать команду которой будет производится компиляция, но если нужно вручную добавлять какие-то флаги, то можно ее убрать.

Скриншот вывода компилятора в emacs:
rust_compile.png

Для управления проектом, я использую пакет projectile, для снипетов - пакет yasnippet.

В итоге получаем вполне юзабельную IDE для Rust, со всеми необходимыми в повседневной работе фишками.
-1:-- Emacs как IDE для Rust (Post reangd)--L0--C0--April 27, 2015 09:01 AM

Alexander Sviridov: Встречайте: undercover.el

В арсенале Emacs Lisp разработчика доступна весьма неплохая коллекция инструментов для тестирования: evm, ert, ecukes, Cask, Travis CI и многое-многое другое.

Сегодня я рад анонсировать undercover.el – новую библиотеку, рассчитывающую покрытие тестами файлов вашего Emacs Lisp проекта и визуализирующую результат с помощью сервиса Coveralls.

Добавить undercover.el в ваш проект очень просто:

1
2
3
4
5
6
7
(source gnu)
(source melpa)

(package-file "awesome-package.el")

(development
  (depends-on "undercover"))
  • Перед тем как загрузить ваш проект для тестирования (например, в файле test/test-helper.el, если вы используете ert-runner), укажите, для каких файлов будет выполняться проверка покрытия тестами:
1
2
3
4
5
(require 'undercover)

(undercover "*.el" "awesome-extensions/*.el" (:exclude "*-test.el"))

(require 'awesome-package)
  • Все! При следующей сборке проекта в Travis CI отчет по покрытию тестами будет автоматически сформирован и отправлен.
-1:-- Встречайте: undercover.el (Post)--L0--C0--October 06, 2014 10:23 AM

Michael Kazarian: python-mode, памятка

cedet из cvs теперь принудительно дергает python.el (он у меня в /usr/share/emacs/23.1/lisp/progmodes), который конфликтует с python-mode.el, который мне нравится больше. Лечится правкой cedet/semantic/wisent/wisent-python.el Находится строчка (require 'python nil t) и комментируется. При желании перекомпилируется.
Нормальная работа восстановлена и глюков пока не замечено.
-1:-- python-mode, памятка (Post Baloo (noreply@blogger.com))--L0--C0--September 29, 2014 02:17 PM

Alexander Sviridov: Emacs Lisp Style Guide

Божидар Батсов на днях стартовал Emacs Lisp Style Guide. Присоединяйтесь!

-1:-- Emacs Lisp Style Guide (Post)--L0--C0--September 07, 2014 05:56 AM

Ilya Zonov: EDE боль

Примерно раз в год я возвращаюсь к работе над некоторыми C/C++ проектами. И каждый раз я сталкиваюсь с неудобствами работы CEDET + EDE. Сначала я попробую описать свои невзгоды, а в конце предложу свой вариант сделать жизнь чуточку лучше. Комментарии приветствуются.

Какова вообще задача использовать EDE? Я хочу указать где-то все зависимости для конкретного проекта и передать эту информацию в semantic для навигации по коду и авто дополнений. И есть (по-моему здравое) желание не смешивать эту информацию для различных проектов. По-идее большего от EDE мне не надо. Ну может еще команду для сборки проекта добавить. Хотя предпочитаю делать подобное в отдельно взятой консоли. Итак, что нам предлатает Emacs Development Environment.

Пара слов про проекты по-умолчанию (то что создается с помощью ede-new). Больше всего меня бесит настройка через customize-подобный интерфейс. Им вообще не пользоваться для настройки Emacs'а в принципе. Если пойдешь сам что-то править в EDE файле, то точно натолкнешься на беду. Как минимум придется перезапускать Emacs или пересоздавать проект. Кроме того, либо я что-то потерял, либо в проекте по-умолчанию нельзя указать список include папок. Смысла в данном типе EDE-проекта на мой взгляд нет. Можно видимо использовать его для генерации make-файлов, но как показывает практика их писать и поддерживать лучше самому. Automake и подобное вам в помощь.

Также с помощью EDE можно добавить и работать с некоторыми существующими проектами. Например, есть проекты для C/C++ (ede-cpp-root-project), Java (ede-java-root-project) и другие. В них как раз можно указать внешние зависимости, и Semantic с переменным успехом их обрабатывает. Но есть одно но: почему-то эти настройки нельзя положить в Project.ede файл для полного счастья.

Видел такое решение: указать настройки всех проектов в конфигурационных файлах Emacs. Это мне тоже не нравится. Моя Emacs конфигурация все пухнет и пухнет, как я не пытаюсь ее аккуратно структурировать. Если еще там будет информация о всех проектах жизнь станет ужасна.

Была у меня идея положить все настройки в .dir-locals.el. Но тут мы сталкиваемся с проблемой множественного создания одного и того же проекта для каждого открытого файла. По-идее можно написать всю обработку этого случая внутри .dir-locals.el, но так пришлось бы тянуть и копировать это решение в каждый проект. Не айс. Хочется более универсального решения.

В общем к чему это я все. Для себя я написал небольшой хук для c-mode, который загружает конфигурацию проекта из .Project файла, если он еще не был загружен. Также он обновляет список include путей для clang, который используется в auto-complete-clang и flycheck.

(defun init/project-update ()
  (let* ((proj-file ".Project")
         (ede-proj (ede-current-project))
         (proj-dir-tmp (locate-dominating-file buffer-file-name proj-file))
         (proj-dir (when proj-dir-tmp (expand-file-name proj-dir-tmp)))
         (root-dir (when ede-proj
                     (expand-file-name
                      (ede-project-root-directory ede-proj)))))

    (when (and proj-dir (not (equal proj-dir root-dir)))
      (message "load project %s" proj-dir)
      (let ((default-directory proj-dir))
        (load (expand-file-name proj-file)))))

  (let* ((ede-proj (ede-current-project))
         (root-dir (when ede-proj
                     (ede-project-root-directory ede-proj))))
    (when root-dir
      (setq flycheck-clang-include-path
            (mapcar (lambda (item)
                      (concat root-dir item))
                    (oref ede-proj include-path)))
      (make-variable-buffer-local 'ac-clang-flags)
      (setq ac-clang-flags
            (mapcar
             (lambda (item)
               (concat "-I" item))
             flycheck-clang-include-path)))))

А сам .Project файл лежит в корне проекта и содержит только описание проекта (как видите реальной проверки на это нету). Например вот такое:

(ede-cpp-root-project "NewProject"
                      :name "NewProject"
                      :file "Makefile"
                      :include-path '("/inc")
                      :system-include-path '("/usr/include/")
                      :spp-table '(("PROJECT_EXPORT" . "")))

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


P.S. Все эти негативные впечатления от использования EDE видимо возникли в результате годового использования Eclipse и Idea для программирования на Java. Пробовал Emacs заточить для Java, но затея не увенчалась успехом. Но для C/C++ проектов только Emacs, только хардкор.

-1:-- EDE боль (Post Ilya Zonov)--L0--C0--August 18, 2014 08:00 PM

Pavel Vyazovoi: Как готовить Emacs в OS X

Установка

Самая лучшая сборка Emacs для OS X устанавливается следующим образом (у тебя ведь уже есть homebrew, верно?):

brew tap railwaycat/emacsmacport
brew install emacs-mac --icon-modern
brew linkapps

Это свежий GNU Emacs с рядом патчей “под макось”.
Например, этот порт по-умолчанию меняет местами ⌘ и ⌥ в Emacs, потому что так удобнее. Но это отключается. А полный список патчей здесь.

Клавиатура под Emacs

Теперь займемся хардварной оптимизацией. Необходимо демонтировать клаву вашего макбука и заменить на… Да я шучу, конечно =)

Не обязательно, но рекомендую: для комфортной работы в Emacs надо немного поменять расположение самых часто используемых клавиш. А именно: нужно поменять местами левый control с caps lock (это почти обязательно), и правый контрол с return (желательно, чтобы не превратиться в осьминога).

Шутки шутками, а без этого не знаю смог бы ли я познать всю внутреннюю красоту емакса со сломанными пальцами.

Левый контрол с капсом легко меняются средствами системы. Ключ вот здесь:

caps-ctrl-swap

С правым контролом чуть сложнее – понадобится программа KeyRemap4MacBook. Зато она умеет много других полезных штук, например – переключаться на английский язык по одиночному нажатию левой клавиши ⌘, и на русский – по нажатию правой.

В KeyRemap4MacBook нужно включить опцию “Change Return Key > Return to Control_L”. При этом стандартная функция кнопки Return тоже сохраняется – срабатывает в том случае, если нажата только одна клавиша Return, без сочетания с другими. Правда ты же подсел на Emacs, теперь ты должен использовать только ⌃M, точнее сказать C-m, %username%.
Единственный неприятный момент – на такой Return не совсем адекватно реагирует Alfred. Но это было давно, может уже само починилось.

Emacs Mode в KeyRemap4MacBook

В этой программе есть целая группа опций под названием Emacs Mode. Она позволяет применять Emacs-like хоткеи для всей системы. На самом деле, во всех полях ввода OS X уже и так работают Emacs-like хоткеи. Но только основные, а эти опции могут сделать больше, например, транслировать ⌥W в ⌘C (для копирования в emacs-стиле).

EmacsClient

Для того, чтобы открывать файлы из командной строки в emacs, служит emacsclient, который устанавливается в /usr/local/bin, если ты воспользовался рекомендуемым мной способом установки Emacs. Это не относится к OS X, но на всякий случай уточнил, что он работает. Не забудь только сделать (server-start) в одном инстансе емакса.

Настройки OSX-only

Для тех, кто использует один конфиг Emacs на разных ОС, существует возможность задавать настройки локально. Для OS X это делается следующим образом:

(when (eq system-type 'darwin)
; ты знаешь что делать
)

Сразу рекомендую прописать туда:

(menu-bar-mode 1)

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

Переключение языков в Emacs

Хорошо бы написать аналог программы emxkb для оконной системы OS X, чтобы удобно переключать языки ввода в Emacs. Подробнее про emxkb.

org-protocol

Org-mode это обалденный пакет. Если ты им пользуешься и тебе нужен рабочий org-protocol в OS X, то читай дальше.

Подробнее что зачем и почему написано вот здесь.

Реализация для Aquamacs здесь.

Реализацию для GNU Emacs из brew я сделал и положил сюда. Нужно просто скачать и положить в /Applications.

Есть ещё один нюанс: у меня в safari не работали букмарклеты для org-protocol пока я не заменил двойные слеши на одинарные, вот так:

javascript:location.href='org-protocol:/store-link:/'+encodeURIComponent(location.href)
-1:-- Как готовить Emacs в OS X (Post)--L0--C0--May 12, 2014 02:53 AM

Pavel Vyazovoi: Скромное мнение о редакторах текста

Я люблю экспериментировать с разными редакторами кода для программистов. Особый интерес проявляю к так называемым “hackable” редакторам кода (затрудняюсь перевести на русский). Давно хотел написать такой пост – просто мнение о тех редакторах, на которые обращаю внимание.

VIM (MacVim)

Автор vim-плагина Airline очень хорошо охарактеризовал его, когда сваливал на Emacs. Он написал примерно так: “VIM лучше в редактировании текста, но Emacs лучше для работы”. Я полностью согласен, команды vim очень хороши в навигации по тексту и его редактировании. Только для того, чтобы понять эту магию, необходимо хорошо изучить vim. Но vim тормоз и ограниченный. Если попытаться добавить в него часть функциональности, которую я привык видеть в Emacs, он начинает дико тормозить. Я пробовал профилировать плагины, тормозят все по немногу.

Emacs

До сих пор считаю эту среду лучшей для множества задач. Emacs это не редактор, а интерпретатор лиспа – этим всё сказано. Если в виме есть работа с метками (закладками) и история изменений в виде дерева, то для Emacs существует несколько пакетов рыботы с метками и пакет для реализации истории, как в vim. Всё это реализовано на elisp и программист (у Emacs нет “просто пользователей”) может в реальном времени изменять или полностью переделывать реализацию этих функций. Emacs – замечательный почтовый и jabber клиент, лучший органайзер и т.д. Но всё это великолепие затмевается высоким порогом вхождения. Если не углубиться в Emacs и сразу свалить на vim, то так и не познаешь всю эту магию (у большинства заявляющих “пробовал я этот ваш emacs” именно так и было, не распробовал). Кстати, упомянутый выше автор Airline перешел на Emacs только потому, что для Emacs существует лучшая реализация эмуляции vim-а. Работают все команды, которые я знаю в vim (а я их знаю много, целенаправленно изучал). Некоторые считают evil-mode реализацией недостающего текстового редактора в операционной системе Emacs. Для него даже замечательный плагин surround реализован и работает точно как в vim, а не так, как жалкое подобие в sublime.

Sublime Text 3

Действительно хороший редактор, но с ним как-то скучно. UI для плагинов у него слишком простой, но зато это единственный редактор, в котором есть умный авто-комплит и переход к определению для PHP. Всё благодаря плагину Sublime CodeIntel, код которого был взят из Komodo IDE. Плагины в саблайме работают в отдельном потоке, именно поэтому линтеры работают в фоне, а не при каждом сохранеии (как vim). И именно поэтому возможна реализация CodeIntel, который в фоне индексирует код. Не тормозит с кучей плагинов, красивый, всё работает.

Atom

Вроде как “hackable editor for the 21st Century”, но пока слишком тормозной. Зато сразу на старте появилась почти вся нужная мне функциональность, потому что плагины клепают очень быстро, они ведь на javascript (и coffee). Плагины на javascript это хорошо. А вот “taking the web native” пока не в полной мере присутствует. Где live-coding для javascript как в LightTable? Кстати, они, кажется, хотели его продавать. А как это, если исходники открыты под либеральной лицензией?

LightTable

По задумке классный проект, но в данный момент больше напоминает демку. Из коробки live coding для нескольких языков: html/css, javascript, clojure, clojurescript, python. Можно ещё плагин для ruby доустановить. Live coding реализован классно – можно видеть результат выполнения кода прямо в редакторе, а можно подключиться к своему браузеру/repl/приложению и выполнять его там. Но много чего пока нету и самое печальное – нет документации для разработчиков. Так – пару статей в блогах о внутренностях LT. Короче говоря нет такой инструкции как у атома – садимся и за пять минут пишем демо-плагин. Кстати, сделан этот редактор (IDE?) тоже на web-технологиях, поэтому в качестве редактора используется CodeMirror. Ощущения от редактирования как-то не очень, хотя тормозит меньше чем atom. Тем не менее, что бы я там себе не думал, программисты на clojure уже используют его в работе.

-1:-- Скромное мнение о редакторах текста (Post)--L0--C0--May 12, 2014 12:40 AM

Kostafey: Fuzzy matching в popup-switcher с использованием flx

Наконец добрался до fuzzy matching в popup-switcher. Есть несколько решений для осуществления нечеткого поиска в Emacs. Например:

Настройка

В popup-switcher используется flx. ИМХО, это просто прекрасный движек для нечеткого поиска, хотя автор и предупреждает о том, что проект достаточно молодой и возможно еще остались ошибки.

В flx-ido есть более высокоуровневые функции, поэтому фактически зависимость именно от flx-ido.

Как и в случае с CEDET и projectile, явно зависимость не указывается (чтобы не превращать popup-switcher в монстра с большим количеством обязательных зависимостей). Чтобы воспользоваться возможностью нечеткого поиска, необходимо установить flx и flx-ido любым удобным вам способом, например через MELPA:

 M-x package-install [RET] flx-ido [RET]
Кроме этого, необходимо установить psw-use-flx в значение t

(setq psw-use-flx t)

Пример использования

Например, неообходимо найти функцию psw-get-item-by-name. Вызываем psw-switch-function (любым выбранным клавиатурным сочетанием), набираем первые буквы слов "get" и "item" - "gi", flx сузит список поиска и отсортирует по релевантности:
Пример использования flx в popup-switcher.

P.S.

Happy hacking! :)
-1:-- Fuzzy matching в popup-switcher с использованием flx (Post Kostafey (noreply@blogger.com))--L0--C0--May 03, 2014 11:02 AM

Kostafey: popup-switcher - переключение буферов и навигация по функциям, используя TUI-меню

Эргономика промышленных решений

С некоторого времени для разработки на Java я использую IntelliJ IDEA. Какова там навигация по файлам или по методам! Нажимаешь C-S-n (или C-n для классов) и появляется окошко поиска со списком. Вводишь буквы из названия файла и список сокращается - самый удобный способ навигации по файлам проекта. Аналогично C-F12 для навигации по методам открытого класса - интерактивно изменяющееся меню на основе вводимых символов из имени метода. Ничего эргономичнее до этого не видел.

Изящество и красота текстовых интерфейсов

В emacs это все есть, безусловно, но выглядит это... в emacs вообще все выглядит абсолютно самобытно. Именно самобытно. Думаю, вряд ли кто-то скажет, что emacs предоставляет GUI - интерфейс, возможно лишь местами. В большинстве случаев, emacs не предоставляет и CLI - да, он часто интегрируется и CLI-инструментами: CLI-утилита является back-end-ом, а emacs предоставляет свою обертку, он имеет внутренние оболочки shell-ы и repl-ы, может сам быть запущен из внешних, но этот интерфейс, хоть и играет важную роль, все же является скорее вспомогательным. Выходит TUI? Во-многом, да. Но он зачастую деформируется механизмом окон. Если взять, например, mc, far, ndd, старые, времен DOS, среды разработки, антивирусы, архиваторы, предоставляющие TUI-интерфейс, то там любое диалоговое окно - часть общего текстового рабочего пространства. В emacs же окна жестко механически разделяют текстовые области. Данный подход стал идиоматическим. Скажем, org-mode и magit - примеры эффективного разделения возможностей TUI в рамках основного буфера и добавления вспомогательных окон и буферов. Такие буферы имеют свои специальные режимы с удобными таблицами ключей. Может оно и хорошо, и у такого подхода безусловно есть свои плюсы, но всегда ли это нужно? На каждый чих создается новое окно и в нем свой буфер. Лично мне куда приятнее чаще видеть старый-добрый TUI-интерфейс там, где создание отдельного окна избыточно.

TUI в emacs

Библиотеки popup-el (выпадающие меню) и direx-el (деревья) - примеры расширений, предоставляющих некоторую функциональность TUI. К сожалению, предоставляется лишь некоторая часть возможных виджетов, но тем не менее, имеющиеся весьма удобны.

Так, например, первая из них позволила мне реализовать в TUI некоторые из идей, используемых в IntelliJ IDEA: popup-switcher. Вызов интерактивной функции

  • psw-switch-buffer - приведет к появлению списка открытых буферов. Ввод символов имени буфера будет сокращать список. Именно в качестве (еще одного) механизма переключения буферов и задумывался изначально popup-switcher, однако на самом деле, он может быть использован для переключения чего угодно (отсюда и название).
  • psw-switch-projectile-files - работает со всеми файлами проекта (файлы проекта рассматриваются в контексте расширения projectile).
  • psw-switch-function - работает с функциями/методами в текущем файле.
Пример навигации по буферам.
Пример навигации по функциям в файле с исходным кодом на Clojure.

Установка

Установка расширения довольно проста. Добавьте MELPA в вашу переменную package-archives (если у вас он еще не был добавлен):

(require 'package)
(add-to-list 'package-archives
'("melpa" . "http://melpa.milkbox.net/packages/"))
(package-initialize)
Далее popup-switcher устанавливается командой:

M-x package-install [RET] popup-switcher [RET]
Кроме того, в файле инициализации .emacs необходимо указать:

(require 'popup-switcher)

Настройка

После установки psw-in-window-center в значение t всплывающее меню будет появляться в середине окна. По умолчанию появляется в посередине меду левым краем окна и значением fill-column.

(setq psw-in-window-center t)
Вы можете установить интерактивные функции переключения буферов и навигации по методам для определенных клавиатурных сочетаний на ваш вкус, например:

(global-set-key [f2] 'psw-switch-buffer)
(global-set-key (kbd "C-S-n") 'psw-switch-projectile-files)
Для активации возможности навигации по функциям/методам необходимо установить последнюю версию CEDET и подключить библиотеку eassist. Это не является обязательным, и вы можете использовать popup-switcher без CEDET (и, очевидно, без данной функциональности). Пример настройки:

;; Activate semantic
(semantic-mode 1)

;; Load contrib library
(add-to-list 'load-path "~/.emacs.d/cedet/contrib/")
(require 'eassist)

(eval-after-load "eassist"
'(global-set-key [f3] 'psw-switch-function))

Добавление переключений

Добавлять новые применения механизма переключения очень просто, так функция psw-switch-buffer выглядит следующим образом:

(defun psw-switch-buffer ()
(interactive)
(psw-switcher
:items-list (psw-get-buffer-list)
:item-name-getter 'buffer-name
:switcher 'switch-to-buffer))
где
  • items-list - список, в котором осуществляется выбор (psw-get-buffer-list - просто использует встроеную функцию buffer-list с некоторыми дополнительными фильтрами).
  • item-name-getter - функция получения текстового обозначения каждого элемента списка в меню выбора.
  • switcher - функция, описывающая что делать с выбранным элементом.

Заключение

Для emacs существуют хоть и не всеобъемлющие, но весьма удобные библиотеки работы с TUI. Например, popup-elуже использующаяся в проектах auto-complete и emacs-jedi, а теперь и в popup-switcher.

Библиотека direx-el используется, например, в проекте emacs-jedi-direx. direx-el потенциально может выступать в качестве основы для более простого и современного аналога ECB. Конечно, в данном случае создание нового окна будет необходимо, но мне кажется, что это как раз тот случай, когда это оправдано.

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

-1:-- popup-switcher - переключение буферов и навигация по функциям, используя TUI-меню (Post Kostafey (noreply@blogger.com))--L0--C0--November 05, 2013 02:06 PM

Ilya Zonov: Emacs + Java

Появилась у меня в последнее время необходимость основательно познать Java. Очень долго не смотрел в его сторону, были у меня некоторые предубеждения. Я всегда думал, что plain C и Lisp это наше все. И этого достаточно. А сейчас работа повернулась стороной с Java лицом и соответственно захотел быстренько познать его особенности, а также настроить свой любимый редактор для удобной работы с этим популярным языком программирования.

Для каждого языка программирования в Emacs я стараюсь настроить следующие возможности:

  • Подсветка синтаксиса (есть из коробки)
  • Авто дополнения (желательно через auto-complete)
  • Навигация по коду
  • Работа с проектами (опционально, люблю работать в консоли вне Emacs)
  • REPL (также опционально, но очень помогает во время обучения)

Из коробки в java-mode фактически работает только подсветка синтаксиса. Cedet идущий с Emacs'ом также позваляет настроить автодополнения и навигацию внутри классов. Но вот, например, системные вещи наотрез отказывается предлагать в качестве дополнений.

В общем я решил посмотреть, какие сейчас есть удобств для работы с Java в Emacs. При этом я наткнулся на следующие вещи:

Немного впечатлений о каждом расширении. Все пробовал на MacBook Air, OS X, Emacs 24.3.1 из MacPorts.

JDEE

Старое и похоже переставшее развиваться расширение. Сразу не понравилось, что тянет с собой свою цветовую схему. Мелочи, но они всегда бросаются в глаза. Также JDEE каким-то образом умудряется нарушить работу whitespace-mode, который перестает подсвечивать вообще что-либо. Данную проблему решить не смог. Есть у меня подозрение, что это связано с перекрашиванием буфера, но глубока не капал за ненадобностью. Нечто похожее сейчас есть в markdown-mode. Ну и каких-то особых возможностей здесь не нашел. Все плюшки сделаны через Cedet, соответственно их можно получить и без JDEE.

Malabar-mode

Завязан на Maven, про который ранее слышал совсем чуть-чуть и отдаленно. Быстренько глянул, как работать с этим менеджером проектов. Создал тестовый проект, но производительность malabar-mode вообще не порадовала. Он как я понял использует Groovy console для формирования дополнений. И это похоже порой не быстрый процесс. В общем от этого варианта тоже отказался. Кроме того проект также загибается. Хотя в знакомстве с malabar-mode есть свой плюс: я узнал что такое Maven и как с ним работать.

Eclime

Вот это вообще монстр. Идея затащить в Emacs (изначально в Vim) функционал Eclipse через некий интерфейс тоже на деле оказывается не шибко производительна. В данном случае eclime запускает Eclipse на заднем плане и общается с ним, чтобы получить автодополнения и еще некоторый функционал (рефакторинг, навигация по коду и т.п.). Скорость отзывчивости данной системы еще меньше, чем у Malabar.

Auto Java Complete

Смысл данного расширения прост: сгенерировать теги необходимых Java библиотек и предоставить интерфейс для auto-complete. Я попробовал использовать готовые теги и это работает достаточно быстро и удобно. Но тут мы получаем только информацию системных библиотек и того что сами укажем ручками при генерации тегов. В принципе в связке со стандартным Cedet идущим с Emacs'ом должно всего этого хватить.

Cedet Dev

Самый удобный, как мне кажется, вариант это использовать последнюю версию Cedet из Bazaar репозитория. Тут сейчас Java хорошо поддерживается. Maven проекты кстати тоже отлично воспринимаются. По работе и настройке Cedet лучше обращаться к статье Alex Ott'а.


На данный момент я остановился на последнем варианте: Cedet Dev + auto-complete. Есть у кого еще предложения как улучшить жизнь в Emacs при работе с Java? Или все таки Cedet это наше все и смотреть в другие стороны лучше не стоит?

-1:-- Emacs + Java (Post Ilya Zonov)--L0--C0--August 24, 2013 08:00 PM

Oleksandr Gavenko: Сортируем без повторений в Emacs.

Только для сортировки строк в Emacs имеется встроенная функция: M-x sort-lines.

Для сортировки без повторений выполняем:

  • выделить область
  • C-u M-| sort -u RET

С включенными режимами transient-mark-mode и delete-selection-mode можно сразу заменить выделенную область отсортированными без повторения строками:

  • выделить область
  • M-| sort -u RET
-1:-- Сортируем без повторений в Emacs. (Post Oleksandr Gavenko (noreply@blogger.com))--L0--C0--January 31, 2013 06:18 PM

Eugene Burmako: сублайм =&gt; емакс

После недавнего дискашена у metaclass и tonsky (клик клик) решил снова попробовать емакс. Особенно с учетом того, что сублайм closed source и развитие его, еще три-четыре месяца назад весьма бодрое, полностью остановилось.

Подумал и с удивлением заметил, что в сублайме для меня киллер фич не так уж и много. Первое это очень быстрый поиск по файлам в проекте (find + grep гораздо медленнее, к сожалению). Второе это возможность сохранять стейт проекта (открытые файлы, позиции в них) между запусками. Третье и четвертое это сниппеты и дефинишены синтаксиса (использующиеся для подсветки, комментирования и выщемливания определений - классов, методов, и т.п.). Вроде бы, все. Какой в этом плане state of the art в емаксе?

Еще доставляет go to symbol, который показывает список всех определений в файле и предоставляет для них fuzzy matching. Особенно удобно то, что по мере набора имени определения положение вьюпорта меняется, прокручивая файл к текущему в данный момент айтему. Вдвойне удобно, что по нажатию Escape вьюпорт откатывается обратно на позицию до начала поиска. Интересно, есть ли что-то такое уже существующее для емакса?

Screen Shot 2012-12-11 at 11.03.38

С нетерпением жду релиза и свободного времени, чтобы продолжить эксперименты с емаксом.
-1:-- сублайм =&amp;gt; емакс (Post)--L0--C0--December 11, 2012 10:24 AM

Alex Ott: Новая версия статьи про CEDET

Только что залил на сайт новую версию своей статьи про настройку CEDET. Я также оставил доступной старую версию статьи, но в виде отдельной страницы.
Новая версия описывает новую схему расположения исходного кода, а также новый способ активации под-режимов, так что статья теперь применима и к версии из bzr, и к версии идущей в составе GNU Emacs (после того как выпустят новую его версию).
Кроме того, я добавил небольшое описание того, как настроить связку CEDET + Java, а также небольшое описание настройки дополнений через auto-complete.

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

P.S. кстати, в последних снапшотах, CEDET умеет находить проекты Maven, и получать информацию о classpath прямо из них, так что теперь работает и дополнение имен для классов из сторонних библиотек.  Например, вот так (Это дополнение при работе с кодом Apache Tika):


P.P.S. If you found error, or typo - please write comment on page, or fork source code on github (it's enough to fix only .muse file), and create pull request :-)
-1:-- Новая версия статьи про CEDET (Post Alex Ott (noreply@blogger.com))--L0--C0--October 30, 2012 06:39 PM

Jason McBrayer: Running Emacs on an Android tablet

One of the things I've always wanted in a portable computer is the ability to run Emacs. The main reason is that since 2005 or so, my whole life has been run in org-mode, and, slightly before that, in howm. So, of course, when I got a low-end Android tablet, an Archos 70, of course, I...didn't install Emacs on it. As EmacsWiki implies, there's no perfectly obvious way to do so. And, there's MobileOrg-Android. When I first got my tablet, MobileOrg-Android was pretty bad. But it got better. Today, it's got a great user interface, syncing is fast and generally reliable, and there's an active core group of developers who are constantly adding features and contributing back to org-mode itself.

But...after quite a bit of trying, I still haven't made the MobileOrg workflow work for me. I keep my org files in a Mercurial repository on my home machine, and carry a clone with me. I run org-mobile-push and org-mobile-pull from the home repository, which requires it to be up to date, which usually can be done without manual intervention, but not always. And both pushing and pulling can make changes, which have to be committed. And you really have to sync on the mobile device twice: once before you push/pull, and once after, if you want the desired effect of pushing all your changes and captures to the repository, and having them all reflected on your device. The MobileOrg workflow is based on the idea that your mobile device doesn't have the horsepower to compute agendas on the fly. But is that true these days? I'll return to that issue later.

After seeing that some people had successfully run an Ubuntu user environment in a chrooted loopback filesystem on a similar tablet, I decided to try to get my Emacs that way. It didn't exactly work out right a way, and it took me quite a while to make time for the yak-shaving involved. Finally, I did, but with my preferred GNU/Linux distribution, Fedora.

Overview (the short version, aka tl;dr)

My sdcard is formatted ext3, and has the Fedora 13 rootfs unpacked into it. From a root prompt in ConnectBot, I bind-mount some required special filesystems under Fedora's root, then chroot into it, and start sshd. Then I can ssh into localhost with ConnectBot and run Emacs (and other things).

Longer version

Don't take this as a step-by-step instruction guide. What works and doesn't work on my device is likely to be quite different from what works and doesn't work on yours (unless yours is an Archos Gen8). This is really more to give you an idea of the kind of yak-shaving involved in getting this working.

First I rooted my tablet. I would have done this even if I weren't planning on running Emacs. For reference, the tablet is an Archos 70, running the latest version of the stock (Froyo) firmware, with a rooted initramfs.

Then, I tried installing the Ubuntu loopback images mentioned above. This didn't work for me, because the stock Archos kernel doesn't include the loop device, and for some reason, even when I built custom kernels with the loop device enabled, I couldn't get it to work.

Fortunately, my device has a microSD card slot, which is above and beyond the internal storage that the Archos firmware treats as an sdcard for the purposes of App2SD and so forth. I formatted a card as ext3, and tried to unpack the Ubuntu image onto it. This should have worked, but for some reason, my tablet didn't like having so much data pushed onto it over USB, and I lost the enthusiasm I needed to work on it.

Later, I unpacked the Fedora 14 ARM root filesystem more successfully, and tried chrooting into it, only to find that my kernel was too old for the version of glibc in Fedora 14. This also tragically sapped my motivation, causing me to stop working on it again for a while.

When I got another round tuit, I started with the Fedora 13 ARM root filesystem, and it worked pretty straightforwardly. This is what I did:

# umount /mnt/storage/sdcard
# mount -o noatime,nodiratime /dev/block/mmcblk2p1 /mnt/storage/sdcard

The sdcard is mounted with the options nodev,noexec,fmode=0666, and several other options that would make running it as the root filesystem of a normal linux slightly inconvenient. Some of the other parameters could be reset with mount -o remount,blah,noblah, but there doesn't seem to be a way to do that for fmode and dmode, so unmount and remount it is.

# cd /mnt/storage/sdcard/fedora
# mount --bind /dev dev
# mount --bind /dev/pts dev/pts
# mount --bind /proc proc
# mount --bind /sys sys

Now mount the various special filesystems that Fedora is going to need, that are provided by the kernel.

# chroot . /bin/bash -
# service sshd start

Now chroot into the Fedora environment, and start sshd. I've omitted some other stuff, like setting a (new?) password on the root account, and so forth. Technically, even starting sshd isn't necessary. You can just chroot into Fedora and run what you want to. Having sshd running makes it easier to reconnect to the Fedora environment without having to go through the process of cd'ing and chrooting to the Fedora directory.

From here on out, it's just installing stuff with yum. I've tried to avoid installing anything except what I particularly need.

# yum install -y emacs-nox git mercurial aspell aspell-en \
  diffutils patch man screen

What works

  • Installing things with yum!

    There are things in the Fedora repositories that aren't supported on ARM, but I haven't had cause to install them yet.

  • Emacs!

    Fedora 13 had Emacs 23.2.1, which is not exactly the latest and greatest, but it's not old enough to cause serious compatibility problems, either. I used hg to pull in my emacs startup code from my desktop, then created a mobile branch to strip it down and remove features I wouldn't be using, and to change paths to work with my mobile setup. Everything works as expected.

    Emacs startup is surprisingly snappy. I had slower emacs startup times on my desktop as recently as 5 or 6 years ago, and this isn't exactly a fast tablet.

    You might think it would be hard to use Emacs with a mobile keyboard, but Hacker's Keyboard takes care of that, by and large. It's still an onscreen keyboard, but it's an onscreen keyboard with all the keys you'd expect on a standard PC keyboard.

    Color themes work, as long as they would work under xterm-256color. Sorry for not including a nice one in the screenshots, but those were taken right after I got emacs running.

  • Org-mode!

    This was where I had some concerns going in. The design of org-mobile was premised on the idea that mobile devices didn't have enough oomph to generate agendas on the fly, so emacs pushes pre-generated agendas. I have fairly large org-mode files. They'd be smaller if I archived to file more often, but I don't. So, is emacs on my tablet able to generate my agendas?

    The answer is yes, mostly. The first time I run org-agenda, emacs spends a very long time reading in my org-mode files; I suspect that the slow sdcard I'm running this from may be part of the problem. The first time, it was 30s, but similar 'cold' agenda startups have been around 10s since then. Subsequently, however, the agendas are generated perfectly quickly.

    All in all, my orgmode workflow works perfectly on the tablet, with the exception that hg tries to use vimdiff to do merges, for some reason!

    Also, one other issue is that since I am using emacs in a (local) terminal window, I have to use the alternate tty keys.

What doesn't work well

  • Writing a lot.

    This is not exactly a surprise. Unless I go to another machine and ssh into my tablet (and what would be the point?), I'm constrained to use the onscreen keyboard. And not only that, it's worse trying to write with the onscreen keyboard in a regular Android app, because the predictive text is not active in ConnectBot.

    If I had a small hardware keyboard, I'd be more inclined to do actual writing on this setup.

    Another alternative is to let Emacs do the text completion, using either Predictive Mode or auto-complete. However, while both of those do prose completion fairly well (different strengths), neither does autocorrection, which is just as important with a soft keyboard.

  • Leaving an Emacs session running all the time

    I'm used to never exiting Emacs. On my desktop/home-server machine, Emacs is started for me by systemd, which runs it with --daemon, and restarts it if it should ever crash. On my tablet, I started out by running it under screen, and switching back to it as needed. It turns out that this is fine, as long as I want to stay in the Fedora environment, but it doesn't leave enough memory for my usual set of Android apps to perform normally.

Conclusion

I haven't tried the next logical step, which would be to install Xvnc and its dependencies, and to run a local X session, to be displayed in an Android VNC client. I may not do so, because it looks like the keyboard situation in the main free Android VNC clients is not much better (if at all) than in the terminal, in terms of having the full set of keysyms available. And it is worse, in that in ConnectBot, Emacs's screen gets resized to accommodate the soft keyboard, whereas in VNC, the soft keyboard sits on top of part of the display area, which is not resized.

On the whole I'm happy with this experiment. I don't think it will replace my use of Jota for note taking, because of the text auto-completion and auto-correction issue. I'm not sure whether it will completely replace MobileOrg for me. I'm enjoying finding out.

-1:-- Running Emacs on an Android tablet (Post)--L0--C0--July 20, 2012 01:50 AM

kashnikov: Говорим и пишем правильно

Расширение writegood-mode [1] для Emacs помогает аспирантам избежать распространенных стилистических ошибок. Это расширение основано на советах и скриптах от Мэта Майта (Matt Might) [2].

________________________
[1] https://github.com/bnbeckwith/writegood-mode
[2] http://matt.might.net/articles/shell-scripts-for-passive-voice-weasel-words-duplicates/
-1:-- Говорим и пишем правильно (Post)--L0--C0--January 19, 2012 03:31 PM

Eugene Burmako: емакс, часть 4: ретроспектива

емакс, часть 1: первый взгляд
емакс, часть 2: восторг
емакс, часть 3: windows
емакс, часть 4: ретроспектива

Вдохновленный сегодняшним выступлением @alexott на митапе scala.by, я тоже решил поделиться наблюдениями из своего опыта. Экспы у меня не то чтобы много, но постараюсь быть максимально адекватным. Если я чего-то не догоняю, это не со зла - вы меня поправьте, ладно?

1) Емакс действительно крут. Главные его плюсы, на мой взгляд - неинтрузивность, программируемость и естественная интеграция с консолью. Например, недавно я соорудил наколенную билд-систему, с помощью которой застримлайнил свою работу над абсолютно разнородными проектами в универе. Она прекрасно заинтегрировалась в фар, и не менее замечательно - в емакс. Чтобы из емакса запустить какой-нибудь процесс и вбросить аутпут в буфер, нужны буквально пару телодвижений. Повесить на это все хоткеи и сделать гиперлинки на ошибки - еще немного работы. Пару обтачиваний и вуаля: myke-backend.el. Страшно представить, как что-то похожее сделать в Эклипсе.

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

3) Лисп не античеловечный, но и не простой в освоении. Довольно быстро я научился колбасить говнокод (что, наверняка, уже увидели уважаемые гуру емакса, пробежавшись по моему конфигу), но что-либо сложное я предпочитаю писать на чем-нибудь другом. Например, билд-система, упоминавшаяся выше, естественным образом выросла из ад-хок сниппетов на елиспе, но попытки превратить ее в что-то более-менее стройное успехом не увенчались, поэтому я по-быструхе переписал все с нуля на сишарпе. Наверняка, проблемы с удобством стандартной библиотеки и структур данных - всего лишь следствие моего несистемного подхода к изучению елиспа, но что вижу, то и пою. В любом случае, крайне помог бложек Стива Йегги, например, вот этот пост: Emergency Elisp.

4) Емакс - не панацея, что бы не писали в инете (по крайней мере для меня). Для разработки компилятора Скалы я юзаю Эклипс (контрол + клик на дефинишен и дебаг слишком важны, чтобы от них отказываться), для коммитов и истории я юзаю TortoiseGit (magit работает через раз + для чего-то нетривиального в VCS тупо нужен гуй). Вначале я думал, что это я такой нехардкорный, а потом увидел, что все в команде делают то же самое (только гуй к гиту другой, ибо никто не сидит на венде). Даже Мартин, который юзает емакс уже лет двадцать.

5) И все же я очень доволен емаксом. За денек я интегрировал в него греп по проектам с персональными свистелками, после чего выкинул поиск эклипса. Для сложных сессий репла Скалы я тоже юзаю емакс (идея консоли в буфере просто прелестна!). Да и домашки по алгоритмам в латеке я тоже фигачу в емаксе, ибо там подсветка синтаксиса и вручную прикрученный side-by-side превью.

Вот так и живем. Браузинг кода и дебаг в эклипсе, компиляция в фаре, текстовый поиск и реплы в емаксе. Use the right tools for the right job. Искренне ваш, кэп.
-1:-- емакс, часть 4: ретроспектива (Post)--L0--C0--December 10, 2011 02:32 PM

Andy Legkiy: Организационная пичалька

Org-mode очень хороший аутлайнер. Не являясь ярым сторонником емакса, я люблю этот mode всем сердцем.

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

А в чем же проблема? Да дело в том, что на каждой работе есть свои вики, трекеры, итд. Необходимость использовать разных средства организации дел ведет к дублированию, устареванию одной из копий (или в org-mode, или на рабочих ресурсах).

Если какая-то область новая, и какую-то задачу через время уже видишь под совсем новым углом, то на подгонку своих мыслей, примечаний, добавление новой информации, только в одном "органайзере", уходит определенное кол-во усилий, на которое я c радостью готов пойти. Но, кроме этого, больше усилий уходит на синхронизацию разных источников, ведь синхронизация происходит руками. А вот тут и начинается главная проблема. Отказываться от org-mode не хочется, потому что он очень удобный, быстрый, очень гибкий, и не зависит от наличия интернета. Но и дублировать информацию, перенося из одного формата в другой, разбивая по разным сущностям (страницы wiki, milestone, tickets) -- довольно таки трудно и неприятно.

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

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

А что делать? Да пока выбор не большой. Коллегам нужно не только видеть план работ и ход его выполнения, перестройки, уточнения, но еще в нем участвовать.

1. Можно было бы воспользоаться имеющимся html-экспортом, на каком-нибудь рабочем ресурсе, и это было бы неплохим выходом, на начальных этапах. Но для перечисленных выше потребностей коллег оно совсем не расчитанно. Так что, увы, отпадает.
2. Полностью валить на рабочую систему, что и будет сделано, в итоге.
3. Использовать org-mode как буфер для небольших кусков, возможно приделав некоторое подобие простого экспорта. Но это костыль и полумера. После экспорта вся гибкость средств оrg-mode полностью теряется. Кто пользовался, тот знает о чем я. Но без средств автоматического переноса это может привести к очередному накоплению и завалу. Но как добавить дела в кучу, чтобы потом рассортировать, вполне может подойти.

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

UPD: Если у кого есть мысли или опыт сопряжения org-mode с популярными средствами управления проектами, буду рад услышать.
-1:-- Организационная пичалька (Post Easy (noreply@blogger.com))--L0--C0--October 27, 2011 10:04 PM

kashnikov: Цветовая схема для текстового редактора.

Для Emacs я долгое время пользовался какой-то хитрой тёмной схемой составленной из кучи других схем найденных в интернетах. Некоторое время назад перешёл на схему от уважаемого мэтра емаксоведения alexott. Его схема рулит.

Для Vim это torte в консоли. Но в графической версии torte, что называется "бьёт по глазам". Подумываю о переводе схемы alexott для Vim.

Какой цветовой схемой пользуетесь вы?
-1:-- Цветовая схема для текстового редактора. (Post)--L0--C0--August 22, 2011 06:41 PM

Ruslan Kosolapov: grundik @ 2011-07-04T11:16:00

"Попробуйте, к примеру, дотянитесь одной рукой одновременно до f и p. Клавиши находятся на большом расстоянии друг от друга, и точное позиционирование курсора с использованием стандартных комбинаций – жуткая морока."

Блять!!1111 ЗАЧЕМ дотягиваться одной рукой до кнопок, которые надо нажимать разными руками?!


И вот так у них всё - берут лопату, и пытаются одной рукой ей пользоваться. Зачем блять?! Лопате надо две руки и две ноги, и это фича, а не баг.
-1:-- grundik @ 2011-07-04T11:16:00 (Post)--L0--C0--July 04, 2011 04:16 AM

Andy Legkiy: Совсем не вовремя заглючил аутлайнер

Нашел в org-mode 7.5 ошибку, которая слегка попортила нервы.
В agenda day/week view, при определенных условиях, не отображаются хидлайны, помеченные как scheduled, если используется настройка "org-enforce-todo-dependencies".

Воспроизводится легко. Новый файлик, без каких-либо свойств, всего с тремя хидлайнами, у второго хидлайна есть подзадача, отмеченая состоянием TODO.
* TODO task 1
SCHEDULED: <2011-06-16 Thu>
* task 2
SCHEDULED: <2011-06-16 Thu>
** TODO subtask 2-1
* task 3
SCHEDULED: <2011-06-16 Thu>
В day-agenda не отображается "task 2" (второй хидлайн верхнего уровня).
  NOTES:      Scheduled:  TODO task 1
NOTES: Scheduled: task 3
Не отображается, но если попробовать выделить и скопировать текст из Agenda (хотя бы строку с "task 1"), "task 2" в буфере будет присутствовать.

Чтобы второй пункт отобразился, нужно:
- Убрать TODO с "task 1",
- Или убрать TODO c "subtask 2-1",
- Или убрать из конфига "(org-enforce-todo-dependencies t)".
-1:-- Совсем не вовремя заглючил аутлайнер (Post Easy (noreply@blogger.com))--L0--C0--June 17, 2011 11:45 AM

Jason McBrayer: Instapaper client for Emacs

I'm a serious user of Instapaper, a web site that describes itself as "a simple tool to save web pages for reading later". It's rather more than that, though: it will also reformat pages for distraction-free reading, much like the now-defunct Readability bookmarklet, it works as a social bookmarking service (though I don't really use this functionality), and it will bundle your pending reads into an ePub or Mobipocket ebooklet. There is an official freedom-hating iOS app, and several unofficial Android apps; the one I use is iPaper, which is still a little freedom-hating, but provides offline reading, which just using the website doesn't, barring a strict ePub export/sync routine or some futzing around with wwwoffle or similar.

I use Instapaper to push articles that would otherwise cut into my productive time into my less productive time: adding them from my browser, syncing with iPaper once or twice a day, and reading mostly in the evenings. For saving articles, I mostly use the Firefox add-on Instaright, which is handy because I can add links without following them. Most of the articles I save for later come from Google Reader, which I use mainly from Firefox, so that works well. What didn't work so well was my other main source of linkspam: identi.ca. I use identica-mode for my microblogging needs, so saving a link from identi.ca means a trip from emacs -> follow link to dent or site in Firefox -> Instaright. Obviously this is far too much opportunity to be tempted to read the article now rather than later, so I wrote an Instapaper client for Emacs.

The code is on bitbucket, and the instructions for using it are in the source header. It should be fairly self-explanatory. It saves URLs to your Instapaper account, and can get them either manually, by url-at-point, or, if you have w3m installed, from the current w3m page's URL or selected link. It doesn't provide any services for reading from Instapaper (offline or otherwise), and because of the terms of service on the official API and my lack of desire to do screen-scraping in Emacs Lisp, I don't plan on adding any. A combination of w3m and wwwoffle or polipo is probably your best bet if you need to read Instapaper in Emacs.

Edited to add: Naturally, when I released this, it contained a significant bug, to whit: due to changes in url.el, it only worked in Emacs 24. This has been fixed, though if you byte-compile it under Emacs <= 23, you will get a compile warning.

-1:-- Instapaper client for Emacs (Post)--L0--C0--April 18, 2011 09:00 PM

Alex Ott: Добавления в haskell-mode

На новогодних каникулах сделал давно запланированное добавление к haskell-mode - добавил поддержку для hlint (команда hs-lint) и haskell style scanner (команда hs-scan). Как и в предыдущей реализации, hs-lint поддерживает замену кода на предлагаемый вариант.
Патчи отправлены мейнтейнеру, но пока они не закоммиченны в основной репозиторий, эти изменения доступны в моем форке. Замечания и пожелания приветствуются...
-1:-- Добавления в haskell-mode (Post Alex Ott (noreply@blogger.com))--L0--C0--February 02, 2011 07:44 AM

swizard: Emacs на nokia n900 tutorial

Сабжу весьма благоприятствуют два факта:
  1. maemo является полноценным линуксом
  2. n900 оснащается хардварной клавиатурой-слайдером

Разумеется, самое главное во втором пункте -- это наличие железной кнопки Ctrl =)

Итак, воспользуемся следующим туториалом одного нашего японского друга: link.

Продублирую его (на всякий случай) на русском.

  1. Скачиваем пакет на устройство отсюда или с моего зеркала.
  2. Под рутом выполняем dpkg -i emacs_23.1.1_armel.deb.
  3. Обновляем apt и доставляем недостающие пакеты: apt-get -f install

Далее, нам предстоит решить такую проблему: на клавиатуре телефона отсутствуют очень полезные для емакса кнопки Meta (Esc) и Tab. Наш верный японский соратник предлагает такую клавиатурную карту для English US: link или mirror.

На стандартном английском макете Meta в этой карте работает через Fn+left, а Tab через Fn+right. Лично для меня табуляция вышла очень удачной (не знаю даже, почему), а мета -- ну так, сойдет.

Инсталлируем карту так:

cp /usr/share/X11/xkb/symbols/nokia_vndr/rx-51 /usr/share/X11/xkb/symbols/nokia_vndr/rx-51.orig
cp rx-51.qole /usr/share/X11/xkb/symbols/nokia_nvdr/rx-51
setxkbmap

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

Японец предлагает поставить специальный мод maxframe.el (здесь mirror). С ним чето мутновато: сначала он у меня не сработал, а после порта моих .emacs.d и .emacs с десктопа, неожиданно заработал. Ладно, пусть его.

В .emacs maxframe.el активируется так:
(add-to-list 'load-path "/path/to/maxframe")
(require 'maxframe)
(add-hook 'window-setup-hook 'maximize-frame t)
(maximize-frame)

Теоретически, можно тащить настройки и все остальное с десктопа и использовать.

Но для моих нужд (у меня там схемка guile) мне потребовалось кое-что подпилить напильником.

Во-первых, на десктопе я олдфажно использую ctrl+ins / shift+ins для копипаста. На n900 таких кнопок нет, поэтому пришлось перевесить:

(global-set-key (kbd "C-c c") 'clipboard-kill-ring-save)
(global-set-key (kbd "C-c v") 'clipboard-yank)

Ничего, нормально.

Во-вторых, не вызывается экранная клавиатура и спец-клавиатура для символов (по Fn+Ctrl). По-большому счету, мне это нафиг не надо, поэтому я даже не заморачивался. Но пары символов критически не хватает: это угловые скобки < и >. Пришлось их вешать на емаксовые комбинации:

(defun insert-less-symbol ()
  (interactive)
  (insert "<"))

(defun insert-more-symbol ()
  (interactive)
  (insert ">"))

(global-set-key (kbd "C-c C-,") 'insert-less-symbol)
(global-set-key (kbd "C-c C-.") 'insert-more-symbol)


Ну и пока вроде все, IDE для scheme у меня построился отличный. Все остальное, как на десктопе: guile, quack.el и т.д.

Иногда ловлю себя на мысли, что не хватает кнопок home, end и page up/down, но пока еще нужда лень не победила.
-1:-- Emacs на nokia n900 tutorial (Post)--L0--C0--January 18, 2011 05:58 PM

Jason McBrayer: Todochiku notifications in identica-mode

Just a quick response to Gabriel Saldaña's recent post on identica-mode notifications: the code for using todochiku for identica-mode notifications is as follows:

(add-hook \'identica-new-dents-hook
  (lambda nil
    (let ((n identica-new-dents-count))
      (todochiku-message \"Emacs Identica-mode New dents\"
                         (format \"You have %d new dent%s.\" n (if (> n 1) \"s\" \"\"))
                         (todochiku-icon \'social)))))

The advantage of using todochiku here is that you can let it handle talking to different notification systems (KDE vs. Gnome vs.Growl on MacOS vs Snarl on MS Windows), and have the same configuration everywhere.

-1:-- Todochiku notifications in identica-mode (Post)--L0--C0--January 04, 2011 05:00 PM

Oleksandr Gavenko: Определение рабочего окружения и возможностей платформы в Emacs

Для правильной работы файла настроек .emacs на различных платформах и различных версиях Emacs требуется проверять множество условий.

Я собрал несколько из них.

Итак посмотрите на указанные переменные:

emacs-major-version emacs-minor-version window-system - 'nil' if in terminal, 'w32' if native Windows build, 'x' if under X Window window-system-version - for windows only operating-system-release - release of the operating system Emacs is running on system-configuration - like configuration triplet: cpu-manufacturer-os system-name - host name of the machine you are running on system-time-locale system-type - indicating the type of operating system you are using: 'gnu' (GNU Hurd), 'gnu/linux', 'gnu/kfreebsd' (FreeBSD), 'darwin' (GNU-Darwin, Mac OS X), 'ms-dos', 'windows-nt', 'cygwin' system-uses-terminfo window-size-fixed
а также указанные функции:
(fboundp ...) - return t if SYMBOL's function definition is not void (featurep ...) - returns t if FEATURE is present in this Emacs (display-graphic-p) - return non-nil if DISPLAY is a graphic display; graphical displays are those which are capable of displaying several frames and several different fonts at once (display-multi-font-p) - same as 'display-graphic-p' (display-multi-frame-p) - same as 'display-graphic-p' (display-color-p) - return t if DISPLAY supports color (display-images-p) - return non-nil if DISPLAY can display images (display-grayscale-p) - return non-nil if frames on DISPLAY can display shades of gray (display-mouse-p) - return non-nil if DISPLAY has a mouse available (display-popup-menus-p) - return non-nil if popup menus are supported on DISPLAY (display-selections-p) - return non-nil if DISPLAY supports selections
Виполняйте проверки наподобии того как делается ниже:
(when window-system ...) (when (eq window-system 'x) ...) (when (>= emacs-major-version 22) ...) (when (fboundp '...) ...) (when (featurep '...) ...)
-1:-- Определение рабочего окружения и возможностей платформы в Emacs (Post Oleksandr Gavenko (noreply@blogger.com))--L0--C0--December 21, 2010 07:57 PM

Voins: Untitled

Обновив coreutils до версии 8.6, обнаружил случайно, что tramp больше не хочет открывать файлы через sudo. То есть это я потом уже понял, что причиной такого поведения стало обновление coreutils, а сначала это было довольно неприятно. Пришлось отвлечься от того, чем занимался, и посвятить вечер разбирательствам с поломкой. Как выяснилось в процессе, кто-то зачем-то поменял формат вывода в утилите stat. Наблюдается это вот так, например:

<new>$ stat . -c "%Y"
1287747411.000000000

Тогда как раньше было:

<old>$ stat . -c "%Y"
1287747411

Tramp пользуется stat'ом для получения атрибутов файлов. Если находит. Можно было, конечно, обмануть его, и заставить думать что stat, который он нашёл, несовместим  с тем, что он привык считать stat'ом, но это не наш путь. Наш путь привёл к появлению маленького автомата, определяющего в каком формате нам были выданы циферки, и выдающего правильные и ожидаемые циферки на выходе. Делать полноценный патч мне было лениво. Так что есть только это.

-1:-- Untitled (Post)--L0--C0--October 22, 2010 01:41 PM

Evgeny Morozov: Ubuntu 10.10, vim, pycharm

Обновил систему до Ubuntu 10.10. Может быть из-за обновления особых изменений не заметил. Нравится новый шрифт. Все остальное выглядит и работает почти так же, как и в 10.04.

Кстати, уже где-то две недели как я переехал на vim. Руки стали уставать заметно меньше. Многие вещи неудобны (не нравится cut/copy требующий трех нажатий — "+x/y, еще раздражает то, что портится буфер, если после этого удалить что-нибудь), многое пока вообще сделать еще не могу. Но обратно возвращаться не хочется.

Пробовал установить PyCharm (такая урезанная IntelliJ Idea), плюнул и бросил через час. Для внешнего вида есть меткое словосочетание на английском: «Blast from the past». Как будто вернулся на 15 лет назад. Даже tcl/tk современнее выглядит. Впрочем, это проблема всех GUI-приложений на Java. Неописуемо тормозит (на Phenom II x4 3.4 Ghz и 8 Gb памяти). Хотя в консоли оно честно пишет, что будет тормозить на OpenJDK. Но у меня другого и не было, это то, что в Ubuntu по умолчанию стоит. Автодополнение не впечатлило. В общем, поищу пока аналог yasnippet для vim.
-1:-- Ubuntu 10.10, vim, pycharm (Post)--L0--C0--October 19, 2010 06:01 PM