如何在gvim中编写用户定义的命令?

时间:2014-01-28 03:44:27

标签: php vim

我在Windows XP中安装了wamp堆栈,按照这样的步骤运行PHP文件。

  1. 打开Vim进行编辑
  2. 保存
  3. 在浏览器中运行它 - Firefox
  4. 我已将{F8}映射到_vimrc

    map <F8> :call Run() <cr>
    function Run()
      :cd  C:\BitNami\wampstack-5.4.24-0\apache2\htdocs\test
      :w  temp.php
      :silent  !"c:\Program Files\Mozilla Firefox\firefox.exe"  http://localhost/test/temp.php
    endfunction
    

    它可以成功运行。现在我想创建一个runphp命令。当我输入

    :runphp file1.php
    

    在Vim的命令模式下,它会做这些事情。

    1. C:\BitNami\wampstack-5.4.24-0\apache2\htdocs\test
    2. 中写下当前文件
    3. 将其命名为file1.php
    4. 以静默方式在Firefox中打开http:// localhost /test/file1.php
    5. 如何在Vim中编写用户定义的命令? 如何修改?为什么目标不是“http:// localhost / test /”添加fname? Vim不会将目标解析为正确的文件。

      function Runphp(fname)
          :cd  C:\BitNami\wampstack-5.4.24-0\apache2\htdocs\test
          :w!  fname
          :let target ="http://`localhost`/test/" . fname
          :silent  !"c:\Program Files\Mozilla Firefox\firefox.exe"  target
      endfunction
      command! -nargs=1  Runphp call Runphp(<f-args>)
      

      我写了以下内容,其中undefined varible fname

      _vimrc

      set nocompatible
      source $VIMRUNTIME/vimrc_example.vim
      source $VIMRUNTIME/mswin.vim
      set number
      set langmenu=en_US
      set fileencodings=utf-8,gb2312,gbk,gb18030
      set termencoding=utf-8
      set encoding=prc
      let $LANG = "en_US"
      set nowrap
      set guioptions+=b
      set modifiable
      set write
      source $VIMRUNTIME/delmenu.vim
      source $VIMRUNTIME/menu.vim
      behave mswin
      set diffexpr=MyDiff()
      function MyDiff()
          let opt = '-a --binary '
          if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
          if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
          let arg1 = v:fname_in
          if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
          let arg2 = v:fname_new
          if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
          let arg3 = v:fname_out
          if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
          let eq = ''
          if $VIMRUNTIME =~ ' '
              if &sh =~ '\<cmd'
                  let cmd = '""' . $VIMRUNTIME . '\diff"'
                  let eq = '"'
              else
                  let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
              endif
          else
              let cmd = $VIMRUNTIME . '\diff'
          endif
          silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
      endfunction
      
      function Runphp(fname)
          cd  C:\BitNami\wampstack-5.4.24-0\apache2\htdocs\test
          execute 'w!' . fnameescape(a:fname)
          let target ="http://localhost/test/" . filename
          silent execute '!"c:\Program Files\Mozilla Firefox\firefox.exe"' shellescape(target, 1)
      endfunction
      command! -nargs=1  Runphp call Runphp(<f-args>)
      

      enter image description here enter image description here enter image description here

1 个答案:

答案 0 :(得分:2)

Vim的评估规则与大多数编程语言不同。您需要使用:execute 才能评估变量;否则,字面意思;即Vim使用变量名称本身作为参数。

此外,尤其是you've already asked about shellescape(),您需要使用转义功能,否则带有特殊字符的文件名/命令将无效。

函数参数需要在函数内部用 a: sigil 引用。

最后,您不需要在函数中添加:命令;只需要以交互方式进入命令行模式。

function Runphp(fname)
    cd  C:\BitNami\wampstack-5.4.24-0\apache2\htdocs\test
    execute 'w!' . fnameescape(a:fname)
    let target ="http://localhost/test/" . fname
    silent execute '!"c:\Program Files\Mozilla Firefox\firefox.exe"' shellescape(target, 1)
endfunction
command! -nargs=1  Runphp call Runphp(<f-args>)