vimscript替换上次出现(用于打开相应的test / spec-file)

时间:2016-02-08 16:53:00

标签: javascript testing vim

我写了一个函数,它为我打开了一个相应的文件。

我的编码项目中有一个约定,我将测试文件保存在与原版相同的子文件夹结构中 - 待测试 - 一个。

例如:

project_dir/
|-->src/
|   |-->test.js
|-->test/
    |-->test_spec.js

所以,如果我正在编辑test/test_spec.js并致电OpenCorrespondingFile(),那么应该打开src / test.js,反之亦然。

现在我写了以下功能:

function! OpenCorrespondingFile()
  let l:filename=expand('%:t')
  let l:path=expand('%:p')
  if l:path =~ "/src/"
    let l:correspondingFilePath = substitute(l:path, "src/", "test/", "")
    let l:correspondingFilePath = substitute(l:correspondingFilePath, ".js", "_spec.js", "")
  elseif l:path =~ "/test/"
    let l:correspondingFilePath = substitute(l:path, "test/", "src/", "")
    let l:correspondingFilePath = substitute(l:correspondingFilePath, "_spec", "", "")
  endif
  execute "only"
  execute "split"
  execute "edit " . l:correspondingFilePath
  execute "wincmd j"
  execute "edit " . l:path
endfunction
:nnoremap <leader>oc :call OpenCorrespondingFile()<cr>

问题是,如果我的路径中有test /或src /多次,则路径的错误部分将被替换。

所以我需要知道,我如何能够替换模式的最后一次出现。

let l:correspondingFilePath = SUBSTITUTE_LAST_OCCURRENCE(l:path, "src/", "test/", "")
提前thx!

更新:重构函数

function! OpenCorrespondingFile()
  let filename=expand('%:t')
  let path=expand('%:p')
  if path =~ '/src/'
    let correspondingFilePath = substitute(path, '.*\zssrc/', 'test/', '')
    let correspondingFilePath = substitute(correspondingFilePath, '.js', '_spec.js', '')
  elseif path =~ '/test/'
    let correspondingFilePath = substitute(path, '.*\zstest/', 'src/', '')
    let correspondingFilePath = substitute(correspondingFilePath, '_spec', '', '')
  endif
  only
  execute "split " . correspondingFilePath
endfunction
:nnoremap <leader>oc :call OpenCorrespondingFile()<cr>

1 个答案:

答案 0 :(得分:2)

搜索'.*\zssrc/'

  • .*消费一切,
  • \zs标记比赛的开始。