🐼

最近のvimいじり

2024/06/14に公開

最近いじったvimの設定をメモってみる。

コミットログは…

$ git log --since='7 days ago' --oneline -- nvim
75383c9 (HEAD -> main, origin/main, origin/HEAD) update nvim plugins
7e4f8cd update neovim plugins
4b42399 fix
7215d49 use expression for ddu-ui-ff size
68c7bf0 cdo s/
4b9909e open or focus todo
5121fef never opens todo in duplicated window
  • 7215d49 use expression for ddu-ui-ff size
  • 68c7bf0 cdo s/
  • 4b9909e open or focus todo
  • 5121fef never opens todo in duplicated window

あたりを拾っていく

ddu-ui-ff のサイズを式で指定した

ddu.vimのファジーファインダーUIddu-ui-ffの表示サイズを自動調節する機能が
本体に入ってるのを教えてもらったので、使ってみた。

       ui = "ff",
       uiParams = {
         ff = {
+          -- sizes >>>
+          winRow = "(&lines - min([70, &lines - 8]) - 3) / 2",
+          previewRow = "(&lines - min([70, &lines - 8]) - 3) / 2",
+
+          winHeight = "min([70, &lines - 8])",
+          previewHeight = "min([70, &lines - 8])",
+
+          winCol = "&columns / 10",
+          previewCol = "&columns / 2",
+
+          winWidth = "&columns * 4 / 10 - 2",
+          previewWidth = "&columns * 4 / 10 - 2",
+          -- <<< sizes
+
           onPreview = vim.fn["denops#callback#register"](function(args)
             vim.wo[args.previewWinId].cursorline = false
           end),

ちょっと変更をトチって後のコミットで直してる(fix)けどご愛敬。ほんでもって便利。

:cdo s/// の組み合わせをメッチャ使うので、エイリアスにした

:cdo はQuickfixの各行が指すファイルと行の組み合わせに対してコマンドを実行するコマンド。

:cdo s/foo/bar/ をよく使うので、エイリアスにしておいた。

     local define = vim.fn["altercmd#define"]
     define("apply", "Apply")
     define("cancel", "Cancel")
     define("rg", "Ripgrep")
     define("Rg", "Ripgrep")
     define("vh", "vertical help")
     define("vhelp", "vertical help")
+    define("cs", "cdo s")

:cs/ と入力すると :cdo s/ に展開される。ありがとうvim-altercmd

todoファイルを開くときに、既に開いている場合はフォーカスするようにした

VimによるToDo管理を支える技術で紹介した、todo.mdファイルを開くキーマップを、すでに開いている場合はフォーカスするようにした。

-vim.keymap.set("n", "<leader>tit",
-  [[<cmd>Ripgrep -i to]] .. [[do<cr><cmd>lua require("kyoh86.conf.todo").resize_window_to_fit_content()<cr>]],
-  { remap = false, desc = "To" .. "Doを検索する" })
-vim.keymap.set("n", "<leader><leader>t",
-  [[<cmd>new ~/.local/state/to]] .. [[do.md<cr><cmd>lua require("kyoh86.conf.todo").resize_window_to_fit_content()<cr>]],
-  { remap = false, desc = "作業メモを編集する" })
-return {
-  resize_window_to_fit_content = function()
+vim.keymap.set("n", "<leader>tit", [[<cmd>Ripgrep -i to]] .. [[do<cr>]], { remap = false, desc = "To" .. "Doを検索する" })
+vim.keymap.set("n", "<leader><leader>t", [[<cmd>lua require("kyoh86.conf.todo").open_note()<cr>]], { remap = false, desc = "作業メモを編集する" }
+local filename = "~/.local/state/to" .. "do.md"
+return {
+  open_note = function()
+    local winids = vim.fn.win_findbuf(vim.fn.bufnr(filename))
+    local winid = -1
+    if #winids == 0 then
+      vim.cmd([[topleft new ]] .. filename)
+      winid = vim.fn.bufwinid(filename)
+    else
+      winid = winids[1]
+      vim.api.nvim_set_current_win(winid)
+      vim.cmd([[wincmd K]])
+    end
     local line_count = vim.api.nvim_buf_line_count(0)
-    vim.api.nvim_win_set_height(0, line_count + 1)
+    vim.api.nvim_win_set_height(winid, line_count + 1)
   end,
 }

シンプルに編集を始める(:edit todo.md)するだけだったら、「すでに開いている場合はフォーカスする」のは:drop todo.mdするだけでいい。
画面分割(new)したいしtopleftに置きたい!とか思ってるもんだから複雑な感じになった。

Discussion