суббота, 21 марта 2009 г.

Решения, Проекты, файлы и быстрая навигация


На работе я работаю. И это не удивительно, а может и наоборот. Каждую ночь у меня автоматически забираются все изменения из p4, резолвяца конфликты, потом делается дефрагментация диска, создается солюшен и все это дело билдится для нескольких конфигурация и платформ. Сам солюшен получается достаточно большой. Когда открываешь его всеми любимой VS, то процесс затягивается на несколько минут. Если еще и к тому стоит VisualAssist - то вообще можно сделать обеденный перерыв, или просто наслаждаться белым экраном. В принципе солюшен нужен лишь для навигации по файлам проектов. Для Emacs уже давно придумали filecache.el. И Sasha Chua описала у себя на сайте процесс работы с файлами в проектах. В принципе все классно, но Emacs тоже замирает на пару минут, если у тебя большое дерево исходников.
Что сделал я? Опять же ночью, пока я сплю, после того, как мой скрипт забрал изменения из p4, запускается другой скрипт, который создает список файлов для Emacs filecache.el. Утром я прихожу, нажимаю ESC ESC f - и ido мне предлогает найти файл из моего проекта. Класс?

пятница, 23 мая 2008 г.

XEmacs в Microsoft

Как-то пролетала новость, что Microsoft собирается создать Emacs с использованием технологии .NET. Вранье конечно, НО...
Вчера смотрел скучную видео-презентацию "Russell Hadley: The Route to C++ Code Optimization" и заметил, что чувак то использует XEmacs. А как же славная Visual Studio?

вторник, 29 апреля 2008 г.

Как компилировать библиотеки для большого проекта

Платформа: Windows
Язык программирования: С++

Если у вас есть большой проект, над которым работает большая команда и вы используете свои же библиотеки, то лучше всего компилировать такие библиотеки с одной директории. Почему? Потому что, если проект "упадет" в коде библиотеке, то даю 99%, что вам придется перегружать символы для библиотеки. Конечно, это секундная операция, но...мы пытаемся съэкономить время. Если у всех будет одинаковый путь к коду библиотек, то ничего делать не надо будет.
Итак, как сделать, чтоб команда разработчиков компилировала библиотеки с одного места?
Например, сделать subst для папок с кодом библиотек на какой-нибудь Х диск и оттуда запустить компиляцию.
Иногда, код зависит от других библиотек, которые раскиданы по диску. И тогда, приходит в помощь полезная утилитка от Марка Руссиновича - Junction.
Junction - это попросту ссылка на папку, но файловая система воспринимает ее как обычную папку. Делает junction для нескольких папок в какую-нибудь одну корневую, а уж затем делаем subst для корневой папки.
Если у вас есть несколько физических HDD, то в WinXP есть возможность сделать папку=ссылкой на диск. Тоже очень полезно.

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

Удачного компилирования.

суббота, 29 марта 2008 г.

Search-at-point или как быстро найти слово

Надоело мне нажимать C-s C-w, чтоб искать слово. Особенно неудобно, если в слове есть _.
Поискал в интернете уже готовое, кое-что нашел, но все таки решил написать свое.

(defvar sap-overlay '()
"last highlighted word")

(defface sap-face
'((((type tty pc) (class color))
(:background "magenta4" :foreground "cyan1"))
(((class color) (background light))
(:background "magenta4" :foreground "lightskyblue1"))
(((class color) (background dark))
(:background "palevioletred2" :foreground "brown4"))
(t (:inverse-video t)))
"Face for highlighting search-at-point matches."
:group 'sap-faces)

