Я хочу написать фрагмент кода vim, который автоматически превратится в требуемый пакет.
например. расширение pkg
в то время как внутри .../com/theonlygust/project/Main.java
станет
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
"