Closed7

neovimをがんばった記録

たつはらたつはら

インストール

環境はWindows
一応あとで消しやすいようにインストーラーでドン。
Scoopとかにすると絶対入れたか入れてないか忘れる。

https://neovim.io/

neovimの中身をグラフィック~な感じにする挙げ句、最初からいろいろなプラグインが入ってたりするやつをどっち選ぼうか迷う。

https://nvchad.com/
簡単、ファイルが少ない、テーマスイッチャーがある、起動高速
White-keyを開くとprefixってでるだけで……。多分設定してあげたらいいんだろうけどめんどうくさい

https://astronvim.com/
いろいろはいってて豪華。デフォルトプラグインを簡単にオーバーライドできる
起動は遅いかもしれないが、キーマッピングが割とわかりやすい。

結局AstroVimくんに。でもいろいろはいってるものの殆どは無効化させてしまった。勿体ないが、慣れたらそのうちnvchadくんにするよ。それか、LazyVim

https://www.lazyvim.org/

たつはらたつはら

init.luaやらもろもろ

オプション系。

-- エンコーディング設定
vim.scriptencoding = "utf-8"
vim.opt.encoding = "utf-8"
vim.opt.fileencoding = "utf-8"
-- 表示設定
vim.opt.number = true  -- 行番号を表示
vim.wo.number = true
vim.wo.relativenumber = false  -- 相対行番号を無効化
vim.opt.title = true  -- ウィンドウタイトルを表示
vim.opt.cursorline = false  -- カーソル行のハイライトを無効にする
vim.opt.termguicolors = true  -- GUI カラーを使用する
vim.opt.signcolumn = "yes"  -- 行番号表示の横に余白を追加
vim.opt.wrap = true  -- 行を折り返す
-- インデント設定
vim.opt.autoindent = true  -- 自動インデントを有効化
vim.opt.smartindent = true  -- スマートインデントを有効化
vim.opt.expandtab = false  -- タブをスペースに変換
vim.opt.smarttab = true  -- スマートタブを有効化
vim.opt.shiftwidth = 2  -- インデントの幅を2に設定
vim.opt.tabstop = 2  -- タブ幅を2に設定
-- 検索設定
vim.opt.hlsearch = true  -- 検索結果をハイライト
vim.opt.ignorecase = true  -- 検索時に大文字小文字を区別しない
vim.opt.inccommand = "split"  -- インクリメンタル検索結果を分割表示
-- マウス設定
vim.opt.mouse = "a"  -- マウス操作を有効化
-- バックアップ・スワップファイル設定
vim.opt.backup = false  -- バックアップファイルを作成しない
vim.opt.swapfile = false  -- スワップファイルを生成しない
-- スクロール設定
vim.opt.scrolloff = 10  -- カーソルの上下に余白を確保
-- コマンド設定
vim.opt.showcmd = true  -- コマンドを表示
vim.opt.cmdheight = 0  -- コマンドラインの高さを0に設定
vim.opt.laststatus = 3  -- グローバルステータスライン
-- ディレクトリ設定
vim.opt.autochdir = true  -- カレントディレクトリを自動変更
-- クリップボード設定
vim.opt.clipboard = "unnamedplus"  -- クリップボードとレジスタを共有
-- ヘルプ設定
vim.opt.helplang = "ja"  -- ヘルプの言語を日本語に設定
-- タイムアウト設定
vim.opt.updatetime = 300  -- カーソルホールドの更新時間
vim.opt.ttimeoutlen = 1  -- キーマッピングのタイムアウト時間
-- バックスペース設定
vim.opt.backspace = 'indent,eol,start'  -- バックスペースを有効化
-- 仮想編集設定
vim.opt.virtualedit = 'onemore'  -- 行末の1文字先までカーソルを移動可能にする
-- フロートウィンドウ設定
vim.opt.winblend = 5  -- フロートウィンドウなどを若干透明に
-- グローバルオプション
vim.opt.sidescrolloff = 0  -- 横スクロールオフセットを無効にする
vim.wo.sidescrolloff = 0  -- カレントウィンドウの横スクロールオフセットを無効にする
-- デフォルトのスクロールバーを無効にする
vim.wo.foldcolumn = "0"  -- 折りたたみ列を無効にする

あとおまけでDenopsやPythonもPathをつなげておく。

-- Python3
vim.g.python3_host_prog = '置いてある場所/python.exe'
vim.g["denops#deno"] =  '置いてある場所/.deno/bin/deno'