(defvar sap-face 'sap-face)

(defun isearch-highlight-found-word (curword flag)
(if (= flag 1)
(progn
(setq pt1 (- (point) (length curword)))
(setq pt2 (point))
)
(progn
(setq pt2 (+ (point) (length curword)))
(setq pt1 (point))
)
)
(message "Found at %s" (what-line))
(if sap-overlay (delete-overlay sap-overlay))
(setq sap-overlay (make-overlay 1 1))
(overlay-put sap-overlay 'face sap-face)
(overlay-put sap-overlay 'modification-hooks (list 'delete-this-overlay))
(move-overlay sap-overlay pt1 pt2)
)

(defun isearch-forward-current-word ()
"search forward at point feature."
(interactive)
(if (thing-at-point 'symbol)
(progn
(let ((re-curword) (curword) (offset (point))
(old-case-fold-search case-fold-search) )
(setq curword (thing-at-point 'symbol))
(setq re-curword (concat "\\<" (thing-at-point 'symbol) "\\>") )
(beginning-of-thing 'symbol)
(setq offset (- offset (point))) ; offset from start of symbol/word
(setq pt1 offset) ; offset from start of symbol/word
(setq offset (- (length curword) offset)) ; offset from end
(setq pt2 offset) ; offset from end
(forward-char)
(setq case-fold-search nil)
(if (re-search-forward re-curword nil t)
(isearch-highlight-found-word curword 1)

(backward-char offset)
;; else
(progn (goto-char (point-min))
(if (re-search-forward re-curword nil t)
(isearch-highlight-found-word curword 1)


(progn (message "Searching from top. %s" (what-line))
(backward-char offset))
;; else
(message "Searching from top: Not found"))))
(setq case-fold-search old-case-fold-search))
)
(progn
(if sap-overlay (delete-overlay sap-overlay))
)
)
)

(defun isearch-backward-current-word ()
"Mimic vi search backwards at point feature."
(interactive)
(if (thing-at-point 'symbol) (progn
(let ((re-curword) (curword) (offset (point))
(old-case-fold-search case-fold-search) )
(setq curword (thing-at-point 'symbol))
(setq re-curword (concat "\\<" curword "\\>") )
(beginning-of-thing 'symbol)
(setq offset (- offset (point))) ; offset from start of symbol/word
(forward-char)
(setq case-fold-search nil)
(if (re-search-backward re-curword nil t)
(isearch-highlight-found-word curword 0)
(forward-char offset)
;; else
(progn (goto-char (point-max))
(if (re-search-backward re-curword nil t)
(isearch-highlight-found-word curword 0)
(progn (message "Searching from bottom. %s" (what-line))
(forward-char offset))
;; else
(message "Searching from bottom: Not found"))))
(setq case-fold-search old-case-fold-search)))
(progn
(if sap-overlay (delete-overlay sap-overlay))
)
);if
)

;; F3 will search the word under the cursor
;; Ctrl Shift F3 will search backward
(global-set-key [f3] 'isearch-forward-current-word)
(global-set-key [(shift f3)] 'isearch-backward-current-word)



Нажимаем F3 на слове, чтоб искать вперед и Shift-F3 - для поиска назад.

пятница, 12 октября 2007 г.

Emacs RegExp

Потратил полдня, чтоб разобраться, как работают регЭкспы в Имаксе. В итоге, плюнул и написал за 2 минуты питоновский скрипт, который парсит лог-файл, выкидывает ненужное и формирует результаты в нужном мне формате. Еще пол-дня потратил, чтоб из моих же результатов в Exсel-е , сделать другой отчет. Вопрос: не проще ли сразу было написать один питоновский скрипт для всего?
Зачем извращать Имаксовские регулярные выражения, почему нельзя использовать стандартные ?
Если кто знает нормальные руководства по имаксовским регЭкспам - пожалуйста, оставьте комент. Может, когда нибудь, я дорасту до них, но не сейчас.

среда, 26 сентября 2007 г.

Emacs - Dired в одном буфере

Используй 'А' вместо Enter в Dired-mode при навигации по директориям и Emacs не будет создавать новый буфер для каждой папки.

понедельник, 24 сентября 2007 г.

Поставил Rockbox на SanDisk Sansa

У меня есть 6 Гб мп3 плеер SanDisk Sansa e270. Вчера решил установить на него Rockbox - почти что linux OS или обрезанная ОС для мп3 плеера. Дает огромный список дополнительных возможностей, например, более 15 звуковых кодаков, безпрерывное воспроизведение музыки, куча настроек, закладки, игры, программы и т.д.



Честно говоря, я поставил его ради поддержки winamp-плейлистов, закладок и программ.


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

Вот правильная последовательность установки Rockbox на SanDisk Sansa:


  1. Качаем Rockbox, распаковываем в корень мп3 плеера

  2. Качаем и устанавливаем boot loader, как и в инструкции. НЕ ПЕРЕГРУЖАЕМ И НЕ ВЫКЛЮЧАЕМ

  3. Качаем и устанавливаем Reverse Bootloader с сайта http://e200.digerati1338.googlepages.com/reversebl

  4. Отключаем от USB

  5. Плеер перегружается


Если не нажимать кнопку влево во время перезагрузки, то плеер загрузится со стандартной заводской прошивкой, если же нажать кнопку влево - то через 1 сек появиться Rockbox. Кстати, время загрузки РокБокс в 10 раз быстрее чем оригинального софта.

Следующий шаг - написание программ для RockBox - есть кое-какие идеи. Остаеться найти время.