同步操作将从 my2817/spacemacs.d 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。