そして、astrocore.lua astroui.lua以外の既存ファイルの1行目をコメントアウトして有効化していく。
せっかく使ってるのにcoreとuiを消すとはいかがなものか。勿体ないがこれでいいや……。

たつはらたつはら

起動画面 alpha-vim

https://github.com/goolord/alpha-nvim
起動したときの画面。絵を変えたかったので必死に変更。

  {
    "goolord/alpha-nvim",
    event = "VimEnter", -- Lazy-load on entering Vim
    opts = function(_, opts)
      opts.section.header.val = {
        "⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡤⠴⠒⠒⠒⠶⢤⣄⡀⠀⠀⠀⠀⠀⠀⠀",
        "⠀⠀⠀⠀⠀⠀⠀⣠⠞⠁⠀⠀⠀⠀⠀⠀⠀⠈⠙⢦⡀⠀⠀⠀⠀⠀",
        "⠀⠀⠀⠀⠀⠀⡼⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢳⡀⠀⠀⠀⠀",
        "⠀⠀⠀⠀⠀⢸⠁⠀⠀⣠⠖⠛⠛⠲⢤⠀⠀⠀⣰⠚⠛⢷⠀⠀⠀⠀",
        "⠀⠀⠀⠀⠀⣿⠀⠀⣸⠃⠀⠀⢀⣀⠈⢧⣠⣤⣯⢠⣤⠘⣆⠀⠀⠀",
        "⠀⠀⠀⠀⠀⣿⠀⠀⡇⠀⠀⠀⠻⠟⠠⣏⣀⣀⣨⡇⠉⢀⣿⠀⠀⠀",
        "⠀⠀⠀⠀⢀⡟⠀⠀⠹⡄⠀⠀⠀⠀⠀⠉⠑⠚⠉⠀⣠⡞⢿⠀⠀⠀",
        "⠀⠀⠀⢀⡼⠁⠀⠀⠀⠙⠳⢤⡄⠀⠀⠀⠀⠀⠀⠀⠁⠙⢦⠳⣄⠀",
        "⠀⠀⢀⡾⠁⠀⠀⠀⠀⠀⠤⣏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠃⠙⡆",
        "⠀⠀⣼⠁⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⢠⡏⠀⠀⡇",
        "⠀⠀⣏⠀⠀⠀⠀⠲⣄⡀⠀⠀⠀⠸⡄⠀⠀⠀⠀⠀⠀⢸⠀⢀⡼⠁",
        "⢀⡴⢿⠀⠀⠀⠀⠀⢸⠟⢦⡀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠘⠗⣿⠁⠀",
        "⠸⣦⡘⣦⠀⠀⠀⠀⣸⣄⠀⡉⠓⠚⠀⠀⠀⠀⠀⠀⠀⠀⡴⢹⣦⡀",
        "⠀⠀⠉⠛⠳⢤⣴⠾⠁⠈⠟⠉⣇⠀⠀⠀⠀⠀⠀⠀⣠⠞⠁⣠⠞⠁",
        "⠀⠀⠀⠀⠀⠀⠙⢧⣀⠀⠀⣠⠏⠀⠀⢀⣀⣠⠴⠛⠓⠚⠋⠀⠀⠀",
        "⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠋⠉⠉⠉⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀",
      }
      return opts
    end,
  },

カラースキーム github-nvim.theme

https://github.com/projekt0n/github-nvim-theme
間違いなくastrouiで指定しろって話なんですが。まぁいいやということで普通に書いた。

  {
    'projekt0n/github-nvim-theme',
    event = 'VimEnter', -- Lazy-load on entering Vim
    config = function()
      require('github-theme').setup({})
      vim.cmd('colorscheme github_dark')
    end,
  },

ステータスライン Lualine.nvim

https://github.com/nvim-lualine/lualine.nvim

  {
    "nvim-lualine/lualine.nvim",
    dependencies = { "nvim-tree/nvim-web-devicons" },
    event = "VeryLazy", -- Lazy-load when required
    config = function()
      require("plugins.config.lualine")
    end,
  },

で、Pluginsフォルダの中にConfigフォルダを作って、「lualine.lua」ファイル名で、以下のやつをコピペ。
https://github.com/nvim-lualine/lualine.nvim/blob/master/examples/evil_lualine.lua

私の画面はコマンドラインが消えているんですがinit.luaで下記の部分が作用しているからです。
グローバルステータスラインの「3」についてはほかにも0~2があるのでぐぐると幸せになれると思います。大体3でいいとおもうけど。

vim.opt.cmdheight = 0  -- コマンドラインの高さを0に設定
vim.opt.laststatus = 3  -- グローバルステータスライン

あと、文字数をカウントする方法もあった。
https://github.com/nvim-lualine/lualine.nvim/discussions/1185

バッファライン Bufferline.nvim

https://github.com/akinsho/bufferline.nvim
画面開いたときのなんか上の方のタブ……多分。タブだけに

  {
    "akinsho/bufferline.nvim",
    version = "*",
    event = "VeryLazy", -- Lazy-load when required
    dependencies = "nvim-tree/nvim-web-devicons",
  },
たつはらたつはら

日本語入力関連

  • 前提として「denops」が必須
  • 入力にSKKのskkeleton
  • 補完にnvim-cmp

denops

https://github.com/vim-denops/denops.vim
skkeletonの前提スキル。denopsにはさらに「deno」をパソコンにインストールする必要がある。
init.luaでdenoのPathを通してたのはこのため。

-- plugin.luaあたりのプラグインをまとめてインスコするためのファイルに以下を追加
  {"vim-denops/denops.vim"},

skkeleton

https://github.com/vim-skk/skkeleton
https://github.com/delphinus/skkeleton_indicator.nvim
本当に一番大変だった……。

-- plugin.lua内記載
  {
    "vim-skk/skkeleton",
    dependencies = {
      "vim-denops/denops.vim",
      {
        "delphinus/skkeleton_indicator.nvim",
        event = { "VeryLazy", "InsertEnter", "CmdlineEnter", "CmdwinEnter" },
        opts = { fadeOutMs = 0 },
        config = function()
          require("skkeleton_indicator").setup()
        end,
      },
    },
    config = function()
      require("plugins.config.skkeleton").setup()
    end,
  },
-- plugins/config/skkeleton.lua
local skkeleton = {}

function skkeleton.setup()
  -- skkeletonの設定
  vim.fn['skkeleton#config']({
    globalDictionaries = { { "辞書の場所/SKK-JISYO.L", "euc-jp" } },
    sources = { 'skk_server' }, -- skkserverを利用する
    eggLikeNewline = true, -- 変換モードで改行したときに、確定だけ行う(改行しない)
    -- completionRankFile = {"適当な場所/rank.json"}
  })

  vim.fn["skkeleton#register_kanatable"]("rom", {
    jj = "escape",
    ll = "disable",
    -- 既存のルールに追加 Google日本語入力くんとおなじことをした
    ['d['] = {'『', ''},
    ['d]'] = {'』', ''},
    ['s['] = {'《', ''},
    ['s]'] = {'》', ''},
    ['f['] = {'【', ''},
    ['f]'] = {'】', ''},
    ['q['] = {'★', ''},
    ['q]'] = {'☆', ''},
    ['s-'] = {'゛', ''},
    ['d-'] = {'゜', ''},
    ['g['] = {'。', ''},
    ['g]'] = {'、', ''},
    ['g-'] = {'……', ''},
    ['g\\'] = {'♡', ''},
    ['g='] = {'————', ''},
    ['l1'] = {'#', ''},
    ['l2'] = {'##', ''},
    ['l3'] = {'###', ''},
    ['l4'] = {'####', ''},
    ['l5'] = {'#####', ''},
    ['l6'] = {'######', ''},
    ['r]'] = {'"', ''},
    ['r['] = {'・', ''},
  })

end
return skkeleton
-- 適当なキーマップ用luaファイルにskkeleton用キーマップ追加
-- Ctrl+Jでskkeletonでひらがな入力開始~
keymap_api('i', '<C-j>', '<Plug>(skkeleton-toggle)', { noremap = true, silent = true })
keymap_api('c', '<C-j>', '<Plug>(skkeleton-toggle)', { noremap = true, silent = true })
keymap_api('t', '<C-j>', [[<C-\><C-n><Plug>(skkeleton-toggle)]], { noremap = true, silent = true })

参考

https://zenn.dev/kuu/articles/vac2021-skkeleton
https://zenn.dev/jianbo/articles/d1b2de1998bbfa
https://zenn.dev/slin/articles/2023-10-02-skktips

入力補完 nvim-cmp

