I am back
Long time no see.
Long time no see.
当没有root权限但是又想要安装一个module的时候,可以通过编译module源码的方式来实现. 比如我想要安装template-toolkit, 那么我就去官网 下载源码. 然后在terminal中依次执行以下命令.
$ tar zxf Template-Toolkit-2.26.tar.gz
$ cd Template-Toolkit-2.26
$ perl Makefile.PL PREFIX=/Users/user/test/local/perl
$ make
$ make test
$ make install
然后在自己的perl文件中,加上一条:
use lib "/Users/user/test/local/perl/lib/perl5/site_perl/5.18.2/darwin-thread-multi-2level";
这样就可以使用我们新安装的module了。
verilog中的模块例化等快捷操作,在Emacs中的verilog-mode下,非常强大和方便。让非Emacs用户也可以享受到它的便利,需要做一下小小的包装。这个包装脚本很简单,等下周一给同事们推广一下,看看效果反馈。
转眼2018年了,也不知道要写点啥了.
结合到自己的工作流程中. 比如我有一个shell脚本针对我的某一个项目的工作, 它帮我预先配置好环境.
#!/bin/sh
# 判断后台是否已经有名为bba的session
tmux has-session -t bba
if [ $? != 0 ]
# 如果没有, 那么建立这个session
then
# 建立一个名为bba的session, 同时window名为editor
tmux new-session -s bba -n editor -d
# 预先输入一组命令, 提供工作效率, C-m表示回车键
tmux send-keys -t bba 'newgrp kobra' C-m
tmux send-keys -t bba 'cd /vobs/fpga/cobra' C-m
tmux send-keys -t bba 'ct setview ezyaohe_1' C-m
tmux send-keys -t bba 'module add cobra/3.1' C-m
tmux send-keys -t bba 'emacs' C-m
# 竖直拆分成2个panes
tmux split-window -v -t bba
# 选择一个布局样式
tmux select-layout -t bba main-horizontal
# 向第二个pane里输入一组命令,类似于上面的
tmux send-keys -t bba:1.2 'newgrp kobra' C-m
tmux send-keys -t bba:1.2 'cd /vobs/fpga/cobra' C-m
tmux send-keys -t bba:1.2 'ct setview ezyaohe_1' C-m
tmux send-keys -t bba:1.2 'module add cobra/3.1' C-m
# 新开一个window,名为console
tmux new-window -n console -t bba
# 向第二个window中输入一组命令
tmux send-keys -t bba:2 'newgrp kobra' C-m
tmux send-keys -t bba:2 'cd /vobs/fpga/cobra' C-m
tmux send-keys -t bba:2 'ct setview ezyaohe_1' C-m
tmux send-keys -t bba:2 'module add cobra/3.1' C-m
tmux send-keys -t bba:2 'cd /proj/cobra/verif/ezyaohe' C-m
# 光标回到第一个window
tmux select-window -t bba:1
fi
# 连接bba这个session
tmux attach -t bba
<img src="../../images/tmuxworkflow.png" class="img-thumbnail" width="90%" >
定制我们的Tmux.
启动Tmux时,会自动去source ~/.tmux.conf文件.
先来看看我的.tmux.conf文件内容.
# It is for tmux-2.4
# Set the base index for windows to 1 instead of 0
set -g base-index 1
# Set the base index for panes to 1 instead of 0
setw -g pane-base-index 1
# Reload the file with Prefix r
bind r source-file ~/.tmux.conf \; display "Reloaded!"
# splitting panes
bind | split-window -h
bind - split-window -v
# moving between panes
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Pane resizing
bind -r H resize-pane -L 2
bind -r J resize-pane -D 2
bind -r K resize-pane -U 2
bind -r L resize-pane -R 2
# Set the default terminal mode to 256color mode
set -g default-terminal "screen-256color"
# set the status line's colors
set -g status-fg white
set -g status-bg black
# set the color of the window list
setw -g window-status-fg cyan
setw -g window-status-bg default
setw -g window-status-attr dim
# set colors for the active window
setw -g window-status-current-fg white
setw -g window-status-current-bg red
setw -g window-status-current-attr bright
# pane colors
set -g pane-border-fg green
set -g pane-border-bg black
set -g pane-active-border-fg white
set -g pane-active-border-bg yellow
# Command / message line
set -g message-fg white
set -g message-bg black
set -g message-attr bright
# Status line left side
set -g status-left-length 40
set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P"
# Update the status bar every sixty seconds
set -g status-interval 60
# Center the window list
set -g status-justify centre
# Mouse support
set-option -g mouse on
# Move like vi
setw -g mode-keys vi
上一篇介绍提到buffer模式中的移动以及复制, 当我们用命令"setw -g mode-keys vi"时,我们在buffer模式移动时就和vi一样了, 比如"gg"到buffer首端, "G"到buffer末端, 空格开始选择要copy的部分, 回车退出copy部分的选择, "prefix ]"是黏贴.
调整好了再看看tmux的样式.
<img src="../../images/tmuxconf.png" class="img-thumbnail" width="90%" >
Tmux可以理解为是一个terminal控制器, 是对我们的terminal的扩展, 同时我们可以利用它来建立自己的一套workflow.
先上一张图,感受一下.
<img src="../../images/tmux.png" class="img-thumbnail" width="90%" >
Terminal的上半部分是打开了vim准备编辑, 下半部分竖直拆分成2个部分.
原因一, 在一个Terminal上实现了多窗口控制,便于写代码同时调试;
原因二, Tmux为我们在后台保存了一个进程, 记录了我们当前的窗口状态, 即使关闭这个Terminal, 只要下次再打开Tmux,立刻恢复退出前的状态.
原因三, 我们可以给Tmux提供一组配置文件, 这样可以在每次建立窗口前, 预先设置好环境, 提高了工作效率.
首先,先建立一个Tmux进程, 这里有专门的术语session.
tmux new -s abc
我们通过上面的命令得到了一个Tmux session,名字叫abc.
<img src="../../images/newsession.png" class="img-thumbnail" width="90%" >
这个时候Terminal底部的绿色状态栏提示我们,目前是在一个Tmux的session中.现在我们就可以做一些分割窗口的操作了.Tmux的所有命令都有同样的一个前缀,就是"ctrl-b"1. 我们按"ctrl-b", 然后按"%", 为了便于说明我用"prefix %"来表示. Terminal就被竖直分成了两个部分.这每一部分称为pane.在pane之间来回移动光标的命令是"prefix o"2.
<img src="../../images/split.png" class="img-thumbnail" width="90%" >
我们先断开session连接, 命令是"prefix d".
然后在terminal中输入命令,来查看后台有哪些Tmux的session.
tmux ls
结果显示如下, 有一个Tmux后台进程, session名为abc.
<img src="../../images/tmuxls.png" class="img-thumbnail" width="90%" >
我们再通过下面的命令,重新连接到session abc去.
tmux attach -t abc
连接或者新打开一个session, 我们就得到了一个window. window可以被拆成若干pane. 新建一个window的快捷键是"prefix c", 关闭一个window的快捷键是"prefix &".
当我们想copy terminal显示的内容时, 我们需要进入buffer模式, 快捷键是"prefix [".
在buffer中移动以及其他操作我们留在下一篇介绍里说.
在非buffer模式, 如果想paste内容, 快捷键是"prefix ]".
<img src="../../images/tmuxbuf.png" class="img-thumbnail" width="90%" >
注意右上脚的行号显示, 表示我们现在是buffer模式. (按"q"退出buffer模式)
以前一直觉得emacs的列操作不如vim好用,经过最近一段时间的深入使用,让我的看法有所改变。比如下面的代码我想多加4组agent,那么怎么做呢?
agent0 u_agent_0(.clk1(clk),.rst1(rst));
agent1 u_agent_1(.clk1(clk),.rst1(rst));
agent2 u_agent_2(.clk1(clk),.rst1(rst));
agent3 u_agent_3(.clk1(clk),.rst1(rst));
先copy四行出来。
agent0 u_agent_0(.clk1(clk),.rst1(rst));
agent1 u_agent_1(.clk1(clk),.rst1(rst));
agent2 u_agent_2(.clk1(clk),.rst1(rst));
agent3 u_agent_3(.clk1(clk),.rst1(rst));
// the 4 lines below are copied from above
agent0 u_agent_0(.clk1(clk),.rst1(rst));
agent1 u_agent_1(.clk1(clk),.rst1(rst));
agent2 u_agent_2(.clk1(clk),.rst1(rst));
agent3 u_agent_3(.clk1(clk),.rst1(rst));
然后,先选中要修改的4行,然后M-C-%(或者M-x,键入query-replace-regexp, 回车),在mini-buffer中输入被替换的表达式是
[0-9]+
目标表达式是
\, (+ 4 \#&)
然后回车,就有一个交互式提示,想要替换掉的,按y,不想替换的按n,如果想全部替换的话,按!,具体命令可以按?来查询。 如图所示。
<img src="../../images/emacs.PNG" class="img-thumbnail" width="60%" >
经过4轮的"yynn"后就得到了下面的代码。
agent0 u_agent_0(.clk1(clk),.rst1(rst));
agent1 u_agent_1(.clk1(clk),.rst1(rst));
agent2 u_agent_2(.clk1(clk),.rst1(rst));
agent3 u_agent_3(.clk1(clk),.rst1(rst));
// the 4 lines below are copied from above, then replace
agent4 u_agent_4(.clk1(clk),.rst1(rst));
agent5 u_agent_5(.clk1(clk),.rst1(rst));
agent6 u_agent_6(.clk1(clk),.rst1(rst));
agent7 u_agent_7(.clk1(clk),.rst1(rst));
这个过程略显复杂,如果是emacs版本25.2的话,就可以使用(rectangle-mark-mode)来单独选中要改变的列,然后整体替换就ok了。 如下图所示。
<img src="../../images/emacs-rect.PNG" class="img-thumbnail" width="60%" >
<img src="../../images/emacs-rect-2.PNG" class="img-thumbnail" width="60%" >
使用openxmlformat格式来描述,可以用WORD打开的xml文档。
无意中看到SNUG的一个文章,作者通过使用Verdi来生成Emacs以及Vim的tags文件,很棒。我一直没有找到特别好的办法来用Emacs浏览verilog 代码工程,之前也是使用Emacs的插件projectile来grep关键字。我赶紧按照作者的描述操作起来了。
<img src="../../images/tags.png" class="img-thumbnail" width="60%" >
作者的tcl脚本是放在这里的 ,居然排在第一个。
<img src="../../images/vcc.PNG" class="img-thumbnail" width="60%" >
在Verdi打开tcl命令窗口,然后source下载的tcl脚本。
<img src="../../images/verdi.PNG" class="img-thumbnail" width="60%" >
生成的vim版本的tags文件是ok的,能用。Emacs版本的TAGS文件居然不能跳转!
仔细查了一遍,应该是作者把emacs tags文件的格式弄错了,看来作者一定是vim用户了,或者我使用的emacs版本(25.2)太高了?
再看了一遍论文,作者文字描述的格式和他实际脚本生成的TAGS格式不一致,把tag_definition_text丢掉了,所以跳转有问题。
<img src="../../images/emacs_tags_format.png" class="img-thumbnail" width="60%" >
去官网查到了npi参考手册,fix一下tcl代码。
foreach {index tagInfo} $sorted_ident {
set srcFile [lindex [split $tagInfo] 1]
if {$fileName == $srcFile} {
set tag [lindex [split $tagInfo] 0]
set line [lindex [split $tagInfo] 2]
set offset $byteCounts($line)
#======= fix by yaohe begin ===========#
#set entry "\x7f$tag\x01,$offset"
set file_hdl [npi_text_file_by_name -name "$srcFile"]
set line_hdl [npi_text_line_by_number -ref $file_hdl -number $line]
set line_content [npi_text_property_str -type npiTextLineContent -ref $line_hdl]
regsub {\n$} $line_content {} line_content
set entry "$line_content\x7f$line,$offset"
#======= fix by yaohe end ===========#
append entryList "\n" $entry
}
}
终于好用了。
<img src="../../images/emacs_tags_ok.png" class="img-thumbnail" width="60%" >
新的tcl代码我备份我的github上,因为实在联系不上作者。