1. 程式人生 > >vim8.1 使用過程中的指令總結

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個檔案,

  1. a.txt
  2. b.cpp
  3. 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,即跳到最後一行。