Emacs 有什麼奇技淫巧?

例如我目前使用內置的CLOCK來作時間日誌.


排名第一的答案已經回答了好多, 我就補充一點其他方面

首先是erc啦, 在emacs裡面聊, 簡單切換, 鍵綁定, 方便的顏色配置, 和各種其他插件配合, 讓你忘掉irssi。

然後是emms, 後端是mplayer, 在emacs裡面聽音樂, 用熟悉的鍵組合控制播放。 更關鍵的是, mplayer播放ape無壓力有木有!

最後來點好玩的硬貨: figlet。這本來是獨立於emacs的小工具, 不過現在已經在elpa看到emacs中的figlet插件啦。在一個窗口中寫出ascii-art, yank到源碼中作為注釋。 在肉眼瀏覽代碼(不用或者無法使用其他工具定位)時真是誰用誰知道。 配合上放大縮小快捷鍵, 或者minimap, 隨時精準肉眼定位。


奇淫技巧是吧?翻了翻我的 .emacs…

首先當然是 nyan nyan nyan… 當前 window 的 modeline 上顯示一個小圖片~~

;; Add a small image to the mode line for current window~~
(defconst active-modeline-image
(create-image my-active-modeline-image "png nil
:ascent "center))
(defconst mode-line-img
(propertize (make-string my-active-modeline-image-width #x20)
"display active-modeline-image))

(defvar my-current-win nil)
(defun set-current-window (windows)
(when (not (minibuffer-window-active-p (frame-selected-window)))
(setq my-current-win (selected-window))))
(add-function :before pre-redisplay-function #"set-current-window)

(add-hook "after-init-hook
(lambda ()
(setq-default
mode-line-format
(append mode-line-format
`((:eval
(if (eq my-current-win (get-buffer-window))
,mode-line-img)))))))

把一些特定的詞顯示成其他特定字元。這玩意的標準用法是這樣的:

注意圖中的 lambda. 這個實現使用了 font lock. 好像 24.4 里增加了專門實現這個的函數……

;; Replace stuff like `lambda", `-&>" with actual unicode chars.
(defun unicode-symbol (name)
"Translate a symbolic name for a Unicode character -- e.g., LEFT-ARROW
or GREATER-THAN into an actual Unicode character code. "
(decode-char "ucs (case name
("lambda #X03BB)
;; other subs...
)))

(defun substitute-pattern-with-unicode (pattern symbol)
"Add a font lock hook to replace the matched part of PATTERN with the
Unicode symbol SYMBOL looked up with UNICODE-SYMBOL."
(interactive)
(font-lock-add-keywords
nil `((,pattern (0 (progn (compose-region (match-beginning 1) (match-end 1)
,(unicode-symbol symbol))
nil))))))

(defun substitute-patterns-with-unicode (patterns)
"Call SUBSTITUTE-PATTERN-WITH-UNICODE repeatedly."
(mapcar #"(lambda (x)
(substitute-pattern-with-unicode (car x)
(cdr x)))
patterns))

「智能」選擇使用 cua 塊和 multi-cursor: 如果當前有選區,用 multi-cursor, 沒有就用 cua 塊選,好用到令人髮指。

(defun cua-or-multicursor ()
(interactive)
(if (use-region-p)
(mc/edit-lines)
(cua-rectangle-mark-mode)))
;; http://emacs.stackexchange.com/a/9916/514
(eval-after-load "multiple-cursors-core"
(lambda ()
(add-to-list "mc--default-cmds-to-run-once "cua-or-multicursor)))

對當前的 cua 選區加和,媽媽再也不用擔心我不會寫 awk 了~~

(defun sum-cua-rectangle ()
;; Treat the content of current cua rectangle as numbers, and
;; calculate sum.
(interactive)
(message
(number-to-string
(reduce (lambda (x y) (+ x y))
(mapcar (lambda (n) (string-to-number n))
(cua--extract-rectangle))))))

在 modeline 上顯示縮減版 modes 信息。Modes 什麼的最佔地方了…… 效果見第一張圖下面的 modeline.

;; Shorter modeline
(defvar mode-line-cleaner-alist
"((auto-complete-mode . "α")
;; Major modes
(lisp-interaction-mode . "λ")
)
"Alist for `clean-mode-line".
When you add a new element to the alist, keep in mind that you
must pass the correct minor/major mode symbol and a string you
want to use in the modeline *in lieu of* the original.")

(defun clean-mode-line ()
(interactive)
(loop for cleaner in mode-line-cleaner-alist
do (let* ((mode (car cleaner))
(mode-str (cdr cleaner))
(old-mode-str (cdr (assq mode minor-mode-alist))))
(when old-mode-str
(setcar old-mode-str mode-str))
;; major mode
(when (eq mode major-mode)
(setq mode-name mode-str)))))

(add-hook "after-change-major-mode-hook "clean-mode-line)

你們知道 Emacs 啟動顯示的那個圖片是可以換的吧?設一下 fancy-splash-image 這個變數就可以了,不知道為什麼從來沒見人換過……

確保某個包已經安裝,如果沒有的話就裝之。

(defun ensure-package-installed (rest packages)
"Assure every package is installed, ask for installation if it』s not.
a list of installed packages or nil for every skipped package."
(mapcar
(lambda (package)
;; (package-installed-p "evil)
(if (package-installed-p package)
nil
(if (y-or-n-p (format "Package %s is missing. Install it? " package))
(package-install package)
package)))
packages))

然後就可以這樣了:

(ensure-package-installed
"linum "whitespace "company "company-jedi "web-mode "magit "helm
"helm-gtags "multiple-cursors "yasnippet "auctex
"smart-mode-line "ggtags "rainbow-delimiters)

|====================== ERC 分割線???======================|

其他回答里好像有人提到了 ERC?

……

……

……

……

神器啊!!!!!!!!!!!!!!!!!!!!!!!!!話說大家都是混哪個頻道的啊?認識認識唄~~

一鍵連接所有頻道:

(defconst irc-channels
"(("freenode.net" "#ubuntu-cn" "#archlinux-cn" "#emacs.tw"
;; "#geekhack"
)
("oftc.net" "#arch-cn" "#njulug" "#wormux-cn" "#emacs-cn")
("esper.net" "#minecraft-cn")))
(ignore-errors (setq erc-autojoin-channels-alist irc-channels))

(defun erc-start ()
(interactive)
(erc :server "irc.freenode.net" :port 6667 :nick irc-nick
:password irc-password :full-name irc-full-name)
(erc-tls :server "irc.oftc.net" :port 6697 :nick irc-nick
:password irc-password :full-name irc-full-name)
(erc-tls :server "irc.esper.net" :port 6697 :nick irc-nick
:password irc-password :full-name irc-full-name))

然後你們知道 ERC 退出頻道的時候是可以選遺言的吧?……么?

(setq erc-quit-reason-various-alist
"(("dinner" "Having dinner...")
("z" "Zzz...")
("^$" yow)))
(setq erc-quit-reason "erc-quit-reason-various)

ERC 可以自定義 irc command… 比如這樣:

(defun erc-cmd-THINK (rest line)
(let ((text
(concat ".oO{ "
(erc-trim-string (mapconcat "identity line " "))
" }")))
(erc-send-action (erc-default-target) text)))

效果大概是這樣:

#porn&> /think Time to eat...
* MetroWind .oO{ Time to eat... }

還有這個命令:

(defun erc-cmd-SLAP (rest nick)
(if (not (equal "() nick))
(erc-send-action
(erc-default-target)
(concat "slaps " (car nick)
" with Peskin"s Introduction to QFT."))))

效果是這樣:

#porn&> /slap ChanServ
* MetroWind slaps ChanServ with Peskin"s Introduction to QFT.

還有這個:

(defun erc-cmd-SHOWOFF (rest ignore)
"Show off implementation"
(let* ((chnl (erc-buffer-list))
(srvl (erc-buffer-list "erc-server-buffer-p))
(memb (apply "+ (mapcar (lambda (chn)
(with-current-buffer chn
(1- (length (erc-get-channel-user-list)))))
chnl)))
(show (format "is connected to %i networks and talks in %i chans to %i ppl overall :&>"
(length srvl)
(- (length chnl) (length srvl))
memb)))
(erc-send-action (erc-default-target) show)))

效果:

#porn&> /showoff
* MetroWind is connected to 3 networks and talks in 8 chans to 184 ppl overall :&>

難道我會告訴你這個命令會刷屏這個秘密么~~

;; Say hi to everyone, use with CAUTION!!
(defun erc-cmd-HI ()
(defun hi-to-nicks (nick-list)
(if (eq nick-list "())
nil
(erc-send-message (concat "Hi, " (car nick-list)))
(sleep-for 1)
(hi-to-nicks (cdr nick-list))))

(let ((nicks (erc-get-channel-nickname-list)))
(hi-to-nicks nicks)))

嗯,效果就不放了,剛剛被轟出頻道了。

像什麼聲音提醒啦,Mac 消息中心提醒啦(要程序么?我有:MetroWind/mini-notifier · GitHub),h4x0r 啦,發送 lisp 以及運行結果啦,都太普通了,一點都不好玩~~

最後是廣告時間:我的顏色主題 MetroWind/emacs-flatui-theme · GitHub


Emacs 25 將會支持 C 動態鏈接庫的載入 (Heads up: dynamic-loading merge heading into emacs-25)。

這個特性將會豐富 Emacs 可以做的事情,並且可以提升性能,比如把 libcurl 通過插件的方式暴露給 Emacs (Re: Dynamic loading progress)。以前需要這種功能可能是通過調用 sub-process 的方式實現的。


我寫了 online judge client 刷 leet code 不用打開網頁了。還寫了一個項目模板工具, 自動創建項目結構, 自動插入snippets。 我用 emacs 控制 android 不用那麼麻煩的切換鍵盤和手機了。 我也用 emacs 來控制豆瓣電台。 用 ac-clang 來作 c++ 補全, 用 rtags 來做索引 (clang 大法好) 。 用 ecb 和 projectile 把 emacs ide 化。 org-mode 也是一個非常好用的 mode 我用它來寫博客,畫 uml, 寫 wiki 同步到 evernote 。。。。 很容易自己擴展, 很好調教


M-x butterfly


Org-mode , 這是一個全功能的個人信息管理平台,可以寫單頁的文章,可以寫書,可以做wiki化的內容管理,可以做個人任務管理。

Emacs SLIME 插件,強大的 Lisp 開發工具,我感覺 iPython 和 Pry 的一些設計思想很可能來自這個環境。

CEDET ,現在已經是 Emacs 的內置插件。這是一個目標遠大的坑。經常是同一個環境我幾台機能配好一兩台,其它就跑不動,但是它正常工作的時候還是很贊的。

Emacs Haskell-mode 有個非常花哨的用法:把代碼中的一部分運算符變成unicode,例如 sqrt 寫成 √ 。具體的玩法可以去haskell官網看到。而且這個可以自己擴展。


M-x doctor

你的私人心理醫生…


emacs的操作有不是奇技淫巧的嗎?【正經臉】


玩Racket ,emacs 有個插件geiser

geiser+paredit-mode 是玩Racket 的好環境

雖然Racket 社區有人fork 了一個geiser 可以安裝到DrRacket 上,但是不好用


symon-mode

zk-phi/symon · GitHub

exwm

github.com 的頁面

meme

larsmagne/meme


安利下我自己的超級配置,簡潔快速,滿足大多數功能。

https://github.com/seagle0128/.emacs.d


c-x c-f不輸入文件名,直接編輯


推薦閱讀:

如何優雅地使用 LaTeX 編輯公式?
電影《危機解密 》(The Fifth Estate )中使用的是什麼編輯器?
VIM怎樣讓編輯行自動位於屏幕中間?

TAG:文本編輯器 | X使用技巧 | Emacs |