Telescope, Nvim-tree và Bufferline là gì ❓

Để có được một IDE hoàn chỉnh, đủ dùng, thì 1 vài tính năng cần thiết cần phải có là: hỗ trợ tab, hỗ trợ menu sidebar, hỗ trợ tìm kiếm file.

  • telescope.nvim: hỗ trợ việc tìm kiếm file theo tên, tìm kiếm nội dung bên trong file, ...
  • nvim-tree.lua: hỗ trợ hiển thị cấu trúc thư mục, tạo mới file, folder
  • bufferline.nvim: hỗ trợ hiển thị file theo dạng tab

Để bắt đầu cài đặt, bên nên đảm bảo là đã làm theo hướng dẫn của tôi ở bài viết trước

Nhắc lại chút về cách cài đặt plugin

Có thể các bạn vẫn chưa quen về cách cài đặt plugin trong Neovim. Nên tôi sẽ liệt kê thứ tự cần thực hiện có bổ sung thêm plugin hoặc thay đổi options.

Bước Lệnh Mô tả
1 :w Lưu lại thay đổi
2 :q Thoát neovim
3 $ nvim Khởi động lại nvim

Các bạn có thể kết hợp lệnh cùng 1 lúc nhé. VD: thay vì viết :w:q lần lượt, thì các bạn có thể viết :wq.

Bắt đầu cài đặt thôi 🚀

Cài đặt telescope.nvim

Cài đặt telescope
Cài đặt telescope (Xem ảnh gốc)

Như đã nói ở trên, plugin này hỗ trợ việc tìm kiếm file theo tên hoặc nội dung bên trong file. Nên tôi sẽ lựa chọn nó làm plugin đầu tiên để cài đặt.

Để tăng tốc độ tìm kiếm của Telescope ta cần phải cài đặt 1 cái tool bên ngoài nữa thông qua scoop. Với scoop thì bạn không cần chạy trong chế độ Admin đâu nhé 🌝

$ scoop install ripgrep

Tiếp theo, mở /lua/plugins.lua ra và thêm đoạn code sau

-- /lua/plugins.lua

require("lazy").setup({
    -- ......
    {
        'nvim-telescope/telescope.nvim',
        branch = '0.1.x',
        dependencies = {
            -- đây là plugin bổ sung thêm để hỗ trợ chức năng của telescope
            'nvim-lua/plenary.nvim'
        }
    },
})

Giờ các bạn khởi động lại Neovim và đợi lazy.nvim cài đặt xong là có thể sử dụng được.

Sử dụng telescope.nvim

Để sử dụng các bạn mở Neovim và gõ lệnh

:Telescope find_files

Các bạn có thể xem danh sách câu lệnh bằng cách, gõ :Telescope, ấn phím <Space> và sau đó ấn <Tab>. Kết quả sẽ hiển thị giống như hình bên dưới

Telescope
Telescope (Xem ảnh gốc)

Cài đặt keymap (phím tắt) cho telescope

Sử dụng qua một chút chắc các bạn thấy oải đúng không 😆. Kiểu cứ mỗi lần lại phải gõ lệnh, tìm tìm, mệt.

Thế nên giờ tôi sẽ hướng dẫn các bạn cài đặt phím tắt, đảm bảo sẽ nhanh gọn hơn nhiều.

Tạo mới file /plugin/telescope.lua nhé. Nó sẽ tự load sau file init.lua, cái này tôi nhắc lại thôi.

-- /plugin/telescope.lua

local status, telescope = pcall(require, 'telescope')
if not status then return end

-- load cái thư viện builtin của telescope ra
-- trong này có 1 tá các function cho chúng ta lựa chọn
local builtin = require('telescope.builtin')

-- gõ `;f` ở chế độ Normal để hiển thị danh sách file
vim.keymap.set('n', ';f', builtin.find_files, {})

