首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在调整Python的“`include”和“`include”表达式之后,无法获得“`include search`”表达式

在调整Python的“`include”和“`include”表达式之后,无法获得“`include search`”表达式
EN

Stack Overflow用户
提问于 2021-07-25 07:36:17
回答 2查看 65关注 0票数 1

我正在尝试在我的vim配置中包含基于搜索的设置。这导致[i[i[d]d等cmds无法按预期工作。此外,当运行:checkpath!查看包含的文件时,它也不像预期的那样工作。你能帮帮我吗?让我知道我做错了什么&我能做些什么来解决这个问题。

  1. 我的项目根如下所示。我故意不列出venv dir的条目,只是为了保持条目列表的小。 >树-I "build|dist|*egg*|__pycache__“-L 2。美国化学文摘社( MANIFEST.in README.md├──acs_ datamodels -0.0.1-py3- .│.├──ai_core-0.0.1-py3- )金融服务中心( __init__.py│)
  2. 我的:set path?看起来就像 path=datamodels,venv/lib/python3.7/site-packages/*/**2
  3. 我的:set include?看起来就像 ^\s*(from|import)\s*\zs(\S+|\S+\s*import{1}\s*\S+)\ze($|\s*as|,)
  4. 我的:set includeexpr?看起来就像 includeexpr=PyInclude(v:fname)
  5. ~/.vim/after/ftplugin/python.vim的内容如下 设置shiftwidth=4 tabstop=4 softtabstop=4扩展选项卡,自动缩进智能定位器setlocal wildignore=*.pyc,bin,*tabstop=4*,__pycache__/*,build,dist setlocal \)函数!PyInclude(fname)回显"fname:“a:fname let parts = split(a:fname,‘import ')回声”部件“部分:”部件允许l=部件“(1)日志记录(2) ai_core.commons (3) datamodels.literals if len( parts ) >1 let r= parts1”(1) datamodels (2) datetime let = join(l,r,’. '.')“datetime.datetime,ai_core.commons.decode_token让fp =替代(连接,'.','/','g')。'.py‘“datetime/datetime,ai_core/parts/decode_token= glob(fp,1)回声"parts > 1”如果len( found )返回被发现的endif endif让kp =替代(l,'.','/','g')。< 1“kp返回kp”ai_core/commons.py,datamodels/alals.py尾函数setlocal includeexpr=PyInclude(v:fname)
  6. :checkpath!的输出如下。请注意,输出还包含我添加的一些调试消息。如果您看到from typing import Dictimport logging是从venv dir中识别出来的,但是其他库:虽然它们在venv dir中也存在,但我从轮转文件中安装的from ai_core.commons import decode_token是不被识别的。另外,当前文件的相对路径import datamodels.literals中的另一个模块无法识别。 fname:键入导入venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py部件:‘键入’,' Dict‘部件>1部件<1 typing.py decode_token fname: ai_core.commons导入decode_token部件:’aicore.commons‘,' decode_token‘parts >1部件<1 ai_core/commons.py ai_core.commons导入decode_token未找到fname:日志部件:“日志”部件<1 logging.py logging.py fname: datamodels.literals部件:“datamodels.literals”部件<1 datamodels/alals.py datamodels.literals logging

我从视频中学到了这些,感谢莱伦的介绍,还有更多。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-25 08:39:11

&path是用于搜索文件的目录的白名单。基本上,您可以将搜索看作是将文件名附加到&path中列出的每个目录中,并查看该路径是否指向某项内容(它并不是这样工作的,但对于当前的问题来说,这是一个足够好的心智模型)。

例如,如果文件名为quux,而&pathfoo,bar,baz,那么Vim将搜索以下文件:

代码语言:javascript
运行
复制
foo/quux
bar/quux
baz/quux

在这里,文件名是datamodels/literals.py,您的&pathdatamodels,venv/lib/python3.7/site-packages/*/**2,所以Vim将搜索:

代码语言:javascript
运行
复制
datamodels/datamodels/literals.py
venv/lib/python3.7/site-packages/*/**/datamodels/literals.py
venv/...

而且失败的原因很明显。

有两种方法可以避免这种情况:

  • &path准备.,,,它告诉Vim在当前文件的目录和工作目录中搜索文件。您的&path应该是这样的: .、datamodels、venv/lib/python3.7/site-packages/*/**2 它应该让Vim轻松地找到datamodels/literals.py: datamodels/alals.py <--宾果!.=‘#en0#3’> venv/lib/python3.7/site-packages/*/**/datamodels/literals.py venv/.
  • 让您的&includeexpr返回literals.py,它可以在当前&path中找到,而不是datamodels/literals.py: datamodels/alals.py <--宾果!venv/lib/python3.7/site-packages/*/**/literals.py venv/.

海事组织,你应该两者兼得。

票数 0
EN

Stack Overflow用户

发布于 2021-07-25 13:00:15

:set path=.,,venv/lib/python3/site-packages/**2做的魔术吗?更正是**2,用2层深度来表示子项目,而不是我最初的文章中的*/**2。是的,正如@romail所指出的,我确实尝试将includeexpr中的每个文件名追加到path中的dir列表中。谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68516511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档