aptpod Advent Calendar 2024 12月24日の記事を担当します、 intdashグループの宮内です。
先日、筆者のグループ内で「開発環境の紹介」というテーマで意見交換を行いました。 グループ内ではソフト/ハードともに他人の開発環境に興味がある人が多いようで、 とても盛り上がりました。
ただ、その際に、筆者はNeovimを紹介したのですが、時間の都合上全然紹介しきれませんでした。 今回はこの場を借りて、その時の不完全燃焼感を払拭すべく、閑話休題的な形で、 筆者のNeovimについて紹介していきたいと思います。 ちなみに、グループ内はVSCode使いが多いです。
対象読者
- これからNeovimを触ってみようと思っている人
- Neovimのおすすめのプラグインを知りたい人
- Neovimって一体どんなことができるのか知りたい人
筆者の開発環境について
Neovimは様々なことができるので他のツールとの棲み分けはとても重要です。 ですから、まずNeovimを語る前に、筆者の開発環境について簡単に紹介します。
筆者はintdashミドルウェア開発のサーバーサイドを担当しています。 業務内では下記の言語やファイルを扱うことが多いです。
- Golangのソースコード
- Pythonのソースコード
- (簡単な)シェルスクリプト
- yamlファイル(openapi.yaml、ci設定など)
- Docker関連(Dockerfile、compose.yamlなど)
- マークダウン
また、エディタを含め次のような環境で開発を行っています。
- Wezterm(端末エミュレータ。Rust製で実行環境を選ばないのが気に入っている。)
- tmux(ターミナルマルチプレクサ。ターミナル内で複数のセッションを管理できる。)
- Neovim
- zsh
さらに、普段はMacから UbuntuへSSH接続し、開発業務は基本的にUbuntu上で行っています。 WeztermはMacにインストールし、あとはさっさとsshでUbuntuの中に入って引きこもり作業している形です。
- Weztermを開く
- sshでUbuntuへ入る
- tmuxでセッションを開く(過去のものがあれば作業中のセッションに入る)
- tmuxペインを設定しNeovimで作業
本当はNeovim以外にも語りたいことはあるのですが今回はNeovimに絞って紹介します。
設定のベース
Neovimの大きな魅力の一つは、そのカスタマイズ性の高さにあります。しかしその反面、初期状態では機能が少なく、効率的に使い始めるには設定が必要です。 その課題を解決するために、スターターキットとして使えるテンプレートが多数公開されています。例えば、以下のようなものがあります。
それぞれ特徴があるので、自分の好みに合わせて選ぶと良いと思います。
カスタマイズはどのテンプレートでも可能ですが、筆者は「設定がほどよく薄く、自由度が高い」という理由でkickstart.nvimを選んでいます。
kickstart.nvimの運用については、公式のREADME.mdに記載がありますが、筆者は以下の手順で管理しています:
リポジトリのフォーク 自分のGitHubリポジトリにフォークし、カスタマイズや運用を行いやすくしています。
dotfilesでの管理 フォークしたkickstart.nvimをdotfilesリポジトリ内でsubmoduleとして管理しています。
定期的な同期 フォーク元のリポジトリから最新の変更を定期的にマージし、テンプレートをメンテナンスしています。
以下は具体的な手順です。GitHub CLIを使用した手順です。:
# 最初にkickstart.nvimをフォーク gh repo fork nvim-lua/kickstart.nvim # dotfilesリポジトリにsubmoduleとして追加 cd /path/to/dotfiles git submodule add git@github.com:<ユーザー名>/kickstart.nvim.git ./.config/nvim # フォーク元のリポジトリと定期的に同期 gh repo sync <ユーザー名>/kickstart.nvim
プラグイン紹介
筆者はNeovimのプラグインを現在 101
個使用しています。
流石にすべてを紹介することはできないので、ここではメインに使用しているプラグインとその設定についてと、一部おもしろいプラグインを紹介します。
それぞれカテゴリごとに紹介します。
プラグイン管理
lazy.nvim
プラグイン管理ツールです。現在、Neovimでのプラグイン管理のデファクトスタンダードとなっている感があります。 例えば、プラグインの読み込みを必要なタイミングに最適化することで、起動速度を速く保つことが可能です。設定も簡単で、多くのユーザーに支持されています。 kickstart.nvimにも組み込まれているのでそのまま使用しています。
mason.nvim & mason-lspconfig
LSP(Language Server Protocol)、DAP(デバッグ)、Formatter、Linterのツールを簡単に管理するためのプラグインです。
MasonInstall
コマンドを使用すると、ツールが~/.local/share/nvim/mason/bin/
にインストールされ、Neovim内で使用可能になります。
以下のプラグインと連携すると、さらに便利に使えます。 README.md
にある内容です。:
- LSP:
lspconfig
&mason-lspconfig.nvim
- DAP:
nvim-dap
&nvim-dap-ui
- Linters:
null-ls.nvim
ornvim-lint
- Formatters:
null-ls.nvim
orformatter.nvim
筆者の設定例では、Formatterとしてconform.nvim
を使用し、Linterにはnone-ls.nvim
(null-ls.nvim
のフォーク)を採用しています。
mason-tool-installer.nvim
このプラグインを使用すると、新しい環境でも再現性を持って同じツールセットをインストールできます。 kickstart.nvimにも雛形設定が含まれているため、簡単に導入できます。
以下はMasonでインストールしているツール一覧と、その設定コードです:
require('mason').setup() -- Masonでインストールするツールを指定 local ensure_installed = { 'stylua', -- Luaのフォーマッタ 'gopls', -- Golangの言語サーバー 'prettier', -- JS/TSのフォーマッタ 'pyright', -- Pythonの言語サーバー -- 省略 ... } require('mason-tool-installer').setup { ensure_installed = ensure_installed }
コーディング
nvim-cmp
nvim-cmp
は、Neovimでのコード補完を提供するプラグインです。コード補完系のプラグインはいくつかありますが、nvim-cmp
はその拡張性と安定性から多くのユーザーに支持されています。
筆者はkickstart.nvim
の設定に含まれていたこともあり、そのままnvim-cmp
を使用しています。
以下は、筆者が使用しているnvim-cmp
の補完ソース一覧です。特に珍しいものはありませんが、必要な補完を網羅しています:
- L3MON4D3/LuaSnip
- saadparwaiz1/cmp_luasnip
- hrsh7th/cmp-nvim-lsp
- hrsh7th/cmp-path
- hrsh7th/cmp-nvim-lsp
- hrsh7th/cmp-nvim-lsp-signature-help
- hrsh7th/cmp-buffer
- hrsh7th/cmp-path
- hrsh7th/cmp-cmdline
- hrsh7th/cmp-calc
- hrsh7th/cmp-emoji
- onsails/lspkind.nvim
- petertriho/cmp-git
他にも nvim-cmp
のソースはたくさんあるので探してみると面白いでしょう。
conform
フォーマッタです。kickstart.nvim
に組み込まれているものをそのまま使用しています。
デフォルト設定では保存時に自動フォーマットが有効になっていますが、無効化する場合は設定を変更する必要があります。
Recipe command-to-toggle-format-on-save で紹介されている内容を基本に
kickstart用には下記のように読み替えて設定します:
-- オプション opts = { format_on_save = function(bufnr) -- Disable with a global or buffer-local variable if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then return end - 省略 end, }, -- config関数 config = function(_, opts) vim.api.nvim_create_user_command('FormatDisable', function(args) if args.bang then -- FormatDisable! will disable formatting just for this buffer vim.b.disable_autoformat = true else vim.g.disable_autoformat = true end end, { desc = 'Disable autoformat-on-save', bang = true, }) vim.api.nvim_create_user_command('FormatEnable', function() vim.b.disable_autoformat = false vim.g.disable_autoformat = false end, { desc = 'Re-enable autoformat-on-save', }) require('conform').setup(opts) end
none-ls
none-ls.nvim
はnull-ls.nvim
のフォークで、 diagnostic, codeaction, formatting, completion, hover の設定が可能です。
ですが、Lspの設定やフォーマッタの設定と重複するものがあるので、筆者はdiagnosticとcodeactionのみを使用しています。
また、インストールについてはMasonと統合するプラグインがあるので、あまり活用できていませんが合わせて使用しています。
config = function() local null_ls = require 'null-ls' null_ls.setup { sources = { null_ls.builtins.diagnostics.golangci_lint, null_ls.builtins.diagnostics.hadolint, null_ls.builtins.diagnostics.rstcheck, null_ls.builtins.diagnostics.markdownlint.with { args = { '--stdin', '-c', vim.fn.expand '$HOME/.markdownlintrc' }, }, null_ls.builtins.diagnostics.sqlfluff.with { extra_args = { '--dialect', 'postgres' }, -- change to your dialect }, require 'none-ls.diagnostics.ruff', null_ls.builtins.code_actions.refactoring, null_ls.builtins.code_actions.gomodifytags, }, } require('mason-null-ls').setup {} end
リファレンスとしては「BUILTINS」を良く参照するので紹介しておきます。
ThePrimeagen/refactoring.nvim
refactoring.nvim
は、様々なリファクタリング操作をサポートするNeovim用プラグインです。関数抽出や変数リネームといった一般的なリファクタリングに加え、デバッグプリント機能が非常に便利です。
筆者は、特にデバッグプリントの挿入と削除をよく利用しています。下記の設定例では、次の操作を簡単に行えます:
<leader>rp
:現在行の上にデバッグプリントを挿入。<leader>rd
:選択した変数のデバッグプリントを挿入。<leader>rc
:挿入済みの全てのデバッグプリントを削除。
以下は設定例です:
vim.keymap.set('n', '<leader>rp', function() require('refactoring').debug.printf { below = false } end) vim.keymap.set({ 'x', 'n' }, '<leader>rd', function() require('refactoring').debug.print_var() end) vim.keymap.set('n', '<leader>rc', function() require('refactoring').debug.cleanup {} end)
例えば、以下のようなコードに対して a
をデバッグプリントしてみます。:
func add(a int, b int) int { return a + b }
a
を選択肢 <leader>rd
を押すと、次のようなデバッグプリントが挿入されます:
func add(a int, b int) int { // __AUTO_GENERATED_PRINT_VAR_START__ fmt.Println(fmt.Sprintf("add a: %v", a)) // __AUTO_GENERATED_PRINT_VAR_END__ return a + b }
<leader>rp
を使うと、次のようなデバッグプリントが挿入されます。
func add(a int, b int) int { // __AUTO_GENERATED_PRINTF_START__ fmt.Println("add 1") // __AUTO_GENERATED_PRINTF_END__ return a + b }
Git
gitsign
gitsign
は、NeovimでGitの変更内容を視覚的に表示し、操作を補助するプラグインです。
このプラグインはkickstart.nvim
に含まれているため、特別な設定は不要です。
kickstart.nvim
では ]c
と [c
で変更箇所の行き来が可能で、 <Leader>h
に hunk を操作するキーバインドが設定されています。
筆者はgitの操作自体は後述する lazygit
で行うことが多いので、メインで使っているのは、変更箇所の移動です。
git-blame.nvim
git-blame.nvim
は、特定の行が誰によって、いつ変更されたのかを表示するプラグインです。
このプラグインを有効にすると、現在編集中の行に変更履歴が表示され、コードレビューや変更理由の確認に役立ちます。
有効にすると、下記のようにBlameがコード上に表示されます。
公式リポジトリのスクリーンショットが分かりやすいため、興味のある方はこちらをご覧ください: 公式リポジトリ
diffview.nvim
ソースコード編集中にそのファイルの履歴とか、mainブランチとの差分とか見たいときありますよね。 そんなときに活躍するのがこのプラグインです。 マージツールとしても使用できます。
筆者は特に特殊な設定をしておらずデフォルトで使用しています。
あとはマージツールとして使うこと多いのと、下記のコマンドは良く実行します。:
:DiffviewOpen <比較先ブランチなど>
:DiffviewOpen <比較先ブランチなど> -- %
:DiffviewFileHistory
:現在のファイルの変更履歴を表示。
lazygit.nvim
lazygit.nvim
は、Neovim内でlazygit
を使用できるプラグインです。このプラグインを導入することで、ターミナルに切り替えることなくGit操作を行うことができます。
筆者は以前、vim-fugitive
やNeoGit
なども使用していたのですがが、シェル上での操作と統合が出来ず、
シェル上ではlazygit
を使うため、このプラグインを選びました。操作を統一できる点が非常に便利です。
後述しますが toggleterm
を使用して開くこともできるようです。どちらでもさほど大きな差はないと思います。
lazygit
からファイルを編集したり、コミットメッセージをNeovimで書くには、以下の設定を.bashrc
に追加します:
#### NVIM REMOTE if [ -n "$NVIM" ]; then alias nvim=nvr -cc split --remote-wait +'set bufhidden=wipe' fi if [ -n "$NVIM" ]; then export VISUAL="nvr -cc split --remote-wait +'set bufhidden=wipe'" export EDITOR="nvr -cc split --remote-wait +'set bufhidden=wipe'" else export VISUAL="nvim" export EDITOR="nvim" fi
この設定により、Neovim内でlazygit
を使用してもファイル編集やコミットメッセージ作成がシームレスに行えます。
lazygit
の設定では、以下を追記します:
os: editPreset: "nvim-remote"
こちらの設定をすれば、プラグインのREADMEのファイル編集設定を変更する必要はない(はず)です。
ただし、筆者の環境だと下記の不具合の現象に遭遇しています。四角い領域が出現し、削除ができなくなります。
現象は「Blank window overriding code after opening lazygit.nvim on start screen #134」 に近いです。 コメントにある内容も読んだのですがうまく解消されず、時間があるときに調整してみようと思っています。
検索置換
telescope.nvim
telescope.nvim
は、Neovimで効率的にファイル、テキスト、バッファ、Git履歴などを検索するためのファジーファインダープラグインです。
筆者は以前fzf
のプラグインを使用していましたが、telescope.nvim
は仕組み上拡張機能が作りやすく、他のプラグインとの連携も豊富なため、こちらに切り替えました。
以下は筆者が使っているtelescope.nvim
の拡張機能です:
名前 | 説明 |
---|---|
telescope-all-recent.nvim | find_files やgit_files など通常の選択フィルターに対してスコアリングされた順序で選択できるようになります。 |
telescope-fzf-native.nvim | fzfの表現を統合。fzfユーザーには特に便利です。 |
telescope-live-grep-args.nvim | live_grep に対して、ripgrepのオプションを指定できるようになります。 |
telescope-recent-files | 最近開いたファイル順のフィルターです。 |
特に telescope-all-recent.nvim
はシームレスに統合でき、無意識に恩恵を受けることができるので個人的な感想ですが筋が良いように思います。
ドキュメントにも書いてありますが、次のようにTelescopeのキーバインドを関数で指定する必要があるのでその点は注意しましょう。
vim.keymap.set('n', '<leader>sf', function() require('telescope.builtin').find_files() end, { desc = '[S]earch [F]iles' })
grug-far.nvim
検索置換のプラグインです。一括置換で重宝します。
似た操作感で nvim-spectre というプラグインもあります。
好みで選ぶと良いと思いますが、筆者はnvim-spectreの検索ペインの操作感にどうしてもなれることができず、grug-far.nvim
を使用しています。
以前はQuickfixと「quickfix-reflector.vim」を利用して置換を行っていましたが、手数が多いことが少し気になり、 このプラグインに落ち着きました。
デフォルト設定で快適に使用できます。おすすめです。
text-case.nvim
text-case.nvim
は、テキストをCamelCase、SnakeCaseなどに変換しつつ、またそれらの賢い置換も可能にするプラグインです。
例:Subs /abc def/ghi jkl/
とコマンドを実行すると、AbcDef
といった文字列もGhiJkL
に変換します。
類似プラグインとしてtpope/vim-abolishもありますが、筆者は現在両方を試しています:
vim-abolish
では複数形の置換など特有のルールも持っているため、置換機能としては vim-abolish
のほうが高度な印象です。
筆者は状況に応じてどちらを使うか選定中です。
その他
overseer.nvim
overseer.nvim
は多機能なタスクランナーで、ビルド、テストなどの開発内のタスクをNeovim内で管理できます。
筆者は以前、vim-dispatch
やquickrun
を利用していましたが、Neovim環境に最適なタスクランナーを探している中でこのプラグインを見つけました。
いくつかタスクを登録してはいますが、もう少しカジュアルに使用できるように時間があるときに拡張したいと思っています。
公式ドキュメントも充実しており、チュートリアルやレシピが提供されています:
筆者は vim-dispatch
の :Make
はよく使っていたので、そのレシピがあったのはとても助かりました。:
toggleterm.nvim
toggleterm.nvim
は、Neovim内でターミナルウィンドウを簡単に開き、切り替えたり、閉じたりできるプラグインです。
筆者は普段tmux
を使っていますが、「tmuxを開くほどではないちょっとした操作」にはこのプラグインを利用しています。
以下は筆者の設定例です。ターミナルの表示・非表示を<C-z>
で切り替え、<leader>ld
でlazydocker
を起動します:
config = function() require('toggleterm').setup { open_mapping = [[<C-z>]], direction = 'horizontal', size = 20, } local lazydocker = require('toggleterm.terminal').Terminal:new { cmd = 'lazydocker', hidden = true, direction = 'float', } function LazydockerToggle() lazydocker:toggle() end ... 他の設定 vim.api.nvim_set_keymap('n', '<leader>ld', '<cmd>lua LazydockerToggle()<CR>', { noremap = true, silent = true }) end
tmux
との棲み分けについて、筆者は以下のように使い分けています:
- toggleterm.nvim:同一プロジェクト内でシェル操作をする際に使用。
- tmux:別プロジェクトの操作や、長時間のターミナルセッションを管理する場合に使用。
普段はdockerを使った開発をしているので、いつでもさっとコンテナの状態を見れる、操作できるというのは体験としてとても心地よいです。
dashboard-nvim
Neovim起動時に表示されるダッシュボードをカスタマイズできるプラグインです。筆者は、曜日ごとに変わるバナーを設定しています。
以下は筆者が登録しているショートカットの設定例です: ダッシュボード上で初期の操作のショートカットが簡単にできるため、特に「最初にやることが決まっている人」におすすめです。 筆者はだいたい決まっているので下記を登録しています。
config = function() require('dashboard').setup { theme = 'hyper', config = { week_header = { enable = true, }, project = { enable = false, }, shortcut = { { desc = 'Update', group = '@property', action = 'Lazy update', key = 'u' }, { icon = '', icon_hl = '@variable', desc = 'Files', group = 'Label', action = 'Telescope git_files', key = 'f', }, { desc = 'Memo', action = 'Telekasten', key = 'm', }, { desc = 'dotfiles', action = 'e ~/dotfiles/README.md', key = 'd', }, }, }, } end
rest.nvim
rest.nvim
は、Neovim内でHTTPリクエストを実行できるプラグインです。
筆者は以前vim-rest-console
を使用していましたが、出力が整形されない問題があったため、こちらに移行しました。
特徴としては次のようなものが上げられます:
- 環境変数を簡単に切り替え可能(
Telescope
連携)。 - JetBrainsのHTTP Syntaxをサポート。
- 安定した整形が可能(
jq
を使用)
コマンドはいくつか種類がありますが、筆者は下記の用にシンプルに「<C-o>
で実行する」「環境変数の変更はTelescopeで実施」の
2つだけショートカット設定をしています。基本的にこの2つの機能しか使っていませんが十分満足しています。
整形のオプションだけ、公式から少し追いづらかったのでそちらも合わせて例として記載しています:
config = function() vim.api.nvim_create_autocmd('FileType', { pattern = 'json', callback = function() vim.bo.formatexpr = '' vim.bo.formatprg = 'jq' end, }) vim.api.nvim_create_autocmd('FileType', { pattern = 'http', callback = function() vim.api.nvim_set_keymap('n', '<Leader><C-o>', ':Rest run<CR>', { noremap = true, silent = true }) -- first load extension require('telescope').load_extension 'rest' -- then use it, you can also use the `:Telescope rest select_env` command vim.api.nvim_set_keymap('n', '<leader>se', ':Telescope rest select_env<CR>', { noremap = true, silent = true, desc = '[S]earch select [E]nv' }) end, }) end
venn.nvim
エンジニアの皆さんは図を書くことが多いと思いますが、こちらのプラグインはASCIIアートで簡単に図を作成できるプラグインです。 下記のように簡易的なデータフローを表現する際に役立ちます。
┌─────┐ ┌───┐ │start│──────────────►│end│ └─────┘ └───┘
基本的な操作の流れは次のとおりです:
:set ve=all
とする- 文字を書く
- visual矩形選択などで選択し
:VBox<CR>
公式のREADME.mdに設定は書いてあり、それをそのまま使うことが出来ます。
筆者は若干変えてはいますが次のようにしています。<CR>
でボックスができるようにしてある点が気に入っています。:
config = function() -- venn.nvim: enable or disable keymappings function _G.Toggle_venn() local venn_enabled = vim.inspect(vim.b.venn_enabled) if venn_enabled == 'nil' then vim.b.venn_enabled = true vim.cmd [[setlocal ve=all]] -- draw a line on HJKL keystokes vim.api.nvim_buf_set_keymap(0, 'n', 'J', '<C-v>j:VBox<CR>', { noremap = true }) vim.api.nvim_buf_set_keymap(0, 'n', 'K', '<C-v>k:VBox<CR>', { noremap = true }) vim.api.nvim_buf_set_keymap(0, 'n', 'L', '<C-v>l:VBox<CR>', { noremap = true }) vim.api.nvim_buf_set_keymap(0, 'n', 'H', '<C-v>h:VBox<CR>', { noremap = true }) -- draw a box by pressing "f" with visual selection vim.api.nvim_buf_set_keymap(0, 'v', '<CR>', ':VBox<CR>', { noremap = true }) print 'venn on' else vim.cmd [[setlocal ve=]] vim.api.nvim_buf_del_keymap(0, 'n', 'J') vim.api.nvim_buf_del_keymap(0, 'n', 'K') vim.api.nvim_buf_del_keymap(0, 'n', 'L') vim.api.nvim_buf_del_keymap(0, 'n', 'H') vim.api.nvim_buf_del_keymap(0, 'v', '<CR>') vim.b.venn_enabled = nil print 'venn off' end end vim.api.nvim_set_keymap('n', '<leader>tv', ':lua Toggle_venn()<CR>', { noremap = true }) end
vim-table-mode
Markdownを書いているとき、どうしても辛いのが表を書くときです。 このプラグインを使用することでマークダウンで辛くなりがちなテーブル編集を楽にすることが出来ます。 いくつか機能はありますが、フォーマット機能だけで筆者は十分で、その他は使用していません。
| Column1 | Column2 | Column3 | | --------------- | --------------- | --------------- | | Item1.1 | Item2.1 | Item3.1 | | Item1.2 | Item2.2 | Item3.2 | | Item1.3 | Item2.3 | Item3.3 | | Item1.4 | Item2.4 | Item3.4 | :TableModeRealineを実行すると下記のようになる。 | Column1 | Column2 | Column3 | | --------------- | --------------- | --------------- | | Item1.1 | Item2.1 | Item3.1 | | Item1.2 | Item2.2 | Item3.2 | | Item1.3 | Item2.3 | Item3.3 | | Item1.4 | Item2.4 | Item3.4 |
フォーマットを自動で適宜行ったり、その他テーブル編集に特化した、テーブル編集モードの切り替えもあるのですが、
筆者は :TableModeRealine
コマンドを適宜実行して使用することが多いです。
render-markdown.nvim
render-markdown.nvim
は、Neovim内でMarkdownファイルを見やすくレンダリングするプラグインです。
筆者はmarkdown-preview.nvim
も併用していますが、「Neovim内で完結させたい場面」ではこちらを主に使用しています。
最後に紹介する render-markdown.nvim
は、Neovim内でMarkdownファイルを見やすくレンダリングするプラグインです。
良く紹介されているのは markdown-preview.nvim かと思うのですが、
筆者はNeovim引きこもり気味なので、外部ブラウザを使わずにプレビューできないかと、探していたところ発見したのがこちらのプラグインになります。
CopilotChatのプラグインの表示でも適用可能なのも気に入っています。
もちろん、ブラウザで確認したいときもあるので markdown-preview.nvim
もたまに使っています。
まとめ
環境をカスタマイズすることで、生産性を飛躍的に向上させることができます。 しかし、本当に大事なのは、「効率化して何を成し遂げたいのか」ということだと筆者は思います。
例えば、以下のような目標があるかもしれません:
- 家族や趣味の時間を増やしたい。
- クリエイティブな作業にもっと集中したい。
- より多くの成果を短時間で出したい。
どのような目標であれ、開発環境を洗練させることで、日々の無駄な時間を削減し、本当に集中すべきことに時間を使う手助けとなります。
この記事を参考に、ぜひ一つでも便利なツールや設定を取り入れてみてください。 筆者は年末年始に環境の棚卸しをするのですが、ちょうど今が良いタイミングではないでしょうか? そして、より充実したエンジニアライフを送れるように頑張りましょう!
私たちのチームでは、Neovim好きなエンジニアを募集中です。興味のある方、私たちと一緒に働きませんか? ぜひご連絡をお待ちしています! 採用ページ
明日はアドベントカレンダー最終日です。毎年恒例のCTO梶田さんの記事をお楽しみに!