自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

大話Emacs Shell Mode:讓工作更輕松的技巧

系統(tǒng) Linux
在 GNU Emacs 里面運(yùn)行 Shell 有很多種不同的方法。包括各種各樣的終端模擬。但是在作者的工作當(dāng)中更多的使用的是 Shell-mode 的方式。在這種方式下,可以最大限度的利用 GNU Emacs 所具有的各種神奇能力,讓日常工作變得前所未有的輕松、有趣。

 GNU Emacs 有很多“神奇”的功能。常言說“每一個(gè) hacker 都有一個(gè)自己的 GNU Emacs”。這個(gè)事實(shí)在很大程度上得益于人們能夠按照完全自我的方式去使用 GNU Emacs。將 Shell 運(yùn)行在 GNU Emacs 里面就是眾多的用法之一。 在 GNU Emacs 里面運(yùn)行 Shell 有很多種不同的方法。包括各種各樣的終端模擬。但是在筆者的工作當(dāng)中更多的使用的是 Shell-mode 的方式。在這種方式下,可以最大限度的利用 GNU Emacs 所具有的各種神奇能力,讓日常工作變得前所未有的輕松、有趣。

第一回 引子

GNU Emacs 是一個(gè)非常強(qiáng)大的編輯器,這個(gè)編輯器不僅可以用來寫文章,寫程序,更重要的是, 他可以和一些原本看似沒有明顯關(guān)系的應(yīng)用程序在一起,合作創(chuàng)造出一些新的“不可思議”的應(yīng)用。比如說可以在 GNU Emacs 里面運(yùn)行你的 Shell。

通常來說人們在 Linux 或者 Unix 上面工作的時(shí)候,不論是在本機(jī)工作,還是登錄到地球另一頭的遠(yuǎn)端機(jī)器,都是使用各種各樣的終端或者終端模擬器來運(yùn)行 Shell。最常見的例如 xterm,rxvt,以及 Putty 之類的終端模擬器。與此對應(yīng),GNU Emacs 也有自己的終端模擬器,例如 ansi-term,multi-term 等等。這些終端模式,使得你可以像在在其他終端當(dāng)中一樣工作,甚至可以在 Emacs 的終端里面運(yùn)行 Vim。

但是,今天要和大家分享的是另外一種使用方式—— Shell mode。這是一種完全不同的工作方式。這種方式和大家常用的工作方式最大的一個(gè)區(qū)別,就是在這里完全沒有任何 terminal 的存在。用戶實(shí)際上是工作在一個(gè) Emacs 的文本緩沖區(qū)里面,并不直接和 Shell 進(jìn)行交互。一切的命令輸入都是寫入到這個(gè)文本緩沖區(qū)當(dāng)中,經(jīng)由 comint.el從緩沖區(qū)中讀取,然后轉(zhuǎn)交給后臺的 Shell 進(jìn)程。Shell 產(chǎn)生的輸出再由 comint.el進(jìn)行收集,然后寫入到用戶所用的這個(gè)緩沖區(qū)當(dāng)中來。這個(gè)緩沖區(qū)在 Emacs 當(dāng)中叫做 Shell 緩沖區(qū) (Shell buffer)。

啟動(dòng)一個(gè) Shell 緩沖區(qū)并且進(jìn)入 shell mode 的過程非常簡單。只需要在 Emacs 當(dāng)中按下 Meta-x 組合鍵(在現(xiàn)在的鍵盤上通常是 Alt-x 組合鍵),然后輸入命令 shell 并回車,Emacs 就會(huì)啟動(dòng)一個(gè) Shell 進(jìn)程并且打開一個(gè)與之關(guān)聯(lián)的 Shell 緩沖區(qū)。Shell 緩沖區(qū) 的名字通常會(huì)是 *shell*。具體啟動(dòng)什么樣的 Shell 進(jìn)程 通過 Emacs 配置文件里的 shell-file-name 變量指定,或者由用戶的環(huán)境變量 SHELL 或 EMACSSHEL 來指定。通常的寫法是

(setq shell-file-name "/bin/bash")

或者

