循环通过vim

循环通过vim

问题描述:

字符我想创建一个Vim宏下一步:循环通过vim

如果我输入字符 “A”, “E”, “O”, “I” 或 “U”,按一个shorctut关键pe F12 它必须在每次点击快捷键时循环字符

p.e.

一个 - > F12 - > A - > F12 - > A - > F12 - > A - > F12 - > A - > F12 - >回 “A” 再次
A - > F12 - > A - > F12 - > A - > F12 - > A - > F12 - > A - > F12 - >回 “A” 再次

同为
é - > EEEEEEE
ë - > EEEEEEE
我 - > IIII
我 - > IIII
Ø - >呜
Ø - >呜
:U - > uûùüüu
U - >UÛÙÜU

任何人都可以帮助我吗?

+0

我不认为有一个简单的方法来实现这一点。您可以使用CTRL-a in命令模式来增加字符代码,但这不是您想要的。 – hochl

+0

你可能会适应[unicycle.vim](http://www.vim.org/scripts/script.php?script_id=1384)来处理这些,虽然我可以发誓还有另一个专用于此的插件。我现在找不到它。 –

这是一个可以做你想做的功能。它通过抓住光标下的unicode字符来工作,看看它是否存在于一个字符列表中,如果是,则将它推进到该列表中的下一个字符。我通过复制它,从寄存器中提取它,然后在函数结尾恢复寄存器的原始内容,以难看的方式抓住光标下的字符。必须有更优雅的方式!

function! CycleThroughChars() 
    let x_contents = getreg("x") 
    let x_type = getregtype("x") 
    let lists = [ ["a","à","â","ä","a"], 
       \ ["A","À","Â","Ä","A"], 
       \ ["e","é","è","ê","ë","e"], 
       \ ["E","É","Ê","È","Ë","E"], 
       \ ["i","î","ï","i"], 
       \ ["I","Î","Ï","I"], 
       \ ["o","ô","ö","o"], 
       \ ["O","Ô","Ö","O"], 
       \ ["u","û","ù","ü","u"], 
       \ ["U","Û","Ù","Ü","U"] ] 
    sil exe 'normal! "xyl' 
    let c_char = @x 
    for this_list in lists 
     let c_index = index(this_list,c_char) 
     if c_index != -1 
      sil exe "normal! r" . this_list[c_index+1] 
      break 
     endif 
    endfor 
    call setreg("x",x_contents,x_type) 
    startinsert 
endfunction 
inoremap <silent> <F12> <ESC>:call CycleThroughChars()<CR><right> 

希望这会有所帮助。

EDIT

我实现了第二个for循环是多余的,所以我从函数删除它。功能不受影响,但每个列表只需调用一次index()

+0

哇..太棒了!非常感谢你! – Reman

+0

我花了太长时间试图想出一个答案,我的结果是当它完成时比这更sl sl。伟大的工作(未经测试;)) –

+1

'let @ x'和'old_paste_contents'应该用'getreg()','getregtype()'和'setr​​eg()'来修改。这样你就不会丢失寄存器类型(矩形,行或字符)。 – Benoit

编辑:我能够通过调用matchstr()来替换补充函数。现在比现在清洁一点。

为了完整性,这里是我想出的。

let g:unicode_list = [ 
\ [ 'a', 'à', 'â', 'ä' ], 
\ [ 'A', 'À', 'Â', 'Ä' ], 
\ [ 'e', 'é', 'è', 'ê', 'ë' ], 
\ [ 'E', 'É', 'Ê', 'È', 'Ë' ], 
\ [ 'i', 'î' ], 
\ [ 'I', 'Î', 'Ï' ], 
\ [ 'o', 'ô', 'ö' ], 
\ [ 'O', 'Ô', 'Ö' ], 
\ [ 'u', 'û', 'ù', 'ü' ], 
\ [ 'U', 'Û', 'Ù', 'Ü' ], 
\] 

function! CycleUnicode(mode) 
    let char = matchstr(getline('.'), '.', col('.')-1) 
    for sublist in g:unicode_list 
     let idx = index(sublist, char) 
     if idx >= 0 
      try 
       let char = sublist[idx+1] 
      catch /E684/ 
       let char = sublist[0] 
      endtry 
      execute "normal! r" . char 
      break 
     endif 
    endfor 
    if a:mode == 'i' 
     startinsert 
    endif 
endfunction 

inoremap <f12> <esc>:call CycleUnicode('i')<enter><right> 
nnoremap <f12> :call CycleUnicode('n')<enter> 
+1

我们一直在思考!最难的部分是提取光标下的unicode字符...... Vim似乎没有一种原生的方式来做这件事似乎很奇怪。 –

+0

@PrinceGoulash您可能会对我刚刚编辑的内容感兴趣。我想我已经找到了一种让我的角色比以前更干净的方法。无论如何,这是对未来的良好参考材料。 –

+0

@RandyMorris,如果编码是utf-8,你的函数不能和​​unicode字符一起工作 – Reman