neovimの設定
以前何かのYoutubeなどを参考に設定したNeovimがよくわからなくなってきたので、一度整理する。
とりあえず、Neovimをまっさらな状態に戻し、lazy.nvimだけ入れることにする。
.
├── init.lua
├── lazy-lock.json
└── lua
├── keymaps.lua
├── plugins
└── vim-options.lua
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", -- latest stable release
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
local opts = {}
require("keymaps")
require("vim-options")
local plugins = {
{ import = "plugins" }
}
require("lazy").setup(plugins)
keymaps and vim-options
local keymap = vim.keymap
keymap.set("", "<Space>", "<Nop>")
vim.g.mapleader = " "
vim.g.maplocalleader = " "
-- to normal mode.
keymap.set('i', 'jk', '<ESC>')
-- split window
keymap.set("n", "ss", ":split<Return><C-w>w")
keymap.set("n", "sv", ":vsplit<Return><C-w>w")
-- increment/decrement
keymap.set("n", "+", "<C-a>")
keymap.set("n", "-", "<C-x>")
-- moving
keymap.set("n", "sh", "<C-w>h")
keymap.set("n", "sj", "<C-w>j")
keymap.set("n", "sk", "<C-w>k")
keymap.set("n", "sl", "<C-w>l")
--move tab
keymap.set("n", "gh", "gT")
keymap.set("n", "gl", "gt")
-- open new tab
keymap.set("n", "te", ":tabedit<Return>")
-- move line start/end
keymap.set("n", "<Space>h", "^")
keymap.set("n", "<Space>l", "$")
-- begin command to press ';'
keymap.set("n", ";", ":")
vim.cmd("set expandtab")
vim.cmd("set tabstop=2")
vim.cmd("set softtabstop=2")
vim.cmd("set shiftwidth=2")
vim.g.mapleader = " "
local opt = vim.opt
opt.number = true
opt.cursorline = true
opt.relativenumber = false
-- show invisible character
opt.list = true
opt.listchars = { tab = '>>', trail = '-', nbsp = '+' }
opt.clipboard= 'unnamedplus'
opt.termguicolors = true
Neo-tree
Neo-treeは、ファイルツリーを表示するプラグイン。
lua/plugins
ディレクトリに、neo-tree.lua
を追加する。
以降、プラグインはlua/plugins
ディレクトリに専用のファイルを作成して追加していく。
.
├── keymaps.lua
├── plugins
│ └── neo-tree.lua # 追加
└── vim-options.lua
READMEのMinimal Quickstartにあるように、最低限の設定をneo-tree.lua
に書く。
{
"nvim-neo-tree/neo-tree.nvim",
branch = "v3.x",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
"MunifTanjim/nui.nvim",
-- "3rd/image.nvim", -- Optional image support in preview window: See `# Preview Mode` for more information
}
}
追記が済んだら一度Neovimを再起動する。
:Neotree
コマンドを実行するとファイルツリーが表示される。
Quickstartにあるlonger example をそのままneo-tree.lua
に貼り付けて、一部をlazy.nvim
用に修正する。
- use {
+ return {
"nvim-neo-tree/neo-tree.nvim",
branch = "v3.x",
- requires = {
+ dependencies = {
"nvim-lua/plenary.nvim",
細かい設定についてはそのうちREADMEのArgumentsを読む。
なおプラグインの設定を変更した影響か、なぜかNeovimの文字色などがいい感じになった。
colorscheme
Neovimの色を変えていく。
Trending Neovim Colorschemes を参考に、自分の気に入った色合いを選ぶのが良いと思う。
とりあえず私は以下にのような設定にした。他にも色々試していこうと思う。
return {
'sainnhe/gruvbox-material',
lazy = false,
priority = 1000,
config = function()
-- Optionally configure and load the colorscheme
-- directly inside the plugin declaration.
vim.g.gruvbox_material_enable_italic = true
vim.cmd.colorscheme('gruvbox-material')
end
}
lualine
lualineは、Neovimのステータスライン(エディタ下部のファイル情報の表示)の見た目を変更する。ちなみに現時点(デフォルト?)では以下のような見た目になっている。
return {
'nvim-lualine/lualine.nvim',
dependencies = { 'nvim-tree/nvim-web-devicons' },
config = function()
require('lualine').setup({})
end
}
上記の設定を追加すると、見た目が以下のように変わる。
こちらも他と同様に色々設定できるようだが、一旦はデフォルト状態とする。
ここまで以前自分が設定したプラグインの振り返りつつだったが、以下を参考にプラグインを選択した方が良い気がする。
LSP
LSPはプラグインの名前ではなく、Language Server Protocol
をいうプログラミング言語を解析するための仕組み。
Neovimではデフォルトでこの機能が組み込まれているが、プラグインを利用することでより利便性を高めることができる。(らしい)
LSPを設定することで色々な言語に対して補完などが効くようになるが、ここではReact + TypeScriptでコーディングができるようになることを目標にする。
Before
LSPの設定をせずに、以下のようなカスタムフックを作成しようとすると、何もサジェストされない。これをなんとかする。
やっていく
書き方の正解がいまいちよくわからないのだが、ひとまず、以下の2つのファイルを作成することでts
ファイルのエラーが検出されるようになった。
return {
{
"williamboman/mason.nvim",
config = function()
local mason = require("mason")
mason.setup({})
end
},
{
"williamboman/mason-lspconfig.nvim",
config = function()
local mason_lspconfig = require("mason-lspconfig")
mason_lspconfig.setup({
ensure_installed = {
"ts_ls",
"html",
"cssls",
}
})
end
}
}
return {
"neovim/nvim-lspconfig",
config = function()
local lspconfig = require("lspconfig")
lspconfig.ts_ls.setup({})
lspconfig.html.setup({})
lspconfig.cssls.setup({})
end
}
After
ちなみに、サジェストなどをしたい場合は他のプラグインを入れる必要がありそうなので、とりあえずLSPの設定としてはここまでとする。
参考
completion
オートコンプリートをできるようにする
completion.lua
というファイルを作成して、以下の設定を書く。
-- for completion
return {
{
"hrsh7th/cmp-nvim-lsp",
config = function()
local cmp = require("cmp")
cmp.setup {
sources = {
{ name = "nvim_lsp" }
},
mapping = cmp.mapping.preset.insert({
["<C-j>"] = cmp.mapping.select_next_item(),
["<C-k>"] = cmp.mapping.select_prev_item(),
["<CR>"] = cmp.mapping.confirm { select = true },
}),
}
end
},
-- if remove this plugin, 'cmp' definition above will error.
{
"hrsh7th/nvim-cmp"
}
}
また、lspconfigの設定にオートコンプリート用の設定を追加する
return {
"neovim/nvim-lspconfig",
config = function()
local lspconfig = require("lspconfig")
+ local capabilities = require("cmp_nvim_lsp").default_capabilities()
lspconfig.ts_ls.setup({
+ capabilities = capabilities
})
lspconfig.html.setup({
+ capabilities = capabilities
})
lspconfig.cssls.setup({
+ capabilities = capabilities
})
end
}
サジェストされるようになる。
telescope
telescopeはファイル検索などができるようになる。
return {
'nvim-telescope/telescope.nvim', tag = '0.1.8',
dependencies = { 'nvim-lua/plenary.nvim' },
config = function()
local builtin = require('telescope.builtin')
vim.keymap.set('n', '<leader>ff', builtin.find_files, { desc = 'Telescope find files' })
vim.keymap.set('n', '<leader>fg', builtin.live_grep, { desc = 'Telescope live grep' })
vim.keymap.set('n', '<leader>fb', builtin.buffers, { desc = 'Telescope buffers' })
vim.keymap.set('n', '<leader>fh', builtin.help_tags, { desc = 'Telescope help tags' })
end
}
treesitter
installationページを参考に。
return {
"nvim-treesitter/nvim-treesitter",
build = function()
require("nvim-treesitter.install").update({ with_sync = true })()
end,
config = function()
local configs = require("nvim-treesitter.configs")
configs.setup({
ensure_installed = { "c", "lua", "vim", "vimdoc", "query", "elixir", "heex", "javascript", "html" },
sync_install = false,
highlight = { enable = true },
indent = { enable = true },
})
end
}
とりあえず最低限の部分は動くようになったし、プラグインの追加方法なども理解したのでこれくらいで終わりにする。