2026年2月2日月曜日

ファイル名補完を「カレントディレクトリから」ではなく「開いているファイルのディレクトリから」にしたい

この記事はVim駅伝の2026-2-2 の記事です。

Vim では <C-x><C-f> で、「カレントディレクトリからのファイル名補完」ができます。

Markdown などで資料を書いていると、リンク先の記述をするために「そのファイルのディレクトリからのファイル補完」がしたくなることがあります。

ただ、資料のビルドなどがあるためカレントディレクトリは docroot から動かしたくありません。

そんな願いをかなえるスクリプトを作ったので共有します。

やり方としては、「補完開始直前に lcd でカレントディレクトリを動かして、補完完了後に元に戻す」という感じです。

同じ挙動が良いという方は以下スクリプトを使ってみてください。

" カレントディレクトリを開いているファイルのディレクトリへ移動
function! file_complete_extension#start_lcd_for_insert_completion() abort
  if exists('b:_saved_lcd')
    return ''
  endif

  " 現在のウィンドウの cwd を保存
  let b:_saved_lcd = getcwd(-1)

  " 開いているファイルのディレクトリへ移動
  let l:dir = expand('%:p:h')
  if !empty(l:dir)
    execute 'lcd' fnameescape(l:dir)
  endif
  return ''
endfunction

" CompleteDone で restore_lcd を発火させる
augroup restore_lcd_after_completion
  autocmd!
  autocmd CompleteDone * call file_complete_extension#restore_lcd()
augroup END

" b:_saved_lcd に戻る
function! file_complete_extension#restore_lcd() abort
  " b:_saved_lcd があればそこに戻る
  if exists('b:_saved_lcd') && !empty(b:_saved_lcd)
    execute 'lcd' fnameescape(b:_saved_lcd)
    " 後始末、 b:_saved_lcd を unlet
    unlet b:_saved_lcd
  endif
endfunction

inoremap <expr> <C-x><C-f>
      \ file_complete_extension#start_lcd_for_insert_completion() . "\<C-x>\<C-f>"

2025年12月28日日曜日

静的サイトジェネレーター Rspress の Quick start をやってみた

プロジェクト作成

node ➜ /workspaces/TIL/Rspress/firststep (rspress-firststep) $ npm create rspress@latest
Need to install the following packages:
create-rspress@1.47.0
Ok to proceed? (y) y


> npx
> create-rspress


  Create Rspress Project

  Project name or path
  rspress-firststep-project

  Select additional tools (Use <space> to select, <enter> to continue)
  Add Biome for code linting and formatting, Add ESLint for code linting, Add Prettier for code formatting

  Next steps ───────────────────╮

  cd rspress-firststep-project  │
  npm install                   │
  npm run dev                   │

├────────────────────────────────╯

  Done.

npm notice
npm notice New major version of npm available! 10.9.2 -> 11.7.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.7.0
npm notice To update run: npm install -g npm@11.7.0
npm notice

node ➜ /workspaces/TIL/Rspress/firststep (rspress-firststep) $ cd rspress-firststep-project/

以下の構成でファイルが生成される。

rspress-firststep-project
|-- README.md                       : Rspress プロジェクトの README
|-- biome.json                      : Biome 設定ファイル
|-- docs                            : ドキュメントルート
|   |-- _meta.json                  : ヘッダ情報が書いてある
|   |-- guide
|   |   |-- _meta.json
|   |   `-- index.md
|   |-- hello.md
|   |-- index.md
|   `-- public                      : 公開リソース置き場
|       |-- rspress-dark-logo.png
|       |-- rspress-icon.png
|       `-- rspress-light-logo.png
|-- eslint.config.mjs               : ESLint 設定ファイル
|-- package.json                    : npm 設定ファイル
|-- rspress.config.ts               : Rspress 設定ファイル
`-- tsconfig.json                   : TypeScript 設定ファイル

開発サーバーで実行

npm install
npm run dev

ブラウザで http://localhost:3000 にアクセスすると、生成されたページが表示される。

その他コマンド

その他、チェック、フォーマット、リント、プレビュー等のコマンドも定義されているので必要に応じて適宜使える。

node ➜ .../TIL/Rspress/firststep/rspress-firststep-project (rspress-firststep) $ npm run
Scripts available in rspress-firststep-project@1.0.0 via `npm run-script`:
  build
    rspress build
  check
    biome check --write
  dev
    rspress dev
  format
    prettier --write .
  lint
    eslint .
  preview
    rspress preview

ビルド

npm run build

doc_build に静的サイトが生成される。

Nginx にデプロイしてみる

docker 上の nginx にデプロイしてみる。

docker run -p 8081:80 -v $(pwd)/doc_build:/usr/share/nginx/html:ro nginx

ブラウザで http://localhost:8081 にアクセスすると、デプロイされたページが表示される。

参考資料

2025年12月13日土曜日

Yet another なガントチャート生成ツールを作った

CSV からガントチャートを生成する CLI ツール「ganttgen」を作りました。 この記事では、細かい仕様説明は省いて、実際に動かすところまでを紹介します。

始め方

実行バイナリのダウンロード

以下、 ganttgen の最新リリースページから、ご利用の OS に合わせた実行バイナリをダウンロードしてください。

https://github.com/mikoto2000/gantt-generator/releases/latest

CSV ファイルの準備

以下のような CSV ファイルを用意してください。ファイル名は sample.csv とします。

タスク名,開始,終了,期間,依存,実績開始,実績終了,実績期間,備考
#要件定義,,,,,,,,
タスク1,2025/12/1,,2d,,2025/12/11,2025/12/15,,"12/22 mikoto2000
まいった、終わらん
12/2 mikoto2000
病欠のため着手不能"
#設計,,,,,,,,要件定義は終わっていないが、決まったところから設計していく
タスク2,,,3d,タスク1,,,,"12/22 mikoto2000
テスト
12/2 mikoto2000
テテスト"
#製造,,,,,,,,着手未定
タスク3,,,4d,タスク2,,,,
#テスト,,,,,,,,着手未定
タスク4,,,5d,タスク3,,,,
タスク5,,,,,,,,着手未定

Excel 等の表計算ソフトで編集するのを推奨します。

See: https://github.com/mikoto2000/gantt-generator/blob/main/sample/sample.csv

祝日定義ファイルの準備

以下のような YAML ファイルを用意してください。ファイル名は sample_holiday.yaml とします。

# YAML で祝日を指定するサンプル。
# YYYY-MM-DD の文字列を配列で記述してください。
holidays:
  - 2024-06-10
  - 2024-09-16
  - 2024-09-23

See: https://github.com/mikoto2000/gantt-generator/blob/main/sample/sample_holiday.yaml

ガントチャートの生成・監視・再描画

前述の工程で用意した CSV ファイルと祝日定義ファイルを指定して、 ganttgen コマンドを実行してください。

ganttgen --livereload --holidays ./sample_holiday.yaml ./sample.csv -o sample.html

生成されたガントチャートは sample.html という名前で出力されます。ブラウザで開いて確認してください。

--livereload オプションを指定すると、CSV ファイルや祝日定義ファイルに変更があった場合に自動的にガントチャートが再生成されます。ブラウザのリロードは不要です。

参考資料