星期五, 二月 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<上一篇 | 目录 下一篇>

星期二, 二月 11, 2020

VIM学习笔记 自动补全详解(Auto-Completion Detail)

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

Vim可以针对整行文字、关键字、字典、词典、标签、文件名、宏、命令和拼写等等进行补全。上节介绍了进入补全模式的操作方法;本节将详细介绍各种补全方式的特点。

整行补全(Whole line completion)

使用Ctrl-X Ctrl-L快捷键,将在'complet'选项定义的范围内查找匹配的行。假设在编辑网页文档时输入“<h”,然后调用整行匹配,将会显示所有以“h”开头的HTML标签。

当前文件内关键字补全(Keyword local completion)

使用Ctrl-X Ctrl-NCtrl-X Ctrl-P快捷键,将在当前文件中查找匹配的关键字。

此处的关键字,是指由'iskeyword'选项定义的字符串。默认情况下,iskeyword=@,48-57,_,192-255,认为由数字、字母和下划线组成的字符串为关键词。而句点和短横线,则被是为关键词之间的分隔符。您可以使用set iskeyword命令,来改变关键词的定义。

字典补全(Dictionary completion)

使用Ctrl-X Ctrl-K快捷键,将在'dictionary'选项定义的文件中查找匹配的关键词。

默认情况下'dictionary'选项为空。可以使用:set dictionary命令,来指定字典文件。

对于Linux系统,通常会查找/usr/dict/words或/usr/share/dict/words:

:set dictionary=/usr/dict/words,/usr/share/dict/words

对于Windows系统,如果已经安装了Cygwin,那么可以选择添加words软件包;然后根据您的Cygwin安装目录,来指定字典文件:

set dictionary=D:\cygwin64\usr\share\dict\linux.words

Tools_Cygwin_SelectPackages_dict

你也可以包括其它自定义的字典文件:

:set dictionary+=home/oualline/words

假设我们需要输入单词“acknowledged”,只需要首先输入“ack”三个字母,然后点击Ctrl-X Ctrl-K快捷键即可进行匹配:

AutoCompletion_Dictionary

词典补全(Thesaurus completion)

使用Ctrl-X Ctrl-T快捷键,将在'thesaurus'选项定义的文件中查找匹配的关键词。

默认情况下'thesaurus'选项为空。可以使用:set thesaurus命令,指定字典文件。

首先下载词典文件;然后解压缩后将其中的thesaurus.txt文件复制为~/.vim/thesaurus/english.txt;最后使用以下命令,来指定词典文件:

:set thesaurus=$HOME\vimfiles\thesaurus\english.txt

假设我们输入单词“enjoy”,然后点击Ctrl-X Ctrl-T快捷键,将会在词典文件中查找光标下的单词:

AutoCompletion_Thesaurus

因为在词典文件中,每行会包含多个单词,所以将显示匹配行中的所有单词:

bask enjoy relish savor savour lie

当前文件及其包含的文件关键字补全(Path pattern completion)

使用Ctrl-X Ctrl-I快捷键,将在当前文件以及由'include'选项指定的包含进来的文件中查找匹配的关键词。

很多编程语言都会提供从外部文件中调用代码的功能。比如,C语言的#include语法和Python的import语法等。Vim将根据文件类型所对应的'include'选项,来查找指定包含的文件。您可以使用:set include?命令,查看当前的'include'选项设置。

标签补全(Tag completion)

使用Ctrl-X Ctrl-]快捷键,将在当前文件以及由'include'选项指定的包含进来的文件中查找匹配的标签。

文件名补全(File name completion)

使用Ctrl-X Ctrl-F快捷键,可以匹配并补全文件名。

如果当前光标下的文本不包含任何路径信息,那么将显示当前目录下的文件列表。

如果当前光标下的文本包含任何(绝对或相对)路径信息,那么将显示其指定目录下的文件列表。

如果当前光标下的文本包含唯一的路径信息(比如“~”),那么将自动转换为目录的完整名称。

AutoCompletion_FileName

定义补全(Definition completion)

使用Ctrl-X Ctrl-D快捷键,将在当前文件以及由'include'选项指定的包含进来的文件中,查找由'define'选项定义的宏(definition/macro)。

'define'选项定义的正则表达式默认为“^\s*#\s*define”,将查找以“define”语法定义的宏。您可以使用:set define?命令,查看当前的'define'选项设置。

Vim命令补全(Command-line completion)

使用Ctrl-X Ctrl-V快捷键,将匹配Vim命令,以辅助脚本开发。

用户自定义补全(User defined completion)

使用Ctrl-X Ctrl-U快捷键,将由'completefunc'选项指定的自定义函数来进行匹配。

拼写建议补全(Spelling completion)

使用Ctrl-X Ctrl-S快捷键,将根据拼写检查给出补全建议。

请注意,为了使用拼写补全,请确保已使用以下命令,打开了拼写检查特性:

:set spell

全能补全(Omni completion)

使用Ctrl-X Ctrl-O快捷键,将由'omnifunc'选项指定的自定义函数来进行匹配。Vim将通过$VIMRUNTIME/autoload/{filetype}complete.vim文件来实现全能补全特性,现在支持8种语言,包括C, (X)HTML with CSS, JavaScript, PHP, Python, Ruby, SQL和XML。

例如首先输入HTML标签的前几个字母“<p cl”,然后按下Ctrl+XCtrl+O键,将根据语法显示匹配菜单:

OmniCompletion_HTML

建议将以下命令,加入vimrc配置文件的:filetype命令之后,以更好地利用全能补全功能:

if has("autocmd") && exists("+omnifunc")
autocmd Filetype *
\ if &omnifunc == "" |
\ setlocal omnifunc=syntaxcomplete#Complete |
\ endif
endif

您可以使用:set omnifunc?命令,查看当前的'omnifunc'选项设置。

补全方式
方式快捷键相关选项帮助信息
整行Ctrl-X Ctrl-L:h compl-whole-line
当前文件内的关键字Ctrl-X Ctrl-N:h compl-current
Ctrl-X Ctrl-P
字典Ctrl-X Ctrl-K'dictionary':h compl-dictionary
词典Ctrl-X Ctrl-T'thesaurus':h i_CTRL-X_CTRL-T
当前文件及其包含的文件Ctrl-X Ctrl-I'include':h compl-keyword
标签(Tag)Ctrl-X Ctrl-]:h compl-tag
文件名Ctrl-X Ctrl-F:h compl-filename
定义或宏Ctrl-X Ctrl-D'define':h compl-define
Vim 命令Ctrl-X Ctrl-V:h compl-vim
用户自定义Ctrl-X Ctrl-U'completefunc':h compl-function
全能 (omni) Ctrl-X Ctrl-O'omnifunc':h compl-omni
拼写建议Ctrl-X Ctrl-S:h compl-spelling
关键字Ctrl-N'complete':h compl-generic
Ctrl-P

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

星期一, 二月 10, 2020

VIM学习笔记 自动补全(Auto-Completion Intro)

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

Vim可以针对整行文字、关键字、字典、词典、标签、文件名、宏、命令和拼写等等进行补全。本节将首先介绍进入补全模式的操作方法;下节将详细介绍各种补全方式的特点。

关键字补全(Generic keyword completion)

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

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

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

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

^X模式(Ctrl-X Mode)

在插入模式下,输入Ctrl-X将进入^X模式(插入和替换模式的一个子模式)。屏幕底部将显示以下提示信息:

-- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)

您可以选择以下自动补全方式:

Ctrl-]标签(tags)补全
Ctrl-D定义补全
Ctrl-E向上滚动文本
Ctrl-F文件名补全
Ctrl-I当前文件以及包含进来的文件补全
Ctrl-K字典补全
Ctrl-L整行补全
Ctrl-N当前文件内的关键字补全,向下选择匹配项
Ctrl-O全能补全
Ctrl-P当前文件内的关键字补全,向上选择匹配项
Ctrl-S拼写建议补全
Ctrl-U用户自定义补全
Ctrl-VVim命令补全
Ctrl-Y向下滚动文本

假设在编辑main.c文件时,想要查找一个宏定义,那么首先按下ctrl-X键进入^X模式,然后再按下CTRL-D键,这时就会在弹出菜单中显示匹配项。

补全弹出菜单(popupmenu-completion)

随着弹出菜单的显示,将会自动应用第一个匹配项。

使用以下快捷键,可以在弹出菜单中移动和选择匹配项:

  • 使用Ctrl-NCtrl-P上下移动时,输入的文本也会随之变化。
  • 使用<Up><Down>上下移动时,输入的文字并不会变化。
  • 使用<PageUp><PageDown>键,可以在菜单中翻页。
  • 使用Ctrl-YEnter回车键,将使用当前匹配项完成补全。
  • 使用Ctrl-E键,将关闭菜单并退回到文字输入的原始状态。
  • 使用Esc键,将关闭弹出菜单,但会保留之前应用的匹配项。

请注意,如果您不希望应用任何匹配项完成补全时,应该使用Ctrl-E键,而不是使用Esc键来取消操作。

AutoCompletion_popupmenu

使用:h popupmenu-keys命令,可以查看关于弹出菜单快捷键的帮助信息。

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

星期一, 二月 03, 2020

VIM学习笔记 网页开发-输入网页标签(Input HTML Tags)

HTML_StartFresh

在编写HTML代码时,重复录入标签显然是相当低效的。我制作了HTML-Editor插件,通过快捷键和菜单项来提高输入HTML标签的效率。

安装配置插件

请在vimrc中添加以下命令,以便在“Insert (paste)”状态下正常使用快捷键:

:set nopaste

如果侦测文件类型为XHTML,那么将自动使用小写的标签。也可以定义以下变量,以强制使用小写标签:

:let g:do_xhtml_mappings = 'yes'

在插入模式下,输入以“;”开头的关键词,比如“;pp”,将自动扩展为完整的段落标签;使用以下命令,可以修改默认的前缀键为逗号:

:let g:html_map_leader = ','

假设使用;ah快捷键,输入以下链接标签。光标将自动定位到href属性的引号之内;输入链接地址之后,点击Tab键将移动至title属性的引号之内;输入链接标题之后,点击Tab键将移动至</a>标签之前。也就是说,使用Tab键可以快速跳转至下一标签属性,进一步提高输入HTML代码的效率。

HTML-Editor-Kbd-Tab

如果您需要输入真正的Tab制表符,那么可以使用;Tab快捷键。

如果您希望恢复通常的Tab键操作行为,那么请设置以下变量:

let g:no_html_tab_mapping = 'yes'

利用快捷键输入标签

以下表格列示了在插入模式可视化模式下,用于输入HTML标签的快捷键:

快捷键输入代码
;;插入字符“;”
;&插入字符“&”[1]
;4<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
;s4<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
;ab<abbr title=""></abbr>
;ad<address></address>
;ah<a href="" title=""></a>
;an<a id=""></a>
;bd <body><CR></body>
;bh<base href="" />
;bl<blockquote><CR></blockquote>
;br<br />
;bu<input type="button" name="" value="" />
;ca<caption></caption>
;ch<input type="checkbox" name="" value="" />
;ci<cite></cite>
;cm<!-- -->
;co<code></code>
;cs<style type="text/css"><!--<CR>--></style>
;ct<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> [2]
;dd<dd></dd>
;de<del></del>
;df<dfn></dfn>
;dl<dl><CR></dl>
;dt<dt></dt>
;dv<div><CR></div>
;eb<embed type="" src="" width="" height="" />
;em<em></em>
;fi<input type="file" name="" value="" size="20" />
;fm<form action=""><CR></form>
;h1<h1></h1>
;h2<h2></h2>
;h3<h3></h3>
;h4<h4></h4>
;h5<h5></h5>
;h6<h6></h6>
;he<head><CR></head>
;hi<input type="hidden" name="" value="" />
;hr<hr />
;ht<html xmlns="http://www.w3.org/1999/xhtml"><CR></html>
;if<iframe src=""><CR></iframe>
;im<img src="" alt="" />
;in<ins></ins>
;it<i></i>
;js<script type="text/javascript"><!--<CR>//--></script>
;la<label for=""></label>
;li<li></li>
;lk<link href="" />
;ls<link rel="stylesheet" type="text/css" href="" />
;me<meta name="" content="" />
;mh<meta http-equiv="" content="" />
;mi<img src="" width="" height="" alt="" /> [3]
;ms<select name="" multiple><CR></select>
;ns<noscript><CR></noscript>
;ob<object data="" width="" height=""><CR></object>
;og<optgroup label=""><CR></optgroup>
;ol<ol><CR></ol>
;op<option></option>
;pa<input type="password" name="" value="" size="20" />
;pm<param name="" value="" />
;pp<p></p>
;pr<pre><CR></pre>
;qu<q></q>
;ra<input type="radio" name="" value="" />
;re<input type="reset" value="Reset" />
;sa<samp></samp>
;sb<sub></sub>
;se<select name=""><CR></select>
;sj<script src="" type="text/javascript"></script>
;sm<small></small>
;sn<span></span>
;sp<sup></sup>
;st<strong></strong>
;su<input type="submit" value="Submit" />
;ta<table><CR></table>
;tA在常规模式或可视化模式下,提示输入行列数,并自动生成表格代码
;tb<tbody><CR></tbody>
;td<td></td>
;te<input type="text" name="" value="" size="20" />
;tf<tfoot><CR></tfoot>
;th<th></th>
;tH<thead><CR></thead>
;ti<title></title>
;tr<tr></tr>
;tx<textarea name="" rows="10" cols="50"><CR></textarea>
;ul<ul><CR></ul>

请注意:

  1. 由于“&”作为前缀键用于输入字符实体(Character Entity),所以定义快捷键用来输入此特殊字符;
  2. charset属性根据文件的'fileencoding'或'encoding'属性自动判断;您也可以通过g:html_default_charset变量进行强制定义;
  3. 点击;mi将查找src指定的图片文件,然后将获得的图片尺寸信息更新到width和height属性中;
  4. 代码列中的“<CR>”,代表换行符;
  5. 可视化模式下选则文本然后点击快捷键,将插入标签并将选中的文本放置在name、value或content属性中;
  6. 对于<acronym>,<big>,<center>,<font>,<isindex>,<strike>,<tt>,<frame>,<frameset>,<noframes>,<b>,<u>等等已废弃的标签,不建议继续使用;
  7. 关于完整的HTML标签索引,请参考HTML Elements Index

利用菜单输入标签

您也可以使用“HTML”菜单来输入HTML标签;

HTML-Editor-Menu-Tags

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