Install Perl Module without Root Priviledge


当没有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了。

Autoinst


verilog中的模块例化等快捷操作,在Emacs中的verilog-mode下,非常强大和方便。让非Emacs用户也可以享受到它的便利,需要做一下小小的包装。这个包装脚本很简单,等下周一给同事们推广一下,看看效果反馈。

Tmux Introduction III


结合到自己的工作流程中. 比如我有一个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 Introduction II


定制我们的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 Introduction I


什么是Tmux?

Tmux可以理解为是一个terminal控制器, 是对我们的terminal的扩展, 同时我们可以利用它来建立自己的一套workflow.

先上一张图,感受一下.

<img src="../../images/tmux.png" class="img-thumbnail" width="90%" >

Terminal的上半部分是打开了vim准备编辑, 下半部分竖直拆分成2个部分.

为什么要用Tmux?

原因一, 在一个Terminal上实现了多窗口控制,便于写代码同时调试;

原因二, Tmux为我们在后台保存了一个进程, 记录了我们当前的窗口状态, 即使关闭这个Terminal, 只要下次再打开Tmux,立刻恢复退出前的状态.

原因三, 我们可以给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

window概念

连接或者新打开一个session, 我们就得到了一个window. window可以被拆成若干pane. 新建一个window的快捷键是"prefix c", 关闭一个window的快捷键是"prefix &".

buffer概念

当我们想copy terminal显示的内容时, 我们需要进入buffer模式, 快捷键是"prefix [".

在buffer中移动以及其他操作我们留在下一篇介绍里说.

在非buffer模式, 如果想paste内容, 快捷键是"prefix ]".

<img src="../../images/tmuxbuf.png" class="img-thumbnail" width="90%" >

注意右上脚的行号显示, 表示我们现在是buffer模式. (按"q"退出buffer模式)

Footnotes:

1

"-"表示两个键同时按.

2

" "表示按键依次按.

Emacs column edit


以前一直觉得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%" >

Generate Tags for Emacs by Verdi


Generate Tags for Emacs by Verdi

无意中看到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上,因为实在联系不上作者。