Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pathとincludeを設定して、suffixesaddを設定してincludeexprを設定したのに #679

Closed
hujo opened this issue Dec 16, 2014 · 14 comments

Comments

@hujo
Copy link

@hujo hujo commented Dec 16, 2014

'path''include' を設定して、 'suffixesadd' を設定して 'includeexpr'を設定したのに、拡張子を除いたファイル名と同名のディレクトリがあった場合 gfでそちらを開いてしまう。

http://ja.stackoverflow.com/questions/1728/path-include-suffixesadd-includeexpr%E4%BB%A5%E5%A4%96%E3%81%AB

@mattn

This comment has been minimized.

Copy link
Member

@mattn mattn commented Dec 16, 2014

出来れば設定された値を教えて頂けないでしょうか。
お手数ですが再現が可能な内容でお願いします。以下、カッコ内はエスパーです。

  • どの様なディレクトリ構成で(例: ディレクトリ foo があって)
  • どの様なファイル(例: ヘッダファイル foo.h もあって)
  • 何をしたら(例: #include <foo>の上で gf をタイプしたら)
  • どうなったのか (例: foo.h が開かれずに foo is directory が表示された)
@hujo

This comment has been minimized.

Copy link
Author

@hujo hujo commented Dec 16, 2014

すみません。遅くなりました。

えっと。こんな設定をしました。

let &l:path .= ',' . fnameescape(glob($LUA_DEV . '/lua'))
setl suffixesadd+=.lua
setl includeexpr=v:fname.'.lua'
let &l:include = '\v<require\s*\(?\s*([''"])\zs\f+\ze\1'

$LUA_DEV は

C:\Program Files (x86)\Lua\5.1

です。

require('socket')のソケットでgfをタイプしました。すると、

C:/Program Files (x86)/Lua/5.1/lua/socket/

が開きました。

C:/Program Files (x86)/Lua/5.1/lua/socket.lua はあります。

@mattn

This comment has been minimized.

Copy link
Member

@mattn mattn commented Dec 16, 2014

diff -r fee313e21905 src/misc2.c
--- a/src/misc2.c   Wed Dec 10 14:54:50 2014 +0900
+++ b/src/misc2.c   Tue Dec 16 21:14:46 2014 +0900
@@ -5452,9 +5452,11 @@
     int        first;      /* use count'th matching file name */
     char_u *rel_fname; /* file name searching relative to */
 {
+
     return find_file_in_path_option(ptr, len, options, first,
        *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path,
-       FINDFILE_BOTH, rel_fname, curbuf->b_p_sua);
+       (options & FNAME_INCL) ? FINDFILE_FILE : FINDFILE_BOTH,
+       rel_fname, curbuf->b_p_sua);
 }

 static char_u  *ff_file_to_find = NULL;
diff -r fee313e21905 src/window.c
--- a/src/window.c  Wed Dec 10 14:54:50 2014 +0900
+++ b/src/window.c  Tue Dec 16 21:14:46 2014 +0900
@@ -6122,8 +6122,9 @@
    return find_file_name_in_path(ptr, len,
             FNAME_MESS|FNAME_EXP|FNAME_REL, count, curbuf->b_ffname);
     }
-    return file_name_at_cursor(FNAME_MESS|FNAME_HYP|FNAME_EXP|FNAME_REL, count,
-                  file_lnum);
+    return file_name_at_cursor(
+       FNAME_MESS|FNAME_HYP|FNAME_EXP|FNAME_REL|FNAME_INCL, count,
+       file_lnum);

 }

とりあえずこれで動く様にはなると思うのですが、gf の挙動を変える事になるので採用されるかどうかは分かりません。

@mattn

This comment has been minimized.

Copy link
Member

@mattn mattn commented Dec 16, 2014

それか includeexpr が設定されているかどうかでディレクトリを無視するパッチ

diff -r fee313e21905 src/misc2.c
--- a/src/misc2.c   Wed Dec 10 14:54:50 2014 +0900
+++ b/src/misc2.c   Tue Dec 16 21:21:36 2014 +0900
@@ -5454,7 +5454,8 @@
 {
     return find_file_in_path_option(ptr, len, options, first,
        *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path,
-       FINDFILE_BOTH, rel_fname, curbuf->b_p_sua);
+       *curbuf->b_p_inex == NUL ? FINDFILE_BOTH : FINDFILE_FILE,
+       rel_fname, curbuf->b_p_sua);
 }

 static char_u  *ff_file_to_find = NULL;
@mattn

This comment has been minimized.

Copy link
Member

@mattn mattn commented Dec 16, 2014

@パッチ職人 意見希望

@mattn

This comment has been minimized.

Copy link
Member

@mattn mattn commented Dec 16, 2014

んーダメだな。上のパッチ駄目だな。 :help 'includeexpr'

    Also used for the |gf| command if an unmodified file name can't be
    found.  Allows doing "gf" on the name after an 'include' statement.
    Also used for |<cfile>|.

