aptpod Advent Calendar 2024 12月24日の記事を担当します、 intdashグループの宮内です。 先日、筆者のグループ内で「開発環境の紹介」というテーマで意見交換を行いました。 グループ内ではソフト/ハードともに他人の開発環境に興味がある人が多いようで、 とても盛り上がりました。 ただ、その際に、筆者はNeovimを紹介したのですが、時間の都合上全然紹介しきれませんでした。 今回はこの場を借りて、その時の不完全燃焼感を払拭すべく、閑話休題的な形で、 筆者のNeovimについて紹介していきたいと思います。 ちなみに、グループ内はVSCode使いが多いです。 対象読者 筆者の開発環境について 設定のベース プラグイン紹介 プラグイン管理 lazy.nvim mason.nvim & mason-lspconfig mason-tool-installer.nvim コーディング nvim-cmp conform none-ls ThePrimeagen/refactoring.nvim Git gitsign git-blame.nvim diffview.nvim lazygit.nvim 検索置換 telescope.nvim grug-far.nvim text-case.nvim その他 overseer.nvim toggleterm.nvim dashboard-nvim rest.nvim venn.nvim vim-table-mode render-markdown.nvim まとめ 対象読者 これから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 LazyVim NvChad AstroNvim LunarVim SpaceVim それぞれ特徴があるので、自分の好みに合わせて選ぶと良いと思います。 カスタマイズはどのテンプレートでも可能ですが、筆者は「設定がほどよく薄く、自由度が高い」という理由で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 or nvim-lint Formatters : null-ls.nvim or formatter.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がコード上に表示されます。 git-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 はよく使っていたので、そのレシピがあったのはとても助かりました。: :Make similar to vim-dispatch 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梶田さんの記事をお楽しみに!