UltiSnips 扩展 java 包
UltiSnips expand java package
我希望能够编写一个 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
但是我得到了错误
Name __file__
does not exist
并且 os.getcwd()
不起作用,因为 returns 打开 vim 的目录,而不是包含当前缓冲区的目录。
我查看了 snip
对象,因为我知道它提供了 snip.fn
来获取文件名,但我无法确定它是否提供了当前文件的目录。
没关系,终于知道UltiSnips设置了一个全局变量“path
”
UltiSnips 在 java.snippets 中存储 Java 个片段,在我的机器上也是 ~/.vim/bundle/vim-snippets/UltiSnips/java.snippets (I am using
honza/vim-snippets`)。
Java 的代码片段是使用 Python 实现的,因此我也使用 Python 实现了下面的代码片段(您可以在 UltiSnips 中使用多种语言实现)。
已经有 package
的代码片段,它只添加了 "package" 个单词,后跟一个占位符:
snippet pa "package" b
package [=10=]
endsnippet
让我们创建一个 pad
片段,它会根据目录链自动插入包名称,而不是 [=15=]
占位符:
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
它将 return com.google.common
)。您可能需要修改它以使其更灵活。
您可以在 screencasts linked in its README 中找到有关创建片段的更多信息。
我使用文件路径和 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
我希望能够编写一个 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
但是我得到了错误
Name
__file__
does not exist
并且 os.getcwd()
不起作用,因为 returns 打开 vim 的目录,而不是包含当前缓冲区的目录。
我查看了 snip
对象,因为我知道它提供了 snip.fn
来获取文件名,但我无法确定它是否提供了当前文件的目录。
没关系,终于知道UltiSnips设置了一个全局变量“path
”
UltiSnips 在 java.snippets 中存储 Java 个片段,在我的机器上也是 ~/.vim/bundle/vim-snippets/UltiSnips/java.snippets (I am using
honza/vim-snippets`)。
Java 的代码片段是使用 Python 实现的,因此我也使用 Python 实现了下面的代码片段(您可以在 UltiSnips 中使用多种语言实现)。
已经有 package
的代码片段,它只添加了 "package" 个单词,后跟一个占位符:
snippet pa "package" b
package [=10=]
endsnippet
让我们创建一个 pad
片段,它会根据目录链自动插入包名称,而不是 [=15=]
占位符:
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
它将 return com.google.common
)。您可能需要修改它以使其更灵活。
您可以在 screencasts linked in its README 中找到有关创建片段的更多信息。
我使用文件路径和 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