-- tương tự, gõ `;r` để tìm kiếm nội dung trong file
vim.keymap.set('n', ';r', builtin.live_grep, {})

-- cứ như thế nhé, các bạn có thể thay đổi kí tự tùy thích
vim.keymap.set('n', ';fb', builtin.buffers, {})
vim.keymap.set('n', ';gbr', builtin.git_branches)
vim.keymap.set('n', ';gst', builtin.git_status)
vim.keymap.set('n', ';gcm', builtin.git_commits)
vim.keymap.set('n', ';xx', builtin.diagnostics)

Các sử dụng cơ bản như sau, tôi lấy ví dụ khi bạn ấn ;f

  • ngay khi mở lên, bạn có thể nhập tên file để tìm kiếm luôn
  • ấn Enter để chọn file,
  • ấn Esc để thoát chế độ nhập
  • ấn i để quay trở lại chế độ nhập liệu
  • hoặc ấn Esc lần nữa để thoát hẳn Telescope

Cách sử dụng cơ bản
Cách sử dụng cơ bản (Xem ảnh gốc)

Cài đặt nvim-tree.lua

Cài đặt nvim-tree
Cài đặt nvim-tree (Xem ảnh gốc)

Plugin tiếp theo, ta sẽ cài đặt trong bài viết này là nvim-tree. Tiếp tục mở file /lua/plugins.lua và thêm vào đoạn code sau

-- /lua/plugins.lua

require("lazy").setup({
    -- .....
    {
        'nvim-tree/nvim-tree.lua',
        dependencies = {
            -- plugin này hỗ trợ nvim-tree hiển thị icon 
            -- tương ứng với từng loại file
            "nvim-tree/nvim-web-devicons"
        }
    },
})

Tiếp theo, ta lại tạo thêm 1 file plugin/nvim-tree.lua để gọi nó hoạt động.

-- /plugin/nvim-tree.lua

local status, nvimtree = pcall(require, 'nvim-tree')
if not status then return end

local function on_attach(bufnr)
  -- chúng ta sẽ cài đặt keymap cho nvim-tree ở mục bên dưới 
end

nvimtree.setup({
    on_attach = on_attach,
})

Khởi động lại Neovim để cài đặt nvim-tree, sau đó ta sẽ bắt đầu cài đặt keymap để tiện sử dụng hơn.

Cài đặt keymap cho nvim-tree.lua

Các bạn bổ sung tiếp đoạn code bên dưới vào file /plugin/nvim-tree.lua nhé.

-- /plugin/nvim-tree.lua
-- ....

local function on_attach(bufnr)
  local api = require('nvim-tree.api')

  local function opts(desc)
    return { desc = 'nvim-tree: ' .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
  end

 
  -- Ấn `Ctrl + ]` để thay đổi thư mục root
  vim.keymap.set('n', '<C-]>', api.tree.change_root_to_node,          opts('CD'))

  -- Ấn `Enter` để edit 
  vim.keymap.set('n', '<CR>',  api.node.open.edit,                    opts('Open'))
  vim.keymap.set('n', '<Tab>', api.node.open.preview,                 opts('Open Preview'))

  -- Ấn `a` để tạo file
  vim.keymap.set('n', 'a',     api.fs.create,                         opts('Create'))
    -- Copy file or folder
  vim.keymap.set('n', 'c',     api.fs.copy.node,                      opts('Copy'))
    -- Delete file or folders
  vim.keymap.set('n', 'd',     api.fs.remove,                         opts('Delete'))
  vim.keymap.set('n', 'e',     api.fs.rename_basename,                opts('Rename: Basename'))
  vim.keymap.set('n', 'p',     api.fs.paste,                          opts('Paste'))
  vim.keymap.set('n', 'r',     api.fs.rename,                         opts('Rename'))
  vim.keymap.set('n', 'R',     api.tree.reload,                       opts('Refresh'))

  vim.keymap.set('n', 'W',     api.tree.collapse_all,                 opts('Collapse'))
  vim.keymap.set('n', 'A', api.tree.expand_all, opts('Expand All'))

  vim.keymap.set('n', 'x',     api.fs.cut,                            opts('Cut'))
  vim.keymap.set('n', 'y',     api.fs.copy.filename,                  opts('Copy Name'))
  vim.keymap.set('n', 'Y',     api.fs.copy.relative_path,             opts('Copy Relative Path'))

end

Có một số kí tự đặc biệt ở trong đoạn code trên như sau:

  • <C-]> : tổ hợp phím này nghĩa là Ctrl + ]
  • <CR> : tương ứng với phím Enter

Gõ lệnh :h key-notation để xem danh sách kí tự dành cho các phím đặc biệt.

Kí tự đại diện
Kí tự đại diện (Xem ảnh gốc)

Cài đặt keymap để bật/tắt nvim-tree

Nốt cài đặt này thôi là ta có thể sử dụng rồi nhé. Các bạn mở file /lua/map.lua và đặt đoạn code sau vào.

-- /lua/map.lua

local keymap = vim.keymap

-- Ấn <Space> + e để bật/tắt `nvim-tree` trong chế độ Normal
keymap.set('n', '<leader>e', ':NvimTreeToggle<cr>')

Giờ thì đóng neovim và mở lại để trải nghiệm nhé 😍

Cài đặt bufferline.nvim

Cài đặt bufferline
Cài đặt bufferline (Xem ảnh gốc)

Plugin cuối cùng của bài viết này, các bạn bổ sung thêm đoạn code sau nhé

-- /lua/plugins.lua
require("lazy").setup({
    -- ....
    {
        'akinsho/bufferline.nvim',
        version = "*",
        dependencies = 'nvim-tree/nvim-web-devicons'
    },
})

Tiếp theo, như mọi khi, tạo file /plugin/bufferline.lua để bắt nó hoạt động

-- /plugin/bufferline.lua

local status, bufferline = pcall(require, 'bufferline')
if not status then return end

-- Tab pages
bufferline.setup {
    options = {
        offsets = {
            {
                -- đoạn cài đặt này cho phép Tab 
                -- tự động thụt vào khi Nvim-tree được mở ra
                filetype = "NvimTree",
                text = "File Explorer",
                text_align = "center",
                separator = true
            }
        },
        buffer_close_icon = "×"
    }
}

Các bạn lặp lại việc tắt/bật neovim để plugin được cài đặt là ok rồi nhé. Giờ ta có thể thử dùng Telescope để mở các file khác nhau, các bạn sẽ thấy tab được hiển thị.

Khó khăn khi sử dụng nvim-treebufferline

Do hướng dẫn này cũng khá dài nên tôi chưa hướng dẫn các bạn một số cài đặt keymap dành cho 2 plugin trên.

Với nevim-tree nếu các bạn đang muốn di chuyển con trỏ sang file thì bạn có thể sử dụng phím Ctrl + W + k hoặc Ctrl + W + ArrowRight

Với bufferline nếu bạn muốn chọn tab khác, thì có thể click chuột vào file đó. Tuy nhiên, đây ko phải là cách sử dụng neovim đúng đắn.

Bạn có thể sử dụng ;f của telescope để chọn file hoặc cài đặt keymap theo những câu lệnh mà bufferline cung cấp như ảnh dưới.

Bufferline commands
Bufferline commands (Xem ảnh gốc)

Kết

Như vậy, trong bài viết này chúng ta đã cài đặt thêm được 1 số plugins chính. Ở bài viết tiếp theo, tôi sẽ hướng dẫn các bạn cài đặt keymap để giúp quá trình làm việc với Neovim mượt mà hơn.

Hi vọng hướng dẫn này dễ giúp các bạn hiểu thêm về cách cài đặt plugin và keymap trong Neovim. Hẹn gặp lại các bạn ở bài viết tiếp theo.