This action will force synchronization from my2817/spacemacs.d, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
tips: 以下系统环境安装过程中,如果下载包比较慢,可以试试搜索一下其对应的国内源,说不一定可以加速
既然都选择了 linux, 您随意就好
一般终端下默认的 shell 为 bash, 不妨( 强烈推荐
)换一个试试,比如此处提到的 zsh 。
plugins=(git zsh-syntax-highlighting zsh-autosuggestions fzf z)
其中三个插件还需要额外安装一下,工具如何使用还请看其相关文档……
The best editor is neither Emacs nor Vim, it’s Emacs and Vim!
在寻找写 verilog 代码的解决方案时接触到 verilog-mode, 然后才是 emacs, 接着便是 spacemacs, 最后才形成了我的 spacemacs.d
git clone https://gitee.com/mirrors/spacemacs ~/.emacs.d
cd ~/.emacs.d
git checkout -b develop origin/develop; #默认的master分支更新较慢
走到这一步,如果前面猴急,已经启动过 emacs, 请先将 “~/.emacs” 文件删除
git clone https://gitee.com/my2817/spacemacs-d ~/.spacemacs.d
→
回车CTRL-e 回车
emacs 中所有的操作都对应一个定义好的 function, 为了方便,已经将部分 function 绑定到特定的按键上,如后文介绍到的快捷键;一些知道名字,不知快捷键的 function 可以通过 Alt-x
(同时按下 ALT 和 x 两个键),然后输入对应的 function 名字进行执行。
spacemacs 中默认安装了 evil 插件,就我的使用经历,其模拟了 vi 所有的操作方式。
emacs
:如果直接使用本命令启动,每次都会打开一个全新进程,速度较慢,且各进程间的操作是独立的emacsclient -c -a “”
: 推荐使用本命令启动
spc
: 指代空格键,spacemacs 中将其设置为 leader key, 敲一下它,会给出一个引导菜单,每个字母对应一个操作spc f
: 两个按键用空格分隔,表示按键序列,先敲一下 spc
后敲 ~f~,文件操作相关,下面还有二级菜单,可以都看看,都是字面意思,就不详细介绍
spc f r
: 打开最近打开过的文件,通过访问历史,速度更快,似乎是我用的较多的操作ctrl-g
: 两个键中间有连字符,表示两个键同时按下;操作过程中的后悔药,中断当前操作的意思ctrl
: 这个键在 emacs 里用的比较多,同样的还有 alt
,为了偷懒,书写时:~ctrl~ == C
; alt
== M
.spc f f
: 过程中,浏览文件路径时,不论当前路径有多深,键入两个 /
, 会直接跳到文件系统的根目录,键入 ~~~, 则会跳转到用户的 HOME 目录下
C-j
: 同向下方向键,同 C-n
C-k
: 同向上方向键,同 C-p
C-h
: 到上一级目录C-l
: 同回车spc b
: 文件打开读入内存后就不叫文件了,叫 “buffer”, 相关操作集中定义在此
spc b r
: 还是最近打开过的文件C-y
C-f
C-b
M-m
代替
Esc
: 返回 normal 模式C-l
: 光标所在行居中C-[
: 仍然返回 normal 模式依赖插件:projectile. 一切皆文本,所谓 Project, 都是人为定义,这里的说一下定义 Project 的方式。
spc p
: Project 相关操作集中定义,前提是当前打开的文件已经在一个 Project 内部spc p f
: 打开 Project 内的文件
spc p b
: Project 内的 buffer 切换,限定在 Project 内部,再也不怕同时打开多个同名文件spc p r
: 打开 Project 内最近打开过的文件spc p G
: 根据语法,生成 Project 内所有源码文件的 TAGS 文件,放在 Project 的根目录下
-/digital/to_FPGA -/digital/sch -/digital/netlist
C-]
: 在 TAGS 中搜索光标所在位置的 symbol, 如果只有一个则直接跳转到其定义处;如果多个,则给出候选列表C-o
: 反向跳转如下所示,最大那个框叫 frame, 一个 frame 可以分割为多个 window, 每个 wdinow 里可以打开一个独立的 buffer ( 也可以是相同的,按使用需求选用吧 ),
+------------------------+--------------------------+
| | |
| | |
| | |
| window 1 | window 2 |
| | |
| | |
| | |
+------mode line---------+--------mode line---------+
| minibuffer |
+---------------------------------------------------+
- this diagram is drawed in artist-mode
- don't enable line number in artist-mode
- use set-mouse-color after exit artist-mode
spc w /
左右分割 windowspc w -
上下分割 windowspc w d
关闭当前 windowspc w Num
跳转到对应编号的 window, 编号在 window 左下角,spc w w
在 window 间循环跳转,只有两个 window 时习惯用这个,无脑切换本意是说多窗口布局吧,, 可以保存起来,多个 layout 可以比较方便的切换,而我个人习惯是将每个 Project 保存一个 layout, 方便不同 Project 间的切换,操作流程如下:
spc l
:spc l ?
: 查看按键绑定提示,此步随意spc l 0
: 新建一个 layout, 按提示输入一个名字,按我的用法就是输入 Project 名字spc p d
: 打开 Project 的根目录spc l S
: 保存当前的 layout 到一个文件
spc l L
: 打开保存好的 layout, 对于我来说是 Projectsp c x a
: align, 快捷键用于代码格式化,对齐spc j w C
: 在当前可视范围内,快速跳转到任何以字符 C
开始的 symbol 处,如果有多处,根据提示继续输入提示的按键序列spc j j C
: 同上,但不要求输入的 C
是 symbol 的开始字符spc s p
搜索当前 Project,或者 ~spc s d~搜索当前目录q
退出该模式参考 ediff-* 系列命令,很好用,该系列工具会出现至少包含一个名为 ”Ediff Control Pannel” 的窗口,只有选中它时,才能使用其相关命令: ?
查看帮助说明,再次 ?
隐藏帮助说明, # #
:比较时忽略空白符,执行此操作后再进行一次 !
, 就不会受空白符的影响了
ediff-current-file: 对当前文件更改前后的内容进行比较
比较项目 | 说明 | |
ediff-regions-linewise, ediff-regions- | 询问两个缓冲区的名字,然后比较相应的区域。不过你只能在每一个缓冲区中选定一个区域,而不能比较一个文件缓冲区的两个区域。 | |
ediff-buffers | 询问两个缓冲区的名字,然后比较 | |
ediff-files | 询问两个文件的名字,加载之,然后比较 | |
ediff-windows-linewise, ediff-windows-wordwise | 让你选两个窗口,然后比较窗口的内容。 -linewise- 函数比 -wordwise- 函数要快, | |
但另一方面, -wordwise- 工作方式更好,尤其是小区域作业时。 -linewise- 一行一行地比较, -wordwise- 一个单词一个单词地比较 | ||
---|---|---|
快捷键 | 命令 | 说明 |
q | ediff-quit | 关闭 ediff control buffer, 并退出 ediff |
Space 或 n | ediff-next-difference | 下一个差异处 |
Del 或 p | ediff-previous-difference | 上一个差异处 |
[n]j | ediff-jump-to-difference | 有数字前缀 [n] 修饰,第n个差异处,n可为负数 |
v 或 C-v | ediff-scroll-vertically | 所有缓冲区同步向下滚动 |
V 或 M-v | ediff-scroll-vertically | 所有缓冲区同步向上滚动 |
< | ediff-scroll-horizontally | 所有缓冲区同步向左滚动 |
> | ediff-scroll-horizontally | 所有缓冲区同步向右滚动 |
(vertical bar) | ediff-toggle-split | 切换缓冲区布局方式, 水平和竖直 |
m | ediff-toggle-wide-display | 在正常 frame 大小和最大化之间切换 |
a | ediff-copy-A-to-B | 把Buffer-A的内容复制到Buffer-B |
b | ediff-copy-B-to-A | 把Buffer-B的内容复制到Buffer-A |
r a 或 r b | ediff-restore-diff | 恢复 Buffer-A 或 Buffer-B 差异区域中的被修改的内容 |
A 或 B | ediff-toggle-read-only | 切换 Buffer-A 或 Buffer-B 的只读状态 |
g a 或 g b | ediff-jump-to-difference-at-point | 根据光标在缓冲区中的位置,设置一个离它们最近的差异区域为当前活动区域 |
C-l | ediff-recenter | 恢复先前的所有缓冲区比较的高亮差异区。 |
! |
ediff-update-diffs | 重新比较并高亮差异区域 |
w a 或 w b | ediff-save-buffer | 保存 Buffer-A 或 Buffer-B 到磁盘 |
E | ediff-documentation | 打开 Ediff 文档 |
z | ediff-suspend | 关闭 ediff control buffer, 只是挂起,可在以后恢复 ediff 状态 |
C-h m
: 列出当前打开的所有插件,以及对应的按键绑定C-Mouse_Right
: ctrl+鼠标右键呼出菜单C-h f
: spc h d f
, 查看 function 的说明文档C-h v
: spc h d v
, 查看 variable 的说明文档选中要操作的区域,再执行本命令(M-x delete-duplicate-lines) 或者使用以下awk命令(不需要事先排序)。原理为将要匹配的内容作为数组下标,如果该下标对应的值为 0 则打印,否则不打印。该命令中的 $0 表示行内容完全重复时,进行删除操作,相应替换为$n,则表示当第n个字段相同时,进行删除操作。
awk '!a[$0]++{print $0}'
语法见相关文档: 菜单 help-> search documentation ->,提示输入关键词,输入 “regexp” 凡事提示regexp的地方,均可使用regexp,
mkfontscale
mkfontdir
fc-cache
本配置中有两个输入方案可供使用:
(setq pyim-default-scheme 'wubi)
(setq pyim-default-scheme 'quanpin)
(setq pyim-default-scheme 'xiaohe-shuangpin)
(setq default-input-method "pyim")
一般遇到的问题、需求,别人已经帮我们解决,见Faq;在 verilog 模式下通过 ctrl + 鼠标右键呼出菜单,有3个 verilog 相关的菜单可关注一下
verilog相关插件有两个:
当执行verilog-auto时,可能出现提示 “end xxxxx properties”信息,但verilog-auto并没有执行完成,使用emacs的batch mode解决
emacs --batch file.v -f verilog-batch-auto
另,在我的配置中改写了verilog-mode中的一些函数,执行以上命令可能会出错,请使用以下命令:
emacs --batch file.v -l path/to/projectile.el -f verilog-batch-auto #在spacemacs中, projectile.el位置 ~/.emacs.d/elpa路径下,请自查
c-j
: down; c-k
: up; c-l
: 相当于回车
本补全方式中,有时可能需要用户输入相应的信息,此时需要从minibuffer输入,此时不能使用关键字补全功能
M-m i s
,always as eg:
c-x c-s
, c-c c-a
执行verilog-autoc-h v verilog-library-flags
】
麻烦的是每次遇到这问题都得在文件尾添加该语句。 我的解决方案是利用49.2.5 Per-Directory Local Variables, 假设使用以下目录结构:
project-root +---digital +--rtl +--sub-module-a | +--sub-module-a.v +--subm-module-b +--subm-module-b.v
命令 my-project-dir-local-init
会在project的根目录下生成一个.dir-locals.el的文件,内容如下,将 {protject-root}/digtal/rtl 路径之下的所有包含 .v 文件的路径都加入到 verilog-auto 的搜索路径 verilog-library-directories 中,路径下的 .v 文件均可被 verilog-auto 找到,可按需修改。
((verilog-mode . (
(eval .
(setq verilog-library-directories '("."))
)
(eval .
(mapcar
(lambda (file)
(add-to-list 'verilog-library-directories (file-name-directory file)))
(directory-files-recursively
(concat (projectile-project-root) "digital/rtl") "\.[s]?v$")
)
))
))
module top(/*autoarg*/);
sub1_x u_sub1 (/*autoinst*/);
sub2_xxxxx u_sub2 (/*autoinst*/);
sub3 #(/*autoinstparam*/)
u_sub3(/*autoinst*/);
endmodule // top
module sub1_x(/*autoarg*/);
input aa, bb, cc;
output dd;
endmodule // sub1
module sub2_xxxxx(/*autoarg*/);
input aa, bb, cc;
output dd;
endmodule // sub2
module sub3 #(parameter
PAR_A = 10,
PAR_BB = 20,
PAR_ccc = 30
)
(/*autoarg*/);
input aaxx, bbxx, cc;
output dd;
endmodule // sub3
// Local Variables:
// my-verilog-min-spc-for-align: 20
// End:
默认会在”verilog-auto”后自动执行本命令(如果模块实例已经例化完成<–各端口信号独占一行,也可手动执行”my-verilog-align-indent-inst-signal”)。结果如下,所有实例的左括号对齐,所有端口信号对齐,注意以下示例代码结束最后几行是在设置本地变量,将 my-veriog-auto-align 的值设置为 nil, 则不会在 verilog-auto 时自动执行对齐函数
module top(/*autoarg*/);
sub1_x u_sub1 (/*autoinst*/
// Outputs
.dd (dd),
// Inputs
.aa (aa),
.bb (bb),
.cc (cc));
sub2_xxxxx u_sub2 (/*autoinst*/
// Outputs
.dd (dd),
// Inputs
.aa (aa),
.bb (bb),
.cc (cc));
sub3 #(/*autoinstparam*/
// Parameters
.PAR_A (PAR_A),
.PAR_ccc (PAR_ccc))
u_sub3 (/*autoinst*/
// Outputs
.dd (dd),
// Inputs
.aaxx (aaxx),
.bbxx (bbxx),
.cc (cc));
endmodule // top
module sub1_x(/*autoarg*/
// Outputs
dd,
// Inputs
aa, bb, cc
);
input aa, bb, cc;
output dd;
endmodule // sub1
module sub2_xxxxx(/*autoarg*/
// Outputs
dd,
// Inputs
aa, bb, cc
);
input aa, bb, cc;
output dd;
endmodule // sub2
module sub3 #(parameter
PAR_A = 10,
PAR_BB = 20,
PAR_ccc = 30
)
(/*autoarg*/
// Outputs
dd,
// Inputs
aaxx, bbxx, cc
);
input aaxx, bbxx, cc;
output dd;
endmodule // sub3
// Local Variables:
// my-verilog-min-spc-for-align:1
// my-verilog-auto-align:t
// End:
a| = b a[ 0] = b
a = b a[ 1] = b
a = b a[ 2] = b
a = b a[ 3] = b
a = b ==> insert-indices ==> a[ 4] = b
a = b a[ 5] = b
a = b a[ 6] = b
a = b a[ 7] = b
a = b a[ 8] = b
buf buf| buf buf000 buf buf buf buf001 buf buf buf buf002 buf buf buf buf003 buf buf ==> generate-numbers ==> buf buf004 buf buf buf buf005 buf buf buf buf006 buf buf buf buf007 buf buf buf buf008"
/*-- org
!org --*/
在以下代码中嵌入了 plantuml 代码,光标在代码区域内时,通过 C-c C-c
会自动生成名为 fsm.png 的状态机转换图
module src_test;
/*-- org
#+begin_src plantuml :file fsm.png
@startuml
title Main FSM of dat_pop
state idle: default state
wait: a transition state
pop: data output
idle --> idle : reset
idle -down-> wait: posedge vsync
wait -> pop: almose full
pop -up->idle: error, need to reset
@enduml
#+end_src
!org --*/
endmodule
利用 emacs 自带的 artist-mode, 在一个 buffer 内画好后再复制到代码中;或者在代码中插入以下格式代码,光标移动到 artist 后,按 C-c ‘
,会打开一个以 artist-mode 为 major mode 的 buffer, 画好图后 ~, c~ 确认并退出,或者 ~, k~ 进行撤销
/*-- org
#+begin_src artist
#+end_src
!org --*/
使用以下变量可将不希望出现再端口列表中的信号排除
//
// Local Variables:
// verilog-auto-output-ignore-regexp:"\\(RSTN_EXT\\)"
// verilog-auto-input-ignore-regexp:"\\(CREG_SPD_COMB_EN\\)"
// End:
//
如果一个信号通过 autoinst 已经自动连接完成,需要强制加入到端口列表中,可以通过在适当的位置焦加入 output/input 关键字解决。 另一种情景是一个信号 A 如果已经通过 autooutput 呈现再端口列表中,端口列表的实顺序已经固定下来。此时如果将信号 A 接入到其他模块B中。信号 A 将不会自动出现再端口中,通过上面的方法的话可能改变端口顺序。此时可在例化模块 B 时,控制信号 A 的位置实现,如下代码所示,信号 A 前面没有类似 Inputs/Outputs 的关键字
sub_B u_B (
.A (A),
// Inputs
.CC (CC),
/*AUTOINST*/);
M-m s j
或者 SPC s j
提示如:通过 imenu 插件,其会搜索文件内的 module/inst/task/function 位置; 同时配置里改写了verilog-mode默认产生imenu的方式,verilog代码中加如类似 “//being: tagName” 的代码,将tagNmae加入到imenu中实现快速跳转到该tag,
module sub3 #(parameter
PAR_A = 10,
PAR_BBBBBB = 20,
PAR_ccc = 30
)
(/*autoarg*/
// Outputs
dd,
// Inputs
aaxx, bbxx, cc
);
input aaxx, bbxx, cc;
output dd;
localparam // begin:localparam
par_af = 10,
par_ad = 20;
always @ ( /*AUTOSENSE*/ ) begin
if (xx) begin:reset
end
else begin: proce
end
end
task func_a;
begin
end
endtask // func_a
function func_a;
begin
end
endfunction // func_a
endmodule // sub3
spc e v
: 大概得到如下信息,因为在我自己电脑上目前只安装了verilator, 如果有多个EDA工具可用的话,可使用 spc e s
进行选择
Syntax checkers for buffer tb.sv in verilog-mode: verilog-irun (disabled) - may enable: Automatically disabled! - executable: Not found verilog-iverilog (disabled) - may enable: Automatically disabled! - executable: Not found verilog-leda (disabled) - may enable: Automatically disabled! - executable: Not found verilog-verilator - may enable: yes - executable: Found at /usr/local/bin/verilator_bin
spc t s
:语法检查器开关eamcs里代码太长的时候,可以使用下面的函数对begin-end代码进行折叠
打开 verilog/SystemVerilog 文件后,自动在文件中搜索“Engineer : <user-login-name@system-name>”,并找到 user-login-name, 如果与当前用户名不一致,则将当前 buffer 设置为只读
Orange Your Life In Plain Text!
在任何 buffer 中使用插入 org 表格,使用 orgtbl-mode
;;这2个一个是用于 export 的,一个是用于本地显示的,最好配置成一样保证一致性。 都配置成 '{}的话表示_和^后面只有像这样用才会被认为是上标/下标。
(setq org-export-with-sub-superscripts '{});; 同 #+OPTIONS: ^:{}
(setq org-use-sub-superscripts '{})
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="../style/style.css" /> #+AUTHOR: 何云 #+title: Note of Synopsys tool chains #+OPTIONS: ^:nil
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(ruby . t)
(ditaa . t)
(python . t)
(sh . t)
(latex . t)
(plantuml . t)
(dot . t)
(R . t)))
module test;
input a;
output b;
endmodule
digraph G {
size="8,6"
ratio=expand
edge [dir=both]
plcnet [shape=box, label="PLC Network"]
subgraph cluster_wrapline {
label="Wrapline Control System"
color=purple
subgraph {
rank=same
exec
sharedmem [style=filled, fillcolor=lightgrey, shape=box]
}
edge[style=dotted, dir=none]
exec -> opserver
exec -> db
plc -> exec
edge [style=line, dir=both]
exec -> sharedmem
sharedmem -> db
plc -> sharedmem
sharedmem -> opserver
}
plcnet -> plc [constraint=false]
millwide [shape=box, label="Millwide System"]
db -> millwide
subgraph cluster_opclients {
color=blue
label="Operator Clients"
rankdir=LR
labelloc=b
node[label=client]
opserver -> client1
opserver -> client2
opserver -> client3
}
}
@startuml
start
if ( 中文测试,这是什么 )
: bbb;
endif
@enduml
web:https://github.com/manateelazycat/awesome-pair.git, 其提供的 function 可方便进行成对的括号 ~()[]{}""~ 插入与删除,其包含了一些边界算法。配置中的按键绑定与示例不同,见文件 ~/.spacemacs.d/layers/my-config/keybindings.el
'|' 表示光标所在位置 before keys after ----------- ----------- ----------- fo|o bar spc m ( (foo) bar |(foo bar)| spc m { {(foo bar)} (foo |bar) spc m ) foo bar
https://github.com/universal-ctags/citre
ctags required, jump to symbols’ definition, include third part library
在 package.el 中默认将 uvm 源代码添加到 ctags 的索引目录中,见 “citre-edit-cmd-buf-default-cmd”, 请按需修改。以便提供 uvm 代码相关的补全及源代码查看跳转
在生成 imenu 时,如果 tags 文件过大(citre-tags-imenu-create-tags-file-threshold),其会在临时目录生成当前文件的临时 tags(/tmp/citre-imenu.tags) 文件, read tag 后不会删除该临时文件,其他用户对该文件没有写权限,从而导致其他用户不能更新 imenu( 得到错误的 imenu ), 通过以下修正,在临时文件名中加入登录用户名解决
(defun citre-tags--imenu-temp-tags-file-path ()
"Return the temporary tags file path for imenu.
This also works on a remote machine."
(if (file-remote-p default-directory)
(expand-file-name (concat (user-login-name) "_citre-imenu.tags")
(tramp-get-remote-tmpdir
(tramp-dissect-file-name default-directory)))
(expand-file-name (concat (user-login-name) "_citre-imenu.tags") temporary-file-directory)))
本节集中罗列一下我平时用到的工具
https://github.com/junegunn/fzf
https://github.com/BurntSushi/ripgrep
https://github.com/universal-ctags/ctags
https://ohmyz.sh
plugins=(git zsh-syntax-highlighting zsh-autosuggestions fzf)
https://www.autohotkey.com/
搜索、激活窗口任务,默认绑定在大小写按键上:https://autohotkey.com/board/topic/30487-iswitchw-cosmetically-enhanced-edition/
快速文件搜索
https://u.tools/, 其可以集成 everything 的搜索结果,但不止与此,其还包含其他插件功能,比如聚合翻译、窗口切换( https://yuanliao.info/d/1461 可绑定快捷键到功能关键字上(比如 alt+` = winman))、迅飞ocr 文字识别。
多文件管理器,可多标签,且标签下的路径可更改(重新打激活标签后复位到原值)或固定
截图工具,两点在于可以贴图,把截图固定在桌面的最上层(可以固定多个截图)
https://github.com/kvakulo/Switcheroo, 又一个窗口切换,类似于 iswitchw 和 utools 的 winman 插件, 在设置里勾选 “Activate Switcheroo with Alt+Tab”, 替换 windows 默认的 Alt+Tab 功能
copy cut file by by terminal command
电脑实时按键展示
轻量级pdf阅读器,支持多标签页,高级选项下可直接编辑前景、背景色: https://www.sumatrapdfreader.org/
BackgroundColor = #c7edcb
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。