https://github.com/hrsh7th/nvim-cmp
https://github.com/topics/nvim-cmp
https://github.com/rinx/cmp-skkeleton
本当はddc.vimをskkeleton側から勧められてるけど、何をやってもできなかったから泣きながら投げた。こっちにしたら簡単に実装できたので……。
あと、cmp-skkeletonはニ種類同じものがあるけど記載したもののほうをつかった。

 {
    "hrsh7th/nvim-cmp",
    event = "InsertEnter", -- Lazy-load on entering insert mode
    dependencies = {
      "hrsh7th/cmp-nvim-lsp",
      "hrsh7th/cmp-buffer",
      "hrsh7th/cmp-path",
      "hrsh7th/cmp-cmdline", --コマンドラインうつときにTAB押すと自動で候補だしてくれる神
      "rinx/cmp-skkeleton", -- skkeleton使用中に補完をだすよ
    },
    config = function()
      require("plugins.config.cmp-config")
    end,
  },
-- plugins/config/cmp-config.lua

local cmp = require('cmp')
local lspkind = require('lspkind')

-- 補完候補でかわいいアイコンだそ~っと
local kind_icons = {
  Text = "",
  Method = "󰆧",
  Function = "󰊕",
  Constructor = "",
  Field = "󰇽",
  Variable = "󰂡",
  Class = "󰠱",
  Interface = "",
  Module = "",
  Property = "󰜢",
  Unit = "",
  Value = "󰎠",
  Enum = "",
  Keyword = "󰌋",
  Snippet = "",
  Color = "󰏘",
  File = "󰈙",
  Reference = "",
  Folder = "󰉋",
  EnumMember = "",
  Constant = "󰏿",
  Struct = "",
  Event = "",
  Operator = "󰆕",
  TypeParameter = "󰅲",
}

cmp.setup {
  sources = {
     { name = 'nvim_lsp' },
    -- { name = 'buffer', option = {
    --   disable_filetypes = { 'txt','md' }
    -- } },
        -- 鬱陶しいから消しちゃったバッファー
    { name = 'path' },
    { name = 'cmdline' },
    { name = 'skkeleton' }
  },
  window = { -- 補完候補の画面。しろぶちラウンドはかわいい
    completion = {
      border = 'rounded',
      winhighlight = "Normal:transparentBG,FloatBorder:transparentBG,Search:None",
      col_offset = -3,
      side_padding = 1,
    },
  },
  view = {
    entries = 'custom',
    docs = { -- 入力したら補完候補一覧の横に説明画面が出るのはいらない。
      auto_open = false
    },
  },
  formatting = {
    format = lspkind.cmp_format({
      mode = 'symbol', -- アイコンだけ表示にして。
      maxwidth = 50, 
      show_labelDetails = false,
      before = function (entry, vim_item)
        return vim_item
      end
  }),
},
-- 補完候補が出てる間はTABで選べる
  mapping = cmp.mapping.preset.insert({
    ["<Tab>"] = cmp.mapping.select_next_item(),
    ["<CR>"] = cmp.mapping.confirm({ select = true }),
    ["<C-l>"] = cmp.mapping.complete(),
    ["<C-e>"] = cmp.mapping.abort(),
  }),
}

-- autocmd で skkeleton のイベントにフックして関数を実行
function _G.cmp_enable_skk()
  cmp.setup.buffer({
    sources = cmp.config.sources({
      { name = 'skkeleton' }
    })
  })
end

function _G.cmp_disable_skk()
  cmp.setup.buffer({
    sources = cmp.config.sources({
      { name = 'nvim_lsp' },
      { name = 'path' },
      { name = 'cmdline' },
    })
  })
end

vim.cmd([[
  augroup skkeleton_cmp
    autocmd!
    autocmd User skkeleton-enable-pre lua _G.cmp_enable_skk()
    autocmd User skkeleton-disable-pre lua _G.cmp_disable_skk()
  augroup END
]])
たつはらたつはら


なんかコマンドをTab補足変換する部分が上の方にあるな。なんだ?まぁいいか……

通知やらコマンドラインやら noice.nvim


https://github.com/folke/noice.nvim
この横からおしゃれ通知と上の画像のコマンドラインを真ん中におしゃれ~~にだしてくれる。

 {
    "folke/noice.nvim",
    event = "VeryLazy", -- Lazy-load when required
    dependencies = {
      "MunifTanjim/nui.nvim",
      "rcarriga/nvim-notify",
    },
    config = function()
      require("plugins.config.noice")
    end,
  },
