VIM: 将[aeiou]'替换为相应的重音字母

8
我知道VIM支持双字符,如果可以在:s命令中使用就更完美了,但我找不到使用方法!我认为应该像这样:
:%s/\([aeiouAEIOU]\)'/\=digraph(submatch(1)."!")/g

这很完美,但我找不到一个digraph函数。

预先感谢。

编辑
好的,在内置的VIM函数中搜索了一下,我找到了tr和一个解决问题的第一个方案:

:%s/\([aeiouAEIOU]\)'/\=tr(submatch(1), 'aeiouAEIOU', 'àèìòùÀÈÌÒÙ')/g

然而,我仍然想知道是否有一种方法在表达式中使用digraph :)

你可能想在末尾添加 c 以确认,或者你想替换文档中的每个元音字母吗? - Xavier T.
不是每个人,只有元音字母后面跟着 '。在意大利,一些人有一个坏习惯,将带重音的元音字母写成 a',特别是大写字母(这要怪Windows:对他们来说没有简单的方法)。 - Iazel
2个回答

5
function! Digraph(letter, type)
    silent exec "normal! :let l:s = '\<c-k>".a:letter.a:type."'\<cr>"
    return l:s
endfunction

此函数允许您生成任何想要的二元组。

它通过正常命令运行并将其分配给本地变量s来模拟键入<c-k><char><char>。然后返回s。

定义此函数后,您可以像这样使用它。

:%s/\([aeiouAEIOU]\)'/\=Digraph(submatch(1), "!")/g

注意:这是基于EasyDigraph的源代码。

一个小笔误:在 :s 命令中,调用 Digraph 应该是 Digraph(submatch(1), "!") - Iazel

2
这里提供另一种方法,使用手写的vim函数(添加到你的vimrc文件中):
" get a matching digraph for a given ASCII character
function! GetDigraph(var1)
   "incomplete dictionary of digraphs, add your own....
   let DigDict = {'a': 'à', 'e': 'è', 'i': 'ì'}
   "get the matching digraph.  If no match, just return the given character
   let DictEntry = get(DigDict, a:var1, a:var1)
   return DictEntry
endfunction

用以下方式调用::%s/\([aeiouAEIOU]\)'/\=GetDigraph(submatch(1))/g


如果我正确理解了lazel的意思,我认为他想要编程访问digraph-table,这是非常广泛的。不幸的是,除了模拟按键以键入Ctrl-K <digraph char 1> <digraph char 2>之外,似乎无法访问它。 - Conspicuous Compiler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接