Emacs入坑之旅——常用基本操作

推薦:一年成為Emacs高手(像神一樣使用編輯器)
參考:Master Emacs in 21 Days

這些年也用過(guò)不少的編輯器酵镜、IDE,在使用各個(gè)編輯器的時(shí)候也多多少少鼓搗過(guò)各個(gè)編輯器的插件柴钻、擴(kuò)展淮韭,比如Eclipse插件、Notepad++插件贴届、Sublime插件等靠粪,對(duì)于"插件蜡吧、擴(kuò)展"這種能夠延伸編輯器手和腳的方式很是興趣盎然,而且用自己寫(xiě)出的插件可以極大地提高生產(chǎn)力占键,從而帶來(lái)一種莫名的滿(mǎn)足感昔善。

于是Emacs以其強(qiáng)大的擴(kuò)展性吸引了我,開(kāi)始入坑Emacs畔乙,Emacs還是自由軟件之父理查德·斯托曼大師的作品君仆,其質(zhì)量肯定是有保障的。本文主要總結(jié)一下最常用的Emacs操作牲距,至于Emacs有多厲害返咱、如何安裝、如何......嗅虏,網(wǎng)上的資料鋪天蓋地(比如開(kāi)篇推薦的那篇文章)洛姑,不在本文的討論范圍之內(nèi)。

按鍵約定

組合按鍵

Emacs中大量的按鍵操作都是各式各樣的組合按鍵(快捷鍵)皮服,下面是幾種通常的約定:

  • Ctrl鍵:表示為C
  • Alt鍵:表示為M
  • Shift鍵:表示為S
  • 組合按鍵:比如向下移動(dòng)一行的組合按鍵是Ctrl+n楞艾,就表示為:C-n,其含義表示同時(shí)按下鍵盤(pán)上的Ctrln鍵龄广。

按鍵順序

有時(shí)候用多個(gè)組合按鍵來(lái)表示一種操作硫眯,比如以下按鍵序列:C-x C-f [文件路徑] <RET>就表示打開(kāi)文件的操作,它表示這樣的操作含義:先同時(shí)按下Ctrlx鍵择同,然后松開(kāi)两入,緊接著馬上再同時(shí)按下Ctrlf鍵,然后再松開(kāi)敲才,然后在下方的輸入欄中輸入文件路徑裹纳,輸入完之后按回車(chē)鍵(用<RET>表示),最后就打開(kāi)了一個(gè)文件紧武。

還有一種按鍵順序:C-x o剃氧,表示切換到另外一個(gè)緩沖區(qū),它是這樣一組按鍵:先同時(shí)按下Ctrlx鍵阻星,然后松開(kāi)朋鞍,然后緊接著按字母o鍵。

還有另外一種按鍵順序妥箕,比如以下按鍵序列:C-u [10] C-p滥酥,就表示這樣的操作含義:先同時(shí)按下Ctrlu鍵,然后松開(kāi)畦幢,然后依次按10鍵坎吻,然后松開(kāi),最后再同時(shí)按Ctrlp鍵宇葱。這組按鍵達(dá)到的效果就是把光標(biāo)從當(dāng)前位置往上移動(dòng)10行禾怠。

特殊按鍵

  • 表示輸入內(nèi)容返奉,用方括號(hào)括起來(lái):[輸入的內(nèi)容]
  • 表示回車(chē)鍵:<RET>
  • 表示其他鍵:比如<Backspace>表示退格鍵(刪除鍵)贝搁,<Delete>表示刪除鍵吗氏,<TAB>表示TAB鍵,<Left>表示左箭頭鍵雷逆,<Right>表示右箭頭鍵弦讽,<Up>表示上箭頭鍵,<Down>表示下箭頭鍵膀哲,<f5>表示F5鍵往产。

Quick Start

文本操作,無(wú)外乎打開(kāi)文件某宪、編輯文件仿村、保存文件,涉及的核心兴喂、最高頻命令非常簡(jiǎn)單蔼囊,整理如下:

  • C-x C-f [文件路徑] <RET>:打開(kāi)一個(gè)文件
  • C-n:將光標(biāo)向下移動(dòng)一行
  • C-p:將光標(biāo)向上移動(dòng)一行
  • C-g:取消之前的按鍵(將會(huì)成為最常用的按鍵之一)
  • C-x C-s:保存文件
  • C-x C-c:退出Emacs

