必要なパッケージに自動的に変換される 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__
が存在しません
現在のバッファを含むディレクトリではなく、vimが開かれたディレクトリを返すため、os.getcwd()
機能しません。
ファイル名を取得するために提供されていることはわかっているので、snip
オブジェクトを調べましたsnip.fn
が、現在のファイルのディレクトリを提供するかどうかはわかりませんでした。
最後に、UltiSnips がグローバル変数 " path
"を設定することを知りました。