export EMACSSHELL=/usr/bin/zsh

另外如果你希望使用一個(gè)支持 ANSI color 的 Shell 進(jìn)程,那么最好在你的 Emacs 配置文件里面加入下面兩行,以便在執(zhí)行 ls – color=auto 命令的時(shí)候輸出的色彩信息能夠被 Emacs 正確解析。

(autoload 'ansi-color-for-comint-mode-on "ansi-color" nil t)
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on t)

說了這么多了,這種工作方式究竟能有什么好處呢?我為什么要離開熟悉的 Xterm,把我的 Shell 搬到 Emacs 當(dāng)中來呢?#p#

第二回 初識 Shell mode -- 窗口篇

下面我們就來談?wù)労锰帯J聦?shí)上不僅僅是好處,在相當(dāng)程度上甚至是不可替代性。

第一個(gè)明顯的好處就是多窗口的工作模式。

通常在人們的工作當(dāng)中都會(huì)打開多個(gè)終端,同時(shí)進(jìn)行幾份工作。在這個(gè)時(shí)候就需要對這些終端窗口進(jìn)行排列和管理(在這里假設(shè)你工作在圖形化環(huán)境之下)。而且通常需要頻繁的使用鼠標(biāo)在不同的窗口之間切換焦點(diǎn)。為了避免窗口之間相互遮蓋,你也許會(huì)通過精心編輯的 .Xdefaults文件使得兩個(gè)或四個(gè)終端窗口恰到好處的平鋪在整個(gè)屏幕當(dāng)中。但是仍然需要使用鼠標(biāo)在不同的窗口進(jìn)行切換,在不同的窗口之間復(fù)制粘貼信息……這些窗口維護(hù)的工作在任務(wù)繁忙的時(shí)候會(huì)很繁重。并且如果這時(shí)候需要的不止 4 個(gè)窗口,或者你還需要進(jìn)行額外的文字編輯的工作……最終窗口還是會(huì)要么被覆蓋起來,要么被擠到別的虛擬桌面。

在這種時(shí)候最好來試試 GNU Emacs。GNU Emacs 天生具有完善的窗口管理功能,并且完全不依賴于 X Window。這是因?yàn)?GNU Emacs 的誕生要遠(yuǎn)遠(yuǎn)早于 X Window 的歷史。在 GNU Emacs 里面你只需要按下 Ctrl-x 2 組合鍵就可以把當(dāng)前窗口切分成上下兩個(gè)等分的窗口,

+----------------------+
| |
| |
+----------------------+
| |
| |
+----------------------+

按下 Ctrl-x 3組合鍵又可以把當(dāng)前窗口切分成左右兩個(gè)等分的窗口。這些切分可以一直進(jìn)行下去。

+----------+-----------+
| | |
| | |
+----------+-----------+
| |
| |
+----------------------+

輸入 Ctrl-x 0可以關(guān)閉當(dāng)前光標(biāo)所在的窗口。

+----------------------+
| |
| |
+----------------------+
| |
| |
+----------------------+

輸入 Ctrl-x 1組合鍵則可以關(guān)閉其他所有窗口,并使當(dāng)前光標(biāo)所在的窗口成為最大的窗口。

+----------------------+
| |
| |
| |
| |
| |
+----------------------+

當(dāng)你使用兩個(gè)或以上的窗口的時(shí)候,可以使用 Ctrl-x o(注意是小寫字母 o)組合鍵在各個(gè)窗口進(jìn)行移動(dòng)。通過給 Ctrl-x o組合鍵加上數(shù)字前綴,例如 Ctrl-u 3 Ctr-x o 或者更加簡潔的 Meta-3 Ctrl-x o 就可以在多個(gè)窗口之間快速的移動(dòng)。

當(dāng)然,當(dāng)你啟動(dòng)了太多各種緩沖區(qū)的時(shí)候,總歸是要把其中的一些覆蓋掉的。因?yàn)楸WC工作窗口具有足夠的可視面積才是真正有意義的事。在這種時(shí)候可以通過 Ctrl-x b 組合鍵在所有緩沖區(qū)之間方便的切換。或者通過 Ctrl-x Ctrl-b 組合鍵得到所有緩沖區(qū)的列表。