can't be found. って書いてある

@mattn

This comment has been minimized.

Copy link
Member

@mattn mattn commented Dec 16, 2014

netrw 等の事も考えると gf でディレクトリを開く事が出来るのはあって当然なので、何か付加条件が無いと存在するディレクトリを見つけて無視する事は難しいですね。

@mattn

This comment has been minimized.

Copy link
Member

@mattn mattn commented Dec 16, 2014

:help 'suffixesadd'

    Comma separated list of suffixes, which are used when searching for a
    file for the "gf", "[I", etc. commands.  Example: >

searching が微妙ですね。gf ディレクトリもファイルも検索対象なので suffixes が絶対使われるよという保証は無さそうです。
って事で、色々と書きましたが現状の仕様では直す事は難しそうです。

どうしても解決する場合は、以下の様なマッピングの導入を考えた方がよさそうです。
以下のプラグインは、.c で gf すると .h を、.lua で gf すると .lua を検索して開くプラグインです。
ちょっと適当なので手直し必要かもしれません。

function! s:findfile(suffix)
  let file = expand('<cfile>')
  if strridx(file, a:suffix) != len(file) - len(a:suffix)
    let file .= a:suffix
  endif
  let path = findfile(file, &path)
  if len(path) == 0
    normal! gf
  else
    exe 'edit' path
  endif
endfunction

augroup GfForceFile
  au!
  autocmd BufEnter *.c nnoremap <buffer> gf :<c-u>call <SID>findfile('.h')<cr>
  autocmd BufEnter *.lua nnoremap <buffer> gf :<c-u>call <SID>findfile('.lua')<cr>
augroup END
@hujo

This comment has been minimized.

Copy link
Author

@hujo hujo commented Dec 16, 2014

mattnさん、ありがとうございます。
一番に、他に何かを設定したらできるのかなぁ。という疑問が解決できました。

どうしても解決する場合は、以下の様なマッピングの導入を考えた方がよさそうです。
以下のプラグインは、.c で gf すると .h を、.lua で gf すると .lua を検索して開くプラグインです。

ありがとうございます!使わせていただきます。
.cで。うぅ、Cもがんばります。。

mattnさん、本当に。ありがとうございます。

@nb1839

This comment has been minimized.

Copy link

@nb1839 nb1839 commented Dec 16, 2014

帰ってきて見てみたら終わってましたので蛇足ですが
結局私も mattn さんのパッチの 2 箇所に行きついただけでした。
suffixesadd を有効にするなら misc2.c の find_file_in_path() の方、
includeexpr を有効にするなら window.c の grab_file_name() の方といった感じですね。

思いつくとしたら suffixesadd が設定されていたらファイルの方を探しにいくようにするくらいでしょうか。

--- a\src\misc2.c   2014-11-06 21:47:36.433053800 +0900
+++ b\src\misc2.c   2014-12-17 00:47:28.367409400 +0900
@@ -5454,7 +5454,7 @@
 {
     return find_file_in_path_option(ptr, len, options, first,
        *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path,
-       FINDFILE_BOTH, rel_fname, curbuf->b_p_sua);
+       *curbuf->b_p_sua != NUL? FINDFILE_FILE: FINDFILE_BOTH, rel_fname, curbuf->b_p_sua);
 }

 static char_u  *ff_file_to_find = NULL;
@mattn

This comment has been minimized.

Copy link
Member

@mattn mattn commented Dec 18, 2014

確認ありがとうございます。
現状の仕様だとこれはプラグインか何かで解決すべき問題だと思っています。
gf のヘルプを見ると、前提 gf はディレクトリも対象で、ファイルだった場合にそのファイル名のチェックに suffixesadd を使うというだけなのです。なので suffixesadd があるかどうかで検索対象を変えるというのは少し仕様を壊している様に思います。

@nb1839

This comment has been minimized.

Copy link

@nb1839 nb1839 commented Dec 18, 2014

はい、同意します。
gf の場合は元々のコード自体も基本的に完全一致する名前がない場合にのみ
→ suffixesadd 等を適用するという流れが見えますのでいずれにせよ非互換にはなってしまうと思います。

少ない影響で直すなら思いつくのはこれくらいかなぁ、という程度のつもりでした。

@deton

This comment has been minimized.

Copy link
Member

@deton deton commented Dec 19, 2014

参考情報です。
ディレクトリのかわりにその名前で始まるファイルを開くプラグイン
というものもあります。
http://qiita.com/deton/items/285219979b8c88da3ab6

ただし、socket/とsocket.cとsocket.luaがある場合は、socket.cが開かれます。
(suffixesaddは見てないので)

@mattn

This comment has been minimized.

Copy link
Member

@mattn mattn commented Dec 21, 2014

@deton 情報ありがとうございます。

本件については反対意見が無いと見なしていったん閉じますね。

@mattn mattn closed this Dec 21, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
5 participants
You can’t perform that action at this time.