Open16

毎日消えるコンテナ環境上でNeovim環境をちょっとずつ整えていく

あおいあおい

Debian環境を使う。前提として、特定のディレクトリ上のファイルは消えないストレージ上にある。

あおいあおい

Neovimのインストール
標準で入っているNeovimは少し古いので、新しいNeovimを入れます。

# Install Neovim
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz
sudo rm -rf /opt/nvim
sudo tar -C /opt -xzf nvim-linux64.tar.gz
あおいあおい

スタートアップスクリプトをこんな感じにする

# Install NeoVim
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz
sudo rm -rf /opt/nvim
sudo tar -C /opt -xzf nvim-linux64.tar.gz

# Install peco
sudo wget "https://github.com/peco/peco/releases/download/v0.5.3/peco_linux_386.tar.gz"
sudo tar xzvf peco_linux_386.tar.gz
cd peco_linux_386
sudo chmod +x peco
sudo cp peco /usr/local/bin

# Install Nodejs for copilot
# installs nvm (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash

# to enable nvm command
source ~/.zshrc

# download and install Node.js (you may need to restart the terminal)
nvm install 20
unset NPM_CONFIG_PREFIX
nvm use 20

git clone https://github.com/github/copilot.vim.git \
  ~/.config/nvim/pack/github/start/copilot.vim
あおいあおい

kubectlもインストールしよう
だんだんNeovim関係なくなってきたけれどまあいいか

#################
# Install kubectl
#################
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg

# If the folder `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
sudo chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg # allow unprivileged APT programs to read this keyring

# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo chmod 644 /etc/apt/sources.list.d/kubernetes.list   # helps tools such as command-not-found to work correctly

sudo apt-get update
sudo apt-get install -y kubectl
あおいあおい

jetpackはこれでインストールできるらしい

curl -fLo ~/.local/share/nvim/site/pack/jetpack/opt/vim-jetpack/plugin/jetpack.vim --create-dirs https://raw.githubusercontent.com/tani/vim-jetpack/master/plugin/jetpack.vim
あおいあおい

init.vimはこんな感じ

" 横に行数を表示する
set number
" 改行時に前の行のインデントを継続する
set autoindent
" tabを半角スペースで挿入する
set expandtab
" 空白文字の可視化
set list
set listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:%
" ターミナルのタイトルをセットする
set title
" タブ幅
set tabstop=4
" オートインデント時にインデントする文字数
set tabstop=2
set shiftwidth=2
set clipboard=unnamed

" カラースキームの設定: tender.vimが必要
" If you have vim >=8.0 or Neovim >= 0.1.5
if (has("termguicolors"))
 set termguicolors
endif
" Theme
syntax enable
colorscheme tender
" set lighline theme inside lightline config
let g:lightline = { 'colorscheme': 'tender' }

" noremap
nnoremap s <Nop>
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl <C-w>l
nnoremap sh <C-w>h
nnoremap ss :<C-u>sp<CR>
nnoremap sv :<C-u>vs<CR>

" vim-jetpackを使った設定
packadd vim-jetpack
call jetpack#begin()
Jetpack 'tani/vim-jetpack', {'opt': 1}
" 下にかわいいステータスラインを表示する
Jetpack 'itchyny/lightline.vim',
" カラースキーム
Jetpack 'jacoborus/tender.vim',
call jetpack#end()
あおいあおい

これらの設定を追記する

" サインカラム(行番号の左側に表示される警告やエラーマーク用のカラム)を常に表示し、2列にする
" デバッグ情報などを見やすくする
set signcolumn=yes:2
" アンドゥ情報をファイルとして保存する
set undofile
" NeoVimのウィンドウタイトルに現在のファイル名やステータスを表示する
set title
" 検索時に大文字小文字を区別しないようにする
set ignorecase
" 検索時にクエリに大文字が含まれている場合は大文字小文字を区別する
set smartcase
" コマンドライン補完の動作を設定する
" longest:full,fullにより、最長マッチの補完を行った後、候補全てを表示する
set wildmode=longest:full,full
" マウスの全機能を有効にする
set mouse=a
" カーソルが画面端に近づいたときに、上下に少なくとも8行の余白を保つ
set scrolloff=8
" 垂直分割(:vsplit)をした際に、新しいウィンドウを現在のウィンドウの右側に開くようにする
set splitright
" システムのクリップボードを使用する
set clipboard=unnamedplus
あおいあおい

Git関連のプラグインを追加する

" Vim上でGitコマンドを実行できるようにする
Jetpack 'tpope/vim-fugitive',
" gitのdiffを表示する
Jetpack 'airblade/vim-gitgutter',
あおいあおい

LSPは以下を参考にする
https://zenn.dev/botamotch/articles/21073d78bc68bf
とりあえずコピペ

