2016-10-08 100 views
0

我剛開始使用vim腳本,並嘗試使opencart語言文件的翻譯更容易。我想有一個函數查找給定的搜索模式並選擇它。如果文件中沒有匹配,它將打開下一個文件進行編輯。我至今:在vim腳本中搜索模式匹配的VIM檢查

function! Nextmatch() 
    normal /\(= *'\)\@<=.\{-\}\('\)\@=/ 
    normal v//e 
endfunction 

function! Nextfile() 
    if !exists("s:filecounter") 
     execute "!find -iname *.php > files.txt" 
     normal <CR> 
     let s:filecounter=0 
    endif 
    let s:lines= system("wc -l < files.txt") 
    if s:filecounter<s:lines 
     w 
     let s:filecounter += 1 
     let s:sedcommand="sed '".s:filecounter."!d' files.txt" 
     let s:selectedfile=system(s:sedcommand) 
     execute 'edit' s:selectedfile 
    else 
     wq 
    endif 
endfunction 

我怎樣才能做到這一點Nextfile()被稱爲Nextmatch()如果搜索模式不光標和當前文件的末尾之間發現了什麼?在我的片段中,是否有一些你認爲是不好的風格?

回答

1

QuickFix命令功能強大,並與一些外部插件很好的整合,但如果你真的需要使用自己的腳本,如果你需要在一個if語句來檢查的比賽,只是做:

if search("=\\s*'\\zs[^']*\\ze", 'W') == 0 
    echo 'No match until the end of the buffer' 
endif 

:h search(),並請注意:

  • 雙反斜線,由於雙引號
  • 'W'標誌,該標誌禁止WR圍繞文件
  • 結束apping我簡化你給
1

您可以簡單地使用:vim命令來擺脫所有的腳本。

我認爲以下應該做你期待什麼挺:

:noremap <f8> <esc>:cn<cr>gn 
/\(= *'\)\@<=.\{-\}\('\)\@= 
:vim //g *.php 

然後,去下一個模式中的所有文件,而選擇它, 你只需要按下F8鍵。

noremap一行中,gn可讓您選擇下一個實際搜索。

你可能需要做的:

:set nohidden 

讓您瀏覽扔了經過修改的緩衝區(但不要忘記保存 他們:wa,或:ls列出)​​

關於你的腳本:

  • 在腳本中總是使用:normal!而不是:normal(除非你故意需要它):因此,你的個人映射不會干擾你的腳本。
+0

感謝很多的模式,我測試了它,它是我想要什麼差不多。但是有兩個問題:1.它與光標無關,即如果我執行':bnext',然後按下'F8',則會跳回到舊文件,並且它不會查看子目錄。你有什麼建議嗎? – phinz

+1

查看子目錄:':vim // g **/*。php' – yolenoyer

+0

關於遊標位置:由於':cn'只是跳轉到quickfix列表中的下一個元素,因此無法輕易完成。請參閱':h quickfix' – yolenoyer