Вопрос

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

Итак, если вы используете Emacs, что находится в ваш .emacs?

Мой сейчас довольно бесплоден, содержит только:

  1. Режим глобальной блокировки шрифтов! (global-font-lock-mode 1)
  2. Мои личные предпочтения в отношении отступов, табуляции и пробелов.
  3. Используйте cperl-mode вместо perl-mode.
  4. Ярлык для компиляции.

Что, по вашему мнению, здесь полезно?

Это было полезно?

Решение

Используйте окончательный сайт dotfiles.Добавьте сюда свой файл ".emacs".Прочитайте ".emacs" других пользователей.

Другие советы

Мой любимый фрагмент.Непревзойденный продукт для глаз Emacs:

;; real lisp hackers use the lambda character
;; courtesy of stefan monnier on c.l.l
(defun sm-lambda-mode-hook ()
  (font-lock-add-keywords
   nil `(("\\<lambda\\>"
   (0 (progn (compose-region (match-beginning 0) (match-end 0)
        ,(make-char 'greek-iso8859-7 107))
      nil))))))
(add-hook 'emacs-lisp-mode-hook 'sm-lambda-mode-hook)
(add-hook 'lisp-interactive-mode-hook 'sm-lamba-mode-hook)
(add-hook 'scheme-mode-hook 'sm-lambda-mode-hook)

Итак, вы видите , т. е.следующее при редактировании lisp /scheme:

(global-set-key "^Cr" '(λ () (interactive) (revert-buffer t t nil)))

Я должен это изменить yes или no подсказать, чтобы y или n подсказки:

(fset 'yes-or-no-p 'y-or-n-p)

У меня есть это для запуска Emacs без такой большой "помпы", которую я получил от этот вопрос.

(setq inhibit-startup-echo-area-message t)
(setq inhibit-startup-message t)

И У Стива Йегге функция для переименования редактируемого файла вместе с соответствующим ему буфером:

(defun rename-file-and-buffer (new-name)
  "Renames both current buffer and file it's visiting to NEW-NAME."
  (interactive "sNew name: ")
  (let ((name (buffer-name))
 (filename (buffer-file-name)))
    (if (not filename)
 (message "Buffer '%s' is not visiting a file!" name)
      (if (get-buffer new-name)
   (message "A buffer named '%s' already exists!" new-name)
 (progn
   (rename-file name new-name 1)
   (rename-buffer new-name)
   (set-visited-file-name new-name)
   (set-buffer-modified-p nil))))))

Одна вещь, которая может оказаться очень полезной:Пока он не стал слишком большим, попробуйте разбить его на несколько файлов для различных задач:My .emacs просто устанавливает мой путь загрузки и загружает кучу файлов - у меня есть все настройки для конкретного режима в mode-configs.el, привязки клавиш в keys.el, et cetera

Мой файл .emacs состоит всего из 127 строк, вот самые полезные маленькие фрагменты:

;; keep backup files neatly out of the way in .~/
(setq backup-directory-alist '(("." . ".~")))

Это приводит к тому, что файлы *~, которые, как я нахожу, загромождают каталог, в данном случае помещаются в специальный каталог . ~

;; uniquify changes conflicting buffer names from file<2> etc
(require 'uniquify)
(setq uniquify-buffer-name-style 'reverse)
(setq uniquify-separator "/")
(setq uniquify-after-kill-buffer-p t) ; rename after killing uniquified
(setq uniquify-ignore-buffers-re "^\\*") ; don't muck with special buffers

Это настраивает uniquify, который изменяет эти уродливые файлы<2> и т.д.имена буферов, которые вы получаете, когда несколько файлов имеют одно и то же имя, преобразуются в гораздо более аккуратное однозначное имя, используя столько всего пути к файлу, сколько необходимо.

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

Это не весь набор и kaboodle, но это некоторые из наиболее полезных фрагментов, которые я собрал:

(defadvice show-paren-function (after show-matching-paren-offscreen
                                      activate)
  "If the matching paren is offscreen, show the matching line in the                               
echo area. Has no effect if the character before point is not of                                   
the syntax class ')'."
  (interactive)
  (let ((matching-text nil))
    ;; Only call `blink-matching-open' if the character before point                               
    ;; is a close parentheses type character. Otherwise, there's not                               
    ;; really any point, and `blink-matching-open' would just echo                                 
    ;; "Mismatched parentheses", which gets really annoying.                                       
    (if (char-equal (char-syntax (char-before (point))) ?\))
        (setq matching-text (blink-matching-open)))
    (if (not (null matching-text))
        (message matching-text))))

;;;;;;;;;;;;;;;
;; UTF-8
;;;;;;;;;;;;;;;;;;;;
;; set up unicode
(prefer-coding-system       'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
;; This from a japanese individual.  I hope it works.
(setq default-buffer-file-coding-system 'utf-8)
;; From Emacs wiki
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))
;; Wwindows clipboard is UTF-16LE 
(set-clipboard-coding-system 'utf-16le-dos)


(defun jonnay-timestamp ()
  "Spit out the current time"
  (interactive)
  (insert (format-time-string "%Y-%m-%d")))

(defun jonnay-sign ()
  "spit out my name, email and the current time"
  (interactive)
  (insert "-- Jonathan Arkell (jonathana@criticalmass.com)")
  (jonnay-timestamp))


;; Cygwin requires some seriosu setting up to work the way i likes it
(message "Setting up Cygwin...")
(let* ((cygwin-root "c:")
       (cygwin-bin (concat cygwin-root "/bin"))
       (gambit-bin "/usr/local/Gambit-C/4.0b22/bin/")
       (snow-bin "/usr/local/snow/current/bin")
       (mysql-bin "/wamp/bin/mysql/mysql5.0.51a/bin/"))
   (setenv "PATH" (concat cygwin-bin ";" ;
                          snow-bin ";" 
                          gambit-bin ";"
                          mysql-bin ";"
                          ".;")  
           (getenv "PATH"))
   (setq exec-path (cons cygwin-bin exec-path)))

(setq shell-file-name "bash")
(setq explicit-shell-file-name "bash")

(require 'cygwin-mount)
(cygwin-mount-activate)
(message "Setting up Cygwin...Done")


; Completion isn't perfect, but close
(defun my-shell-setup ()
   "For Cygwin bash under Emacs 20+"
   (setq comint-scroll-show-maximum-output 'this)
   (setq comint-completion-addsuffix t)
   (setq comint-eol-on-send t)
   (setq w32-quote-process-args ?\")
   (make-variable-buffer-local 'comint-completion-addsuffix))

(setq shell-mode-hook 'my-shell-setup)
(add-hook 'emacs-startup-hook 'cygwin-shell)


; Change how home key works
(global-set-key [home] 'beginning-or-indentation)
(substitute-key-definition 'beginning-of-line 'beginning-or-indentation global-map)


(defun yank-and-down ()
  "Yank the text and go down a line."
  (interactive)
  (yank)
  (exchange-point-and-mark)
  (next-line))

(defun kill-syntax (&optional arg)
  "Kill ARG sets of syntax characters after point."
  (interactive "p")
  (let ((arg (or arg 1))
    (inc (if (and arg (< arg 0)) 1 -1))
    (opoint (point)))
    (while (not (= arg 0))
      (if (> arg 0)
      (skip-syntax-forward (string (char-syntax (char-after))))
    (skip-syntax-backward (string (char-syntax (char-before)))))
      (setq arg (+ arg inc)))
    (kill-region opoint (point))))

(defun kill-syntax-backward (&optional arg)
  "Kill ARG sets of syntax characters preceding point."
  (interactive "p")
  (kill-syntax (- 0 (or arg 1))))

(global-set-key [(control shift y)] 'yank-and-down)
(global-set-key [(shift backspace)] 'kill-syntax-backward)
(global-set-key [(shift delete)] 'kill-syntax)


(defun insert-file-name (arg filename)
  "Insert name of file FILENAME into buffer after point.
  Set mark after the inserted text.

  Prefixed with \\[universal-argument], expand the file name to
  its fully canocalized path.

  See `expand-file-name'."
  ;; Based on insert-file in Emacs -- ashawley 2008-09-26
  (interactive "*P\nfInsert file name: ")
  (if arg
      (insert (expand-file-name filename))
      (insert filename)))

(defun kill-ring-save-filename ()
  "Copy the current filename to the kill ring"
  (interactive)
  (kill-new (buffer-file-name)))

(defun insert-file-name ()
  "Insert the name of the current file."
  (interactive)
  (insert (buffer-file-name)))

(defun insert-directory-name ()
  "Insert the name of the current directory"
  (interactive)
  (insert (file-name-directory (buffer-file-name))))

(defun jonnay-toggle-debug ()
  "Toggle debugging by toggling icicles, and debug on error"
  (interactive)
  (toggle-debug-on-error)
  (icicle-mode))


(defvar programming-modes
  '(emacs-lisp-mode scheme-mode lisp-mode c-mode c++-mode 
    objc-mode latex-mode plain-tex-mode java-mode
    php-mode css-mode js2-mode nxml-mode nxhtml-mode)
  "List of modes related to programming")

; Text-mate style indenting
(defadvice yank (after indent-region activate)
  (if (member major-mode programming-modes)
      (indent-region (region-beginning) (region-end) nil)))

У меня есть много других, которые уже были упомянуты, но, на мой взгляд, они абсолютно необходимы:

(transient-mark-mode 1) ; makes the region visible
(line-number-mode 1)    ; makes the line number show up
(column-number-mode 1)  ; makes the column number show up

Вы можете посмотреть здесь: http://www.dotemacs.de/

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

Также я бы порекомендовал вам прочитать это: http://steve.yegge.googlepages.com/my-dot-emacs-file

Вот несколько ключевых сопоставлений, от которых я стал зависеть:

(global-set-key [(control \,)] 'goto-line)
(global-set-key [(control \.)] 'call-last-kbd-macro)
(global-set-key [(control tab)] 'indent-region)
(global-set-key [(control j)] 'join-line)
(global-set-key [f1] 'man)
(global-set-key [f2] 'igrep-find)
(global-set-key [f3] 'isearch-forward)
(global-set-key [f4] 'next-error)
(global-set-key [f5] 'gdb)
(global-set-key [f6] 'compile)
(global-set-key [f7] 'recompile)
(global-set-key [f8] 'shell)
(global-set-key [f9] 'find-next-matching-tag)
(global-set-key [f11] 'list-buffers)
(global-set-key [f12] 'shell)

Некоторые другие разные материалы, в основном для разработки на C ++:

;; Use C++ mode for .h files (instead of plain-old C mode)
(setq auto-mode-alist (cons '("\\.h$" . c++-mode) auto-mode-alist))

;; Use python-mode for SCons files
(setq auto-mode-alist (cons '("SConstruct" . python-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("SConscript" . python-mode) auto-mode-alist))

;; Parse CppUnit failure reports in compilation-mode
(require 'compile)
(setq compilation-error-regexp-alist
      (cons '("\\(!!!FAILURES!!!\nTest Results:\nRun:[^\n]*\n\n\n\\)?\\([0-9]+\\)) test: \\([^(]+\\)(F) line: \\([0-9]+\\) \\([^ \n]+\\)" 5 4)
            compilation-error-regexp-alist))

;; Enable cmake-mode from http://www.cmake.org/Wiki/CMake_Emacs_mode_patch_for_comment_formatting
(require 'cmake-mode)
(setq auto-mode-alist
      (append '(("CMakeLists\\.txt\\'" . cmake-mode)
                ("\\.cmake\\'" . cmake-mode))
              auto-mode-alist))

;; "M-x reload-buffer" will revert-buffer without requiring confirmation
(defun reload-buffer ()
  "revert-buffer without confirmation"
  (interactive)
  (revert-buffer t t))

Чтобы обновить веб-страницу, которую вы редактируете, из Emacs

(defun moz-connect()
  (interactive)
  (make-comint "moz-buffer" (cons "127.0.0.1" "4242"))
  (global-set-key "\C-x\C-g" '(lambda () 
                (interactive)
                (save-buffer)
                (comint-send-string "*moz-buffer*" "this.BrowserReload()\n"))))

Используется в сочетании с http://hyperstruct.net/projects/mozlab

Вы можете найти мою конфигурацию (как в html, так и в tar'ed архиве) на мой сайт.Он содержит множество настроек для различных режимов

Этот блок для меня самый важный:

(setq locale-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)
(prefer-coding-system 'utf-8)

Однако я никогда не понимал, в чем разница между ними.Культ карго, я полагаю...

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

Все вещи находятся под ~/.elisp, каталог, который находится под контролем версий (я использую git, если это представляет интерес). ~/.emacs просто указывает на ~/.elisp/dotemacs который сам по себе просто загружается ~/.elisp/cfg/init.Этот файл, в свою очередь, импортирует различные конфигурационные файлы через require.Это означает, что файлы конфигурации должны вести себя как режимы:они импортируют то, от чего зависят, и они provide сами по себе в конце файла, например (provide 'my-ibuffer-cfg).Я добавляю ко всем идентификаторам, которые определены в моей конфигурации, префикс my-.

Я организую конфигурацию в соответствии с режимами / предметами / задачами, а не по их техническим последствиям, напримерЯ не надо иметь отдельный конфигурационный файл, в котором ВСЕ определены привязки клавиш или грани.

Мой init.el определяет следующий хук, чтобы убедиться, что Emacs перекомпилирует файлы конфигурации при каждом сохранении (скомпилированный Elisp загружается намного быстрее, но я не хочу выполнять этот шаг вручную):

;; byte compile config file if changed
(add-hook 'after-save-hook
          '(lambda ()
                   (when (string-match
                          (concat (expand-file-name "~/.elisp/cfg/") ".*\.el$")
                          buffer-file-name)
           (byte-compile-file buffer-file-name))))

Это структура каталогов для ~/.elisp:

~/.elisp/todo.org:Файл в режиме организации, в котором я отслеживаю то, что еще нужно сделать (+ пункты списка пожеланий).

~/.elisp/dotemacs:Целевая символическая ссылка для ~/.emacs, нагрузки ~/.elisp/cfg/init.

~/.elisp/cfg:Мои собственные файлы конфигурации.

~/.elisp/modes:Режимы, состоящие только из одного файла.

~/.elisp/packages:Сложные режимы работы с lisp, документацией и, возможно, файлами ресурсов.

Я использую GNU Emacs, эта версия не имеет реальной поддержки пакетов.Поэтому я упорядочиваю их вручную, обычно следующим образом:~/.elisp/packages/foobar-0.1.3 является корневым каталогом для пакета.Подкаталог lisp содержит все файлы lisp и info вот куда идет документация. ~/.elisp/packages/foobar это символическая ссылка, которая указывает на используемую в данный момент версию пакета, так что мне не нужно изменять файлы конфигурации при обновлении чего-либо.Для некоторых посылок я храню ~/.elisp/packages/foobar.installation файл, в котором я храню заметки о процессе установки.По соображениям производительности я компилирую все файлы elisp во вновь установленные пакеты, если это не так по умолчанию.

Вот пара моих собственных вещей:

Вставляет дату в формате ISO 8601:

(defun insertdate ()
  (interactive)
  (insert (format-time-string "%Y-%m-%d")))

(global-set-key [(f5)] 'insertdate)

Для программистов на C ++ создает скелет класса (имя класса будет таким же, как имя файла без расширения):

(defun createclass ()
  (interactive)
  (setq classname (file-name-sans-extension (file-name-nondirectory   buffer-file-name)))
  (insert 
"/**
  * " classname".h 
  *
  * Author: Your Mom
  * Modified: " (format-time-string "%Y-%m-%d") "
  * Licence: GNU GPL
  */
#ifndef "(upcase classname)"
#define "(upcase classname)"

class " classname "
{
  public:
    "classname"();
    ~"classname"();

  private:

};
#endif
"))

Автоматическое создание закрывающих круглых скобок:

(setq skeleton-pair t)
(setq skeleton-pair-on-word t)
(global-set-key (kbd "[") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "(") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "{") 'skeleton-pair-insert-maybe) 
(global-set-key (kbd "<") 'skeleton-pair-insert-maybe)

я использую paredit для простой (e) обработки lisp и завершения минибуфера в режиме ido.

Трудно ответить на этот вопрос, потому что все используют Emacs для самых разных целей.

Более того, лучшей практикой может быть поцелуй своих дотемаков.С тех пор, как Простой интерфейс настройки широко поддерживается среди режимов Emacs, вам следует сохранить все ваши настройки в вашем custom-file (который может занимать отдельное место в ваших dotemacs), а также для дотемаки, поместите в него только настройки пути загрузки, требования к пакету, перехваты и привязки клавиш.Как только вы начнете использовать Стартовый набор Emacs, Кроме того, целый набор полезных настроек также может быть удален из вашего dotemacs.

Смотрите в EmacsWiki ДотЕмаки Категория.Он содержит множество ссылок на страницы, посвященные этому вопросу.

(put 'erase-buffer 'disabled nil)
(put 'downcase-region 'disabled nil)
(set-variable 'visible-bell t)
(set-variable 'tool-bar-mode nil)
(set-variable 'menu-bar-mode nil)

(setq load-path (cons (expand-file-name "/usr/share/doc/git-core/contrib/emacs") load-path))
 (require 'vc-git)
 (when (featurep 'vc-git) (add-to-list 'vc-handled-backends 'git))
 (require 'git)
 (autoload 'git-blame-mode "git-blame"
           "Minor mode for incremental blame for Git." t)

Я настроил несколько удобных ярлыков для веб-страниц и поиска с помощью webjump

(require 'webjump)
(global-set-key [f2] 'webjump)
(setq webjump-sites
      (append '(
        ("Reddit Search" .
         [simple-query "www.reddit.com" "http://www.reddit.com/search?q=" ""])
        ("Google Image Search" .
         [simple-query "images.google.com" "images.google.com/images?hl=en&q=" ""])
        ("Flickr Search" .
         [simple-query "www.flickr.com" "flickr.com/search/?q=" ""])
        ("Astar algorithm" . 
         "http://www.heyes-jones.com/astar")
        )
          webjump-sample-sites))

Запись в блоге о том, как это работает, приведена здесь

http://justinsboringpage.blogspot.com/2009/02/search-reddit-flickr-and-google-from.html

Также я рекомендую эти:

(setq visible-bell t) ; no beeping

(setq transient-mark-mode t) ; visually show region

(setq line-number-mode t) ; show line numbers

(setq global-font-lock-mode 1) ; everything should use fonts

(setq font-lock-maximum-decoration t)

Кроме того, я избавляюсь от некоторых лишних графических интерфейсов

  (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
  (if (fboundp 'tool-bar-mode) (tool-bar-mode -1))
  (if (fboundp 'menu-bar-mode) (menu-bar-mode -1)))

Одна строка для изменения пути загрузки Одна строка для загрузки моей библиотеки инициализации Одна строка для загрузки моих файлов инициализации emacs

Конечно, "файлов инициализации emacs" довольно много, по одному для каждой конкретной вещи, загружаемых в детерминированном порядке.

emacs-стартовый набор в качестве основы я добавил следующее.. vimpulse.el, whitespace.el, yasnippet, textmate.el и newsticker.el.

В моем файле ~/.emacs.d/$USERNAME.el (dbr.el):

(add-to-list 'load-path (concat dotfiles-dir "/vendor/"))

;; Snippets
(add-to-list 'load-path "~/.emacs.d/vendor/yasnippet/")
(require 'yasnippet)

(yas/initialize)
(yas/load-directory "~/.emacs.d/vendor/yasnippet/snippets")

;; TextMate module
(require 'textmate)
(textmate-mode 'on)

;; Whitespace module
(require 'whitespace)
(add-hook 'ruby-mode-hook 'whitespace-mode)
(add-hook 'python-mode-hook 'whitespace-mode)

;; Misc
(flyspell-mode 'on)
(setq viper-mode t)
(require 'viper)
(require 'vimpulse)

;; IM
(eval-after-load 'rcirc '(require 'rcirc-color))
(setq rcirc-default-nick "_dbr")
(setq rcirc-default-user-name "_dbr")
(setq rcirc-default-user-full-name "_dbr")

(require 'jabber)

;;; Google Talk account
(custom-set-variables
 '(jabber-connection-type (quote ssl))
 '(jabber-network-server "talk.google.com")
 '(jabber-port 5223)
 '(jabber-server "mysite.tld")
 '(jabber-username "myusername"))

;; Theme
(color-theme-zenburn)

;; Key bindings
(global-set-key (kbd "M-z") 'undo)
(global-set-key (kbd "M-s") 'save-buffer)
(global-set-key (kbd "M-S-z") 'redo)

Всегда сохраняйте мою конфигурацию в svn http://my-trac.assembla.com/ez-conf/browser/emacs.d

Прочитав это, я подумал, что было бы неплохо иметь простой сайт только для лучших модификаций .emacs.Не стесняйтесь публиковать их и голосовать за них здесь:

http://dotemacs.slinkset.com/

Я новичок в emacs, в моем файле .emacs есть

  • конфигурация отступа
  • цветовая тема
  • режим php, режим coffee и режим js2
  • режим ido

ФУ-у-у, мой файл .emacs здесь:

http://svn.red-bean.com/repos/kfogel/trunk/.emacs

много всякой всячины: https://github.com/tavisrudd/emacs.d

эль-гет это намного упростило управление ит и зависимостями: https://github.com/tavisrudd/emacs.d/blob/master/dss-init-el-get.el

Для Скала программисты

;; Load the ensime lisp code... http://github.com/aemoncannon/ensime
(add-to-list 'load-path "ENSIME_ROOT/elisp/")
(require 'ensime)
;; This step causes the ensime-mode to be started whenever ;; scala-mode is started for a buffer. You may have to customize this step ;; if you're not using the standard scala mode.
(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)
;; MINI HOWTO:  ;; Open .scala file. M-x ensime (once per project)

Моя конфигурация emacs за эти годы довольно сильно выросла, и у меня там есть много полезных вещей для меня, но если бы у меня было две функции, то, вероятно, это были бы именно они.

Задайте C-x UP и C-x DOWN для перемещения текущей строки или вниз, удерживая курсор в нужном месте :

;Down/UP the current line
(global-set-key '[(control x) (up)] 'my-up-line)
(global-set-key '[(control x) (down)] 'my-down-line)
(defun my-down-line()
  (interactive)
  (let ((col (current-column)))
    (forward-line 1)
    (transpose-lines 1)
    (forward-line -1)
    (forward-char col)
    )
  )

(defun my-up-line()
  (interactive)
  (let ((col (current-column)))
    (transpose-lines 1)
    (forward-line -2)
    (forward-char col)
    )
  )
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top