成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

第一回 引子

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

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

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

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

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

或者

export EMACSSHELL=/usr/bin/zsh

另外如果你希望使用一個支持 ANSI color 的 Shell 進程,那么最好在你的 Emacs 配置文件里面加入下面兩行,以便在執行 ls – color=auto 命令的時候輸出的色彩信息能夠被 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 當中來呢?#p#

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

下面我們就來談談好處。事實上不僅僅是好處,在相當程度上甚至是不可替代性。

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

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

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

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

按下 Ctrl-x 3組合鍵又可以把當前窗口切分成左右兩個等分的窗口。這些切分可以一直進行下去。

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

輸入 Ctrl-x 0可以關閉當前光標所在的窗口。

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

輸入 Ctrl-x 1組合鍵則可以關閉其他所有窗口,并使當前光標所在的窗口成為最大的窗口。

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

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

當然,當你啟動了太多各種緩沖區的時候,總歸是要把其中的一些覆蓋掉的。因為保證工作窗口具有足夠的可視面積才是真正有意義的事。在這種時候可以通過 Ctrl-x b 組合鍵在所有緩沖區之間方便的切換?;蛘咄ㄟ^ Ctrl-x Ctrl-b 組合鍵得到所有緩沖區的列表。

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

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

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

技巧一

如何在 GNU Emacs 當中啟動多個 Shell 進程及其對應的 Shell 緩沖區?

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

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

技巧二

如何 undo 到我剛剛離開的窗口設置?

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

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

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

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

第三回 甜蜜約會 -- buffer 篇

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

輸入

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

讓我們在 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$

這個時候讓我們把光標移動到 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$

然后回車。接下來就會看到這樣的輸出結果出現在緩沖區里面。

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$

這是一件很有意思的事情,因為我們并沒有像在終端當中常見的那樣在 Shell 提示符的后面進行命令輸入,而是在一個看起來非常隨意的地方。神奇的是他居然被正確地執行了。事情的真相其實很簡單。

因為現在我們是在一個被稱作 Shell 緩沖區的文本緩沖區里面。這就是一個很普通的文本緩沖區,它具有所有其他文本緩沖區所具有的一切特性。你可以在任何時候,任何位置,對這個緩沖區里的任何文本內容進行任何編輯。因為他就是文本。直到某一刻,你在其中一個文本行上面按下了回車,這時 comint.el 就會負責把當前光標所在行的內容提取出來,發送給 Shell 去執行,然后將 Shell 執行的結果以及 一個提示符(這個提示符實際上也是由 Shell 輸出給 comint.el 的)以文本的形式添加到這個緩沖區的末尾。

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

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

如果這時候我需要列出 auctex.el 文件的內容,我只需要在在各文件名前面輸入 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$

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

小技巧

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

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

【編輯推薦】

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

2011-07-20 10:18:41

EmacsShell

2022-11-07 16:25:07

JavaScript技巧

2011-04-02 10:13:36

Linux系統管理

2023-06-29 15:08:21

JavaScrip開發

2023-07-04 13:35:00

Monorepos工具管理

2010-12-23 15:55:00

上網行為管理

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擴展

2016-11-14 10:23:08

Hadoop工具大數據數據倉庫

2024-10-11 13:17:16

Linux命令行快捷導航

2025-03-18 14:33:14

2019-06-17 08:50:49

Emacs shell命令Windows

2019-12-23 10:07:45

邊緣計算5G云計算

2020-11-29 17:32:01

EmacsLinux

2020-06-28 16:07:03

HomebrewMacLinux

2014-08-08 12:16:43

凌云App建站

2012-09-24 10:14:46

Linux系統管理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区在线观看视频 | 天天天操 | 在线国产欧美 | 精品日韩一区 | 亚洲精品一二三 | 欧美成人a∨高清免费观看 欧美日韩中 | 一级电影免费看 | 久久久久1 | 精品免费国产视频 | 成人在线观看免费视频 | 精品一区二区电影 | 一级做a爰片久久毛片免费看 | 啪一啪在线视频 | 精品久久久久久亚洲综合网站 | 一区二区三区免费在线观看 | 久久成人精品视频 | 国产伦精品一区二区三区高清 | 婷婷99 | 九色视频网站 | 2020国产在线| 亚洲精品v | 国产高清视频在线 | 黑人久久久 | 九九综合九九 | 亚洲视频在线播放 | 黑人性hd | 婷婷综合网 | 精精国产xxxx视频在线播放 | 亚洲精品一区二区三区在线观看 | 第一区在线观看免费国语入口 | 色伊人网 | 欧美999| 激情六月丁香 | 日本xx视频免费观看 | 狠狠干天天干 | 妖精视频一区二区三区 | 日韩精品一区二区三区视频播放 | 亚洲精品www久久久久久广东 | 亚洲精品一区二区在线 | 中国三级黄色录像 | 91亚洲视频在线 |