這種緩沖區(qū)的切換和 X Window 窗口或者虛擬桌面之間的切換最大的不同在于——如果你有 任意兩個(gè)或者多個(gè)緩沖區(qū)的工作需要相互參照(這樣的需要會(huì)非常常見),甚至就是信息的復(fù)制粘貼,這個(gè)時(shí)候相關(guān)的工作窗口最好能分布在同一個(gè)屏幕上。在 GNU Emacs 當(dāng)中你將很容易把這些需要參照的緩沖區(qū)切換到同一個(gè)屏幕的窗口當(dāng)中去。而在圖形終端的工作方式下,這些需要參照的窗口常常要么恰好是相互覆蓋的,要么恰好是處在不同的虛擬桌面之中,頻繁的拖拽移動(dòng)將會(huì)變得非常繁瑣。

還有一種情況,由于工作的原因恰好需要對同一個(gè) Shell 進(jìn)程當(dāng)中的內(nèi)容進(jìn)行上下文參照……通常絕大多數(shù)終端都不提供這種功能。但是在 Emacs 里面,同一個(gè)緩沖區(qū)顯示在兩個(gè)獨(dú)立的窗口里面完全不成問題。

另外如果你很喜歡多個(gè)虛擬桌面的工作方式,可以使用 make-frame 命令生成多個(gè) frame( 也許可以叫做“窗框”),把他們放到多個(gè)虛擬桌面當(dāng)中去。而且即使是在這種情況下,仍然可以使用 Ctrl-x b 組合鍵在任何一個(gè) frame 中的任何一個(gè)窗口中切換到任何一個(gè)被遮蓋的緩沖區(qū)。不需要進(jìn)行任何 X Window 當(dāng)中的窗口移動(dòng)和桌面切換,包括進(jìn)行上下文參照。

技巧一

如何在 GNU Emacs 當(dāng)中啟動(dòng)多個(gè) Shell 進(jìn)程及其對應(yīng)的 Shell 緩沖區(qū)?

我在上文當(dāng)中提到了那么多的窗口,但是如果你在 minibuffer 當(dāng)中第二次輸入 Meta-x shell 命令,GNU Emacs 會(huì)把你帶到已經(jīng)存在的那個(gè)名叫 *shell* 的 Shell 緩沖區(qū),而不是創(chuàng)建一個(gè)新的。解決的方法非常簡單——你只需要使用 rename-buffer 命令為現(xiàn)有的 Shell 緩沖區(qū)重新安排一個(gè)名字,然后再執(zhí)行 shell 命令,GNU Emacs 就會(huì)為你創(chuàng)建一個(gè)新的名叫 *shell* 的 Shell 緩沖區(qū)了。因?yàn)檫@兩個(gè)命令在我的工作中用的非常頻繁,所以我把它們綁定到了兩個(gè)快捷鍵上面

