天天看點

RHEL6基礎之九vim編輯器、中文亂碼

Linux系統中修改配置檔案通過vi編輯器來實作,vi編輯器就相當于Windows系統中的WORD+記事本;vim是vi編輯器的增強版本,在vi編輯器的基礎上擴充了很多實用的功能,但是習慣上也将vim稱作vi。

vim格式:

vim file_name

如果指定的檔案不存在,那麼vim指令會建立檔案并進入編輯狀态,如果檔案存在,則進入編輯狀态對其進行編輯

一、vim編輯器的工作模式

二、指令模式的操作

1、光标移動

指令模式下移動光标

h或向左方向鍵

光标向左移動一個字元

j或者向下方向鍵

光标向下移動一個字元

K或者向上方向鍵

光标向上移動一個字元

l或者向右方向鍵

光标向右移動一個字元

Ctrl + f 或者pageUP鍵

螢幕向前移動一頁

Ctrl + b 或者pageDOWN鍵

螢幕向後移動一頁

Ctrl + d

螢幕向前移動半頁

Ctrl + u

螢幕向後移動半頁

+

光标移動到非空格符的下一列

-

光标移動到非空格符的上一列

n空格(n是數字)

按下數字n然後按空格,則光标向右移動n個字元,如果該行字元數小于n,則光标繼續從下行開始向右移動,一直到n

0(數字0)或者Shift+6

移動到本行行首

Shift+4

即’$’移動到本行行尾

H

光标移動到目前螢幕的最頂行

M

光标移動到目前螢幕的中央那一行

L

光标移動到目前螢幕的最底行

G

光标移動到文本的最末行

nG(n是數字)

移動到該文本的第n行

gg

移動帶該文本的首行

n回車(n是數字)

光标向下移動n行

指令模式下删除、複制粘貼

x,X

x為向後删除一個字元,X為向前删除一個字元

nx(n為數字)

向後删除n個字元

dd

剪切光标所在的那一行

ndd(n為數字)

删除光标所在的向下n行

d1G

删除光标所在行到第一行的所有資料

dG

删除光标所在行到末行的所有資料

yy

複制光标所在的那行

nyy

複制從光标所在行起向下n行

全部删除

ggyG

全部複制

ggvG或者ggVG

全選高亮顯示

p,P

p 資料粘貼到光标的下一行,P則粘貼到光标的上一行

y1G

複制光标所在行到第一行的所有資料

yG

複制光标所在行到末行的所有資料

J

講光标所在行與下一行的資料結合成同一行

u

還原過去的操作

進入輸入模式

i

在目前字元前插入字元

I

在目前行行首插入字元

a

在目前字元後插入字元

A

在目前行行末插入字元

o

在目前行下插入新的一行

O

在目前行上插入新的一行

r

替換光标所在的字元,隻替換一次

R

一直替換光标所在的字元,一直到按下ESC

使用x或Del鍵可以删除光标處的單個字元,#x可以删除#個字元。使用dd指令可以删除目前光标所在行,使用d^可以删除目前光标之前到行首的所有字元,使用d$删除目前光标處到行尾的所有字元。#dd删除#行,如4dd表示删除光标所在行,以及光标下面的3行。使用yy可以複制目前行整行的内容到剪貼闆,使用#yy可以複制從光标處開始的#行内容(其中#号用具體數字替換),按p鍵可将剪貼闆中的内容粘貼到光标位置處之後。為了便于檢視行間跳轉效果,可以先進入末行模式執行“:set nu”指令顯示行号,然後用“1G”或“gg”可以跳轉到第1行,使用“G”可以跳轉到最後一行,使用“3G”可以跳轉到第3行,“5G”跳轉到第5行等。按下“^”或數字“0”,可以将光标移動到所在行的行首。按下“$”或“End”鍵,可以将光标移動到所在行的行尾。按下“10→”,可以将光标向右移動10個字元;按下“10←”,可以将光标向左移動10個字元。

2、複制、粘貼、删除

<a href="http://blog.51cto.com/attachment/201309/152952291.png" target="_blank"></a>

