要領がよくない自分のためのタスク管理術 with neovim
こんにちは。ダイの大冒険ガチ勢のbun913と申します。
みなさんは以下のようなちょっとした悩みを持ったことはありませんか?私はあります。
- チームのタスク管理ボードに書くまでもないけど、個人的な細かな作業メモや懸念を雑に書き出したい
- ObsidianやNotionのようなツールを使っても良いが、気軽に自分のローカルPCで管理したい
- nvimや慣れたキーバインドで爆速管理がしたい
- シンプルなマークダウンファイルでタスクを管理して、あとで参照できるようにしておきたい
- gitで管理できるとなお良い
AIの進歩が著しい今の時代。それでも、あまり要領がよくない私にとって「今何に集中すべきか」「この差し込みタスクは後回しにしよう」と整理をつけることは、相変わらず重要なスキルだと感じています。
今回は私がnvimを使って、実践しはじめたタスク管理の方法について説明しています。誰かの参考になれば幸いです。
前提
- 多くの組織でチームのために課題管理やドキュメント管理のツールを導入していると思いますが、この記事で記載しているのは課題の細かいステップや悩みを個人的に管理する一つの方法です
- 私はツールとしてnvimを利用していますが、考え方はどのようなツールでも転用できると思います
- nvimを使っているのは「早い」「慣れたツールを検索に使える」といった理由からです
- 利用している環境は以下のとおりです
- macOS
- nvim version: 0.10.2
いきなりデモ
まずは実際の使用例を見ていただくのが早いと思います。私の場合、以下のような形でタスクを管理しています。
タスクの仕分け
私はタスクをマークダウンのような形式(プレーンなテキストファイル)で保管することを好んでいます。まず基本的にタスクは優先度順に上から並べています。取り組むべきタスクは一番上に置いてあるタスクだけです。
# Individual Task
## Current Focus
- [ ] Nvimのタスク管理をZennに書く // このタスクに集中すると決める
- [ ] EXPLORE IT!の読書
- [ ] 問い合わせ バッチ処理のスケジュールについて [スレッドのリンク](https://example.com)
- [ ] APIテストのコレクションを整理する
## DevOps Time // 個人の改善系のタスクをここに置いている
- [ ] Nvimタスク管理用のコマンドを修正する
- [ ] エディタ移行後にしれっと使えなくなったキーバインドを復活させる
- [ ] Warpターミナルで欲しいショートカットをまとめて調べる
- [ ] kustomizationの設定を完全に理解する
どう考えてもやるだけ、あとは答えるだけといったタスクは単純に作業する際に一番上に持っていき、終わったらマークをつけるだけで十分です。上の「問い合わせ」は秒で終わる類のことだったので、シンプルに終わらせてしまいました。
# Individual Task
## Current Focus
- [x] 問い合わせ バッチ処理のスケジュールについて [スレッドのリンク](https://example.com) //即終わらせる
- [ ] Nvimのタスク管理をZennに書く
- [ ] EXPLORE IT!の読書
- [ ] APIテストのコレクションを整理する
## DevOps Time // 個人の改善系のタスクをここに置いている
- [ ] Nvimタスク管理用のコマンドを修正する
- [ ] エディタ移行後にしれっと使えなくなったキーバインドを復活させる
- [ ] Warpターミナルで欲しいショートカットをまとめて調べる
- [ ] kustomizationの設定を完全に理解する
ただし、Nvimのタスク管理をZennに書く
はちょっと構成などを考えたい類のタスクですので、 ConvertTask
というコマンドで別のファイルに切り出して考えます。
今回指定したファイル名で ./tasks/nvimTaskManagementArticle.md
という形で以下のようにタスクが切り出されますので、こちらに細かい懸念やタスクは書き出していくことで main.md
がメモで大きくなることを防ぎます。
.
├── main.md
└── tasks #ここに進行中のタスクファイルが入ります
└── nvimTaskManagementArticle.md
# Nvimのタスク管理をZennに書く
## Reference
## Artifact
切り出したファイルは普通にファイルを指定して開くこともできますが、一応素早く開くためのOpenTask
というコマンドを用意しています。
Reference
には参考リンクや課題の出所のIssueのリンクなどを貼り、Artifact
にはあとで見返せるように成果物や結果へのリンクを貼っておきます。あとは好きにメモなどを書き込んでOKです。
# Nvimのタスク管理をZennに書く
## Reference
- [Issue](https://example.com)
## Artifact
- [Pull Request](https://example.com)
## Memo
- [ ] zenn-cli のバージョン確認 & アップデート
- [ ] `npm run new` で記事執筆開始
- [ ] アウトラインを先に整理
- 出だし
- 課題感の共有
- 先にデモ
- なぜこの方法をとっているか参考の本とか
- まとめ
- [ ] demo画像をgifで取得していく
- [ ] キャプチャツール、ライセンス切れたっけ?
タスクのアーカイブ
私は以下の目的で今日やった小さなタスクも後で振り返れるようにしておきたいです。
- 小さなタスクの積み重ねで「今日何もしていない」と悲しくなるのを避ける
- 「あの時どうやって解決したっけ?」ということをgrep検索でいつでも遡れるようにしておきたい
そこでArchiveTask
というコマンドを用意しています。
まず別ファイルに切り出す必要すらなかった「やるだけ」のタスクの場合、ArchiveTask
コマンドは以下のように今日の日付のファイルに終わったタスクを移動させます(main.mdから消し去り、意識からも消し去ります)
また、別ファイルに切り出していたタスクの場合 ./archives/${日付}/
ディレクトリにファイルを移動します。
.
├── archives #ここに個別タスクをアーカイブします
│ └── 20250312
│ ├── misc.md #別ファイルに切り出さなかった小さいタスクはここに完了を記録します
│ └── nvimTaskManagementArticle.md # 個別のタスクは別のmdファイルで保管します
├── main.md
└── tasks
大きめのタスクの場合、あえてmain.md
からタスクの行は消さないようにしています。ですが、すでにアーカイブ用のディレクトリに移動済みであるため、不要であればシンプルにこの行を消すだけで十分です。
後から検索する
私は telescope.nvim というツールでいくつかの方法でテキスト検索をできるようにしています。
例えば、「あ〜あのnvimでタスク管理する記事なんだっけ?」と思った場合はファイル名や日付から検索できます。
それすらも思い出せない場合、中に書いてあるコンテンツベースで検索するのも良いでしょう。
私はこのような感じでゆるく自分のタスクを管理しています。
実現しているコード
以下のようなLuaコードで実演したコマンドを定義しています。正規表現のパターンマッチングはまだ改善の余地がありますが...
vim.api.nvim_create_user_command('ConvertTask', function()
-- 現在の行を取得
local line = vim.api.nvim_get_current_line()
-- タスクのタイトルを抽出
local task_title = line:match '%- %[[ x]%] (.+)'
if not task_title then
print 'No valid task found on the current line.'
return
end
-- ファイル名をインタラクティブに取得
local file_name = vim.fn.input 'What is your file name: '
if file_name == '' then
print 'File name cannot be empty.'
return
end
-- ディレクトリが存在しない場合は作成
local dir_path = './tasks/'
vim.fn.mkdir(dir_path, 'p')
-- 新しいファイルを作成
local file_path = dir_path .. file_name .. '.md'
local file = io.open(file_path, 'w')
if file then
file:write('# ' .. task_title .. '\n\n')
file:write '## Reference\n\n'
file:write '## Artifact\n\n'
file:close()
print('File created: ' .. file_path)
else
print('Failed to create file: ' .. file_path)
return
end
-- 現在の行をリンク付きの形式に更新
local new_line = line:gsub(task_title, '[' .. task_title .. '](' .. file_path .. ')')
vim.api.nvim_set_current_line(new_line)
end, {})
-- Neovim Lua APIを使用して新しいコマンドを定義
vim.api.nvim_create_user_command('OpenTask', function()
-- 現在の行を取得
local line = vim.api.nvim_get_current_line()
-- リンクのファイルパスを抽出
local file_path = line:match '%((.-)%)'
if file_path then
-- ファイルを開く
vim.cmd('edit ' .. file_path)
else
print 'No valid link found on the current line.'
end
end, {})
-- Neovim Lua APIを使用して新しいコマンドを定義
vim.api.nvim_create_user_command('ArchiveTask', function()
-- 現在の行を取得
local line = vim.api.nvim_get_current_line()
local current_line_num = vim.api.nvim_win_get_cursor(0)[1]
-- 今日の日付を取得 (YYYYMMDD形式)
local date = os.date '%Y%m%d'
local archive_dir = './archives/' .. date
-- ディレクトリが存在しない場合は作成
vim.fn.mkdir(archive_dir, 'p')
-- リンクのファイルパスを抽出
local file_path = line:match '%((.-)%)'
if file_path then
-- リンク付きタスクの場合
-- ファイル名を抽出
local file_name = file_path:match '([^/]+)$'
if not file_name then
print 'Failed to extract file name from path.'
return
end
-- 新しいファイルパスを作成
local new_file_path = archive_dir .. '/' .. file_name
-- ファイルを移動
local success = os.rename(file_path, new_file_path)
if success then
print('File moved to: ' .. new_file_path)
-- 現在の行のリンクを新しいパスに更新して完了状態にする
local new_line = line:gsub('%((.-)%)', '(' .. new_file_path .. ')')
new_line = new_line:gsub('%- %[ ?%]', '- [x]')
-- 行を更新(リンク付きタスクの場合は行を残す)
vim.api.nvim_set_current_line(new_line)
print 'Task archived and link updated'
else
print 'Failed to move file.'
end
else
-- リンクなしタスクの場合(新しい処理)
-- タスクのテキストを抽出(3つのパターンに対応)
local task_text = line:match '%- %[x%] (.+)' or line:match '%- %[ %] (.+)' or line:match '%- %[%] (.+)'
if not task_text then
print 'No valid task found on the current line.'
return
end
-- misc.mdのパスを作成
local misc_file_path = archive_dir .. '/misc.md'
-- misc.mdが存在するかチェック
local misc_file_exists = vim.fn.filereadable(misc_file_path) == 1
-- misc.mdを開く(存在しない場合は新規作成)
local misc_file = io.open(misc_file_path, 'a+')
if not misc_file then
print('Failed to open or create file: ' .. misc_file_path)
return
end
-- ファイルが新規作成された場合はヘッダーを追加
if not misc_file_exists then
misc_file:write('# ' .. date .. ' misc tasks\n\n')
end
-- ファイルの最後にタスクを追加(常に完了状態で追加)
misc_file:write('- [x] ' .. task_text .. '\n')
misc_file:close()
-- 現在のバッファから行を直接削除(完了状態への更新なし)
vim.api.nvim_buf_set_lines(0, current_line_num - 1, current_line_num, false, {})
print('Task archived to: ' .. misc_file_path .. ' and removed from original file')
end
end, {})
おまけ: ツールによらないタスク管理の考え方
ここでは、おまけとして上で紹介したようなタスク管理の方法をとっている考え方や書籍の影響について記載しています。
大元の考え方
私は気が小さいくせに、気が多い性格なので、何かSlackなどで頼み事をされるとすぐに元のタスクを見失ってしまいます。(おまけに気が短いです)
あまり要領が良くない方なのですが、4年ほど前に以下の書籍に出会うことで最低限2点だけは心がけています。
- 作業は細かく細分化して、ステップを考える
- チームや組織に貢献できる内容なら後でドキュメントツールにまとめる
- 自分だけのメモで良い場合はローカルに留めておく
- タスクは一つだけに集中する。割り込みがあった場合は、優先度を判断してメモ帳に書き留めておく。マルチタスクは極力避ける
とはいえ、ノートの代わりにSlackのスレッドに細かい作業や悩みを書き出しておくこともあります。例えば障害対応などは個人的にメモを残している場合ではないし、ふさわしくないと思います。私は個人として集中したり、考えを深める必要があることだけに使っています。(個人的な教訓や反省を残していたりなどにも)
その他タスク管理TIPS
以下のテクニックは、上記のタスク管理と組み合わせることで、より効果的な作業管理を実現できます:
- ポモドーロテクニック
- 非常に簡単にいうと、25分の間に一つだけの作業に集中するものです
- 私は「集中すると決めた」時に意図的に実施するようにしています
- 結局のところ常にポモドーロテクニックを使って集中するのは疲れるので、私にはその覚悟と体力がないのだと思います
- 25分の集中の後に訪れる休憩時間をちゃんと守れないやつなんです。私は。
- Slack通知を一時的にOffにする
- ポモドーロテクニックを使う際にSlackの通知を一時的にOffにするのも効果的です
- ただし、その場合事前にカレンダーで予定が入っていないかを確認しておかないと大遅刻をかましてしまう恐れがあります
- Gmailやカレンダーの通知は別途見えるようにしておくのが良いと思います
- 組織内の人に「集中している」ということを見えるようにしておく
- Googleカレンダーに意図的に「Worktime」などの予定を入れたり
- その際、「予定の上書き可」などと示すことで相手に優しい意思表示になるのでおすすめです
- Slackのステータスを「集中しています。あとで返事をします」などのようにしておくことも良い方法だと思います
- Googleカレンダーに意図的に「Worktime」などの予定を入れたり
まとめ
- タスク管理ツールにnvimを使っています
- 1つだけのタスクに集中する、終わった小さな仕事は意識から消し去るが記録には残す、大きめの問題は別のファイルに切り出す。といった方法を実現できるようにカスタムコマンドを定義しています
- チームで細かいステップを共有した方が良い問題や、段階の場合はSlackなどのチャットツールを使うなど、使い分けています
以上、nvimをベースにした私なりのタスク管理の方法について記載しました。完璧な方法ではありませんが、日々改善を重ねながら運用している一例として参考にしていただければ幸いです。
以上、長い文章を読んでいただきありがとうございました。
Discussion