UltiSnips расширяет Java-пакет - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу написать фрагмент кода 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"

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я использую комбинацию пути к файлу, groupId и artifactId из ближайшего pom.xml (вверх)

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
0 голосов
/ 06 ноября 2018

UltiSnips хранит фрагменты Java в java.snippets , что на моем компьютере также ~/.vim/bundle/vim-snippets/UltiSnips/java.snippets (I am using honza / vim-snippets`.

Фрагменты для Java реализованы с использованием Python, поэтому ниже я также реализовал фрагмент с использованием Python (вы можете сделать это с помощью нескольких языков в UltiSnips).

Уже есть фрагмент для package, который добавляет просто слово "package", за которым следует заполнитель:

snippet pa "package" b
package $0
endsnippet

Давайте создадим фрагмент pad, который будет автоматически вставлять имя пакета на основе цепочки каталогов вместо $0 заполнителя:

snippet pad "package" b
package `!p

def get_package_string(base_dir_name):
  import os
  # Get absolute path of the package (without filename)
  absolute_path = os.getcwd().split("/")
  src_dir_index = 0

  # Find index of 'base_dir_name' element
  while absolute_path[src_dir_index] != base_dir_name:
    src_dir_index+=1

  # Create a 'package ' string, joining with dots
  package_string = ".".join(absolute_path[src_dir_index+1:])
  return package_string

# snip.rv is UltiSnips' return value we want to paste between ``
snip.rv = get_package_string("java")`

endsnippet

Обратите внимание, что это решение основано на том факте, что во многих проектах Java существует каталог src с каталогами main/java и test/java, и вы редактируете один из файлов в каталоге java ( например, для src/main/com/google/common он вернет com.google.common). Возможно, вам придется изменить это, чтобы сделать его более гибким.

Вы можете найти больше информации о создании фрагментов в скринкастах, связанных в README .

...