tft每日頭條

 > 科技

 > 簡述vim的啟動保存和退出過程

簡述vim的啟動保存和退出過程

科技 更新时间:2024-12-15 15:54:26

在前幾篇文章中,我們從vim各種模式的使用着手介紹了vim如何進行文本本身的編輯。也通過緩沖區列表的介紹了解到了vim是如何進行打開文件的管理。這篇我們将會着眼于文件的打開和保存的基本操作。通過這篇的閱讀,我們可以正式開始嘗試将vim用作代碼編輯器,而不再是像之前那樣作為普通的文本編輯器。

開始前的準備

先來介紹一下vim的工作目錄的概念。我們知道進程都有自己的工作目錄,後續需要操作某個目錄的時候,可以根據這個工作目錄使用相對路徑。這樣的好處是比較靈活,隻要我們的文件按照一定的規則進行組織,後續可以更換程序可執行文件所在路徑而不用更新代碼。

vim自己也有一個工作目錄的概念,可以通過:pwd 來查看當前vim的工作目錄是哪個,一般來說我們是從shell中的哪一個目錄中進入得vim,那麼vim的工作目錄就是哪個。

為了展示vim是如何進行目錄和文件管理的,這裡我準備通過我之前在github上托管的自己的vim配置文件來進行演示,nvim-config 各位小夥伴可以下載進行實驗,以便達到與教程保持相同效果。也可以采用自己的實際項目進行實驗。這裡我多說一句,我并不推薦各位采用這個配置,第一個原因在于這個配置并沒有完全完成,算是一個半成品。第二個原因是這個配置并不能完美地符合各位的工作流和工作習慣。我們學習vim、學習vim的配置主要是為了結合自己的工作習慣和工作流形成一套符合自己習慣的操作方式,并不推薦大家照搬裡面的配置。第三個原因是,在後續我想寫一系列的從0開始配置vim的文章,幫助大家完成自己的配置。

edit命令

打開一個文件可以通過:edit {filename} (或者簡寫為 :e ) 。如果filename采用絕對路徑,那麼打開的就是絕對路徑所對應的文件,如果是相對路徑,那麼就可以打開相對與vim工作目錄的文件。

例如我們想打開項目中的基礎配置文件lua/basic/settings.lua,就可以執行:edit lua/basic/settings.lua。根據我們前面所學的内容,vim的命令模式是支持自動補全的,我們可以通過tab來快速補全路徑

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)1

假設現在已經打開了這個文件,我想打開它同級目錄下的keybinds.lua 來配置快捷鍵的話,我要同樣的輸入:edit lua/basic/keybinds.lua。本來我已經打開了與它同級目錄中的 settings.lua 了,我為了打開keybinds.lua 要輸入這麼大一堆,如果我能以當前settings.lua 的路徑作為相對路徑就好了。

vim 在命令行中提供了一個% 作為活動緩沖區的完整路徑。我們在直接介紹命令模式的時候,%是作為範圍表示當前打開的整個文本。這裡用它作為路徑參數的話,表示的是當前打開文本的完整路徑。

我們可以通過 :edit %<Tab> 來自動顯示整個路徑,然後通過<C-w> 來删除單詞,直到删除到當前目錄,然後再輸入keybinds.lua 就可以了

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)2

用這種方法是簡單了點,但是最後還要删除個文件名,上面我們按了3次<C-w> ,也挺麻煩的。有沒有什麼方法可以直接定位到對應的目錄,讓我直接輸入文件名呢?可以通過 在%的後面加上:h 來自動去掉文件名,即輸入:edit %:h<Tab> 來自動出現對應的目錄。這個功能還是挺有用的,但是需要輸入這麼多内容,為了簡化它你肯定也想到了,要給它配置快捷鍵。這裡還是留到以後再講解它的使用。

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)3

find命令

即使:edit 命令有% 這種操作來簡便輸入,但是在打開其他目錄中的文件時仍然需要輸入完整的目錄和文件名,這個操作也是挺繁瑣的。

操作系統中,有一個PATH 環境變量,輸入命令的時候,他會在PATH 所指定的目錄中查找對應命令。vim中也有類似的概念。

vim中可以使用:find,根據輸入的文件名打開文件。但是使用:find 的前提是配置path 變量。它們合作完成打開文件的操作,與環境變量的用法類似。