(global-set-key (kbd "C-c z") 'shell)
(global-set-key (kbd "") 'rename-buffer)

技巧二

如何 undo 到我剛剛離開的窗口設(shè)置?

上文提到過,Ctrl-x 0, Ctrl-x 1, Ctrl-x 2, Ctrl-x 3 能夠快速的更改 GNU Emacs 的窗口設(shè)置,但是如果我在用過 Ctrl-x 1 之后希望能夠快速“退回”到“剛才”使用過的窗口設(shè)置,而不是把它再做一遍,有沒有辦法做呢?GNU Emacs 有一個(gè)叫做 winner-mode 的 minor mode 可以幫你完成這個(gè)愿望。

只需要在你的 Emacs 配置文件里面加入下面幾行

(when (fboundp 'winner-mode)
(winner-mode)
(windmove-default-keybindings))

然后就可以使用 Ctrl-c ← (對,就是向左的箭頭鍵)組合鍵,退回你的上一個(gè)窗口設(shè)置。#p#

第三回 甜蜜約會(huì) -- buffer 篇

上文描述了在 GNU Emacs 里面通過簡單的窗口管理優(yōu)化 Shell 工作的方法,是不是開始對 Shell 從終端里面搬到 Emacs 里面開始有了一點(diǎn)點(diǎn)的心動(dòng)了呢? 別著急,這還只是個(gè)開始,目前你看到的都還只是外表。接下來讓我們和 Emacs 來一個(gè)甜蜜的約會(huì)吧。

輸入

我在開頭的引子部分曾說過,在 Shell mode 中工作的時(shí)候,用戶實(shí)際上接觸的是一個(gè)文本緩沖區(qū),實(shí)際上并沒有直接的跟 Shell 進(jìn)程打任何交道。這也是和通常的終端模式的工作方法的一個(gè)非常大的區(qū)別。雖然這個(gè)區(qū)別看起來似乎不是那么顯著(那是因?yàn)檫@個(gè) Shell 緩沖區(qū)被設(shè)計(jì)成了看起來很像一個(gè)圖形終端的樣子),但是實(shí)際上這點(diǎn)區(qū)別將會(huì)帶來一些不可替代的優(yōu)勢。讓我們來先看一個(gè)簡單的例子:

讓我們在 Shell 提示符前輸入這樣一行命令

2 : 2037 : 13:04:40 : ~
dove@bash-4.1$ cd /usr/share/emacs
2 : 2038 : 13:05:05 : /usr/share/emacs
dove@bash-4.1$ ls -1
23.1
site-lisp
site-lisp.tar
2 : 2039 : 13:05:09 : /usr/share/emacs
dove@bash-4.1$

這個(gè)時(shí)候讓我們把光標(biāo)移動(dòng)到 23.1 的前面,輸入 ls -1加空格,

2 : 2037 : 13:04:40 : ~
dove@bash-4.1$ cd /usr/share/emacs
2 : 2038 : 13:05:05 : /usr/share/emacs
dove@bash-4.1$ ls -1
ls -1 23.1
site-lisp
site-lisp.tar
2 : 2039 : 13:05:09 : /usr/share/emacs
dove@bash-4.1$

然后回車。接下來就會(huì)看到這樣的輸出結(jié)果出現(xiàn)在緩沖區(qū)里面。

2 : 2040 : 13:08:55 : /usr/share/emacs
dove@bash-4.1$ ls -1 23.1
etc
leim
lisp
site-lisp
2 : 2041 : 13:09:06 : /usr/share/emacs
dove@bash-4.1$

這是一件很有意思的事情,因?yàn)槲覀儾]有像在終端當(dāng)中常見的那樣在 Shell 提示符的后面進(jìn)行命令輸入,而是在一個(gè)看起來非常隨意的地方。神奇的是他居然被正確地執(zhí)行了。事情的真相其實(shí)很簡單。

因?yàn)楝F(xiàn)在我們是在一個(gè)被稱作 Shell 緩沖區(qū)的文本緩沖區(qū)里面。這就是一個(gè)很普通的文本緩沖區(qū),它具有所有其他文本緩沖區(qū)所具有的一切特性。你可以在任何時(shí)候,任何位置,對這個(gè)緩沖區(qū)里的任何文本內(nèi)容進(jìn)行任何編輯。因?yàn)樗褪俏谋?。直到某一刻,你在其中一個(gè)文本行上面按下了回車,這時(shí) comint.el 就會(huì)負(fù)責(zé)把當(dāng)前光標(biāo)所在行的內(nèi)容提取出來,發(fā)送給 Shell 去執(zhí)行,然后將 Shell 執(zhí)行的結(jié)果以及 一個(gè)提示符(這個(gè)提示符實(shí)際上也是由 Shell 輸出給 comint.el 的)以文本的形式添加到這個(gè)緩沖區(qū)的末尾。

這個(gè)例子并不僅僅是列一個(gè)目錄那么簡單,事實(shí)上他提供了一個(gè)更加強(qiáng)大的工作方式 —— 曾經(jīng)只能用來閱讀的命令輸出現(xiàn)在也可以被用來構(gòu)造新的命令了。讓我們再來看一個(gè)新的例子,在這個(gè)例子中我們將把這種能力與 Bash 的歷史命令引用的能力結(jié)合起來

