07 февраля 2012

Common Lisp the Language, 2nd Edition. by Guy L. Steele Jr.

Сделал зеркало данной книги на гитхабе. Модернизированные latex исходники взял здесь: http://git.androdna.com/?p=lisp/cltl2, соответственно благодарю Daniel'а Herring'а. Наладил генерацию latex->html с помощью tex4ht. Раньше использовалась latex2html, но на сегодняшний день она слегка хромает. htlatex (оболочка над tex4ht) достаточно, кстати, хорошо справляется с задачей. Просто конфиги слегка неинтуитивные.

Ссылка: http://filonenko-mikhail.github.com/cltl2-doc/index.html

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

Там дальше я уже сам подправлю latex исходники.

02 февраля 2012

Stumpwm и mpd.

Когда сидел в полноэкранном режиме в stumpwm в emacs'е, захотелось песню, играющую из mpd послушать еще раз. Напомню, что в stumpwm управление осуществляется с помощью последовательностей клавиатурных сочетаний, как emacs'е (да-да, это не какие-то там горячие клавиши). По умолчанию префиксом сочетаний является ctrl-t. Кроме них, stumpwm также отображает всплывающие окна для информации или для ввода команды. Так вот для управления mpd уже все сделано.

Ctrl-t : служит для выполнения команд stumpwm. Эти команды в конфиге (~/.stumpwmrc) задаются с помощью макроса (defcommand). Нам понадобится стандартная команда load-module, которая загружает stumpwm модуль, который может натворить еще кучу команд.

Короче, загрузим stumpwm модуль mpd:

ctrl-t :
# команда load-module
load-m <TAB> # дада автодополнение
mpd <RET>

Подключимся из stumpwm к mpd (демону):

ctrl-t :
mpd-connect <RET>

Ну, собственно, переключение к предыдущей песне:

ctrl-t :
mpd-prev <RET>

Понадобилась пауза для того, чтобы посмотреть youtube.

ctrl-t :
mpd-toggle-pause <RET>

Emacs. Англорусский переводчик.

Update dictd.xdsl.by лежит. Нужно использовать dict.mova.org

Хочу отметить, что из под emacs'а можно пользоваться такими вот словарями, как dict. Это словарь, а не переводчик. Развивает думалку в отличие от google-translate, да еще и удобно в emacs'е пользоваться, тем более с моими конфигами :)

Понадобится пакет dictd - это самостоятельная консольная программа. Поищите в пакетах:

* sudo pacman dictd

или здесь http://sourceforge.net/projects/dict/files/dictd/:

Следующим шагом скачайте emacs пакет dictem по адресу: http://sourceforge.net/projects/dictem/files/

Как настроить пакет смотрите в официальном README. Я же приведу свой конфиг, который позволяет добится следующего цикла работы:

Бегаете по переводимому тексту. На незнакомом слове нажали C-c d и в отдельном буфере в отдельном окне отображается перевод. Между тем фокус остается там же где и был, на некотором слове. Переместились к следующему непонятному слову, нажали C-c d, и в уже открытом окне с буфером появится перевод нового слова.

Пришлось немного поколдовать, так как dictem упорно плодил лишние буферы.

(require 'dictem)

(setq dictem-use-existing-buffer t)

(setq dictem-use-user-databases-only t)

;;; redefined function
(defun dictem-ensure-buffer ()
  "If current buffer is not a dictem buffer, create a new one."
  (let* ((dictem-buffer (get-buffer-create dictem-buffer-name))
         (dictem-window (get-buffer-window dictem-buffer))
         (window-configuration (current-window-configuration))
         (selected-window (frame-selected-window)))
    (if (window-live-p dictem-window)
        (select-window dictem-window)
      (switch-to-buffer-other-window dictem-buffer))

    (if (dictem-mode-p)
        (progn
              (if dictem-use-content-history
                  (setq dictem-content-history
                        (cons (list (buffer-substring
                                     (point-min) (point-max))
                                    (point)) dictem-content-history)))
              (setq buffer-read-only nil)
              (erase-buffer))
      (progn 
        (dictem-mode)

        (make-local-variable 'dictem-window-configuration)
        (make-local-variable 'dictem-selected-window)
        (make-local-variable 'dictem-content-history)
        (setq dictem-window-configuration window-configuration)
        (setq dictem-selected-window selected-window)))))

(setq dictem-server "dict.mova.org")
(setq dictem-exclude-databases '("ger-" "-ger" "fra-" "-fra"))

(dictem-initialize)

(add-hook 'dictem-postprocess-match-hook
   'dictem-postprocess-match)

(add-hook 'dictem-postprocess-definition-hook 
   'dictem-postprocess-definition-separator)

(add-hook 'dictem-postprocess-definition-hook 
   'dictem-postprocess-definition-hyperlinks)

(add-hook 'dictem-postprocess-show-info-hook
   'dictem-postprocess-definition-hyperlinks)

(add-hook 'dictem-postprocess-definition-hook
   'dictem-postprocess-each-definition)

(setq dictem-user-databases-alist
  '(("_en-ru"  . ("mueller7" "korolew_en-ru" "en-ru")); "dict://dict.org:2628/web1913"))
     ("_en-en"  . ("foldoc" "gcide" "wn"))
     ("_ru-ru"  . ("beslov" "ushakov" "ozhegov" "brok_and_efr"))
     ("_ru-en" . ("ru-en"))
     ("_unidoc" . ("susv3" "man" "info" "howto" "rfc"))
     ))

(define-key dictem-mode-map [tab] 'dictem-next-link)
(define-key dictem-mode-map [(backtab)] 'dictem-previous-link)

;;; http://paste.lisp.org/display/89086
(defun dictem-run-define-at-point-with-query ()
  "Query the default dict server with the word read in within this function."
  (interactive)
  (let* ((default-word (thing-at-point 'symbol))
         (default-prompt (concat "Lookup Word "
                                 (if default-word
                                     (concat "(" default-word ")") nil)
                                 ": "))
         (dictem-query
          (funcall #'(lambda (str)
                       "Remove Whitespace from beginning and end of a string."
                       (replace-regexp-in-string "^[ \n\t]*\\(.*?\\)[ \n\t]*$"
                                                 "\\1"
                                                 str))
                   (read-string default-prompt nil nil default-word))))
    (if (= (length dictem-query) 0) nil
      (dictem-run 'dictem-base-search "_en-ru" dictem-query "."))))

(defun dictem-run-define-at-point ()
  "dictem look up for thing at point"
  (interactive)
  (let* ((default-word (thing-at-point 'symbol))
         (selected-window (frame-selected-window))
         (dictem-query
          (funcall #'(lambda (str)
                       "Remove Whitespace from beginning and end of a string."
                       (replace-regexp-in-string "^[ \n\t]*\\(.*?\\)[ \n\t]*$"
                                                 "\\1"
                                                 str))
                   default-word)))
    (if (= (length dictem-query) 0)
        nil
      (progn
        (dictem-run 'dictem-base-search "_en-ru" dictem-query ".")
        (select-window selected-window)))))

(global-set-key "\C-cd" 'dictem-run-define-at-point)
(global-set-key "\C-zd" 'dictem-run-define-at-point-with-query)