【问题标题】:UltiSnips expand java packageUltiSnips 扩展java包
【发布时间】: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

【问题讨论】:

  • 在我提供了原始问题的答案后,您已经完全改变了问题。

标签: java vim ultisnips


【解决方案1】:

UltiSnips 将 Java sn-ps 存储在 java.snippets 中,在我的机器上也是 ~/.vim/bundle/vim-snippets/UltiSnips/java.snippets (I am usinghonza/vim-sn-ps`。

Snippets for Java 是使用 Python 实现的,因此我也使用 Python 实现了下面的 sn-p(您可以在 UltiSnips 中使用多种语言来实现)。

package 已经有一个 sn-p,它只添加了“包”字,后跟一个占位符:

snippet pa "package" b
package $0
endsnippet

让我们创建一个pad sn-p,它将根据目录链自动插入包名,而不是$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/javatest/java 目录,并且您正在编辑 java 目录中的文件之一(例如对于src/main/com/google/common,它将返回com.google.common)。您可能需要对其进行修改以使其更加灵活。

你可以在screencasts linked in its README找到更多关于创建sn-ps的信息。

【讨论】:

  • 我收到name __file__ is not defined
  • 由于__file__不适用于您的情况,您可能想尝试:import inspect; filename = inspect.getfile(inspect.currentframe()))
  • os.getcwd() 不起作用,它获取的是打开vim 的目录,而不是当前打开的缓冲区所在的目录。
  • @theonlygusti 我看到你已经完全改变了这个问题(以前它没有任何代码)。我认为你应该问另一个问题。
【解决方案2】:

我使用最近的 pom.xml 中的文件路径和 groupId 和 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2013-10-30
    • 2017-10-08
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多