📄 tips.cnx
字号:
:echo strlen(@")一个换行符被当做一个字节。==============================================================================恢复光标位置 *restore-position*有时你希望写一个映射,让它在文件中的其他地方做一些修改然后恢复光标的位置(不使当前的文本卷屏)。例如,修改一个文件中的日期标记: > :map <F2> msHmtgg/Last [cC]hange:\s*/e+1<CR>"_D"=strftime("%Y %b %d")<CR>p'tzt`s分解出保存位置的命令: ms 把光标位置存放在标记 's' 中 H 跳转到当前屏幕的顶端 mt 把这个位置存放在标记 't' 中分解出恢复位置的命令: 't 跳转到先前位于屏幕顶端的那一行 zt 卷屏,使这一行位于屏幕的顶端 `s 跳转到最初光标的位置==============================================================================文件更名 *rename-files*假如我有一个目录,里面有如下的文件(目录是随机选取的):buffer.ccharset.cdigraph.c...现在我希望把 *.c 更名为 *.bla。我可以这样做: > $ vim :r! ls *.c :%s/\(.*\).c/mv & \1.bla :w !sh :q!==============================================================================加速外部命令的执行 *speed-up*在一些情况下,外部命令执行起来非常的慢。这个还会减慢 Unix 下的通配符扩展。这儿有一些建议可以加快速度:如果你的 .cshrc 文件(根据你使用的 shell,文件名可能不同)非常的长,你应该把它分割成2节:需要和用户交互的、无需和用户交互的(经常被称作二级 shell)。当你在 Vim 中执行一个类似 ":!ls" 的命令时,你就不需要和用户交互的那一部分(例如:设置提示符)。把那些不必要的部分放到这些行后面去: > if ($?prompt == 0) then exit 0 endif另一个办法是在 'shell' 选项中包含 "-f" 参数,例如: > :set shell=csh\ -f(这儿的反斜杠是必须的,这样才能在选项中表示一个空格)。这样就会使 csh 完全跳过 .cshrc 文件。不过这样可能会造成一些程序不能正常运行。==============================================================================一些有用的映射 *useful-mappings*这里有一些人们喜欢使用的映射。 *map-backtick* > :map ' `使得单引号和 ' 一样工作。把光标移动到一个标记的第一列,而不是那一行的第一个非空白字符。 *emacs-keys*要在命令行上实现 Emacs 风格的编辑操作: > " start of line :cnoremap <C-A> <Home> " back one character :cnoremap <C-B> <Left> " delete character under cursor :cnoremap <C-D> <Del> " end of line :cnoremap <C-E> <End> " forward one character :cnoremap <C-F> <Right> " recall newer command-line :cnoremap <C-N> <Down> " recall previous (older) command-line :cnoremap <C-P> <Up> " back one word :cnoremap <Esc><C-B> <S-Left> " forward one word :cnoremap <Esc><C-F> <S-Right>NOTE:前提条件是 '<' 标志不在 'cpoptions' 选项中。 |<>| *format-bullet-list*这个映射可以格式化任何 bullet 列表,不过它需要在每一个条目的上下都各有一个空行。这些表达式命令可以用来对映射的部分进行注释: > :let m = ":map _f :set ai<CR>" " 需要设置 'autoindent' :let m = m . "{O<Esc>" " 在项目上面加入空行 :let m = m . "}{)^W" " 跳转到 bullet 之后的文本 :let m = m . "i <CR> <Esc>" " 为缩进加空格 :let m = m . "gq}" " 格式化 bullet 之后的文本 :let m = m . "{dd" " 删除空行 :let m = m . "5lDJ" " 把文本放到 bullet 之后 :execute m |" 定义这个 mapping(符号 <> |<>|。 Note 这些必须按照字面逐个输入。 ^W 是 "^" 和 "W",而不是CTRL-W。 如果 '<' 标志不在 'cpoptions' 选项中,你可以把这些拷贝/粘贴到 Vim 中去)Note 最后一个注释以 |" 开始,因为 ":execute" 不能直接识别一个注释。你还需要把 'textwidth' 设置成一个非0值,例如: > :set tw=70以下这个映射可以达到同样的效果,不过它从第一行获得列表的缩进(Note: 这个映射是在同一行中输入的,其中有很多空格): > :map _f :set ai<CR>}{a <Esc>WWmmkD`mi<CR><Esc>kkddpJgq}'mJO<Esc>j< *collapse*这2个映射可以把一连串的空行 (;b) 或空白行 (;n) 压缩到一行 > :map ;b GoZ<Esc>:g/^$/.,/./-j<CR>Gdd :map ;n GoZ<Esc>:g/^[ <Tab>]*$/.,/[^ <Tab>]/-j<CR>Gdd==============================================================================压缩帮助文件 *gzip-helpfile*对于那些磁盘空间极度紧张的人来说,你们可以压缩帮助文件。这样会使得查看帮助文件时稍微慢一点,并且需要 "gzip" 这个程序的支持。(1) 压缩所有帮助文件: "gzip doc/*.txt"。(2) 编辑文件 "doc/tags",用 ".txt.gz" 替换 ".txt": > :%s=\(\t.*\.txt\)\t=\1.gz\t=(3) 把这一行加入到你的 vimrc 文件中: > set helpfile={dirname}/help.txt.gz这儿 {dirname} 是存放帮助文件的目录。|gzip| 这个插件会负责解压缩这些文件的。你必须肯定已经把 $VIMRUNTIME 设置成存放 Vim 文件的目录了,如果两者不一致的话。参见: |$VIMRUNTIME|。==============================================================================在一个窗口中执行 shell 命令 *shell-window*很多人都询问能不能在 Vim 中的一个窗口内执行 shell 命令。答案是:不行!加入这个功能会给 Vim 增加很多代码量,这也是为什么我们没有这样做的一个很好的理由。毕竟,Vim 只是一个编辑器,它本身并不是用来做那些非编辑类工作的。然而,要达到这样的目的,你可以把你的终端屏幕拆分开或者使者用 "splitvt" 程序来显示你的屏幕。在一些 ftp 服务器上你可以找到这个工具。Sam Lantinga <slouken@cs.ucdavis.edu> 对此了解颇多。另一种办法就是使用最早在 BSD Unix 上出现的 "window" 命令,它可以支持很多重叠的窗口。或者使用最先出现在 www.uni-erlangen.de 上的 "screen" 程序,它支持把多个窗口存入堆栈中。==============================================================================十六进制编辑 *hex-editing* *using-xxd*请看用户手册的第 |23.4| 节。如果你用一个专门的扩展名用来命令二进制文件(诸如 exe,bin等等),你们会发现以下使用在 <.vimrc> 文件中的一些命令在自动处理这些文件时非常有用。你可以用你希望编辑的文件扩展名(用逗号分隔)替换以下的 "*.bin": > " vim -b : edit binary using xxd-format! augroup Binary au! au BufReadPre *.bin let &bin=1 au BufReadPost *.bin if &bin | %!xxd au BufReadPost *.bin set ft=xxd | endif au BufWritePre *.bin if &bin | %!xxd -r au BufWritePre *.bin endif au BufWritePost *.bin if &bin | %!xxd au BufWritePost *.bin set nomod | endif augroup END==============================================================================在自动命令中使用符号 <> *autocmd-<>*在一个自动命令的参数中,符号 <> 是不能被识别的。为避免使用用特殊的字符,你可以使用一个可以自我毁灭的映射来得到符号 <>,然后从自动命令中调用这个映射。举例如下: *map-self-destroy* > " 这个将会自动的把文件名加入到菜单列表中 " 它使用了一个可以自我毁灭的 mapping! " 1. 用缓冲中的一行把文件名中的点('dots')转换成 \ 。 " 2. 把那个存放在寄存器 '"' 中 " 3. 把那个名字存在缓冲菜单列表中 " 注意:这个有一些副作用,比如:覆盖当前的寄存器内容和 " 删除任何对 "i" 命令的mapping。 " autocmd BufNewFile,BufReadPre * nmap i :nunmap i<CR>O<C-R>%<Esc>:.g/\./s/\./\\./g<CR>0"9y$u:menu Buffers.<C-R>9 :buffer <C-R>%<C-V><CR><CR> autocmd BufNewFile,BufReadPre * normal i另一个或许更好一些的办法就是使用 ":execute" 命令。在字符串中,你可以通过在符号 <> 前面加一个反斜杠的方法来使用它。别忘了重复反斜杠以及在'"'前面放一个反斜杠。 > autocmd BufNewFile,BufReadPre * exe "normal O\<C-R>%\<Esc>:.g/\\./s/\\./\\\\./g\<CR>0\"9y$u:menu Buffers.\<C-R>9 :buffer \<C-R>%\<C-V>\<CR>\<CR>"为了建立一个真实的缓冲菜单,需要用到用户函数(参见 |:function|),不过那里不使用符号 <> , 所以失去了在这里举例的意义。 vim:tw=78:ts=8:ft=help:norl:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -