Emacs. Корисності та трюки
це мій перший пост на хабрі та в блогах взагалі, так що не судіть суворо. emacs - це диво-конструктор, з нього можна зліпити практично все, що завгодно (або можливо). і чим більше ви з ним працюєте, тим більше ви відчуваєте його безмежність та міць. тут вам і поштовий клієнт, і джаббер, і шелл, універсальне середовище для розробки, файловий менеджер, ігри… цей список можна продовжувати та доповнювати.
1) почну з елементарного. інтерфейс. не користуюся кнопками, меню, скролл баром, т.к. вважаю їх неефективними та марними. прибираємо їх.
;;; scroll bar (scroll-bar-mode -1)
;;; tool bar (tool-bar-mode -1)
;;; menu bar (menu-bar-mode -1)
2) мені не подобаються кольори, що йдуть за умовчанням. вирішив замінити їх на темніші та приємніші оку (у мене LCD).
(set-background-color "#333333") (set-foreground-color "#ffffff") якщо вони вас не влаштовують, ви можете переглянути список усіх кольорів 'M-x list-color-display ' і змінити на сподобався. колір курсору - (set-cursor-color)
3) шрифти. ось тут можна сперечатися нескінченно. як багатьом відомо в emacs з нещодавно з'явилася підтримка xft. комусь воно може і подобається, але для програмування я більше віддаю перевагу bitmap шрифтам. єдиний мінус це utf8, далеко не всі тримають його. з цієї причини я вибрав terminus. і 0 від в ньому відрізниш, а це важливий момент. я змінюю шрифти через .Xdefaults. у windows це робиться через реєстр, Google допоможе.
4) utf8. для правильного відображення utf8 у shell і dired.
(setq file-name-coding-system 'utf-8)
ГАРЯЧІ КЛАВИШІ І КОРИСНІ ДРІБНИЦТВА
5) поміняйте capslock на ctrl. Дуже важлива річ. це, гадаю, найголовніше для ефективного використання emacs. щодо цього тежвиникає безліч суперечок, але мені здається досить зручним. додайте в .xmodmaprc (якщо його немає у вас, створіть) наступне:
keycode 66 = Control_L clear Lock add Control = Control_L
додайте рядок у .xinitrc або .xsession, залежно від того, як ви вантажите ікси.
6) зручний скролінг та виділення поточного рядка. За замовчуванням emacs прокручує майже на половину екрана, що дуже не зручно. виправимо це. і ще буває що втрачаєш місце курсора, для цього вмикаємо підсвічування поточного рядка.
(setq scroll-step 1) (global-hl-line-mode 1)
7) ми знаємо, 'C-x o' перемикає фокус на наступне вікно. а якщо вікон 5 чи 10? робимо навігацію простіше.
тепер навігація буде проходити так: alt + \arrow keys\.
8) змінювати розміри вікна, за замовчуванням, можна мишкою ... для цього потрібно забирати руку від клавіатури. а це зручно? я теж так думаю. додамо наступне у .emacs.
(defun win-resize-top-or-bot () "Figure out if the current window is on top, bottom or in the middle" (let* ((win-edges (window- edges)) (this-window-y-min (nth 1 win-edges)) (this-window-y-max (nth 3 win-edges)) (fr-height (frame -height))) (cond ((eq 0 this-window-y-min) "top") ((eq (- fr-height 1) this-window-y-max) "bot") (t "mid"))))
(defun win-resize-left-or-right () "Figure out if the current window is to the left, right or in the middle" (let* ((win-edges (window -edges)) (this-window-x-min (nth 0 win-edges)) (this-window-x-max (nth 2 win-edges)) (fr-width ( frame-width))) (cond ((eq 0 this-window-x-min) "left") ((eq (+ fr-width 4) this-window-x-max ) "right") (t "mid"))))
(defun win-resize-enlarge-horiz () (interactive) (cond ((equal "top")(win-resize-top-or-bot)) (enlarge-window -1)) ((дорівнює "bot" (win-resize-top-or-bot)) (enlarge-window 1)) ((дорівнює "mid" (win-resize-top-or-bot)) (enlarge-window -1)) (t (повідомлення "nil"))))
(defun win-resize-minimize-horiz () (interactive) (cond ((дорівнює "top" (win-resize-top-or-bot)) (enlarge-window 1)) ((дорівнює "bot" (win-resize-top-or-bot)) (enlarge-window -1)) ((дорівнює "mid" (win-resize-top-or-bot)) (збільшити вікно 1)) (t (повідомлення "нуль"))))
(defun win-resize-enlarge-vert () (interactive) (cond ((дорівнює "left" (win-resize-left-or-right)) (enlarge-window-horizontally - 1)) ((дорівнює "праворуч" (win-resize-left-or-right)) (enlarge-window-horizontally 1)) ((дорівнює "mid" (win-resize-left-or) -вправо)) (збільшити-вікно-горизонтально -1))))
(defun win-resize-minimize-vert () (interactive) (cond ((дорівнює "left" (win-resize-left-or-right)) (enlarge-window-horizontally 1 )) ((дорівнює "праворуч" (win-resize-left-or-right)) (enlarge-window-horizontally -1)) ((дорівнює "mid" (win-resize-left-or) -вправо)) (збільшити-вікно-горизонтально 1))))
(global-set-key [C-M-down] 'win-resize-mi2nimize-vert) (global-set-key [C-M-up] 'win-resize-enlarge-vert) (глобальний набір -key [C-M-left] 'win-resize-minimize-horiz) (global-set-key [C-M-right] 'win-resize-enlarge-horiz) (global-set-key [C-M -up] 'win-resize-enlarge-horiz) (global-set-key [C-M-down] 'win-resize-minimize-horiz) (global-set-key [C-M-left] ' win-resize-enlarge-vert) (global-set-key [C-M-right] 'win-resize-minimize-vert)
як видно з розкладки клавіш' ом, 'ctrl + alt + \клавіші зі стрілками\' резайзит вікна.
9) думаю, не тільки мене роздражає, то що надо завжди набирати так або ні, коли закриваєш буфер або покидаєш emacs. не легче набрати y або n?
це заощадить від одного, до двох зайвих натискань.
10) при роботі з великою кількістю буферів, я відчував незручність при перемиканні між ними, я довго не міг знайти те, що мені потрібно. виявляється у emacs'а був режим і для цього.
До речі, це старий варіант перемикання між буферами. не зрозумію навіщо його прибрали. Тепер після натискання 'C-x b' буде викликатися iswitchb-buffer. він автоматично відкидає не потрібне, а коли залишається єдиний варіант, то достатньо натиснути tab і ви переключитесб на потрібний буфер. єдиний мінус який я помітив - якщо є буфери з назвами: in і main, то ввівши in він вибирає main, а звернутися до in буває неможливо. може, і є на це клавіша або команда, але я не знайшов.
і ще я вирішив додати зручніші клавіші для перемикання на наступний/попередній буфер.
(global-set-key [?\C-,] 'previous-buffer) (global-set-key [?\C-.] 'next-buffer)
11) бувають моменти коли забуваєш затиснути ctrl для навігації через 'C-n' 'C-p' і т.д. і виходять не потрібні послідовності типу: nnnnnnnnnnnn pppppppppppffffffffff. не видаляти все backspace' ом ... можна зробити гарячу клавішу для bacward-kill-word.
(global-set-key "\C-w" 'backward-kill-word) (global-set-key "\C-x\C-k" 'kill-region) (global-set-key "\C-c\ C-k" 'kill-region)
тепер, щоб «вбити» виділений текст доведеться натискати 'C-x C-k', т.к. на 'C-w' ми призначили bacward-kill-region.
12) макроси - потужна річ як у програмуванні, так і в emacs. вони варті того, щоб виділити їм зручні кейбіндинги.
(global-set-key [f2] 'kmacro-call-macro) (global-set-key [f3] 'kmacro-start-macro-or-insert-counter) (global-set-key [f4] 'kmacro-end-or-call-macro)
f2 - call macro f3 - start macro f4 - end macro
13) часто буває, коли треба перейти на початок буфера, а потім назад на місце, де був раніше. для цього є закладки. для зручності я додав гарячі клавіші для їхнього виклику.
(global-set-key [f5] 'bookmark-set) (global-set-key [f6] 'bookmark-jump)
f5, введіть ім'я закладки, робіть що потрібно, f6, вводьте ім'я закладки, і знову на тому самому місці.
скопіюйте його у свою завантажувальну директорію. якщо у вас її немає. то створіть директорію elisp (або як вам зручно) у домашньому каталозі (або як вам зручно) і додайте до .emacs:
/elisp") ;; якщо вже підвантажили, то природно це вже писати не треба (require 'workspaces) (global-set-key [?\C-q] 'workspace-goto)
я вирішив вибрати 'C-q'. 'C-q' \0-9\ - перемикає на потрібний воркспейс. як ви вже, напевно, зрозуміли максимальну їх кількість-9.
15) якщо ви працюєте з великою кількістю файлів/буферів та вирішили закрити emacs, а потім вирішили відновити роботу. не відкривати їх заново ... попросимо emacs зберігати сесію перед виходом.
на цьому все. якщо вас цікавить мій .emacs, звертайтеся, у мене там ще кілька записів щодо програмування та налагодження. буду радий почути вашу критику. з повагою, wzrd.
Хардкорна конфа за С++. Ми запрошуємо лише профі.