Литературно пишем конфиг
Литературно пишем конфиг

Решно все же что изменния init файла требуют учета поэтому он размещен в отдельной директории и кнему приставлен git для учета измений и отката.

На примере данного файла хотелось бы рассмотреть все прелести литературного программирования

Содержание

1 Мой конфиг для Emacs

1.1 Вводная по способам описания

#+name: hello-world
#+begin_src sh :tangle hello :exports none :noweb yes
  <<hello-world-prefix>>
  echo "|                       hello world                         |"
  <<hello-world-postfix>>
#+end_src

Итак это пример вставки кода. Параметр tangle отвечает за название и расположение файла куда будет сбрасываться составленный из кусочков раскиданного по тексту кода файлов может быть много.

Параметр exports отвечает отвечает что экспортируется. none - ничего не будет при экспорт, code - экспортируется код, result - экспортируются результаты работы кода, both -и то и другое.

Как я понимаю параметр noweb отвечает за разрешения использовать вставки кода для экспорта. Код вставляется на место << имя-блока-кода >>(пробелы не нужны) где имя это name параметр

Выполнение блока кода происходит после нажатия C-c C-c. Перейти в отдельный буфер который настроен под редактирование кода на этом языке. python-mode для python ну и.т.д. происходит клавишами C-c '

Извлечение кода происходит командой M-x org-babel-tangle

Для описания кода использую блок example, хотя как видите пришлось схитрить и добавить _

#+begin_example
  #+name: hello-world
  #+begin_src sh :tangle hello :exports none :noweb yes
  <<hello-world-prefix>>
  echo "hello world"
  #+end_src
#+end__example    

1.2 Подключаем репозитории с пакетами

(when (>= emacs-major-version 24)
(require 'package) ;; You might already have this line
;; For important compatibility libraries like cl-lib
(add-to-list
 'package-archives 
 '("melpa" . "http://melpa.org/packages/") 
 t)
(add-to-list
 'package-archives
 '("gnu" . "http://elpa.gnu.org/packages/")
 t)
(package-initialize) ;; You might already have this line
)

Здесь объяснения излишни, хотя есть подозрения что melpa пуста на пакеты чуть менее чем полностью

1.2.1 Бэкапирование данных

Набрав C-h v package-activated-list можно получить список установленных пакетов


(2048-game ac-c-headers auto-complete popup ac-helm popup auto-complete popup helm helm-core async popup async anzu arduino-mode auto-complete-c-headers auto-complete popup babel bash-completion color-theme company-c-headers company company-irony irony company company-irony-c-headers irony company company-jedi jedi-core python-environment deferred epc ctable concurrent deferred company company-quickhelp pos-tip company company-web web-completion-data dash company css-eldoc dokuwiki-mode dom duplicate-thing elpy yasnippet pyvenv highlight-indentation find-file-in-project ivy company find-file-in-project ivy flycheck-irony irony flycheck seq let-alist pkg-info epl dash flymake-cursor flymake-easy ggtags git-commit-mode git-rebase-mode gnuplot gnuplot-mode helm-c-yasnippet yasnippet helm helm-core async popup async helm-company company helm helm-core async popup async helm-css-scss helm helm-core async popup async helm-flymake helm helm-core async popup async helm-gtags helm helm-core async popup async highlight-indentation htmlize idomenu irony-eldoc irony jedi-core python-environment deferred epc ctable concurrent deferred js2-mode json-mode json-snatcher json-reformat json-reformat json-snatcher let-alist log4j-mode magit magit-popup dash async git-commit with-editor dash async dash with-editor dash async dash async magit-popup dash async markdown-mode mmm-mode org-ac yaxception log4e auto-complete-pcmp yaxception log4e auto-complete popup org2blog metaweblog xml-rpc xml-rpc org pony-mode popup pos-tip projectile pkg-info epl python-environment deferred python-info pyvenv rainbow-mode seq swiper ivy undo-tree use-package diminish bind-key web-beautify web-completion-data web-mode with-editor dash async xml-rpc yasnippet yaxception)

1.2.2 Восстановление по списку пакетов

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

; list the packages you want
(setq package-list '(package1 package2))

; list the repositories containing them
(setq package-archives '(("elpa" . "http://tromey.com/elpa/")
                         ("gnu" . "http://elpa.gnu.org/packages/")
                         ("marmalade" . "http://marmalade-repo.org/packages/")))

; activate all the packages (in particular autoloads)
(package-initialize)

; fetch the list of packages available 
(unless package-archive-contents
  (package-refresh-contents))

; install the missing packages
(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))

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

1.3 Графические окна

1.3.1 ECB и CEDET установлены вручную

Часть пакета CEDET у меня были проблемы с его установкой а именно с работой EDE поэтому я скачал в своё время версию этого пакета по ссылке AlexOtt

