вторник, 25 октября 2016 г.

Как правильно готовить Emacs и не потеряться в (своем) коде

Частенько после правки конфигов новичок может столкнутся с ситуацией "все сломалось, АААА!!!" Да, это чертовски обидно и порой даже вызывает бешенство. Слабаки иногда не выдерживают и сбегают на саблайм, но какое нам до них дело. Поэтому я приведу несколько простых рекомендаций, следуя которым трудности будут минимальны.
  1. Модульный конфиг. Не нужно пытаться засунуть все в ~/.emacs - со временем объем своего кода неминуемо вырастет, поэтому лучше всего изначально разбивать его на отдельные независимые модули (файлы), а в ~/.emacs кроме самого необходимого добавить только одну строку вроде
    (dolist (file (directory-files "~/.emacs.d/modules/" 'absolute ".*\.el$")) 
     (load-file file))
  2. Поиск по собственному коду. Это тоже очень важно, для чего удобно написать отдельную функцию, которая очень пригодится при желании отрефакторить какую-нибудь вещь или просто вспомнить, как же черт побери оно работает?? ;)
    • UPD: Но на самом деле все уже давно написано, поэтому стоит воспользоваться правильным решением: файлы тегов
  3. Не надеяться на --debug-init. По крайней мере мне эта фича оказалась почти бесполезна, т. к. не видно ни номера строки ни человекочитаемого контекста ошибки.
  4. Версионность файлов конфигурации. Простейшим способом будет добавить автоматическое копирование-при-сохранении файла, в отдельную папку и с меткой времени. Впрочем, такое решение полезно еще во множестве случаях.
* К п.1 - т. е. теперь, в случае какой-нибудь ошибки достаточно отключить (закомментировть) автоматическую загрузку модулей и грузить их вручную, по одному. Как правило этого бывает достаточно чтобы увидеть и пофиксить свой косяк.
** Советы приведены без кода, но не потому, что у меня его нет, а потому, что во-первых он не идеален, а во-вторых такие вещи нужно делать только самому и только так, как тебе это удобно, ИМХО.

суббота, 22 октября 2016 г.

Emclip - менеджер буфера обмена на elisp

Устав от глюков Parcellite я его снес, и решил написать свой clipboard manager, с блекджеком ;) Единственный до сих пор не решенный вопрос - это автоматическая синхронизация с системным буфером CLIPBOARD, это можно легко сделать по таймеру, но такой вариант меня не устраивает, а других пока не нашел*. Поэтому на данный момент вручную, с помощью emacsclient (я просто добавил кнопочку "+" в windowmenu флюксбокса).

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

