Tony Mechelynck wrote:
Matt gave you a solution in several steps, but here's a single-step one, taking advantage of both case-matching and case-insensitive operators, of |sub-replace-expression| and of the ternary operator ?: as in (condition ? result_if_true : result_if_false) |expr1| :

        command -nargs=0 -range=% -bar Xeo
                \ <line1>,<line2>s/\c[scujgh]x/\=(
                        \ submatch(0) ==# 'sx' ? 'ŝ' :
                        \ submatch(0) ==# 'cx' ? 'ĉ' :
                        \ submatch(0) ==# 'ux' ? 'ŭ' :
                        \ submatch(0) ==# 'jx' ? 'ĵ' :
                        \ submatch(0) ==# 'gx' ? 'ĝ' :
                        \ submatch(0) ==# 'hx' ? 'ĥ' :
                        \ submatch(0) ==? 'SX' ? 'Ŝ' :
                        \ submatch(0) ==? 'CX' ? 'Ĉ' :
                        \ submatch(0) ==? 'UX' ? 'Ŭ' :
                        \ submatch(0) ==? 'JX' ? 'Ĵ' :
                        \ submatch(0) ==? 'GX' ? 'Ĝ' : 'Ĥ' )/g

For maximum efficiency, the most frequent cases should be tested first, but the use of ==# and ==? to enable (for instance) both Cx and CX for Ĉ but only cx for ĉ requires lowercase to come first. (This will identify cX as Ĉ but I think it can be tolerated.)

In Vim7+, I'd be tempted to tweak Tony's solution so it uses a literal/in-line dict for the conversions, something like (broken into multiple lines without the requisite "\" characters but could just as easily be one line):

  s/\c[scujgh]x/\=get({
   'sx':'ŝ',
   'cx':'ĉ',
   'ux':'ŭ',
   'jx':'ĵ',
   'gx':'ĝ',
   'hx':'ĥ',
   'SX':'Ŝ',
   'CX':'Ĉ',
   'UX':'Ŭ',
   'JX':'Ĵ',
   'GX':'Ĝ',
   'HX':'Ĥ'
  }, submatch(0), '??default??')/g

(which should have the benefit of a linear lookup time, and is a lot less hassle to maintain, IMHO)

You might have to do some case-folding with tolower()/toupper() on the submatch(0), or include additional entries for other case-combinations.

-tim



--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

To unsubscribe from this group, send email to vim_use+unsubscribegooglegroups.com or 
reply to this email with the words "REMOVE ME" as the subject.

Reply via email to