-- plugins/config/noice.lua
      require("noice").setup({
        cmdline = {
          view = "cmdline_popup", -- コマンドラインをポップアップ表示にする
          opts = {
            position = {
              row = '50%', -- 画面の中央に配置
              col = '50%', -- 画面の中央に配置
            },
            size = {
              width = 'auto', -- 自動で幅を調整
              height = 'auto', -- 自動で高さを調整
            },
          },
        },
        messages = {
          enabled = false, -- enables the Noice messages UI
        },
        lsp = {
          hover = {
            enabled = false, -- NoiceのLSPホバー機能を無効化
          },
          signature = {
            enabled = false, -- NoiceのLSPシグネチャヘルプ機能を無効化
          },
          -- override markdown rendering so that **cmp** and other plugins use **Treesitter**
          override = {
            ["vim.lsp.util.convert_input_to_markdown_lines"] = true,
            ["vim.lsp.util.stylize_markdown"] = true,
            ["cmp.entry.get_documentation"] = true, -- requires hrsh7th/nvim-cmp
          },
        },
        -- you can enable a preset for easier configuration
        presets = {
          bottom_search = true, -- use a classic bottom cmdline for search
          command_palette = true, -- position the cmdline and popupmenu together
          long_message_to_split = true, -- long messages will be sent to a split
          inc_rename = false, -- enables an input dialog for inc-rename.nvim
          lsp_doc_border = false, -- add a border to hover docs and signature help
        },
      })
たつはらたつはら

便利なやつ

https://github.com/folke/zen-mode.nvim
これを使うと集中モードになって他のいらないものがすべて非表示になる。作業から逃げるな。
いろいろな種類のZenmode実装プラグインがあるけど、これが一番シンプルで使いやすかった。

 {
    "folke/zen-mode.nvim",
    cmd = "ZenMode", -- Lazy-load on ZenMode command
    config = function()
      require("plugins.config.zen-mode")
    end,
  },
-- plugin/config/zen-mode.lua
require("zen-mode").setup({
  window = {
    backdrop = 0.95, -- Zenウィンドウの背景のシェード。1に設定するとNormalと同じに保つ
    width = 100, -- Zenウィンドウの幅
    height = 1, -- Zenウィンドウの高さ
    options = {
      signcolumn = "no", -- サインカラムを無効化
      number = false, -- 行番号カラムを無効化
      relativenumber = false, -- 相対行番号を無効化
      cursorline = false, -- カーソルラインを無効化
      cursorcolumn = false, -- カーソルカラムを無効化
      foldcolumn = "0", -- フォールドカラムを無効化
      list = false, -- 空白文字を無効化
    },
  },
  plugins = {
    options = {
      enabled = true,
      ruler = false, -- コマンドラインエリアのルーラーテキストを無効化
      showcmd = false, -- 画面下部のコマンドを無効化
      laststatus = 3, -- Zenモードでステータスラインを表示'laststatus' を設定することでZenモードでステータスラインのオン/オフを切り替え可能
    },
    twilight = { enabled = true }, -- Zenモードが開いたときにTwilightを有効化
    gitsigns = { enabled = false }, -- gitサインを無効化
  },
})

Gitのアイコン gitsigns.nvim

https://github.com/lewis6991/gitsigns.nvim
変更箇所があると行数のあたりにながーい棒がでるんだけど、目障りだったから+にした。

  {
    "lewis6991/gitsigns.nvim",
    config = function()
      require("gitsigns").setup {
        signs = {
          add          = { text = '+' },
          change       = { text = '+' },
          delete       = { text = '-' },
          topdelete    = { text = '‾' },
          changedelete = { text = '~' },
          untracked    = { text = '=' },
        },
      }
    end,
  },

とっさのメモ flote

https://github.com/JellyApple102/flote.nvim
グローバルメモとプロジェクトメモが別に取れるのがすばらしい。メモ一覧とかいいんだ。小説とか書いてるときにぱっとボタン押したらその小説のプロットがでてきたら凄い楽じゃん。

たつはらたつはら

https://github.com/epwalsh/obsidian.nvim

init.lua

vim.opt.conceallevel = 2  -- または 1

Lazy

-- obsidian
{
  "epwalsh/obsidian.nvim",
  version = "*",  -- recommended, use latest release instead of latest commit
  lazy = false,
  ft = "markdown",
  dependencies = {
    -- Required.
    "nvim-lua/plenary.nvim",
  },
  opts = {
    workspaces = {
      {
        name = "Idea",
        path = "/Dropbox/Idea",
        overrides = {
          notes_subdir = "memo",
        },
      },
      {
        name = "obsidian",
        path = "/Dropbox/obsidian",
      },
    },
    new_notes_location = "notes_subdir",
  preferred_link_style = "markdown",
  disable_frontmatter = true,
  },
},
このスクラップは24日前にクローズされました