(when (<= emacs-major-version 25)
  (load-file "~/.emacs.d/cedet-bzr/trunk/cedet-devel-load.el")
  ;;Анализ кода с помощью CEDET и указание в окне ECB используемых
  ;;классов и переменных
  (add-to-list 'load-path "~/.emacs.d/ecb")
)

Оказалось что ieio компонент cedet уже включен в 26 версию Emacs

error: eieio is already loaded.  Removing CEDET now would be unwise.

1.3.2 TODO Конфликт буфера методов при старте ECB в python

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

Поэтому мы отключаем проверку semantic а потом включаем её при активации ecb с помощью подвязки или хука.

;; Хитрая конструкция внизу как я вспомнил
;; вызывает semantic mode если он не запустился
;; потому что почему то с python synaptic не хочет срабатывать
(semantic-mode -1) ;; Отключаем для проверки
(require 'ecb)
(add-hook 'ecb-activate-hook (lambda () (semantic-mode t)))  ;;
;; Отключение подсказок при включении ибо *@#$#!
(setq ecb-tip-of-the-day nil)

Ну и да отключили подсказку на каждый день, это думаю стоит в Параметры отнести.

1.3.3 TODO Тема ECB не соотвествует теме emacs

1.3.4 TODO Не обновляеться окно методов, только после перезахожа в файл

1.3.5 Клавиши измения границ окон

Тут комбинации Shift-Ctrl-стрелки1 не совсем удобны.в org-mode например не работают, но вроде пока жить не мешает.

;; Передвижение границ окон и разделителей, работает только в 
;; графическом режиме а не в терминале
(global-set-key (kbd "S-C-<left>") 'shrink-window-horizontally)
(global-set-key (kbd "S-C-<right>") 'enlarge-window-horizontally)
(global-set-key (kbd "S-C-<up>") 'shrink-window)
(global-set-key (kbd "S-C-<down>") 'enlarge-window)

1.4 Интернационализация и языки

1.4.1 Использование комбинаций клавиш при русской раскладке

Работает с обычными комбинациями, ну кроме там дополнительного ввода на английском как при экспорте org-mode.

Тред источник кода, интересно как с этим дела обстоят в Emacs25

;;Функция ввода командных комбинаций без переключения раскладки M-x
;;reverse-input-method RET russian-computer RET
;; По мотивам https://www.linux.org.ru/forum/desktop/8850631#comment-8853018
(require 'cl)

(defun reverse-input-method (input-method)
    "Build the reverse mapping of single letters from INPUT-METHOD."
    (interactive
     (list (read-input-method-name "Use input method (default current): ")))
    (if (and input-method (symbolp input-method))
        (setq input-method (symbol-name input-method)))
    (let ((current current-input-method)
          (modifiers '(nil (control) (meta) (control meta))))
      (when input-method
        (activate-input-method input-method))
      (when (and current-input-method quail-keyboard-layout)
        (dolist (map (cdr (quail-map)))
          (let* ((to (car map))
                 (from (quail-get-translation
                        (cadr map) (char-to-string to) 1)))
            (when (and (characterp from) (characterp to))
              (dolist (mod modifiers)
                (define-key local-function-key-map
                  (vector (append mod (list from)))
                  (vector (append mod (list to)))))))))
      (when input-method
        (activate-input-method current))))

(defun my/-is-interactive-frame-available ()
  (and (not noninteractive)
       (not (and (daemonp)
                 (null (cdr (frame-list)))
                 (eq (selected-frame) terminal-frame)))))

(defmacro* my/-exec-after-interactive-frame-available ((&rest captures) &rest body)
  (declare (indent defun))
  `(if (my/-is-interactive-frame-available)
       (progn ,@body)
     (lexical-let (,@(mapcar #'(lambda (c) (list c c)) captures))
       (add-hook 'after-make-frame-functions
                 #'(lambda (frame)
                     (with-selected-frame frame
                       ,@body))))))

(my/-exec-after-interactive-frame-available ()
                 (reverse-input-method "russian-computer")
                 (setq read-passwd-map
                       (let ((map read-passwd-map))
                         (set-keymap-parent map minibuffer-local-map)
                         (define-key map [return] #'exit-minibuffer)
                         (define-key map [backspace] #'delete-backward-char)
                         map)))

;; Провека орфографии
(setq flyspell-dictionary "russian")
;; Клавиши проверки орфографии
;;(global-set-key [f9] `ispell-buffer)
(global-set-key [f9] `flyspell-buffer)
(global-set-key [f8] `flyspell-mode)

1.5 Org Mode

;;org-mode export problem 
(setq org-src-fontify-natively t)
;;Настройка используемых блогов
(setq org2blog/wp-blog-alist
      '(("local-craftingbe"
         :url "http://localhost:8000/xmlrpc/"
         :username "user"
         :default-title "Hello this is org-mode"
         :default-categories nil
         :tags-as-categories nil)
        ))

;; Разрешить выполнение кодовых блоков 
(org-babel-do-load-languages
 'org-babel-load-languages
 '((sh         . t)
   (emacs-lisp . t)
   (python     . t)
   (dot        . t)
   (css        . t)
   ))

1.6 Helm

(require 'helm-config)
(global-set-key (kbd "M-x") #'helm-M-x)
(global-set-key (kbd "C-x r b") #'helm-filtered-bookmarks)
(global-set-key (kbd "C-x C-f") #'helm-find-files)
;; Выбор между удаленным
(global-set-key (kbd "M-y") 'helm-show-kill-ring)
(helm-mode 1)

(global-set-key (kbd "C-x b") 'helm-mini)
(setq helm-buffers-fuzzy-matching t
      helm-recentf-fuzzy-match    t)
;; ;; Всякое гибкое автодополнение при переключении между буферами и
;; ;; открытии файла
;; (setq ido-enable-flex-matching t)
;; (setq ido-everywhere t)
;; (ido-mode 1)

1.7 Elpy - Python IDE

По идее все функции ide такие как анализ текста, поиск тагов, отображение документации должен делать правильно настроенный cedet но python интепрретируемый язык программирования и у них все по своему, поэтому всегда существуют сбурки emacs-for-python, и вот теперь elpy.

https://github.com/jorgenschaefer/elpy

;; Emacs for python
(require 'elpy)
(elpy-enable)
;;(elpy-use-ipython) - вот это штука вместо нормального ipython отдает
;;кракозябры
(setq elpy-rpc-backend "jedi")          ; Что это?
;;(add-to-list 'auto-mode-alist '("\\.py\\'" . elpy-mode))
;;'(elpy-mode-hook (quote (subword-mode hl-line-mode)))

(defun prelude-personal-python-mode-defaults ()
  "Personal defaults for Python programming."
  ;; Enable elpy mode
  (semantic-mode -1)
  (global-ede-mode -1)
  (elpy-mode)
  ;; Jedi backend
  ;; (jedi:setup)
  ;; (setq jedi:complete-on-dot t) ;optional
  ;; (auto-complete-mode)
  ;; (jedi:ac-setup)
  ;; (setq elpy-rpc-python-command "python3")
  ;; (python-shell-interpreter "ipython3")
  (company-quickhelp-mode)
  )

(setq prelude-personal-python-mode-hook 'prelude-personal-python-mode-defaults)
(add-hook 'python-mode-hook (lambda ()
                              (run-hooks 'prelude-personal-python-mode-hook)))

1.8 C IDE сборка через CEDET

(require 'yasnippet)
(yas-global-mode 1)


(semantic-mode 1)
(setq helm-semantic-fuzzy-match t
      helm-imenu-fuzzy-match    t)

(require 'company)
(add-hook 'after-init-hook 'global-company-mode)
;; company-c-headers
(add-to-list 'company-backends 'company-c-headers)

;; (eval-after-load 'company
;;   '(progn
;;      (define-key company-mode-map [C-tab] 'helm-company)
;;      (define-key company-active-map [C-tab] 'helm-company)
;;      (define-key company-mode-map [tab] 'company-complete) ; вот вроде добавил а толку то , рефакторинг то по tab невозможен.
;;      (define-key company-active-map [tab] 'company-complete)
;;      )
;;   )

(require 'semantic/ia)
(require 'semantic/bovine/gcc)

(defun my-flycheck-c-setup ()
  (setq flycheck-clang-language-standard "gnu99"))

(add-hook 'c-mode-hook #'my-flycheck-c-setup)

(when (cedet-gnu-global-version-check t)
  (semanticdb-enable-gnu-global-databases 'c-mode)
  (semanticdb-enable-gnu-global-databases 'c++-mode))

(global-ede-mode 1)

(tool-bar-mode -1)                      ;Отключает тулбар
;; Встроенное отображение номеров строки сбоку
(require 'linum)
(setq linum-format "%d ")
(global-linum-mode 1)

(ede-cpp-root-project "adc-to-uart" 
                      :name "adc-to-uart"
                      :file "~/forge/pmg/avr/adc_to_uart/main.c"
                      :include-path '("/")
                      :system-include-path '("/usr/lib/gcc/avr/4.9.2/include"
                                             "/usr/lib/avr/include/"
                                             )
)

1.9 Прочие параметры

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

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(company-auto-complete t)
 '(ecb-options-version "2.40")
 '(ede-project-directories
   (quote
    ("/home/user/pmg/c/mycpp" "/home/user/pmg/c/testemacs" "/home/user/pmg/avr/adc_to_uart")))
   )
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(web-mode-current-element-highlight-face ((t (:foreground "#FF8A4B"))))
 '(web-mode-html-tag-bracket-face ((t (:foreground "#FFE84B"))))
 '(web-mode-html-tag-face ((t (:foreground "#729fcf")))))

Сноски:

1

https://www.emacswiki.org/emacs/EmacsKeyNotation - описание нотации комбинаций клавиш Emacs

Автор: valber

Created: 2019-08-26 Пн 00:06

Validate