vim是一個(gè)功能非常強(qiáng)大的文本編輯器,它有超多的命令。本篇文章介紹vim的基本操作,參考該內(nèi)容可以讓你輕容入門(mén)vim編輯器,領(lǐng)略vim的powerful!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 1.1:vim光標(biāo)的移動(dòng)
使用vim編輯器時(shí),可以使用`h,j,k,l`來(lái)移動(dòng)光標(biāo)。
h:光標(biāo)左移;
l:光標(biāo)右移;
j:光標(biāo)下移;
k:光標(biāo)下移。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 1.2:退出vim
`:q! 回車`
在正常模式下,輸入冒號(hào)(:)會(huì)進(jìn)入到命令行模式下,q命令表示退出。
感嘆號(hào)(!)表示無(wú)論文本的修改是否被保存,都要退出。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 1.3:文本編輯 - 刪除
按鍵?x?用來(lái)刪除光標(biāo)所在位置的字符內(nèi)容。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 1.4:文本編輯 - 插入
在正常模式(Normal)下,按 i 鍵,進(jìn)入插入模式(Insert)。
在插入模式下,可以輸入文本內(nèi)容到光標(biāo)位置。
如果需要退出插入模式,返回到正常模式,需要按`<Esc>`按鍵。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lseeon 1.5:文本編輯 - 附加內(nèi)容
在正常模式(Normal)下,按 A 鍵,光標(biāo)會(huì)移動(dòng)至該行內(nèi)容末尾,并進(jìn)入插入模式(Insert)。
同樣,如果需要退出插入模式,則需要按`<Esc>`按鍵。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 1.6:編輯文件
使用` :wq `命令,保存文件并退出。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lseeon 1 小結(jié)
1. 光標(biāo)移動(dòng)。
h (←) j (↓)? ? ? k (↑) ? ? l (→)
? 2. 終端使用vim打開(kāi)一個(gè)文本:? vim FILENAME <ENTER>。
? 3. 退出vim: ? <ESC>? :q! <ENTER>? 放棄所有未保存的變更內(nèi)容。
? ?或者 輸入: ? <ESC>? :wq <ENTER>? 保存變更內(nèi)容并退出。
? 4. 刪除光標(biāo)位置的字符:? x
? 5. 插入或者扇入文本內(nèi)容:
i? 插入文本,在光標(biāo)之前插入文本內(nèi)容
A? 在本行結(jié)尾處插入內(nèi)容
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 2.1:刪除命令
` dw `命令可以刪除一個(gè)單詞。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 2.2:其他刪除命令
` d$ ` 可以刪除光標(biāo)位置到行末尾的內(nèi)容。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 2.3:操作命令和操作對(duì)象
大多數(shù)的命令對(duì)文本的操作是以`操作命令 + 操作對(duì)象`的格式來(lái)操作文本的。如:
d motion
d 表示一個(gè)刪除的操作命令;
motion 表示操作對(duì)象。
常用操作對(duì)象列表:
w - 光標(biāo)位置到下一個(gè)單詞的第一個(gè)字符(不包含);
e - 光標(biāo)位置到該單詞結(jié)尾(包含單詞最后一個(gè)字符);
$ - 光標(biāo)位置到行末尾。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 2.4:對(duì)多個(gè)操作對(duì)象操作
在操作對(duì)象前輸入一個(gè)數(shù)字,表示重復(fù)該操作多次。
如:
2w 移動(dòng)光標(biāo)到后兩個(gè)單詞的詞頭
3e 移動(dòng)光標(biāo)到后三個(gè)單詞的詞尾
0 移動(dòng)光標(biāo)到當(dāng)前行首
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 2.5:使用數(shù)字進(jìn)行多次刪除
在操作命令后接一個(gè)數(shù)字,表示重復(fù)該操作多次。
d number motion
如:
d2w? - 刪除兩個(gè)單詞
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 2.6:對(duì)行的操作
使用`? dd `命令可以刪除一整行內(nèi)容
如:
2dd - 刪除當(dāng)前行及下一行內(nèi)容。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 2.7:撤銷操作命令
` u `命令可以撤銷上一步操作內(nèi)容。` U `可以撤銷對(duì)整個(gè)一行的修改。
`?CTRL-R `則與` u `命令相對(duì)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 2 小結(jié)
1. 刪除當(dāng)前光標(biāo)位置到下一次單詞開(kāi)始處: dw
2. 刪除當(dāng)前光標(biāo)位置到當(dāng)前行結(jié)尾:? ? d$
3. 刪除整行內(nèi)容:? ? dd
4. 重復(fù)一個(gè)操作對(duì)象可以在其前插入一個(gè)數(shù)字:? 2w
5. 操作命令的基本格式:
? ? ? ? ? ? ? operator? [number]? motion
? ? 其中:
? ? ? operator - 表示操作碼
? ? ? [number] - 表示重復(fù)次數(shù)
? ? ? motion? - 表示操作對(duì)象,
? 6. 移動(dòng)光標(biāo)到行首:? 0
? 7. 撤銷之前的操作內(nèi)容: ? ? ? u? (lowercase u)
? ?撤銷一整行的操作內(nèi)容:? U? (capital U)
? ?撤銷上次的撤銷內(nèi)容(redo): ? ? ? CTRL-R
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 3.1:粘貼命令
` p `(put)命令將前一個(gè)刪除命令刪除的內(nèi)容,粘貼到光標(biāo)所在字符位置之后。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 3.2:替換命令
` r{char} `命令用{char}替換當(dāng)前光標(biāo)位置處的字符。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 3.3:修改操作
` ce `命令會(huì)刪除當(dāng)前光標(biāo)位置至該單詞結(jié)束處的所有字符,然后進(jìn)入插入模式。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 3.4:關(guān)于 c 命令的其他用法
` c `命令同樣支持` c [number] 操作對(duì)象` 的用法。
操作對(duì)象可選,如:w(word),$(end of line)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 3 小結(jié)
1. ` p `命令,粘貼上次刪除內(nèi)容到光標(biāo)位置之后。
2.` r `命令,替換單個(gè)字符。?
3. ` c$ `命令,刪除光標(biāo)位置至行末內(nèi)容。
4. 修改操作的常用格式:
c? [number]? 操作對(duì)象
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 4.1:光標(biāo)位置及文件狀態(tài)
<ctrl + g>命令會(huì)顯示文件名稱及光標(biāo)位置所在行。
' G '命令移動(dòng)光標(biāo)到文件底部。
` gg `命令移動(dòng)光標(biāo)到文件的開(kāi)始位置。
` <line number>G `命令移動(dòng)光標(biāo)到文件指定行。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 4.2:查找命令
` /<詞組> `命令可以查找一個(gè)<詞組>
` / `正向查找,` ? `反向查找
` n `查找下一個(gè),` N `查找上一個(gè)
` ctrl + o `回退到上一位置?????
` ctrl + i `前進(jìn)到下一位置
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 4.3:括號(hào)匹配查找
當(dāng)光標(biāo)位置為一個(gè)`(? [ { ` 時(shí),' % '命令可以跳轉(zhuǎn)到與該括號(hào)匹配的另一個(gè)括號(hào)上。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lseeon 4.4:替換(substitute)命令
` :s/old/new/g `命令可以將本行所有的[old]替換為[new]。
其中g(shù)表示替換當(dāng)前行的所有[old]為[new]。
` :%s/old/new/g `命令中添加%則表示替換全文范圍內(nèi)出現(xiàn)的[old]為[new]。
` :%s/old/new/gc `命令中添加c時(shí),每次匹配到[old]都會(huì)出現(xiàn)提示符,詢問(wèn)是否需要替換該[old]為[new]。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 4:小結(jié)
? 1. CTRL-G? 顯示當(dāng)前光標(biāo)所在位置以及文件的狀態(tài)
? ? ? ? ? ? G? 移動(dòng)光標(biāo)到文件末尾
? ? number? G? 移動(dòng)光標(biāo)到給定行
? ? ? ? ? ? gg? 移動(dòng)光標(biāo)到文件第一行
? 2. 在` / `后輸入要查找的內(nèi)容,可以從當(dāng)前位置正向查找該內(nèi)容;
在` ? `后輸入要查找的內(nèi)容,可以從當(dāng)前位置反向查找該內(nèi)容;
完成一次查找查找操作之后,` n `命令可以以同樣的方向查找到下一個(gè)出現(xiàn)該內(nèi)容的位置,` N `命令以相反方向查找到下一個(gè)出現(xiàn)該內(nèi)容的位置。
? ? CTRL-O 可以移動(dòng)光標(biāo)到上一個(gè)位置, CTRL-I 可以移動(dòng)光標(biāo)到下一個(gè)位置。
? 3. 當(dāng)光標(biāo)位于一個(gè)括號(hào)字符位置時(shí),` % ` 命令可以移動(dòng)到與該括號(hào)配對(duì)的括號(hào)所在位置。
? 4. 內(nèi)容替換? ?:s/old/new
? ? 替換所有的出現(xiàn)的內(nèi)容? ?:s/old/new/g
? ? 指定行數(shù)范圍內(nèi)內(nèi)容替換? :#,#s/old/new/g
? ? 替換文檔中出現(xiàn)的所有內(nèi)容? ?:%s/old/new/g
? ? 替換前詢問(wèn)確認(rèn)需要加'c'命令? ?:%s/old/new/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 5.1:在vim中執(zhí)行外部命令
vim中支持暫時(shí)返回到終端執(zhí)行一次終端命令,如` :!ls `命令,會(huì)在終端執(zhí)行 ls 命令。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 5.2:文件寫(xiě)入操作
` :w `命令將當(dāng)前文本內(nèi)容寫(xiě)入正在打開(kāi)的文件中,可以理解為保存修改內(nèi)容命令。
如果需要將文件寫(xiě)入一個(gè)新文件,可以在該命令后接空格+文件名,將文件寫(xiě)入新的文件。
如` :w TEST `命令,將文件寫(xiě)入TEST
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 5.3:選擇文本并寫(xiě)入文件
使用` v `命令之后,通過(guò)方向鍵移動(dòng)光標(biāo)來(lái)選擇文本,輸入` : `命令進(jìn)入命令行模式,此時(shí),底欄會(huì)出現(xiàn)提示符' :'<,'> ',繼續(xù)輸入` w TEST `按回車,則會(huì)將光標(biāo)選中的文本寫(xiě)入TEST文件。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 5.4:讀入文件到當(dāng)前光標(biāo)所在行
使用` :r FILENAME `命令,可以將文件FILENAME寫(xiě)入到光標(biāo)所在位置的當(dāng)前文件中。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
?Lesson 5 小結(jié)
? 1.? ` :! `命令可以執(zhí)行一個(gè)外部命令
? ? ? 如:
:!ls ? -? 顯示一個(gè)目錄下的文件列表
:!rm FILENAME? -? 刪除文件FILENAME.
? 2.? :w FILENAME? 將當(dāng)前文件寫(xiě)入文件FILENAME中
? 3.? v? motion? :w FILENAME? 保存選中文件到文件FILENAME中
? 4.? :r FILENAME? 讀取文件FILENAME 到當(dāng)前光標(biāo)所在文件的位置
? 5.? :r !ls? 讀取ls命令的輸出到當(dāng)前文件中光標(biāo)位置
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 6.1:文件打開(kāi)命令
` o `命令可以在光標(biāo)所在行的下一行插入空行,并進(jìn)入插入模式。
` O `命令可以在光標(biāo)所在行的上一行插入空行,并進(jìn)入插入模式。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 6.2:附加文本命令
` a `命令在當(dāng)前光標(biāo)位置之后進(jìn)入插入模式。
` e `命令可以跳轉(zhuǎn)到下一個(gè)單詞的最后一個(gè)字符。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 6.3:其他替換方式
` R `命令可以進(jìn)入替換模式,類似鍵盤(pán)上的<insert>按鍵。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 6.4:文本的復(fù)制和粘貼
` y `命令用來(lái)對(duì)選中內(nèi)容復(fù)制,` p `命令用來(lái)將復(fù)制的內(nèi)容粘貼到光標(biāo)位置。
可以使用` yw `命令來(lái)復(fù)制一個(gè)單詞。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
? ? Lesson 6.5:選項(xiàng)設(shè)置
設(shè)置查找替換命令忽略字母大小寫(xiě)
` :set `命令用來(lái)設(shè)置vim的選項(xiàng)內(nèi)容。
` :set ic `設(shè)置忽略大小寫(xiě)
` :set hls `設(shè)置查找內(nèi)容高亮
` :set is `和` :set incsearch `設(shè)置???
如果只想設(shè)置本次查找忽略大小寫(xiě),可以在命令最后添加` \c `
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 6 小結(jié)
1. ` o `命令將將光標(biāo)所在行的下一行插入空行,并進(jìn)入插入模式。
` O `命令將將光標(biāo)所在行的上一行插入空行,并進(jìn)入插入模式。
2. ` a `命令將在光標(biāo)所在為位置之后進(jìn)入插入模式。
` A `命令將在光標(biāo)所在行的行末進(jìn)入插入模式。
3. ` e `命令移動(dòng)光標(biāo)到當(dāng)前單詞的最后一個(gè)字符。
4. ` y `命令用來(lái)復(fù)制選中內(nèi)容,` p `命令用來(lái)粘貼內(nèi)容。
5. ` R `命令可以進(jìn)入替換模式。
6. ` :set xxx `命令用來(lái)設(shè)置vim選項(xiàng)。如:
? 'ic' 'ignorecase' 查找時(shí)忽略字符大小寫(xiě)
'is' 'incsearch' show partial matches for a search phrase
'hls' 'hlsearch' 高亮匹配到的內(nèi)容
7. 可以在選項(xiàng)前加`no`來(lái)關(guān)閉選項(xiàng)內(nèi)容,如:` :set noic `
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 7.1:獲取help內(nèi)容
vim提供一下三種方式來(lái)獲取help信息
- <HELP> 按鍵
- <F1> 按鍵
- ` :help `命令
` CTRL-W CTRL-W `將光標(biāo)從一個(gè)窗口移動(dòng)到另一個(gè)窗口。
此外可以查看單個(gè)命令命令的help信息,如:
:help w
:help c_CTRL-D
:help insert-index
:help user-manual
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
? ? ? Lesson 7.2:創(chuàng)建一個(gè)vim啟動(dòng)配置腳本
Linux環(huán)境下,vim啟動(dòng)時(shí)會(huì)讀取~/.vimrc文件中的配置內(nèi)容。
1. 使用vim打開(kāi)~/.vimrc文件;
2. 讀取vim提供的vimrc文件:
:r $VIMRUNTIME/vimrc_example.vim
3. 寫(xiě)入文件到磁盤(pán):
:w
當(dāng)你下一次打開(kāi)vim時(shí),.vimrc配置文件中的內(nèi)容會(huì)生效。
` :help vimrc-intro `可以獲取更多相關(guān)內(nèi)容。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
? ? Lesson 7.3:補(bǔ)齊功能
` CTRL - D `命令可根據(jù)以輸入的內(nèi)容提供顯示聯(lián)想內(nèi)容。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 7 小結(jié)
? 1. ` :help`? 或者 <F1> 或者 <Help>? 可以打開(kāi)help窗口。
? 2. ` :help cmd `查看cmd的幫助信息。
? 3. ` CTRL-W CTRL-W `將光標(biāo)從一個(gè)窗口移動(dòng)到另一個(gè)窗口。
? 4. ` :q `可以關(guān)閉help信息窗口。
? 5. 配置.vimrc文件會(huì)在每次vim打開(kāi)時(shí)被讀取。
? 6. 命令行模式下,`CTRL - D`命令可以根據(jù)以輸入的內(nèi)容聯(lián)想可能輸入。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~