Neovim 基本設定 init.lua の紹介
Neovim 設定の棚卸しを含め、僕の設定ファイル init.lua の内容を共有します。正直基本設定ばかりで使い込んでる感はないのですが、長年この設定でやってきて、特段不便もないです。New-Vimmer たちの参考になれば幸いです。 外観(Visual)の設定 エディタの見た目に関わる設定です。行番号の表示や、カーソル位置の強調、インデントの調整をしています。 -- 行番号を表示する vim.o.number = true -- インデント設定(タブ幅と自動インデント幅を2に設定) vim.o.tabstop = 2 vim.o.shiftwidth = 2 -- カーソルの位置を強調(行・列) vim.o.cursorline = true vim.o.cursorcolumn = true -- 不可視文字(タブや改行など)を可視化 vim.o.list = true -- 24bitカラーを有効化して、色を綺麗に表示 vim.opt.termguicolors = true エンコーディングと文字コード 文字化けを防ぐための設定です。 -- スクリプト自体のエンコーディングを UTF-8 に指定 vim.scriptencoding = 'utf-8' 操作・クリップボードの設定 Neovim 外のアプリケーション(ブラウザなど)とコピー&ペーストを共有するための設定です。 -- システムのクリップボードと同期する vim.opt.clipboard:append{'unnamedplus'} 外部設定の読み込み 設定ファイルが肥大化しないよう、自動コマンドやプラグイン管理を別ファイルから読み込んでいます。 -- 別ファイル(autocmds.lua, lazy_nvim.lua)を読み込む require('autocmds') require('lazy_nvim') -- 標準のファイルブラウザ netrw を無効化(nvim-tree を使うため) vim.g.loaded_netrw = 1 vim.g.loaded_netrwPlugin = 1 プラグインのキーバインド設定 導入している主要なプラグインのショートカットキーを設定しています。 Nvim-tree (ファイルツリー) サイドバーでファイル一覧を表示・操作するためのプラグイン設定です。 vim.keymap.set('n', '<C-n>', ':NvimTreeToggle<CR>') vim.keymap.set("n", "<leader>e", ":NvimTreeToggle<CR>") img-paste.vim (画像貼り付け) Markdown 執筆時にクリップボードの画像を保存し、リンクを自動挿入する設定です。こちらのブログや Zenn などの記事を書く時に愛用しています。 ...
普段使っている Neovim プラグインの紹介
僕が普段愛用している Neovim プラグインを紹介します。 1. プログラミングを快適にする (LSP・シンタックス) nvim-lspconfig, mason.nvim, mason-lspconfig.nvim Neovim を IDE 化します。 mason で各種言語のサーバー(Lua, Python, Rustなど)を簡単にインストールでき、lspconfig でそれらを有効化します。自動補完や定義ジャンプが可能になります。 設定方法 { "williamboman/mason.nvim", build = ":MasonUpdate", -- インストール時にレジストリを更新 config = function() require("mason").setup() end, }, { "williamboman/mason-lspconfig.nvim", dependencies = { { "williamboman/mason.nvim" }, { "neovim/nvim-lspconfig" }, }, config = function() require("mason-lspconfig").setup({ ensure_installed = { -- 自動インストールしたいサーバーをリストアップ "lua_ls", "pyright", "ts_ls", "vimls", "gopls", "html", "jsonls", "cssls", "marksman", "terraformls", "vuels", "dockerls", "yamlls", }, }) require("mason-lspconfig").setup_handlers({ -- 自動セットアップ function(server_name) require("lspconfig")[server_name].setup({}) end, }) end }, nvim-treesitter 標準のハイライトよりも圧倒的に細かく、正確にコードに色が付きます。コードの構造を解析するため、インデントや選択範囲の拡張なども賢くなります。 設定方法 { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate", lazy=false, opts = { highlight = { enable = true, disable = {}, }, ensure_installed = { "hcl", "terraform" }, sync_install = true, }, }, blink.cmp 超高速な自動補完エンジン。 長らく nvim-cmp が主流でしたが、現在はこの blink.cmp が「設定が簡単で爆速」として非常に人気です。 こちらは別途解説記事を書きたいと思います。 設定方法 長いので折りたたみにしました { 'saghen/blink.cmp', -- optional: provides snippets for the snippet source dependencies = { 'rafamadriz/friendly-snippets' }, -- use a release tag to download pre-built binaries version = '1.*', -- AND/OR build from source, requires nightly: https://rust-lang.github.io/rustup/concepts/channels.html#working-with-nightly-rust -- build = 'cargo build --release', -- If you use nix, you can build from source using latest nightly rust with: -- build = 'nix run .#build-plugin', ---@module 'blink.cmp' ---@type blink.cmp.Config opts = { -- 'default' (recommended) for mappings similar to built-in completions (C-y to accept) -- 'super-tab' for mappings similar to vscode (tab to accept) -- 'enter' for enter to accept -- 'none' for no mappings -- -- All presets have the following mappings: -- C-space: Open menu or open docs if already open -- C-n/C-p or Up/Down: Select next/previous item -- C-e: Hide menu -- C-k: Toggle signature help (if signature.enabled = true) -- -- See :h blink-cmp-config-keymap for defining your own keymap keymap = { preset = 'default' }, appearance = { -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' -- Adjusts spacing to ensure icons are aligned nerd_font_variant = 'mono' }, -- 補完ウィンドウの見た目を少し豪華にする(オプション) completion = { menu = { border = 'rounded' }, documentation = { window = { border = 'rounded' } }, }, -- Default list of enabled providers defined so that you can extend it -- elsewhere in your config, without redefining it, due to `opts_extend` sources = { default = { 'lsp', 'path', 'snippets', 'buffer' }, }, -- (Default) Rust fuzzy matcher for typo resistance and significantly better performance -- You may use a lua implementation instead by using `implementation = "lua"` or fallback to the lua implementation, -- when the Rust fuzzy matcher is not available, by using `implementation = "prefer_rust"` -- -- See the fuzzy documentation for more information fuzzy = { implementation = "prefer_rust_with_warning" } }, opts_extend = { "sources.default" } }, 2. 見た目と使い勝手を向上させる lualine.nvim ステータスライン(画面下部のバー)をオシャレにする。 現在のモード、ファイル名、Gitのブランチ、LSPの状態などを綺麗に表示できます。 設定方法 { 'nvim-lualine/lualine.nvim', dependencies = { 'nvim-tree/nvim-web-devicons' }, opts = {}, }, 以下のような感じで表示されます。 ...
Neovim で Windsuf(Codeium) を使ってみる
はじめに 近年、GitHub Copilot をはじめとする AI 補完ツールが欠かせない存在になっています。今回は、個人利用が無料で、かつ Neovim との相性も抜群な AI 補完ツール Windsurf(Codeium) の導入方法をご紹介します。 Windsurf(Codeium) とは? Windsurf(Codeium) は、70以上のプログラミング言語をサポートする AI コード補完ツールです。 Windsurf - The best AI for Coding Windsurf is the world's most advanced AI coding assistant for developers and enterprises. Windsurf Editor — the first AI-native IDE that keeps developers in flow. Web で検索すると、Windsurf よりも Codeium の方がヒットします。2025年4月に社名変更があったようで、現在は Windsurf が正式名称のようです。 Changelist: April 2025 Windsurf updates from April 2025! vim プラグイン名についても、以前は Exafunction/codeium.nvim という名前でしたが、現在は Exafunction/windsurf.nvim にリネームされています。 ...
Cloudflare D1 が本当にトランザクションをサポートしていないのか確かめた
最近、こんな記事を見ました。 Cloudflare D1でトランザクションが使えない問題 Zenn このブログしかり、Cloudflare で D1 を使って色々アプリケーションを動かしているので、ちゃんと自分の手で確かめてみよう、と思い確認してみました。 結論 SQLite はトランザクションをサポートしている。 Cloudflare D1 ではネイティブトランザクションをサポートしていないが、batch() によって制約はあるもののトランザクションを実現できる。 実際にやってみる SQLite はトランザクションを正式にサポートしています。 ローカル D1 環境で、実際にトランザクションが機能するかどうかを確認していきます。 wrangler init d1test category は Hello World Example、type は Worker Only を選択しました。 "d1_databases": [ { "binding": "DB", "database_name": "d1test-db", } ] セットアップ直後ではローカルDBは構築されていませんが、以下のようなコマンドを実行することで作成されます。 npx wrangler d1 execute d1test-db --local --command "select * from users" 以下のように sqlite ファイルが作成されていればOKです。 % ls .wrangler/state/v3/d1/miniflare-D1DatabaseObject e7352547963de7050bd7d94658afc4fe78b61811b7815da12d90be8e863abf4d.sqlite e7352547963de7050bd7d94658afc4fe78b61811b7815da12d90be8e863abf4d.sqlite-shm e7352547963de7050bd7d94658afc4fe78b61811b7815da12d90be8e863abf4d.sqlite-wal SQLite コマンドでデータベースに接続します。 ...
Neovim で Markdown 編集時に画像を貼り付けたい
このブログは Neovim を使って書いているんですが、画像を挿入するときはかなり面倒です。 以前 Windows 環境で記事を書いていたときは、記事で紹介した VSCode プラグインの Paste Image を使っていました。 コピペでmarkdownに画像を取り込む VS Code plugin Paste Image を試す 以前の記事で軽く紹介させてもらいましたが、コピペするだけで markdown に画像が挿入できる VS Code プラグイン Paste Image を試したいと思います。 真面目に調べたら、すでにとても多くの人が試していて、何番煎じかという感じですが。。。気にせずやっていきます。 はじめに このブログは Windows の WSL2 上の vim で作っているので、そもそも VS Code ではなく Vim で同じことが実現できればそっちのほうがいいなと考えました。 で少し調べたところ、md-img-paste という vim プラグインがありました。 結論からいうと、テキストはクリップボード共有できたのですが、md-img-pasteを使った画像ペーストはできませんでした。できた方がいれば教えてください。 テキストのクリップボード共有はこちらを参考にご対応いただければ。ちなみに、これは僕だけかもしれませんが、DISPLAY変数を設定した状態だと vim 起動自体がとても遅く(体感3秒くらい)なりました。。。なので、結局クリップボード共有自体使うのをやめました。 設定方法 Paste Image をお持ちの VS Code に追加します。 config.jsonに以下の設定を追加します。 pasteImage.basePath markdown上で指定する画像ファイルのパスのベースパスを指定します。ここを基準として、pasteImage.pathへの相対パスを出力する形になります。 Hugo では、.../static/ がデフォルトのstaticコンテンツ置き場として構成されています。参考 さらに、僕の場合は画像ファイルはさらにその配下に /img を作って格納するようにしていますので、markdown からは基本的に/img/xxx.pngのような形で指定するようにさせたいわけです。結局、hugo の static ファイル置き場に合わせる、が基本的なやり方になるだろうと理解しています。 pasteImage.insertPattern ペースト時に生成される画像ファイル名を指定します。特にこだわりなければそのままでOKです。 pasteImage.path ペースト時に生成される画像ファイルの置き場所を指定します。画像置き場やmarkdownファイル置き場の設定によって変わってくるので、こちらは個人の設定に合わせてご対応ください。 現状の僕の設定を以下に公開します。 { @a2ito Mac になってからはエディタを Neovim にしており、VS Code にイチイチ切り替えるのが嫌で上記のプラグインも使わなくなっていました。Mac では Shift + Command + 4 のショートカットで画面キャプチャを取得できるので、キャプチャ取得→リネームして画像フォルダに保存→マークダウンでファイルパスを追記、というとても面倒な方法で画像を挿入していました。 ...