常用操作分類(lèi)匯總

文件操作

  • C-x C-f [文件路徑] <RET>:打開(kāi)一個(gè)文件
  • C-x C-s:保存文件
  • C-x 4 f [文件路徑] <RET>:在一個(gè)新的窗格(緩沖區(qū))中打開(kāi)文件
  • C-x 5 f [文件路徑] <RET>:在一個(gè)新的窗口中打開(kāi)文件

移動(dòng)操作

  • C-n:將光標(biāo)向下移動(dòng)一行
  • C-p:將光標(biāo)向上移動(dòng)一行
  • C-b:將光標(biāo)左移一個(gè)字符
  • C-f:將光標(biāo)右移一個(gè)字符
  • M-f:將光標(biāo)右移一個(gè)單詞
  • M-b:將光標(biāo)左移一個(gè)單詞
  • C-v:向下移動(dòng)一屏
  • M-v:向上移動(dòng)一屏
  • C-l:將當(dāng)前光標(biāo)所在行移動(dòng)到屏幕中央(注意:這里是字母L
  • C-a:將光標(biāo)移到行首
  • C-e:將光標(biāo)移到行尾
  • M-S-<:將光標(biāo)移動(dòng)到文件開(kāi)頭
  • M-S->:將光標(biāo)移動(dòng)到文件末尾
  • M-m:將光標(biāo)移動(dòng)到行首的第一個(gè)非空白字符

查找與替換操作

  • C-s [查找的內(nèi)容]:向前查找
  • C-r [查找的內(nèi)容]:向后查找
  • C-M-s [查找的內(nèi)容]:向前正則查找
  • C-M-r [查找的內(nèi)容]:向后正則查找
  • M-S-%:查找并替換,操作步驟如下:按下M-S-%鍵啟動(dòng)查找替換衣迷,輸入要被替換的詞畏鼓,回車(chē),然后輸入要替換的詞壶谒,再回車(chē)云矫。被替換的詞此時(shí)會(huì)高亮起來(lái),這時(shí)汗菜,輸入y替換并跳到下一個(gè)让禀,輸入n忽略并跳到下一個(gè),輸入q結(jié)束陨界,輸入巡揍!替換剩下的全部。

文本選擇操作

  • C-S-e:選中從當(dāng)前位置到行尾的文本
  • C-S-n:從當(dāng)前位置開(kāi)始往下選中一行文本
  • C-S-p:從當(dāng)前位置開(kāi)始往上選中一行文本
  • C-S-f:從當(dāng)前位置開(kāi)始往后選中一個(gè)字符
  • C-S-b:從當(dāng)前位置開(kāi)始往前選中一個(gè)字符
  • M-S-f:從當(dāng)前位置開(kāi)始往后選中一個(gè)單詞
  • M-S-b:從當(dāng)前位置開(kāi)始往前選中一個(gè)單詞
  • M-S-e:選中從當(dāng)前位置開(kāi)始到當(dāng)前句尾的文本
  • M-S-a:選中從當(dāng)前位置開(kāi)始到當(dāng)前句首的文本
  • C-S-@ [其他移動(dòng)操作]:從一個(gè)起始位置普碎,選中連續(xù)的字符吼肥,比如C-S-@ C-e就表示選中從當(dāng)前光標(biāo)位置到行尾的所有字符
  • C-S-v:向下選擇一屏
  • M-S-v:向上選擇一屏
  • C-S-l:讓當(dāng)前光標(biāo)所在行居中
  • C-x h:全選

文本編輯操作

  • 插入文本:只要光標(biāo)在當(dāng)前緩沖區(qū),就可以直接輸入插入文本麻车。
  • C-k:刪除光標(biāo)到行尾的所有字符
  • C-u [N] [操作序列]:重復(fù)執(zhí)行一個(gè)操作序列N次
  • C-/C-x u:撤銷(xiāo)(undo)上次操作缀皱,多次按可以撤銷(xiāo)之前的多次操作
  • C-g C-/:重做(redo),用于重做上次的撤銷(xiāo)動(dòng)作(撤銷(xiāo)之后后悔了动猬,想恢復(fù)重做)
  • <Backspace>:刪除當(dāng)前光標(biāo)前的一個(gè)字符
  • C-<Backspace>:刪除當(dāng)前光標(biāo)前的一個(gè)單詞
  • C-d<Delete>:刪除當(dāng)前光標(biāo)后的一個(gè)字符
  • M-<Backspace>:剪切當(dāng)前光標(biāo)前的一個(gè)字符到剪貼板
  • M-d:剪切當(dāng)前光標(biāo)后的一個(gè)字符到剪貼板
  • C-k:剪切從光標(biāo)到行尾的字符到剪貼板
  • C-y:粘貼剪貼板中的文本到當(dāng)前光標(biāo)位置
  • M-w:復(fù)制當(dāng)前選中的字符
  • C-w:剪切當(dāng)前選擇的字符到剪貼板
  • C-a C-k:剪切一整行到剪貼板中啤斗,其實(shí)也可以用于刪除一整行
  • C-e <RET>:在當(dāng)前行下方插入一空行
  • C-x C-q:讓當(dāng)前buffer在“只讀”和“讀寫(xiě)”兩種編輯模式之間切換

多窗格與多窗口

首先要明確一下Emacs中窗格與窗口的概念的區(qū)別:每個(gè)窗格其實(shí)就是一個(gè)緩沖區(qū),一個(gè)窗口中可以同時(shí)打開(kāi)多個(gè)窗格赁咙,而窗口就是像Windows那樣的GUI窗口钮莲。

  • C-x 1:僅保留當(dāng)前窗格免钻,關(guān)閉其他窗格
  • C-x 2:在垂直方向打開(kāi)2個(gè)窗格
  • C-x 3:在水平方向打開(kāi)2個(gè)窗格
  • C-x o:在不同窗格之間切換
  • C-x 0:關(guān)閉當(dāng)前窗格
  • C-x S-{:減小當(dāng)前窗格的水平寬度
  • C-x S-}:縮小當(dāng)前窗格的水平寬度
  • C-x S-^:增大當(dāng)前窗格的垂直高度
  • C-M-v:在另一個(gè)窗格中向下滾動(dòng)一屏(但光標(biāo)還保留在當(dāng)前窗格)
  • C-M-S-v:在另一個(gè)窗格中向上滾動(dòng)一屏(但光標(biāo)還保留在當(dāng)前窗格)
  • M-x make-frame:打開(kāi)一個(gè)新窗口
  • M-x delete-frame:關(guān)閉當(dāng)前窗口
  • C-z:掛起當(dāng)前的窗口(相當(dāng)于最小化當(dāng)前的窗口)

文本編碼

  • M-x describe-coding-system <RET>:查看當(dāng)前緩沖區(qū)的編碼格式
  • C-x <RET> r <TAB>:列出當(dāng)前的所有編碼
  • C-x <RET> f utf-8 <RET>:改變當(dāng)前緩沖區(qū)的編碼為utf-8

命令與函數(shù)操作

  • M-x [函數(shù)名] <RET>:執(zhí)行一個(gè)函數(shù)
  • M-S-! [命令] <RET>:執(zhí)行一個(gè)命令行命令
  • M-x shell <RET>:在一個(gè)新窗格中、當(dāng)前目錄位置打開(kāi)命令行

一些常用操作

  • M-x goto-line <RET> [行號(hào)] <RET>:跳轉(zhuǎn)到某一行崔拥,將其綁定到快捷鍵C-c j
;; 快速跳到某一行
(global-set-key (kbd "C-c j") 'goto-line)
  • M-x electric-pair-mode <RET>:打開(kāi)括號(hào)配對(duì)模式

緩沖區(qū)

  • C-x C-b:在一個(gè)新窗格中列出當(dāng)前所有的緩沖區(qū)
  • C-x b xxx <RET>:切換到名為xxx的緩沖區(qū)
  • C-x k xxx <RET>:關(guān)閉一個(gè)名為xxx的緩沖區(qū)(如果直接按回車(chē)极舔,默認(rèn)關(guān)閉的是當(dāng)前緩沖區(qū))
  • C-x s:一個(gè)個(gè)詢(xún)問(wèn)是否保存當(dāng)前每個(gè)緩沖區(qū)的內(nèi)容
  • M-x kill-some-buffers <RET>:一個(gè)個(gè)詢(xún)問(wèn)是否關(guān)閉當(dāng)前打開(kāi)的緩沖區(qū)
  • C-x <Left>:在多個(gè)緩沖區(qū)之間切換
  • C-x <Right>:在多個(gè)緩沖區(qū)之間切換

配置相關(guān)

  • C-x d S-~ <RET>:打開(kāi)Emacs配置文件所在路徑
  • C-h v load-path <RET>:查看Emacs的加載路徑

幫助操作

  • C-h t:查看Emacs快速指南
  • C-h f:查看一個(gè)函數(shù)(命令)的幫助文檔
  • C-h S-?M-x [help]:查看幫助
  • C-h c [命令序列]:顯示命令序列對(duì)應(yīng)的函數(shù)名
  • C-h k [命令序列]:顯示命令序列的詳細(xì)文檔(打開(kāi)一個(gè)新窗格)
  • C-h a [關(guān)鍵詞]:打開(kāi)一個(gè)新窗格列出所有含有此關(guān)鍵詞的命令
  • C-h i:查看信息字典文檔
  • C-h r:查看使用手冊(cè)
  • C-h m:查看當(dāng)前緩沖區(qū)的major mode和minor mode及其介紹
  • C-h b:查看和當(dāng)前緩沖區(qū)綁定的快捷鍵列表
  • C-h v [變量名]:查看某個(gè)變量的值
  • C-h w [函數(shù)名]:查看某個(gè)函數(shù)綁定的快捷鍵
  • C-h i m [elisp] <RET>:查看elisp文檔

命令行操作

以下操作都是在系統(tǒng)命令行中的操作:

  • emacs -nw -Q:在命令行中打開(kāi)Emacs,-nw參數(shù)表示:no window链瓦,-Q參數(shù)表示:不顯示歡迎界面拆魏。在命令行打開(kāi)Emacs后,各項(xiàng)操作和按鍵與在GUI窗口中是一致的

配置文件基本用法

配置文件的位置

emacs配置文件有兩個(gè)位置:~/.emacs~/.emacs.d/init.el慈俯,下面以~/.emacs.d/init.el為例進(jìn)行說(shuō)明(如果不存在渤刃,則自行創(chuàng)建一個(gè)該文件即可)。為了不產(chǎn)生影響贴膘,需要把~/.emacs這個(gè)文件刪掉卖子。

打開(kāi)配置文件的快捷鍵

在emacs中打開(kāi)配置文件所在的路徑(~/.emacs.d)有一個(gè)快捷鍵:C-x d S-~ <RET>

修改配置文件并使之生效

打開(kāi)emacs的配置文件~/.emacs.d/init.el,在文件的最后追加一行內(nèi)容并保存:

;; 默認(rèn)顯示行號(hào)
(global-linum-mode 1)

然后執(zhí)行M-x load-file <RET> init.el操作使得配置文件生效刑峡。這時(shí)再看打開(kāi)的文本文件洋闽,就會(huì)發(fā)現(xiàn)左邊多出來(lái)了行號(hào)。

把打開(kāi)氛琢、加載配置文件的操作綁定到自定義的快捷鍵上

在配置文件init.el后面追加下面的代碼并保存:

;; 定義一個(gè)函數(shù):快速打開(kāi)配置文件
(defun open-init-file()
    (interactive)
    (find-file "~/.emacs.d/init.el"))
    
;; 把函數(shù)open-init-file綁定到快捷鍵<F2>鍵上
(global-set-key (kbd "<f2>") 'open-init-file)

;; 快速加載init.el
(global-set-key (kbd "C-<f5>") 'load-file)

執(zhí)行M-x load-file <RET> init.el操作使得配置文件生效喊递,這時(shí)再按<F2>鍵就可以直接快速打開(kāi)init.el配置文件了,再次修改init.el文件后阳似,也可以直接按快捷鍵C-<f5>使配置生效了骚勘。

把大小寫(xiě)切換鍵變?yōu)镃trl鍵

在一般的鍵盤(pán)上,Ctrl鍵位于左下角撮奏,需要用左手的小拇指去按俏讹,不是很順手,而emacs的很多組合按鍵都需要用到Ctrl鍵畜吊,就會(huì)帶來(lái)一定的不便泽疆。不過(guò)可以發(fā)現(xiàn),用左手的小拇指去按Caps Lock大小寫(xiě)切換鍵還是很順手的玲献,那么能不能把Caps Lock鍵變成Ctrl鍵呢殉疼?

答案是可以的,這個(gè)時(shí)候可以使用autohotkey這樣一款軟件把Caps Lock鍵變成Ctrl鍵捌年,并且只在打開(kāi)emacs時(shí)生效瓢娜,不影響在其他軟件中的按鍵操作。在Windows系統(tǒng)的用法如下:

  • 到autohotkey的下載頁(yè)面下載最新的zip包到本地礼预,解壓縮眠砾。
  • 復(fù)制下面代碼,保存為一個(gè)文件托酸,命名為caps2ctrl.ahk
#IfWinActive emacs  ; if in emacs
Control::Capslock   ; make Control the Caps Lock button
Capslock::Control   ; make Caps Lock the control button
#IfWinActive        ; end if in emacs
  • caps2ctrl.ahk文件復(fù)制到剛剛解壓縮得到的文件夾下的Compiler子文件中褒颈,在這個(gè)文件夾位置打開(kāi)cmd命令行柒巫,輸入命令:Ahk2Exe.exe /in caps2ctrl.ahk /out caps2ctrl.exe,然后就在當(dāng)前文件夾生成了一個(gè)名為caps2ctrl.exe的可執(zhí)行文件谷丸,雙擊打開(kāi)它堡掏。
  • 這時(shí)再打開(kāi)emacs,可以發(fā)現(xiàn)Caps Lock鍵已經(jīng)變成了Ctrl鍵淤井。如果想切換大小寫(xiě)只需按Ctrl鍵即可布疼。
  • 退出caps2ctrl.exe程序即可恢復(fù)上面的修改。
  • caps2ctrl.exe程序可以在沒(méi)有下載autohotkey軟件的電腦上獨(dú)立使用(我已經(jīng)生成好了一個(gè)放在我的百度網(wǎng)盤(pán)里:caps2ctrl.exe.rar)币狠。要注意的是,如果是在cmd命令行中打開(kāi)emacs砾层,caps2ctrl.exe程序是無(wú)法生效的漩绵。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肛炮,隨后出現(xiàn)的幾起案子止吐,更是在濱河造成了極大的恐慌,老刑警劉巖侨糟,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍扔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秕重,警方通過(guò)查閱死者的電腦和手機(jī)不同,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溶耘,“玉大人二拐,你說(shuō)我怎么就攤上這事〉时” “怎么了百新?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)庐扫。 經(jīng)常有香客問(wèn)我饭望,道長(zhǎng),這世上最難降的妖魔是什么形庭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任铅辞,我火速辦了婚禮,結(jié)果婚禮上碘勉,老公的妹妹穿的比我還像新娘巷挥。我一直安慰自己,他們只是感情好验靡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布倍宾。 她就那樣靜靜地躺著雏节,像睡著了一般。 火紅的嫁衣襯著肌膚如雪高职。 梳的紋絲不亂的頭發(fā)上钩乍,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音怔锌,去河邊找鬼寥粹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛埃元,可吹牛的內(nèi)容都是我干的涝涤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼岛杀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阔拳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起类嗤,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤糊肠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后遗锣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體货裹,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年精偿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弧圆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡还最,死狀恐怖墓阀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拓轻,我是刑警寧澤斯撮,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站扶叉,受9級(jí)特大地震影響勿锅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枣氧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一溢十、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧达吞,春花似錦张弛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寺董。三九已至,卻和暖如春刻剥,著一層夾襖步出監(jiān)牢的瞬間遮咖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工造虏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留御吞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓漓藕,卻偏偏與公主長(zhǎng)得像陶珠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撵术,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容