在前幾篇文章中耙册,我們從vim各種模式的使用著手介紹了vim如何進行文本本身的編輯。也通過緩沖區(qū)列表的介紹了解到了vim是如何進行打開文件的管理。這篇我們將會著眼于文件的打開和保存的基本操作贾费。通過這篇的閱讀吕世,我們可以正式開始嘗試將vim用做代碼編輯器,而不再是像之前那樣作為普通的文本編輯器戴陡。
開始前的準備
先來介紹一下vim的工作目錄的概念塞绿。我們知道進程都有自己的工作目錄,后續(xù)需要操作某個目錄的時候恤批,可以根據(jù)這個工作目錄使用相對路徑异吻。這樣的好處是比較靈活,只要我們的文件按照一定的規(guī)則進行組織喜庞,后續(xù)可以更換程序可執(zhí)行文件所在路徑而不用更新代碼诀浪。
vim自己也有一個工作目錄的概念,可以通過:pwd
來查看當前vim的工作目錄是哪個延都,一般來說我們是從shell中的哪一個目錄中進入的vim雷猪,那么vim的工作目錄就是哪個。
為了展示vim是如何進行目錄和文件管理的晰房,這里我準備通過我之前在github上托管的自己的vim配置文件來進行演示求摇,nvim-config 各位小伙伴可以下載進行實驗酵颁,以便達到與教程保持相同效果。也可以采用自己的實際項目進行實驗月帝。這里我多說一句躏惋,我并不推薦各位采用這個配置,第一個原因在于這個配置并沒有完全完成嚷辅,算是一個半成品簿姨。第二個原因是這個配置并不能完美的符合各位的工作流和工作習慣。我們學習vim簸搞、學習vim的配置主要是為了結(jié)合自己的工作習慣和工作流形成一套符合自己習慣的操作方式扁位,并不推薦大家照搬里面的配置。第三個原因是趁俊,在后續(xù)我想寫一系列的從0開始配置vim的文章域仇,幫助大家完成自己的配置。
edit命令
打開一個文件可以通過:edit {filename}
(或者簡寫為 :e
) 寺擂。如果filename采用絕對路徑暇务,那么打開的就是絕對路徑所對應的文件,如果是相對路徑怔软,那么就可以打開相對與vim工作目錄的文件垦细。
例如我們想打開項目中的基礎配置文件lua/basic/settings.lua
,就可以執(zhí)行:edit lua/basic/settings.lua
。根據(jù)我們前面所學的內(nèi)容挡逼,vim的命令模式是支持自動補全的括改,我們可以通過tab來快速補全路徑
假設現(xiàn)在已經(jīng)打開了這個文件,我想打開它同級目錄下的keybinds.lua
來配置快捷鍵的話家坎,我要同樣的輸入:edit lua/basic/keybinds.lua
嘱能。本來我已經(jīng)打開了與它同級目錄中的 settings.lua
了,我為了打開keybinds.lua
要輸入這么大一堆虱疏,如果我能以當前settings.lua
的路徑作為相對路徑就好了惹骂。
vim 在命令行中提供了一個%
作為活動緩沖區(qū)的完整路徑。我們在直接介紹命令模式的時候订框,%
是作為范圍表示當前打開的整個文本析苫。這里它作為路徑參數(shù)的話,表示的是當前打開文本的完整路徑穿扳。
我們可以通過 :edit %<Tab>
來自動顯示整個路徑衩侥,然后通過<C-w>
來刪除單詞,直到刪除到當前目錄矛物,然后再輸入keybinds.lua
就可以了
用這種方法是簡單了點茫死,但是最后還要刪除個文件名,上面我們按了3次<C-w>
,也挺麻煩的履羞。有沒有什么方法可以直接定位到對應的目錄峦萎,讓我直接輸入文件名呢屡久?可以通過 在%
的后面加上:h
來自動去掉文件名,即輸入:edit %:h<Tab>
來自動出現(xiàn)對應的目錄爱榔。這個功能還是挺有用的被环,但是需要輸入這么多內(nèi)容,為了簡化它你肯定也想到了详幽,要給它配置快捷鍵筛欢。這里還是留到以后再講解它的使用。
find命令
即使:edit
命令有%
這種操作來簡便輸入唇聘,但是在打開其他目錄中的文件時仍然需要輸入完整的目錄和文件名版姑,這個操作也是挺繁瑣的。
操作系統(tǒng)中迟郎,有一個PATH
環(huán)境變量剥险,輸入命令的時候,他會在PATH
所指定的目錄中查找對應命令宪肖。vim中也有類似的概念表制。
vim中可以使用:find
,根據(jù)輸入的文件名打開文件匈庭。但是使用:find
的前提是配置path
變量夫凸。它們合作完成打開文件的操作,與環(huán)境變量的用法類似阱持。
可以輸入:set path+=./**
將當前工作目錄以及它下面的所有子目錄。然后可以直接輸入:find keybinds.lua
打開這個文件了魔熏。
你可能會問衷咽,如果項目中有相同的文件名呢,這個項目里面沒有同名文件蒜绽,這里我們在lua/basic
目錄中新建一個init.lua
這樣它就與根目錄下的init.lua
相同了镶骗。我們輸入:find init.lua
,它會打開當前文件所在目錄附近的同名文件。例如如果當前打開的文件在lua/basic
目錄中躲雅,那么它會打開nvim-config/lua/basic/init.lua
鼎姊,如果當前打開文件在nvim-config
中,它會打開nvim-config/init.lua
相赁。也可以在輸入完init.lua
之后相寇,按下<Tab>
它會提示所有匹配到的文件。我們可以指定位置的文件打開钮科。
在我們不斷使用tab來匹配會出現(xiàn)3個匹配項:init.lua唤衫、./init.lua、./lua/basic/init.lua绵脯。他們分別對應著上面所說的那個匹配的文件佳励,以及其他兩個不同位置的文件休里。
vim自帶的目錄管理工具
在一般的ide中,左側(cè)或者右側(cè)會以樹的形式顯示項目中的目錄赃承。vim中也有這樣的功能妙黍。它是vim提供的一個名為netrw
插件。
我們打開一個目錄就可以看到瞧剖,它在窗口中顯示該目錄中的文件結(jié)構(gòu)拭嫁。它與普通的緩沖區(qū)窗口一樣,可以通過motion
操作來移動光標筒繁。也支持命令行模式噩凹,但是這個緩沖區(qū)是不可修改的,也無法保存毡咏。在該窗口中驮宴,隨意選擇一行按下回車,如果選擇的是一個文件呕缭,那么它會打開該文件堵泽,如果是目錄那么窗口中則會進入該目錄并顯示目錄內(nèi)容。
我們可以像打開一個普通的文本文件那樣打開一個目錄恢总,二者的區(qū)別僅僅在于顯示的內(nèi)容不同迎罗,某些行為不同而已。如果當前已經(jīng)打開了一個文件片仿,我想再繼續(xù)顯示這個目錄呢纹安?相信各位小伙伴已經(jīng)猜到了,既然可以以打開普通文件的方式打開新的目錄砂豌,那么我使用:edit
命令厢岂,在后面加入目錄路徑是不是就可以了。
經(jīng)過實驗阳距,確實是這樣呢塔粒。看到?jīng)]筐摘,vim就是這樣卒茬,一旦理解了它的邏輯,很多東西自己就能猜到咖熟。當然vim也提供了:Explore
專門用來顯示目錄結(jié)構(gòu)圃酵。它可以簡寫為:E
后面不加任何東西可以打開當前文件所在目錄,也可以加上路徑打開指定目錄球恤。
如果我們想要像普通編輯器那樣將目錄結(jié)構(gòu)放到左邊怎么辦呢辜昵?套用打開文件的方式,各位肯定能想到使用:vsplit
加上目錄名咽斧。vim也提供了一組命令:Sexplore
和:Vexplore
分別在水平和豎直方向打開目錄堪置。
vim自帶的這個目錄管理工具最大的問題是我通過回車鍵從里面選擇一個之后躬存,會在當前窗口打開一個新的緩沖區(qū),并且把目錄樹給覆蓋了舀锨,這個時候我們可以快速按下<Ctrl + Shift>^
來在新打開的緩沖區(qū)和目錄樹之間切換岭洲。
除了瀏覽目錄結(jié)構(gòu)以外,也可以利用該插件進行文件和目錄的創(chuàng)建坎匿、刪除盾剩、修改、重命名等操作替蔬,例如告私,使用%
來創(chuàng)建文件, d
來創(chuàng)建目錄,R
重命名或者移動目錄和文件承桥,使用 D
來刪除一個目錄或者文件
vim自帶的目錄管理工具雖然提供了各種功能驻粟,但是并不是特別好用,我們有眾多的第三方工具可以使用凶异。這個留著等到介紹配置的時候再說蜀撑。一次性講太多了顯得太雜,而且我想用一個懸念留住各位讀者剩彬,也用它來吸引新的讀者酷麦,這也算是我一點小小的私心吧。
寫入文件的一些小技巧
寫入不存在的目錄中
我們在原項目的基礎之上打開一個新的有不存在目錄的文件喉恋,例如:e random/111/test.txt
沃饶。
我們成功的進入了vim的編輯界面,我們也可以進行編輯轻黑,但是一旦執(zhí)行寫命令的時候绍坝,發(fā)現(xiàn)vim會提示目錄不存在。它保存文件需要將文件保存到一個已經(jīng)存在的目錄中苔悦。
我們可以退出vim,然后使用mkdir
來新建目錄椎咧。這個是下下策玖详,之前輸入的內(nèi)容全丟失了,再重新來一遍實在是令人惱火勤讽,不瞞各位蟋座,我之前就是這么干的,所以我養(yǎng)成了脚牍,新打開一個文件就立馬執(zhí)行:w
的習慣向臀。
還記得之前講過怎么在vim中執(zhí)行shell命令嗎,不想退出vim诸狭,又想在保存前創(chuàng)建目錄券膀,可以使用這招, :!mkdir -p random/111
, 然后再執(zhí)行寫入君纫。或者可以靈活的使用在前面介紹的:%h
來快速補全相對路徑
強制以root用戶寫入文件
有時候我們使用vim打開了系統(tǒng)文件芹彬,例如打開了/etc/hosts
文件蓄髓,但是保存的時候意識到忘了加sudo
了,導致無法寫入舒帮,我以前的辦法是先退出会喝,然后再用root權(quán)限打開,這樣就導致之前輸入的內(nèi)容全都丟失了玩郊,幸虧我養(yǎng)成了前面說的那個習慣肢执,打開文件之后的第一步就是執(zhí)行:w
,在學習了vim的命令模式之后,估計各位小伙伴已經(jīng)有思路來解決這個問題了译红。
我們以當前文件內(nèi)容作為命令輸入预茄,配合shell命令,完成临庇。我們知道可以使用tee
來將輸入內(nèi)容寫入文件中反璃。那么我們的命令可以是 :w !sudo tee % > /dev/null
, 我們使用:w
來指定當前緩沖區(qū)的內(nèi)容作為shell命令的輸入。然后配合tee
來將內(nèi)容寫入到%
也就是當前文件假夺。
寫入文件之后vim會檢測到該文件已經(jīng)被外部的程序修改了淮蜈,本例中它被 tee
命令修改了,因此這個時候vim會提示我們文件已經(jīng)被外部程序修改已卷,需要重新載入文件還是使用當前緩沖區(qū)的內(nèi)容梧田。因為這里我們是將緩沖區(qū)內(nèi)容直接覆蓋到文件里面,二者的內(nèi)容是一樣的侧蘸,使用哪個都行裁眯。由于neovim中該操作可能有問題,會報錯讳癌,這里就不演示了穿稳,使用vim的小伙伴可以試試這個方法。后續(xù)我們可以使用擴展插件來解決這個問題晌坤。