一篇介绍vim脚本编写的文章

前段时间有读者建议我写一下如何编写vim脚本,我回复说暂时没有这样的计划。因为我觉得,学习vim脚本编程的人,大多是vim的老用户了,他们完全可以参照vi手册来学习脚本编程。推广vim最困难的任务是留住vim的初学者,因此我所写的文章,也大多针对这一阶段的读者。

前几天在网上看到一篇关于vim脚本的文章,在此推荐给有兴趣的朋友:使用脚本编写 Vim 编辑器,第 1 部分: 变量、值和表达式
,英文原文为Scripting the Vim editor, Part 1: Variables, values, and expressions

在网上搜了一下,目前只看到第一部分,看来作者还在创作中。

38 thoughts on “一篇介绍vim脚本编写的文章”

  1. 最近编辑多个文档,需要对每个文档进行编辑、格式化,我就建了n个寄存器,然后用最后一个寄存器按顺序调用前面建立的寄存器,有没有更好的办法呢?

    还有一个问题:
    以前用UE32时,由一个很喜欢的功能,就是列块替换,但是到现在我还是不会用vim来完成对应的功能,请指教!

    说实在的,我觉得自己真正用vim有提升,是从看你的文档开始的,不管内容我以前是否知道,他给了我一个循序渐进的路,谢谢!

  2. @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

  3. Easwy你好:请教一个问题。

    在gvim的菜单栏中,
    分别标明
    剪切 “+x
    复制 “+y
    粘贴 “+gP
    粘贴到光标前 [p
    粘贴到光标后 ]p

    这个”+ 表示的是剪贴板
    对于粘贴后面的 gP 以及[p ]p 请问是什么意思,
    g,P(大写), [, ],分别是什么意思?

    谢谢~~~~~~~~~

  4. 老大,请教一个问题。
    我设置了 :set textwidth=80
    没有设置linebreak
    但是没有产生效果,仍然是linebreak的效果。
    将:set textwidth=0 :set wrapmargin=80也没有效果。
    咋办呢?

    (需求起源:我想把文本转换为html,一行的字符太多,导致html页横向太宽。)

  5. 再请教一下:
    我在终端中调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
    请问是为什么?应该怎么解决?

  6. @karl
    在:help e285里有解决的办法,我想你在环境变量里定义一下XMODIFIERS应该就可以,例如:

    export XMODIFIERS=”@im=fcitx”

    你用:version命令看一下你的vim都编译了哪些feature吧

  7. 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

  8. 再请教一下楼主:有时,我在VIM中想把一个单词替换成另一个单词,用:yw,然后到要被替换的单词那里:dw 然后”0P,很多个步骤。yw,dw,”0P,这样子感觉按键多而且不顺手,请问你是怎么替换的?(:s/a/b这种要敲两个单词速度也不快)

  9. @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

  10. 就是看了帮助没明白:插入当前光标所在的单词--当前光标所在的单词 还需要插入吗? 这个功能有什么作用?

  11. 再请教博主一个键映射的问题:我经常会在命令模式下输入:”WQ”和”WQA”,想把它映射成”wq”和”wqa”,在.vimrc中加入:cmap WQ wq
    但现在:s替换及其它的命令也会自动把WQ改成wq。。。能不能让命令在开头两个字母时才进行这个键映射?

  12. Easwy :
    @karl
    不行。
    你试试把WQ<cr>映射成wq<cr>,也许能避免一些错误替换

    在.vimrc中填写一行:
    cmap WQ wq

    在编辑的时候输入:
    :WQ回车
    提示:
    E492: 不是编辑器的命令: WQ

  13. Easwy :
    @karl
    试试
    :cabbr WQ wq

    这个也是:在:s替换及其它的命令也会自动把WQ改成wq。。。
    改成:
    :cabbr WQ\ wq\
    也是
    在编辑的时候输入:
    :WQ回车
    提示:
    E492: 不是编辑器的命令: WQ

  14. 这个也是:在:s替换及其它的命令也会自动把WQ改成wq。。。
    改成:
    :cabbr WQ wq
    也是
    在编辑的时候输入:
    :WQ回车
    提示:
    E492: 不是编辑器的命令: WQ

    BTW:wordpress转义,不知怎么输入:

  15. 请教博主一个关于变量作为命令参数的问题:
    以下面的命令为例:

    let i=10
    1,iw new.txt

    原意是想把第1行至第i行(即第10行)内容保存至new.txt文件。结果提示错误。
    对此应如何修改?

发表评论

电子邮件地址不会被公开。 必填项已用*标注