vim8.1 使用過程中的指令總結
持續更新......
1 在normal模式下(舉個例子)
:!ls #列舉出當前目錄下的所有檔案,並回到命令視窗,使用任意鍵返回vim :ls #列舉出當前的buffer中有哪些檔案的buffer >> 1 %a "a.txt" 2 #h "b.txt"
圖1
其中%代表顯示的是當前視窗可見的檔案,#代表的是其他可供選擇的的檔案buffer
2 在多個開啟的buffer中切換
使用<ctrl+shift+^>,或者<ctrl+6>,或cmd模式 :bnext(:bn)或者 :bprev(:bp)或者 :buffer Num
其中Num可以通過 :ls檢視每個檔案的buffer編號,即圖1中的編號1,2,3,......
3 通過vim開啟的檔案原理
vim open 一個檔案,其實是將該檔案的所有內容load到buffer中,我們在vim中看到的所有內容就是buffer的內容,如果對buffer的內容做出任何修改,只要不執行寫入到硬碟的操作(即儲存),原始檔是不會發生任何改變的,因此,假設我們有3個檔案,
- a.txt
- b.cpp
- c.py
使用vim開啟他們
vim a.txt b.cpp c.py
這時候三個檔案的的內容會全部載入到記憶體的buffer中,在vim的cmd模式下執行如下指令
:ls
>>
1 %a a.txt
2 #h b.cpp
3 #h c.py
其中1,2,3就是三個檔案對應的buffer編號,你可以通過
:b(uffer) 1
:b(uffer) 2
:b(uffer) 3
來檢視每個檔案,就像第2節提到的:b(uffer) Num的指令一樣。
當在b.cpp檔案中作出修改時再次執行ls指令
:ls
>>
1 #h a.txt
2 %a+ b.cpp
3 #h c.py
會出現一個“+”號,表示這個buffer檔案被修改了,如果不執行:w(rite)操作的話,直接退出,vim會提示錯誤,詢問你是否儲存。這裡有一個隱藏的buffer的概念,對b.cpp的檔案做出的修改,其修改的內容是存放在一個隱藏的buffer中的通過:ls指令是無法檢視到的。可以通過:w(rite)儲存這個buffer到檔案,或者通過;q(uit)放棄這個隱藏的buffer
3.1 當你load很多個檔案的buffer到vim後,你要怎麼關閉它們呢
通過:bufferdelete可以簡寫成:bd來刪除這個load進來的buffer,當然你需要先儲存你需要的修改通過:w(rite)一個個儲存或者通過:wa(ll)全部儲存,再刪除這些buffer,這樣修改會儲存到檔案。你也可以通過:q來一個個關閉他們,或者通過:qa(ll)一次關閉全部。
3.2 如何在開啟的vim中load新的檔案進來
通過:e(dit) {file_path},或者通過使用外掛的方式。
如果你想edit當前目錄下的其他檔案,也可以
:edit %:h<tab>"檔案前幾個字母"<tab>
或
:edit ./"檔案前幾個字母"<tab>
3.3 find'命令
配合edit的常常還有:find命令,使用find命令時要注意設定path,不然可能會提示: E345:Can't find file "xx" in path
:set path+="你要查詢檔案的具體資料夾"/**
其中兩個**表示,包含這個資料夾下的所有子檔案或者子資料夾。
3.4 Explore命令
這是檔案系統中netrw的功能,分為:Sexplore和:Vexplore,主要是切換到檔案的目錄結構, Sexplore表示水平顯示分割視窗,Vexplore表示垂直顯示的分割視窗。這個功能和外掛,nerdtree的功能類似。
3.5 編輯 'readonly'檔案時
當儲存時,
:write
E45:'readonly' option is set (add ! to override)
按照提示新增!,再次執行,
:write!
"xxxxxx" E212: Can't open file for writing
這是沒有許可權的原因,
執行如下命令,
:write !sudo tee % > /dev/null
“會提示你輸入超級使用者的密碼”
W12: Warning: File "xxx" has changed and the buffer and the buffer was changed in Vim as well
[O]k,(L)oad File, Load (A)ll, (I)gnore All:“讓你選擇其中一種操作,一般選擇 load”
輸入"l" load就可以了。
命令註解:
write ![cmd] 是vim的一種形式,會執行cmd命令在write時,tee命令是執行程序通過超級使用者的許可權,%代表當前的buffer,>代表output輸出到,/dev/null代表null device.
4 vim切分視窗
有兩個方式:split和:vsplit。前者是水平分割,後者是垂直分割
切分開啟視窗的方式:通過<C-w>s將當前視窗水平分割;<C-w>v將當前視窗垂直分割。這個的指令切分的視窗的樣式裡面的內容是一樣的,這樣當某個結構提或者程式碼太長時,你可以通過不同視窗來檢視程式碼的片段,而不需要上下滾動螢幕。
如果你不需要他們是相同的內容,你可以選中其中一個視窗,使用:e(dite) {file_name}load一個檔案的buffer這樣視窗的內容就不同了。
你可以切分很多個這樣的視窗,通過<C-w>w可以在這些視窗之間切換,也可以使用:bn(ext)和:bp(revious)前後切換,或者bl(ast)和bf(irst)最後一個和第一個檔案之間切換。
5 vim指令:shell的使用
當你在vim中編寫程式碼時,突然想開啟某個檔案檢視其中的內容。或是執行其他軟體或者script時,但是你又不想關閉你當前active的vim視窗,你可以使用:shell命令,將當前的vim視窗掛起到後臺,這一點常常非常有用。
:shell可以讓你離開當前正在編輯的vim檔案,重新回到terminal,執行你想要的一切操作,隨便什麼都可以,和你重新開啟一個terminal一樣的,但是當你要回到之前編輯的vim檔案時,你只需要在terminal中輸入exit就可以回到之前使用的vim視窗中,在這個期間,你甚至可以重現開啟新的vim編輯檔案,這之間不會互相影響,但是不要試圖開啟之前那個vim視窗已經開啟的檔案並且作修改,這個我沒有測試過,可能會出現錯誤的提示。
2018-11-23 updating......
6 怎麼通過vim在新建一個python檔案或者bash等檔案時,在開頭自動新增一些資訊
autocmd BufNewFile *.[ch],*.hpp,*.cpp,*.mk,*.sh,*.py exec ":call SetTitle()"
func SetTitle()
if &filetype == 'make'
pass
elseif &filetype == 'sh'
pass
elseif &filetype == 'python'
pass
else
pass
endif
endfunc
這是一個簡單的框架,通過autocmd BufNewFile xxxxxx exec ":call SetTitle()",就會在出現BufNewFile時(即建立新檔案),檢測是什麼型別檔案,然後自動通過exec 執行SetTitle()函式。
SetTitle()的函式內容如上所示,將你先要新增的內容新增到pass的位置。例如
autocmd BufNewFile *.[ch],*.hpp,*.cpp,*.mk,*.sh,*.py exec ":call SetTitle()"
func SetTitle()
if &filetype == 'make'
pass
elseif &filetype == 'sh'
pass
elseif &filetype == 'python'
call setline(1,"#!/usr/bin/env python")
call setline(2,"#-*- coding: utf-8 -*-")
call setline(3,"\"\"\"")
call setline(4,"#__Filename__ : ".expand("%:t"))
call setline(5,"#__Auther__ : simileciwh")
call setline(6,"#Email : [email protected]")
call setline(7,"#Created date : ".strftime("%F %T"))
call setline(8,"# code is far away from bugs with the god animal protecting")
call setline(9,"# I love animals. I have a lovely doggy!")
call setline(10,"\"\"\"")
else
pass
endif
endfunc
你可以把所有的pass位置,替換成你先要新增的內容。
7 在第6節設定完成後,每次建立新的檔案時,游標都會停留在檔案第一行的開頭,當時因為已經在建立檔案的時候我們已經追加了新的內容,我們想讓游標一開啟檔案就在可以編輯的新行,可以新增一行這個語句。
exe "normal G"
在每一個之後,這句話的意義是,在normal模式,執行命令G,即跳到最後一行。