【发布时间】:2018-11-15 10:48:17
【问题描述】:
我希望能够写一个vim sn -p 自动变成需要的包。
例如在.../com/theonlygust/project/Main.java 内部扩展pkg 将变为
package com.theonlygusti.project;
我认为这样做的方法是:阅读目录树,直到看到 TLD 目录名称(com、io、net 等),然后使用遇到的目录名称来构建包字符串,或者查找pom.xml 的目录树并从那里找到包。
我学习了 python 插值。
我现在正在尝试这个:
snippet pkg "Create package" b
package `!p
import os
from xml.etree import ElementTree
def get_package_name(pom_file_path):
namespaces = {'xmlns' : 'http://maven.apache.org/POM/4.0.0'}
tree = ElementTree.parse(pom_file_path)
root = tree.getroot()
groupId = root.find(".//xmlns:groupId", namespaces=namespaces)
artifactId = root.find(".//xmlns:artifactId", namespaces=namespaces)
return groupId.text + '.' + artifactId.text
def find_nearest_pom():
absolute_path = os.path.abspath(os.path.dirname('__file__')).split("/")
pom_dir_index = -1
# Find index of 'base_dir_name' element
while not os.path.isfile('/'.join(absolute_path[:pom_dir_index]) + '/pom.xml'):
pom_dir_index -= 1
return '/'.join(absolute_path[:pom_dir_index]) + '/pom.xml'
snip.rv = get_package_name(find_nearest_pom())`;
endsnippet
但我得到了错误
名称
__file__不存在
而os.getcwd() 不起作用,因为它返回打开 vim 的目录,而不是包含当前缓冲区的目录。
我查看了snip 对象,因为我知道它提供了snip.fn 来获取文件名,但我无法确定它是否提供了当前文件的目录。
没关系,终于知道UltiSnips设置了一个全局变量“path”
【问题讨论】:
-
在我提供了原始问题的答案后,您已经完全改变了问题。