" LCP設定
lua << EOF
-- 1. LSP Sever management
require('mason').setup()
require('mason-lspconfig').setup_handlers({ function(server)
  local opt = {
    -- -- Function executed when the LSP server startup
    -- on_attach = function(client, bufnr)
    --   local opts = { noremap=true, silent=true }
    --   vim.api.nvim_buf_set_keymap(bufnr, 'n', 'K', '<cmd>lua vim.lsp.buf.hover()<CR>', opts)
    --   vim.cmd 'autocmd BufWritePre * lua vim.lsp.buf.formatting_sync(nil, 1000)'
    -- end,
    capabilities = require('cmp_nvim_lsp').update_capabilities(
      vim.lsp.protocol.make_client_capabilities()
    )
  }
  require('lspconfig')[server].setup(opt)
end })

-- 2. build-in LSP function
-- keyboard shortcut
vim.keymap.set('n', 'K',  '<cmd>lua vim.lsp.buf.hover()<CR>')
vim.keymap.set('n', 'gf', '<cmd>lua vim.lsp.buf.formatting()<CR>')
vim.keymap.set('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>')
vim.keymap.set('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>')
vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<CR>')
vim.keymap.set('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>')
vim.keymap.set('n', 'gt', '<cmd>lua vim.lsp.buf.type_definition()<CR>')
vim.keymap.set('n', 'gn', '<cmd>lua vim.lsp.buf.rename()<CR>')
vim.keymap.set('n', 'ga', '<cmd>lua vim.lsp.buf.code_action()<CR>')
vim.keymap.set('n', 'ge', '<cmd>lua vim.diagnostic.open_float()<CR>')
vim.keymap.set('n', 'g]', '<cmd>lua vim.diagnostic.goto_next()<CR>')
vim.keymap.set('n', 'g[', '<cmd>lua vim.diagnostic.goto_prev()<CR>')
-- LSP handlers
vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(
  vim.lsp.diagnostic.on_publish_diagnostics, { virtual_text = false }
)
-- Reference highlight
vim.cmd [[
set updatetime=500
highlight LspReferenceText  cterm=underline ctermfg=1 ctermbg=8 gui=underline guifg=#A00000 guibg=#104040
highlight LspReferenceRead  cterm=underline ctermfg=1 ctermbg=8 gui=underline guifg=#A00000 guibg=#104040
highlight LspReferenceWrite cterm=underline ctermfg=1 ctermbg=8 gui=underline guifg=#A00000 guibg=#104040
]]

-- 3. completion (hrsh7th/nvim-cmp)
local cmp = require("cmp")
cmp.setup({
  snippet = {
    expand = function(args)
      vim.fn["vsnip#anonymous"](args.body)
    end,
  },
  sources = {
    { name = "nvim_lsp" },
    -- { name = "buffer" },
    -- { name = "path" },
  },
  mapping = cmp.mapping.preset.insert({
    ["<C-p>"] = cmp.mapping.select_prev_item(),
    ["<C-n>"] = cmp.mapping.select_next_item(),
    ['<C-l>'] = cmp.mapping.complete(),
    ['<C-e>'] = cmp.mapping.abort(),
    ["<CR>"] = cmp.mapping.confirm { select = true },
  }),
  experimental = {
    ghost_text = true,
  },
})
-- cmp.setup.cmdline('/', {
--   mapping = cmp.mapping.preset.cmdline(),
--   sources = {
--     { name = 'buffer' }
--   }
-- })
-- cmp.setup.cmdline(":", {
--   mapping = cmp.mapping.preset.cmdline(),
--   sources = {
--     { name = "path" },
--     { name = "cmdline" },
--   },
-- })
EOF

プラグインは以下

" 以下LCP用プラグイン
Jetpack 'neovim/nvim-lspconfig',
Jetpack 'williamboman/mason.nvim',
Jetpack 'williamboman/mason-lspconfig.nvim',
Jetpack 'hrsh7th/nvim-cmp',
Jetpack 'hrsh7th/cmp-nvim-lsp',
Jetpack 'hrsh7th/vim-vsnip',
あおいあおい

NERDTreeを使ってファイルを開けるようにする
grepってどうやってやるんだろうか。
https://github.com/preservim/nerdtree

nnoremap <leader>n :NERDTreeFocus<CR>
nnoremap <C-n> :NERDTree<CR>
nnoremap <C-t> :NERDTreeToggle<CR>
nnoremap <C-f> :NERDTreeFind<CR>
あおいあおい

ターミナルモードを使えるようにした

" """"""""""""""""""""
" terminal modeの設定
" """"""""""""""""""""
" 下分割でターミナルモードを起動
nnoremap <silent> tx <cmd>belowright new<CR><cmd>terminal<CR>

" ターミナルモードで行番号を非表示
autocmd TermOpen * setlocal norelativenumber
autocmd TermOpen * setlocal nonumber

" ターミナルモードでのキーマッピング
tnoremap <ESC> <C-\><C-n>