3、撤銷編輯

<a href="http://blog.51cto.com/attachment/201309/155630616.png" target="_blank"></a>

按u鍵可以撤銷最近一次的操作,并恢複操作結果,按U鍵可以撤銷對目前行所做的所有編輯。

三、末行模式操作

在指令模式下按“:”可以切換到末行模式,vi編輯器的最後一行将顯示“:”提示符,使用者可以在該提示符後輸入特定的末行指令。

1、儲存退出vim編輯器

<a href="http://blog.51cto.com/attachment/201309/160740193.png" target="_blank"></a>

:w

将編輯過的文本儲存

:w!

若文本屬性為隻讀時,強制儲存

:q

退出vim

:q!

不管編輯或未編輯都不儲存退出

:wq

儲存,退出

:e!

将文檔還原成最原始狀态

ZZ

若文檔沒有改動,則不儲存離開,若文檔改動過,則儲存後離開,等同于:wq

:w [filename]

編輯後的文檔另存為filename

:r [filename]

在目前光标所在行的下面讀入filename文檔的内容

:set nu

在每行的行首顯示行号,永久顯示在~./vimrc(/etc/vimrc )末尾直接添加set nu儲存退出 

:set nonu

取消行号

n1,n2 w [filename]

将n1到n2的内容另存為filename這個文檔

:! command

暫時離開vim運作某個linux指令,例如 :! ls /home 暫時列出/home目錄下的檔案,然後會提示按回車回到vim

r!command  .!command

r!command将執行後的結果插入到光标目前行的下一行

.!command将光标目前行内容替換成執行後的結果

n1,n2!command

将n1-n2行内容指定給command進行處理,并替換n1-n2内容,例

:62,72 !sort,将62行到72行的内容進行排序

也可以以隻指定起始行,例如:62 !tr [a-z] [A-Z],将62行的小寫字母轉為大寫字母

也可以用.表示目前所在行,例如:. !tr [a-z] [A-Z],将目前行的小寫轉為大寫

n1.n2w!command

将n1-n2行的内容作為指令command的輸入。不會改變目前編輯的檔案的内

n,md

删除n行到m行間的行

2、檔案内容替換與查找

<a href="http://blog.51cto.com/attachment/201309/162839428.png" target="_blank"></a>

s表示替換,三根斜線中間是替換的樣式,指令中的三根斜線分隔符可以換成别的符号,例如?

/word

向光标之後尋找一個字元串名為word的字元串,當找到第一個word後,按”n”繼續搜後一個

?word

想光标之前尋找一個字元串名為word的字元串,當找到第一個word後,按”n”繼續搜前一個

:1,$s/word1/word2/g

從第一行到最末行,查找word1并替換成word2

:1,$s/word1/word2/gc

加上c的作用是,在替換前需要使用者确認

2、删除空行

在指令狀态下輸入::g/^\s*$/d

:g 代表在全文檔範圍内

^代表行的開始

\s*代表空白字元

&amp;代表行的結束

d代表删除用

//将3段代碼隔開

vi和vim顯示中文亂碼

在 Vim 中,有四個與編碼有關的選項,它們是:fileencodings、fileencoding、encoding 和 termencoding。在實際使用中,任何一個選項出現錯誤,都會導緻出現亂碼。

encoding 是 Vim 内部使用的字元編碼方式。當我們設定了 encoding 之後,Vim 内部所有的 buffer、寄存器、腳本中的字元串等,全都使用這個編碼。Vim 在工作的時候,如果編碼方式與它的内部編碼不一緻,它會先把編碼轉換成内部編碼。如果工作用的編碼中含有無法轉換為内部編碼的字元,在這些字元就會丢失。是以,在選擇 Vim 的内部編碼的時候,一定要使用一種表現能力足夠強的編碼,以免影響正常工作。

    由于 encoding 選項涉及到 Vim 中所有字元的内部表示,是以隻能在 Vim 啟動的時候設定一次。在 Vim 工作過程中修改encoding 會造成非常多的問題。如果沒有特别的理由,請始終将 encoding 設定為 utf-8。

