星期五, 四月 10, 2020

VIM学习笔记 替换字符串中的元字符(Metacharacters in Replacement Strings)

在替换和全局命令中, 某些元字符(metacharacters)在查找表达式和替换表达式中的含义是不同的。

例如以下命令,查找部分中的“.”因为有特殊意义,所有需要进行转义;而替换部分中的“.”和“$”则会被视为普通文本。

:%s/1\. Start/2. Next, start with $100/

1. Start   -------->   2. Next, start with $100

例如以下命令,会将“A”或“B”或“C”,分别替换为“[abc]”。也就是说,“[]”在替换部分也会被视为普通文本。

:%s/[ABC]/[abc]/g

ABC   -------->   [abc][abc][abc]

替换表达式中的元字符(Metacharacters)

元字符替换内容命令实例替换前替换后
\n\1-\9
查找表达式中由\(\)定义的第n个组
:%s/\(.*\) = \(.*\)/\2 = \1/x = yy = x
\l将下一个字符转换为小写:%s/Yes, Sir/\lYes, \lSir/Yes, Siryes, sir
\L将之后所有字符转换为小写:%s/Yes, Sir/\LYes, Sir/Yes, Siryes, sir
\u将下一个字符转换为大写:%s/yes, sir/\uyes, \usir/yes, sirYes, Sir
\U将之后所有字符转换为大写:%s/yes, sir/\Uyes, sir/yes, sirYES, SIR
\e结束\U和\L:%s/yes, sir/\Uyes, \esir/yes, sirYES, sir
\E:%s/yes, sir/\Uyes, \Esir/yes, sirYES, sir
\r换行符:%s/yes, sir/yes\rsiryes, siryes
sir
\转义符
将之后的特殊字符解释为普通文本
:%s/yes, sir/yes\\sir/yes, siryes\sir
&查找表达式所匹配的文本:%s/yes, sir/"&"/yes, sir"yes, sir"
~上一次替换命令中的替换文本:s/thier/their/thiertheir
:s/his/~/histhier

使用元字符交换文本位置

使用以下命令,可以交换以逗号分隔的列:

:%s/\([^,]*\),\([^,]*\),\(.*\)/\2,\1,\3/

Regex_Replacement_SwitchFields

查找表达式包括:

  • \([^,]*\),匹配除逗号之外的所有字符,即将第一列的内容捕获为组1;
  • \([^,]*\),匹配除逗号之外的所有字符,即将第二列的内容捕获为组2;
  • \(.*\),匹配剩余的所有字符,捕获为组3;

替换表达式包括:

  • \2,\1,\3,按照组2组1组3的顺序恢复各组的内容,即交换第二列与第一例的次序。

请注意,作为分隔符的逗号,在查找和替换部分均被视为普通文本。

假设需要将以下记录中的Name字段,转换为Firstname Lastname的形式:

Name: McFly, Susan S.; Areas: Graphics; Phone: 999-3333

可以使用以下命令,将逗号之前的Lastnmae捕获至组1,将分号之前的Firtname捕获至组2,然后再按照从组2到组1的顺序进行替换:

:%s/: \([^,]*\), \([^;]*\);/: \2 \1;/

Name: Susan S. McFly; Areas: Graphics; Phone: 999-3333

使用以下全局命令,则可以将替换操作限制在以“Name:”开头的行:

:g/^Name/s/: *\([^,]*\), \([^;]*\);/: \2 \1;/

使用元字符转换大小写

使用以下命令,将单词首字母转换为大写:

:%s/\<\(.\)\([^[:space:][:punct:]]*\)\>/\u\1\2/g

Regex_Replacement_TitleCase

查找表达式包括:

  • \<,匹配单词开头;
  • \(.\),匹配单词首字母,捕获为组1;
  • \([^[:space:][:punct:]]*\),匹配除空格和标点符号之外的字符串,即将单词首字母之外的其余部分捕获为组2;
  • \>,匹配单词末尾;

替换表达式包括:

  • \u,将下一个字符转换为大写;
  • \1,恢复捕获组1(即单词首字母)
  • \2,恢复捕获组2(即单词剩余部分)

使用以下命令,可以将匹配文本全部转换为大写:

:%s/Fortran/\U&/

fortran   -------->   FORTRAN

使用元字符进行精确替换

假设以下代码中rotine的名称以“test”为前缀,以“box”为后缀,而黄色高亮的中间部分则是可变的:

Regex_example_suffix_0

如果希望将后缀替换为“block”,那么可以将可变的字母作为捕获组进行替换:

:g/test\([abc]\)box/s//test\1block/g

Regex_example_suffix_1

假设需要将代码中“?dep=01”替换为:

{{path('index',{dep:01})}}

也就是说,只替换表达式的字符部分,但保留数字部分不变。可以使用(\d\d)捕获两位数字部分,然后在替换时使用\1来恢复数字:

:%s/?dep=\(\d\d\)/{{path('index',{dep:\1})}}/g

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期二, 三月 24, 2020

VIM学习笔记 编译源码(Compile Code)-Java

秉承Java语言“一次编写,处处运行(write once, run anywhere)”的宗旨。Java程序需要虚拟机JVM(Java Virtual Machine)来负责解释执行,而并非操作系统。也就是说,需要针对不同的操作系统安装不同版本的运行环境JRE(Java Runtime Environment)来运行Java程序。

如果需要开发Java程序,那么则需要安装JDK (Java Development Kit),以完成下图所示的编译和执行过程。