Код:
;; Emacs Clipboard manager
;; (and notification system also)
(defun find-frame-by-name (name)
  (let ((fl (frame-list)))
    (while (not (string= name
    (frame-parameter (car fl) 'name)))
      (setq fl (cdr fl)))
    (car fl)))
(defun emclip-autohide ()
  "Focus out hide emclip"
  (let ((name (frame-parameter (selected-frame) 'name)))
    (when (string= name "*emclip*")
      (modify-frame-parameters (find-frame-by-name "*emclip*")
          '((visibility . nil)))
      (remove-hook 'focus-out-hook 'emclip-autohide))))
(defun emclip-autohide-add ()
  "Timeout hide emclip"
  (run-at-time "5 sec" nil (lambda ()
        (add-hook 'focus-out-hook 'emclip-autohide))))
(defun emclip-initialize ()
  "Create emclip buffer"
  (get-buffer-create "*emclip*")
  (display-buffer-pop-up-frame "*emclip*" '((pop-up-frame-parameters (title . "*emclip*")
             (width . 30)
             (height . 30)
             (border-width . 0)
             (vertical-scroll-bars . right)
             (scroll-bar-width . 4)
             (unsplittable . t)
             (menu-bar-lines . 0)
             (tool-bar-lines . 0))))
  (with-current-buffer "*emclip*"
    (toggle-truncate-lines)
    (setq mode-line-format nil)
    (insert "\n\nПривет! Сегодня " (format-time-string "%d.%m.%y") "\n"))
  (emclip-autohide-add))
(defun emclip-show ()
  (interactive)
  (modify-frame-parameters (find-frame-by-name "*emclip*") '((visibility . t)))
  (select-frame-by-name  "*emclip*")
  (emclip-autohide-add))
(defun emclip-sync ()
  "Get system clipboard manual (emacsclient), sorry"
  (emclip-show)
  (let ((s (substring-no-properties (gui-get-selection 'CLIPBOARD 'TEXT))))
    (with-current-buffer "*emclip*"
      (when (not (string-match-p (concat "^" s)
     (buffer-substring 1 (point-max))))
       (goto-char 1)
 (insert "\n\n▶ " s)
 (goto-char 1)))))
(defun emclip-insert (text)
  "Function for various notifications, test"
  (with-current-buffer "*emclip*"
    (goto-char 1)
    (insert "\n▶ " text "\n"))
    (emclip-show))
;; Start
(run-at-time "5 sec" nil 'emclip-initialize)
;;; EOF

После потери фокуса окно Emclip будет скрыто, после вставки c emclip-sync снова показано, можно так же вызвать его с помощью emclip-show, чтобы посмотреть сохраненное. Еще можно использовать и для системных уведомлений с помощью emclip-insert вместо notify-send - последняя уведомления-то показывает, но только ничерта их не сохраняет, бывает неудобно.
Ну и конечно бесполезная картинко:



пятница, 21 октября 2016 г.

Новое в Emacs 25

Теперь Emacs ненавязчиво подсказывает вам по функциям: при наборе например строки
(run-at-time "10 sec" nil 
можно наблюдать интерактивную подсказку "чо дальше писать-то?":


По-моему очень круто! Именно чего-то подобного тут и не хватало.

среда, 19 октября 2016 г.

сmdExplorer- для тех, кто не любит терминал

Случайно набрел на прикольную программку: https://sites.google.com/site/jvinla/cmdexplorer


В принципе, мануалы можно читать где угодно- в терминале, в браузере (как?- читайте man man, какая зверская шутка!), или с помошью такой вот симпатичной морды, которая особенно удобна в случае, если ты не знаешь, что именно тебе нужно и где его искать.

У автора в архиве даже есть готовый бинарник но! собран он под 32-bit, а нам нужно под 64, поэтому придется пересобрать (см. файл readme там же, дел на несколько секунд). Понадобится установленный компилятор Vala.

Firefox: мой набор расширений

Список создан автоматически, с помощью одного экстеншена из этого списка ->
Набор вполне самодостаточен, причем с таким комплектом никакие жалкие Adblock`и мне даром не нужны! И Носкрипты кстати тоже.

Может показаться, что это "мноха!", но это не так: если убрать из списка всякие твики интерфейса Firefox, отключенные и редко используемые дополнения, то можно заметить, что по тяжелых дополнений там собственно и нет. Ваще нет ;)

понедельник, 10 октября 2016 г.

Первый выпуск Emacs без Столлмана и прочие баги

Emacs 25.1 теперь просто плюет на ваши настройки, например на шрифт по умолчанию, ХА-ХА-ХА. Разбираться в gnuтом  списке рассылки у меня лично нет ни малейшего желания, но вот например: https://lists.gnu.org/archive/html/bug-gnu-emacs/2016-09/msg00658.html

Gnome-keyring-daemon.. тут тоже достаточно геморроя, в основном за счет через жопу написанной документаци, основные источники которой - это как не странно и Арчвики и даже официальная Гномовики. Ну что, вперед:
  1. В папке ~/.gnome2 никаких файлов 'login keyring' давно уже нет, потому как они уже черт знает сколько времени лежат в ~/.local/share/keyrings/
  2. Не нужно никуда добавлять строки запуска gnome-keyring-daemon вроде такой
    gnome-keyring-daemon --start --components=pkcs11,secrets,gpg

    - за вас уже все добавлено дистрибутив, черт возьми! Для проверки каждый может смотреть /etc/pam.d/common-auth-pc,  /etc/xdg/autostart/, etc. == все давно уже сделано через PAM по дефолту!!
  3. И еще гора устаревшей чуши на первых страницах выдачи, которую я даже не буду комментировать. Естественно, речь идет только про Leap 42.1, как там в бубунте мне параллельно.

суббота, 1 октября 2016 г.

fbpanel и немного напильника ;)

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

Кстати, у того же автора на Гитхабе еще несколько достойных утилит: xtrlock-pam и ndnd. Вот насчет последнего - небольшой косячек, главное окно с сообщениями открывается черт знает где, большей частью за нижним краем монитора :) Но на Fluxbox это фиксится парой строк в файле правил для окон ~/.fluxbox/apps. Нужно будет как-нибудь отрепортить пожалуй.

Следующие Предыдущие Главная страница

Blogger Template by Blogcrowds