termencoding 是 Vim 用于螢幕顯示的編碼,在顯示的時候,Vim 會把内部編碼轉換為螢幕編碼,再用于輸出。内部編碼中含有無法轉換為螢幕編碼的字元時,該字元會變成問号,但不會影響對它的編輯操作。如果 termencoding 沒有設定,則直接使用encoding 不進行轉換。

    舉個例子,當你在 Windows 下通過 telnet 登入 Linux 工作站時,由于 Windows 的 telnet 是 GBK 編碼的,而 Linux 下使用 UTF-8 編碼,你在 telnet 下的 Vim 中就會亂碼。此時有兩種消除亂碼的方式:一是把 Vim 的 encoding 改為 gbk,另一種方法是保持 encoding 為 utf-8,把 termencoding 改為 gbk,讓 Vim 在顯示的時候轉碼。顯然,使用前一種方法時,如果遇到編輯的檔案中含有 GBK 無法表示的字元時,這些字元就會丢失。但如果使用後一種方法,雖然由于終端所限,這些字元無法顯示,但在編輯過程中這些字元是不會丢失的。

    對于圖形界面下的 GVim,它的顯示不依賴 TERM,是以 termencoding 對于它沒有意義。在 GTK2 下的 GVim 中,termencoding 永遠是 utf-8,并且不能修改。而 Windows 下的 GVim 則忽略 termencoding 的存在。

fileencoding  當 Vim 從磁盤上讀取檔案的時候,會對檔案的編碼進行探測。如果檔案的編碼方式和 Vim 的内部編碼方式不同,Vim 就會對編碼進行轉換。轉換完畢後,Vim 會将 fileencoding 選項設定為檔案的編碼。當 Vim 存盤的時候,如果 encoding 和fileencoding 不一樣,Vim 就會進行編碼轉換。是以,通過打開檔案後設定 fileencoding,我們可以将檔案由一種編碼轉換為另一種編碼。但是,由前面的介紹可以看出,fileencoding 是在打開檔案的時候,由 Vim 進行探測後自動設定的。是以,如果出現亂碼,我們無法通過在打開檔案後重新設定 fileencoding 來糾正亂碼。

fileencodings 編碼的自動識别是通過設定 fileencodings 實作的,注意是複數形式。fileencodings 是一個用逗号分隔的清單,清單中的每一項是一種編碼的名稱。當我們打開檔案的時候,VIM 按順序使用 fileencodings 中的編碼進行嘗試解碼,如果成功的話,就使用該編碼方式進行解碼,并将 fileencoding 設定為這個值,如果失敗的話,就繼續試驗下一個編碼。

是以,我們在設定 fileencodings 的時候,一定要把要求嚴格的、當檔案不是這個編碼的時候更容易出現解碼失敗的編碼方式放在前面,把寬松的編碼方式放在後面。

例如,latin1 是一種非常寬松的編碼方式,任何一種編碼方式得到的文本,用 latin1 進行解碼,都不會發生解碼失敗——當然,解碼得到的結果自然也就是理所當然的“亂碼”。是以,如果你把 latin1 放到了 fileencodings 的第一位的話,打開任何中文檔案都是亂碼也就是理所當然的了。

在/etc/vimrc 和/etc/virc文末添加

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

set termencoding=utf-8

set fileencoding=utf-8

set encoding=utf-8

ucs-bom 是一種非常嚴格的編碼,非該編碼的檔案幾乎沒有可能被誤判為 ucs-bom,是以放在第一位。

utf-8 也相當嚴格,除了很短的檔案外(例如許多人津津樂道的 GBK 編碼的“聯通”被誤判為 UTF-8 編碼的經典錯誤),現實生活中一般檔案是幾乎不可能被誤判的,是以放在第二位。

cp936 和 gb18030,這兩種編碼相對寬松,如果放前面的話,會出現大量誤判,是以就讓它們靠後一些。cp936 的編碼空間比 gb18030 小,是以把 cp936 放在 gb18030 前面。

