有时我会错过使用IDE的懒惰,让我只需编写Java类的属性,然后让IDE生成所需的getter / setter。
Emacs可以这样做吗?
目前我只是从前一行复制粘贴一对getter / setter,然后复制粘贴并修改它。这很简单,但是,编码有点有趣:)
答案 0 :(得分:12)
你特别询问了如何生成一个getter / setter对。你可以写elisp来做这件事。但是研究更通用的解决方案可能会很有趣。
为了解决这个问题,我使用ya-snippet。该名称是指“又一个Snippet软件包”,因此您可以确定问题已经解决过。但是根据我的需要,我发现ya-snippet是最有用,最简单,最有效的解决方案。
对于带有getter / setter的属性,我输入
prop<TAB>
...我得到一个模板,然后我可以填写,就像表格一样。我指定属性的名称,并生成其他所有内容。很好,很容易。
这适用于您在代码中常用的任何微模式。我有一个单例,构造函数,for循环,switch语句,try / catch等的代码片段。
ya-snippet的密钥是没有要编写的elisp代码。基本上我只是提供模板的文本,它的工作原理。这是您在上面看到的getter / setter片段的ya-snippet代码:
# name : getter/setter property ... { ... }
# key: prop
# --
private ${1:Type} _${2:Name};
public ${1:Type} get$2 {
${3://get impl}
}
public void set$2($1 value) {
${4://set impl}
}
“# - ”之上的所有内容都是剪辑的元数据。 “密钥”是元数据中最重要的部分 - 它是可以扩展的短序列。该名称显示在yasnippet菜单上。 # --
行下面的内容是扩展代码。它包括几个填写字段。
YAsnippet适用于emacs(java,php,c#,python等)中的任何编程模式,它也适用于其他文本模式。
答案 1 :(得分:8)
我也在使用yasnippet,但这是一个更好的片段,imho:
# -*- mode: snippet -*-
# name: property
# key: r
# --
private ${1:T} ${2:value};
public $1 get${2:$(capitalize text)}() { return $2; }
public void set${2:$(capitalize text)}($1 $2) { this.$2 = $2; }
$0
例如,此代码通过10次击键生成(r
,C-o
,Long
,C-o
,id
,C-o
) :
private Long id;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
我建议将yas / expand绑定到C-o
而不是TAB以避免与之发生冲突
例如自动完成。
我有这个设置:
(global-set-key "\C-o" 'open-line-or-yas)
(defun open-line-or-yas ()
(interactive)
(cond ((and (looking-back " ") (looking-at "[\s\n}]+"))
(insert "\n\n")
(indent-according-to-mode)
(previous-line)
(indent-according-to-mode))
((expand-abbrev))
(t
(setq *yas-invokation-point* (point))
(yas/next-field-or-maybe-expand-1))))
(defun yas/next-field-or-maybe-expand-1 ()
(interactive)
(let ((yas/fallback-behavior 'return-nil))
(unless (yas/expand)
(yas/next-field))))
注意此代码中的某个地方(expand-abbrev)
。它允许我扩展,例如我定义时bis
到BufferedInputStream
:
(define-abbrev-table 'java-mode-abbrev-table
'(
("bb" "ByteBuffer" nil 1)
("bis" "BufferedInputStream" nil 1)
%...
))
答案 2 :(得分:3)
答案 3 :(得分:3)
如果您使用java-mode YASnippets by nekop,则会获得代码段prop
,该片段允许您定义私有变量,并自动为该变量创建getter和setter。该片段内容如下:
# -*- mode: snippet -*-
# name: property
# key: prop
# --
private ${1:String} ${2:name};$0
public $1 get${2:$(upcase-initials text)}() {
return $2;
}
public void set${2:$(upcase-initials text)}($1 $2) {
this.$2 = $2;
}
可以看出,这个片段与其他答案没有太大差别,只是它可能更好地格式化。另一个优点是它是Java的一个代码片段的一部分。