2 : 2044 : 15:16:17 : /usr/share/emacs/23.1
dove@bash-4.1$ ls -1
etc
leim
lisp
cd ../site-lisp && !!
2 : 2045 : 15:16:49 : /usr/share/emacs/23.1
dove@bash-4.1$ cd ../site-lisp && !!
cd ../site-lisp && ls -1
auctex
auctex.el
autoconf
autoconf-mode.el
autotest-mode.el
bashdb.el
bashdb.elc
bbdb

如果這時(shí)候我需要列出 auctex.el 文件的內(nèi)容,我只需要在在各文件名前面輸入 head,然后回車就行了

2 : 2045 : 15:16:49 : /usr/share/emacs/23.1
dove@bash-4.1$ cd ../site-lisp && !!
cd ../site-lisp && ls -1
auctex
head auctex.el
autoconf
autoconf-mode.el
autotest-mode.el
bashdb.el
bashdb.elc
bbdb
2 : 2046 : 15:17:16 : /usr/share/emacs/site-lisp
dove@bash-4.1$ head auctex.el
;;; auctex.el
;;
;; This can be used for starting up AUCTeX. The following somewhat
;; strange trick causes tex-site.el to be loaded in a way that can be
;; safely undone using (unload-feature 'tex-site).
;;
(autoload 'TeX-load-hack
(expand-file-name "tex-site.el" (file-name-directory load-file-name)))
(TeX-load-hack)
2 : 2047 : 15:23:53 : /usr/share/emacs/site-lisp
dove@bash-4.1$

這看起來已經(jīng)不太像是在運(yùn)行 Shell 了,倒象是在與某人合作編寫一篇巨大的文章了,而 Shell 就是你的合作者。如果你真這么想的話,那就非常好了。至少你已經(jīng)從枯燥乏味的日常工作當(dāng)中找到些許的樂趣了。

小技巧

如果你登錄在一臺遠(yuǎn)程機(jī)器上工作,cat 一個(gè)文件后,需要把這個(gè)文件的內(nèi)容保存到本地來,那么完全不需要啟動(dòng)一個(gè) FTP session 去下載這個(gè)文件。你只需要選中緩沖區(qū)里面的文件內(nèi)容,按下 Meta-x 組合鍵,輸入 write-region 命令就可以把選中的內(nèi)容保存在本地文件當(dāng)中。

原文:http://www.ibm.com/developerworks/cn/linux/l-cn-emacs-shell/index.html

【編輯推薦】

  1. Emacs和Vim:神的編輯器和編輯器之神
  2. Linux服務(wù)器安全初始化Shell腳本
  3. 省時(shí)省力 Shell小技巧一則
責(zé)任編輯:黃丹 來源: IBMDW
相關(guān)推薦

2011-07-20 10:18:41

EmacsShell

2022-11-07 16:25:07

JavaScript技巧

2011-04-02 10:13:36

Linux系統(tǒng)管理

2023-06-29 15:08:21

JavaScrip開發(fā)

2023-07-04 13:35:00

Monorepos工具管理

2010-12-23 15:55:00

上網(wǎng)行為管理

2018-09-20 18:23:49

人工智能AI

2024-09-18 15:58:05

2023-07-24 16:53:14

人工智能工作量翻倍

2015-11-05 08:59:19

編程Visual Stud擴(kuò)展

2019-06-17 08:50:49

Emacs shell命令Windows

2024-10-11 13:17:16

Linux命令行快捷導(dǎo)航

2016-11-14 10:23:08

Hadoop工具大數(shù)據(jù)數(shù)據(jù)倉庫

2020-11-29 17:32:01

EmacsLinux

2019-12-23 10:07:45

邊緣計(jì)算5G云計(jì)算

2025-03-18 14:33:14

2014-08-08 12:16:43

凌云App建站

2020-06-28 16:07:03

HomebrewMacLinux

2012-09-24 10:14:46

Linux系統(tǒng)管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號