big5、euc-jp 和 euc-kr,它們的嚴格程度和 cp936 差不多,把它們放在後面,在編輯這些編碼的檔案的時候必然出現大量誤判,但這是 Vim 内置編碼探測機制沒有辦法解決的事。由于中國使用者很少有機會編輯這些編碼的檔案,是以我們還是決定把 cp936 和 gb18030 前提以保證這些編碼的識别。

latin1它是一種極其寬松的編碼,以至于我們不得不把它放在最後一位。不過可惜的是,當你碰到一個真的 latin1 編碼的檔案時,絕大部分情況下,它沒有機會 fall-back 到 latin1,往往在前面的編碼中就被誤判了。不過,正如前面所說的,中國使用者沒有太多機會接觸這樣的檔案。

如果編碼被誤判了,解碼後的結果就無法被人類識别,于是我們就說,這個檔案亂碼了。此時,如果你知道這個檔案的正确編碼的話,可以在打開檔案的時候使用 ++enc=encoding 的方式來打開檔案,如:

:e ++enc=utf-8 myfile.txt

檢視目前系統語言

<a href="https://s1.51cto.com/wyfs02/M00/8F/AD/wKiom1jo30XBm_sLAAAccOsqdQU269.jpg" target="_blank"></a>

看安裝的語言包

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<code>[root@localhost ~]</code><code># locale   如有zh cn 表示已經安裝了中文語言</code>

<code>LANG=en_US.UTF-8</code>

<code>LC_CTYPE=</code><code>"en_US.UTF-8"</code>

<code>LC_NUMERIC=</code><code>"en_US.UTF-8"</code>

<code>LC_TIME=</code><code>"en_US.UTF-8"</code>

<code>LC_COLLATE=</code><code>"en_US.UTF-8"</code>

<code>LC_MONETARY=</code><code>"en_US.UTF-8"</code>

<code>LC_MESSAGES=</code><code>"en_US.UTF-8"</code>

<code>LC_PAPER=</code><code>"en_US.UTF-8"</code>

<code>LC_NAME=</code><code>"en_US.UTF-8"</code>

<code>LC_ADDRESS=</code><code>"en_US.UTF-8"</code>

<code>LC_TELEPHONE=</code><code>"en_US.UTF-8"</code>

<code>LC_MEASUREMENT=</code><code>"en_US.UTF-8"</code>

<code>LC_IDENTIFICATION=</code><code>"en_US.UTF-8"</code>

<code>LC_ALL=</code>

<code>[root@localhost ~]</code><code># yum grouplist|grep -i chinese</code>

<code>   </code><code>Chinese Support [zh]</code>

<code>[root@localhost ~]</code><code># yum -y groupinstall "Chinese Support"</code>

<code>[root@localhost ~]</code><code>#</code>

如何修改系統語言為中文

1 臨時更換語言

<a href="https://s4.51cto.com/wyfs02/M00/8F/AC/wKioL1jo367jRGAFAABG1EoOxLo730.jpg" target="_blank"></a>

2 永久更換語言

<a href="https://s4.51cto.com/wyfs02/M01/8F/AD/wKiom1jo392SoR10AAA2znEb7lc363.jpg" target="_blank"></a>

<code>[root@localhost python]</code><code># vim /etc/virc   #vim /etc/vimrc</code>

<code>set</code> <code>fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1</code>

<code>set</code> <code>termencoding=utf-8</code>

<code>set</code> <code>fileencoding=utf-8</code>

<code>set</code> <code>encoding=utf-8</code>

<code>[root@localhost python]</code><code># source /etc/virc  #source /etc/vimrc</code>

重新連接配接即可正常顯示中文,如果按照以上方法設定修改設定中文語言還是不行的話,注意您的連結終端選擇的編碼。如xshell為例,把終端的編碼選擇中文,或者UTF8即可

本文轉自 justin_peng 51CTO部落格,原文連結:http://blog.51cto.com/ityunwei2017/1301507,如需轉載請自行聯系原作者

繼續閱讀