vim-jp / issues

有志で既知のバグや要望を検討・管理し、オフィシャルへの還元をしていきます。
https://vim-jp.org/
341 stars 11 forks source link

`:make` のコマンド内の カレントディレクトリ変更 が vim quickfixリスト に反映されない #1420

Closed KSR-Yasuda closed 1 year ago

KSR-Yasuda commented 1 year ago

不具合の内容

:makeコマンド を実行した際の Makefile中で、 make -C dir など、ディレクトリ遷移 を伴った場合、 quickfixリストでのファイル名表示 が 正しく表示されません。

Quickfixリストのパス名 がおかしいので、:ccコマンド 等で、正しいファイルが開けません。

現象・ログ

# Vim quickfixリスト

  1 || make -C dir                                              # サブディレクトリ `dir` に移動して `make`
  2 || make[1]: ディレクトリ '/c/xxxxxxxx/dir' に入ります
  3 || gcc a.c -o a
  4 a.c|3 col 2| error: #error 1                                # 正しくは、`dir/a.c` のファイル
  5 ||     3 | #error 1
  6 ||       |  ^~~~~
  7 make[1]: *** [Makefile|7| /a] エラー 1
  8 || make[1]: ディレクトリ '/c/xxxxxxxx/dir' から出ます
  9 make: *** [Makefile|6| all] エラー 2
# ターミナルでの実行結果

% make
make -C dir
make[1]: ディレクトリ '/c/xxxxxxxx/dir' に入ります
gcc a.c -o a
a.c:3:2: error: #error 1
    3 | #error 1
      |  ^~~~~
make[1]: *** [Makefile:7: /a] エラー 1
make[1]: ディレクトリ '/c/xxxxxxxx/dir' から出ます
make: *** [Makefile:6: all] エラー 2

Source

./
|-- Makefile
`-- dir/
    |-- Makefile
    `-- a.c
# Makefile

# vim: ft=make noet ts=4 sts=4 sw=4

.PHONY:                 all

all:
    make -C dir
# dir/Makefile

# vim: ft=make noet ts=4 sts=4 sw=4

TARGET                   = a
SRCS                     = a.c

$(TARGET):              $(SRCS)
    $(CC) $^ -o $@
// dir/a.c

// vim: ft=c noet ts=4 sts=4 sw=4

#error 1

int main(int argc, char *argv[]) {
    return 0;
}

再現手順

上記のソースに対して、vim :makeコマンド を実行。

期待動作

vimの カレントディレクトリ に対して、正しいパス を表示する。

Vimのバージョン

9.0.1403

OSの種類/ディストリ/バージョン

Microsoft Windows 10 Pro 22H2 [Version 10.0.19045.3086] Git-for-Windows v2.41.0.windows.1

使用している or 関係していそうなプラグイン

(関係していそうなプラグインなどがあればココに書いてください)

その他

makeのコマンド中に カレントディレクトリが変わっていること が原因なので、 vimに :make -C dir と 直接 別ディレクトリを参照させても 発生。

また、例えば、vimカレントディレクトリ /c/parent/current/ にいるときに、 dir/Makefile中で 上の階層のソース (e.g ../hoge.c = /c/parent/current/hoge.c) を見る場合は、 /c/parent/current/../hoge.c を resolveして /c/parent/hoge.c のように表示されることも (vimの cd, tcd, lcd 等の状態 などにもよるかも)。

設定 &makeprg で 任意のコマンドを使用できる (から どんなログが出るか 不明) && makeコマンドのディレクトリ移動ログ も ${LANG}次第で変わる とは思うので、 ログ捕捉して 追従するのも 難しい気はしますが…。

tsuyoshicho commented 1 year ago

現状厳しい(というよりは対処ができない)気がします。

うまくやっている人がいたらコメントもらえるようにちょっと広報しておきます。

tsuyoshicho commented 1 year ago

@KSR-Yasuda san いろいろやりとりして、思いだしました。(help位置はおしえてもらいました)

E379

[E379](https://vim-jp.org/vimdoc-ja/quickfix.html#E379)
        %D              "enter directory" フォーマット文字列。これ以下の%fはそ
                        のディレクトリ名を検索する。
        %X              "leave directory" フォーマット文字列。これ以下の%fは
                        ディレクトリスタックの1つ前のディレクトリを検索する。

"enter directory" や "leave directory" フォーマットを定義する場合、"%D" や
"%X" は部分文字列の最初に置かれなけれならない。Vimはディレクトリ変更を追跡し相
対パスによって指定されたファイル名の前にカレントディレクトリ名を付け足す。
Tipsや制限など詳細は[quickfix-directory-stack](https://vim-jp.org/vimdoc-ja/quickfix.html#quickfix-directory-stack)を参照。

これを 'errorformat' オプション にうまく設定することで、Makeのログから位置を補正できます。

逆にいうとそこを頑張らない限り厳しいのが現状ですね。

KSR-Yasuda commented 1 year ago

@tsuyoshicho san ありがとうございます。

確認してみたところ、 &errorformat で、元々 英語のログ ({Entering,Leaving} directory 'xxxxxxxx') は 対応しているようでした。 なので、make の 各国言語へのローカライズのログ に対応していないこと が問題のようで。

そのため、以下のいずれか でいけるようです:

KSR-Yasuda commented 1 year ago
  • &errorformat に 日本語ログのフォーマット を追加
    • set errorformat+=%D%*\\a[%*\\d]:\ ディレクトリ\ %*[`']%f'\ に入ります
    • set errorformat+=%X%*\\a[%*\\d]:\ ディレクトリ\ %*[`']%f'\ から出ます
    • set errorformat+=%D%*\\a:\ ディレクトリ\ %*[`']%f'\ に入ります
    • set errorformat+=%X%*\\a:\ ディレクトリ\ %*[`']%f'\ から出ます

どうも、:make -C dir の場合は、ちょっと文言がズレていて、 3つ目の設定は、以下 が正しいようです: