vi编辑器的学习使用(十三)
生活随笔
收集整理的這篇文章主要介紹了
vi编辑器的学习使用(十三)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Vim最大的一個優(yōu)點就是他的靈活性.使得他具有如此靈活性的一個重要原因就是自動命令.所謂的自動命令就是一條命令,所不同的只是他可以在某些事件發(fā)生時自動執(zhí)行.
例如通過Vim的這樣自動命令,我們可以使用Vim來編輯壓縮文件,這是因為我們可以定義一個自動命令在我們讀取文件時解壓縮,在我們寫入文件時進行壓縮.
我們在處理文件時有時希望文件在保存時在文件的結尾處插入當前的日期,而這在Vim當中我們可以使用自動命令來完成.我們可以定義這樣的一個函數(shù):
:function DateInsert()
:?? ?$read !date?? ?"在文件的結尾處插入日期
:endfunction
當我們要保存文件時可以調用這個函數(shù):
:call DateInsert()
然后我們就可以保存退出了.
我們還可以將這個功能綁定在一個按鍵上:
:map <F12>:call DateInsert()<CR>/|:write<CR>
這種方法使用問題的解決更簡單,因為我們只需在要保存文件時按一下F12鍵就可以了.
但是也許有時我們會忘記這樣的步驟,而使用正常的保存命令,那么這時這個函數(shù)也就失去了意義.我們希望這個插入日期的命令可以自動被執(zhí)行,這也正是自動命令的意義所在.
下面的命令就可以來滿足我們的要求了:
:autocmd FileWritePre * :callDateInsert()<CR>
這個命令會使得所有的文件在保存之前調用這個插入日期的函數(shù).我們并不需要每一次都要輸入:write來保存文件,也就是說當我們定義了這個命令以后,當我們輸入一次:write命令,vim就會自動檢查所有未保存的文件并執(zhí)行我們定義的這個命令,然后執(zhí)行保存命令.
:autocmd命令的一般格式如下:
:autocmd group events file_patter nested command
在這個格式中組名(group)是一個可選項,他被用于管理和調用命令.參數(shù)事件(events)是一個事件列表,指明引發(fā)命令的事件,而嵌套標記(nested)可以允許嵌套自動命令,最后是所要執(zhí)行的命令.
命令:augroup可以使得我們定義一組自動命令.這個組名最好應是一個和我們要定義的一組自動命令相關聯(lián)的名字,如下面的例子:
:augroup cprograms
:?? ?autocmd FileReadPost *.c :set cindent
:?? ?autocmd FileReadPost *.cpp :set cindent
:augroup END
在這里因為這些自動命令是在:augroup的作用域之內的,所以他們被放在cprogram這個組內.這組自動命令是在讀取C和Cpp之后執(zhí)行的.如果我們想在這個組中添加關于頭文件的自動命令,我們可以使用:augroup命令,或者是在我們的定義中包含這個組名.
如果我們正在編輯的文件名為sam.cx,而我們想將他當作C程序文件來對處理.這時我們可以通過命令來告訴Vim編輯器在文件讀入以后將他與*.c文件相匹配.我們所用的命令如下:
:doautocmd group event file_name
在這個命令執(zhí)行的時候,Vim是將假定當前文件的名字為file_name,而實際上這并不是他真正的文件名.如果在這個命令中我們并沒有指明組(group),那么所有的組都會被用到.而且我們必須指明事件,并且Vim會認為這個事件已經(jīng)發(fā)生.與命令:doautocmd相類似的是命令:doautoall,所不同的只是后者是針對每一個緩沖區(qū)(buffer).這個命令的格式為:
:doautoall group event file_name
我們可以使用下列的命令來引發(fā)命令:
BufNewFile?? ??? ??? ?當編輯一個新文件時引發(fā)命令
BufReadPre?? ?BufReadPost?? ?在讀入之前或是讀入之后引發(fā)命令
?? ??? ?BufRead?? ??? ?BufReadPost的另一種說法
BufFilePre?? ?BufFilePost?? ?在通過:file命令更改緩沖區(qū)名字之前或是之后引發(fā)
FileReadPre?? ?FileReadPost
在用:read命令讀入文件之前或之后.在文件讀入之后,在文件的開頭和結尾處有由[和]來標記
FilterReadPre?? ?FilterReadPost?? ?在用過濾命令(filter)讀入文件之前或之后
FileType?? ??? ??? ?當FileType設置時有效
Syntax?? ??? ??? ??? ?當Syntax設置時有效
StdinReadPre?? ?StdReadPost?? ?由標準輸入設備讀入或是輸出
BufWritePre?? ?BufWritePost?? ?在將整個緩沖區(qū)寫入文件之前或是之后
BufWrite?? ??? ??? ?BufWritePre的另一種說法
FileWritePre?? ?FileWritePost?? ?將部分緩沖區(qū)內容寫入文件之前或是之后
FileAppendPre?? ?FileAppendPost?? ?將一個文件由過濾命令輸入之前或之后
FileChangedShell
這個事件是在Vim運行Shell命令而文件的修改時間已經(jīng)改變時引發(fā)
FocusGained?? ?FocusLost
這個事件是在Vim編輯器得到或是失運輸入光標時引發(fā).這意味著vim運行圖形界面,并且是Vim成為當前窗口或是其他的成為當前窗口
CursorHold
用戶停止輸入的時間長于由updatetime所指定的時間時引發(fā)
BufEnter?? ?BufLeave?? ?當進入或離開緩沖區(qū)時引發(fā)
BufUnload?? ??? ??? ?在緩沖區(qū)未載入之前引發(fā)
BufCreate?? ?BufDelete?? ?在緩沖區(qū)產(chǎn)生以后或是在緩沖區(qū)刪除以前引發(fā)
GuiEnter?? ??? ??? ?啟動GUI時引發(fā)
VimEnter?? ??? ??? ?Vim啟動而初始化文件還沒有讀入進引發(fā)
VimLeave?? ??? ??? ?退出Vim編輯器而.viminfo還沒有改寫時引發(fā)
FileEncoding?? ??? ??? ?fileencoding已經(jīng)被設置時有效
TermChanged?? ??? ??? ?term選項被更改時引發(fā)
User
并不是一個真正的事件,而是命令:doautocmd一起使用的一個事件
當存文件時,只有下列事件成對出現(xiàn)時才引發(fā):
BufWritePre?? ?BufWritePost
FilterWritePre?? ?FilterWritePost
FileAppendPre?? ?FileAppendPost
FileWritePre?? ?FileWritePost
當讀文件進,只要下列事件中的一個被設置則會引發(fā):
BufNewFile
BufReadPre?? ?BufReadPost
FilterReadPre?? ?FilterReadPost
FileReadPre?? ?FileReadPost
文件名類型與UNIX標準系統(tǒng)相匹配.下面列出是一些特殊字符匹配的情況:
*?? ?匹配任意長度的任意字符
??? ?匹配單個字符
'?? ?分隔交替的類型
/??? ?字符?
/,?? ?字符,
/character
將這個字符看作是一個要查找的類型字符,例如:a/+可以匹配,aa,aaa等等
一般情況下一個命令的執(zhí)行結果并不會引發(fā)另一個事件.例如Syntax的執(zhí)行結果并不會引發(fā)FileReadPre事件.但是如果我們在自動命令中加入nested關鍵字就可以來引發(fā)了,例如下面的命令:
:autocmd FileChangedShell *.c nested e!
我們可以使用命令:autocmd列出所有的自動命令.
如果我們想要得到所有這些命令中的一個子集命令,我們可以使用如下的命令:
:autocmd group event pattern
在這個命令中如果我們指定了group,那么就會所有與group相匹配的命令.event可以是以前定義的或是所有的事件,pattern指了與類型相匹配的文件選項.只有那些與命令相匹配的命令才會被列出來.
我們可以建立我們自已的自動命令,當然了我們也可以移除那些我們不再需要的自動命令.例如命令:autocmd!就可以移除所有的自動命令.
我們也可以用下面的命令來移除指定的組命令:
:autocmd! group
在這個命令中我們當然也可以為這個組指定事件或是類型
:autocmd! group event pattern
event可以用*代替所有的事件
我們可以用命令:autocmd!來移除那些已經(jīng)存在的自動命令,我們還可以同時在一個命令中再新建一個我們自己的自動命令.這個語法的格式如下:
:autocmd! group event pattern nested command
這個命令等價于下面的兩個命令:
:autocmd! group event pattern
:autocmd group event pattern nested command
有時我們并不想引發(fā)某個命令,在這樣的情況下我們可以設置eventignore選項來指定那些要忽略的事件.例如下面的命令將進入窗口和離開窗口的事件忽略掉:
:set eventignore=WinEnter,WinLeave
如果要忽略所有的事件,可以用下面的命令:
:set eventignore=all
例如通過Vim的這樣自動命令,我們可以使用Vim來編輯壓縮文件,這是因為我們可以定義一個自動命令在我們讀取文件時解壓縮,在我們寫入文件時進行壓縮.
我們在處理文件時有時希望文件在保存時在文件的結尾處插入當前的日期,而這在Vim當中我們可以使用自動命令來完成.我們可以定義這樣的一個函數(shù):
:function DateInsert()
:?? ?$read !date?? ?"在文件的結尾處插入日期
:endfunction
當我們要保存文件時可以調用這個函數(shù):
:call DateInsert()
然后我們就可以保存退出了.
我們還可以將這個功能綁定在一個按鍵上:
:map <F12>:call DateInsert()<CR>/|:write<CR>
這種方法使用問題的解決更簡單,因為我們只需在要保存文件時按一下F12鍵就可以了.
但是也許有時我們會忘記這樣的步驟,而使用正常的保存命令,那么這時這個函數(shù)也就失去了意義.我們希望這個插入日期的命令可以自動被執(zhí)行,這也正是自動命令的意義所在.
下面的命令就可以來滿足我們的要求了:
:autocmd FileWritePre * :callDateInsert()<CR>
這個命令會使得所有的文件在保存之前調用這個插入日期的函數(shù).我們并不需要每一次都要輸入:write來保存文件,也就是說當我們定義了這個命令以后,當我們輸入一次:write命令,vim就會自動檢查所有未保存的文件并執(zhí)行我們定義的這個命令,然后執(zhí)行保存命令.
:autocmd命令的一般格式如下:
:autocmd group events file_patter nested command
在這個格式中組名(group)是一個可選項,他被用于管理和調用命令.參數(shù)事件(events)是一個事件列表,指明引發(fā)命令的事件,而嵌套標記(nested)可以允許嵌套自動命令,最后是所要執(zhí)行的命令.
命令:augroup可以使得我們定義一組自動命令.這個組名最好應是一個和我們要定義的一組自動命令相關聯(lián)的名字,如下面的例子:
:augroup cprograms
:?? ?autocmd FileReadPost *.c :set cindent
:?? ?autocmd FileReadPost *.cpp :set cindent
:augroup END
在這里因為這些自動命令是在:augroup的作用域之內的,所以他們被放在cprogram這個組內.這組自動命令是在讀取C和Cpp之后執(zhí)行的.如果我們想在這個組中添加關于頭文件的自動命令,我們可以使用:augroup命令,或者是在我們的定義中包含這個組名.
如果我們正在編輯的文件名為sam.cx,而我們想將他當作C程序文件來對處理.這時我們可以通過命令來告訴Vim編輯器在文件讀入以后將他與*.c文件相匹配.我們所用的命令如下:
:doautocmd group event file_name
在這個命令執(zhí)行的時候,Vim是將假定當前文件的名字為file_name,而實際上這并不是他真正的文件名.如果在這個命令中我們并沒有指明組(group),那么所有的組都會被用到.而且我們必須指明事件,并且Vim會認為這個事件已經(jīng)發(fā)生.與命令:doautocmd相類似的是命令:doautoall,所不同的只是后者是針對每一個緩沖區(qū)(buffer).這個命令的格式為:
:doautoall group event file_name
我們可以使用下列的命令來引發(fā)命令:
BufNewFile?? ??? ??? ?當編輯一個新文件時引發(fā)命令
BufReadPre?? ?BufReadPost?? ?在讀入之前或是讀入之后引發(fā)命令
?? ??? ?BufRead?? ??? ?BufReadPost的另一種說法
BufFilePre?? ?BufFilePost?? ?在通過:file命令更改緩沖區(qū)名字之前或是之后引發(fā)
FileReadPre?? ?FileReadPost
在用:read命令讀入文件之前或之后.在文件讀入之后,在文件的開頭和結尾處有由[和]來標記
FilterReadPre?? ?FilterReadPost?? ?在用過濾命令(filter)讀入文件之前或之后
FileType?? ??? ??? ?當FileType設置時有效
Syntax?? ??? ??? ??? ?當Syntax設置時有效
StdinReadPre?? ?StdReadPost?? ?由標準輸入設備讀入或是輸出
BufWritePre?? ?BufWritePost?? ?在將整個緩沖區(qū)寫入文件之前或是之后
BufWrite?? ??? ??? ?BufWritePre的另一種說法
FileWritePre?? ?FileWritePost?? ?將部分緩沖區(qū)內容寫入文件之前或是之后
FileAppendPre?? ?FileAppendPost?? ?將一個文件由過濾命令輸入之前或之后
FileChangedShell
這個事件是在Vim運行Shell命令而文件的修改時間已經(jīng)改變時引發(fā)
FocusGained?? ?FocusLost
這個事件是在Vim編輯器得到或是失運輸入光標時引發(fā).這意味著vim運行圖形界面,并且是Vim成為當前窗口或是其他的成為當前窗口
CursorHold
用戶停止輸入的時間長于由updatetime所指定的時間時引發(fā)
BufEnter?? ?BufLeave?? ?當進入或離開緩沖區(qū)時引發(fā)
BufUnload?? ??? ??? ?在緩沖區(qū)未載入之前引發(fā)
BufCreate?? ?BufDelete?? ?在緩沖區(qū)產(chǎn)生以后或是在緩沖區(qū)刪除以前引發(fā)
GuiEnter?? ??? ??? ?啟動GUI時引發(fā)
VimEnter?? ??? ??? ?Vim啟動而初始化文件還沒有讀入進引發(fā)
VimLeave?? ??? ??? ?退出Vim編輯器而.viminfo還沒有改寫時引發(fā)
FileEncoding?? ??? ??? ?fileencoding已經(jīng)被設置時有效
TermChanged?? ??? ??? ?term選項被更改時引發(fā)
User
并不是一個真正的事件,而是命令:doautocmd一起使用的一個事件
當存文件時,只有下列事件成對出現(xiàn)時才引發(fā):
BufWritePre?? ?BufWritePost
FilterWritePre?? ?FilterWritePost
FileAppendPre?? ?FileAppendPost
FileWritePre?? ?FileWritePost
當讀文件進,只要下列事件中的一個被設置則會引發(fā):
BufNewFile
BufReadPre?? ?BufReadPost
FilterReadPre?? ?FilterReadPost
FileReadPre?? ?FileReadPost
文件名類型與UNIX標準系統(tǒng)相匹配.下面列出是一些特殊字符匹配的情況:
*?? ?匹配任意長度的任意字符
??? ?匹配單個字符
'?? ?分隔交替的類型
/??? ?字符?
/,?? ?字符,
/character
將這個字符看作是一個要查找的類型字符,例如:a/+可以匹配,aa,aaa等等
一般情況下一個命令的執(zhí)行結果并不會引發(fā)另一個事件.例如Syntax的執(zhí)行結果并不會引發(fā)FileReadPre事件.但是如果我們在自動命令中加入nested關鍵字就可以來引發(fā)了,例如下面的命令:
:autocmd FileChangedShell *.c nested e!
我們可以使用命令:autocmd列出所有的自動命令.
如果我們想要得到所有這些命令中的一個子集命令,我們可以使用如下的命令:
:autocmd group event pattern
在這個命令中如果我們指定了group,那么就會所有與group相匹配的命令.event可以是以前定義的或是所有的事件,pattern指了與類型相匹配的文件選項.只有那些與命令相匹配的命令才會被列出來.
我們可以建立我們自已的自動命令,當然了我們也可以移除那些我們不再需要的自動命令.例如命令:autocmd!就可以移除所有的自動命令.
我們也可以用下面的命令來移除指定的組命令:
:autocmd! group
在這個命令中我們當然也可以為這個組指定事件或是類型
:autocmd! group event pattern
event可以用*代替所有的事件
我們可以用命令:autocmd!來移除那些已經(jīng)存在的自動命令,我們還可以同時在一個命令中再新建一個我們自己的自動命令.這個語法的格式如下:
:autocmd! group event pattern nested command
這個命令等價于下面的兩個命令:
:autocmd! group event pattern
:autocmd group event pattern nested command
有時我們并不想引發(fā)某個命令,在這樣的情況下我們可以設置eventignore選項來指定那些要忽略的事件.例如下面的命令將進入窗口和離開窗口的事件忽略掉:
:set eventignore=WinEnter,WinLeave
如果要忽略所有的事件,可以用下面的命令:
:set eventignore=all
轉載于:https://www.cnblogs.com/dyllove98/archive/2005/07/26/2462161.html
總結
以上是生活随笔為你收集整理的vi编辑器的学习使用(十三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DPI释疑--What is mean
- 下一篇: Net中如何操作IIS