The Funtoo Linux project has transitioned to "Hobby Mode" and this wiki is now read-only.
Difference between revisions of "Package:Emacs"
(Add "Learning Emacs" section. More useful info coming...) |
(Fix python-indent-offset issue in the suggested python-mode-hook) |
||
(5 intermediate revisions by the same user not shown) | |||
Line 8: | Line 8: | ||
[[File:emacs-logo.png]] | [[File:emacs-logo.png]] | ||
Emacs is a famous text editor, famous by its flexibility and extensibility. One manual describes it as "the extensible, customizable, self-documenting, real-time display editor" | Emacs is a famous text editor, famous by its flexibility and extensibility. One manual describes it as "the extensible, customizable, self-documenting, real-time display editor." | ||
This page is designed to give users a good place to share their config and settings for a nice | This page is designed to give users a good place to share their config and settings for a nice Emacs setup. | ||
== Installing Emacs == | |||
To install the standard GNU version {{Package|app-editors/emacs}}, run the following command: | |||
<console> | <console> | ||
###i## emerge -av emacs | ###i## emerge -av emacs | ||
</console> | </console> | ||
To install the 1980 fork {{Package|app-editors/xemacs}}, run the following command: | |||
<console> | <console> | ||
###i## emerge -av xemacs | ###i## emerge -av xemacs | ||
</console> | </console> | ||
Both should handle the same, while Emacs on its own stands here for both. If you install additional extensions for both you might need to add {{c|app-emacs}} or {{c|app-xemacs}} to the package as there are two different versions for each. | |||
== Learning Emacs == | == Learning Emacs == | ||
Line 34: | Line 38: | ||
* [https://www.emacswiki.org/ EmacsWiki] | * [https://www.emacswiki.org/ EmacsWiki] | ||
== What | == What Emacs Is and What It Is Not == | ||
* Emacs is primarily a text editor and not a word processor. It concentrates on manipulating any kind of text rather than manipulating the font and look. Emacs can run in both GUI-based and text-based modes. So Emacs can be used on a local box in a graphical environment and a remote server in a text-only environment. | |||
* Emacs provides commands to manipulate every kind of text and syntax highlighting for nearly every kind of format. | |||
=== Customizability === | === Customizability === | ||
Emacs is highly customizable: | |||
* | * The {{c|M-x customize}} extension exposes customizable variables, such as color themes, graphical interface options, etc. {{c|M-x customize}} is intended for Emacs beginners who do not want to work with Emacs Lisp code. | ||
* combine keystrokes | * You can combine keystrokes into complex macros. | ||
* | * Emacs implements Emacs Lisp: a language designed for the Emacs professional. | ||
=== Extensibility === | === Extensibility === | ||
As a result of the above points, Emacs behaviour can be | As a result of the above points, Emacs behaviour can be tailored to all types of editing. Some examples: | ||
* AUCTeX | * AUCTeX: A suite for LaTeX and other TeX versions, | ||
* ERC | * ERC: An IRC client, | ||
* | * Org-mode: Part organization tool and part markup language | ||
* Wanderlust | * Wanderlust: A highly flexible Mail tool for Emacs | ||
== Funtoo-specific Configuration == | |||
If you are contributing to Funtoo, you should make sure that {{Package|app-emacs/ebuild-mode}} is installed. As of {{Package|app-editors/emacs-26.3}}, it is installed automatically. | |||
To disable the automatic update of the copyright header in an ebuild: | |||
{{file|name=~/.emacs|lang=elisp|desc=ebuild-mode settings|body= | |||
(setq-default ebuild-mode-update-copyright nil) | |||
}} | |||
If you are editing autogen (Python) scripts in Funtoo, you may have noticed the departure from PEP-8 (4 spaces of indentation) in favor of using tabs for indentation. To adopt the correct style automatically based on context: | |||
{{file|name=~/.emacs|lang=elisp|desc=Python style settings for Funtoo|body= | |||
(defun infer-indentation-style () (interactive) | |||
"Infer indentation style from buffer contents. | |||
If our source file uses tabs, we use tabs, if spaces spaces, and | |||
if neither, we use the current indent-tabs-mode. | |||
See https://www.emacswiki.org/emacs/NoTabs" | |||
(let ((space-count (how-many "^ " (point-min) (point-max))) | |||
(tab-count (how-many "^\t" (point-min) (point-max)))) | |||
(if (> space-count tab-count) (setq indent-tabs-mode nil)) | |||
(if (> tab-count space-count) (setq indent-tabs-mode t)))) | |||
(add-hook 'python-mode-hook | |||
(lambda () | |||
(if indent-tabs-mode | |||
(setq tab-width 4 | |||
python-indent-offset 4)))) | |||
(add-hook 'python-mode-hook 'infer-indentation-style) | |||
}} | |||
{{c|infer-indentation-style}} counts the number of lines starting with spaces, counts the number of lines starting with tabs, and then it configures the correct style automatically based on which count is greater. The second hook function sets tab-width and indent to the equivalent of 4 spaces if indent-tabs-mode is used. To switch a Python script between PEP-8 and tabbed styles, highlight the whole buffer with {{c|C-x h}} and use either {{c|M-x untabify}} (to convert to PEP-8) or {{c|M-: (setq tab-width 4)}} followed by {{c|M-x tabify}} (to convert to tabbed style). | |||
== User Configs == | == User Configs == | ||
=== klipkyle's config === | |||
* [https://github.com/KlipperKyle/dotfiles/blob/master/emacs.d/init.el https://github.com/KlipperKyle/dotfiles/blob/master/emacs.d/init.el] | |||
=== golodhrim's config === | === golodhrim's config === | ||
{{file|name=~/.emacs|lang=elisp|body= | |||
;;;;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;;;;; | ||
;; General Settings ;; | ;; General Settings ;; | ||
Line 138: | Line 180: | ||
"~/notes/projects/writing/")) | "~/notes/projects/writing/")) | ||
(setq org-todo-keywords '((type "TODO" "Postponed" "Upcoming" "Doing" " | (setq org-todo-keywords '((type "TODO" "Postponed" "Upcoming" "Doing" "{{!}}" "DONE(#)"))) ;; TODO workflows | ||
(setq org-tag-alist '(("work" . ?k) ("personal" . ?p) ("organization" . ?o) ("writing" . ?w) ("code" . ?c) ("blog" . ?b) ("funtoo" . ?f) ("social" . ?s))) ;; Most-used tags, with shortcuts | (setq org-tag-alist '(("work" . ?k) ("personal" . ?p) ("organization" . ?o) ("writing" . ?w) ("code" . ?c) ("blog" . ?b) ("funtoo" . ?f) ("social" . ?s))) ;; Most-used tags, with shortcuts | ||
Line 272: | Line 314: | ||
;; NOTE: there can be only one entry per header (such as To, From) | ;; NOTE: there can be only one entry per header (such as To, From) | ||
;; http://flex.ee.uec.ac.jp/texi/bbdb/bbdb_11.html | ;; http://flex.ee.uec.ac.jp/texi/bbdb/bbdb_11.html | ||
'(( "From" . "no.?reply\\ | '(( "From" . "no.?reply\\{{!}}DAEMON\\{{!}}daemon\\{{!}}facebookmail\\{{!}}twitter"))) | ||
;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;; | ||
Line 504: | Line 546: | ||
(setq css-indent-offset 2) | (setq css-indent-offset 2) | ||
}} | |||
{{file|name=.wl|lang=elisp|body= | |||
;; load bbdb support | ;; load bbdb support | ||
(require 'bbdb-wl) | (require 'bbdb-wl) | ||
Line 513: | Line 554: | ||
;; setup from where to get addresses | ;; setup from where to get addresses | ||
(setq bbdb-wl-folder-regexp "^\.INBOX | (setq bbdb-wl-folder-regexp "^\.INBOX{{!}}^\.inbox{{!}}^\.Sent{{!}}^\.sent{{!}}^\.\[IMAPS\]\\Sent") | ||
;; define keybinding | ;; define keybinding | ||
Line 592: | Line 633: | ||
(setq wl-fcc-force-as-read t) | (setq wl-fcc-force-as-read t) | ||
(setq wl-auto-save-drafts-interval nil) | (setq wl-auto-save-drafts-interval nil) | ||
}} | |||
{{file|name=.folders|lang=elisp|body= | |||
User@googlemail{ | User@googlemail{ | ||
%INBOX:"User@googlemail.com"/clear@imap.gmail.com:993! "Inbox" | %INBOX:"User@googlemail.com"/clear@imap.gmail.com:993! "Inbox" | ||
Line 610: | Line 650: | ||
%INBOX.Drafts:USER/digest-md5@imap.own-server.tld "Drafts" | %INBOX.Drafts:USER/digest-md5@imap.own-server.tld "Drafts" | ||
} | } | ||
}} | |||
[[Category:HOWTO]] | [[Category:HOWTO]] | ||
[[Category:Featured]] | [[Category:Featured]] | ||
[[Category:Editors]] | [[Category:Editors]] |
Latest revision as of 06:17, May 16, 2020
Emacs
We welcome improvements to this page. To edit this page, Create a Funtoo account. Then log in and then click here to edit this page. See our editing guidelines to becoming a wiki-editing pro.
Emacs is a famous text editor, famous by its flexibility and extensibility. One manual describes it as "the extensible, customizable, self-documenting, real-time display editor."
This page is designed to give users a good place to share their config and settings for a nice Emacs setup.
Installing Emacs
To install the standard GNU version app-editors/emacs, run the following command:
root # emerge -av emacs
To install the 1980 fork No results, run the following command:
root # emerge -av xemacs
Both should handle the same, while Emacs on its own stands here for both. If you install additional extensions for both you might need to add app-emacs
or app-xemacs
to the package as there are two different versions for each.
Learning Emacs
If this is your first time trying Emacs, then install the GNU version app-editors/emacs. Launch Emacs and press C-h t
(That is <Ctrl>+h
followed by t
) to launch the built-in tutorial. The built-in tutorial will teach you the most important keybindings.
After completing the tutorial, Emacs becomes a "choose your own adventure." Some good resources to read include:
- The Official Emacs Manuals
- Learning Emacs (O'Reilly Media)
- EmacsWiki
What Emacs Is and What It Is Not
- Emacs is primarily a text editor and not a word processor. It concentrates on manipulating any kind of text rather than manipulating the font and look. Emacs can run in both GUI-based and text-based modes. So Emacs can be used on a local box in a graphical environment and a remote server in a text-only environment.
- Emacs provides commands to manipulate every kind of text and syntax highlighting for nearly every kind of format.
Customizability
Emacs is highly customizable:
- The
M-x customize
extension exposes customizable variables, such as color themes, graphical interface options, etc.M-x customize
is intended for Emacs beginners who do not want to work with Emacs Lisp code. - You can combine keystrokes into complex macros.
- Emacs implements Emacs Lisp: a language designed for the Emacs professional.
Extensibility
As a result of the above points, Emacs behaviour can be tailored to all types of editing. Some examples:
- AUCTeX: A suite for LaTeX and other TeX versions,
- ERC: An IRC client,
- Org-mode: Part organization tool and part markup language
- Wanderlust: A highly flexible Mail tool for Emacs
Funtoo-specific Configuration
If you are contributing to Funtoo, you should make sure that No results is installed. As of No results, it is installed automatically.
To disable the automatic update of the copyright header in an ebuild:
~/.emacs
(elisp source code) - ebuild-mode settings(setq-default ebuild-mode-update-copyright nil)
If you are editing autogen (Python) scripts in Funtoo, you may have noticed the departure from PEP-8 (4 spaces of indentation) in favor of using tabs for indentation. To adopt the correct style automatically based on context:
~/.emacs
(elisp source code) - Python style settings for Funtoo(defun infer-indentation-style () (interactive)
"Infer indentation style from buffer contents.
If our source file uses tabs, we use tabs, if spaces spaces, and
if neither, we use the current indent-tabs-mode.
See https://www.emacswiki.org/emacs/NoTabs"
(let ((space-count (how-many "^ " (point-min) (point-max)))
(tab-count (how-many "^\t" (point-min) (point-max))))
(if (> space-count tab-count) (setq indent-tabs-mode nil))
(if (> tab-count space-count) (setq indent-tabs-mode t))))
(add-hook 'python-mode-hook
(lambda ()
(if indent-tabs-mode
(setq tab-width 4
python-indent-offset 4))))
(add-hook 'python-mode-hook 'infer-indentation-style)
infer-indentation-style
counts the number of lines starting with spaces, counts the number of lines starting with tabs, and then it configures the correct style automatically based on which count is greater. The second hook function sets tab-width and indent to the equivalent of 4 spaces if indent-tabs-mode is used. To switch a Python script between PEP-8 and tabbed styles, highlight the whole buffer with C-x h
and use either M-x untabify
(to convert to PEP-8) or M-: (setq tab-width 4)
followed by M-x tabify
(to convert to tabbed style).
User Configs
klipkyle's config
golodhrim's config
~/.emacs
(elisp source code) ;;;;;;;;;;;;;;;;;;;;;;
;; General Settings ;;
;;;;;;;;;;;;;;;;;;;;;;
(setq emacs-root-dir (concat (getenv "HOME") "/em/"))
(setq inhibit-startup-message t) ;; Suppress the startup message
(setq standard-indent 4) ;; Default indent level is 3 chars
(setq-default indent-tabs-mode nil) ;; Indent with spaces, not tabs
(setq make-backup-files nil) ;; Enable backup files.
(setq version-control nil) ;; Enable versioning with default values
(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/")))) ;; Save all backup file in this directory.
(line-number-mode 1) ;; Show line-number in the mode line
(column-number-mode 1) ;; Show column-number in the mode line
(setq auto-fill-mode 1) ;; Line wrap
(set-default-font "Inconsolata-12")
(setq browse-url-browser-function 'browse-url-generic
browse-url-generic-program "google-chrome")
(global-set-key (kbd "C-<prior>") 'previous-buffer)
(global-set-key (kbd "C-<next>" ) 'next-buffer )
(setq load-path (cons "~/.emacs.d/plugins" load-path))
(setq global-font-lock-mode 1)
(show-paren-mode 1)
;;;;;;;;;;;;;;;;;;
;; el-get setup ;;
;;;;;;;;;;;;;;;;;;
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless (require 'el-get nil t)
(with-current-buffer
(url-retrieve-synchronously "https://raw.github.com/golodhrim/el-get/master/el-get-install.el")
(end-of-buffer)
(eval-print-last-sexp)))
(el-get 'sync)
;;;;;;;;;;;;;;;
;; mediawiki ;;
;;;;;;;;;;;;;;;
(require 'mediawiki)
;;;;;;;;;;;;;;;;;;;;
;; Org-mode stuff ;;
;;;;;;;;;;;;;;;;;;;;
;; Tell emacs where org-mode is
;;(setq load-path (cons "/usr/share/emacs/site-lisp/org-mode/" load-path))
;;(setq load-path (cons "/usr/share/emacs/site-lisp/org-mode/contrib/" load-path))
(require 'org-install) ;; Tell emacs to use org-mode
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode)) ;; Turn on org-mode for all *.org files
;; Some key sequences
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)
(global-set-key [f9] 'org-archive-subtree-default)
(setq org-log-done t) ;; I have no idea what this does, it was in the manual -- think it controls whether or not to log time completed for tasks
(setq org-directory "~/notes")
;; Files that should be included in agenda views:
(setq org-agenda-files (list "~/notes/business.org"
"~/notes/personal.org"
"~/notes/projects/"
"~/notes/projects/writing/"))
(setq org-todo-keywords '((type "TODO" "Postponed" "Upcoming" "Doing" "|" "DONE(#)"))) ;; TODO workflows
(setq org-tag-alist '(("work" . ?k) ("personal" . ?p) ("organization" . ?o) ("writing" . ?w) ("code" . ?c) ("blog" . ?b) ("funtoo" . ?f) ("social" . ?s))) ;; Most-used tags, with shortcuts
;; Capture stuff
(setq org-default-notes-file "~/.org/capture.org")
(define-key global-map "\C-cc" 'org-capture)
(setq org-refile-targets '((org-agenda-files :level . 1)(org-agenda-files :level . 2)))
(setq org-refile-use-outline-path 'file)
(setq org-capture-templates
'(("t" "Todo" entry (file+headline "~/.org/capture.org" "Tasks")
"- TODO %?\n %i\n %a")
("j" "Journal" entry (file+datetree "~/.org/journal.org")
"- %?\nEntered on %U\n %i\n %a")))
(setq org-mobile-directory "~/Dropbox/MobileOrg")
(setq org-mobile-use-encryption)
(setq org-mobile-use-encryption-password "PASSWORD")
(setq org-mobile-inbox-for-pull "~/notes/mobileorg/inbox.org")
;;;;;;;;;;;;;;;;;;;
;; Markdown Mode ;;
;;;;;;;;;;;;;;;;;;;
(require 'markdown-mode)
(add-to-list 'auto-mode-alist '("\\.markdown$" . markdown-mode))
(add-to-list 'auto-mode-alist '("\\.md$" . markdown-mode))
;;;;;;;;;;;;;;;;
;; Python IDE ;;
;;;;;;;;;;;;;;;;
(c-add-style
"python-new"
'((indent-tabs-mode . nil)
(fill-column . 78)
(c-basic-offset . 4)
(c-offsets-alist . ((substatement-open . 0)
(inextern-lang . 0)
(arglist-intro . +)
(knr-argdecl-intro . +)))
(c-hanging-braces-alist . ((brace-list-open)
(brace-list-intro)
(brace-list-close)
(brace-entry-open)
(substatement-open after)
(block-close . c-snug-do-while)))
(c-block-comment-prefix . "* "))
)
;; This is a very crude hook that auto-selects the C style depending on
;; whether it finds a line starting with tab in the first 3000 characters
;; in the file
(defun c-select-style ()
(save-excursion
(if (re-search-forward "^\t" 3000 t)
(c-set-style "python")
(c-set-style "python-new"))))
(add-hook 'c-mode-hook 'c-select-style)
;;;;;;;;;;;;
;; Django ;;
;;;;;;;;;;;;
(yas/initialize)
(add-to-list 'load-path "~/.emacs.d/el-get/django-mode/")
(require 'django-html-mode)
(require 'django-mode)
(yas/load-directory "~/.emacs.d/el-get/django-mode/snippets")
(add-to-list 'auto-mode-alist '("\\.djhtml$" . django-html-mode))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Document Engineering (AUCTeX + ConTeXt) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(load "auctex.el" nil t t)
(load "preview-latex.el" nil t t)
(setq TeX-auto-save 1)
(setq TeX-parse-self 1)
(setq TeX-auto-untabify 1)
(setq TeX-display-help 1)
(setq TeX-save-query nil)
(setq TeX-clean-confirm nil)
(setq-default TeX-master nil)
(add-hook 'TeX-mode-hook (lambda () (TeX-fold-mode 1)))
(add-hook 'TeX-mode-hook (lambda () (TeX-source-specials-mode 1)))
(add-hook 'TeX-mode-hook (lambda () (TeX-toggle-debug-bad-boxes)))
(add-hook 'TeX-mode-hook (lambda () (TeX-toggle-debug-warnings)))
(add-hook 'TeX-mode-hook (lambda () (outline-minor-mode)))
(add-hook 'TeX-mode-hook (lambda () (abbrev-mode t)))
(add-hook 'TeX-mode-hook (lambda () (auto-fill-mode 1)))
(add-hook 'TeX-mode-hook 'LaTeX-math-mode)
(autoload 'etexshow "etexshow" "Browser for ConTeXt commands." t)
(setq etexshow-xml-files-alist
`((,(concat emacs-root-dir "libs/etexshow/cont-en.xml") .
,(concat "/tmp/cont-en.cache"))))
(setq etexshow-comment-file
(concat emacs-root-dir "libs/etexshow/cont-en-comments.xml"))
(setq TeX-PDF-mode 1)
(setq revert-without-query '(".+pdf$"))
(add-hook 'doc-view-mode-hook 'auto-revert-mode)
;;;;;;;;;;
;; bbdb ;;
;;;;;;;;;;
(setq bbdb-file "~/.emacs.d/.bbdb")
(require 'bbdb)
(bbdb-initialize)
(setq
bbdb-offer-save 1 ;; 1 means save-without-asking
bbdb-use-pop-up t ;; allow popups for addresses
bbdb-electric-p t ;; be disposable with SPC
bbdb-popup-target-lines 1 ;; very small
bbdb-dwim-net-address-allow-redundancy t ;; always use full name
bbdb-quiet-about-name-mismatches 2 ;; show name-mismatches 2 secs
bbdb-always-add-address t ;; add new addresses to existing...
;; ...contacts automatically
bbdb-canonicalize-redundant-nets-p t ;; x@foo.bar.cx => x@bar.cx
bbdb-completion-type nil ;; complete on anything
bbdb-complete-name-allow-cycling t ;; cycle through matches
;; this only works partially
bbdb-message-caching-enabled t ;; be fast
bbdb-use-alternate-names t ;; use AKA
bbdb-elided-display t ;; single-line addresses
;; auto-create addresses from mail
bbdb/mail-auto-create-p 'bbdb-ignore-some-messages-hook
bbdb-ignore-some-messages-alist ;; don't ask about fake addresses
;; NOTE: there can be only one entry per header (such as To, From)
;; http://flex.ee.uec.ac.jp/texi/bbdb/bbdb_11.html
'(( "From" . "no.?reply\\|DAEMON\\|daemon\\|facebookmail\\|twitter")))
;;;;;;;;;;;;;;;;;
;; Jabber Mode ;;
;;;;;;;;;;;;;;;;;
(require 'jabber-autoloads)
(setq jabber-account-list '(
("USER@jabber-server.tld"
(:password . "PASSWORD")
)
)
)
(setq
jabber-history-enabled t
jabber-use-global-history nil
jabber-backlog-number 40
jabber-backlog-days 30
)
(add-hook 'jabber-chat-mode-hook 'goto-address)
(load "~/.emacs.d/plugins/autosmiley.el")
(require 'autosmiley)
(add-hook 'jabber-chat-mode-hook 'autosmiley-mode)
(defvar libnotify-program "/usr/bin/notify-send")
(defun notify-send (title message)
(start-process "notify" " notify"
libnotify-program "--expire-time=4000" title message))
(defun libnotify-jabber-notify (from buf text proposed-alert)
"(jabber.el hook) Notify of new Jabber chat messages via libnotify"
(when (or jabber-message-alert-same-buffer
(not (memq (selected-window) (get-buffer-window-list buf))))
(if (jabber-muc-sender-p from)
(notify-send (format "(PM) %s"
(jabber-jid-displayname (jabber-jid-user from)))
(format "%s: %s" (jabber-jid-resource from) text)))
(notify-send (format "%s" (jabber-jid-displayname from))
text)))
(add-hook 'jabber-alert-message-hooks 'libnotify-jabber-notify)
(defun jabber-visit-history (jid)
"Visit jabber history with JID in a new buffer.
Performs well only for small files. Expect to wait a few seconds
for large histories. Adapted from `jabber-chat-create-buffer'."
(interactive (list (jabber-read-jid-completing "JID: ")))
(let ((buffer (generate-new-buffer (format "*-jabber-history-%s-*"
(jabber-jid-displayname jid)))))
(switch-to-buffer buffer)
(make-local-variable 'jabber-chat-ewoc)
(setq jabber-chat-ewoc (ewoc-create #'jabber-chat-pp))
(mapc 'jabber-chat-insert-backlog-entry
(nreverse (jabber-history-query nil nil t t "."
(jabber-history-filename jid))))
(view-mode)))
;;;;;;;;;;
;; EMMS ;;
;;;;;;;;;;
(require 'emms-setup)
(emms-devel)
(emms-default-players)
;;;;;;;;;
;; ERC ;;
;;;;;;;;;
(require 'erc)
(require 'erc-extension)
(require 'erc-services)
(require 'erc-tex)
(require 'tls)
(require 'erc-nicklist)
(and
(require 'erc-highlight-nicknames)
(add-to-list 'erc-modules 'highlight-nicknames)
(erc-update-modules))
(erc-services-mode 1)
(setq tls-program '("openssl s_client -connect %h:%p -no_ssl2 -ign_eof
-CAfile /home/USER/.ssl/USER.pem
-cert /home/USER/.ssl/USER.pem"
"gnutls-cli --priority secure256
--x509cafile /home/USER/.ssl/USER.pem
--x509certfile /home/USER/.ssl/USER.pem -p %p %h"
"gnutls-cli --priority secure256 -p %p %h"))
(autoload 'erc-nick-notify-mode "erc-nick-notify" "Minor mode that calls `erc-nick-notify-cmd' when his nick gets mentioned in an erc channel" t)
(eval-after-load 'erc '(erc-nick-notify-mode t))
(defun irc-erc ()
"Fire up IRC."
(interactive)
(erc-tls :server "chat.freenode.net" :port 7000 :nick "USER" :full-name "FULL NAME" :password "PASSWORD"))
(setq erc-autojoin-channels-alist '(("freenode.net" "#frogandowl" "#funtoo" "#funtoo-quebec" "#syntazia" "#context" "#nginx" "#emacs" "#openvswitch")))
(setq erc-log-channels-directory "~/.erc/logs/")
(setq erc-log-insert-log-on-open nil)
(setq erc-save-buffer-on-part nil
erc-save-buffer-queries-on-quit nil
erc-log-write-after-send t
erc-log-write-after-insert t)
(require 'smiley)
(add-to-list 'smiley-regexp-alist '("\\(:-?]\\)\\W" 1 "forced"))
(add-to-list 'smiley-regexp-alist '("\\s-\\(:-?/\\)\\W" 1 "wry"))
(add-to-list 'smiley-regexp-alist '("\\(:-?(\\)\\W" 1 "sad"))
(add-to-list 'smiley-regexp-alist '("\\((-?:\\)\\W" 1 "reverse-smile"))
(add-to-list 'smiley-regexp-alist '("\\(:-?D\\)\\W" 1 "grin"))
(add-to-list 'smiley-regexp-alist '("\\(:-?P\\)\\W" 1 "poke"))
;; (setq smiley-cached-regexp-alist nil)
;; (smiley-update-cache)
;;;;;;;;;;;;;;;;
;; Wanderlust ;;
;;;;;;;;;;;;;;;;
(autoload 'wl "wl" "Wanderlust" t)
;;;;;;;;;;;;;;;
;; mailcrypt ;;
;;;;;;;;;;;;;;;
(require 'mailcrypt)
(add-hook 'wl-summary-mode-hook 'mc-install-read-mode)
(add-hook 'wl-mail-setup-hook 'mc-install-write-mode)
(defun mc-wl-verify-signature ()
(interactive)
(save-window-excursion
(wl-summary-jump-to-current-message)
(mc-verify)))
(defun mc-wl-decrypt-message ()
(interactive)
(save-window-excursion
(wl-summary-jump-to-current-message)
(let ((inhibit-read-only t))
(mc-decrypt))))
(eval-after-load "mailcrypt"
'(setq mc-modes-alist
(append
(quote
((wl-draft-mode (encrypt . mc-encrypt-message)
(sign . mc-sign-message))
(wl-summary-mode (decrypt . mc-wl-decrypt-message)
(verify . mc-wl-verify-signature))))
mc-modes-alist)))
;;;;;;;;;;;;;;;;;;;;;
;; notify function ;;
;;;;;;;;;;;;;;;;;;;;;
(defun djcb-popup (title msg &optional icon sound)
"Show a popup if we're on X, or echo it otherwise; TITLE is the title of the message, MSG is the context. Optionally, you can provide an ICON and a sound to be played"
(interactive)
(when sound (shell-command
(concat "mplayer2 -really-quiet " sound " 2> /dev/null")))
(if (eq window-system 'x)
(shell-command (concat "notify-send "
(if icon (concat "-i " icon) "")
" '" title "' '" msg "'"))
;; text only version
(message (concat title ": " msg))))
;; the appointment notification facility
(setq
appt-message-warning-time 15 ;; warn 15 min in advance
appt-display-mode-line t ;; show in the modeline
appt-display-format 'window) ;; usr our func
(appt-activate t) ;; active appt (appointment notification)
(display-time)
;; update appt each time agenda opened
(add-hook 'org-finalize-agenda-hook 'org-agenda-to-appt)
;; our little facade-function for djcb-popup
(defun djcb-appt-display (min-to-app new-time msg)
(djcb-popup (format "Appointment in %s minute(s)" min-to-app) msg
"/usr/share/icons/gnome/32x32/status/appointment-soon.png"
"/usr/share/sounds/purple/alert.wav"))
(setq appt-disp-window-function (function djcb-appt-display))
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Custom Variable sets ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
(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.
'(TeX-command-list (quote (("TeX" "%(PDF)%(tex) %`%S%(PDFout)%(mode)%' %t" TeX-run-TeX nil (plain-tex-mode texinfo-mode ams-tex-mode) :help "Run plain TeX") ("LaTeX" "%`%l%(mode)%' %t" TeX-run-TeX nil (latex-mode doctex-mode) :help "Run LaTeX") ("Makeinfo" "makeinfo %t" TeX-run-compile nil (texinfo-mode) :help "Run Makeinfo with Info output") ("Makeinfo HTML" "makeinfo --html %t" TeX-run-compile nil (texinfo-mode) :help "Run Makeinfo with HTML output") ("AmSTeX" "%(PDF)amstex %`%S%(PDFout)%(mode)%' %t" TeX-run-TeX nil (ams-tex-mode) :help "Run AMSTeX") ("ConTeXt MKIV" "context %t" TeX-run-TeX nil (context-mode) :help "Run ConTeXt MKIV") ("ConTeXt" "texexec --once --texutil %(execopts)%t" TeX-run-TeX nil (context-mode) :help "Run ConTeXt once") ("ConTeXt Full" "texexec %(execopts)%t" TeX-run-TeX nil (context-mode) :help "Run ConTeXt until completion") ("BibTeX" "bibtex %s" TeX-run-BibTeX nil t :help "Run BibTeX") ("View" "%V" TeX-run-discard-or-function t t :help "Run Viewer") ("Print" "%p" TeX-run-command t t :help "Print the file") ("Queue" "%q" TeX-run-background nil t :help "View the printer queue" :visible TeX-queue-command) ("File" "%(o?)dvips %d -o %f " TeX-run-command t t :help "Generate PostScript file") ("Index" "makeindex %s" TeX-run-command nil t :help "Create index file") ("Check" "lacheck %s" TeX-run-compile nil (latex-mode) :help "Check LaTeX file for correctness") ("Spell" "(TeX-ispell-document \"\")" TeX-run-function nil t :help "Spell-check the document") ("Clean" "TeX-clean" TeX-run-function nil t :help "Delete generated intermediate files") ("Clean All" "(TeX-clean t)" TeX-run-function nil t :help "Delete generated intermediate and output files") ("Other" "" TeX-run-command t t :help "Run an arbitrary command"))))
'(column-number-mode t)
'(erc-modules (quote (autojoin bbdb button completion fill irccontrols list log match menu move-to-prompt netsplit networks noncommands readonly ring services smiley stamp spelling track)))
'(mediawiki-site-alist (quote (("Funtoo" "http://www.funtoo.org/" "USER" "PASSWORD" "")))))
(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.
)
;;;;;;;;;;;;;;;;;;
;; Color-Themes ;;
;;;;;;;;;;;;;;;;;;
;;(add-to-list 'load-path "/usr/share/emacs/site-lisp/color-theme/color-theme.el")
;;(add-to-list 'load-path "~/.emacs.d/themes/")
(require 'color-theme)
(color-theme-initialize)
;;(color-theme-subtle-hacker)
(color-theme-twilight)
;;(eval-after-load "color-theme"
;; '(progn
;; (color-theme-initialize)
;; (require 'color-theme-citrus)
;; (require 'color-theme-candy)
;; (require 'color-theme-autumn-leaves)
;; (require 'color-theme-inthedark)
;; (require 'color-theme-marine)
;; (require 'color-theme-october)
;; (require 'color-theme-eatyourgreens)
;; (require 'color-theme-august)
;; (require 'color-theme-saddle-2)
;; (color-theme-saddle-2)))
;; (color-theme-subtle-hacker)))
(setq css-indent-offset 2)
.wl
(elisp source code) ;; load bbdb support
(require 'bbdb-wl)
(bbdb-wl-setup)
;; setup from where to get addresses
(setq bbdb-wl-folder-regexp "^\.INBOX|^\.inbox|^\.Sent|^\.sent|^\.\[IMAPS\]\\Sent")
;; define keybinding
(define-key wl-draft-mode-map (kbd "<C-tab>") 'bbdb-complete-name)
;; set multiple e-mail addresses
(setq wl-user-mail-address-list (quote ("User@googlemail.com" "USER@own-server.tld")))
;; handle ("d") mark
;; remove = instant removal (same as "D"), thrash = move to wl-trash-folder
;; string = move to string
(setq wl-dispose-folder-alist
'(
("\.\*googlemail\\.com" "%[Imap]/Trash:"User@googlemail.com"/clear@imap.gmail.com:993!")
("\.\*@own\-\server\\.tld" "%INBOX.Trash:"USER"/clear@imap.own-server.tld")
))
;; notify hook
(add-hook 'wl-biff-notify-hook
(lambda()
(djcb-popup "Wanderlust" "You have new mail!"
"/usr/share/icons/gnome/32x32/status/mail-unread.png"
"/usr/share/sounds/purple/alert.wav")))
;; timer settings
(setq
wl-biff-check-interval 30 ;; check every 30 seconds
wl-biff-use-idle-timer t) ;; in the background
;; Name of top-folder, default "Desktop"
(setq wl-folder-desktop-name "e-Mail")
;; select correct email address when we _start_ writing a draft.
(add-hook 'wl-mail-setup-hook 'wl-draft-config-exec)
(setq wl-draft-config-alist
'(
((string-match "googlemail.com" wl-draft-parent-folder)
(template . "User"))
((string-match "own-server.tld" wl-draft-parent-folder)
(template . "USER"))
))
;; choose template with C-c C-j
(setq wl-template-alist
'(("User"
(wl-from . "Full Name <User@googlemail.com>")
("From" . wl-from)
(wl-smtp-posting-user . "User")
(wl-smtp-posting-server . "smtp.gmail.com")
(wl-smtp-authenticate-type . "plain")
(wl-smtp-connection-type . 'starttls)
(wl-smtp-posting-port . 587)
(wl-local-domain . "googlemail.com")
(wl-message-id-domain . "smtp.gmail.com")
(wl-fcc . "%[IMAPS]/Sent:\"User@googlemail.com\"/clear@imap.gmail.com:993!")
(wl-draft-folder . "%[IMAPS]/Draft:\"User@googlemail.com\"/clear@imap.gmail.com:993!")
)
("USER"
(wl-from . "Full Name <USER@own-server.tld>")
("From" . wl-from)
(wl-smtp-posting-user . "USER")
(wl-smtp-posting-server . "smtp.own-server.tld")
(wl-local-domain . "own-server.tld")
(wl-fcc "%INBOX.Sent:USER/digest-md5@imap.own-server.tld:143")
(wl-draft-folder "%INBOX.Drafts:USER/digest-md5@imap.own-server.tld:143")
)
)
)
(define-key wl-template-mode-map (kbd "<right>") 'wl-template-next)
(define-key wl-template-mode-map (kbd "<left>") 'wl-template-prev)
(setq wl-default-spec "%")
(setq wl-fcc-force-as-read t)
(setq wl-auto-save-drafts-interval nil)
.folders
(elisp source code) User@googlemail{
%INBOX:"User@googlemail.com"/clear@imap.gmail.com:993! "Inbox"
[IMAPS-gmail]{
%[IMAPS]/Sent:"User@googlemail.com"/clear@imap.gmail.com:993! "Sent"
%[IMAPS]/Draft:"User@googlemail.com"/clear@imap.gmail.com:993! "Draft"
%[IMAPS]/Spam:"User@googlemail.com"/clear@imap.gmail.com:993! "Spam"
%[IMAPS]/Trash:"User@googlemail.com"/clear@imap.gmail.com:993! "Trash"
}
}
USER@own-server.tld{
%INBOX:USER/digest-md5@imap.own-server.tld "Inbox"
%INBOX.Sent:USER/digest-md5@imap.own-server.tld "Sent"
%INBOX.Drafts:USER/digest-md5@imap.own-server.tld "Drafts"
}