循环通过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
任何人都可以帮助我吗?
这是一个可以做你想做的功能。它通过抓住光标下的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()
。
编辑:我能够通过调用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>
我们一直在思考!最难的部分是提取光标下的unicode字符...... Vim似乎没有一种原生的方式来做这件事似乎很奇怪。 –
@PrinceGoulash您可能会对我刚刚编辑的内容感兴趣。我想我已经找到了一种让我的角色比以前更干净的方法。无论如何,这是对未来的良好参考材料。 –
@RandyMorris,如果编码是utf-8,你的函数不能和unicode字符一起工作 – Reman
我不认为有一个简单的方法来实现这一点。您可以使用CTRL-a in命令模式来增加字符代码,但这不是您想要的。 – hochl
你可能会适应[unicycle.vim](http://www.vim.org/scripts/script.php?script_id=1384)来处理这些,虽然我可以发誓还有另一个专用于此的插件。我现在找不到它。 –