Java-jvm-compile

以下操作在Fedora31下验证成功。在不同的操作系统中,以下命令和参数也可能略有不同,请根据实际情况进行调整。

安装Java

使用以下命令安装JDK(具体步骤可以参考Installing Java);

$ sudo dnf install java-1.8.0-openjdk-devel.x86_64

如果需要使用JWS(Java Web Start)以运行JNPL文件,那么还需要安装IcedTea-Web

$ sudo dnf install icedtea-web

配置Java

如果安装了多个版本的JDK、JRE、和JWS,那么可以使用以下命令进行切换:

$ alternatives --config java

alternatives--config-java

$ alternatives --config javac

$ alternatives --config javaws

测试Java

使用以下命令,查看当前Java版本:

$ java -version

java-version

使用以下命令,查看当前Javac版本:

$ javac -version

javac-version

使用以下命令,查看当前Javaws版本:

$ javaws http://nextmidas.techma.com/nxm343/htdocs/localshell.jnlp

您可以尝试打开本地的JNPL文件,或者使用IcedTea-Web-Tests提供的测试网址。

javaws-test

设置编译器

使用以下命令,设置'makeprg'选项为javac命令:

:set makeprg=javac\ %

通过在vimrc文件中增加以下自动命令,可以为Java语言文件设置编译快捷键:

augroup make_java
 au!
 au FileType java  set makeprg=set makeprg=javac\ %
 au FileType java  map <buffer> <leader><space> :w<cr>:make<cr>
augroup end

编译Java

使用以下命令,将根据'makeprg'选项进行编译,并生成与.java文件同名的.class字节码文件:

:make

如果编译出现错误,将在QuickFix中显示错误列表,并自动跳转到第一个错误处:

javac_error_quicklist

如果希望在编译时保持当前光标位置不变,那么可以使用以下命令:

:make!

使用:cw命令,将打开quickfix窗口。使用:cp命令,跳转到上一个错误;使用:cn命令,跳转到下一个错误。关于QuickFix操作的更多信息,请参阅QuickFix章节。

在修复错误并成功编译之后,将显示命令输出:

javac_success_output

使用以下命令,首先Java虚拟机将编译好的.class文件加载到内存,然后针对其中的Java类进行解释执行:

:!java %:r

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期日, 三月 22, 2020

VIM学习笔记 编译源码(Compile Code)-C

以下操作在Fedora31下验证成功。在不同的操作系统中,以下命令和参数也可能略有不同,请根据实际情况进行调整。

设置编译器

使用以下命令,确认可以正常运行GCC编译器:

$ gcc --version

gcc_version_Linux

使用以下命令,设置'makeprg'选项为gcc命令:

:set makeprg=gcc\ -o\ %<\ %

编译源码

使用以下命令,将根据'makeprg'选项进行编译,并生成文件:

:make

如果编译出现错误,将在QuickFix中显示错误列表,并自动跳转到第一个错误处:

gcc_error_quicklist

如果希望在编译时保持当前光标位置不变,那么可以使用以下命令:

:make!

使用:cw命令,将打开quickfix窗口。使用:cp命令,跳转到上一个错误;使用:cn命令,跳转到下一个错误。关于QuickFix操作的更多信息,请参阅QuickFix章节。

使用:cl命令,可以列示所有错误信息:

gcc_error_quicklist_cl

在修复错误并成功编译之后,将显示命令输出:

gcc_success_output

使用以下命令,可以执行编译后的程序:

:!./%:r

配置编译环境

通过在vimrc文件中增加以下自动命令,可以为C语言文件设置编译快捷键:

augroup make_c
 au!
 au FileType c,cpp  set makeprg=gcc\ -o\ %<\ %
 au FileType c,cpp  map <buffer> <leader><space> :w<cr>:make<cr>
augroup end

如果不希望修改'makeprg'选项,那么可以定义快捷键来完成编译和执行程序的操作:

map <F8> :w <CR> :!gcc % -o %< && ./%< <CR>

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期五, 三月 13, 2020

VIM学习笔记 网页开发-选择颜色(Select Color)

HTML-Editor插件

我在Christian J Robinson开发的HTML插件的基础之上,制作了HTML-Editor插件。使用:ColorSelect命令或者;#快捷键,可以在新建窗口中选取颜色。

HTML-Editor-cmd-ColorSelect

使用Tab键,可以移动到下一个颜色;而使用Enter键,会将选中颜色的代码插入到当前光标处。

Colorizer插件

利用Colorizer插件可以直观的显示#rgb, #rgba, #rrggbb, #rrgbbaa, rgb(...), rgba(...)等等形式的颜色。如下图所示,颜色代码的背景显示一目了然:

plugin_Colorizer_html

HTML配色

关于HTML和CSS中颜色的命名和代码,您可以参考HTML Color CodesColorSchemer网站。

HTML_Color_Names_Values

从符合标准和可访问性(WCAG)角度考虑,应在CSS中设定色彩,而不是直接设置HTML代码中的color属性。

色彩的平衡感和可读性,对于网页设计至关重要。对于配色方案(Color Schemes),有单色(Monochromatic)、近似色(Analogous)、互补色(Complementary)、补色分割(Split-Complementary)、三等分(Triadic)和矩形配色(Tetratic / Double Complementary)等多种风格。您可以在calcolor网站中寻找灵感。

HTML_Color_Palettes

即使并非专业的设计师,无法创造出令人惊艳的配色,但还是需要以恰当的对比度,来保证网页的可读性。利用tanaguru,可以检查前景和背景色搭配是否合理,并给出相应的优化建议。

HTML_Color_Contrasts

题外话

以下《艺术世界》里关于颜色的文字,读来颇为有趣,也与您分享:

被法国十九世纪著名画家乔治·修拉(Georges Seurat)所大量使用的印度黄(Indian yellow)在今日已不复存在。因为这种源自印度的颜料是由仅喂食芒果树叶和水的母牛的尿液所制成。牛难以消化芒果树叶,它们的尿液在蒸发提炼之后就生成了印度黄这种颜料。但是这种制作方式无疑对动物非常残酷,因而被英国殖民政府所取缔。珍贵的群青色(Ultra Marine)颜料来源于阿富汗采石场的青金石,调制师在研磨过程中需要非常小心地控制,既要把石块磨成细小颗粒,又要保证足够大才能含有颜色。群青色被用于中世纪的画作中,因为其昂贵的价格,常常需要在制作成本里另外加以注明。1826年,人工合成的群青色颜料在一次化学竞赛中被发明出来,被认为是炼金术一样的发明,这个说法毫不夸张,因为天然的群青色真的比黄金还贵。另外一种珍稀的泰尔紫色(Tyrian Purple,或称骨螺紫)则提取自海洋里的某类食肉性海螺分泌出的黏液。因为制作成本高昂,拜占庭帝国把它作为一种社会地位的象征,禁止皇室之外的普通人使用这些颜色,使之成为一种突显高贵身份的“皇家紫色”。--《福布斯颜料收藏库》

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期六, 三月 07, 2020

VIM学习笔记 编译Vim支持Python3 (Compile Vim with Python3 support)

请注意,本文在Mac OS X 10.15.3下测试完成。以下命令中的参数,需要根据您的系统环境进行相应调整。

前置条件

首先确请认已安装Python3或Python2。关于安装和配置信息,请访问Python网站。

使用以下命令,查看当前Python2安装情况:

$ which python

/usr/bin/python

使用以下命令,查看当前Python3安装情况:

$ which python3

/usr/bin/python3

编译Vim

使用Git命令,将Vim源码复制到本地:

$ git clone https://github.com/vim/vim.git

切换到下载的Vim源码目录:

$ cd vim

通过配置命令,启用需要的特性:

$ ./configure --with-features=huge \
--enable-multibyte \
--enable-rubyinterp=dynamic \
--with-ruby-command=/usr/bin/ruby \
--enable-pythoninterp=dynamic \
--with-python-config-dir=/usr/lib/python2.7/config \
--enable-python3interp=dynamic \
--with-python3-config-dir=/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin \
--enable-cscope \
--enable-gui=auto \
--enable-gtk2-check \
--enable-fontset \
--enable-largefile \
--disable-netbeans \
--with-compiledby="yyq123@email.com" \
--enable-fail-if-missing \
--prefix=/usr/local

其中,“–-enable-fail-if-missing”,用于显示错误信息;“--prefix=/usr/local”,用于指定生成可执行文件的位置。

命令将检查配置项,并输出以下类似信息:

checking --enable-pythoninterp argument... dynamic
checking --with-python-command argument... no
checking for python2... /usr/bin/python2
checking Python version... 2.7
checking Python is 2.3 or better... yep
checking Python's install prefix... /System/Library/Frameworks/Python.framework/Versions/2.7
checking Python's execution prefix... /System/Library/Frameworks/Python.framework/Versions/2.7
checking Python's configuration directory... (cached) /usr/lib/python2.7/config
checking Python's dll name... Python.framework/Versions/2.7/Python
checking if -pthread should be used... no
checking if compile and link flags for Python are sane... yes
checking --enable-python3interp argument... dynamic
checking --with-python3-command argument... no
checking for python3... /usr/bin/python3
checking Python version... 3.7
checking Python is 3.0 or better... yep
checking Python's abiflags... m
checking Python's install prefix... /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7
checking Python's execution prefix... /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7
checking Python's configuration directory... (cached) /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin
checking Python3's dll name... Python3.framework/Versions/3.7/Python3
checking if -pthread should be used... no
checking if compile and link flags for Python 3 are sane... yes
checking whether we can do without RTLD_GLOBAL for Python... no
checking whether we can do without RTLD_GLOBAL for Python3... yes
checking --enable-tclinterp argument... no
checking --enable-rubyinterp argument... dynamic
checking --with-ruby-command argument... /usr/bin/ruby
checking for /usr/bin/ruby... /usr/bin/ruby
checking Ruby version... OK
checking Ruby rbconfig... RbConfig
checking Ruby header files... /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0
......

执行以下编译命令:

$ sudo make

Starting make in the src directory.
If there are problems, cd to the src directory and run make there
cd src && /Library/Developer/CommandLineTools/usr/bin/make first
/bin/sh install-sh -c -d objects
touch objects/.dirstamp
CC="gcc -Iproto -DHAVE_CONFIG_H   -DMACOS_X -DMACOS_X_DARWIN    " srcdir=. sh ./osdef.sh
......

执行以下安装命令,将编译后的二进制文件复制到 /usr/local/bin :

$ sudo make install

Starting make in the src directory.
If there are problems, cd to the src directory and run make there
cd src && /Library/Developer/CommandLineTools/usr/bin/make install
if test -f /usr/local/bin/vim; then \
   mv -f /usr/local/bin/vim /usr/local/bin/vim.rm; \
   rm -f /usr/local/bin/vim.rm; \
 fi
cp vim /usr/local/bin
strip /usr/local/bin/vim
chmod 755 /usr/local/bin/vim
......

关闭并重新打开Terminal终端,执行以下命令将显示已使用新编译的Vim:

$ which vim

/usr/local/bin/vim

执行以下命令,将显示新编译的Vim已包含Python3特性:

$ vim --version

compile_vim_version

其中,与Python相关的特性主要包括:

  • +python,内置支持Python 2;
  • +python3,内置支持Python 3;
  • +python/dyn,动态支持Python 2;
  • +python3/dyn,动态支持Python 3;

根据以上步骤,我们保持/usr/bin目录下预装的Vim不变,另外在/usr/local/bin目录下安装了自已编译的Vim。

卸载Vim

使用以下命令,可以重置编译操作:

$ sudo make distclean

使用以下命令,可以卸载Vim:

$ sudo make uninstall

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期二, 三月 03, 2020

VIM学习笔记 文本排序(sort)

Vim内置了针对文本进行排序的:sort命令。你可以使用:help :sort命令,查看详细的帮助信息。

请注意,Vim内置的sort命令与Linux系统下的!sort命令并非完全一致。

文本行排序

使用以下命令,可以针对指定行范围内的文本进行排序:

:3,16sort

如下图所示,将第3至16行内的CSS属性进行排序:

sort_range

在可视化模式下选中文本,然后执行以下命令可以对选择的文本进行排序:

:'<,'>sort

使用以下命令,将在排序时去除重复的行。对于重复的多行,将仅仅保留第一行,而其它的行将被删除。

:%sort u

使用以下命令,可以针对所有文本进行倒序排序:

:%sort!

使用以下命令,将按照数字进行排序:

:%sort n

组合以上命令,则可以按照数字倒序排序:

:%sort! n

sort_n

文本块排序

假设我们需要对以下文本进行排序。其中,每个条目是被“.KS”和“.KE”包围的文本块;而其定义的每个术语则是以“.IP”开头的多行文字。

sort_block_troff_file

如果我们希望按术语进行排序,那么可以通过合并行将文本块整合为一个整体,然后进行排序;稍后再重新拆分行,来恢复原有的文本格式。具体步骤如下:

1)将换行符替换为“@@”字符:

:g/^\.KS/,/^\.KE/-1s/$/@@/

.KS@@
.IP "TTY_ARGV" 2n@@
The command, specified as an argument vector,@@
that the TTY subwindow executes.@@
.KE
.KS@@
.IP "ICON_IMAGE" 2n@@
Sets or gets the remote image for icon's image.@@
.KE
.KS@@
.IP "XV_LABEL" 2n@@
Specifies a frame's header or an icon's label.@@
.KE
.KS@@
.IP "SERVER_SYNC" 2n@@
Synchronizes with the server once.@@
Does not set synchronous mode.@@
.KE 

2)以“.KS”和“.KE”作为首尾标记来合并行:

:g/^\.KS/,/^\.KE/j

.KS@@ .IP "TTY_ARGV" 2n@@ The ... vector,@@ ... .@@ .KE
.KS@@ .IP "ICON_IMAGE" 2n@@ Sets or gets ... image.@@ .KE
.KS@@ .IP "XV_LABEL" 2n@@ Specifies a ... an icon's label.@@ .KE
.KS@@ .IP "SERVER_SYNC" 2n@@ Synchronizes with ... mode.@@ .KE 
 

3)对文本排序:

:%sort

.KS@@ .IP "ICON_IMAGE" 2n@@ Sets or gets ... image.@@ .KE
.KS@@ .IP "SERVER_SYNC" 2n@@ Synchronizes with ... mode.@@ .KE 
.KS@@ .IP "TTY_ARGV" 2n@@ The ... vector,@@ ... .@@ .KE
.KS@@ .IP "XV_LABEL" 2n@@ Specifies a ... an icon's label.@@ .KE
 

4)将“@@ ”字符重新替换为换行符,以恢复原有格式:

:%s/@@ /^M/g

.KS
.IP "ICON_IMAGE" 2n
Sets or gets the remote image for icon's image.
.KE
.KS
.IP "SERVER_SYNC" 2n
Synchronizes with the server once.
Does not set synchronous mode.
.KE
.KS
.IP "TTY_ARGV" 2n
The command, specified as an argument vector,
that the TTY subwindow executes.
.KE
.KS
.IP "XV_LABEL" 2n
Specifies a frame's header or an icon's label.
.KE

通过以上全局替换命令和排序命令,对文档中的特定术语进行了排序,而且保持格式不变。请注意:

  • 为了缩短实例文字的长度,我们使用“...”来表示省略的文字;
  • 在第2步使用j命令合并行时,自动新增了一个空格;所以在第3步的替换命令中,需要查找“@@”字符以及紧随其后的一个空格;
  • 第4步命令中的“^M”,是使用Ctrl-VCtrl-M键输入的;如果Ctrl-V键已经被占用,那么可以使用Ctrl-Q键来替代。

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期五, 二月 28, 2020

VIM学习笔记 文件浏览器-网络读性(Netrw-Remote)

使用Netrw插件,不但可以浏览本地文档,还可以通过SCP、SFTP和HTTP等网络协议,来编辑远程服务器上的文件。

SCP

请首先下载并安装PuTTY,然后在Windows操作系统的环境变量PATH中,增加PuTTY目录:

C:\Program Files (x86)\PuTTY

在操作系统的命令行中,使用以下命令确认能够执行PSCP:

$ pscp --version

pscp_win_version

在vimrc文件中,增加以下命令设置使用PSCP:

let g:netrw_scp_cmd="pscp.exe -q

在Vim中使用以下命令,可以使用SCP协议直接编辑远程服务器上的文件:

:e scp://user@hostname/path/file.txt

Vim将调用PSCP命令,请根据提示输入密码,然后点击任意键返回Vim编辑文件:

Netrw_scp_read

在保存文件时,将会调用PSCP命令将文件写回服务器:

Netrw_scp_write

SFTP

在Vim中使用以下命令,可以使用SFTP协议直接编辑远程服务器上的文件:

:e sftp://user@hostname/path/file.txt

Vim将调用SFTP命令,请根据提示输入密码,然后点击任意键返回Vim编辑文件:

Netrw_sftp_read

在保存文件时,将会调用SFTP命令将文件写回服务器:

Netrw_sftp_write

URL

在以上命令中的连接信息中,主要包括以下几项内容:

  • 网络协议,除了SCP和SFTP协议之外,Netrw还支持HTTP、DAV和RCP等协议;
  • 主机信息,格式为 [user@]hostname[:port],如果省略用户名,则使用本机上的当前用户名;如果省略端口号,则使用默认的标准端口号(例如SFTP:22);
  • 目标文件名,可以使用以“//”开头的绝对路径,也可以使用以“/”开头的以用户主目录为起始的相对目录。

HELP

使用以下命令,可以查看Netrw网络读写的帮助信息:

:help netrw-xfer

从以上操作可见,在调用远程文件传输时,需要用户输入密码以获取读写权限,这也使得整个过程过于繁琐。也许使用SSH客户端,然后将Vim设置为编辑器,才是更好的主意吧?

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期二, 二月 25, 2020

VIM学习笔记 学习资源(Learning Resources)

帮助 Help

首先,也是最重要的,Vim内置了及其丰富的帮助信息。您可以随时使用:help命令,来查找详细的帮助信息。

强烈建议通篇阅读内置的VIM教程(vimtutor),此教程通过介绍必要的编辑命令,来帮助您快速上手,整个学习过程大约仅需要30分钟时间。

您可以在操作系统的命令行中,使用以下命令打开教程:

$ vimtutor

你也可以在Vim中,使用以下命令打开特定语言的教程:

:e $VIMRUNTIME\tutor\tutor.zh_cn.utf-8

help_tutor

网站 Websites

书籍 Books

Learning_vi_vim
PracticalVim
MasteringVim
ProVim

 

速查表 CheatSheet

视频 Screencasts

插件 Plugins

其它 Others

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期六, 二月 22, 2020

VIM学习笔记 文本复制记录仪(YankRing)

Vim使用术语"yank"和"pull",来指代我们所熟悉的复制和粘贴 (Copy & Paste)。在Vim中,任何被复制和删除的文本,都会被保存在寄存器(Regists)中。例如,使用yy命令复制当前行或使用dd命令删除当前行,都会同时将当前行放入默认寄存器中。当然,你也可以在命令中指定寄存器。比如使用"ayy命令,将复制的文本放到寄存器a中;然后使用:pu a命令,就可以粘贴寄存器a中的内容。

使用:register命令,可以查看完整的寄存器列表:

Registers

面对大量的历史纪录,我们很难仅凭记忆来找到并粘贴之前复制的文本。而YankRing插件,则可以更加方便地查找和粘贴文本。

安装配置

推荐使用vim-plugVundle等插件管理器,来安装Vim.org上的YankRing插件。

可以在vimrc文件中,自定义插件的选项。例如以下命令指定条目的最小长度为2个字符,以避免删除的单个字符也被记录到YankRing中:

let yankring_min_element_length = 2

以下表格列示了主要选项的默认设置:

选项默认值描述
yankring_max_history100保存历史纪录的最大数目
yankring_history_dir$HOME保存历史纪录的文件位置
yankring_min_element_length1如果复制的文本长度小于此值,则不会被记录
yankring_max_element_length1MB如果复制的文本长度大于此值,则会被截断
yankring_enabled1自动启用YankRing
yankring_ignore_duplicate1忽略重复的纪录
yankring_window_auto_close1当选择某条纪录之后自动关闭YankRing窗口

YankRing窗口

使用以下命令打开YankRing窗口,以显示复制和删除文本的历史记录:

:YRShow

plugin_YankRing_YRShow_win

YankRing窗口顶端的状态行,显示以下向导信息,以帮助你操作列表中的历史记录:

选项AutoClose=1自动关闭窗口
ClipboardMonitor=1监控剪贴板
Inserts=0不记录最近输入的文本
命令<enter>粘贴文本到光标之后
p
P粘贴文本到光标之前
1-9粘贴第n个条目
d删除当前条目
r在YankRing窗口中的可视化模式下
选中的多行按倒叙粘贴到光标之后
s查找/过滤条目(支持正则表达式)
a开/关AutoClose选项
u刷新YankRing窗口
q关闭YankRing窗口
帮助?显示命令的帮助信息

点击?键,将显示各个命令的说明:

plugin__YankRing_YRShow_help.png

您可以使用上下键、鼠标滚轮或移动命令,来浏览所有条目;当使用回车键、鼠标双击或命令,选择某条纪录之后,将完成粘贴操作并关闭YankRing窗口。

YankRing命令

使用以下命令,可以将指定范围内的文本加入YankRing:

:5,10YRYankRange

在可视化模式下,使用YRYankRange命令,则会将所有选中的文本加入到YankRing中。

使用以下命令,将在屏幕底部提示你输入关键字(支持正则表达式)以进行查找,并将在YankRing窗口中显示匹配结果:

:YRSearch

帮助信息

使用:h yankring命令,可以查看YankRing插件的帮助文件。

使用:h yankring-tutorial命令,则可以参照实例以快速了解插件功能。

YankRing无疑大大增强了Vim复制粘贴的功能,但同时也引入了更多的快捷键和命令;通过新建YankRing窗口,来完成查找和粘贴历史条目的操作,对我个人来说也看不到效率的提升。

更重要的是,例如Ditto等操作系统层面的剪贴板工具,覆盖了更多的应用,而且操作也更直观。那么YankRing是不是一个多余的存在了呢?

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期五, 二月 21, 2020

VIM学习笔记 标签选项(Tag Option)

标签选项

通过'tags'选项,可以指定查找标签文件的位置。根据以下默认设置,Vim将在当前目录查找标签文件:

set tags=tags=./tags,tags

对于大量的代码文件,也可以设置更精细的查找路径:[S]

set tags=./.tags;,.tags

其中,以逗号分隔的参数为:

  • ./.tags;,代表在文件的所在目录下,查找名字为“.tags”的标签文件。使用以点开头的文件名,以便与常规的项目文件相区别。结尾的分号代表查找不到时继续向上递归到父目录。这样对于分布在不同子目录中的源代码文件,只需要在项目顶层目录放置一个.tags文件即可。
  • .tags,是指同时在 Vim 的当前目录(即:pwd命令返回的目录)下查找 .tags 文件。

假设我们针对rails源码库(~/src/rails)生成tags文件,并在'tags'选项中包含此文件,那么就可以在编写代码时,方便地跳转至标签的定义处,获得相关地使用说明。

set tags+=~/tags/rails.tags

默认设置下,Vim使用二分法(binary search)来查找指定的标签名。如果您生成的标签文件(Tags File)没有经过排序,那么可以切换至线性查找(linear search)方式:

:set notagbsearch

标签函数

通过调用Vim内置的taglist函数,可以实现自定义的标签匹配功能。taglist函数将根据输入的正则表达式,将所有匹配的标签以列表形式返回。使用:help taglist命令,可以查看该函数的帮助信息。

例如以下代码,利用taglist函数实现了查找指定函数的功能:

command! -nargs=1 TagFunction call s:TagFunction(<f-args>)
function! s:TagFunction(name)
  " Retrieve tags of the 'f' kind
  let tags = taglist('^'.a:name)
  let tags = filter(tags, 'v:val["kind"] == "f"')

  " Prepare them for inserting in the quickfix window
  let qf_taglist = []
  for entry in tags
    call add(qf_taglist, {
          \ 'pattern':  entry['cmd'],
          \ 'filename': entry['filename'],
          \ })
  endfor

  " Place the tags in the quickfix window, if possible
  if len(qf_taglist) > 0
    call setqflist(qf_taglist)
    copen
  else
    echo "No tags found for ".a:name
  endif
endfunction

使用:TagFunction HTML命令调用自定义函数,将查找所有以“HTML”开头的函数,并显示在Quickfix中。

taglist_Quickfix

标签相关插件

unimpaired.vim插件,映射了一系列方括号开头的快捷键,以方便在标签之间进行跳转。比如]t代表:tnext[t代表:tprev等等。

vim-gutentags插件,可以检测文件变动并自动增量更新标签文件(Tags File)。它可以异步更新标签,并且对于标签文件进行排序,以便于Vim使用二分法快速搜索关键字。

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期三, 二月 19, 2020

VIM学习笔记 匹配多个标签(Matching Multiple Tags)

如果您明确知道某个标签的名称,那么可以使用匹配单个标签章节中介绍的命令直接跳转。本节将继续介绍搜索和匹配多个标签的操作。

标签搜索(Tag Search Pattern)

我们可以在文件的任意位置上执行:tag:tjump命令,以跳转至指定的标签定义处。这样就省去了将光标移动至标签之上,然后再点击跳转快捷键的繁琐。

如果启用了wildmenu选项,那么在输入命令时,我们只需要输入标签的开头几个字母,然后点击Tab键即可以自动补全标签名。

tag_tab_wildmenu

通过在命令中使用正则表达式,可以查找符合条件的标签。例如以下命令,将查找所有以“HTML”开头的标签,并跳转至第一个匹配标签:

:tag /^HTML*

而以下命令,将会显示所有以“Color”开头的标签,你可以选择跳转至某一匹配标签:

:tjump /^Color*

tjump_regex

如果有多个匹配项存在,比如在几个文件中都定义了同名的函数,那么默认情况下,将优先跳转至当前文件中的匹配项。

使用:h tag-priority命令,可以查看关于优先级的帮助信息。

标签匹配列表(Tag Match List)

使用以下命令,将在屏幕底部显示标签匹配列表,然后根据您的选择在当前窗口中跳转至标签定义处:

:tselect [name]

在常规模式下,使用g]快捷键,将显示与光标下标签匹配的列表:

g-ctrl-]

使用以下命令,将在屏幕底部显示标签匹配列表,然后根据您的选择在新建窗口中跳转至标签定义处:

:stselect [name]

在常规模式下,使用Ctrl-Wg]快捷键,将在新建窗口中,针对光标下的标签执行:tselect命令。

使用以下命令,可以根据匹配列表中的顺序进行标签跳转:

缩写命令功能
:tn:tnext跳转至下一个匹配项
:tp:tprevious跳转至上一个匹配项
:tf:tfirst跳转至第一个匹配项
:tl:tlast跳转至最后一个匹配项

在进行标签跳转的过程中,将在屏幕底部显示其相对位置:

tag 1 of n or more

预览窗口(Preview Window)

当我们在代码中遇到某个函数,但不太清楚其具体含义,那么可以使用Ctrl-]键跳转至函数定义处,而此时当前屏幕将会显示该函数的具体实现代码;稍后我们仍需退回到之前的位置继续编写程序。

如果我们希望在编辑当前代码段的同时参考具体的函数定义,那么可以使用预览窗口(Preview Window)。

请注意,为了使用预览窗口,Vim必须包含QuickFix特性。

使用以下命令,将在屏幕上方的预览窗口中显示指定标签的定义,并且保持当前光标的位置不变。也即是说,你可以同时在屏幕上查看引用函数的代码和定义函数的代码。

:ptag [name]

如果当前已经存在一个预览窗口,那么将重用此窗口。

使用Ctrl-W}快捷键,也可以针对当前光标下的标签执行:ptag命令。

使用以下命令,将执行:tjump命令,并在预览窗口中显示标签:

:ptjump [name]

使用Ctrl-Wg}快捷键,也可以针对当前光标下的标签执行:ptjump命令。

使用以下命令,将执行:tselect命令,并在预览窗口中显示标签:

:ptselect [name]

使用以下命令,可以在预览窗口中进行标签跳转:

缩写命令功能
:ptn:ptnext在预览窗口中执行:tnext命令
:ptp:ptprevious在预览窗口中执行:tprevious命令
:ptf:ptfirst在预览窗口中执行:tfirst命令
:ptl:ptlast在预览窗口中执行:tlast命令
:pp:ppop在预览窗口中执行:pop命令
:pc:pclose关闭预览窗口

使用Ctrl-Wz快捷键,也可以关闭预览窗口。

位置列表(Location List)

使用以下命令,可以跳转到指定标签,并在当前窗口的新位置列表中加入匹配的标签:

:ltag [name]

使用以下命令,可以显示位置列表:

:lopen

例如,首先使用:ltag /^HTML*命令,查找所有以“HTML”开头的标签并将它们放入到位置列表当中;然后使用:lopen命令,查看位置列表。

ltag

使用以下命令,可以在位置列表中进行标签跳转:

缩写命令功能
:lop:lopen显示位置列表
:lne:lnext移动到下一个标签
:lp:lprevious移动到下一个标签
:lfir:lfirst移动到第一个标签
:lla:llast移动到最后一个标签
:lcl:lclose关闭位置列表

智能跳转(tjump)

看了这么多命令,是不是已经心烦意乱了?我们期待的理想状况应该是:如果只有一个匹配标签,那么直接跳转;如果发现多个匹配标签,则显示匹配列表。

使用:tjump {name}命令,如果只发现一个匹配标签,将直接跳转至标签定义处;如果发现多个匹配标签,那么将显示标签匹配列表。

在常规模式下,使用gCtrl-]快捷键,将针对光标下的标签执行:tjupm命令。

使用:stjump命令,则可以在新建窗口中执行:tjupm命令。

在常规模式下,使用Ctrl-W g Ctrl-]快捷键,将针对光标下的标签在新建窗口中执行:tjupm命令。

命令小结
命令快捷键
标签跳转:tagCtrl-]
新建窗口:stagCtrl-W]
预览窗口:ptagCtrl-W}
:tjumpgCtrl-]
新建窗口:stjumpCtrl-W g Ctrl-]
预览窗口:ptjumpCtrl-Wg}
标签跳转返回:popCtrl-T
预览窗口:ppop
查看标签栈:tags
显示匹配列表:tselectg]
新建窗口:stselectCtrl-Wg]
预览窗口:ptselect
添加位置列表:ltag
显示位置列表:lopen

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期一, 二月 17, 2020

VIM学习笔记 匹配单个标签(Matching Single Tag)

上节介绍了如何使用Ctag工具来生成标签文件(Tags File)。本节将介绍基于标签文件,快速在标签之间进行跳转的操作。

标签是出现在标签文件(Tags File)中的一个标识符。它是一种能够跳转的标记。例如,在 C 程序里,每个函数名都可以是一个标签。

标签跳转

使用以下命令,可以直接跳转至定义标签的位置:

:tag {name}

在常规模式下,使用Ctrl-]快捷键,也可以查找光标下的标签(比如函数或宏等),并跳转到定义该标签的位置。

在常规模式和插入模式下,按住Ctrl键并点击鼠标左键(<C-LeftMouse>),也可以跳转至标签定义处。

使用以下命令,可以在新建窗口中跳转到定义标签的位置:

:stag {name}

在常规模式下,使用Ctrl-W]快捷键,也可以在新建窗口中跳转到定义标签的位置。

标签栈(Tag Stack)

根据'tagstack'选项的默认设置,Vim会在标签栈中记录你跳转过的标签,以及是从哪里跳转到这些标签。

使用以下命令,可以查看标签栈的内容:

:tags

:tags

使用以下不带任何参数的命令,可以跳转到较新的标签处:

:tag

使用以下命令,可以返回到之前的标签处:

:pop

在常规模式下,使用使用Ctrl-T键,可以依次返回之前所处的位置。

在常规模式和插入模式下,按住Ctrl键并点击鼠标右键(<C-RightMouse>),也可以返回之前所处的位置。

如下图所示,首先使用:tag命令跳转至指定的标签,然后使用:pop命令返回到之前的位置。请留意屏幕底部输入的命令,以及白色高亮行的跳转过程:

tag-stack-550

使用:h tag-stack命令,可以查看标签栈的帮助信息。

命令小结
命令快捷键鼠标
标签跳转:tagCtrl-]<C-LeftMouse>
标签跳转至新建窗口:stagCtrl-W]
标签跳转返回:popCtrl-T<C-RightMouse>
查看标签栈内容:tags

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期五, 二月 14, 2020

VIM学习笔记 生成标签文件(Generates Tags File)

本节将介绍如何使用Ctag工具,来扫描代码库并生成包含关键词索引的标签文件(Tags File)。基于标签文件,Vim可以在标签之间快速跳转,并可以针对标签自动补全

Ctags

Ctags是一个开源的命令行工具,用于从代码中索引标签(比如method, class, function等)并生成tags文件。

目前Ctags支持包括Vim在内的41种编程语言。对于vimscript脚本,其中的functions, class, commands, menu, map, variable等语法,将会作为关键字被索引至tags文件中。

对于Mac操作系统,您可以使用包管理器Homebre进行安装:

$ brew install ctags

对于Linux操作系统,您可以使用相应的包管理器进行安装:

$ sudo yum install ctags

对于Windows操作系统,您可以直接将可执行文件放置在 PATH 环境变量指定的目录之内;也可以使用包管理器Chocolatey进行安装:

$ choco install ctags

您可以在操作系统的命令行中使用以下命令,来验证ctags是否安装成功,并获得相关的帮助信息:

$ ctags --help

在Vim中使用以下命令,可以针对指定的文件生成tags文件:

:!ctags filename

你也可以针对当前目录及其子目录中的所有文件生成tags文件:

:!ctags -R .

标签文件(Tags File)

默认生成的标签文件,是名为tags的文本文件。其开头包含若干行元数据,之后每行包含一个关键字以及与之匹配的文件名和位置信息。其中的关键字,按字母排序;并且以正则表达式作为定位信息。

The Anatomy of a tags File

你可以使用:help tags-file-format命令,查看标签文件的格式说明。

自动生成标签文件

利用自动命令(autocmd),可以在保存文件时自动更新tags文件:

:autocmd BufWritePost * call system("ctags -R")

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期三, 二月 12, 2020

VIM学习笔记 自动补全选项(Auto-Completion-Option)

插入模式下,利用自动补全(Insertion-Completion)功能,vim能够根据正在输入的字符,查找匹配的关键字并显示在弹出菜单(popup menu)中。通过选择匹配项,可以补全输入的部分关键字甚至整行文本。

关键字补全选项

使用Ctrl-NCtrl-P快捷键,将按照'complete'选项指定的范围来搜索匹配的关键字。其默认值为:

:set complete=.,w,b,u,t,i

也就是说,默认将在以下来源中查找关键字:

  • 在当前缓冲区中进行查找;
  • 在其他窗口中进行查找;
  • 在其他已载入的缓冲区中进行查找;
  • 在没有载入缓冲区的文件中进行查找;
  • 在当前的标签(tags)列表进行查找;
  • 在由当前文件(如#include)包含进来的头文件中进行查找。

假设文件中包含以下句子:

I have beautiful flowers in my flower garden

我们另起一行并输入“f”字母,然后点击Ctrl-X Ctrl-N快捷键,将会在当前文件内查找已经存在的单词:

AutoCompletion_Ctrl_X_N

而使用Ctrl-N快捷键,将会根据'complete'选项指定的范围进行查找。比如在其它缓冲区内找到了更多以f开头的单词:

AutoCompletion_Ctrl_N

通过以下命令设置'complete'选项,可以定义自动补全的查找范围:

:set complete=key,key,key

命令中可能出现的key值如下:

.当前缓冲区
b缓冲区列表中的其它已载入的缓冲区
d当前文件以及由'include'选项指定的包含进来的文件
查找由'define'选项定义的宏(definition/macro)
i当前文件以及由'include'选项指定的包含进来的文件
k由'dictionary'选项指定的文件
kspell当前激活的拼写检查
k{dict}名为{dict}的文件
s由'thesaurus'选项指定的文件
t标签(tags)文件
]
u缓冲区列表中的没有载入的缓冲区
w在其他窗口中载入的文件

使用以下命令,可以将字典文件添加到搜索列表中:

:set complete+=k

使用以下命令,可以将包含的文件从搜索列表中移除:

:set complete-=i

使用:h 'complete'命令,可以查看'complete'选项的帮助信息。

忽略大小写

如果我们使用以下命令,设置了在查找过程中忽略大小写,那么在自动完成时,反而会造成区分大小写:

:set ignorecase

使用以下命令,则可以设置在自动完成时忽略大小写:

:set infercase

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>