可以輸入:set path =./** 将當前工作目錄以及它下面的所有子目錄。然後可以直接輸入:find keybinds.lua 打開這個文件了。

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)4

你可能會問,如果項目中有相同的文件名呢,這個項目裡面沒有同名文件,這裡我們在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> 它會提示所有匹配到的文件。我們可以指定位置的文件打開。

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)5

在我們不斷使用tab來匹配會出現3個匹配項:init.lua、./init.lua、./lua/basic/init.lua。他們分别對應着上面所說的那個匹配的文件,以及其他兩個不同位置的文件。

vim自帶的目錄管理工具

在一般的ide中,左側或者右側會以樹的形式顯示項目中的目錄。vim中也有這樣的功能。它是vim提供的一個名為netrw 插件。

我們打開一個目錄就可以看到,它在窗口中顯示該目錄中的文件結構。它與普通的緩沖區窗口一樣,可以通過motion 操作來移動光标。也支持命令行模式,但是這個緩沖區是不可修改的,也無法保存。在該窗口中,随意選擇一行按下回車,如果選擇的是一個文件,那麼它會打開該文件,如果是目錄那麼窗口中則會進入該目錄并顯示目錄内容。

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)6

我們可以像打開一個普通的文本文件那樣打開一個目錄,二者的區别僅僅在于顯示的内容不同,某些行為不同而已。如果當前已經打開了一個文件,我想再繼續顯示這個目錄呢?相信各位小夥伴已經猜到了,既然可以以打開普通文件的方式打開新的目錄,那麼我使用:edit 命令,在後面加入目錄路徑是不是就可以了。

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)7

經過實驗,确實是這樣呢。看到沒,vim就是這樣,一旦理解了它的邏輯,很多東西自己就能猜到。當然vim也提供了:Explore 專門用來顯示目錄結構。它可以簡寫為:E 後面不加任何東西可以打開當前文件所在目錄,也可以加上路徑打開指定目錄。

如果我們想要像普通編輯器那樣将目錄結構放到左邊怎麼辦呢?套用打開文件的方式,各位肯定能想到使用:vsplit 加上目錄名。vim也提供了一組命令:Sexplore和:Vexplore 分别在水平和豎直方向打開目錄。

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)8

vim自帶的這個目錄管理工具最大的問題是我通過回車鍵從裡面選擇一個之後,會在當前窗口打開一個新的緩沖區,并且把目錄樹給覆蓋了,這個時候我們可以快速按下<Ctrl Shift>^ 來在新打開的緩沖區和目錄樹之間切換。

除了浏覽目錄結構以外,也可以利用該插件進行文件和目錄的創建、删除、修改、重命名等操作,例如,使用% 來創建文件, d 來創建目錄,R 重命名或者移動目錄和文件,使用 D 來删除一個目錄或者文件

vim自帶的目錄管理工具雖然提供了各種功能,但是并不是特别好用,我們有衆多的第三方工具可以使用。這個留着等到介紹配置的時候再說。一次性講太多了顯得太雜,而且我想用一個懸念留住各位讀者,也用它來吸引新的讀者,這也算是我一點小小的私心吧。

寫入文件的一些小技巧寫入不存在的目錄中

我們在原項目的基礎之上打開一個新的有不存在目錄的文件,例如:e random/111/test.txt。

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)9

我們成功的進入了vim的編輯界面,我們也可以進行編輯,但是一旦執行寫命令的時候,發現vim會提示目錄不存在。它保存文件需要将文件保存到一個已經存在的目錄中。

我們可以退出vim,然後使用mkdir 來新建目錄。這個是下下策,之前輸入的内容全丢失了,再重新來一遍實在是令人惱火,不瞞各位,我之前就是這麼幹的,所以我養成了,新打開一個文件就立馬執行:w 的習慣。

還記得之前講過怎麼在vim中執行shell命令嗎,不想退出vim,又想在保存前創建目錄,可以使用這招, :!mkdir -p random/111, 然後再執行寫入。或者可以靈活的使用在前面介紹的:%h 來快速補全相對路徑

簡述vim的啟動保存和退出過程(vim從嫌棄到依賴12)10

強制以root用戶寫入文件

有時候我們使用vim打開了系統文件,例如打開了/etc/hosts 文件,但是保存的時候意識到忘了加sudo 了,導緻無法寫入,我以前的辦法是先退出,然後再用root權限打開,這樣就導緻之前輸入的内容全都丢失了,幸虧我養成了前面說的那個習慣,打開文件之後的第一步就是執行:w,在學習了vim的命令模式之後,估計各位小夥伴已經有思路來解決這個問題了。

我們以當前文件内容作為命令輸入,配合shell命令,完成。我們知道可以使用tee 來将輸入内容寫入文件中。那麼我們的命令可以是 :w !sudo tee % > /dev/null, 我們使用:w 來指定當前緩沖區的内容作為shell命令的輸入。然後配合tee 來将内容寫入到% 也就是當前文件。

寫入文件之後vim會檢測到該文件已經被外部的程序修改了,本例中它被 tee 命令修改了,因此這個時候vim會提示我們文件已經被外部程序修改,需要重新載入文件還是使用當前緩沖區的内容。因為這裡我們是将緩沖區内容直接覆蓋到文件裡面,二者的内容是一樣的,使用哪個都行。由于neovim中該操作可能有問題,會報錯,這裡就不演示了,使用vim的小夥伴可以試試這個方法。後續我們可以使用擴展插件來解決這個問題。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved