如何根据缓冲区的目录编写扩展为Java包声明的YASnippet?

N.N*_*.N. 1 java emacs yasnippet

定义Java类的文件可以通过声明它们属于特定包来组织成包,例如

package foo.bar;
Run Code Online (Sandbox Code Playgroud)

它声明有问题的文件属于包的子barfoo.然后将文件存储在具有与包的层次结构相对应的层次结构的目录中.此外,包层次结构的根通常是某个目录src.是否可以编写一个扩展为包声明的YASnippet,以便从当前文件的路径获取包名?

N.N*_*.N. 7

您可以编写带有嵌入式Emacs Lisp 的片段,该片段获取缓冲区的路径,并通过将目录src视为包层次结构中的根来将其转换为包名:

# -*- mode: snippet -*-
#name : package
#key : pa
# --
package ${1:`(mapconcat 'identity (cdr (member "src" (split-string default-directory "/" t))) ".")`};$0
Run Code Online (Sandbox Code Playgroud)

这将识别多级包层次结构,即如果您正在编辑的文件的缓冲区的路径是/home/nn/src/foo/bar/Baz.java,则代码段将扩展为

package foo.bar;
Run Code Online (Sandbox Code Playgroud)

请注意,这要求您使用src作为存储包层次结构的根目录.如果缓冲区路径中有名为src的目录,则代码段将扩展为

package ;
Run Code Online (Sandbox Code Playgroud)

要让代码段将其他目录识别为包层次结构中的根,只需替换"src"为所需的目录名称即可.