Java 如何编写一个YASnippet,根据缓冲区';s目录?

Java 如何编写一个YASnippet,根据缓冲区';s目录?,java,emacs,yasnippet,Java,Emacs,Yasnippet,定义Java类的文件可以通过声明它们属于特定的包来组织成包,例如 package foo.bar; 声明该文件属于包foo的子包bar。然后,文件存储在目录中,目录的层次结构与包的层次结构相对应。此外,包层次结构的根通常是某个目录src。是否可以编写扩展为包声明的YASnippet,以便从当前文件的路径获取包名?您可以使用嵌入式Emacs Lisp编写,通过将目录src视为包层次结构中的根,获取缓冲区的路径并将其转换为包名: #-*-模式:代码段-*- #名称:包裹 #钥匙:pa # -- 包

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

package foo.bar;
声明该文件属于包
foo
的子包
bar
。然后,文件存储在目录中,目录的层次结构与包的层次结构相对应。此外,包层次结构的根通常是某个目录
src
。是否可以编写扩展为包声明的YASnippet,以便从当前文件的路径获取包名?

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

#-*-模式:代码段-*-
#名称:包裹
#钥匙:pa
# --
包${1:`(mapconcat'标识(cdr(成员“src”(拆分字符串默认目录”/“t)))`$0
这将识别多级包层次结构,即,如果您正在编辑的文件的缓冲区路径为/home/nn/src/foo/bar/Baz.java,则代码段将扩展为

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

包;
要让代码段识别包层次结构中的某个其他目录作为根目录,只需将
“src”
替换为所需的目录名。

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

#-*-模式:代码段-*-
#名称:包裹
#钥匙:pa
# --
包${1:`(mapconcat'标识(cdr(成员“src”(拆分字符串默认目录”/“t)))`$0
这将识别多级包层次结构,即,如果您正在编辑的文件的缓冲区路径为/home/nn/src/foo/bar/Baz.java,则代码段将扩展为

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

包;

要让代码段识别包层次结构中的某个其他目录作为根目录,只需用所需的目录名替换
“src”

这是我在尝试Java时的设置:

# -*- mode: snippet -*-
# name: package
# key: pa
# --
`(insert (concat "package " (java-package-name (buffer-file-name)) ";\n"))`
上述功能定义为:

(defun java-package-name (file)
  "Generates package name for FILE, based on path."
  (let* ((f (file-name-directory file))
         (rem
          (car
           (sort
            (delq nil
                  (mapcar
                   (lambda(x)
                     (and (string-match (expand-file-name x) f)
                          (substring f (match-end 0))))
                   (parse-colon-path (getenv "CLASSPATH"))))
            (lambda (a b) (< (length a) (length b)))))))
    (cond
     ((null rem)
      "Not on CLASSPATH.")
     ((= 0 (length rem))
      "At root of CLASSPATH")
     (t
      (mapconcat
       #'downcase
       (delete "" (split-string rem "[\\\\/]"))
       ".")))))
(定义java包名称(文件)
根据路径为文件生成包名
(let*((f(文件名目录文件))
(雷姆
(汽车
(分类
(德尔克零
(地图车
(λ(x)
(和(字符串匹配(扩展文件名x)f)
(子字符串f(匹配结束0)))
(解析冒号路径(getenv“CLASSPATH”))
(λ(ab)(<(长度a)(长度b()()())))
(续)
((空rem)
“不在类路径上。”)
(=0(长度rem))
“在类路径的根目录下”)
(t
(mapconcat)
#“唐卡斯
(删除“”(拆分字符串rem“[\\/]”)
".")))))

它检查您的
类路径
以查找最短的包名。

这是我在试用Java时的设置:

# -*- mode: snippet -*-
# name: package
# key: pa
# --
`(insert (concat "package " (java-package-name (buffer-file-name)) ";\n"))`
上述功能定义为:

(defun java-package-name (file)
  "Generates package name for FILE, based on path."
  (let* ((f (file-name-directory file))
         (rem
          (car
           (sort
            (delq nil
                  (mapcar
                   (lambda(x)
                     (and (string-match (expand-file-name x) f)
                          (substring f (match-end 0))))
                   (parse-colon-path (getenv "CLASSPATH"))))
            (lambda (a b) (< (length a) (length b)))))))
    (cond
     ((null rem)
      "Not on CLASSPATH.")
     ((= 0 (length rem))
      "At root of CLASSPATH")
     (t
      (mapconcat
       #'downcase
       (delete "" (split-string rem "[\\\\/]"))
       ".")))))
(定义java包名称(文件)
根据路径为文件生成包名
(let*((f(文件名目录文件))
(雷姆
(汽车
(分类
(德尔克零
(地图车
(λ(x)
(和(字符串匹配(扩展文件名x)f)
(子字符串f(匹配结束0)))
(解析冒号路径(getenv“CLASSPATH”))
(λ(ab)(<(长度a)(长度b()()())))
(续)
((空rem)
“不在类路径上。”)
(=0(长度rem))
“在类路径的根目录下”)
(t
(mapconcat)
#“唐卡斯
(删除“”(拆分字符串rem“[\\/]”)
".")))))
它检查您的
类路径
,寻找最短的包名