Литературно пишем конфиг
Литературно пишем конфиг
Решно все же что изменния 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")))))
Сноски:
https://www.emacswiki.org/emacs/EmacsKeyNotation - описание нотации комбинаций клавиш Emacs