2007年7月31日 星期二

Vim Tips - Using input function to replace string

每次用 :%s/foo/bar/g 作字串取代太麻煩,如果用這樣:

:nmap :%s//g<Left><Left>

若還是覺得很彆扭?那可以試試看用 vim 提供的 input function

先寫一個 function
function! SUBS()
call inputsave()
let g:MyPattern = input("Pattern: ")
let g:MySubs = input("Substitution (" . g:MyPattern . ") : ")
exe '%s/' . g:MyPattern . '/' . g:MySubs . '/g'
call inputrestore()
endfunction
然後設定 Map 去呼叫他

nmap :call SUBS()<CR>

如果使用 GVIM 還可以把 input 換成 inputdialog ,這樣就會出現對話框。 :-)

6 則留言:

  1. 這真是個很有用的tip,尤其是我這種指令都記不起來的人,我根據你的寫法,想寫一個prefix的function,就是可是在某個我選起來的範圍,在最前面加某個prefix,功能有點像可以做到block comment,可是我改出來的結果有點奇怪,假如我選了五行,我必須打五次我要的prefix,有沒有什麼技巧可以用呢,謝謝
    我的寫法如下

    function! Prefix()
    call inputsave()
    let g:MyPattern = inputdialog("Pattern: ")
    exe 's/^/' . g:MyPattern . '/'
    call inputrestore()
    endfunction

    回覆刪除
  2. s//g

    suffix 要有 g 喔才會全部取代。 :)

    回覆刪除
  3. Besides , 如果要新增的 prefix 都在同一行,那你可以直接用 Ctrl-V , 然後選取你的範圍,接著按 I ( 大寫 ) 進去修改,修改完之後 ESC 就會套用在全部的行了。

    回覆刪除
  4. 可能你誤會我的意思了,因為我之前常常會把某幾行把他選起來,再用:s/^/%/,就可以在這幾行的前面加上%,而我寫的Prefix(),希望在選幾行後,call Prefix(),能跑出一個對話框,可以填我要的prefix,然後這幾行的最前面都會有我要的prefix,可是我的問題是,如果我選了五行,我就要輸入五次prefix,不知道有什麼方法可以只輸入一次就好了

    回覆刪除
  5. 可能你誤會我的意思了,因為我之前常常會把某幾行把他選起來,再用:s/^/%/,就可以在這幾行的前面加上%,而我寫的Prefix(),希望在選幾行後,call Prefix(),能跑出一個對話框,可以填我要的prefix,然後這幾行的最前面都會有我要的prefix,可是我的問題是,如果我選了五行,我就要輸入五次prefix,不知道有什麼方法可以只輸入一次就好了

    回覆刪除
  6. 剛剛才發現 Visaul Mode 時會每行都呼叫
    所以我換個方法:

    vmap <C-H> <ESC>:call SUBS()<CR>

    function! SUBS()
    let g:str = input( "Prefix:" )
    exec "'<"
    let sn = line(".")
    exec "'>"
    let en = line(".")
    exec ':'.sn.','.en.'s/^/' . g:str . '/g'
    endfunction

    回覆刪除