snippet yasnippet 简单使用

yasnippet 简单使用

新建snippet

M-x: +snippets/new
可以新建一个 snippets

snippet 语法

输入特殊符号

如输入 ` 需要写为 \`

占位符

使用$0 $1 … 占位, 可以有多个位置使用相同的占位符, 当占位符上有输入时, 其他相同占位符上的内容一并改变

占位符加默认输入

1
rand bit[7:0] ${0:val};

这样的话, $0 处的内容默认是val 当输入新的内容时会覆盖掉val, 注意, 如果其他地方有用$0 那么直接用$0 即可, 不需要用 ${0:val}

yasnippet Demo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# -*- mode: snippet -*-
# name: transaction
# uuid: transaction
# key: transaction
# condition: t
# --
class $0_transaction extends uvm_sequence_item;

   rand bit[7:0] ${1:val};

   \`uvm_object_utils_begin($0_transaction)
      \`uvm_field_int($1, UVM_ALL_ON)
   \`uvm_object_utils_end

   function new(string name = "$0_transaction");
      super.new();
   endfunction

   post_randomize 是SV 中提供的一个函数, 当某个类的实例的randomize 函数被调用后, post_randomize 会紧随其后无条件地被调用 
   function void post_randomize();
   endfunction

endclass

yasnippet 不对换行进行( newline )处理, 在 python 中多个 def 对齐尤其有用

1
2
3
4
5
6
7
# -*- mode: snippet -*-
# name: json
# uuid: json
# key: json
# condition: t
# expand-env: ((yas-indent-line 'fixed))
# --

只要在开头处加上 # expand-env: ((yas-indent-line 'fixed)) 即可
这样子 snippet 只, 所见即所得, 不然的话yasnippet 会在处理换行时帮你自动缩进