星期一, 十二月 23, 2019

VIM学习笔记 自动命令-实例(autocmd-examples)

以下实例,将为您使用自动命令提高编辑效率提供灵感。关于自动命令的创建和管理,请参阅自动命令(autocmd)章节。

例如以下自动命令,将在离开Vim编辑器时,自动保存文件:
autocmd FocusLost * :wa

根据文件类型执行自动命令

可以根据文件类型,执行特定命令。例如以下自动命令,将删除php文件行尾的空格:
autocmd BufEnter *.php :%s/[ \t\r]\+$//e
可以根据文件类型,载入相关插件:
autocmd Filetype html,xml,xsl source $VIM/vimfile/plugin/closetag.vim
可以根据文件类型,设置键盘映射
autocmd bufenter *.tex map <F1> :!latex %<CR>
可以根据文件类型,设置不同的选项:
autocmd FileType ruby setlocal ts=2 sts=2 sw=2 expandtab

自动创建目录

定义以下自动命令,将在保存文件时,检查所指定的目录是否存在:
augroup vimrc-auto-mkdir
  autocmd!
  autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'), v:cmdbang)
  function! s:auto_mkdir(dir, force)
    if !isdirectory(a:dir)
          \   && (a:force
          \       || input("'" . a:dir . "' does not exist. Create? [y/N]") =~? '^y\%[es]$')
      call mkdir(iconv(a:dir, &encoding, &termencoding), 'p')
    endif
  endfunction
augroup END

如果使用:w命令保存文件时,引用了不存在的目录,那么将显示以下询问信息:
'XXXXX' does not exist. Create? [y/N]
你可以输入“y”,以自动创建目录并保存文件。
如果使用:w!命令保存文件时,引用了不存在的目录,那么将不会显示询问信息,而直接创建目录并保存文件。

自动应用配置文件

在保存vimrc配置文件时,将自动重载并生效变更之后设置,而免去了关闭并重新打开Vim的手工操作:
augroup Reload_Vimrc        " Group name.  Always use a unique name!
    autocmd!                " Clear any preexisting autocommands from this group
    autocmd! BufWritePost $MYVIMRC source % | echom "Reloaded " . $MYVIMRC | redraw
    autocmd! BufWritePost $MYGVIMRC if has('gui_running') | so % | echom "Reloaded " . $MYGVIMRC | endif | redraw
augroup END

自动更新时间戳

利用以下自动命令,将在保存文件时,自动更新文件中的时间戳信息。首先将查找以“This file last updated:”开头的行,然后将“:”之后的时间替换为当前时间。
This file last updated: 12/23/2019 4:05:10 PM

function! UpdateTimestamp ()
  '[,']s/^This file last updated: \zs.*/\= strftime("%c") /
endfunction

augroup TimeStamping
  autocmd!
  autocmd BufWritePre,FileWritePre,FileAppendPre * :call UpdateTimestamp()
augroup END

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

星期四, 十二月 19, 2019

VIM学习笔记 自动命令(autocmd)

自动命令,是在指定事件发生时自动执行的命令。利用自动命令可以将重复的手工操作自动化,以提高编辑效率并减少人为操作的差错。

比如自定义以下函数,用于在文件中插入当前日期:

:function DateInsert()
: $read !date
:endfunction

使用以下命令,可以手动调用此函数:

:call DateInsert()

而通过以下自动命令,则可以在保存文件时自动执行函数,而不再需要额外的手动操作:

:autocmd FileWritePre * :callDateInsert()<CR>

定义自动命令

可以使用以下格式的autocmd命令,来定义自动命令:

:autocmd [group] events pattern [nested] command

  • group,组名是可选项,用于分组管理多条自动命令;
  • events,事件参数,用于指明触发命令的一个或多个事件;
  • pattern,限定针对符合匹配模式的文件执行命令;
  • nested,嵌套标记是可选项,用于允许嵌套自动命令;
  • command,指明需要执行的命令、函数或脚本。

events参数

Vim内置了近80个事件,以下表格按照类别列示了较为常用的事件:

类别事件触发条件
读取BufNewFile编辑一个新文件时
BufReadPre读入新缓冲区之前
BufRead, BufReadPost读入新缓冲区之后
BufReadCmd开始编辑新缓冲区之前
FileReadPre使用:read命令读入文件之前
FileReadPost使用:read命令读入文件之后
StdinReadPre由标准输入设备读入缓冲区之前
StdinReadPost由标准输入设备读入缓冲区之后
写入BufWrite, BufWritePre将整个缓冲区写入文件时
BufWritePost将整个缓冲区写入文件之后
BufWriteCmd将整个缓冲区写入文件之前
缓冲区BufAdd, BufCreate将缓冲区加入缓冲区列表之后
BufDelete从缓冲区列表中移除缓冲区之前
BufEnter进入缓冲区之后
BufLeave离开缓冲区之前
BufWinEnter在窗口中显示缓冲区之后
BufWinLeave从窗口中关闭缓冲区之前
BufNew创建缓冲区之后
BufUnload卸载缓冲区之前
选项FileType设置'filetype'选项之后
Syntax设置'syntax'选项之后
EncodingChanged'encoding'选项改变之后触发命令;
OptionSet设置任何选项之后
启动
退出
VimEnterVim启动并载入初始化文件之后
GUIEnter启动GUI之后
VimLeavePre改写viminfo文件之前,退出Vim之前
VimLeave改写viminfo文件之后,退出Vim之前
其它FileChangedShell当文件的最后修改时间等属性发生改变时
InsertEnter进入插入模式时
InsertLeave离开插入模式时
FocusGainedVim成为当前窗口时
FocusLostVim不再是当前窗口时
WinEnter进入窗口时
WinLeave离开窗口时
CursorMoved在常规模式下移动光标时
CursorMovedI在插入模式下移动光标时
CursorHold当超过'updatetime'所指定时间用户没有输入时
vimResized窗口尺寸变化之后

假设我们打开文件并输入文本,然后保存并退出,那么这些操作将以下顺序触发一系列事件:

操作事件
启动Vim并创建默认窗口BufWinEnter
创建默认缓冲区BufEnter
:edit a.txtVimEnter
创建新缓冲区BufNew
将新缓冲区加入到缓冲区列表之中BufAdd
退出默认缓冲区BufLeave
退出默认窗口BufWinLeave
将默认缓冲区从缓冲区列表之中移除BufUnload
删除默认缓冲区BufDelete
将a.txt文件读入新缓冲区BufReadCmd
激活新缓冲区BufEnter
激活新窗口BufWinEnter
进入插入模式InsertEnter
输入文本CursorMovedI
退出插入模式InsertLeave
:wqBufWriteCmd
退出新窗口BufWinLeave
将新缓冲区从缓冲区列表之中移除BufUnload
准备退出VimVimLeavePre
退出VimVimLeave

Source: Event-driven scripting and automation

您可以使用以下命令,获得各个事件的详细说明:

:help autocommand-events

pattern参数

匹配模式用来指定应用自动命令的文件。在匹配模式中,可以使用以下特殊字符:

*匹配任意长度的任意字符
?匹配单个字符
\?匹配字符'?'
.匹配字符'.'
,用于分割多个pattern
\,匹配字符','

可以使用逗号来分割多个模式,以匹配多种类型的文件。例如以下命令,将对于.c和.h文件设置'textwidth'选项:

:autocmd BufRead,BufNewFile *.c,*.h set tw=0

您可以使用以下命令,获得匹配模式的详细说明:

:help autocmd-patterns

nested参数

默认情况下,自动命令并不会嵌套执行。例如在自动命令中执行:e或:w命令,将不会再次触发BufRead和BufWrite事件。而使用nested参数,则可以激活嵌套的事件。

:autocmd FileChangedShell *.c nested e!

查看自动命令

使用以下命令,可以列出所有自动命令:

:autocmd

autocm

你会发现自动命令的列表将会非常的长,其中既包括了在vimrc文件中用户定义的自动命令,也包括了各种插件定义的自动命令。

如果在命令中指定了group,那么将会列出所有与指定group相匹配的自动命令;同理,也可以在命令中指定event和pattern,以查看相匹配的自动命令:

:autocmd filetypedetect * *.htm

autocm_list

删除自动命令

使用以下命令,可以删除所有自动命令:

:autocmd!

注意:此操作也将删除插件所定义的自动命令,请谨慎操作。

使用以下命令,可以删除指定组的自动命令:

:autocmd! group

在命令中指定组、事件和匹配模式,可以删除特定的自动命令:

autocmd! Unfocussed FocusLost *.txt

在命令中使用特殊字符“*”来指代所有事件或文件。例如以下命令,将删除Unfocussed组中所有针对txt文件的自动命令:

autocmd! Unfocussed * *.txt

在命令中忽略文件匹配模式,那么所有针对指定事件的针对命令都将被删除。例如以下命令,将删除Unfocussed组在所有针对FocusLost事件的自动命令:

autocmd! Unfocussed FocusLost

自动命令组

通过:augroup命令,可以将多个相关联的自动命令分组管理,以便于按组来查看或删除自动命令。例如以下命令,将C语言开发的相关自动命令,组织在“cprogram”组内:

:augroup cprograms
: autocmd!
: autocmd FileReadPost *.c :set cindent
: autocmd FileReadPost *.cpp :set cindent
:augroup END

如果我们针对同样的文件和同样的事件定义了多条自动命令,那么当满足触发条件时将分别执行多条自动命令。因此,建议在自动命令组的开头增加:autocmd!命令,以确保没有重复的自动命令存在。

您可以使用以下命令,获得自动命令组的帮助信息:

:help :augroup

自动命令选项

通过eventignore选项,可以忽略指定的事件,而不触发自动命令。例如使用以下命令,将忽略进入窗口和离开窗口的事件:

:set eventignore=WinEnter,WinLeave

如果希望忽略所有事件,那么可以使用以下设置:

:set eventignore=all

命令小结
:autocmd定义/查看自动命令
:autocmd!删除自动命令
:augroup定义自动命令组
:set eventignore设置忽略的事件

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

星期二, 十二月 10, 2019

VIM学习笔记 语法高亮度-日志文件(Syntax-Logfile)

在系统排错过程中,常常需要在日志文件里大海捞针。面对数量巨大的繁杂信息,如何快速准确地找到线索,就显得格外重要了。

利用语法高亮度(Syntax),可以突出显示重要的信息,比如:

  • 包含“Error”和“Fail”等关键词的报错信息;
  • 日期、网址、文件名等对象;
  • 数字、字符串、操作符等元素。

定义语法高亮度

首先,定义需要着重显示的文本内容:

匹配指定的关键字:

syn keyword logLevelError error fail failure

匹配特定模式的字符串:

syn match logDate 'd{2}/d{2}/d{4}s*d{2}:d{2}:d{2}'

然后,定义如何显示特定的文本内容:

将以上定义的语法高亮组,链接到配色方案定义过的语法高亮组:

hi def link logLevelError ErrorMsg

也可以直接定义文本的显示色彩:

hi def logLevelError guifg=#ddddff guibg=#444444

配置语法高亮度

首先,将语法高亮文件,放置在以下目录:

Linux: $HOME/.vim/syntax

Windows: $HOME/vimfiles/syntax

然后,在vimrc配置文件中增加以下命令,以侦测.log为后缀名的日志文件并启用语法高亮度:

au BufNewFile,BufRead *.log setfiletype log

语法高亮度效果

Syntax_logfile

关于日志查看的一点想法

  • 对于动辄百兆的大型日志文件,Vim并非理想的工具。通常情况下:首先,利用tailgrep等命令,将日志文件截取为较小的片段;然后,再使用Vim进行细致地分析。
  • 过多的语法高亮度,不但会影响打开文件的速度,而且还会增加阅读的干扰。应该克制地使用视觉元素,仅仅突出显示最为关键的信息。比如,您可以在语法高亮文件中,注释掉关于日期和网址等元素的定义,而仅仅保留对于报错信息的突出显示。
  • 对于日志分析,并没有捷径。虽然vim-logreview等插件,可以移除日志文件中的正常统计输出,而仅仅保留报错信息。但异常事件通常并非孤立的单点问题,而其前后的上下文信息对于建立时间线和还原事件场景都有着极高的价值。对于大多数问题,并不能通过单一的报错信息,直接指向确定的解决方案。
  • 由此看来,利用语法高亮度来突出显示报错信息,然后小心厘清来龙去脉,算是现实可行的权宜之计吧?

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

星期三, 十一月 27, 2019

VIM学习笔记 色彩测试(colortest)

GVim中的色彩测试

运行以下内置脚本(Vimscript),可以查看各种颜色作为前景(foreground)和背景(background)的显示效果,以及在浅色(white)和深色(black)背景下的显示效果。

:runtime syntax/colortest.vim

colortest

通过以下内置文件,可以查看Vim预定义的色彩名称:

:view $VIMRUNTIME/rgb.txt

rgb_txt

你可以下载并在GVim中打开colorname.vim,然后执行:so %命令。此脚本文件将新建缓冲区,显示rgb.txt文件中色彩的显示效果:

colorname

你可以下载并在GVim中打开colorlist.vim,然后执行:so %命令。此脚本文件将以紧凑列表的形式,显示rgb.txt文件中色彩的显示效果:

colorlist

Terminal中的色彩测试

现今,几乎所有虚拟终端(比如GNOME TerminaliTerm2ConEmu等)都是支持256 (Xterm)色的。

在终端中执行以下命令,可以查看256色的显示效果:

$ curl -s https://gist.githubusercontent.com/HaleTom/89ffe32783f89f403bba96bd7bcd1263/raw/ | bash

colortest_term_256

为了启用256色,请在vimrc配置文件的colorscheme配色方案设置之前增加以下命令:

set t_Co=256

你可以在256 COLORS - CHEAT SHEET中,查看256色的Xterm Number和Xterm Name,以及与HEX和RGB格式的对应关系:

colortest_term_256_HEX_RGB

也就是说,在您选择使用特定色彩时,需要同时考虑在GUI图形界面和Xterm虚拟终端中的显示效果,以便能够获得理想且一致的感官。换句话说,在图形界面中可以正常显示的色彩,可能并无法在虚拟终端中使用。当然,您也可以针对不同的使用环境,选择使用不同的色彩。

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

星期三, 十月 30, 2019

VIM学习笔记 工具箱-Windows命令行环境(Toolkit-CLI-Win)

通过命令行环境(Command-Line Interface, CLI),可以更快速地执行操作,并且能够自动化一系列繁琐的任务。比如在多个文件中,批量替换指定的字符串等。下文将介绍在Windows下,搭建运行Linux命令的虚拟终端,并将Vim配置至此Shell环境。

本文并不会详细介绍每个工具的安装步骤和使用细节,而是聚焦于各个工具与Vim相互配合。文中推荐的工具,完全基于个人主观的偏好,您可以在AlternativeTo网站中寻找功能类似的软件。

Cygwin

Cygwin,是 Windows下的Linux命令行环境。它包括一个提供GNU功能性基本子集的DLL以及在这之上的一组工具。

在安装过程中,您可以选择需要的软件包,比如grep、sed、curl等等。你也可以搜索“vim”关键字,找到vim以及相关的工具。

Tools_Cygwin_SelectPackages_vim

请选择安装“zsh”。之后您可以随时再次运行Cygwin安装程序,以安装和更新软件包。

ConEmu

ConEmu,是一个美观易用的虚拟终端,可以在多个标签中,同时打开Windows命令提示符(Command Prompt),powershell,Cygwin和Git bash等等。

Tools_ConEmu_CLI

在“Settings...”窗口中,选择“Startup > Tasks”,然后在“Predefined Tasks”列表中新建打开Zsh的任务

Tools_ConEmu_Cygwin_Zsh

请在以上屏幕截图的黄色高亮区域内,输入以下命令:

set CHERE_INVOKING=1 & set "PATH=D:\cygwin64\bin;%PATH%" & %ConEmuBaseDirShort%\conemu-cyg-64.exe -new_console:p D:\cygwin64\bin\zsh.exe --login -i -new_console:C:"D:\cygwin64\Cygwin.ico"

请注意,本文假设Cygwin安装在“D:\cygwin64”目录;请根据您的实际安装位置,相应调整命令。

使用“Create new console”按钮,可以打开{Zsh::CygWin zsh}:

Tools_ConEmu_NewConsole

在终端中使用uname -a命令,可以查看当前Cygwin的版本:

uname

使用cygcheck --check-setup命令,可以列示当前已安装的软件包:

使用echo $SHELL命令,可以查看当前使用的shell:

Tools_Cygwin_echo_shell

通过/cygdrive路径,可以访问本地磁盘:

Tools_Cygwin_cygdrive

Oh My Zsh

Oh My Zsh,是由Robby Russell开发的zsh管理框架,使用其预配置的选项,可以大大提高使用zsh的便捷性。

使用以下命令,安装Oh My Zsh:

git clone git://github.com/robbyrussell/oh-my-zsh.git C:\Users\username\.oh-my-zsh

使用以下命令,生成默认的配置文件:

cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

配置Vim使用Cygwin Shell

Vim在Windows下,默认使用命令提示符 "Command Prompt":

:set shell=$COMSPEC

shell=C:\WINDOWS\system32\cmd.exe

vimrc配置文件中增加以下命令,将配置Vim使用Cygwin的Shell环境:

" 在当前目录打开bashlet $CHERE_INVOKING=1" 使用Cygwin bashset shell=D:\cygwin64\bin\bash.exe" 缺少--login参数将无法挂载/usr/bin/等目录set shellcmdflag=--login\ -c" 缺省值为(, 需要为bash设置成"set shellxquote=\"" 在路径中使用/以替代\set shellslash" 在PATH变量中增加cygwin目录let $PATH .= ';D:\cygwin64\bin'

在Vim中使用:terminal命令,即可打开Cygwin bash终端窗口:

Tools_Cygwin_vim_terminal

你也可以使用:!:shell命令,来执行bash命令

配置Vim打开Windows命令行

vimrc配置文件中增加以下命令,将配置leader快捷键以打开Windows命令提示符:

nnoremap <leader>cc :!start cmd /k cd %:p:h:8<cr>

One more thing...

我为ConEmu制作了一个暗黑系的DarkSide主题。关于安装和使用说明,请参考自述文件

Tools_ConEmu_DarkSide

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

星期四, 十月 24, 2019

VIM学习笔记 打印到PDF (Print to PDF)

在Linux下打印PDF

在Linux和Mac下,Vim会产生一个PostScript文件。该文件能够直接发送到PostScript打印机上,或者通过类似ghostscript的程序进行处理。

为了使用PostScript功能,请使用:version命令,确认Vim已经包含“+postscript”特性:

version-postscript.png

首先使用以下命令,将文件打印至postscript文件:

:hardcopy > test.ps

此打印方式所生成的postscript文件,无法正常显示包括中文在内的UTF-8编码格式。推荐使用paps,来生成包含中文的文件:

:!paps < % > test.ps

然后调用ps2pdf命令,将postscript文件转换为PDF文件:

:!ps2pdf test.ps test.pdf

通过在vimrc配置文件中增加以下自定义命令,可以组合paps和ps2pdf命令,来直接生成PDF文件:

command Paps !paps % | ps2pdf - %:r.pdf

之后在Vim中执行以下命令,即可生成以当前文件名命名的PDF文件:

:Paps

我们也可以利用CUPS PDF打印机,来生成PDF文件。首先使用包管理命令(以Fedora为例),安装cups-pdf

$ dnf install cups-pdf

使用以下网址,可以查看打印机是否安装成功,并将其设置为默认打印机:

http://localhost:631/printers/

Cups-PDF-Set Default

vimrc配置文件中,增加以下键盘映射

nmap PpP :%w !lpr -o lpi=8 -o cpi=14<CR><CR>

此后使用PpP快捷键,即可生成PDF文件(默认保存在桌面)。你可以通过修改 /etc/cups/cups-pdf.conf 配置文件,来指定文件输出位置。

在Mac下打印PDF

MacVim中,使用:set printexpr?命令,可以发现Mac使用预览程序来生成PDF文件,同样也无法正常显示中文:

system('open -a Preview '.v:fname_in) + v:shell_error

通过在vimrc配置文件中增加以下自定义命令,可以使用cupsfilter命令,来直接生成PDF文件:

command Print2PDF !cupsfilter % > %:r.pdf 2> /dev/null

在Windows下打印PDF

在Windows下的GVim中,使用:hardcopy命令将打开打印对话框;在其中选择PDF虚拟打印机(例如Foxit PDF Printer, PDFCreator等),即可生成PDF文件:

hardcopy_printer_win_pdf

请使用:help printing命令,查看关于打印的帮助信息。

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

星期一, 十月 21, 2019

VIM学习笔记 命令相关选项 (Options-CMD)

路径分隔符选项

在Windows下,文件路径中使用反斜杠(Backslash):

C:\Temp

在Linux和Mac下,文件路径中使用正斜杠(Forward slash):

/etc/hosts

'shellslash'选项,仅适用于Windows操作系统,并且默认是关闭的。为了保证与Unix风格的兼容性,建议在vimrc配置文件中,使用以下命令启用此选项:

:set shellslash

使用'shellslash'选项,可以在扩展文件名时使用正斜杠。即使你在输入文件名时使用反斜杠,Vim也会自动将其转换为正斜杠。

报错响铃选项

当Vim捕获一个错误时,将会显示错误信息。如果希望同时发出报错响铃 (鸣叫或屏幕闪烁),那么可以启用'errorbells'选项:

:set errorbells

使用以下命令,则可以关闭'errorbells'选项:

:set noerrorbells

'visualbell'选项,用于设置响铃的行为:鸣叫、屏幕闪烁或什么都不做。默认情况下,'visualbell'选项是关闭的。通过以下命令启用visualbell选项,将使用可视响铃代替鸣叫。当输入错误时,屏幕就会闪动然后回到正常状态:

:set visualbell

通过以下命令,则可以关闭visualbell选项(而使用鸣叫):

:set novisualbell

如果既不想要鸣叫也不想要屏幕闪烁,那么可以使用以下设置:

:set vb t_vb=

信息显示选项

启用'showmode'选项,将在屏幕底部显示当前所处的模式:

:set showmode

启用'showcmd'选项,将会在输入命令时,在屏幕底部显示出部分命令:

:set showcmd

例如希望输入fx命令来查找字符“x”时,当我们输入f时就会在底部显示“f”,这在输入复杂命令时将很有帮助。

可视化模式下,将显示选择区域的大小:

  • 在行内选择若干字符时,显示字符数;
  • 选择多于一行时,显示行数;
  • 选择可视化列块时,显示行乘以列数(比如“2x10”)。

set_showmode_showcmd

默认情况下,如果屏幕底部显示的消息长度超出一行时,将会显示类似于“按回车继续”的提示信息。通过设置'cmdheight'选项来增加消息的行数,可以显示更多的信息以避免不必要的提示。例如使用以下命令,设置命令行高度为3行:

:set cmdheight=3

默认情况下,'more'选项是启用的。当命令的输出超出一屏时(例如:version命令的输出),就会显示“-- More --”提示信息,并等待用户响应以继续显示屏更多信息:

set_more

使用以下命令关闭more选项,将会持续翻滚屏幕以显示信息,而不会暂停并显示提示信息:

:set nomore

当删除或修改多行文本时,如果被影响的行数超出了'report'选项所指定的行数(默认值为2行),那么Vim将会在屏幕底部显示所改变的行数。如果希望始终显示反馈信息,那么可以将report选项设置为0:

:set report=0

此时即使只是删除了一行文本,Vim也将显示反馈信息:

1 line less

相反地,如果不希望显示变更信息,那么可以将report选项设置为较大的值。

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

星期三, 十月 16, 2019

VIM学习笔记 wildmenu

使用'wildmenu'选项,将启用增强模式的命令行补全。在命令行中输入命令时,按下'wildchar'键(默认为Tab)将自动补全命令和参数:此时将在命令行的上方显示可能的匹配项;继续按下'wildchar'键,可以遍历所有的匹配项;也可以使用方向键或者CTRL-P/CTRL-N键,在匹配列表中进行移动;最后点击回车键,选择需要的匹配项。

wildmenu

使用以下命令,可以启用wildmenu:

:set wildmenu

例如在命令行中输入“:spe”,然后点击Tab键,将列出以spe开头的命令列表;再次点击Tab键,将可以在wildmenu中遍历匹配的命令:

/wildmenu_spell.png

使用以下命令,可以查看wildmenu的帮助信息:

:help wildmenu

wildmode

在命令行中输入命令时,文件名也是可以自动补全的。例如希望编辑当前目录下的某个文件,在输入:e命令和空格之后,点击Tab键,将自动补全文件名。而补全的方式,则是通过以下'wildmode'选项来控制:

使用""选项,将仅仅使用第一个匹配结果;即使再次按下wildchar键,也不会继续查找其它匹配项:

:set wildmode=

使用"full"选项,将在wildmenu中显示匹配的文件;点击wildchar键,可以遍历匹配的文件:

:set wildmode=full

wildmode_full

使用"longest"选项,将用最长的公共子串补全:

:set wildmode=longest

wildmode_longest

使用"longest:full"选项,将用最长的公共子串补全,并显示在wildmenu中:

:set wildmode=longest:full

wildmode_longest_full

使用"list"选项,将显示可能匹配的文件列表:

:set wildmode=list

wildmode_list

使用"list:full"选项,将显示可能匹配的文件列表,并使用第一个匹配项进行补全:

:set wildmode=list:full

wildmode_list_full

使用"list:longest"选项,将显示可能匹配的文件列表,并使用最长的子串进行补全:

:set wildmode=list:longest

wildmode_list_longest

推荐使用"list:longest,full"选项,点击Tab键,将显示可能匹配的文件列表,并使用最长的子串进行补全;再次点击Tab键,可以在wildmenu中遍历匹配的文件列表:

set wildmode=list:longest,full

wildmode_list_longest_full

使用以下命令,可以查看wildmode的帮助信息:

:help wildmode

wildignore

通过'wildignore'选项,可以在匹配列表中忽略指定类型的文件:

:set wildignore=*.dll,*.exe,*.jpg,*.gif,*.png

在'suffixes'选项中,会列出一系列文件名的前缀。当有多个文件符合匹配条件时,包含指定前缀的文件则会获得较低的优先级。也即是说,这些文件将会显示在匹配列表的最后。以下为suffixes选项的默认值:

:set suffixes=.bak,~,.o,.h,.info,.swp,.obj

wildchar

通过'wildchar'选项,可以设置命令行自动补全的触发键。默认为Tab键。例如以下命令,将其设置为F12键:

:set wildchar=<F12>

wildmenu应用

在命令行中输入:color以及空格,然后点击Tab键,将列出所有可用的配色方案(Color Scheme),继续点击Tab键可以选用需要的配色方案。

:color

wildmenu_colorscheme

使用以下命令,可以查看所有外部(例如PATH)和内部(例如MYVIMRC)变量:

:echo $

wildmenu_echo_var

命令小结
:set wildmenu启用wildmenu
:set wildmode设置wildmode
:set wildignore设置忽略文件类型
:set suffixes设置低优先级文件
:set wildchar设置命令行自动补全触发键

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

星期二, 十月 01, 2019

VIM学习笔记 会话(Session)

会话信息,将保存所有编辑窗口和全局设置。通过恢复会话,可以快速切换回之前工作环境。可以认为,会话是viminfo的扩展补充,viminfo文件中保存了会话所需要使用的具体设置信息。

如下图所示,我在编辑本文档的同时,打开了帮助文件和命令终端。首先,将当前编辑状态保存到会话文件;稍后,只需要恢复会话,就可以继续使用之前的窗口布局进行编辑了,而省去了手动打开多个窗口的繁琐。

Session

保存会话

使用以下命令,将保存会话信息至当前目录下,以“Session.vim”命名的文件:

:mksession

如果已经存在同名的会话文件,那么需要在命令中使用“!”参数,进行强制覆盖:

:mks!

也可以在命令中,指定会话信息文件的位置:

:mksession ~/mysession.vim

恢复会话

启动Vim时,通过指定“-S”参数,可以恢复之前保存的编辑会话:

$ vim -S Session.vim

在Vim中使用以下命令,也可以恢复会话信息:

:source Session.vim

使用以下命令,可以查看关于会话信息的帮助文件:

:help session

会话选项

会话选项sessionoptions,用于指定保存会话的内容,默认值如下:

:set sessionoptions=blank,buffers,curdir,folds, help,options,tabpages,winsize,terminal

sessionoptions选项是一组使用逗号分隔的字符串,包含以下参数:

  • blank
    恢复编辑无名缓冲区的窗口

  • buffers
    恢复所有缓冲区(包括隐藏和未载入的缓冲区);

  • curdir
    恢复当前目录;

  • folds
    恢复折叠

  • globals
    恢复以大写字母开始并至少包含一个小写字母的全局变量;

  • help
    恢复帮助窗口;

  • localoptions
    恢复(限定于缓冲区内)本地选项;

  • options
    恢复全局映射和选项;

  • resize
    恢复以行列指定的窗口大小;

  • sesdir
    设置当前目录为会话文件所在的位置;

  • salsh
    在文件名中使用salsh(/),来代替backslah(\);

  • tabpages
    恢复所有标签页

  • terminal
    恢复终端窗口;

  • unix
    使用Unix模式的行尾标志(<NL>);

  • winpos
    恢复 GUI Vim 的窗口位置;

  • winsize
    恢复窗口尺寸(相对于屏幕大小);

使用以下命令,可以查看关于会话选项的帮助信息:

:help 'sessionoptions'

命令小结
:mksession保存会话
:source Session.vim恢复会话
:set sessionoptions设置会话选项

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

星期六, 九月 28, 2019

VIM学习笔记 命令历史记录 (History)

Vim会将命令历史记录,保存在viminfo文件中;通过viminfo和history选项,可以控制存储历史记录的类型和数量;在命令行模式搜索文本时,则可以重新调用这些历史记录。

命令历史类型

命令历史可以分为以下几种类型({name}):

类型标识内容
c[md]:命令行历史
s[earch]/ or ?查找字符串历史
e[xpr]=表达式寄存器("=)历史
i[nput]@由input()函数输入的历史
d[ebug]>调试命令历史
a[ll]所有类型的历史记录

查看命令历史

使用以下命令,可以显示命令行历史记录:

:history

history

使用以下命令,可以显示所有类型的历史记录:

:history all

history all

使用以下格式的:history命令,可以查看指定类型和指定数目的历史记录:

:his[tory] [{name}] [{first}][, [{last}]]

  • {name},指定历史记录类型
  • {first},指定命令历史的起始位置(默认为第一条记录);
  • {last},指定命令历史的终止位置(默认为最后一条记录)。

如果没有指定 {first} 和 {last},那么将会列出所有命令历史。

如果指定了 {first} 和 {last},那么就会列出指定范围内的历史记录条目。例如以下命令,将列出第一到第五条命令行历史:

:history c 1,5

正数,表示历史记录的绝对索引,也就是:history命令列出的第一列数字。即使历史记录中的其它条目被删除了,该索引数字也会保持不变。例如以下命令,将列出指定位置(第五条)命令行历史:

:history c 5

负数,表示历史记录的相对索引。以最新一条记录 (索引号为 -1) 为基准向后算起。如以下命令,将列出所有历史记录中倒数第二条记录:

:history all -2

使用以下命令,则会列出所有历史记录中最近的两条记录:

:history all -2,

使用以下命令,可以查看:history命令的帮助信息:

:help :history

删除历史记录

使用以下命令,可以删除命令行历史记录:

:call histdel("")

可以删除指定类型的历史记录。例如使用以下命令,将删除所有查询历史记录:

:call histdel("seach")

您也可以直接编辑viminfo文件,直接删除其中的历史记录。请注意,需要重启Vim,以重新读取修改后的viminfo文件。

命令历史选项

通过history选项,可以控制记录历史记录的数量(默认为50)。例如以下命令,设置保存1000条命令历史记录:

:set history=1000

请注意:在viminfo选项中,也有命令历史相关参数;请在vimrc配置文件中,检查'viminfo'和'history'设置的的一致性和优先级。

命令小结
:history显示命令行历史记录
:history all显示所有类型的历史记录
:set history设置报错历史记录的数量

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

星期一, 九月 23, 2019

VIM学习笔记 viminfo

Vm使用viminfo选项,来定义如何保存会话(session)信息,也就是保存Vim的操作记录和状态信息,以用于重启Vim后能恢复之前的操作状态。

viminfo文件

viminfo文件默认存储在以下位置:

  • Linux和Mac:$HOME/.viminfo,例如:~/.viminfo
  • Windows:$HOME\_viminfo,例如:C:\Users\yiqyuan\_viminfo

viminfo文件主要保存以下内容:

  • Command Line History(命令行历史纪录)
  • Search String History(搜索历史纪录)
  • Expression History(表达式历史纪录)
  • Input Line History(输入历史记录)
  • Debug Line History(调试历史纪录)
  • Registers(寄存器)
  • File marks(标记)
  • Jumplist(跳转)
  • History of marks within files(文件内标记)

Vim在退出时,会将上述信息存放到viminfo文件中;在启动时,将会自动读取viminfo信息文件。

使用以下命令,可以手动创建一个viminfo文件:

:wviminfo file_name

使用以下命令,可以重新读去viminfo文件:

:rviminfo

使用以下命令,可以查看关于viminfo文件的帮助信息:

:help viminfo

viminfo选项

viminfo选项可以指定保存哪些内容,以及在何处的viminfo文件中保存这些信息。viminfo选项是一组使用逗号分隔的字符串;其中每个参数,是以单个字符开头的数值或字符串值。

Windows下的默认值为:

set viminfo='100,<50,s10,h,rA:,rB:

Linux和Mac下的默认值为:

set viminfo='100,<50,s10,h

viminfo选项列表
选项描述帮助信息
!如果包含,表示保存和恢复以大写字母开头并且不包含小写字母的全局变量。例如,保存 “KEEPTHIS” 和 “K_L_M”,但不保存 “KeepThis” 和”_K_L_M”。:help viminfo-!
"设置每个寄存器最多保存的行数。是“<”选项的旧称。需要在“"”之前加上转义反斜杠,否则将会被识别为注释的开始。:help viminfo-"
%如果包含,表示保存和恢复文件缓冲区列表;如果后跟数值,该数值指定保存缓冲区的最大数目;如果不包含数值,则保存所有缓冲区。如果Vim启动时指定文件名参数,则缓冲区列表不予恢复。如果Vim启动时没有指定文件名参数,则缓冲区列表从viminfo文件里恢复。没有文件名的缓冲区和帮助文件的缓冲区不会写入viminfo文件。不保存quickfix、unlisted、unnamed和在可移动介质上的缓冲区。:help viminfo-%
'保存指定数目文件中的标记。如果viminfo选项非空,则必须包含此参数。包含本项目意味着jumplist和changelist也保存在viminfo文件里。:help viminfo-'
/保存搜索历史的最大数目。如果此值非零,那么将保存搜索和替代模式。如果不包含,则使用history选项的值。:help viminfo-/
:保存命令行历史的最大数目。如果不包含,则使用history选项的值。:help viminfo-:
<每个寄存器保存的最大行数。如果为零,表示不保存寄存器。如果不包含,则表示保存所有的行。“"”是本项目的旧称。:help viminfo-<
@保存输入行历史的最大数目。如果不包含,则使用history选项的值。:help viminfo-@
c如果包含,则使用viminfo-encoding选项指定的编码格式写入viminfo文件。:help viminfo-c
f是否保存文件位置标记。如果为零,不保存文件位置标记 (0~9,A~Z)。如果不包含或者非零值,则保存位置标记。:help viminfo-f
h载入viminfo文件时,关闭高亮效果。如果不包含,则取决于在最近搜索命令之后是否使用过:nohlsearch命令。:help viminfo-h
n指定viminfo文件的名称。该名称必须紧随在字母“n”之后,并且必须为最后一个选项。如果启动Vim时指定了-i参数,那么此文件名将覆盖viminfo选项指定的文件名。文件名中的环境变量,将在文件打开时被扩展。:help viminfo-n
r不保存指定可移动介质或路径内的文件的相关信息。可以设置多个路径参数。例如在Windows上,你可以用“rA:,rB:”指定软驱或U盘。也可以在Linux上,使用“r/tmp”来屏蔽临时文件。此选项将忽略大小写。每个参数的最大长度为50个字符。:help viminfo-r
s如果为零,将不保存寄存器。缺省值“s10”,将忽略超过10 Kbyte文本的寄存器。:help viminfo-s

在单独指定viminfo文件的位置时,为了不覆盖viminfo选项的当前值,通常会在设置命令中使用“+=”操作符:

:set viminfo+=n$LOCALAPPDATA/_viminfo

:set viminfo+=nC:\\_viminfo

您可以参考以下命令,在vimrc配置文件中,定义viminfo选项:

set viminfo=\"50,'1000,h,f1,rA:,r$TEMP:,r$TMP:,r$TMPDIR:,:500,!,n$VIM/_viminfo

请注意:

  • 请不要将“<”设置过大,因为此选项将影响保存至viminfo文件中的信息量。在Vim启动时,如果读取尺寸过大的viminfo文件,将影响Vim启动速度;
  • 请在vimrc文件开头,首先定义:set nocompatible选项。

使用以下命令,可以查看viminfo选项的更多信息:

:help 'viminfo'

命令小结
:wviminfo写入viminfo文件
:rviminfo读取viminfo文件
:set viminfo设置viminfo选项

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

星期一, 九月 16, 2019

VIM学习笔记 工具箱-版本控制(Toolkit-Git)

众所周知,几乎所有Vim插件管理器都是使用GitHub来安装和更新插件;你也可以直接从GitHub下载Vim安装程序;而我的这个VIM学习笔记也是托管在GitHub上的,以实现在多台电脑上同步文档并进行版本管理。

本文并不会详细介绍GitHub的安装与使用,而是聚焦于如何使用GitHub与Vim相互配合。GitHub有着非常完善的(中文)文档;而视觉化的git简明指南更便于快速入门;还有表格化的速查表可以随时查阅各种命令的参考信息。

Git客户端

除了GitHub官方出品的客户端git-scm.com列出了各种操作系统下的更多客户端软件供您选择。

我强烈建议您尽量使用Git命令,而不是依赖于某个客户端软件。事实上,只需要记忆非常有限的几个常用命令,就可以毫无障碍地在各种命令行环境中进行Git操作了。关于详细操作说明,推荐阅读Learn the Basics of Git in Under 10 Minutes

Tools_Git_CLI

文档写作

learn_vim_GitHub

我的这个VIM学习笔记,都是通过手工编写HTML代码来完成的。也就是说,我需要在多台电脑上的不同操作系统之下测试命令执行,然后持续修改网页源文件。正是GitHub帮助我完美实现了文档的一致性和版本控制。同时,利用GitHub Pages功能,还可以自动发布为网页以供浏览器直接阅读。

Tools_Github_Pages

在此过程中,也充分体现了如下图所示的Git工作流程:

  1. 在电脑A上,编辑文档并使用以下命令将变更提交到服务器:
    • $ git add
    • $ git commit
    • $ git push
  2. 在电脑B上,使用以下命令从服务器上获取最新版本的文件:
    • $ git pull

Git_Workflow
Source: medium.com/free-code-camp

同理,也可以使用GitHub,在多台电脑间同步你的dotfiles配置文件。例如通过同步.vimrc配置文件,可以在多台电脑上快速部署相同的Vim配置,以获得相同的使用体验。

插件管理

不管您是通过vim-plug,还是Vundle来安装和管理插件,首先都需要使用$ git clone命令来安装插件管理器本身。而之后在安装其它插件时,也需要在vimrc配置文件中指定GitHub Repository的名称。

如果您仍然习惯于手工安装插件,那么也可以直接从GitHub克隆或者下载插件。

Vim官方网站VimAwesome中查找插件时,你也会发现相对应的GitHub链接。

代码片段管理

GistGitHub服务的一部分,用户可以将常用的代码片段存储云端,然后在不同的客户端中进行复用;也可以将代码片段内置到网页内,或者通过网址与他人分享。

使用Gist.vim插件,可以直接在Vim中管理Gist代码片段。你也可以使用Lepton等客户端软件,来管理Gist代码片段。

Browse Gist

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

星期五, 九月 06, 2019

VIM学习笔记 Ex脚本 (Ex Script)

如果希望一次性执行多条Ex命令,那么可以将这些命令保存为脚本文件,然后即可重复调用。

例如我的这个VIM学习笔记,都是在Vim里手工编写HTML代码的。相同的代码也会同步粘贴到我的blog里。而在搬运代码之前,我需要删除其中的Tab制表符和换行符。也就是说,我需要重复执行几个删除和替换命令。

ExScript_Purpose

创建脚本文件

我将以下命令,存储名为ExScript_Sample.vim的脚本文件。其中,所有以双引号(")开头的文本,都将被视为注释。注释可以单独为一行,也可以被放置在行的末尾。

ExScript_Sample

在Vim中执行脚本文件

在Vim中编辑文件时,可以使用以下命令来调用Ex脚本:

:source ExScript_Sample.vim

Vim将在屏幕底部显示命令执行的结果(比如修改或替换的行数等);点击Enter回车键,将返回常规模式:

ExScript_Message

如果您对执行结果不满意,那么也可以使用u命令,撤销 (Undo)以上操作。

在启动vim时,可以将文件名做为参数(Arguments),以打开多个文件。例如使用以下操作系统命令,将打开当前目录下的所有网页文件:

$ vim *.html

我们可以先在当前文件下,使用:source命令执行脚本;然后使用:next命令,切换到下一个文件,依次针对各个文件分别执行脚本。

而使用以下命令,则可以一次性对所有参数列表中的文件执行脚本:

:argdo source ExScript_Sample.vim

在命令行中执行脚本文件

在操作系统的命令行中,使用vim的-c选项,可以在加载文件之后自动执行Ex脚本文件:

$ vim -c "source ExScript_Sample.vim" test.html

利用竖直线“|”分割符,可以组合执行Ex脚本文件和Ex命令:

$ vim -c "source ExScript_Sample.vim | w" test.html

利用竖直线“|”分割符和argdo命令,可以针对多个文件分别执行脚本文件,然后保存并退出:

$ vim -c "argdo source ExScript_Sample.vim | w" -c "qa" A.html B.html C.html

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

星期一, 九月 02, 2019

执行Ex命令(Ex Command-Run)

可以使用以下几种方式来执行Ex命令:

  • 在常规模式下,输入冒号“:”以及命令,点击回车键即可执行Ex命令;
  • 进入Ex模式,执行Ex命令;
  • 调用Ex脚本,以执行其中的Ex命令;
  • 使用竖直线“|”分割符,组合执行多条Ex命令;
  • 执行寄存器中存储的Ex命令。

组合执行多条Ex命令

竖直线“|”作为分割符,可以将多个命令组合在一起执行。使用“|”时,如果前一个命令影响到文件中行的顺序,那么下一个命令将使用新的行位置进行工作。

使用以下命令,将首先删除第1行至第3行,然后在当前行(即调用ex命令之前的第4行)进行替换:

:1,3d | s/thier/their/

使用以下命令,将首先把1至5行移动到第10行之后,然后显示所有包含模式pattern的行:

:1,5m10 | g/pattern/nu

利用寄存器执行Ex命令

例如在Ex脚本文件(Ex Script)中包含以下命令:

%s/\n//

我们移动到此行,然后使用以下命令将该行内容删除到命名寄存器(Regists)“g”之中:

"gdd

使用以下命令,则可以执行已存储在“g”寄存器之中的命令:

:@g

ExCommand_Run_by_Register

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

星期三, 八月 28, 2019

VIM学习笔记 工具箱-图表制作 (Toolkit-Diagram)

在编写VIM学习笔记的过程中,特意制作了诸多图表,以便更好地说明编辑状态的变化和命令操作的顺序。以下则将介绍我用于制作图表的几款工具。

Cacoo

Cacoo是免费的的图表绘制网络服务。在其简洁易用的界面中绘制图表,甚至可以称为一种享受。

Cacoo提供了基本形状、网络图、流程图和用户界面等多种类型的图形,可以方便地绘制出丰富多样的图表。每张图表(Diagram)中,可以包含多个页面(Sheet),某个页面还可以做为其它页面的背景。

在图表绘制页面中,可以插入各种图形和文字,并设置其尺寸、边框、阴影等属性。在设置色彩时,还能够利用滴管拾取颜色,以保持图表各部分色彩的一致性。

Tools_Diagram_Cacoo

利用鼠标拖拽,能够方便地定位和排列图表对象。当移动对象与其它对象接近时,将显示辅助标尺,协助你将图形停靠在合适的位置。

Cacoo

在图表管理页面中,可以通过列表或缩略图方式浏览图表;能够创建目录来组织图表;还可以复制、移动或删除图表。可以将多个对象组合成一个整体,也可以将组合后的对象重新分开。通过前置和外置对象,能够更加方便地排布复杂地图表对象。

Tools_Diagram_Cacoo_Folders

图表可以导出为PNG、PDF、PPT等格式的文件;也可以通过公开的链接()或者嵌入的代码来分享图表。

Tools_Diagram_Cacoo_Share

Dia

Dia是开源的图表制作工具,支持Windows、Linux和Mac操作系统。Dia可谓历史悠久,以至于你初次见到它的面目时,会有恍如隔世的陌生感。当然,你更可能惊讶于它波澜不惊的缓慢更新。在图表制作领域,有太多身躯庞大的怪物,比如Microsoft Office Visio,比如LibreOffice Draw,而如Dia这般简陋的存在堪称异类。而正是这份执拗的质朴,让人不离不弃,简单直接地操作,跨平台的免费存在,有友如斯,夫复何求。

Dia内置了流程图、网络图、电路板、数据库和UML等等图形组件,您还可以下载更多类型的图形组件。

Tools_Diagram_Dia_Objects

通过鼠标拖拽,可以很方便地放置和移动图形组件,也可以随心所欲地调整图形尺寸。借助于网格线,可以更直观地排布图形;如果设置了“对齐网格”选项,那么在移动和缩放组件时,都将自动以网格为单位进行操作,既保证了图形尺寸的一致性,又可以快速精确地对齐各个组件。

Tools_Diagram_Dia_Perfer_Grid

在添加直线或折线来连接多个组件时,线条的断点会自动吸附至组件的连接点之上,而不需要你手动调整位置;连接建立之后,即使移动组件,连接也不会断开,而是会随着组件一起延展。这对于持续微调图形,还是很有帮助的。

Tools_Diagram_Dia_Connect

图表可以导出为PNG、JPG、PDF、LaTex等格式的文件。

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