1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[NeoVim] Fern環境で、ディレクトリでの起動時に自動cdしたい!

Last updated at Posted at 2022-12-20

環境

macOS Ventura 13.0
NeoVim v0.8.1
lambdalisue/fern.vim, lambdalisue/fern-hijack.vim導入済み

なにがしたいの

いつも通り日本語が崩壊してるのでタイトルの意味がわからないと思います。これ読んでください。

(そうだ、コンフィグでもいじるか)
$ nvim ~/.config/nvim/

(nvim内)
(Fern画面が開く)
:pwd
-> /Users/zoi/Desktop
(デフォルトディレクトリやん...)
(~/.config/nvim 開いといてほしいなあ)

やってみる

ワイ「せや、autocmdで起動時にいい感じのところにcdすればいいのでは?」
ワイ「引数で指定したパスどうやって取るんやろ」
ワイ「よし、起動時に開いてるFern画面からもらうか」
ネット記事「%でファイルパス取れるらしいで」
ワイ「なるほどやってみるか」

:echo expand("%")
-> fern://275f276e/file:///Users/zoi/.config/nvim$

ワイ「Fernの自己主張強すぎやろ!」
ワイ「で、でも、このままでもcdできたりは...?」

:execute "cd ".expand("%")
-> E472: コマンドが失敗しました

ワイ「ダメそうですねありがとうございました」

ワイ「せや、file://以前を全部抹消すればどうや?!」
ネット記事「substitute()で正規表現置換できるで」
ワイ「これやろ」

:echo substitute(expand("%"), ".*file:\\\/\\\/", "", "g")
-> /Users/zoi/.config/nvim$

ワイ「エスケープめんど...」
ワイ「よくみたら最後に$あるやん なにこれ?」
ワイ「なんかよくわからんけど消しとくか」

:echo substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g")
-> /Users/zoi/.config/nvim

ワイ「いい感じやな」
ワイ「これ今はフォルダ開いてるけど、ファイル開いた時おかしくなったりする?」

$ nvim ~/.config/nvim/init.lua

(nvim内)
:echo substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g")
-> /Users/zoi/.config/nvim/init.lua

ワイ「これcd先ちゃう、ファイルパスや」
ワイ「これの親ディレクトリ欲しいなあ」
ワイ「でも、ただ単に/以下切り捨てだとディレクトリを開いた時に親に行ってしまうなあ」
ネット記事「fnamemodify()便利やで」
ワイ「なるほど」

$ nvim ~/.config/nvim

(nvim内)
:echo fnamemodify(substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g"), ":p:h")
-> /Users/zoi/.config/nvim

ワイ「よし、完璧や」

ワイ「あとはこれをautocmd VimEnter *すれば...」

vim.cmd('augroup cd-on-start')
vim.cmd('autocmd!')
vim.cmd([[autocmd VimEnter * execute ":cd ".fnamemodify(substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g"), ":p:h")]])
vim.cmd('augroup END')

ワイ「できたで〜〜」

結論

Luaで書いてますが、中身は完全にVim scriptなので安心してください。Vimでも動くはずです。知らんけど。
(autocmdをLuaで書く方法をご存知の方がいらっしゃれば教えてください)

vim.cmd('augroup cd-on-start')
vim.cmd('autocmd!')
vim.cmd([[autocmd VimEnter * execute ":cd ".fnamemodify(substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g"), ":p:h")]])
vim.cmd('augroup END')

余談?

このままだと以下のような場合にバグりそうな気もします(未確認です)
...めんどくさいので治しません()

$ pwd
/path/to/hoge/
$ ls
huga/ ←ディレクトリ
huga$ ←ファイル
$ nvim hoge$
:pwd
-> /path/to/hoge/huga

正規表現で、ORじゃなくANDにするとか...?

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?