很抱歉又拖更了這么久了,在這個新公司我想快速度過試用期,所以大部分的精力主要花在日常工作上面。但是這個系列還是得更新下去,平時只能抽有限的業余時間來準備。這就導致我寫這些文章就慢了一些。
廢話不多說,咱們正式開始有關git相關的配置。這些配置都是根據我自身使用習慣來定義的,不一定符合各位的習慣,各位可以根據自身的習慣來調整
gitsigns
第一個要推薦的插件是 gitsigns
。就像它的名字一樣,該插件可以將最近的更改以標簽的形式展現出來方便我們查看。我們可以使用這樣的代碼進行安裝 use {'lewis6991/gitsigns.nvim' }
。需要注意最新的版本需要 neovim
的版本在0.7
以上。
安裝完成之后我們通過配置 require('gitsigns').setup()
來使用它。這樣我們就可以通過 Gitsigns toggle_signs
來打開或者關閉符號顯示了。
除了采用最基本的符號顯示以外,它還可以對改變位置的行號進行標記以及高亮顯示變更的行。這兩個功能可以通過 Gitsigns toggle_numl和 Gitsigns toggle_linel來打開,打開之后顯示如下:
從圖中可以看到,更改行行號被用綠色顯示了出來并且更改行進行了高亮顯示
另外它還有其他的顯示效果:
它主要的一些顯示功能主要有下面幾個:
- toggle_signs: 顯示變更記錄
- toggle_numl: 顯示變更行號
- toggle_linel:高亮變更的行
- toggle_delete: 顯示被刪除的行,以紅色背景高亮顯示
- toggle_word_diff: 在兩行分別顯示修改前和修改后的內容
- toggle_current_line_blame: 在對應行后面顯示提交記錄
我們將所有的這些功能都打開將得到這么一個效果
是不是看著有點亂?這是我修改了一處的,一旦修改多了看著會更混亂。所以我自己的經驗告訴我在這個buffer里面最好是只打開 signs
、numl
、linel
、current_line_blame
的功能,其他的都關掉。也就是在當前buffer
中只顯示現在的代碼,然后輔助以簡單的符號來顯示哪行是新加的,哪行被刪除了,哪行被修改了,至于修改前是什么樣子的,我可以通過其他方式來查閱。所有內容都在一個buffer
中顯示會比較亂,不利于閱讀代碼。
我們可以通過配置將我們要顯示的內容進行定義,也可以定義使用何種圖標來表示修改記錄。我們采用如下的配置
gitsigns.setup({
signs = {
add = {hl = 'GitSignsAdd' , text = '+', numhl='GitSignsAddNr' , linehl='GitSignsAddLn'},
change = {hl = 'GitSignsChange', text = '│', numhl='GitSignsChangeNr', linehl='GitSignsChangeLn'},
delete = {hl = 'GitSignsDelete', text = '-', numhl='GitSignsDeleteNr', linehl='GitSignsDeleteLn'},
topdelete = {hl = 'GitSignsDelete', text = '-', numhl='GitSignsDeleteNr', linehl='GitSignsDeleteLn'},
untracked = {hl = 'GitSignsAdd', text = '+', numhl='GitSignsAddNr' , linehl='GitSignsAddLn'},
changedelete = {hl = 'GitSignsChange', text = '~', numhl='GitSignsChangeNr', linehl='GitSignsChangeLn'},
},
signcolumn = true, -- Toggle with `:Gitsigns toggle_signs`
numhl = true, -- Toggle with `:Gitsigns toggle_numhl`
linehl = true, -- Toggle with `:Gitsigns toggle_linehl`
word_diff = false, -- Toggle with `:Gitsigns toggle_word_diff`
watch_gitdir = {
interval = 1000,
follow_files = true
},
attach_to_untracked = true,
current_line_blame = false, -- Toggle with `:Gitsigns toggle_current_line_blame`
current_line_blame_opts = {
virt_text = true,
virt_text_pos = 'eol', -- 'eol' | 'overlay' | 'right_align'
delay = 1000,
ignore_whitespace = false,
},
current_line_blame_formatter = '<author>, <author_time:%Y-%m-%d> - <summary>',
sign_priority = 6,
update_debounce = 100,
status_formatter = nil, -- Use default
max_file_length = 40000, -- Disable if file is longer than this (in lines)
preview_config = {
-- Options passed to nvim_open_win
border = 'single',
style = 'minimal',
relative = 'cursor',
row = 0,
col = 1
},
yadm = {
enable = false
},
})
其中大部分都是官方給出的默認配置,我只是在此基礎之上改了 signs在各種狀態下顯示的圖標,以及顯示哪些內容。主要是使用 +
來表示新增、|
來表示修改、-
表示刪除。
除了顯示以外它有一個重要的功能就是在各種修改狀態之間跳轉,例如調用 next_hunk
來跳轉到下一個更改位置。并且它也集成了一些git的操作。我們對常用的操作定義一些快捷鍵
on_attach = function()
vim.api.nvim_set_keymap("n", "<leader>gj", "<cmd>Gitsigns next_hunk<CR>", {silent = true, noremap = true})
vim.api.nvim_set_keymap("n", "<leader>gk", "<Cmd>Gitsigns prev_hhunk<CR>", {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>hs', ':Gitsigns stage_hunk<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('v', '<leader>hs', ':Gitsigns stage_hunk<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>hr', ':Gitsigns reset_hunk<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('v', '<leader>hr', ':Gitsigns reset_hunk<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>hS', '<cmd>Gitsigns stage_buffer<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>hu', '<cmd>Gitsigns undo_stage_hunk<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>hR', '<cmd>Gitsigns reset_buffer<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>hp', '<cmd>Gitsigns preview_hunk<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>hb', '<cmd>lua require"gitsigns".blame_line{full=true}<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>tb', '<cmd>Gitsigns toggle_current_line_blame<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>hd', '<cmd>Gitsigns diffthis<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>hD', '<cmd>lua require"gitsigns".diffthis("~")<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('n', '<leader>td', '<cmd>Gitsigns toggle_deleted<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('o', 'ih', ':<C-U>Gitsigns select_hunk<CR>', {silent = true, noremap = true})
vim.api.nvim_set_keymap('x', 'ih', ':<C-U>Gitsigns select_hunk<CR>', {silent = true, noremap = true})
end
這里是我將官方給出的配置直接粘貼了過來,這堆快捷鍵定義的操作中我最常用的就是 next_hunk
和 prev_hunk
來在各種修改之間進行跳轉。雖然偶爾也用用 diffthis
來顯示差異,但這部分我更喜歡使用我接下來介紹的插件
diffview
這個插件從名字上看就知道是專門用來查看版本差異的插件。與前面介紹的 gitsigns插件相比它有下面幾個優點:
- 它是專門用來顯示差異的,與gitsigns相比,顯示的更加明顯
- 它可以在文件樹中顯示有變更的文件
- 它可以做到任意版本之間的差異對比
-
它可以顯示單個文件的版本提交記錄
DiffviewOpen
它還有另外的功能,可以由各位小伙伴根據官方文檔自行了解。
它的使用方式如下:
-
:DiffviewOpen
顯示當前與上一個版本之間的差異 -
:DiffviewOpen + 版本號
可以顯示當期與某一個特定版本的差異,例如:DiffviewOpen HEAD~2
或者:DiffviewOpen 906ddac317
來查看版本差異
●:DiffviewFileHistory + 文件名
來查看某個文件的版本差異
DiffviewFileHistory
因為它比較簡單,具體的用法就不在這里演示了。
關于它的配置,我自己認為平時很少使用,而且默認的配置已經夠用了,也不太需要花精力為它優化快捷鍵了。
lazygit
lazygit
是一個非常好用的git
客戶端,可以方便的進行提交、回滾、查看變更等git
操作。這里我不推薦什么插件,因為它本身已經很強大了,而且脫離vim
它也可以很好的工作。想來想去只有配置一個快捷鍵來快速打開 lazygit
的終端
不知道各位小伙伴是否還記得之間介紹的 toggleterm
插件,我們將要依賴它來快速啟動
local lazygitterm = Terminal:new({
cmd = 'lazygit',
direction = 'float'
})
function lazygit_toggle()
lazygitterm:toggle()
end
vim.api.nvim_set_keymap("n", "<leader>lg", "<Cmd>lua lazygit_toggle()<CR>", {noremap = true, silent = true})
通過這樣簡單的配置我們已經可以使用 <leader>lg
來快速啟動 lazygit
的客戶端了。
至此我們關于git的配置就完成了。一般我的使用習慣是使用 gitsigns來在更改中進行跳轉,用于提交前或者合并分支前的代碼審查,做到提交和合并都心中有數。在發生bug要回溯代碼并且查看當前與沒有問題的版本之間的差異會用到 diffview插件。在進行提交、合并、回溯等git相關操作時會使用到 lazygit。各位小伙伴也可以根據自己的使用習慣來定制這一部分的配置。