前段时间有读者建议我写一下如何编写vim脚本,我回复说暂时没有这样的计划。因为我觉得,学习vim脚本编程的人,大多是vim的老用户了,他们完全可以参照vi手册来学习脚本编程。推广vim最困难的任务是留住vim的初学者,因此我所写的文章,也大多针对这一阶段的读者。
前几天在网上看到一篇关于vim脚本的文章,在此推荐给有兴趣的朋友:使用脚本编写 Vim 编辑器,第 1 部分: 变量、值和表达式
,英文原文为Scripting the Vim editor, Part 1: Variables, values, and expressions
在网上搜了一下,目前只看到第一部分,看来作者还在创作中。
请教博主一个关于变量作为命令参数的问题:
以下面的命令为例:
let i=10
1,iw new.txt
原意是想把第1行至第i行(即第10行)内容保存至new.txt文件。结果提示错误。
对此应如何修改?
我试的是:
%s/WQ/
这样子
没关系 不影响使用 就这样子了
@karl
:cabbr WQ wq
我试过了,这个是可以的,%s/WQAB/ddd/也不会被自动替换成wq。
你要先把之前定义的cmap unmap掉
转义:
< = <
> = >
这个也是:在:s替换及其它的命令也会自动把WQ改成wq。。。
改成:
:cabbr WQ wq
也是
在编辑的时候输入:
:WQ回车
提示:
E492: 不是编辑器的命令: WQ
BTW:wordpress转义,不知怎么输入:
这个也是:在:s替换及其它的命令也会自动把WQ改成wq。。。
改成:
:cabbr WQ\ wq\
也是
在编辑的时候输入:
:WQ回车
提示:
E492: 不是编辑器的命令: WQ
@karl
试试
:cabbr WQ wq
在.vimrc中填写一行:
cmap WQ wq
在编辑的时候输入:
:WQ回车
提示:
E492: 不是编辑器的命令: WQ
@karl
不行。
你试试把WQ<cr>映射成wq<cr>,也许能避免一些错误替换
再请教博主一个键映射的问题:我经常会在命令模式下输入:”WQ”和”WQA”,想把它映射成”wq”和”wqa”,在.vimrc中加入:cmap WQ wq
但现在:s替换及其它的命令也会自动把WQ改成wq。。。能不能让命令在开头两个字母时才进行这个键映射?
好 谢谢
@karl
回复在这里:http://easwy.com/blog/archives/vim-command-line-complete/。
请问博主这个功能怎么使用?--当前光标所在的单词 还需要插入吗?
就是看了帮助没明白:插入当前光标所在的单词--当前光标所在的单词 还需要插入吗? 这个功能有什么作用?
@karl
是的。你试一下就明白了。
c_CTRL-R_CTRL-W
的作用是什么? 没看明白
–插入当前光标所在的单词?
@karl
我不同的场景会用不同的方法。假设想把old替换成new。
如果只替换少量几个,一般用两种方法:
方法一:移到第一个old处,用cw命令修改(此处可利用补全功能),然后回到normal模式,查找下一个,用”.”命令重复上面的修改。命令序列是:
/old<cr>
cwnew<esc>
n.
方法二:拷贝new到寄存区,移到old处替换,方法和你列出的一样,命令稍简单一些:
/new<cr>
yw
/old<cr>
vep
如果要替换的内容较多,用替换命令最方便了,这里可以用到命令行补全。
:help c_CTRL-R
:help c_CTRL-R_CTRL-W
再请教一下楼主:有时,我在VIM中想把一个单词替换成另一个单词,用:yw,然后到要被替换的单词那里:dw 然后”0P,很多个步骤。yw,dw,”0P,这样子感觉按键多而且不顺手,请问你是怎么替换的?(:s/a/b这种要敲两个单词速度也不快)
嗯 知道了:)
@karl
:set fenc需要编译了multi_type功能,而你的version输出显示了“-multi_byte”,也就是说你没编进来。
记错了 这个是我自己编译的,我还以为是apt-get down下来的
karl@karl-laptop:~$ gvim 2.c
Warning: X locale modifiers not supported, using default
karl@karl-laptop:~$
@karl,
X locale modifiers not supported, using default
您好,我也碰到这个提示,怎么解决呢 ?万谢!
export XMODIFIERS=”@im=fcitx”
后,set fenc还是不行。version命令结果如下
:version
VIM – Vi IMproved 7.1 (2007 May 12, compiled Jun 30 2008 13:40:12)
Compiled by zhengkl@dev2
Normal version with X11-Athena GUI. Features included (+) or not (-):
-arabic +autocmd +balloon_eval +browse +builtin_terms +byte_offset +cindent
+clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
+cryptv -cscope +cursorshape +dialog_con_gui +diff +digraphs -dnd -ebcdic
-emacs_tags +eval +ex_extra +extra_search -farsi +file_in_path +find_in_path
+folding -footer +fork() -gettext -hangul_input -iconv +insert_expand +jumplist
-keymap -langmap +libcall +linebreak +lispindent +listcmds +localmap +menu
+mksession +modify_fname +mouse +mouseshape -mouse_dec +mouse_gpm
-mouse_jsbterm -mouse_netterm +mouse_xterm -multi_byte +multi_lang -mzscheme
-netbeans_intg -osfiletype +path_extra -perl +postscript +printer -profile
-python +quickfix +reltime -rightleft -ruby +scrollbind -signs +smartindent
-sniff +statusline -sun_workshop +syntax +tag_binary +tag_old_static
-tag_any_white -tcl +terminfo +termresponse +textobjects +title +toolbar
+user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace
+wildignore +wildmenu +windows +writebackup +X11 +xfontset +xim +xsmp_interact
+xterm_clipboard -xterm_save
system vimrc file: “$VIM/vimrc”
user vimrc file: “$HOME/.vimrc”
user exrc file: “$HOME/.exrc”
system gvimrc file: “$VIM/gvimrc”
user gvimrc file: “$HOME/.gvimrc”
system menu file: “$VIMRUNTIME/menu.vim”
fall-back for $VIM: “/usr/local/share/vim”
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_ATHENA -DFUNCPROTO=15
-DNARROWPROTO -g -O2 -I/usr/X11R6/include
Linking: gcc -L/usr/X11R6/lib -L/usr/local/lib -o vim -lXaw -lXext -lncurses
-lacl -lgpm
@karl
在:help e285里有解决的办法,我想你在环境变量里定义一下XMODIFIERS应该就可以,例如:
export XMODIFIERS=”@im=fcitx”
你用:version命令看一下你的vim都编译了哪些feature吧
@Easwy
我都是apt-get安装的,以前好像没有碰到这个问题。。。
第一个问题有没有什么办法解决?
:help e285
:help fenc
第一个错误应该和输入法有关
第二个错误是你的gvim在编译时没有打开+multi_byte
再请教一下:
我在终端中调gvim报E285如下:
karl@karl-laptop:/media/disk/fromwindows/vimrc_easwy$ gvim .vimrc
E285: Failed to create input context
E285: Failed to create input contextkarl@karl-laptop:/media/disk/fromwindows/vimrc_easwy$
在vim中
:set fenc
提示:
E519: Option not supported: fenc
请问是为什么?应该怎么解决?
@伐木丁丁
在set textwidth之后使用一下gq命令
:help gq
老大,请教一个问题。
我设置了 :set textwidth=80
没有设置linebreak
但是没有产生效果,仍然是linebreak的效果。
将:set textwidth=0 :set wrapmargin=80也没有效果。
咋办呢?
(需求起源:我想把文本转换为html,一行的字符太多,导致html页横向太宽。)
非常感谢。
对所有无私奉献的网络写作者表示敬意。
@伐木丁丁
:help put
你所问的命令都在里面。
我接下来会写关于拷贝/粘贴的文章,拖了N久了~~~
Easwy你好:请教一个问题。
在gvim的菜单栏中,
分别标明
剪切 “+x
复制 “+y
粘贴 “+gP
粘贴到光标前 [p
粘贴到光标后 ]p
这个”+ 表示的是剪贴板
对于粘贴后面的 gP 以及[p ]p 请问是什么意思,
g,P(大写), [, ],分别是什么意思?
谢谢~~~~~~~~~
vi 很重要。。
晕倒,你给的就是中文。
这个有中文版:
http://www.ibm.com/developerworks/cn/linux/l-vim-script-1/index.html
@Rain@DNA
问题1:
=======
可以尝试一下argdo或bufdo
用argdo时,可以先用args命令定义一个参数列表,argdo针对此参数列表中所有文件进行操作。
:help args_f
:help argdo
:help bufdo
问题2:
=======
vim具备列编辑功能
:help CTRL-V
:help blockwise-operators
:help blockwise-examples
在windows里,ctrl-v可能被重新映射了,用ctrl-q
最近编辑多个文档,需要对每个文档进行编辑、格式化,我就建了n个寄存器,然后用最后一个寄存器按顺序调用前面建立的寄存器,有没有更好的办法呢?
还有一个问题:
以前用UE32时,由一个很喜欢的功能,就是列块替换,但是到现在我还是不会用vim来完成对应的功能,请指教!
说实在的,我觉得自己真正用vim有提升,是从看你的文档开始的,不管内容我以前是否知道,他给了我一个循序渐进的路,谢谢!