歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Unix & Linux筆記(13)

第22章 vi文本編輯器


22.1 vi重要的原因

kedit gedit Pico Nano

POSIX / Single Unix Specification


22.2 vi歷史簡介

ed em en ex vi


22.3 Vim:vi的備用編輯器


22.4 啟動vi

^G 顯示文件名稱

22.5 啟動Vim:vim

vim -C [ -rR ] [ file… ]

    -C compatibility mode

22.6 命令模式和輸入模式

編輯緩沖區 editing buffer

Ctrl Shift Return Esc

命令模式 command mode 輸入模式 input mode

22.7 了解所處模式的方式

:set showmode

22.8 以只讀方式啟動vi:viewvi –R

-R Read-only

22.9 系統失敗後的數據恢復

vi -r test.c
   -r recover

交換文件 swap file .test.c.swp
編輯完成後刪除交換文件。


22.10 停止vi

!字符有時候用來表示忽略某些類型的檢查。


22.11 vi使用屏幕的方式

插入控制字符 ^V,後面跟希望輸入的控制字符
制表符(8個空格) ^I


22.12 使用viex命令

vi命令 單字母或雙字母,無需return鍵:w,dd ex命令 以冒號開頭,按徹底取消命令,特殊鍵糾正命令 鍵 作用 刪除鍵入的最後一個字符 ^W 刪除鍵入的最後一個單詞 ^X/^U 刪除整行

22.13 學習vi命令的策略

移動光標的命令 進行輸入模式的命令 進行修改的命令

22.14 創建一個練習文件


22.15 移動光標

- 將光標移動到上一行的開頭
+/ 將光標移動到下一行的開頭

0 當前行的開頭
$ 當前行的末尾
^ 當前行的第一個非空格/制表符的字符上

w 下一個單詞詞首
e 下一個單詞詞尾
b 上一個單詞詞首
大寫忽略標點符號

) ——> 下一個句子
( <—— 上一個句子
} 下一個段落
{ 上一個段落

句子 的定義是一個字符串,以句號、逗號、問號或者感歎號結尾,後面至少跟兩個空格或者一個新行字符。 段落 的定義為一個空白行開頭並以一個空白行結束的一塊文本區域。在行首放一個制表符來標志一個新段落是不夠的。

22.16 在編輯緩沖區中移動

^F forward
^B backward
^D down 向下移動半屏
^U up 向上移動半屏

n ^D/D 設置跳轉行數


22.17 跳轉到前一位置

“ 連續鍵入兩個反引號 返回前一位置 ” 連續鍵入兩個單引號返回前一位置的行首

以不可見的名稱標記任意行
鍵入m,後面跟一個字母,該字母就是這一行的名稱。跳轉到這一行可以鍵入一個反引號或一個單引號,後面跟這一行的名稱。


22.18 搜索模式

:/ :? n N

使用正則表達式

元字符 含義 . 匹配除新行字符之外的任意單個字符(相當於^ 錨:匹配行的開頭 $ 錨:匹配行的末尾 \< 錨:匹配單詞的開頭 \> 錨:匹配單詞的末尾 [list] 字符類:匹配list中的任何字符 [^list] 字符類:匹配不在list中的任何字符 \ 引用:從字面上解析元字符
/M . .
/M[a-z][a-z]
/H[a-z]*y

22.19 使用行號

nG 跳轉到第nvi
1G 跳轉到第1vi
gg 跳轉到第1vi
G 跳轉到最後一行 vi

:n 跳轉到第nex
:1 跳轉到第1ex
:$跳轉到最後一行 ex


22.20 插入文本

都改變到輸入模式:
i = insert a = append

i 光標位置之前
a 光標位置之後
I 當前行開頭
A 當前行末尾
o 當前行下面
O 當前行上面

特殊鍵依然可以使用,不必離開輸入模式。
^V^H 控制字符只算一個字符。


22.21 修改文本

r 精確修改一個字符(不進入輸入模式)
R 改寫,鍵入的每一個字符都覆蓋當前行上的一個字符 R替換文本時,vi不會離開當前行,字符超過行尾,只是在這一行的末尾追加額外的字符
s 使用多個字符替換一個字符(**substitute)
C 替換從當前光標到行末的所有字符(change
cc 替換一整行
S 替換一整行
cmove 以插入方式從當前光標替換到move所給出的位置


22.22 替換文本(ex

命令 作用 :s/pattern/replace/ 都是ex命令,substitute :s/UNIX/Linux 替換當前行上該模式的第一個匹配項 :s/UNIX/Linux/gc g=global, c=confirm :sUNIX//g 刪除模式 :57s/UNIX/Linux/ 替換特定行 :57,63s/UNIX/Linux/ 替換指定范圍的行 :.,$s/UNIX/Linux .代表當前行,$代表最後一行 :%s/UNIX/Linux/cg %代表所有行

22.23 刪除文本

vi命令:

`x`         刪除光標處的字符
`X`         刪除光標左邊的字符
`D`         刪除光標到行末的字符
`dmove`     刪除光標到`move`所給位置處的字符
`dd`        刪除當前行

dc類似

ex命令:
:lined 刪除指定行
:line,lined 刪除指定范圍的行


22.24 撤銷或重復改變

u 撤銷上一命令對編輯緩沖區的修改
U 恢復當前行
. 重復上一命令對編輯緩沖區的修改


22.25 恢復刪除

編號緩沖區 number buffer(只存儲刪除的行)

vi中一共有9個這樣的緩沖區,分別編號為19。將一個編號緩沖區中的內容插入到編輯緩沖區中,鍵入一個”(雙引號),後面跟著一個pPput,與o類似)命令。

"1p "2p "1pu.u.u.u.u

在撤消了第一次插入之後,如果使用.(點號)命令重復插入,那麼vi將自動地將緩沖區編號加1


22.26 移動文本

無名緩沖區 unnamed buffer

p 無名緩沖區的內容插入到光標的右邊
P 無名緩沖區的內容插入到光標的左邊

xp 調換兩個字符
deep 調換兩個單詞(光標開始處於第一個單詞的左邊)
ddp 調換兩行


22.27 復制文本

使用yyyY命令將文本由編輯緩沖區復制到無名緩沖區; 將光標移動到希望插入文本的位置; 使用pP執行插入。

在不刪除文本的情況下將文本復制到無名緩沖區時,稱之為接出(yank)了文本。

符號 作用 yw 接出了1個單詞 y10w 接出了10個單詞 y10W 接出了10個單詞(忽略標點符號) yb 接出了1個單詞 y2( 接出了2個句子 y5} 接出了5個段落 yy 接出110yy 接出10y0 接出了從當前字符到這一行開頭之間的文本 y$ 接出了從當前字符到這一行末尾之間的文本

Y = yy yd類似,yydd類似,YD完全不同。


22.28 改變字母的大小寫

~命令改變字母的大小寫,然後光標向右移動一個位置。(大范圍內連續使用~時安全的)
對於有些vi來說,~命令不會越過一行的末尾。我的vim –C就是如此。


22.29 設置選項

第一種類型的選項是開關(switch:set showmode noshowmode

第二種類型的選項是變量(variable:set tabstop=4

開關 縮寫 默認值 含義 autoindent ai off 和shift width有關,縮進以匹配上一行/下一行 autowrite aw off 如果文本已經修改,則在切換文件前保存 errorbells eb off 當現實錯誤消息時發出嘀嘀聲 exec ex off 在當前目錄中查找初始化文件 ignorecase ic off 在搜索過程中忽略大小寫 list — off 將制表符顯示為 ^I,將行的結束顯示為$ number nu off 顯示行號 readonly ro off 不允許修改編輯緩沖區的內容 showmatch sm off 輸入模式:顯示匹配的(){}[] shownmode smd off 當進入輸入模式時顯示一個提醒 wrapscan ws off 在搜索過程中,環繞到文本的開頭/ 末尾繼續搜索 writeany wa off 允許不需要重載!就可以寫入任何文件

 

變量 縮寫 默認值 含義 lines - 24 文本的行數 shiftwidth sw 8 autoindent使用的空格數 tabstop ts `8 制表符間距 wrapmargin wm 0 設置自動換行時的頁邊距

22.30 顯示選項

:set [ option [?]… | all ]

顯示所有選項的值 :set all
顯示一個選項的值 :set number?
顯示改變了默認值的選項 :set (讀取初始化文件改變)


22.31 在鍵入過程中自動換行

:set wrapmargin=?
:set wm=?

22.32 分隔與連接行

將光標移到單詞後的空格處,然後鍵入rr命令使用新行字符取代空格,從而將行分隔。
將光標移動到第一行,並鍵入J(大寫字母J)將把當前行與下一行合並成一個長行,可以在J命令之前放置一個重復次數。


22.33 復制與移動行(ex

在所有的ex命令中,.(點號)代表當前行,$代表編輯緩沖區中的最後一行,0代表編輯緩沖區的開頭。

:x [ , y ] co z
:x [ , y ] m z

在命令名稱前面指定一個單獨的行號或一個行號范圍,這就是要移動的或復制的行。在命令名稱之後,可以指定目標行號,新行將插入到目標行的下面。

:5co10 復制第5行到第10行下面
:4,8m20 移動第4至第8行插入到第20行的下面

交換緩沖區的上下兩部分

:1 , . m $ : . , $ m 0

22.34 輸入shell命令

`:!command`         暫停`vi`,執行`shell`命令
`:!!`               暫停`vi`,執行最近一條命令
`:sh`               暫停`vi`,啟動默認`shell`
`:!bash`            暫停`vi`,啟動`bash`
`:!tcsh`            暫停`vi`,啟動`tcsh`

22.35 將文件中的數據插入到編輯緩沖區中

:[ line ] r file
: r 命令讀取文件的內容,並將該內容插入到編輯緩沖區中指定行之後。
:10 r info 
:0 r info 
:$ r info

如果省略了行號,vi將把數據插入到當前行之後。


22.36 將shell命令的輸出插入到編輯緩沖區

:r有一種特別有用的變體。如果在:r命令之後不是鍵入文件的名稱,而是鍵入一份!(感歎號),後面跟一個程序的名稱,那麼vi將執行該程序,並將程序的輸出輸入插入到編輯緩沖區中。

:r !ls
:0r !date
:line r file        在指定行後面插入文件file的內容
:r file             在當前行後插入文件file的內容
:line r !program    在指定行後插入程序program的輸出
:r !program         在當前行後插入程序program的輸出

22.37 使用程序處理數據:fmt

使用!!!命令將把編輯緩沖區中的行發送給另一個程序,該程序的輸出將替換原始行。

n!!program 在n個行上執行程序program
!move program 從當前行至move行執行程序program

將光標移到到希望處理的開始位置,鍵入希望處理的行數,後面跟!!(兩個感歎號)以及程序的名稱,再後跟鍵。

5!!sort 10!!fmt

!(單感歎號)命令的工作方式與此相似,只是在!命令在指定輸入行的范圍時更具有靈活性。

!}fmt

格式化整個編輯緩沖區

gg
!Gfmt

22.38 將數據寫入文件

ex命令w,允許在不退出vi的情況下,不時地備份數據。

`:w`            將數據寫入原始文
`:w file`       將數據寫入到一個新文件中
`:w! file`      覆蓋一個已有的文件
`:w>>file`      將數據追加到指定的文件中

只保存編輯緩沖區中的特定行,則可以采用通常的方法指定行號。例如,為了將第10行寫入到文件save中(替換save的內容),可以輸入:

:10w! save

為了將第10行至第20行追加到save中,可以使用:

:10,20w>>save
:wq == +ZZ` 

22.39 切換到一個新文件

當開始編輯一個新文件時,編輯緩沖區中的原有內容將會丟失,所以要確保首先使用:w命令將數據保存。

`:e file`           編輯指定的文件
`:e!`               重新編輯當前文件,忽略自動檢查
`:e! file`          編輯指定的文件,忽略自動檢查

22.40 使用縮寫

為經常使用的單詞或表達式創建縮寫,使用:ababbreviate,縮寫)命令。

:ab [ sort long ]
:ab eg exception gifted

只有eg是一個單詞的時候才會進行替換,vi不會替換其他單詞中的eg,例如egotistical

刪除縮寫:unaun-abbreviate,反縮寫)

:un short

通過輸入:ab命令本身查看所有的縮寫列表。


22.41 宏(macro

允許創建自己的單字符命令,這些命令稱之為宏(macro)。(宏就是微型程序。)

:map [ x commands ]

x是一個字符,commandsviex命令序列。

:map命令可以創建宏,即viex命令序列的縮寫。宏名稱必須是單個字符。如果選擇早已擁有含義的字符作為命令,那麼原有含義將會丟失。

例如:map K deep :map X dd

存在命令覆蓋問題。

vi:比較適合作為宏名稱的字符

| 字母 | g K q v V Z|
|標點符號 | @ # * \|
|Ctrl字符 | ^A ^K ^O ^W ^X|

Vim:比較適合作為宏名稱的字符
|字母 | K q v V|
|標點符號 | @ \|
|Ctrl字符| ^@ ^A ^K ^O ^T ^X|

例:

:map * I/*^VA*/^V

I在行頭進入輸入模式。然後鍵入/*,後面跟一個空格。此時,按退出輸入模式。為了在宏中插入一個碼,我們鍵入^V^V[Ctrl
+
V
]告訴vi接下來的鍵要從字面上解釋)。Aappend,追加)命令在行的末尾進入輸入模式。然後鍵入一個空格,後面跟著*/。退出輸入模式,再次使用

將宏賦給的功能鍵。

:map #1 :set all

顯示所有的宏列表:

:map

移除宏:

:unmap x x是宏的名稱

22.42 初始化文件:.exrc.vimrc

vi .exrc dot-E-X-R-C
vim .vimrc dot-vim-R-C

rc run commands

vi/Vim初始化文件樣本

"==================================================
"  Simple vi/Vim initialization file
"==================================================
"
"1.Option
set autoindent
set compatible
set showmatch
set showmode
set wrapmargin=6
"
"2.Abbreviations
ab eg exceptionally gifted
ab h   Harley
"3.Maxros
map  K  deep
map  X  dd
map  g  1G
map  #5 {!}fmt^M
"4.shell commands
!date;sleep 2

22.43 使用兩個初始化文件

一旦啟動,vi即在/home中查找初始化文件,執行初始化文件中的命令後,vi將查看exec選項。如果選項是打開的,vi即在當前目錄中查找第二個初始化文件。


22.44 學習使用Vim

vimtutor

Copyright © Linux教程網 All Rights Reserved