-1

必要なパッケージに自動的に変換される 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"を設定することを知りました。

4

2 に答える 2

0

ファイル パスと groupId および最も近い pom.xml からの artifactId (上向き) の組み合わせを使用します。

global !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():
  current_file_dir = '/'.join((os.getcwd() + ('/' if os.getcwd()[-1] != '/' else '') + path).split('/')[:-1])
  absolute_path = current_file_dir.split("/")
  pom_dir_index = -1

  if os.path.isfile('/'.join(absolute_path) + '/pom.xml'):
    return '/'.join(absolute_path) + '/pom.xml'

  # 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'

def get_file_package():
  current_file_location = '.'.join((os.getcwd() + ('/' if os.getcwd()[-1] != '/' else '') + path).split('/')[:-1])
  package = get_package_name(find_nearest_pom())
  return package + current_file_location.split(package)[1]

endglobal

snippet pkg "package" b
package `!p snip.rv = get_file_package()`;
endsnippet
于 2018-11-15T02:48:17.340 に答える