NVIMで文章を書くメリット
「コーディング用のエディタで文章を書く?」と思うかもしれません。しかし実際に試してみると、Neovimはライターにとっても非常に優れた執筆環境であることがわかります。
Markdownの書き方とプレビュー
NeovimでのテキストはMarkdown形式で書くのが最も相性が良いです。シンプルな記法で見出し・リスト・コードブロックなどを表現でき、後からHTMLやPDF、Word形式に変換することも可能です。
render-markdown.nvim — インライン描画
render-markdown.nvim は、Markdownをリアルタイムで整形表示するプラグインです。# 記号が実際の見出しとして表示され、**太字** が太く見えるなど、プレビューをわざわざ開かなくても書きながら見た目を確認できます。
{
"MeanderingProgrammer/render-markdown.nvim",
dependencies = { "nvim-treesitter/nvim-treesitter", "nvim-tree/nvim-web-devicons" },
ft = { "markdown", "md" }, -- Markdownファイルのみ有効化
opts = {
heading = {
enabled = true,
sign = false,
icons = { "# ", "## ", "### " },
},
bullet = {
enabled = true,
icons = { "●", "○", "◆" },
},
checkbox = {
enabled = true,
unchecked = { icon = "☐" },
checked = { icon = "☑" },
},
},
}
glow — ターミナルプレビュー
glow はターミナル上でMarkdownをプレビューするCLIツールです。別ウィンドウで実際のレンダリングを確認したい場合に便利です。
日本語入力の設定
Neovimで日本語を入力するときの最大の課題は、IME(インプットメソッド)の切り替え問題です。Insert モードを抜けて Normal モードに戻ったとき、IMEが日本語のままだとコマンドが入力できません。
h/j/k/l などのコマンドが動かない。このストレスを解消することが重要です。
解決策 1: im-select.nvim
Normal モードに戻ったときに自動でIMEを英語に切り替えるプラグインです。macOSユーザーに最もおすすめの方法です。
{
"keaising/im-select.nvim",
config = function()
require("im-select").setup({
-- Normalモードに戻ったときに使うIMEの識別子(macOSの場合)
default_im_select = "com.apple.keylayout.ABC",
default_command = "im-select",
-- Insertモードに入ったときに前回のIME状態を復元する
set_previous_events = { "InsertEnter" },
})
end,
}
解決策 2: 手動でショートカットを設定
プラグインを使わずに、Esc 押下時にIMEを切り替えるautocmdを設定する方法もあります。
-- InsertモードからNormalモードに戻るとき、macOSのIMEを英語に切り替える vim.api.nvim_create_autocmd("InsertLeave", { callback = function() vim.fn.system("im-select com.apple.keylayout.ABC") end, })
スペルチェックの設定
Neovimには組み込みのスペルチェック機能があります。英語の文章を書くときに特に役立ちます。日本語には対応していませんが、英語の技術記事や英訳が含まれる文書には効果的です。
vim.api.nvim_create_autocmd("FileType", { pattern = { "markdown", "text" }, callback = function() vim.opt_local.spell = true vim.opt_local.spelllang = { "en_us" } end, })
文章専用プラグイン
vim-pencil — ライター向け執筆補助
vim-pencil はライター向けに特化した設定をまとめたプラグインです。ソフトラップ(行の折り返し)・ハードラップ・自動保存など、文章執筆に適した設定をコマンド1つで切り替えられます。
{
"preservim/vim-pencil",
ft = { "markdown", "text", "rst" },
config = function()
vim.g["pencil#wrapModeDefault"] = "soft" -- ソフトラップを既定に
vim.api.nvim_create_autocmd("FileType", {
pattern = { "markdown", "text" },
callback = function() vim.fn["pencil#init"]() end,
})
end,
}
goyo.nvim — ディストラクションフリーモード
goyo.nvim はコンテンツを画面中央に配置し、ステータスバーやサイドバーを非表示にして「文章だけ」の空間を作り出します。
limelight.nvim — カーソル周辺だけをハイライト
limelight.nvim はカーソルがある段落だけをフルカラーで表示し、他の段落をグレーアウトするプラグインです。今書いている部分だけに視点を集中させる効果があります。goyo と組み合わせて使うのが定番です。
-- Goyo 起動時に Limelight も起動する vim.api.nvim_create_autocmd("User", { pattern = "GoyoEnter", callback = function() vim.cmd("Limelight") vim.opt.linebreak = true vim.opt.wrap = true end, }) vim.api.nvim_create_autocmd("User", { pattern = "GoyoLeave", callback = function() vim.cmd("Limelight!") end, })
フォーカスモードの全体設定
goyo + limelight だけでなく、以下の設定を組み合わせることで、より完全なフォーカス環境を作ることができます。
-- フォーカスモードを切り替える関数 local focus_mode = false local function toggle_focus() focus_mode = not focus_mode if focus_mode then vim.cmd("Goyo") -- 余計なUIを消す vim.cmd("Limelight") -- 現在の段落だけ明るくする vim.opt.number = false -- 行番号を消す vim.opt.relativenumber = false vim.opt.cursorline = false else vim.cmd("Goyo!") vim.cmd("Limelight!") vim.opt.number = true vim.opt.relativenumber = true vim.opt.cursorline = true end end vim.keymap.set("n", "<leader>z", toggle_focus, { desc = "Toggle Focus Mode" })
Obsidian連携 — obsidian.nvim
Obsidianユーザーなら obsidian.nvim を使うことで、ObsidianのvaultをそのままNeovimから操作できます。wikiリンク([[ノート名]])の補完・ジャンプ・新規ノート作成・タグ管理などが可能です。
{
"epwalsh/obsidian.nvim",
version = "*",
dependencies = { "nvim-lua/plenary.nvim" },
ft = "markdown",
opts = {
workspaces = {
{
name = "personal",
path = "~/Documents/Obsidian/MyVault", -- Vaultのパスを指定
},
},
completion = {
nvim_cmp = true, -- nvim-cmp との連携
min_chars = 2,
},
new_notes_location = "current_dir", -- 新規ノートの保存先
mappings = {
["<leader>on"] = { action = "<cmd>ObsidianNew<cr>", desc = "New Note" },
["<leader>os"] = { action = "<cmd>ObsidianSearch<cr>", desc = "Search Notes" },
},
},
}
obsidian.nvim の主なコマンド
| コマンド | 動作 |
|---|---|
| :ObsidianNew | 新規ノートを作成 |
| :ObsidianSearch | Telescope でノートを検索 |
| :ObsidianFollowLink | [[リンク]] の先のノートを開く |
| :ObsidianBacklinks | 現在のノートへの被リンク一覧 |
| :ObsidianTags | タグ一覧から検索 |
| :ObsidianToday | 今日のデイリーノートを開く |
ワードカウント設定
文章量を把握するためのワードカウントをステータスバーに表示する設定です。lualine.nvim を使っている場合は以下のように組み込めます。
-- ワードカウント関数(Markdown・text ファイルのみ表示) local function word_count() local ft = vim.bo.filetype if ft == "markdown" or ft == "text" then local wc = vim.fn.wordcount() return "W:" .. wc.words end return "" end -- lualine の sections に追加 require("lualine").setup({ sections = { lualine_x = { word_count, "encoding", "filetype" }, } })
文章向けキーマップ設定例
vim.api.nvim_create_autocmd("FileType", { pattern = "markdown", callback = function() local map = function(key, action, desc) vim.keymap.set("n", key, action, { buffer = true, desc = desc }) end -- フォーカスモードをトグル map("<leader>z", "<cmd>Goyo<cr>", "Toggle Goyo") -- 見出しレベルの変換 map("<leader>h1", "<cmd>s/^#* /# /<cr>", "H1 Heading") map("<leader>h2", "<cmd>s/^#* /## /<cr>", "H2 Heading") -- チェックボックスのトグル map("<leader>tc", ":s/\\[ \\]/[x]/e | s/\\[x\\]/[ ]/e<cr>", "Toggle Checkbox") -- 今日の日付を挿入 map("<leader>td", 'o## ' .. os.date("%Y-%m-%d") .. "<Esc>", "Insert Date") end, })
実際の執筆フロー
ターミナルからNeovimを起動
プロジェクトディレクトリに移動してから nvim . で起動するか、直接 nvim notes/today.md でファイルを指定して開きます。
新しいMarkdownファイルを作成
Telescopeで <leader>ff を使って既存ファイルを探すか、:e notes/new-article.md で新規作成します。obsidian.nvim があれば :ObsidianNew が便利です。
フォーカスモードをオン
<leader>z で Goyo を起動し、ステータスバーやサイドバーを消します。limelight も連動させれば、現在書いている段落だけがハイライトされます。
Insert モードで執筆
i または o でInsertモードに入り、文章を書きます。Esc でNormalモードに戻り、カーソル移動・コピペ・検索置換などを行います。IMEは im-select.nvim が自動で切り替えてくれます。
保存とGit管理
:w で保存、:wq で保存して終了します。gitsigns.nvim を入れていれば、変更箇所が行番号の横に色で表示されます。:Git commit でコミットまでNeovim内で完結します。
vim.api.nvim_create_autocmd({"InsertLeave", "TextChanged"}, { callback = function() vim.cmd("silent! write") end })これでInsertモードを抜けるたびに自動保存されます。